最简单、直观的认识,将 yield 看做 return 对待,只是 return 返回一个值,而 yield 返回一个生成器。
要理解 yield 的作用,必须理解生成器是什么?
在理解生成器之前,必须先理解迭代器。
一、迭代器逐项读取列表,称为迭代。
mylist = [1, 2, 3] for i in mylist: # 可迭代对象 print(i)
列表解析式同样是一个迭代器。
mylist = [x*x for x in range(3)] for i in mylist: print(i) ''' 0 1 4 '''
所有 for…in… 都是迭代器,包括列表、字符串、文件等等。
但是,迭代器所有的值都存储在内存中,十分浪费内存。
因此有了生成器的概念。
二、生成器生成器是一种迭代器,这种迭代器只能迭代一次。
生成器不会一次性存储所有的值,而是会动态的生成值。
mygenerator = (x*x for x in range(3)) for i in mygenerator: print(i)
生成器只可执行一次,再次执行时不会输出任何东西。
三、yield1.例子一
yield 类似于 return 关键字,只是函数将返回一个生成器。
# 创建生成器 def createGenerator(): mylist = range(10) for i in mylist: print(i) # 验证函数调用时并无执行 yield i*i mygenerator = createGenerator() print(mygenerator) ## 使用生成器 for i in mygenerator: print(i) # 再次执行 返回为空 没有值了
函数将返回一组只需要读取一次的值,可以大大的提升代码性能。
在调用函数时,函数体中的代码并不会执行,函数只返回生成器对象。
代码每次从使用生成器时停止的地方继续。
2.例子二
''' 学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! ''' # 学习另外一个例子 def foo(): print("starting...") while True: res = yield 4 # 函数并不真正执行 print("res:", res) g = foo() # 得到一个生成器对象 print(next(g)) # 真正执行 print("*"*20) print(next(g)) # 从上一次停止的地方继续执行 ''' starting... 4 ******************** res: None 4 ''' print(g.send(7))
执行 yield 之后,才会跳出 while 循环。
-
next 函数用于执行下一步 *** 作。
-
send 函数用于发送一个参数给生成器。且 send 方法中包含 next 方法。
结尾给大家推荐一个非常好的学习教程,希望对你学习Python有帮助!
Python基础入门教程推荐:更多Python视频教程-关注B站:Python学习者
【Python教程】全网最容易听懂的1000集python系统学习教程(答疑在最后四期,满满干货)
Python爬虫案例教程推荐:更多Python视频教程-关注B站:Python学习者
2021年Python最新最全100个爬虫完整案例教程,数据分析,数据可视化,记得收藏哦
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)