屈服之前:叠代器
發現收益:建設者。
使用yield:遞歸調用
1.叠代程序
叠代器最簡單的例子應該是數組下標,看看下面的c++代碼:
int數組[10];
for(int I = 0;我& lt10;i++)
printf("%d ",array[I]);
叠代器在容器(array[10])中工作,它按照壹定的順序(i++)從容器中取值(array[i]),並對其進行操作(printf("%d ",array[i])。
上面的代碼被翻譯成python:
array = [i for i in range(10)]
對於數組中的I:
打印I,
for i in array做了什麽(別想了)?首先,array是壹個作為list的容器,其次,list的內置類型有默認的next行為。python在發現這些後采取的秘密行動是:取出array的容器叠代器,接下來把值給I,讓for循環的主體處理掉,for打印這個值。
現在的問題是,數據可以作為容器叠代,代碼可以嗎?
為什麽不呢?盤子可以用來放蔬菜。wk人不是和nt盛有關聯嗎?當然我們的收益率不會那麽黃+bt。
2.構造器
如何把函數變成構造函數?只是在函數體中有屈服!
def gen():
打印“輸入”
產量1
打印“下壹頁”
產量2
打印“再次下壹頁”
對於gen()中的I:
打印I
各位!Python在gen函數中看到了收益,並且知道它可以使用next。問題是接下來怎麽玩代碼容器?
當我從容器中得到叠代器時,它什麽也不是。它在容器的入口,對於數組是下標-1,對於函數是函數入口。我什麽都沒做,但壹切都準備好了,接下來就該我了。
從i in g開始,接下來讓itreator爬行到yield語句存在的地方,並返回值。
Next將再次攀升到下壹個yield語句所在的位置並返回值,依此類推,直到函數返回(容器的末尾)。
您必須看到上面代碼的輸出是:
進入
1
然後
2
下壹個
如果沒看到,請不要往下看,以免被yield照顧。
使用產量
Yield的代碼叠代能力不僅可以中斷函數執行,還可以記錄斷點處的數據,這正是下壹本書下次連接時遞歸函數所需要的。
例如,以中間順序遍歷二叉樹:
(應該是大衛·默茨寫的)
定義順序(t):
如果t:
對於有序排列的x(t . left):
產量x
產量t .標簽
對於按順序排列的x(t . right):
產量x
在有序(樹)中
印刷
當然yield的下壹步編碼能力也可以用在其他方面,發現憤怒的人在發帖。