Python高階函數


 

  該篇中主要介紹什么是高階函數,高階函數的用法以及幾個常見的內置的高階函數。

什么是高階函數?

  高階函數:一個函數可以作為參數傳給另外一個函數,或者一個函數的返回值為另外一個函數(若返回值為該函數本身,則為遞歸),滿足其一則為高階函數。

  參數為函數
#參數為函數
def bar():
    print("in the bar..")
def foo(func):
    func()
    print("in the foo..")

foo(bar)
  返回值為函數
#返回值為函數
def bar():
    print("in the bar..")
def foo(func):
    print("in the foo..")
    return bar
res=foo(bar)
res()

  以上兩個示例中,函數foo()為高階函數,示例一中函數bar作為foo的參數傳入,示例二中函數bar作為foo的返回值。

  注:函數名(例如bar 、foo)-->其為該函數的內存地址;函數名+括號(例如 bar()、foo() )-->調用該函數。

 

高階函數-map、filter、reduce

  這三個函數均為高階函數,其也為Python內置的函數。接下來我們看一下這三個函數的用法以及其內部原理是怎樣的:

  map函數

    map函數接收的是兩個參數,一個函數,一個序列,其功能是將序列中的值處理再依次返回至列表內。其返回值為一個迭代器對象--》例如:<map object at 0x00000214EEF40BA8>。其用法如圖:

        

  接下來我們看一下map函數的機制是怎么樣的:

num=[1,2,3,4,5] def square(x): return x**2
#map函數模擬
def map_test(func,iter): num_1=[] for i in iter: ret=func(i) # print(ret)
 num_1.append(ret) return num_1.__iter__() #將列表轉為迭代器對象

#map_test函數
print(list(map_test(square,num))) #map函數
print(list(map(square,num))) #當然map函數的參數1也可以是匿名函數、參數2也可以是字符串
print(list(map_test(lambda x:x.upper(),"amanda"))) print(list(map(lambda x:x.upper(),"amanda")))

  filter函數

    filter函數也是接收一個函數和一個序列的高階函數,其主要功能是過濾。其返回值也是迭代器對象,例如:<filter object at 0x000002042D25EA90>,其圖示如下:

     

    接下來我們看一下filter函數的用法以及其機制是怎么樣的:

names=["Alex","amanda","xiaowu"]
#filter函數機制
def filter_test(func,iter):
    names_1=[]
    for i in iter:
        if func(i): #傳入的func函數其結果必須為bool值,才有意義
            names_1.append(i)
    return names_1
#filter_test函數
print(filter_test(lambda x:x.islower(),names))
#filter函數
print(list(filter(lambda x:x.islower(),names)))

  reduce函數

  reduce函數也是一個參數為函數,一個為可迭代對象的高階函數,其返回值為一個值而不是迭代器對象,故其常用與疊加、疊乘等,圖示例如下:

      

  實例如下:

#reduce函數不是內置函數,而是在模塊functools中的函數,故需要導入
from functools import reduce

nums=[1,2,3,4,5,6]
#reduce函數的機制
def reduce_test(func,array,ini=None): #ini作為基數
    if ini == None:
        ret =array.pop(0)
    else:
        ret=ini
    for i in array:
        ret=func(ret,i)
    return ret
#reduce_test函數,疊乘
print(reduce_test(lambda x,y:x*y,nums,100))
#reduce函數,疊乘
print(reduce(lambda x,y:x*y,nums,100))

  

  高階函數就了解到這,希望對大家有幫助,也是對自己的總結,共同學習。

 

 

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM