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,
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