迭代:
迭代器协议:
1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退)
2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)
3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象
for循环实现迭代的原理:
1.调用__iter__()方法,将后面序列转为可迭代对象
2.调用__next__方法,读取内容,读取到StopIteration异常,以终止迭代。
name=[1,2,3,4,5] for i in name: print(i) 实现for循环的原理 : name=name.__iter__() while True: try: print(name.__next__()) except StopIteration: break
生成器(优点:节省内存):
生成器:可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的__iter__方法),所以生成器就是可迭代对象。
生成器分类及在python中的表现形式:(Python有两种不同的方式提供生成器)
1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表
#函数表达式 a=(i for i in range(100)) print(a) print(a.__next__()) # 函数表达式 def generator_test(): yield 1 yield 2 yield 3 b=generator_test() print(b) print(b.__next__()) print(b.__next__()) print(b.__next__()) print(b.__next__())
生成器小结:
1.是可迭代对象
2.实现了延迟计算,省内存啊
3.生成器本质和其他的数据类型一样,都是实现了迭代器协议,只不过生成器附加了一个延迟计算省内存的好处,其余的可迭代对象可没有这点好处,记住喽!!!
触发函数生成器的方法:
1.__next__
2.next()
3.send() #send会将参数赋值给yield
参考链接:https://www.cnblogs.com/linhaifeng/p/6133014.html