14

我在使用 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'
>>> 
4

9 回答 9

32

import random导入 random模块,其中包含与随机数生成有关的各种事情。其中有 random()函数,它生成 0 到 1 之间的随机数。

以这种方式进行导入需要您使用语法random.random()

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

from random import random

这使您可以random()直接调用。

于 2013-02-20T17:14:46.667 回答
20

random 模块包含一个名为 的函数,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
于 2013-02-20T17:15:23.577 回答
9

问题是这里有两个东西叫做随机:一个是模块本身,一个是该模块内的函数。您的命名空间中不能有两个具有相同名称的东西,因此您必须选择一个或另一个。

于 2013-02-20T17:14:19.703 回答
6
import random 

将模块包含在名称“random”下的命名空间中。

from random import random

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

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

相似地,

from random import randint

会将 randint 导入全局命名空间,因此您可以简单地调用 randint 而不是 random.randint。

于 2013-02-20T17:16:47.840 回答
4

嗯,是的,他们进口不同的东西。 import random导入random模块,从模块中from random import random导入random函数random。这实际上是一个很好的例子,说明为什么在 Python 中设计 API 时,尽量避免将模块及其成员命名为相同的东西通常是个好主意。

于 2013-02-20T17:15:32.790 回答
1

'random' 模块是 python 标准库中的一个包,也是这个包中定义的一个函数。

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

您还可以告诉 python 仅从包 random 中专门导入 random 函数:'from random import random'。那么你只能使用函数'random()',并且不应该指定它来自哪个包。但是,您不能使用随机包中的任何其他功能,因为如果您使用“从随机导入随机”,它们还没有被导入。

于 2013-02-20T17:19:31.117 回答
0

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

于 2013-02-20T17:18:53.907 回答
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()直接调用该方法。

于 2017-04-14T11:18:01.533 回答
0

您必须先从 random模块导入 random函数,然后才能使用它。

In [1]: from random import random

In [2]: random()
Out[2]: 0.5607917948041573
于 2018-08-10T19:23:57.700 回答