Python随机函数
我遇到了Python导入随机函数的问题。看来import random
和from random import random
正在导入不同的东西。我目前正在使用Python 2.7.3Python随机函数
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'
>>>
import random
进口随机模块,其中包含各种随机数生成的事情。其中包括随机()函数,它生成介于0和1之间的随机数。
以这种方式执行导入操作需要使用语法random.random()
。
随机函数也可以从单独的模块的输入:
from random import random
这可以让你那么就直接调用random()
。
问题是有两件事叫做随机在这里:一个是模块本身,另一个是模块内的函数。在命名空间中不能有两个同名的东西,所以你必须选择一个或另一个。
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
嗯,是的,他们导入不同的东西。 import random
输入random
模块,from random import random
从random
模块输入random
功能。这实际上是一个很好的例子,说明为什么在Python中设计一个API时,尝试避免命名模块及其成员是一个好主意。
import random
将该模块包含到名称为'random'的名称空间中。
from random import random
将函数'random'从命名空间'random'包含到全局命名空间中。
因此,在第一个示例中,您将调用random.random,并在第二个示例中调用random。两者都将访问相同的功能。
同样,
from random import randint
将导入randint到全局命名空间,所以你可以简单地调用randint代替random.randint的。
如果使用from random import random
,则必须像这样调用randint():randint(1,5)
。如果您使用import random
,则可以这样称呼它:random.randint(1,5)
。
“随机”模块是来自python标准库的包,以及此包中定义的函数。
使用'import random'导入包,然后您可以使用该包中的函数:'random.random()'。您也可以使用“随机”包中的任何其他功能。
你也可以告诉python只从程序包random:'random random random'中只导入随机函数。那么你只能使用函数'random()',并且不应该指定它来自的包。但是,您不能使用随机包中的任何其他函数,因为如果使用“从随机导入随机”中的函数,它们尚未导入。
如果您使用的是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()
方法。