1 迭代器
迭代的定义:迭代是一个重复的过程,不同于其他纯粹的重复,迭代的每一次结果都是基于上一次迭代的结果产生的。
迭代器就是一个可以进行迭代取值的工具
作用:给我们提供了一种不依赖索引取值的方式
补充:针对双下划线开头,双下滑线结尾的方法
推荐读:双下+方法名
2 可迭代对象
内置有__iter__方法的对象(列表,词典,元组,字符串,集合等)
3 迭代器对象
即内置有__iter__方法也内置有__next__方法的对象(文件,类等)
注意:迭代器对象一定是可迭代对象,但可迭代对象不一定是迭代器对象
可迭代对象转化为迭代器对象:
iter_d = d.__iter__() # 后面可以跟多个__iter__方法
迭代器对象取值必须使用__next__方法
注意:
迭代器对象无论执行多少次__iter__方法得到的还是迭代器对象本身
4 for循环本质
for循环内部的本质 1.将in后面的对象调用__iter__转换成迭代器对象 2.调用__next__迭代取值 3.内部有异常捕获StopIteration,当__next__报这个错 自动结束循环
5 迭代取值的优缺点:
优点 1.不依赖于索引取值 2.内存中永远只占一份空间,不会导致内存溢出 缺点 1.不能够获取指定的元素 2.取完之后会报StopIteration错
6 生成器
用户自定义的迭代器,本质就是迭代器
def func(): print('first') yield 666 # 函数内如果有yield关键字,那么加括号执行函数的时候并不会触发函数体代码的运行 print('second') yield 777 print('third') yield 888 print('forth') yield yield # yield后面跟的值就是调用迭代器__next__方法你能得到的值 # yield既可以返回一个值也可以返回多个值 并且多个值也是按照元组的形式返回 g = func() # 生成器初始化:将函数变成迭代器
# 自定义range生成器,range的功能基本上实现,但美中不足的是有一点小瑕疵无法解决,当传入的finish==0时,如果传入的start<=finish且step==-1时,结果就跟原来的range函数不一样 def func(start, finish, step): if step >= 1: while start < finish: yield start start += step else: while start > finish: yield start start += step def my_range(start, finish=0, step=1): if finish == 0 and start > finish: res = func(finish, start, step) return res else: res = func(start, finish, step) return res for i in my_range(1, 0, -1): print(i)