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 相关文章推荐
Python3中常用的处理时间和实现定时任务的方法的介绍
Apr 07 Python
CentOS中使用virtualenv搭建python3环境
Jun 08 Python
如何用C代码给Python写扩展库(Cython)
May 17 Python
谈一谈基于python的面向对象编程基础
May 21 Python
python3.5 cv2 获取视频特定帧生成jpg图片
Aug 28 Python
python智联招聘爬虫并导入到excel代码实例
Sep 09 Python
python3中的eval和exec的区别与联系
Oct 10 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
Nov 06 Python
Python基础之函数基本用法与进阶详解
Jan 02 Python
解决tensorflow 释放图,删除变量问题
Jun 23 Python
详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
Jan 24 Python
有趣的二维码:使用MyQR和qrcode来制作二维码
May 10 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
Get或Post提交值的非法数据处理
2006/10/09 PHP
一个PHP模板,主要想体现一下思路
2006/12/25 PHP
PHP合并静态文件详解
2014/11/14 PHP
thinkphp循环结构用法实例
2014/11/24 PHP
利用PHP绘图函数实现简单验证码功能的方法
2016/10/18 PHP
返回对象在当前级别中是第几个元素的实现代码
2011/01/20 Javascript
jquery(live)中File input的change方法只起一次作用的解决办法
2011/10/21 Javascript
JavaScript中“+”的陷阱深刻理解
2012/12/04 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
基于jQuery实现在线选座之高铁版
2015/08/24 Javascript
javascript history对象详解
2017/02/09 Javascript
JavaScript之iterable_动力节点Java学院整理
2017/06/29 Javascript
关于Vue背景图打包之后访问路径错误问题的解决
2017/11/03 Javascript
Angularjs Promise实例详解
2018/03/15 Javascript
详解React 服务端渲染方案完美的解决方案
2018/12/14 Javascript
jquery实现垂直手风琴导航栏
2020/02/18 jQuery
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
Python编程中装饰器的使用示例解析
2016/06/20 Python
Python 实现数据结构-循环队列的操作方法
2019/07/17 Python
python二元表达式用法
2019/12/04 Python
基于TensorFlow常量、序列以及随机值生成实例
2020/01/04 Python
详解python中各种文件打开模式
2020/01/19 Python
Python 实现向word(docx)中输出
2020/02/13 Python
突袭HTML5之Javascript API扩展2—地理信息服务及地理位置API学习
2013/01/31 HTML / CSS
编码实现字符串转整型的函数
2012/06/02 面试题
心得体会怎么写
2013/12/30 职场文书
不打扫卫生检讨书
2014/02/12 职场文书
十八届三中全会个人学习材料
2014/02/13 职场文书
四议两公开实施方案
2014/03/28 职场文书
社会公德演讲稿
2014/05/20 职场文书
计划生育证明格式范本
2014/09/12 职场文书
反四风对照检查材料
2014/09/22 职场文书
2015届大学生就业推荐表自我评价
2014/09/27 职场文书
民主评议党员个人总结
2015/02/13 职场文书
MySQL8.0.18配置多主一从
2021/06/21 MySQL