Python随机函数

16

我在使用Python的import random函数时遇到了问题。看起来import randomfrom random import random导入了不同的东西。我目前正在使用Python 2.7.3。

Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> random()

Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
    random()
NameError: name 'random' is not defined
>>> random.randint(1,5)

Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
random.randint(1,5)
NameError: name 'random' is not defined
>>> import random
>>> random()

Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
random()

TypeError: 'module' object is not callable
>>> random.randint(1,5)
2
>>> from random import random
>>> random()
0.28242411635200193
>>> random.randint(1,5)

Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
random.randint(1,5)
AttributeError: 'builtin_function_or_method' object has no attribute 'randint'
>>> 
9个回答

32

import random导入了随机数生成相关的模块random,其中包括众多随机数生成函数,例如random()函数,用于生成0到1之间的随机数。

使用这种方式导入,需要使用语法random.random()来调用。

随机数函数也可以单独从模块中导入:

from random import random

这样,您只需直接调用random()函数。

21
随机模块包含一个名为random()的函数,因此您需要注意是否已将该模块导入到您的名称空间中,或者是否从模块中导入了函数。 import random将导入随机模块,而from random import random将从模块中特定地导入随机函数。
所以您可以执行以下操作之一:
import random
a = random.random()
b = random.randint(1, 5)
# you can call any function from the random module using random.<function>

或者...

from random import random, randint   # add any other functions you need here
a = random()
b = randint(1, 5)
# those function names from the import statement are added to your namespace

9

问题在于这里有两个名为随机的东西:一个是模块本身,另一个是该模块内的函数。你不能在命名空间中拥有两个同名的东西,因此你必须选择其中一个。


6
import random 

将模块包含到命名空间中,并将其命名为“random”。
from random import random

将名称空间“random”中的函数“random”包含到全局名称空间中。

因此,在第一个示例中,您将调用random.random,在第二个示例中,您将调用random。两者都将访问相同的函数。

同样地,

from random import randint

将randint导入全局命名空间,这样您就可以直接调用randint而不是random.randint。

4

是的,它们导入了不同的东西。 import random 导入了 random 模块,from random import randomrandom 模块中导入了 random 函数。这实际上是一个很好的例子,说明在设计 Python API 时,通常最好避免将模块和其成员命名为相同的名称。


1
'random' 模块是 Python 标准库中的一个包,也是该包中定义的一个函数。
使用 'import random' 导入该包,然后就可以使用此包中的函数:'random.random()'。您还可以使用 'random' 包中的任何其他函数。
您还可以告诉 Python 仅从 random 包中导入 random 函数:'from random import random'。然后,您只能使用 'random()' 函数,不应指定它来自哪个包。但是,如果使用 'from random import random',则无法使用 random 包中的任何其他函数,因为它们未被导入。

0

在使用随机函数之前,您需要从随机模块导入随机函数。

In [1]: from random import random

In [2]: random()
Out[2]: 0.5607917948041573

0
如果您使用from random import random,则必须这样调用randint():randint(1,5)。如果您使用import random,则应该这样调用:random.randint(1,5)

0
如果您在使用 PyDev 或其他聪明的 IDE,请确保它没有自动导入模块并覆盖了您的导入。这里可能会特别令人困惑,因为模块名称等于函数名称时抛出的错误不是 NameError。在我的情况下,我添加了...
import random

并且后来使用它:

r = random.radom()

但是得到了:

AttributeError: 'builtin_function_or_method' object has no attribute 'random'

只有在搜索后,我才发现PyDev自动添加了这行代码

from random import random

在我的导入结尾处,我实际上是在调用方法random的属性random。解决方案是删除自动导入或使用它并直接调用random()方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接