標籤:本質 python 列表 ret 通過 遇到 pytho return 不能
迭代器
索引:1 = [1,2,3]
for迴圈:for i in l:
i
print(dir([]))告訴列表擁有的所有方法
只要是能被for迴圈的資料類型 就一定擁有__iter__方法
print([].__iter__())
一個列表執行了__iter__()之後的傳回值就是一個迭代器
print(dir([]))print(dir([].__iter__()))print(set(dir([].__iter__())) - set(dir([])))
Iterable 可迭代的 -- > __iter__ #只要含有__iter__方法的都是可迭代的
[].__iter__() 迭代器 -- > __next__ #通過next就可以從迭代器中一個一個的取值
只要含有__iter__方法的都是可迭代的 —— 可迭代協議
迭代器的概念
迭代器協議 —— 內部含有__next__和__iter__方法的就是迭代器
迭代器協議和可迭代協議:
可以被for迴圈的都是可迭代的
可迭代的內部都有__iter__方法
只要是迭代器 一定可迭代
可迭代的.__iter__()方法就可以得到一個迭代器
迭代器中的__next__()方法可以一個一個的擷取值
for迴圈其實就是在使用迭代器
iterator
可迭代對象
直接給你記憶體位址
print([].__iter__())print(range(10))
for
只有 是可迭代對象的時候 才能用for
當我們遇到一個新的變數,不確定能不能for迴圈的時候,就判斷它是否可迭代
for i in l: passiterator = l.__iter__()iterator.__next__()
迭代器的好處:
從容器類型中一個一個的取值,會把所有的值都取到。
節省記憶體空間
迭代器並不會在記憶體中再佔用一大塊記憶體,
而是隨著迴圈 每次產生一個
每次next每次給我一個
產生器
產生器 —— 迭代器
def generator(): print(1) return ‘a‘ret = generator()print(ret)
產生器函數 —— 本質上就是我們自己寫得函數
產生器運算式
l = [1,2,3,4,5]for i in l: print(i) if i == 2: breakfor i in l: print(i)
只要含有yield關鍵字的函數都是產生器函數
yield不能和return共用且需要寫在函數內
def generator():print(1)yield ‘a‘
#產生器函數 : 執行之後會得到一個產生器作為傳回值
ret = generator()print(ret)print(ret.__next__())
python函數(迭代器,產生器)