目錄
一、可迭代協議
只要含有__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循環的時候,就判斷它是否可迭代