pythonyield详解_yield详解

一、生成器generator

1.列表:

mylist = [x*x for x in range(3)]

print mylist

output:

[0, 1, 4]#这是列表

2.生成器

mygen=(x*x for x in range(3))

print mygen

output:

at 0x052E8210>#这就是生成器generator和一个内存地址

两者区别:列表是[],生成器是()

二、生成器用法

mygen=(x*x for x in range(3))

for i in mygen:

print (i)

output:

0

1

4

三、yield的注意点

1.当函数含有yield,会被系统默认为是一个生成器

2.执行到yield p, 返回p值以及整个生成器处于暂停的状态,并跳出当前函数,执行到调用返回值p的语句

3.当再次执行到这个含有yield的生成器函数时,会自动立即执行到上次暂停的位置继续执行,也就是从yield p这个语句继续执行

input:

def fib(max):

a, b = 1, 1

while a < max:

yield a

a, b = b, a+b

for n in fib(15):

print n

output:

1

1

2

3

5

8

13

---------------------------------------------------------------------------------------------

input:

m = fib(13)

print m#打印生成器

print m.next()#打印生成器的第一个值

print m.next()#打印生成器的第二个值

print m.next()#打印生成器的第三个值

output:

1

1

2

看一下打断点后的调试视频,了解一下执行顺序:https://www.zhihu.com/video/926762874821554176

以上是一段关于斐波那契数列的程序。

fib()函数因为含有yield,被系统默认为是一个生成器。

for语句调用了fib(15)。当max=15时,进入fib()生成器,执行到yield a, 返回a值以及整个生成器暂停的状态,将a值赋给n, 打印出来;因为是for语句循环,所以又回到fib(15)语句,由于是生成器,因此从上次截断的位置开始执行,b值赋给a, a+b值赋给b,又因为是while语句,则继续while循环,yield a值,循环暂停跳出返回a值及生成器状态,把a值赋给n, 打印n。如此往复,一直循环到15结束。

m被赋了fib(13)这个生成器,每一次执行m.next()函数就会打印下一个值。

注意:

1. 每个生成器只能使用一次。比如上个例子中的m生成器,一旦打印完m的6个值,就没有办法再打印m的值了,因为已经吐完了。

2. yield一般都在def生成器定义中搭配一些循环语句使用,比如for或者while,以防止运行到生成器末尾跳出生成器函数,就不能再yield了。有时候,为了保证生成器函数永远也不会执行到函数末尾,会用while True: 语句,这样就会保证只要使用next(),这个生成器就会生成一个值,是处理无穷序列的常见方法。

你可能感兴趣的:(pythonyield详解)