詳解 Python中LEGB和閉包及裝飾器

2022-09-27 03:00:10 字數 3032 閱讀 5421

詳解 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函式的時候,經常會遇到很多定...