迭代器
- 迭代器协议:对象必须提供一个next方法,执行改方法要么返回迭代中的下一项,要么就引起一个stopiteration异常,以终止迭代(只能外后走不能往前退)
- 可迭代对象:实现了迭代器协议的对象,以下不是迭代器对象(字符串、列表、元组、字典、集合、文件对象)
- 协议的一种约定:可迭代对象实现了迭代器协议,python的内部工具(sum、min、max)使用迭代器协议访问对象
for循环本质,将列表类通过__iter__()方法变成迭代器对象,然后调用迭代器对象的__next__()遍历
列表迭代器和索引方式访问比较
l = ['1','22','33as']
print(l[0] #索引
print(l.__iter__().__next__()) #迭代器
注意:
字符串、列表、元组、字典、集合、文件对象需要使用__iter__生成迭代器对象。
生成器
注意:
- 生成器产生的时候不做任何遍历操作
- 生成器只能遍历一次。
生成器自动实现了迭代器协议,是一种迭代器对象
def test():
yield 1 #相当于return,可多次调用,没调用一次返回一次,函数不结束
三元表达式
for循环三元组
#用于生成,for循环三元组
li = [i for i in range(10) if i>1] #使用列表生成器,占用更多内存
li = (i for i in range(10) if i>1) #使用迭代器方式,调用的时候生成数据
print(li)
if三元组
#用于判断
sex = 'man'
res = '美女' if sex == 'woman' else '帅哥'
print(res)
使用迭代器计算
print(sum(i for i in range(100000000000))) #使用迭代器方式进行sum计算,使用此方式内存和cpu不会太大浮动,对性能效果好很多
print(sum(list(range(1000000000)))) #使用list,进行计算,如果数值和上面一样会提示memory error,并且执行时会占用大量内存和cpu空间
迭代器yield保存状态
def test():
print('run round 1')
yield 1
print('run round 2')
yield 2
t = test()
t.__next__()
t.__next__()
#同next(t)
#运行结果
#run round 1
#run round 2