python yield用法_yield详解

参考文献:Python中的yield - CSDN博客

一、生成器generator

1.列表:

mylist 

2.生成器

mygen

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

二、生成器用法

mygen

三、yield的注意点

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

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

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

input

看一下打断点后的调试视频,了解一下执行顺序:

v2-45960cce40f3cd2b76340abcd640b210_b.jpg
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(),这个生成器就会生成一个值,是处理无穷序列的常见方法。

已标记关键词 清除标记
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页