python迭代器和生成器
1 推到
推导式是可以从一个数据序列构建另一个新的数据序列的结构体, 共有三种推导:
列表(list)推导式
字典(dict)推导式
集合(set)推导式
列表(list)推导式
使用[]生成list
#实现数字0-9的平方组成的列表 squares = [x**2 for x in range(10)] print(squares)
结果:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
def squared(x): return x*x multiples = [squared(i) for i in range(30) if i % 3 is 0] print multiples
结果:
[0, 9, 36, 81, 144, 225, 324, 441, 576, 729]
字典(dict)推导式
字典推导和列表推导的使用方法是类似的,只不过中括号改成大括号。
#交换字典键与值 mcase = {'a': 10, 'b': 34} mcase_frequency = {v: k for k, v in mcase.items()} print(mcase_frequency)
结果:
{10: ‘a’, 34: ‘b’}
集合(set)推导式
集合推导与推到类似,也是使用大括号。
strings = ['a','is','with','if','file','exception'] print({len(s) for s in strings}) #有长度相同的会只留一个
结果:
{1, 2, 4, 9}
2 迭代器
它是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,任何实现了iter和next()方法的对象都是迭代器,iter返回迭代器自身,next返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常,至于它们到底是如何实现的这并不重要。
iter()函数会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内的元素。next()也是python内置函数。在没有后续元素时,next()会抛出一个StopIteration异常,
迭代器是访问集合内元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束。
(1)迭代器的四大特性
1.跌代集合,字符串,有序依次———即有可迭代对象
2.线程不安全的,多线程访问同一个集合修改报错。
3.对于无法随机访问的数据结构,迭代器是唯一选择
4.只迭代当前元素,迭代前后均可不存
3 生成器
生成器其实是一种特殊的迭代器,不过这种迭代器更加优雅。有两种方式可以返回一个生成器:
1.推导 (x+1 for x in lst) 生成器表达式,返回迭代器
2.或者yield :生成 且 只生成一次,且停止到此
yield的功能:
1 把函数的结果做生迭代器(以一种优雅的方式封装好iter,next)
2 函数暂停与再继续运行的状态是由yield
yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行。
list=[1,2,3,4] it = iter(list) # 创建迭代器对象 print (next(it)) # 输出迭代器的下一个元素 print (next(it))
结果:
1
2
def func(): print('first') yield 11111111 print('second') yield 2222222 print('third') yield 33333333 print('fourth') g=func() print(g) # 返回对象 from collections import Iterator print(isinstance(g,Iterator)) #判断是否为迭代器对象 print(next(g)) print('======>') print(next(g)) print('======>') print(next(g)) print('======>') print(next(g))
结果:
True
first
11111111 #第一次next(g)
======>
second
2222222 #第二次next(g)
======>
third
33333333 #第三次next(g)
======>
fourth
Traceback (most recent call last):
File “E:/python/python/python/迭代器.py”, line 105, in
print(next(g))
StopIteration #第四次next(g)
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
#斐波那契数列 def fb(): a=0 b=1 for i in range(5) yield b a,b=b,a+b f=fb() #f为对象生成器 print(f.__next__()) print(f.__next__()) print(f.__next__()) print(f.__next__()) print(f.__next__()) print(f.__next__()) #f中没有更多元素了,则抛出StopIteration异常
结果:
1
1
2
3
5
Traceback (most recent call last):
File “E:/python/python/python/迭代器.py”, line 86, in
print(f.next())
StopIteration
yield与return的比较:
相同:都有返回值的功能
不同:return只能返回一次值,而yield可以返回多次值
- python3 列表生成式、生成器、迭代器
- Python 生成器与迭代器 yield 案例分析
- Python的高级特性2:列表推导式,生成器与迭代器
- python的迭代器和生成器
- python迭代器与生成器与上下文管理器
- python之路 模块,序列化,迭代器,生成器
- Python-高级特性-生成器和迭代器
- Python 中 生成器、迭代器、可迭代对象 的概念
- Python学习笔记(10)-生成器generator和迭代器Iterator
- python-迭代器、生成器、内置函数及面向过程编程
- python 生成器和迭代器介绍
- 理解Python迭代对象、迭代器、生成器
- Python--day4--迭代器-生成器-装饰器-目录
- Python day5:列表生成式,生成器,迭代器
- Python简单学习(lecture3)编程、条件控制、循环语句、迭代器和生成器
- Python学习之路---Python迭代器与生成器
- 完全理解Python迭代对象、迭代器、生成器
- Python笔记-列表生成式、生成器generator(包括斐波拉契数列)、迭代器Iterator
- Python基础教程----迭代器和生成器,递归,八皇后(2)
- python 迭代器 生成器