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实现linux下使用xcopy的方法
Jun 28 Python
图文详解WinPE下安装Python
May 17 Python
用matplotlib画等高线图详解
Dec 14 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
Apr 05 Python
python将字符串转换成json的方法小结
Jul 09 Python
python函数参数(必须参数、可变参数、关键字参数)
Aug 16 Python
Python PIL图片添加字体的例子
Aug 22 Python
Python搭建代理IP池实现检测IP的方法
Oct 27 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
Nov 04 Python
python日期与时间戳的各种转换示例
Feb 12 Python
详解用Python爬虫获取百度企业信用中企业基本信息
Jul 02 Python
python中的getter与setter你了解吗
Mar 24 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实现下载功能的代码
2012/09/29 PHP
使用HMAC-SHA1签名方法详解
2013/06/26 PHP
php将服务端的文件读出来显示在web页面实例
2016/10/31 PHP
php的instanceof和判断闭包Closure操作示例
2020/01/26 PHP
jQuery中find()方法用法实例
2015/01/07 Javascript
Javascript自定义事件详解
2017/01/13 Javascript
ES6中的箭头函数实例详解
2017/04/06 Javascript
ES6新特性一: let和const命令详解
2017/04/20 Javascript
js绑定事件和解绑事件
2017/04/27 Javascript
简单谈谈JS中的正则表达式
2017/09/11 Javascript
JavaScript模块模式实例详解
2017/10/25 Javascript
JS抛物线动画实例制作
2018/02/24 Javascript
Angular7创建项目、组件、服务以及服务的使用
2019/02/19 Javascript
JavaScript实现汉字转换为拼音及缩写的方法示例
2019/03/28 Javascript
浏览器事件循环与vue nextTicket的实现
2019/04/16 Javascript
微信小程序渲染性能调优小结
2019/07/30 Javascript
基于layui轮播图满屏是高度自适应的解决方法
2019/09/16 Javascript
JQuery中的常用事件、对象属性与使用方法分析
2019/12/23 jQuery
如何在 Vue 中使用 JSX
2021/02/14 Vue.js
简单学习Python time模块
2016/04/29 Python
python中WSGI是什么,Python应用WSGI详解
2017/11/24 Python
python如何重载模块实例解析
2018/01/25 Python
python调用xlsxwriter创建xlsx的方法
2018/05/03 Python
对Python3 解析html的几种操作方式小结
2019/02/16 Python
Pycharm配置PyQt5环境的教程
2020/04/02 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
Python实现LR1文法的完整实例代码
2020/10/25 Python
威尔逊皮革:Wilsons Leather
2018/12/07 全球购物
JAKO-O德国野酷台湾站:德国首屈一指的婴幼童用品品牌
2019/01/14 全球购物
银行见习期自我鉴定
2014/01/29 职场文书
软件项目实施计划书
2014/05/02 职场文书
预备党员个人总结
2015/02/14 职场文书
高中生思想道德自我评价
2015/03/09 职场文书
可怜妈妈观后感
2015/06/09 职场文书
详解Laravel服务容器的优势
2021/05/29 PHP
Python中time与datetime模块使用方法详解
2022/03/31 Python