Python中Yield的基本用法


Posted in Python onOctober 18, 2020

带有yield的函数在Python中被称之为generator(生成器),也就是说,当你调用这个函数的时候,函数内部的代码并不立即执行 ,这个函数只是返回一个生成器(Generator Iterator)。

def generator():
 for i in range(10) :
  yield i*i

gen = generator()
print(gen)

<generator object generator at 0x7ffaad115aa0>

1. 使用next方法迭代生成器

generator函数怎么调用呢?答案是next函数。

print("first iteration:")
print(next(gen))

print("second iteration:")
print(next(gen))

print("third iteration:")
print(next(gen))

print("fourth iteration:")
print(next(gen))

程序输出:

first iteration:
 0
 second iteration:
 1
 three iteration:
 4
 four iteration:
 9

在函数第一次调用next(gen)函数时,generator函数从开始执行到yield,并返回yield之后的值。

在函数第二次调用next(gen)函数时,generator函数从上一次yield结束的地方继续运行,直至下一次执行到yield的地方,并返回yield之后的值。依次类推。

2. 使用send()方法与生成器函数通信

def generator():
 x = 1
 while True:
  y = (yield x)
  x += y

gen = generator()
  
print("first iteration:")
print(next(gen))

print("send iteration:")
print(gen.send(10))

代码输出:

first iteration:
 1
 send iteration:
 11

生成器(generator)函数用yield表达式将处理好的x发送给生成器(Generator)的调用者;然后生成器(generator)的调用者可以通过send函数,将外部信息替换生成器内部yield表达式的返回值,并赋值给y,并参与后续的迭代流程。

3. Yield的好处

Python之所以要提供这样的解决方案,主要是内存占用和性能的考量。看类似下面的代码:

for i in range(10000):
  ...

上述代码的问题在于,range(10000)生成的可迭代的对象都在内存中,如果数据量很大比较耗费内存。

而使用yield定义的生成器(Generator)可以很好的解决这一问题。

参考材料

  • https://pyzh.readthedocs.io/en/latest/the-python-yield-keyword-explained.html
  • https://liam.page/2017/06/30/understanding-yield-in-python/

总结

到此这篇关于Python中Yield基本用法的文章就介绍到这了,更多相关Python Yield用法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python中使用OpenCV进行人脸检测的例子
Apr 18 Python
tensorflow建立一个简单的神经网络的方法
Feb 10 Python
使用Python的Django和layim实现即时通讯的方法
May 25 Python
python读取excel指定列数据并写入到新的excel方法
Jul 10 Python
python 快速把超大txt文件转存为csv的实例
Oct 26 Python
python GUI实现小球满屏乱跑效果
May 09 Python
python3 写一个WAV音频文件播放器的代码
Sep 27 Python
python类中super() 的使用解析
Dec 19 Python
python 比较字典value的最大值的几种方法
Apr 17 Python
Django多数据库联用实现方法解析
Nov 12 Python
pytorch下的unsqueeze和squeeze的用法说明
Feb 06 Python
python文件与路径操作神器 pathlib
Apr 01 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
Oct 18 #Python
Python通过format函数格式化显示值
Oct 17 #Python
Python如何使用vars返回对象的属性列表
Oct 17 #Python
Python使用eval函数执行动态标表达式过程详解
Oct 17 #Python
Python基于locals返回作用域字典
Oct 17 #Python
Python classmethod装饰器原理及用法解析
Oct 17 #Python
Python基于staticmethod装饰器标示静态方法
Oct 17 #Python
You might like
php 高效率写法 推荐
2010/02/21 PHP
PHP中去除换行解决办法小结(PHP_EOL)
2011/11/27 PHP
php array的学习笔记
2012/05/10 PHP
PHP中将ip地址转成十进制数的两种实用方法
2013/08/15 PHP
PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
2014/03/17 PHP
PHP从FLV文件获取视频预览图的方法
2015/03/12 PHP
Laravel 在views中加载公共页面的实现代码
2019/10/22 PHP
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
一些常用的JS功能函数(2009-06-04更新)
2009/06/04 Javascript
面向对象继承实例(a如何继承b问题)(自写)
2013/07/01 Javascript
JS+JSP checkBox 全选具体实现
2014/01/02 Javascript
删除javascript中注释语句的正则表达式
2014/06/11 Javascript
搭建pomelo 开发环境
2014/06/24 Javascript
jQuery满屏焦点图左右滚动特效代码分享
2015/09/07 Javascript
使用BootStrap实现悬浮窗口的效果
2016/12/13 Javascript
Vue精简版风格概述
2018/01/30 Javascript
弱类型语言javascript中 a,b 的运算实例小结
2019/08/07 Javascript
Vue 动态组件components和v-once指令的实现
2019/08/30 Javascript
vue中实现点击按钮滚动到页面对应位置的方法(使用c3平滑属性实现)
2019/12/29 Javascript
js实现简单的秒表
2020/01/16 Javascript
python设置windows桌面壁纸的实现代码
2013/01/28 Python
python 打印直角三角形,等边三角形,菱形,正方形的代码
2017/11/21 Python
python+matplotlib实现礼盒柱状图实例代码
2018/01/16 Python
django admin后台添加导出excel功能示例代码
2019/05/15 Python
英国网上香水店:Fragrance Direct
2016/07/20 全球购物
英国水族馆和池塘用品购物网站:Warehouse Aquatics
2019/08/29 全球购物
C#的几个面试问题
2016/05/22 面试题
成人大专生实习期的自我评价
2013/10/02 职场文书
千元咖啡店的创业计划书范文
2013/12/29 职场文书
建议书怎么写
2014/03/12 职场文书
我的中国梦口号
2014/06/16 职场文书
个人思想政治总结
2015/03/05 职场文书
观后感的写法
2015/06/19 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书
python 下划线的多种应用场景总结
2021/05/12 Python
Python pygame实现中国象棋单机版源码
2021/06/20 Python