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

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

问题描述:

这是我的程序,它将一个单词列表并将它们从最长到最短排序,并打破与随机模块的关系。有什么区别:导入模块和从模块导入模块?

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 

到等同。具有相同名称的模块和方法只会让人感到困惑;语法清楚地表明了你的意思。

+0

那么,为什么不只是导入随机工作?我对这种语言相当陌生,所以我在理解这个意思时有点困难。 –

+1

@ G.G由于'import random'允许您在'random'名称下访问导入的*模块*。你不能调用一个模块。 – phihag

+2

模块与函数完全不同。这只是一个巧合,在这种情况下,它们都有相同的名称。 – patrys

from random import random 

相当于

import random as _random 
random = _random.random 

所以如果你只做

import random 

,你必须使用

random.random() 

代替

random() 
+1

然而,它确实令人困惑,特别是对于新的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)没有问题。

我希望这解释得很好。