迭代器

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

 




 

posted @ 2019-04-13 11:38  xiaofeiAI  阅读(133)  评论(0编辑  收藏  举报