迭代器,閉包,遞迴

想吃橙子發表於2019-03-15

迭代器

函式名的使用

函式名可以當作值賦值給變數

函式名可以當作元素放到容器裡

返回函式名的時候不能加()

    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慢

遞迴的應用場景:

在不明確要迴圈的次數的時候,可以用遞迴

遞迴操作檔案目錄

 

相關文章