有什么区别:导入模块&从模块导入模块?

时间:2011-09-26 21:11:27

标签: python random module

这是我的程序,它列出一个单词并将它们从最长到最短排序,并断开与随机模块的联系。

import random  
def sort_by_length1(words):
    t = []
    for word in words:
        t.append((len(word), random(), word))

    t.sort(reverse = True)


    res = []
    for length, randomm, word in t:
        res.append(word)
    return res

我收到此错误:TypeError:'module'对象不可调用

但是当我这样做时:from module import module它有效吗?那是为什么?

4 个答案:

答案 0 :(得分:3)

from random import random 

相当于

import random as _random
random = _random.random

所以如果你只做

import random

你必须使用

random.random()

而不是

random()

答案 1 :(得分:2)

random模块具有random功能。当你执行import random时,你得到的模块显然是不可调用的。执行from random import random时,您将获得可调用的函数。这就是为什么在第二种情况下你没有看到错误的原因。

您可以在REPL中测试。

>>> import random
>>> type(random)
module
>>> from random import random
>>> type(random)
builtin_function_or_method

答案 2 :(得分:1)

from random import random

相当于:

import random          # assigns the module random to a local variable
random = random.random # assigns the method random in the module random

您无法调用模块本身,但可以调用其方法random。具有相同名称的模块和方法仅对人类造成混淆;语法清楚地表明了你的意思。

答案 3 :(得分:0)

当你调用命令时,

import random

您正在导入模块的引用,该模块包含所有函数和类。此引用现在位于您的命名空间中。现在可以通过random.func(arg1, arg2)访问随机模块中的内容。

这允许您对随机模块执行以下调用:

>>> random.uniform(1, 5)
2.3904247888685806
>>> random.random()
0.3249685500172673

所以在上面的代码中,当python解释器命中时,

t.append((len(word), random(), word))

random实际上是指模块名称并引发错误,因为模块名称不可调用,与您正在寻找的函数不同。

如果您要改为调用

from random import random

您要在名称空间中将引用添加到模块random中的函数random。您可以轻松地说from random import randint,这样您就可以毫无问题地致电randint(1, 5)

我希望这能很好地解释。