高階函式與裝飾器函式python

2021-10-10 19:05:44 字數 3499 閱讀 2761

高階函式是在python中乙個非常有用的功能函式,所謂高階函式就是乙個函式可以用來接收另乙個函式作為引數,這樣的函式叫做高階函式。

map()

map()是 python 內建的高階函式,它接收乙個函式function 和乙個 list,並通過把函式 function 依次作用在 list 的每個元素上,得到乙個新的 list 並返回。

這個例子中,假設使用者輸入的英文名字不規範,沒有按照首字母大寫,後續字母小寫的規則,可以利用map()函式把乙個list(包含若干不規範的英文名字)變成乙個包含規範英文名字的list。

def

format_name

(s):

return s.capitalize(

)result =

map(format_name,

['adam'

,'lisa'

,'bart'])

print

(list

(result)

)# 輸出內容:

# ['adam', 'lisa', 'bart']

reduce()

reduce()函式也接收乙個函式function, 和乙個list。但reduce()傳入的函式必須接收兩個引數,reduce()對list的每個元素反覆呼叫函式function, 並返回最終結果值。

from functools import

reduce

deff

(x, y)

:return x + y

result =

reduce

(f,[1,

3,5,

7,9]

)print

(result)

# 輸出內容:

# 25

reduce()函式使用起來比較特殊,為了更好的理解上面這個例子,來詳細拆解下,當呼叫reduce(f,[1,3,5,7,9])時,reduce函式將做如下計算:

由於f這個函式的功能是計算兩個元素的值,所以先計算頭兩個元素:f(1,3),結果為4;

再把結果和第3個元素計算:f(4,5),結果為9;

再把結果和第4個元素計算:f(9,7),結果為16;

再把結果和第5個元素計算:f(16,9),結果為25;

由於沒有更多的元素了,計算結束,返回結果25。

**reduce()**還可以接收第3個可選引數,作為計算的初始值。如果把初始值設為100,如計算:

reduce(f, [1, 3, 5, 7, 9], 100)

結果將變為125,因為第一輪計算是:計算初始值和第乙個元素:f(100, 1),結果為101。

裝飾器(decorators)是 python 的乙個重要部分。簡單地說:他們是修改其他函式的功能的函式。他們有助於讓我們的**更簡短。

一切皆物件

def

hi(name=

"yasoob"):

return

"hi "

+ name

print

(hi())

# output: 'hi yasoob'

# 我們甚至可以將乙個函式賦值給乙個變數,比如

greet = hi

# 我們這裡沒有在使用小括號,因為我們並不是在呼叫hi函式

# 而是在將它放在greet變數裡頭。我們嘗試執行下這個

print

(greet())

# output: 'hi yasoob'

# 如果我們刪掉舊的hi函式,看看會發生什麼!

del hi

print

(hi())

#outputs: nameerror

print

(greet())

#outputs: 'hi yasoob'

在函式中定義函式

可以在乙個函式中定義另乙個函式:

def

hi(name=

"yasoob"):

print

("now you are inside the hi() function"

)def

greet()

:return

"now you are in the greet() function"

defwelcome()

:return

"now you are in the welcome() function"

print

(greet())

print

(welcome())

print

("now you are back in the hi() function")

hi()

#output:now you are inside the hi() function

# now you are in the greet() function

# now you are in the welcome() function

# now you are back in the hi() function

# 上面展示了無論何時你呼叫hi(), greet()和welcome()將會同時被呼叫。

# 然後greet()和welcome()函式在hi()函式之外是不能訪問的,比如:

greet(

)#outputs: nameerror: name 'greet' is not defined

## 從函式中返回函式

其實並不需要在乙個函式裡去執行另乙個函式,我們也可以將其作為輸出返回出來:

def

hi(name=

"yasoob"):

defgreet()

:return

"now you are in the greet() function"

defwelcome()

:return

"now you are in the welcome() function"

if name ==

"yasoob"

:return greet

else

:return welcome

a = hi(

)print

(a)#outputs:

#上面清晰地展示了`a`現在指向到hi()函式中的greet()函式

#現在試試這個

print

(a()

)#outputs: now you are in the greet() function

當你把一對小括號放在後面,這個函式就會執行;然而如果你不放括號在它後面,那它可以被到處傳遞,並且可以賦值給別的變數而不去執行它。

還可以將函式作為引數傳給另乙個函式。

高階函式 裝飾器

1,高階函式 裝飾器 閉包 1 存在於巢狀關係的函式中 2 巢狀函式引用外部函式變數 3 外部函式會將內部函式名作為返回值返回 1 裝飾器是乙個閉包 2 執行過程 3 外部函式執行後並沒有 要被裝飾的函式,沒有引數,沒有返回值 def outer func print 開始裝飾 def inner ...

函式高階(裝飾器)

python裝飾器本質上就是乙個函式,它可以讓其他函式在不需要做任何 變動的前提下增加額外的功能,裝飾器的返回值也是乙個函式物件 函式的指標 裝飾器函式的外部函式傳入我要裝飾的函式名字,返回經過修飾後函式的名字 內層函式 閉包 負責修飾被修飾函式。從上面這段描述中我們需要記住裝飾器的幾點屬性,以便後...

裝飾器,高階函式,巢狀函式

裝飾器 本質是函式,裝飾其他函式 就是為其他函式新增其他功能 原則 1.不能修改被裝飾函式的源 2.不能修改被裝飾函式的呼叫方式 補充記憶體管理機制 函式即變數 匿名函式沒有名字,定義之後馬上被銷毀,除非賦值給乙個變數 def text1 print text1 text2 def text2 pr...