2011-09-26 270 views
0

這是我的程序,它將一個單詞列表並將它們從最長到最短排序,並打破與隨機模塊的關係。有什麼區別:導入模塊和從模塊導入模塊?

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

回答

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 
1
from random import random 

到等同。具有相同名稱的模塊和方法只會讓人感到困惑;語法清楚地表明瞭你的意思。

+0

那麼,爲什麼不只是導入隨機工作?我對這種語言相當陌生,所以我在理解這個意思時有點困難。 –

+1

@ G.G由於'import random'允許您在'random'名稱下訪問導入的*模塊*。你不能調用一個模塊。 – phihag

+2

模塊與函數完全不同。這只是一個巧合,在這種情況下,它們都有相同的名稱。 – patrys

3
from random import random 

相當於

import random as _random 
random = _random.random 

所以如果你只做

import random 

,你必須使用

random.random() 

代替

random() 
+1

然而,它確實令人困惑,特別是對於新的python學習者來說,一個模塊與它的一個方法具有完全相同的名稱。 – nye17

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)沒有問題。

我希望這解釋得很好。