Python快速入門 高階函式

2021-09-03 01:40:17 字數 4569 閱讀 8467

如果在乙個內部函式中對外部函式作用域的變數進行引用,那麼內部變數就會被稱為閉包,閉包的三個條件

存在於巢狀關係的函式中

巢狀的內部函式引用外部函式的變數

巢狀的外部函式會將內部函式名作為返回值返回

def outer(start):

count = [start]

# 內部函式

def inner():

count[0] += 1

return count[0]

# 返回內部函式

return inner()

num = outer(5)

print(num)

執行結果:

6
裝飾器本質上也是乙個函式,它可以在不改動其它函式的前提下,對函式的功能進行擴充。通常情況下,用於以下幾種情況:

引入日誌

函式執行時間統計

執行函式前預備處理

執行函式後清理功能

許可權校驗

快取

def wrap(func):

print('正在裝飾')

def inner():

print('驗證裝飾')

func()

return inner

@wrap # test = wrap(test)

def test():

print("test")

test()

執行結果:

正在裝飾

驗證裝飾

test

執行過程:

當程式執行test()時,發現test()函式上面有@wrap,所以會先執行@wrap。(@wrap等介於:test = wrap(test)),它可以分為兩步:

① 執行wrap(test),將函式名test作為形參,傳遞給wrap。在呼叫wrap函式的過程中,將形參func指向test()函式體,並將inner()函式的引用返回給wrap(test),作為wrap(test)的返回值

② 這時test指向的就是inner()函式,完成了函式test()的裝飾

呼叫test()指向的函式,因為此時指向的是inner()函式,所以呼叫test()函式,就相當於呼叫inner()函式,由於在第一步時func形參指向了test()函式體,所以執行func(),就執行了test()函式體

多個裝飾器可以應用於乙個函式,它們的呼叫順序時由下而上

def wrap2(func):

print('正在裝飾2')

def inner():

print('驗證裝飾2')

func()

return inner

def wrap1(func):

print('正在裝飾1')

def inner():

print('驗證裝飾1')

func()

return inner

@wrap2 # test = wrap2(test)

@wrap1 # test = wrap1(test)

def test():

print("test")

test()

執行結果:

正在裝飾1

正在裝飾2

驗證裝飾2

驗證裝飾1

test

程式會顯執行@wrap1然後執行@wrap2,這兩個執行完後就已經裝飾完畢會輸出:
正在裝飾1

正在裝飾2

裝飾完畢後,執行test(),程式會按照從上向下的順序執行,最終輸出結果為:

驗證裝飾2

驗證裝飾1

test

def wrap(func):

print('正在裝飾')

def inner(hello):

print('驗證裝飾')

func(hello)

return inner

@wrap

def smcs(hello):

print(hello,'三木成森')

smcs('你好')

執行結果:

正在裝飾

驗證裝飾

你好 三木成森

在不確定是引數個數或型別的時候,可以使用不定長引數

def wrap(func):

def inner():

return func()

return inner

@wrap

def smcs():

return '三木成森'

print(smcs())

執行結果:

三木成森
def func_1(args):

def wrap(func):

def inner():

print(args)

return func()

return inner

return wrap

@func_1(123)

def smcs():

return '三木成森'

print(smcs())

執行結果:

123

三木成森

@func_1等介於:smcs = func_1(123)(test)

由於函式func_1(args)的返回值是wrap,所以又等介於:

smcs = wrap(test)

map函式會根據提供的函式對指定的序列做對映

map函式的定義如下:

map(function, iterable,....)

第乙個引數表示的是函式名,第二個引數可以是序列,支援迭代的容器或迭代器,當呼叫map函式時,iterable裡的每個元素都會呼叫function函式

func = lambda x:x*x

data = map(func,[1,2,3])

print(list(data))

執行結果:

[1, 4, 9]
這是對每個元素求平方

當傳入的函式需要兩個引數時,需要傳入兩個列表

func = lambda x, y:x+y

data = map(func,[1,2,3],[4,5,6])

print(list(data))

執行結果:

[5, 7, 9]
在python3之前,如果函式為none的話,相當於合併為元組

如果,兩個序列,元素個數不一致,那麼少的元素就會以none補齊

在python3之後,如果傳入的函式時none,就等同於zip函式,另外map無法處理兩個序列不一致,對應位置運算元型別不一致,它們都會報錯

filter函式,會對指定序列執行過濾操作

定義如下:

filter(function, iterable)

第乙個引數可以時函式名或者none,第二個引數iterable可以時序列、支援迭代的容器或迭代器,返回值為迭代物件,funtion只能接收乙個引數,且該函式的返回值為布林值

filter函式的作用時以引數迭代器中的每個元素分別呼叫funtion函式,最後返回的迭代器包含呼叫結果為true的元素

func = lambda x:x%2

result = filter(func, [1, 2, 3, 4, 5])

print(list(result))

執行結果:

[1, 3, 5]
reduce函式會對引數迭代器中的元素進行累積

from functools import reduce

func = lambda x, y:x * y

result = reduce(func, [-1, 2, 3, 4], -5)

print(result)

執行結果:

120

python 快速入門函式

def func print hello world return hello world a func print a hello world hello world def func args a,b,c print a,b,c func args 10,20,helloworld 10 20 ...

Python快速入門 函式

跟其他的語言一樣,函式可以做到 的復用與功能的封裝 def 函式名稱 這是個多行的注釋,可以解釋函式的功能 函式體 呼叫 函式名稱 def 是 define的封裝 源 i 1while i 9 j 1while j i print s s s i,j,i j end j j 1 i i 1print...

Python入門之高階函式 內建高階函式

一 高階函式 1 高階函式的實參是乙個函式名 2 函式的返回值是乙個函式 函式本身也可以賦值給變數,變數也可以指向函式 f abs print f 10 傳遞的引數包括函式名 def fun x,y,f return f x f y print fun 10,34,abs 1.map 函式 map ...