这篇教程Python中yield返回生成器的详细方法写得很实用,希望能帮到您。 最简单、直观的认识,将 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)'''014''' 所有 for...in... 都是迭代器,包括列表、字符串、文件等等。 但是,迭代器所有的值都存储在内存中,十分浪费内存。 因此有了生成器的概念。
二、生成器生成器是一种迭代器,这种迭代器只能迭代一次。 生成器不会一次性存储所有的值,而是会动态的生成值。 mygenerator = (x*x for x in range(3))for i in mygenerator: print(i) 生成器只可执行一次,再次执行时不会输出任何东西。
三、yield
1.例子一yield 类似于 return 关键字,只是函数将返回一个生成器。 # 创建生成器def createGenerator(): mylist = range(10) for i in mylist: print(i) # 验证函数调用时并无执行 yield i*imygenerator = createGenerator() print(mygenerator) # <generator object createGenerator at 0x0000029E88FDCA50># 使用生成器for i in mygenerator: print(i)# 再次执行 返回为空 没有值了 函数将返回一组只需要读取一次的值,可以大大的提升代码性能。 在调用函数时,函数体中的代码并不会执行,函数只返回生成器对象。 代码每次从使用生成器时停止的地方继续。
2.例子二#Python学习交流群:531509025# 学习另外一个例子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: None4'''print(g.send(7)) 执行 yield 之后,才会跳出 while 循环。 next 函数用于执行下一步操作。 send 函数用于发送一个参数给生成器。且 send 方法中包含 next 方法。
总结本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注51zixue.net的更多内容! CentOS7上使用pyenv搭建Django环境 最强Python可视化绘图库Plotly详解用法 |