1. 程式人生 > 實用技巧 >python學習-第六週:高階函式

python學習-第六週:高階函式

高階函式

遞迴函式

遞迴函式就是定義了一個函式,然後在函式內,自己呼叫了自己這個函式
遞迴函式內必須要有結束,不然就會一隻呼叫下去,直到呼叫的層數越來越多,棧溢位
遞迴函式是一層一層的進入,再一層一層的返回

使用案例

def digui(num):
    print(num) 
    if num > 0:
        digui(num-1)
    print(num) 
digui(3)
'''
當前遞迴函式的執行過程:
digui(3) ==> 3 
    digui(3-1) ==> 2
        digui(2-1) ==> 1
            digui(1-1) ==> 0
            digui(0) ==> 0
        digui(1) ==> 1
    gidui(2) ==>2
digui(3) ==> 3
'''

回撥函式

函式中的引數可以是任意型別的,那引數能不能是一個函式呢?此處就用到了回撥函式
回撥函式:在 函式1 中要求傳遞的引數是 函式2,並且在 函式1 中使用了傳遞進來的 函式2

使用案例

# 定義一個函式,函式中的一個引數要求是另一個函式
# 帶有回撥函式引數的函式
def func(f):
    print(f,type(f))
    # 並且在函式中呼叫了傳遞進來的行參函式
    f()
# 回撥函式
def love():
    print('123')
func(love)

閉包函式

既然可以把函式作為一個行參進行傳遞,作為回撥函式,那麼如果在一個函式中,返回了一個函式呢?
在一個函式內返回了一個內函式, 並且這個返回的內函式還使用了外函式中區域性變數,這就是閉包函式

特點:

  • 在外函式中定義了局部變數,並且在內部函式中使用了這個區域性變數
  • 在外函式中返回了內函式,返回的內函式就是閉包函式
  • ⚠主要在於保護了外函式中的區域性變數,既可以被使用,又不會被破壞
  • 檢測一個函式是否為閉包函式,可以使用 函式名.__closure__ 如果是閉包函式返回 cell

使用案例

# 定義一個函式
def person():
    money = 0  # 函式中定義了一個區域性變數
    def work():
        nonlocal money   # 在內函式中使用了外函式的臨時變數
        money += 100
        print(money)
    # 在外函式中返回了內函式,這個內函式就是閉包函式
    return work

# 閉包的作用:保護了函式中的變數不受外部的影響,但是又能夠不影響使用

匿名函式 lambda 表示式

語法:lambda [引數列表]:返回值
帶有分支結構:lambda 引數列表: 真區間 if 表示式判斷 else 假區間

匿名函式的意思就是說可以不使用def定義,並且這個函式也有沒有名字
在python中可以使用lambda表示式來定義匿名函式
注意:lambda表示式僅僅是一個表示式,不是一個程式碼塊,所以lambda又稱為一行程式碼的函式
lambda表示式也有行參,並且不能訪問除了自己的行參之外的任何資料包括全域性變數

使用案例

a = lambda x,y:x+y
print(a(4,4))

b = lambda date:"睡懶覺" if date=='週末' else "去上班"
print(b('週一'))

迭代器

迭代器是python中最具特色的功能之一,是訪問集合元素的一種方式
迭代器是一個可以記住訪問遍歷的位置的物件
從集合的第一個元素開始訪問,直到集合中的所有元素被訪問完畢
迭代器只能從前往後一個一個的便利,不能後退
能被next()函式呼叫,並不斷返回下一個值的物件稱為迭代器(Iterator 迭代器物件)

iter()

功能:把可迭代的物件,轉為一個迭代器物件
引數:可迭代的物件 (str,list,tuple,dict
返回值: 迭代器物件
注意:迭代器一定是一個可以迭代的物件,但是可迭代物件不一定是迭代器

next()

next()函式可以去呼叫迭代器,並返回迭代器中的下一個資料

迭代器的取值方案

  • next() 呼叫一次獲取一次,直到資料被取完
  • list() 使用list函式直接取出迭代器中的所有資料
  • for 使用for迴圈遍歷迭代器的資料
    取出一個少一個,直到都取完,最後再獲取就會報錯

使用案例

f4 = ['趙四','劉能','小瀋陽','海蔘炒麵']
# 將列表 f4 轉為迭代器
res = iter(f4)
print(res,type(res)) # <list_iterator object at 0x109063810> <class 'list_iterator'>
# 1.使用next()函式去呼叫迭代器物件
print(next(res))
print(next(res))

# 2.使用list取值
r = list(res)
print(r)

# 3.使用for迴圈
for i in res:
    print(i)

檢測迭代器和可迭代物件的方法

from collections.abc import Iterator,Iterable                   
                                                                
varstr = '123456'                                               
res = iter(varstr)                                              
                                                                
# type() 函式返回當前資料的型別,                                           
# isinstance() 檢測一個數據是不是一個指定的型別                                 
r1 = isinstance(varstr,Iterable) # True 可迭代物件                   
r2 = isinstance(varstr,Iterator) # False 不是一個迭代器                
r3 = isinstance(res,Iterable) # True 可迭代物件                      
r4 = isinstance(res,Iterator) # True 是一個迭代器                     
print(r1,r2)                                                    
print(r3,r4)         
# 迭代器一定是一個可迭代的物件,可迭代物件不一定是迭代器                                           

函式第三部分歸納完畢,下週總結python的 file檔案相關操作,下週見~