迭代器
函式名的使用
函式名可以當作值賦值給變數
函式名可以當作元素放到容器裡
返回函式名的時候不能加()
return aa
func()
func()的作用變成aa() 返回去執行aa函式
1 def func(): 2 def aa(): 3 print(2) 4 return None 5 return aa() # return None 6 func() # func() == None 7 輸出值是 2 8 return aa() 9 先呼叫aa函式 return返回值是aa函式的返回值
閉包
1.首先有一個巢狀函式
2.在巢狀函式內部的函式使用外部(非全域性)的變數
滿足這兩點要求的函式就是閉包
print(函式名.__closure__) 輸出結果不是None就是閉包
可以將函式名當作返回值返回,在全域性呼叫
python中,閉包會進行記憶體駐留,而普通函式在執行後用完了就銷燬了
全域性裡存放會有汙染和不安全的現象
裝飾器的本質是閉包
閉包的弊端:會出現記憶體洩漏
迭代器
可迭代物件
可以被for迴圈的就是可迭代物件
python協議 具有__ite__方法的就是可迭代物件
建立一個迭代器
a = 物件.__iter__
具有__iter__ 和 __next__方法的就是一個迭代器
1 li = [1,2,3] 2 a = li.__iter__() 3 print(a.__next__()) 4 print(a.__next__()) #一個一個取 5 print(a.__next__())
迭代器特性
惰性機制 一行一行往下走
不能從下向上走
一次性的 用完就沒了
for迴圈的機制就是迭代器
1 li = [1,2,3,4,6,7,87,8,9,90,0,0,0,0,8,7,7,67,] 2 em = li.__iter__() 3 while 1: 4 try: 5 print(em.__next__()) 6 7 except StopIteration: 8 break 9 10 try 和 except是用來排錯的 如果程式報錯執行except下面的break
遞迴
兩點要求:自己呼叫自己本身 有明確結束條件
def func(n): n+=1 print(n) if n == 5: return func(n) func(2) 輸出結果為 3 4 5
遞迴的效率比較低,尾遞迴的用時和for的用時是一樣的,比for慢
遞迴的應用場景:
在不明確要迴圈的次數的時候,可以用遞迴
遞迴操作檔案目錄