天天看点

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,如需转载请自行联系原作者