python3迭代器
一、前提
1.dir()函数
dir()函数带参数时,返回参数的属性和方法列表;不带参数时,返回当前范围内变量、方法和定义的类型列表
# dir(参数):带参数,返回参数的属性和方法 s = '' print(dir(s)) print(dir([]))
2.双下法
双下法:带双下划线的方法。双下很少被直接调用,一般通过其它语法触发效果
l1 = [2, 1] l2 = [1, 2] print(l1 + l2) # l1+l2 -> l1.__add__(l2),通过python解释器转化 print(l1.__add__(l2))
二、可迭代协议
1.可迭代协议:只要含有__iter__方法,就是可迭代的
2.判断
# 方法1,判断是否含义__iter__方法 l1 = list(range(10)) res = '__iter__' in dir(l1) if res: print('l1,可迭代') else: print('l1,不可迭代')
# 方法2,通过导入模块 from collections import Iterable, Iterator # from collections import Iterable 被弃用 s = 'Hello, World!' res = isinstance(s, Iterable) if res: print('s,可迭代') else: print('s,不可迭代')
三、迭代器协议
1.迭代器协议:含有__iter__和__next__方法,就是迭代器
2.获取迭代器
li = list(range(5)) iterator = li.__iter__() # __iter__()方法的返回值,就是迭代器,将可迭代变成迭代器 print(iterator)
3.判断
# 方法1,通过__iter__和__next__方法判断 li = list(range(-5, 0)) # li = list(range(-5, 0)).__iter__() # list不是迭代器,但list.__iter__()是迭代器 _iter = '__iter__' in dir(li) _next = '__next__' in dir(li) if _iter and _next: print("li,是迭代器") else: print('li,不是迭代器')
# 方法2,通过导入模块 from collections.abc import Iterator li = list(range(10)) if isinstance(li, Iterator): print('l1,是迭代器') else: print('li,不是迭代器')
4.遍历
1)__next__
""" __next__()方法 只要迭代器才有__next__()方法 __next__()方法,从迭代器中一个一个取值 """ l1 = list(range(10, -5, -1)) count = 0 iterator = l1.__iter__() while count < 5: count += 1 print(iterator.__next__()) # 输出前五个元素 print('>>>', iterator.__next__()) # 输出第六个元素
2)for循环
""" for循环1 对象是可迭代,但不是迭代器 使用for循环,实质是通过for循环创建一个迭代器 所以,每次使用for循环都会创建一个新的迭代器 """ l1 = list(range(10, -5, -1)) count = 0 for i in l1(): # l1是可迭代对象,不是迭代器 count += 1 print(i) if count > 5: break for i in l1(): # for循环内部创建一个新的迭代器 print(i)
""" for循环2 对象是迭代器 使用for循环,不用通过for循环内部另创一个迭代器 所以,每次使用for循环使用的都是同一个迭代器 """ l1 = list(range(10, -5, -1)) count = 0 iterator = l1.__iter__() for i in iterator: # iterator是迭代器 count += 1 print(i) if count > 5: break for i in iterator: # 重新开始for循环,使用的依然是同一个迭代器 print(i)
四、迭代器的优点
1.从容器类型中取值,不需要索引、key等
2.降低内存消耗
原因:迭代器的数据通过for循环或__next__()方法加载到内存,而不是一次加载全部数据
五、总结
1.迭代器一定可迭代,可迭代不一定是迭代器
2.可迭代一定可以使用for循环,可以使用for循环一定可迭代
3.for循环,通过内部处理:可迭代->迭代器
4.迭代器:取容器类型的值,不依靠索引、key等
减低内存的消耗
5.可迭代,可以通过__iter__()方法变成迭代器
6.通过判断是否可迭代,来确定是否使用for循环