詳解 python中legb和閉包及裝飾器
legb l>e>g?b
python 閉包
1.closure:內部函式中對enclosing作用域變數的引用
2.函式實質與屬性
passline = 60
def func(val):
if val >= passline:
程式設計客棧print ('pass')
else:
print ('failed')
def in_func():
print (val)
in_func()
return in_func
f = func(89)
f()print (f.__closure__)
一般情況
def f_100(val):
passline = 60
if val >= passline:
print ('pass')
else:
print ('failed')
def f_150(val):
passline = 90
if val >= passline:
print ('pass')
else:
print ('failed')
f_100(89)
f_150(89)
閉包def set_passline(passline):
dhxhqafjef cmp(val):
if val >= passline:
print ('pass')
else:
print ('failed')
return cmp
f_100 = set_passline(60)
f_150 = set_passline(90)
f_100(89)
f_150(89)
closure:內部函式中對enclosing作用域變數的引用,它會將enclosing作用域變數傳遞到內部函式的closure中
閉包的作用:
python閉包二
求和def my_sum(*arg):
if len(arg) == 0:
return 0
for val in arg:
if not isinstance(val,int): # 有乙個非int則返回0
return 0
return sum(arg)
def my_**erage(*arg):
if len(arg) == 0:
return 0
for val in arg:
if not isinstance(val,int): # 有乙個非int則返回0
returhxhqafjn 0
return sum(arg)/len(arg)
print (my_sum(1,2,3,4,5))
print (my_sum(1,2,3,4,5,'6'))
print (my_**eage(1,2,3,4,5))
print(my_**erage())
閉包的使用
def my_sum(*arg):
return sum(arg)
def my_**erage(*arg):
return sum(arg)/len(arg)
def dec(func):
def in_dec(*arg): # my_sum
print ('in dec arg= ',arg)
if len(arg) ==0:
return 0
for val in arg:
if not isinstance(val, int):
return 0
return func(*arg) # 閉包,存在於in_dec函式中的__closure__中,所以可以呼叫
return in_dec
my_sum = dec(my_sum) # 傳參
print(my_sum (1,2,3,4,5))
print(my_sum (1,2,3,4,5,'6'))
# my_sum就是in_dec函式,會先執行引數型別判斷,然後執行__closure__中的函式my_sum
python 裝飾器
使用裝飾器的方式
def dec(func):
def in_dec(*arg)www.cppcns.com: # my_sum
print ('in dec arg= ',arg)
if len(arg) ==0:
return 0
for val in arg:
if not isinstance(val, int程式設計客棧):
return 0
return func(*arg) # 閉包,存在於in_dec函式中的__closure__中,所以可以呼叫
return in_dec # 如果沒有返回值,則my_sum呼叫裝飾器後為none
# my_sum = dec(my_sum) # 不手動傳參
@dec # 裝飾器將my_sum作為引數傳入dec,並返回乙個新的函式賦值給my_sum
def my_sum(*arg):
return sum(arg)
def my_**erage(*arg):
return sum(arg)/len(arg)
print(my_sum (1,2,3,4,5))
print(my_sum (1,2,3,4,5,'6'))
另乙個例子
def deco(func):
def in_deco(x,y):
print ('in deco')
func(x,y)
print ('call deco')
return in_deco
@deco
def bar(x, y):
print ('in bar',x+y)
bar(1,2)
Python中的LEGB規則
local 函式內部 enclosing 巢狀函式的外層函式內部 global 模板全域性 built in 內建 今天老師教過的乙個式子列出4種作用域 a 3 b 30 c 300 def hanshuwai a 4b 40 def hanshinei a 5print a l local 優先使...
詳解Python中的閉包
定義 python中閉包的定義是 在乙個內部函式裡,對在外部作用域 非全域性作用域 的變數進行引用,則內部函式就被認為是閉包 closure 我們來結合 看一下閉包的概念 在函式addx 內部存在函式addy 因此,addy 就是內部函式。下面對函式addx 呼叫 我們可以發現addx 8 的型別是...
詳解Python函式作用域的LEGB順序
1.什麼是legb?l local 函式內部作用域 e enclosing 函式內部與內嵌函式之間 g global 全域性作用域 b build in 內建作用域 2.legb是作什麼用的?為什麼非要介紹這個呢?或者說它們的作用是什麼?原因是因為我們的在學習python函式的時候,經常會遇到很多定...