一、迭代器
迭代器用来遍历列表,字符串,元组等可迭代对象
print(dir(str)) :dir查看xx类型的数据可以执行那些方法 __iter__
print(dir(list))
可迭代对象可以使用__iter__()来获取迭代器
1.可以通过dir来判断数据是否可迭代,以及数据是否可迭代
1 lst = ['a', 'b', 'c', 'd']
2 it = lst.__iter__()
3 print('__iter__'in dir(it))
4 print('__next__' in dir(it))
5 # 结果:True
6 # True
# 官方方案判断迭代器和可迭代对象 """ lst = ['a', 'b', 'c', 'd'] it = lst.__iter__() from collections import Iterable # 可迭代对象 from collections import Iterator # 迭代器 print(isinstance(lst, Iterable)) print(isinstance(lst, Iterator)) print(isinstance(it, Iterable)) print(isinstance(it, Iterator))
2.获取可迭代对象中的内容
迭代器里面有__next__(),用来获取可迭代对象中的内容,每执行一次取一次。
1 s = '黑的白的红的蓝的紫的' 2 it= s.__iter__() # 获取迭代器 3 print(dir(it)) 4 print(it.__next__()) 5 print(it.__next__()) 6 print(it.__next__()) 7 # 结果:黑 8 # 的 9 # 白
3.通过迭代器实行for循环
for循环的内部机制:
1.首先获取迭代器
2.使用while循环获取数据
3.it.__next__()来获取数据
4.处理异常 try:xxx except StopIteration
1 lst = ['a', 'b', 'c', 'd'] 2 it = lst.__iter__() 3 while 1: 4 try: 5 el = it.__next__() 6 print(el) 7 except StopIteration: 8 break
4.迭代器的特点:
1.只能向前
2.惰性机制
lst = ['a', 'b', 'c', 'd'] it = lst.__iter__() # 在取值时一次取一个 s = list(it) # 在list中存在for,一定存在__next__() print(s)
结果:['a', 'b', 'c', 'd']
3.省内存
二、生成器
1.生成器定义
def func(): print('w') yield 1 print('r') gen = func() # 不会执行函数,拿到的是生成器 ret = gen.__next__() # 会执行到下一个yield print(ret) gen.__next__() # 此时没有yield,报错,认为迭代器中的yield执行完毕 函数中如果有yield,这个函数就是生成器函数,生成器函数名()就是获取生成器,这个时候不执行函数 yield:相当于return可以返回数据,但是yield不会彻底终中断函数,而是分段执行函数 gen.__next__()执行函数,执行到下一个yield时停止,
生成器中需存在yield来达到分段执行该函数的效果,与return不同,遇到return会停止执行该函数,接受到的是返回值,而yield返回迭代器
2.生成器的作用
生成器能够延迟函数体的操作,在必需的时候才产生结果,如果函数体执行内容过多,立即产生结果会产生大量数据占用内存,使用生成器可以节省内存。
1 def order(): 2 for i in range(10000): 3 yield '衣服'+str(i) 4 clothes = order() 5 clothe = clothes.__next__() # 没执行一次next,才会执行一次函数体 6 print(clothe)
3.send方法
send()和__next__()是一样的,可以执行到下一个yield,但send()可以给上一个yield返回一个值
1 def func(): 2 print('我是第一个') 3 a = yield 123 4 print(a) 5 print('石头') 6 b = yield 456 7 print(b) 8 print('沙子') 9 c = yield 789 10 print(c) 11 print('砂石') 12 yield 777 13 14 15 g = func() 16 print(g.__next__()) # 第一个yield,不存在上一个yield 17 print(g.send('肉包子')) # send必须给参数,将”肉包子“传给yield,然后yield将值给a 18 print(g.send('煎饼')) 19 print(g.send('锅包肉')) 20 # 结果: 21 我是第一个 22 123 23 肉包子 24 石头 25 456 26 煎饼 27 沙子 28 789 29 锅包肉 30 砂石 31 777
4.yield from
yield from可以将可迭代对象中的元素作为生成器的结果返回:
1 def func(): 2 lst = ['Kobe', 'CP3', 'AI', 'LBJ'] 3 yield from lst 4 g = func() 5 for i in g: 6 print(i)