有什么区别:导入模块和从模块导入模块?
这是我的程序,它将一个单词列表并将它们从最长到最短排序,并打破与随机模块的关系。有什么区别:导入模块和从模块导入模块?
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
我得到这个错误:类型错误:“模块”对象不是可调用
但是当我做:from module import module
它的工作原理?这是为什么?
import random # assigns the module random to a local variable
random = random.random # assigns the method random in the module random
您不能调用模块本身,但你可以调用它的方法random:
random
模块具有random
功能。当你做import random
时,你会得到显然不可调用的模块。当你做from random import random
时,你会得到可调用的函数。这就是为什么你没有看到第二种情况下的错误。
你可以在你的REPL中测试这个。
>>> import random
>>> type(random)
module
>>> from random import random
>>> type(random)
builtin_function_or_method
from random import random
到等同。具有相同名称的模块和方法只会让人感到困惑;语法清楚地表明了你的意思。
from random import random
相当于
import random as _random
random = _random.random
所以如果你只做
import random
,你必须使用
random.random()
代替
random()
然而,它确实令人困惑,特别是对于新的python学习者来说,一个模块与它的一个方法具有完全相同的名称。 – nye17
当你调用命令,
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)
没有问题。
我希望这解释得很好。
那么,为什么不只是导入随机工作?我对这种语言相当陌生,所以我在理解这个意思时有点困难。 –
@ G.G由于'import random'允许您在'random'名称下访问导入的*模块*。你不能调用一个模块。 – phihag
模块与函数完全不同。这只是一个巧合,在这种情况下,它们都有相同的名称。 – patrys