2017-03-01 71 views
0

爲什麼我必須使用變量從Python生成器中獲取next()值?爲什麼我必須使用變量來從Python生成器中獲取值?

def my_gen(): 
    i = 0 
    while i < 4: 
     yield 2 * i 
     i += 1 

#p = my_gen() 
#for i in range(4): 
# print(next(p)) 

##for i in range(4): 
## print(next(my_gen())) 

在上面#號工作,而##塊返回4個副本的第一個「收益」。

+3

'my_gen()'創建一個新的生成器。也就是說,'next(p)'不等於重複調用'my_gen()'。 – miradulo

+0

你可以使用生成器:'print(* my_gen())' '0 2 4 6'' – f5r5e5d

回答

2
print(next(my_gen())) 

每本上運行,你打電話next()my_gen()返回一個單獨的(和全新)生成時間。

如果您想在同一個生成器上多次呼叫next(),您需要一些方法讓該生成器保持足夠長的時間以重用它。

+1

python命名的生成器/迭代器/瘋狂a **函數有點壞了。它增加了很多功能,但其中很多解釋方式只會讓人感到困惑 – Aaron

+2

@aaron你能解釋爲什麼它們被破壞嗎? –

+1

@PaulRooney許多人可互換地引用生成器,迭代器和協程(異步函數等)。技術上有單獨的單獨定義,但細微差別很容易混淆那些沒有在cPython源代碼中學習實際發生的東西的人們。這是我比較喜歡Lua而不是python的一個方面,因爲它有函數和co-例程,沒有別的。 (但這對橘子來說有點蘋果) – Aaron

1

只是要加我的0.02 $ ...

這可能有助於澄清一些誤解:

def function_that_creates_a_generator(n): 
    while n>0: 
     yield n 
     n - 1 

# this 
for x in function_that_creates_a_generator(5): 
    print(x) 

#is almost exactly the same as this 
generator = function_that_creates_a_generator(5) 
while True: 
    try: 
     x = generator.next() #same as: x = next(generator) 
    except StopIteration: 
     break 
    print(x) 

For循環其實只是寫一個while循環,不斷詢問一個迭代對象的方式漂亮爲其下一個元素。當你爲另一個對象請求一個迭代器並且它沒有時,它將引發一個StopIteration異常,該異常會自動陷入for循環;從循環中發出信號。在while循環中,我們簡單地將這些事件單獨分解出來,而不是將它們隱藏在解釋器中。

相關問題