2013-02-20 150 views
9

我遇到了Python导入随机函数的问题。看来import randomfrom 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' 
>>> 

回答

23

import random进口随机模块,其中包含各种随机数生成的事情。其中包括随机()函数,它生成介于0和1之间的随机数。

以这种方式执行导入操作需要使用语法random.random()

随机函数也可以从单独的模块的输入:

from random import random 

这可以让你那么就直接调用random()

9

问题是有两件事叫做随机在这里:一个是模块本身,另一个是模块内的函数。在命名空间中不能有两个同名的东西,所以你必须选择一个或另一个。

13

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 
3

嗯,是的,他们导入不同的东西。 import random输入random模块,from random import randomrandom模块输入random功能。这实际上是一个很好的例子,说明为什么在Python中设计一个API时,尝试避免命名模块及其成员是一个好主意。

4
import random 

将该模块包含到名称为'random'的名称空间中。

from random import random 

将函数'random'从命名空间'random'包含到全局命名空间中。

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

同样,

from random import randint 

将导入randint到全局命名空间,所以你可以简单地调用randint代替random.randint的。

0

如果使用from random import random,则必须像这样调用randint():randint(1,5)。如果您使用import random,则可以这样称呼它:random.randint(1,5)

1

“随机”模块是来自python标准库的包,以及此包中定义的函数。

使用'import random'导入包,然后您可以使用该包中的函数:'random.random()'。您也可以使用“随机”包中的任何其他功能。

你也可以告诉python只从程序包random:'random random random'中只导入随机函数。那么你只能使用函数'random()',并且不应该指定它来自的包。但是,您不能使用随机包中的任何其他函数,因为如果使用“从随机导入随机”中的函数,它们尚未导入。

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()方法。