这是我的程序,它列出一个单词并将它们从最长到最短排序,并断开与随机模块的联系。
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
它有效吗?那是为什么?
答案 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)
。
我希望这能很好地解释。