簡體   English   中英

Python生成器中的意外輸出

[英]Unexpected output in Python Generators

我試圖找出Python中的生成器,我試圖過濾列表並對它們進行平方並返回輸出。

list = [1, 4, -5, 10, -7, 2, 3, -1]

def square_generator(optional_parameter):
    return (x ** 2 for x in list if x > optional_parameter)
g = (square_generator(i) for i in list)

h = square_generator(0)
print h

我做錯了什么?

定義生成器時,必須迭代它,如下所示:

for x in h:
    print x

如果您只是嘗試打印生成器,那么您將獲得該對象:

<generator object <genexpr> at 0x02A4FB48>

如果要生成列表,只需使用列表推導:

def square_generator(optional_parameter):
    return [x ** 2 for x in somelist if x > optional_parameter]

或者在生成器上轉動調用list() (前提是您沒有使用list作為本地名稱):

list(h)

你的發電機工作正常,否則:

>>> somelist = [1, 4, -5, 10, -7, 2, 3, -1]
>>> def square_generator(optional_parameter):
...     return (x ** 2 for x in somelist if x > optional_parameter)
... 
>>> list(square_generator(0))
[1, 16, 100, 4, 9]

square_generator函數返回一個生成器對象。 生成器是迭代器,它們不是列表,而是包含用於生成序列的下一個元素的規則的對象。

因此,當您的函數返回時,它不會計算平方。 它們僅在需要時計算。 因此,您需要遍歷序列以獲取元素。 在您要求查看它們之前,它們根本不存在。

這也意味着當你遍歷列表時它會消失。 如果你想要它是持久的,你必須看看Martin Pieters的答案,即使用列表而不是生成器/迭代器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM