我遇到Python的导入随机函数问题。似乎import random
和from 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'
>>>
答案 0 :(得分:24)
import random
导入随机模块,其中包含与随机数生成相关的各种操作。其中包括random()函数,它生成0到1之间的随机数。
以这种方式进行导入,这要求您使用语法random.random()
。
随机功能也可以单独从模块导入:
from random import random
这样您就可以直接拨打random()
。
答案 1 :(得分:15)
random module包含一个名为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
答案 2 :(得分:9)
问题是这里有两个叫做随机的东西:一个是模块本身,一个是该模块中的一个函数。在命名空间中不能有两个具有相同名称的东西,因此您必须选择其中一个。
答案 3 :(得分:5)
import random
将模块包含在命名为'random'的命名空间中。
from random import random
包括从命名空间“随机”到全局命名空间的函数“随机”。
所以在第一个例子中,你会调用random.random,而在第二个例子中,你会调用random。两者都可以访问相同的功能。
类似地,
from random import randint
会将randint导入全局命名空间,因此您只需调用randint而不是random.randint。
答案 4 :(得分:3)
嗯,是的,他们导入了不同的东西。 import random
导入random
模块,from random import random
从random
模块导入random
函数。这实际上是一个很好的例子,为什么在Python中设计API时,尝试避免将模块及其成员命名为同样的事情通常是一个好主意。
答案 5 :(得分:1)
'random'模块是python标准库中的一个包,以及此包中定义的函数。
使用'import random'导入包,然后您可以使用此包中的函数:'random.random()'。您也可以使用“随机”包中的任何其他功能。
你也可以让python专门从随机包中随机导入随机函数:'from random import random'。然后你只能使用函数'random()',而不应该指定它来自的包。但是,您不能使用随机包中的任何其他功能,因为如果您使用'来自随机导入随机',则尚未导入它们。
答案 6 :(得分:0)
如果您使用from random import random
,则必须像这样调用randint():randint(1,5)
。如果您使用import random
,则可以这样称呼:random.randint(1,5)
。
答案 7 :(得分: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()
方法。
答案 8 :(得分:0)
您必须先从随机模块中导入随机函数,然后才能使用它
In [1]: from random import random
In [2]: random()
Out[2]: 0.5607917948041573