迭代器和生成器

迭代器

  1. 迭代器协议:对象必须提供一个next方法,执行改方法要么返回迭代中的下一项,要么就引起一个stopiteration异常,以终止迭代(只能外后走不能往前退)
  2. 可迭代对象:实现了迭代器协议的对象,以下不是迭代器对象(字符串、列表、元组、字典、集合、文件对象)
  3. 协议的一种约定:可迭代对象实现了迭代器协议,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
原文地址:https://www.cnblogs.com/chrrydot/p/9789340.html