012_迭代器

1,可迭代对象
    list dic str set tuple f=open() range() enumrate
2,dir()查看一个数据类型的所有方法
print(dir([]))
3,双下方法
    是可以用特殊符号引用的方法
print([1].__add__([2]))     #>>>[1, 2]
print([1]+[2])      #>>>[1, 2]      #这个其实执行的就是上面的代码
4,Iterable 可迭代的  __iter__
    只要是能被for循环的数据类型,就一定拥有 __iter__方法,即可迭代
print('__iter__' in dir(list))    #>>>True  #判断是否可迭代
5,一个列表执行了 __iter__()之后的返回值就是一个迭代器
 print([].__iter__())
6,找迭代器独有的方法
print(dir([]))      #[]不是迭代器
print(dir([].__iter__()))  #[].__iter__()是迭代器
print(set(dir([].__iter__())) - set(dir([])))  #求差集,找到迭代器独有的方法
print([1, 'a', 'ab'].__iter__().__length_hint__())  #元素个数
后两个结果:
{'__length_hint__', '__setstate__', '__next__'}
3
#方法说明:
'__length_hint__' ————>元素个数
'__setstate__' ————>指定迭代开始位置
'__next__' ————>取下一个值
7,迭代一个列表
lis = [1, 2, 3]
iterator = lis.__iter__()   #迭代器
print(iterator.__next__())  #依次取值
print(iterator.__next__())
print(iterator.__next__())
print(iterator.__next__())  #超出范围报错

8,

  • iterable 的迭代的 ————>__iter__ #只要含有__iter__方法的都是可迭代的
  • [].__iter__()迭代器 —————>__next__ #通过next就可以从迭代器中一个一个的取值
  • 只要含有__iter__方法的都是可迭代的————>可迭代协议
  • 迭代器协议————内部含有__next__和__iter__方法的就是迭代器
9,isinstance(被判断,是什么) 是判断是不是那个东西
from collections import Iterable
from collections import Iterator
print(isinstance([],Iterator))
print(isinstance([],Iterable))
10,迭代器的概念:
    可迭代协议:只要含有__iter__方法的但是可迭代的
    迭代器协议:内部含有__iter__和__next__方法的就是迭代器
  注:
    ①可以被for循环的都是可迭代的
    ②可迭代的内部都有__iter__方法
    ③只要是迭代器就一定可迭代
    ④可迭代的__iter__()方法就可得到一个迭代器
    ⑤__next__()可获取迭代器一个一个的值
    ⑥for循环实际上就是再使用迭代器
11,for循环
    只要是可迭代对象的时候才能用for
    当我们遇到一个未知的变量,不能确定能不能for循环时,就判断它是否可迭代
   11.1,for循环的执行本质:
       for i in L:
     pass
       相当于:第一步:iterator = L.__iter__()
     第二步:iterator.__next__()
    11.2,模拟一个for迭代器
    
lis = [1,2,3,4]
iterator = lis.__iter__()
while True:
    print(iterator.__next__())
12,迭代器的好处
    ①很方便使用,且只能取所有的数据一次
    ②从容器类型中一个一个的取值,会把所有的值都取到
    ③可以节省内存空间,迭代器并不会在内存中占用一大块内存,而是随着循环每次生成一个
原文地址:https://www.cnblogs.com/eternity-twinkle/p/10507365.html