python——函数之生成器
1 生成器函数的含义
生成器是一个返回可以迭代对象的函数,它是一个特殊的迭代器,但迭代器的抽象层级更高且比较复杂需要实现很多方法。相较迭代器而言,生成器简单使用。
2 生成器的创建方式
2.1 生成器表达式
把列表推导式的[] 修改为(),如
(i for i in range(1, 10000) if i % 2 == 0)
代码执行界面如下:

2.2 生成器函数
(1)在一个一般函数中使用yield关键字,可以实现一个最简单的生成器,此时这个函数变成一个生成器函数。简单来说,生成器函数就是函数
中包含 yield语句的函数。
yield语法:yield [返回值] ([] 表示可选参数)。
yield的作用:yield可以去阻断当前的函数执行。当使用next()(或.__next__())函数,会让函数继续执行,yield后面的值作为next()函数
返回值,当执行到下一个 yeild时,又会被暂停挂起。
yield与return的区别:yield会保存当前函数的执行状态,在返回后,函数又回到之前保存的状态继续执行;而return返回后,函数
状态终止。
(2)代码实例
def mylist():
for i in range(3):
print("列表的第%s个元素:" % i, end="")
yield i ml = mylist() # 创建一个生成器
print(next(ml))
print(next(ml))
print(next(ml))
print(next(ml)) # 当生成器遍历完后,再遍历就会报错
代码执行顺序示意图:

3 生成器的遍历
3.1 next()或.__next__()遍历,代码如下
# 方式1
ml = (i for i in range(1, 10) if i % 2 == 0)
print("next()方式遍历结果:", end="")
print(ml.__next__(), end=" ,")
print(ml.__next__(), end=" ,")
print(ml.__next__(), end=" ,")
print(ml.__next__()) # 方式2
ml2 = (i for i in range(1, 10) if i % 2 == 0)
print(".__next__()方式遍历结果:", end="")
print(next(ml2), end=" ,") # next()相当于 生成器.__next__()
print(next(ml2), end=" ,")
print(next(ml2), end=" ,")
print(next(ml2))
上面代码执行结果如下:

3.2 for in方式遍历,代码如下,
ml = (i for i in range(1, 10) if i % 2 == 0)
print("for in 遍历结果为;", end=" ")
for i in ml:
print(i, end=", ")
上面代码执行结果为:

4 关闭生成器
命令:生成器名称.close() ,例如 ml.close()。
注意:生成器只会遍历一次,当关闭生成器或者遍历一遍后,后续如果再调用,会抛出StopIteration异常提示。下次如果想继续重新遍历,必须先重新创建生成器。
python——函数之生成器的更多相关文章
- python函数-迭代器&生成器
python函数-迭代器&生成器 一.迭代器 1 可迭代协议 迭代:就是类似for循环,将某个数据集内的数据可以“一个挨着一个取出来” 可迭代协议: ① 协议内容:内部实现__iter__方法 ...
- Python函数04/生成器/推导式/内置函数
Python函数04/生成器/推导式/内置函数 目录 Python函数04/生成器/推导式/内置函数 内容大纲 1.生成器 2.推导式 3.内置函数(一) 4.今日总结 5.今日练习 内容大纲 1.生 ...
- Python函数(十一)-生成器
首先看一下什么是列表生成式 >>> [i*2 for i in range(10)] [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] >>> ...
- Python函数-5 生成器
生成器有时候,序列或集合内的元素的个数非常巨大,如果全制造出来并放入内存,对计算机的压力是非常大的.比如,假设需要获取一个10**20次方如此巨大的数据序列,把每一个数都生成出来,并放在一个内存的列表 ...
- python 函数之装饰器,迭代器,生成器
装饰器 了解一点:写代码要遵循开发封闭原则,虽然这个原则是面向对象开发,但也适用于函数式编程,简单的来说,就是已经实现的功能代码不允许被修改但 可以被扩展即: 封闭:已实现功能的代码块 开发:对扩张开 ...
- Python —— 函数高级特性(切片、迭代、列表生成式、生成器、迭代器)
一.切片(Slice) 在很多编程语言中,针对字符串提供了很多截取函数(i.e. substring),目的就是对字符串切片.python中没有针对字符串的截取函数,需要通过“切片”来完成. 取一个 ...
- Python函数——列表推导式、生成器与迭代器
列表推导式 产生背景 现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求你把列表里的每个值加1,你怎么实现? 第一种方法: a = [1,3,4,6,7,7,8,9 ...
- python中的生成器函数是如何工作的?
以下内容基于python3.4 1. python中的普通函数是怎么运行的? 当一个python函数在执行时,它会在相应的python栈帧上运行,栈帧表示程序运行时函数调用栈中的某一帧.想要获得某个函 ...
- python函数、装饰器、迭代器、生成器
目录: 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象: 函数是第一类对象,即函数可以当作数据传递 ...
随机推荐
- MySQL高可用之组复制技术(2):配置单主模型的组复制
MySQL组复制系列文章: MySQL组复制大纲 MySQL组复制(1):组复制技术简介 MySQL组复制(2):配置单主模型的组复制 MySQL组复制(3):配置多主模型的组复制 MySQL组复制( ...
- 巨杉数据库 MySQL兼容项目正式开源
9月7日.8日,2018 ODF 开源数据库论坛,在北京盛大开幕.在大会上,巨杉数据库正式发布了巨杉全新的MySQL/MariaDB兼容架构,并将项目正式开源. 开源数据库论坛(ODF)是中国开源数 ...
- 第一册:lesson thirty three。
原文:A fine day. It is a fine day today. There are some clouds in the sky. But the sun is shining. Mr. ...
- redirection in linux
2>&1 # Redirects stderr to stdout. # Error messages get sent to same place as standard output ...
- 全面掌握Node命令选项
全面掌握Node命令选项 译者按:作为Node.js开发者,有必要全面了解一下节点命令的所有选项,这样在关键时刻才能得心应手. 原文:掌握Node.js的CLI和命令行选项 译者:Fundebug 为 ...
- a dive in react lifecycle
背景:我在react文档里找生命周期的图,居然没有,不敢相信我是在推特上找到的... 正文 react v16.3 新生命周期: static getDerivedStateFromProps get ...
- 微信小程序之发送模板消息(通过openid推送消息给用户)
一.获取access_token access_token是接口调用的凭证,目前有效期为两个小时,需要定时刷新,重复获取将导致上次获取的access_token失效.(注:不建议每次调用需要acces ...
- HDU3440 House Man
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- iOS------自动查找项目中不用的图片资源
注意:删除的时候要谨慎!别什么图都删了,看看对项目有没有作用.这个插件有时也会有一定的误差. 具体操作步骤: 1.去github上下载LSUnusedResources(下载地址:https://gi ...
- Android udp json+数组 --->bytes发送数据
Android json支持五种数据类型 String / int(float)/bool / null / object 今天说 object : json = new JSONObject( ...