迭代器
1、可迭代的变量
dist、dic、str、set、tuple、f = open()、range()、enumerate(枚举)
2、怎么样获取到变量所含有的方法:
1 print(dir([]))
1 ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
求普通类别的方法
1 print(dir([]))
'__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
求列表被__iter__处理后的方法
1 print(dir([].__iter__()))
结果:
1 ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__']
求以上两种方法的差集
1 print(set(dir([].__iter__())) - set(dir([])))
结果:
1 {'__next__', '__length_hint__', '__setstate__'}
__length_hint__是求元素的个数
1 print([1,2,'a','avc'].__iter__().__length_hint__())
结果:4
3、双下方法
1 l = [4,5,6] 2 l2 = l.__iter__() 3 print(l2.__next__()) 4 print(l2.__next__()) 5 print(l2.__next__())
1 4 2 5 3 6
4、总结:
Iterable 可迭代的 --> __iter__ 只要含有__iter__方法的都是可迭代的
[].__iter__() 迭代器 --> __next__ 通过next就可以从迭代器中一个一个的取值
只要含有__iter__方法的都是可迭代的----可迭代协议
迭代器协议:内部含有__next__和__iter__方法的就是迭代器
证明过程如下:
1 print('__next__' in dir([].__iter__())) 2 print('__iter__' in dir([].__iter__())) 3 4 结果: 5 True 6 True
5、自己创建一个迭代器例子
1 from collections import Iterable 2 from collections import Iterator 3 class B: #这里少了任意一个方法都不行 4 def __iter__(self):pass 5 def __next__(self):pass 6 7 a = B() 8 print(isinstance(a,Iterator)) 9 print(isinstance(a,Iterable)) 10 11 结果: 12 True 13 True
6、迭代器协议与可迭代协
可以被for循环的都是可迭代可迭代的内部都有__iter__方法只要是迭代器 ,一定可以迭代
可迭代的.__iter__()方法就可以得到一个迭代器
迭代器中的__next__()方法可以一个一个的取值
for循环:其实为了能用for循环,那么把变量设为可迭代对象,for循环的本质就是迭代器,
在不确定是否能用for循环时候,那么判定它是否可迭代即可。
迭代器的好处:从容器中取值,可以一个一个取所有的值
可节省内存空间,迭代器并不会在内存中占用一大块内存,可以用next找出下一个。
1 def func(): 2 for i in range(200000): 3 i = "wanshanghao%s"%i 4 return i 5 print(func()) 6 结果: 7 wanshanghao199999