2010-04-07 16 views
1

我想從列表中定義一個生成器,它將一次輸出一個元素,然後以的適當方式使用此生成器對象。如何定義和適當地使用Python生成器

a = ["Hello", "world", "!"] 
b = (x for x in a) 
c = next(b, None) 
while c != None: 
    print c, 
    c = next(b, None) 

這有什麼錯的或可改善這裏的while的方法呢?有沒有辦法避免在循環之前分配'c'?

謝謝!

回答

7

爲什麼要用while循環?在Python,for迴路絕對爲此設計:

a = ["Hello", "world", "!"] 
b = (x for x in a) 
for c in b: 
    print c, 

如果你被困在一個while實現無論出於何種原因,當前的實現可能是你能做的最好的,但它是一個有點笨重,不您認爲?

+1

當然。我不知道爲什麼我想象我創建的發電機的行爲與實施的不同。 X_X – Morlock 2010-04-07 03:35:14

3

澄清:你的意思是生成器表達式發電機 - 後者是包含至少一個yield語句/表達一個函數的定義。

與前面的海報一致......你應該使用for幾乎所有的循環。我很少使用while循環,這些循環被歸爲簡單的計數器或運行無限循環的服務器。 :-)

,你也可以把genexp在同一行for環......

a = ["Hello", "world", "!"] 
for c in (x for x in a): 
    print c, 

...因爲genexp不能重複使用。但是,它看起來不可讀。同樣,這也破壞了這個練習的目的。爲什麼不只是迭代一個本身呢?

for c in ["Hello", "world", "!"]: 
    print c, 

你已經用盡了內存來創建列表;爲什麼創建一個genexp,當它不是必需的?

+1

非常優雅的方法。關於「爲什麼不重複列表」,練習的目的是學習如何使用這種情況,其中列表既是巨大的(可能是1 Go),也有對這些對象進行的操作(可能來自多個也是一個列表)。所以通過這種方法,我避免了創建另一個巨大的列表。 – Morlock 2010-04-07 14:24:08

+1

是,同意了。實際上,我嘗試鼓勵ppl不要創建第一個列表(或任何列表)以開始!如果你可以從一個迭代器,發生器或genexp開始,你就已經贏了! :-)這將是某種博客文章或InformIT上的一篇文章http://www.informit.com/topics/topic.aspx?st=66503在某些時候,因爲我已經寫了大部分內容。 – wescpy 2010-04-07 21:37:22

相關問題