python 迭代器、生成器知识点总结
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组对象都可用于创建迭代器:
list=[1,2,3,4]
it=iter(list)
printf(next(it))
printf(next(it))
输出为:
1
2
list=[1,2,3,4]
it = iter(list) # 创建迭代器对象
for x in it:print (x, end=" ")
输出为:
1 2 3 4
import sys # 引入 sys 模块list=[1,2,3,4]
it = iter(list) # 创建迭代器对象while True:try:print (next(it))except StopIteration:sys.exit()
输出结果:
1
2
3
4
next没有对象时会抛出异常,被捕获后,执行exit退出程序。
创建一个迭代器
把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。
如果你已经了解的面向对象编程,就知道类都有一个构造函数,Python 的构造函数为 __init__(), 它会在对象初始化的时候执行。
__iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。
__next__() 方法(Python 2 里是 next())会返回下一个迭代器对象。
创建一个返回数字的迭代器,初始值为 1,逐步递增 1:
举例
class MyNumbers:def __iter__(self):self.a = 1return selfdef __next__(self):x = self.aself.a += 1return xmyclass = MyNumbers()
myiter = iter(myclass)print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
输出结果:
1
2
3
4
5
实现了两个方法,__iter__方法负责初始化,__next__方法负责定义迭代规则
StopIteration
StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。
生成器函数
生成器是Python中的一个对象
对这个对象进行操作,可以依次生产出生成器内部运算产生的数据;
函数体中包含yield关键字(代替return)。
生成器函数的定义举例:
def add():for i in range(10):yield ig = add()
print(g) # <generator object add at 0x10f6110f8>
print(next(g)) # 0
print(next(g)) # 1
通过yield关键字定义一个生成器函数,这个生成器函数返回值就是一个生成器对象;
举例:
生成器函数可以使用next()迭代,且每次next()只会返回一次yield的值,然后暂停,
下次next()时,会在当前位置继续,如果没有元素可以迭代了,还执行next(),则需要给定一
个默认值,不给默认值会报错。
def gen():print('111111')yield '1'print('222222')yield '2'print('333333')yield '3'
g = gen()
print(g) # <generator object gen at 0x0026BBF0>
g1=next(g) # 111111
g2=next(g) # 222222
g3=next(g) # 333333
g4=next(g, 'over')
print(g1,g2,g3,g4) # 1 2 3 over
举例
如果在生成器函数中使用return,则终止迭代,不能得到返回值。
def gen():print('111111')yield '1'print('222222')return '2'print('333333')yield '3'
g = gen()
print(g) # <generator object gen at 0x0026BBF0>
g1=next(g) # 111111
g2=next(g) # 222222, 抛出异常
print(g1,g2) #
生成器函数的使用场景:
在生成器中使用死循环,不会一直执行,仍旧是执行多少次next(),返回多少个值。
# 死循环
def fun():i = 0while True:i += 1yield i
c = fun()
print(next(c)) # 1
print(next(c)) # 2
print(next(c)) # 3
print(next(c)) # 4
print(next(c)) # 5
生成器函数中的语法糖:
语法糖:没有给计算机语言添加新功能,而只是对人类来说更“甜蜜”的语法,把复杂的代码写的一看就恍然大明白
语法糖给程序员提供了更实用的编码方式,有益于更好的编码风格,更易读;
生成器的语法糖也就是生成器的一种语法,作用是使代码更加简洁,易懂
# 普通生成器函数way1
def way1():for i in range(5):yield i# 带语法糖的生成器函数way2
def way2():yield from range(5,9)#循环输出way1
for i in way1():print(i,end=" ") #0 1 2 3 4#循环输出way2
for j in way2():print(j,end=" ") #5 6 7 8
关于yield举例:
def echo(n):while True:n = yield ng = echo(1)
print(next(g))
print(next(g))
yield的机制是暂停运行过程输出当前结果并保留状态,状态包括上次终止的位置和终止时的 数值。下一次next()时从上一次终止的地方开始,因为yield之后没有任何语句,yield的返回值是none,所以n=none了,所以打印结果是None
综上:使用了生成器,在调用函数的时候不会一次性生成所有的元素,而是在每次调用 next() 才生成一个元素;而一次性返回全部结果的方式,在调用函数的时候就生成了所有元素,相比之下,更耗费内存和CPU。
python 迭代器、生成器知识点总结相关推荐
- python迭代器生成器 学会再缩短一半开发效率 看看大牛是怎么写的
一.迭代 什么叫做迭代? 比如在 Java 中,我们通过 List 集合的下标来遍历 List 集合中的元素,在 Python 中,给定一个 list 或 tuple,我们可以通过 for 循环来遍历 ...
- python 迭代器 生成器_Python迭代器和生成器
迭代器认知 迭代器 (iterator): 如果一个对象同时有__iter__()和__next__()魔术方法的话,这个对象就可以称为是迭代器. __iter__()的作用是可以让for循环遍历.而 ...
- python迭代器生成器装饰器
基本概念 学习python中有什么不懂的地方,小编这里推荐加小编的python学习群:895 817 687有任何不懂的都可以在里面交流,还有很好的视频教程pdf学习资料,大家一起学习交流! 1.容器 ...
- python 生成器装饰器_4.python迭代器生成器装饰器
基本概念 1.容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中.通常这类数据结构把所有的元 ...
- python 迭代器 生成器_python 迭代器与生成器
迭代器 迭代器就是iter(可迭代对象函数)返回的对象,说人话.......可迭代对象由一个个迭代器组成 可以用next()函数获取可迭代对象的数据 迭代是访问集合元素的一种方式(因为集合是无序的,所 ...
- python 迭代器 生成器
1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. 1.1 使用迭代 ...
- python 生成器装饰器_七.python迭代器生成器装饰器
1.迭代器 1.1 什么是可迭代对象(Iterable)? 定义:可以直接作用于for循环的对象统称为可迭代对象,即Iterable. 可迭代对象包括: 1.集合数据类型:如list.tuple.di ...
- python迭代器生成器使用技巧(2):切片、遍历、索引值、多序列、多容器对象
1. 迭代器切片 迭代器和生成器不能使用标准的切片操作,因为它们的长度事先并不知道(并且也没有实现索引). 函数 islice() 返回一个可以生成指定元素的迭代器,通过遍历并丢弃直到切片开始索引位置 ...
- python迭代器生成器使用技巧(1):遍历、代理、生成器创建迭代、反向迭代
1. 手动遍历迭代器 next() 遍历一个可迭代对象中的所有元素,但是却不想使用for循环.为了手动的遍历可迭代对象,使用 next() 函数并在代码中捕获 StopIteration 异常. 通常 ...
- python 迭代器生成器
目录 一.可迭代对象 1.1 判断是否为可迭代对象 二.迭代器 2.1 判断对象是否是一个迭代器 2.2 手写一个迭代器 2.3 迭代器应用场景 三.生成器 3.1 生成器介绍 3.2 使用yield ...
最新文章
- java rest 序列化_http请求/restful/序列化反序列化/JSON
- MFC多语言实现方法
- [react] 在react中无状态组件有什么运用场景
- [html] 你是如何区分HTML和HTML5的?
- connect ECONNREFUSED 151.101.0.133:443 | spawn xxx ENOENT
- 台式计算机进入安全模式蓝屏,windows进入系统安全模式时蓝屏怎么办?
- 7.边缘检测:2D运算——Canny边缘原理、Canny边缘检测器、Canny-Matlab实战_2
- [原创]CAN总线数据计算器V1.01
- 自动化部署工具Fabric简介
- Python核心编程(第三版)课后习题解答——第二章
- 【手工儿童】}DIY冬南瓜小兔子
- Alarm Clock
- 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
- 一个玩游戏的失足青年,转行做游戏开发到教育的挣扎过程(3)
- 中国工程师如何获 Google 的工作机会?
- java arraylist.add(),Java ArrayList add()方法与示例
- jQuery悬浮菜单
- 功能室计算机宣言,教室布置标语(精选多篇)
- java加壳工具_加壳工具 - virbox加密空间站 - OSCHINA - 中文开源技术交流社区
- Flash鼠绘入门第六课:青翠竹子绘制过程-Flash鼠绘青翠竹子1