2015-07-19 81 views
-1

我已經測試一些代碼在IDLE 但我有一些問題要了解一個代碼產量(發電機)的功能

代碼:

def g(): 
    yield 'Stormx' 
    print('hi Stormx') 
    yield 'Gaza' 
    print('free to Gaza') 

看看當我使用功能以這種方式(當使用功能,無需粘貼可變) 給我這個:

>>> next(g()) 
'Stormx' 
>>> next(g()) 
'Stormx' 

看看當我把它發送給一個變量:

>>> a = g() 
>>> next(a) 
'Stormx' 
>>> next(a) 
hi Stormx 
Gaza 
>>> next(a) 
free to Gaza 
Traceback (most recent call last): 
    File "<pyshell#13>", line 1, in <module> 
    next(a) 
StopIteration 

產量?

爲什麼當我使用變量的結果改變?

程序中的收益使用收益率是多少?

+0

我無法理解這個話題(yield關鍵字在Python中做什麼?) –

回答

1

因爲當你調用函數時,它會返回一個生成器對象。然後你可以遍歷生成器對象。但是每次調用該函數時,都會返回一個新的生成器對象,該對象始終從頭開始。

示例 -

>>> def g(): 
...  yield 'Stormx' 
...  print('hi Stormx') 
...  yield 'Gaza' 
...  print('free to Gaza') 
... 
>>> 
>>> a = g() 
>>> a 
<generator object g at 0x0230E7D8> 
  1. 當你做next(a)(或開始迭代通過調用函數g()返回/下都能對象),直到它遇到的第一個yield聲明將開始執行。

  2. 一旦它遇到第一個yield語句,它將返回該值,但記住函數的狀態(直到它執行的地方,變量的值是什麼等)。然後,當我們再次在生成器對象上調用next()(或者我們開始在生成器對象上再次迭代時,它將從該特定點開始迭代直到它到達下一個yield語句(或者它從函數返回,在這種情況下StopIteration異常被拋出後),並有再次回到價值和記憶的狀態。

但同樣請注意,每次調用該函數爲這樣的時間,它返回一個新生成的對象,並且對於每個新的生成器對象,執行都從頭開始。示例顯示每個新函數返回一個新的g enerator對象 -

>>> a = g() 
>>> a 
<generator object g at 0x0230E7D8> 
>>> b = g() 
>>> b 
<generator object g at 0x0230E8F0> 
>>> id(a) 
36759512 
>>> id(b) 
36759792 

因爲有人問在評論 - 但爲什麼用產量,如果我可以使用回

這是因爲您可以繼續迭代由函數返回的生成器對象,直到它被耗盡。實施例 -

>>> def f(): 
...  for i in range(100): 
...    yield i 
... 
>>> a = f() 
>>> for x in a: 
...  print(x) 
... 

這將打印取值從0到99,通過遍歷對象發生器a,這不能如果函數返回值來實現。

+0

但爲什麼使用yield如果我可以使用return –

+0

因爲你可以繼續遍歷返回的生成器對象。用return語句你不能這樣做。 –

+0

你能舉一個例子嗎 –