發電機組理解是做什麼的?它是如何工作的?我找不到關於它的教程。發電機理解究竟如何工作?
回答
你瞭解列表解析嗎?如果是這樣,一個生成器表達式就像列表理解一樣,但不是找到你感興趣的所有項目並將它們打包到列表中,而是等待,並逐個從表達式中逐項生成每個項目。
>>> my_list = [1, 3, 5, 9, 2, 6]
>>> filtered_list = [item for item in my_list if item > 3]
>>> print filtered_list
[5, 9, 6]
>>> len(filtered_list)
3
>>> # compare to generator expression
...
>>> filtered_gen = (item for item in my_list if item > 3)
>>> print filtered_gen # notice it's a generator object
<generator object at 0xb7d5e02c>
>>> len(filtered_gen) # So technically, it has no length
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'generator' has no len()
>>> # We extract each item out individually. We'll do it manually first.
...
>>> filtered_gen.next()
5
>>> filtered_gen.next()
9
>>> filtered_gen.next()
6
>>> filtered_gen.next() # Should be all out of items and give an error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> # Yup, the generator is spent. No values for you!
...
>>> # Let's prove it gives the same results as our list comprehension
...
>>> filtered_gen = (item for item in my_list if item > 3)
>>> gen_to_list = list(filtered_gen)
>>> print gen_to_list
[5, 9, 6]
>>> filtered_list == gen_to_list
True
>>>
因爲發生器表達式一次只能產生一個項目,所以會導致內存使用量大大節省。生成器表達式最適用於需要一次取一個項目的場景,根據該項目進行大量計算,然後轉到下一個項目。如果您需要多個值,則還可以使用生成器表達式並一次抓取幾個值。如果您在程序開始之前需要所有的值,請改爲使用列表理解。
列表/發電機理解是一個結構,它可用於從現有的創建一個新的列表/發電機。
比方說,你要生成從1到10每個數字的平方列表您可以在Python做到這一點:
>>> [x**2 for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
這裏,range(1,11)
生成列表[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
,但range
功能不Python 3.0之前的生成器,因此我使用的構造是列表理解。
如果我想創建一個發電機,做同樣的事情,我可以做這樣的:
>>> (x**2 for x in xrange(1,11))
<generator object at 0x7f0a79273488>
在Python 3,但是,range
是發電機,所以勝負只取決於語法你使用(方括號或圓括號)。
發生器理解爲具有一定的結構中產生的發電機的簡單方法。假設你想要一個generator
,它可以逐個輸出your_list
中的所有偶數。如果使用該函數的風格創建它,它會是這樣:當你調用next(evens)
你
evens = (number for number in your_list if number % 2 == 0)
在這兩種情況下,:
def allEvens(L):
for number in L:
if number % 2 is 0:
yield number
evens = allEvens(yourList)
你可以實現與這臺發電機理解表達相同的結果獲得your_list
中的下一個偶數。
發電機的理解是創造iterables,像這對移動資源的光標的方法。如果您知道mysql遊標或mongodb遊標,您可能會意識到整個實際數據不會一次加載到內存中,而是一次加載一次。你的光標來回移動,但內存中總是有一行/列表元素。
總之,通過使用生成器理解,你可以很容易地在python中創建光標。
發電機理解的又如:
print 'Generator comprehensions'
def sq_num(n):
for num in (x**2 for x in range(n)):
yield num
for x in sq_num(10):
print x
- 1. k-means ++究竟如何工作?
- 2. VO的setQueryMode究竟如何工作?
- 3. Struts2映射究竟如何工作?
- 4. 使用i18n.DataAnnotations。它究竟如何工作?
- 5. 種類列表究竟如何工作?
- 6. 聲音。它究竟如何工作?
- 7. mvn -U究竟是如何工作的?
- 8. link rel =「preload」究竟如何工作?
- 9. IEEE 754:它究竟如何工作?
- 10. 刪除工作究竟如何?
- 11. CSS @import究竟如何工作?
- 12. 究竟如何InsertAllOnSubmit工作在LINQ的
- 13. 究竟如何
- 14. 解釋當地人()以及它究竟是如何工作的
- 15. 這是如何工作的?究竟發生了什麼?
- 16. mDNS究竟如何解析地址?
- 17. 究竟Express.js如何處理錯誤?
- 18. 這個工作究竟和多少()?
- 19. 好的,這工作。究竟是什麼?
- 20. JavaScript變量作用域究竟如何工作?
- 21. 究竟是什麼作者想讓我理解?
- 22. 究竟內部發生
- 23. WordNet詞典學家檔案究竟是什麼?瞭解WordNet的工作原理
- 24. 'reference'typedef究竟如何表現?
- 25. 究竟是什麼觸發器不工作
- 26. 對數組的引用究竟如何工作?
- 27. 這個Perl單線程究竟是如何工作的?
- 28. 究竟如何工作內部惰性序列
- 29. NSView的-layout方法的重寫究竟應該如何工作?
- 30. 究竟如何做的NSIndexPath行物業工作
這是錯誤的。外部表達是否是生成器與內部表達是否無關。顯然,從列表中獲取元素的生成器表達式通常沒有多少意義,您可以這樣做。 – Antimony 2013-03-05 23:46:37