迭代器
可迭代对象
- 集合类数据类型如list、tuple、dict、set、str等
- 生成器
判断是否可迭代
isinstance([],Iterable)
或查看其是否有__iter__()
迭代器
isinstance([],Iterator)
或查看其是否有__next__()
迭代器的优缺点:
迭代器的优点
1. 提供了一种不依赖于索引的取值方式
2. 惰性计算。节省内存
迭代器的缺点:
1. 取值不如按照索引取值方便
2. 一次性的。只能往后走不能往前退
3. 无法获取长度
生成器
生成器函数:函数体内包含有yield关键字,该函数执行的结果是生成器,生成器在本质上就是迭代器。
yield的功能:
- 与return类似,都可以返回值,但不一样的地方在于可以有多个yield,每个yield能够返回一次值,而return只能返回一次值就结束了
- 为函数封装好了__iter__和__next__方法,把函数的执行结果做成了迭代器
- 遵循迭代器的取值方式obj.next(),触发的函数的执行,函数暂停与再继续的状态都是由yield保存的
生成器的使用
def foo(n):
while n>0:
yield n
n_=1
g=foo()
print(g.__next__())
print(g.__next__())
print(g.__next__())
生成器表达式形式
def foo():
print('starting')
while True:
x=yield
print('value',x)
g=foo()
print(g.__next__())
print(g.send(1))