day13 迭代器

目录

一、可迭代协议

二、迭代器协议


一、可迭代协议

只要含有__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循环的时候,就判断它是否可迭代

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章