目录
一、可迭代协议
只要含有__iter__方法的都是可迭代的
dir():不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表
print(dir([])) # 打印列表拥有的所有方法
print(dir({})) # 打印字典拥有的所有方法
print(dir('')) # 打印字符串拥有的所有方法
print(dir(range(10))) # 打印range(10)拥有的所有方法
可以for循环的: str、list、 tuple dict 、set、 f=open()[文件句柄]、 range()、 enumerate()
只要是能被for循环的数据类型,就一定拥有__iter__方法
print('__iter__' in dir(int)) # False
print('__iter__' in dir(bool)) # False
print('__iter__' in dir(list)) # True
print('__iter__' in dir(dict)) # True
print('__iter__' in dir(set)) # True
print('__iter__' in dir(tuple)) # True
print('__iter__' in dir(enumerate([]))) # True
print('__iter__' in dir(range(1))) # True
二、迭代器协议
内部含有__next__ 和 __iter__方法的就是迭代器
一个列表执行了__iter__()方法之后的返回值就是一个迭代器
print([].__iter__()) # <list_iterator object at 0x000001FD427B67F0>
print(set(dir([].__iter__())) - set(dir([]))) # {'__length_hint__', '__next__', '__setstate__'}
l = [1,2,3]
iterator = l.__iter__()
print(iterator.__next__()) # 1
print(iterator.__next__()) # 2
print(iterator.__next__()) # 3
print('__iter__' in dir( [].__iter__())) # True
print('__next__' in dir( [].__iter__())) # True
from collections import Iterable
from collections import Iterator
print(isinstance([],Iterator)) # Flase
print(isinstance([],Iterable)) # True
可以被for循环的都是可迭代的 可迭代的内部都有__iter__方法 只要是迭代器一定可迭代 可迭代的调用"__iter__()"方法就可以得到一个迭代器 例如:[].__iter__() 迭代器中的__next__()方法可以一个一个的获取值
for循环
只有是可迭代对象的时候才能用for
当我们遇到一个新的变量,不确定能不能for循环的时候,就判断它是否可迭代