我想從列表中定義一個生成器,它將一次輸出一個元素,然後以的適當方式使用此生成器對象。如何定義和適當地使用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'?
謝謝!
我想從列表中定義一個生成器,它將一次輸出一個元素,然後以的適當方式使用此生成器對象。如何定義和適當地使用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'?
謝謝!
爲什麼要用while
循環?在Python,for
迴路絕對爲此設計:
a = ["Hello", "world", "!"]
b = (x for x in a)
for c in b:
print c,
如果你被困在一個while
實現無論出於何種原因,當前的實現可能是你能做的最好的,但它是一個有點笨重,不您認爲?
澄清:你的意思是生成器表達式不發電機 - 後者是包含至少一個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 Go),也有對這些對象進行的操作(可能來自多個也是一個列表)。所以通過這種方法,我避免了創建另一個巨大的列表。 – Morlock 2010-04-07 14:24:08
是,同意了。實際上,我嘗試鼓勵ppl不要創建第一個列表(或任何列表)以開始!如果你可以從一個迭代器,發生器或genexp開始,你就已經贏了! :-)這將是某種博客文章或InformIT上的一篇文章http://www.informit.com/topics/topic.aspx?st=66503在某些時候,因爲我已經寫了大部分內容。 – wescpy 2010-04-07 21:37:22
當然。我不知道爲什麼我想象我創建的發電機的行爲與實施的不同。 X_X – Morlock 2010-04-07 03:35:14