2017-05-04 166 views
0

我在Python中使用nltk庫;我的背景是Java。我不明白我寫的代碼的控制檯輸出。儘管初始化變量tokens作爲列表,爲什麼Python會返回一個奇怪的形式。爲什麼輸出不打印列表?

from nltk.tokenize import word_tokenize 
from nltk.corpus import stopwords 
import nltk 
def tokenize_sentence(sentence): 
    tokens=[] 
    tokens = word_tokenize(sentence) 

    tokens = (word for word in tokens if word not in \ 
       set(stopwords.words('english'))) 
    return tokens; 

a="John is an actor." 
print(tokenize_sentence(a)) 

輸出:

<generator object tokenize_sentence.<locals>.<genexpr> at 0x10dc5b1a8> 

我看到這個輸出類似於當我嘗試打印是沒有定義的toString()方法的對象是什麼的Java做一些事情。

+5

圓括號內的理解會創建一個生成器*,而不是一個列表*。改用'[]'代替'()'用'tokens'或者調用'list(tokenize_sentence(a))'代替。 –

+3

它不會打印列表,因爲'tokens'不是一個列表。 – user2357112

+0

@JimFasarakisHilliard的建議都起作用。謝謝 – AV94

回答

6

初始賦值不是類型聲明。 Python自由變量不要類型的聲明。例如,你可以寫

x = 7 
x = [] 
x = "Hello" 

...看看X變化類型的每一項任務。

在這種情況下,您有三個獨立的令牌分配。其中每一種都以相同方式工作:

  1. 評估右側的表達式。
  2. 使左側的變量指向該值。

該變量的先前值被忽略。當你建立了一個在線發電機 - 您(一個字一個字......)表達 - 並將其分配到令牌,您發送的前值的位桶(即垃圾回收)。當您打印生成器時,不是遍歷其功能,而是獲取對象的Python表示形式。

作爲Jim Fasarakis Hilliard已經提到過,如果你想要一個列表,那麼使用list comprehension語法:括號,而不是括號。此外,您是否打算使用令牌的前值進行任何操作?目前,我認爲這些任務沒有任何持久效果。

+0

感謝您解釋背景中發生的事情 – AV94