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/ironpython:从入门到精通
Oct 02 Python
python3安装pip3(install pip3 for python 3.x)
Apr 03 Python
Tensorflow之Saver的用法详解
Apr 23 Python
TensorFlow实现非线性支持向量机的实现方法
Apr 28 Python
python3爬虫学习之数据存储txt的案例详解
Apr 24 Python
Python符号计算之实现函数极限的方法
Jul 15 Python
深入解析神经网络从原理到实现
Jul 26 Python
使用Python将字符串转换为格式化的日期时间字符串
Sep 01 Python
python 字典的打印实现
Sep 26 Python
tensorflow生成多个tfrecord文件实例
Feb 17 Python
关于python 跨域处理方式详解
Mar 28 Python
python可视化 matplotlib画图使用colorbar工具自定义颜色
Dec 07 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
jquery+php+ajax显示上传进度的多图片上传并生成缩略图代码
2014/10/15 PHP
php curl获取到json对象并转成数组array的方法
2018/05/31 PHP
PHP chop()函数讲解
2019/02/11 PHP
js对数字的格式化使用说明
2011/01/12 Javascript
使用按钮控制以何种方式打开新窗口的属性介绍
2012/12/17 Javascript
jQuery中阻止冒泡事件的方法介绍
2014/04/12 Javascript
javascript弹出拖动窗口
2015/08/11 Javascript
JS实现的仿QQ空间图片弹出效果代码
2016/02/23 Javascript
微信jssdk在iframe页面失效问题的解决措施
2016/03/03 Javascript
浅谈Express异步进化史
2017/09/09 Javascript
JS设计模式之单例模式(一)
2017/09/29 Javascript
vue实现动态列表点击各行换色的方法
2018/09/13 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
利用JS响应式修改vue实现页面的input值
2019/09/02 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
vscode 调试 node.js的方法步骤
2020/09/15 Javascript
[46:27]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第一局
2016/03/02 DOTA
在Python中使用元类的教程
2015/04/28 Python
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
用python简单实现mysql数据同步到ElasticSearch的教程
2018/05/30 Python
Django unittest 设置跳过某些case的方法
2018/12/26 Python
flask 实现token机制的示例代码
2019/11/07 Python
pytorch .detach() .detach_() 和 .data用于切断反向传播的实现
2019/12/27 Python
Java多线程实现四种方式原理详解
2020/06/02 Python
如何利用python读取micaps文件详解
2020/10/18 Python
HTML5的结构和语义(1):前言
2008/10/17 HTML / CSS
Groupon比利时官方网站:特卖和网上购物高达-70%
2019/08/09 全球购物
JAVA和C++的区别
2013/10/06 面试题
校园安全检查制度
2014/02/03 职场文书
青春励志演讲稿
2014/04/29 职场文书
2014年药店工作总结
2014/11/20 职场文书
男生贾里读书笔记
2015/06/30 职场文书
如何通过cmd 连接阿里云服务器
2022/04/18 Servers
Python尝试实现蒙特卡罗模拟期权定价
2022/04/21 Python
TypeScript 内置高级类型编程示例
2022/09/23 Javascript