1 內部函數
Python可以在函數中定義另外一個函數。
當需要在函數內部多次執行復雜任務時,內部函數非常有用。
![Python|內部函數、閉包、lambda匿名函數](http://p2.ttnews.xyz/loading.gif)
2 閉包
若調用某函數時,該函數將其內部定義的函數作為返回值,則所返回的函數稱為閉包(closure)。或者說,如果在一個內部函數里,對在外部作用域(非全局變量)進行引用,這個內部函數就是閉包。
閉包是將函數的語句和執行環境打包在一起得到的對象,當執行嵌套函數時,閉包將獲取內部函數所需的整個環境,嵌套函數可以使用外層函數中的變量而不需要通過參數引用。
內部函數直接使用外部函數的參數,外部函數直接返回內部函數(相當於內部函數的複製),而不是調用它。所以內部函數形成一個閉包:一個被動態創建的可以記錄外部變量的函數。
![Python|內部函數、閉包、lambda匿名函數](http://p2.ttnews.xyz/loading.gif)
當閉包執行完成後,仍能夠保持當前的運行環境,並且可以根據外部作用域的變量得到不同的結果。
3 匿名函數: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-
閱讀更多 小智雅匯 的文章