Python|內部函數、閉包、lambda匿名函數

1 內部函數

Python可以在函數中定義另外一個函數。

當需要在函數內部多次執行復雜任務時,內部函數非常有用。

Python|內部函數、閉包、lambda匿名函數

2 閉包

若調用某函數時,該函數將其內部定義的函數作為返回值,則所返回的函數稱為閉包(closure)。或者說,如果在一個內部函數里,對在外部作用域(非全局變量)進行引用,這個內部函數就是閉包。

閉包是將函數的語句和執行環境打包在一起得到的對象,當執行嵌套函數時,閉包將獲取內部函數所需的整個環境,嵌套函數可以使用外層函數中的變量而不需要通過參數引用。

內部函數直接使用外部函數的參數,外部函數直接返回內部函數(相當於內部函數的複製),而不是調用它。所以內部函數形成一個閉包:一個被動態創建的可以記錄外部變量的函數。

Python|內部函數、閉包、lambda匿名函數

當閉包執行完成後,仍能夠保持當前的運行環境,並且可以根據外部作用域的變量得到不同的結果。

Python|內部函數、閉包、lambda匿名函數

3 匿名函數:lambda()函數

Python中,lambda函數是用一條語句表達的匿名函數。可以用它來代替小的函數。

Python|內部函數、閉包、lambda匿名函數

在lambda語句中,冒號前為參數,冒號後為函數定義。

通常,使用實際函數會比使用lambda更清晰明瞭。但是,當需要定義很多小的函數以及記住它們的名字時,lambda會非常有用。尤其是在圖形用戶界面中,可以使用lambda來定義回調函數。

附代碼:

#內部函數

def knight(saying):

def inner(quote):

return "hi:'%s'" % quote

return inner(saying)

print(knight('dog'))

'''

hi:'dog'

'''

#閉包1

def knight(saying):

def inner():

return "hi:'%s'" % saying

return inner

a = knight('duck')

b = knight('dog')

print(a)

print(b)

print(a())

print(b())

'''

.inner at 0x01CC08E8>

.inner at 0x0222B6F0>

hi:'duck'

hi:'dog'

'''

#閉包2

def out(x):

def inn(y):

return x+y

return inn

f = out(5)

print(f(20))

print(f(60))

'''

25

65

'''

# lambda匿名函數

def edit(words,func):

for word in words:

print(func(word))

animals = ['dog','sheep','tiger']

# 不使用lambda,使用普通函數定義小的函數

def enliven(word):

return word.capitalize() + '!'

print(edit(animals,enliven))

# 使用lambda定義小的函數

print(edit(animals,lambda word:word.capitalize() + '!'))

'''

兩種方式的print效果相同:

Dog!

Sheep!

Tiger!

None

'''

-End-


分享到:


相關文章: