如果在乙個內部函式中對外部函式作用域的變數進行引用,那麼內部變數就會被稱為閉包,閉包的三個條件
存在於巢狀關係的函式中
巢狀的內部函式引用外部函式的變數
巢狀的外部函式會將內部函式名作為返回值返回
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 ...