天天看點

Python之yield生成器

1、對比range和xrange的差別:

1

2

3

4

<code>&gt;&gt;&gt; print range(10)</code>

<code>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]</code>

<code>&gt;&gt;&gt; print xrange(10)</code>

<code>xrange(10)</code>

range()和xrange()的差別在于,range會在記憶體中建立所有指定的數字,而xrange不會立即建立,隻有在疊代循環時,才去建立每個數組。

這就類似于yield和return的差別

2、yield和return的差別

當定義一個函數時,如果函數的代碼出現了return,則函數立馬終止,并傳回結果。就算函數下面有多個return,也隻會傳回第一個return值。

示例:

5

6

7

<code>def func():</code>

<code>    </code><code>return</code> <code>1</code>

<code>    </code><code>return</code>

<code>print func()</code>

<code>1</code>

yield的原理:

<code>func1():</code>

<code>    </code><code>I func1():</code>

<code>    </code><code>I</code>

<code>2</code>

<code>3</code>

<code>當第一次循環是,擷取值1,此時yield不會退出函數,會記住yield 1這個位置,繼續執行函數,下一次就到yield2,在下一次到yield3</code>

return和yield的差別在于,return傳回結果後會跳出函數,不再執行函授後面的代碼,而yield不會跳出函數,并且會記住函數代碼執行位置,下次繼續執行。

xrange()的原理:

8

9

10

<code>def mrange(arg):</code>

<code>    </code><code>seed = 0</code>

<code>    </code><code>while</code> <code>True:</code>

<code>        </code><code>seed =seed + 1</code>

<code>        </code><code>if</code> <code>seed &gt; arg:</code>

<code>            </code><code>return</code>

<code>        </code><code>else</code><code>:</code>

<code>            </code><code>yield seed</code>

<code>for</code> <code>i </code><code>in</code> <code>mrange(10):</code>

<code>    </code><code>print i</code>

每次執行一次循環,會生成一個值。知道seed&gt;arg為止。

本文轉自 曾哥最愛 51CTO部落格,原文連結:http://blog.51cto.com/zengestudy/1827003,如需轉載請自行聯系原作者