E>G?BL:local函數內部作用域E:enclosing函數內部與內嵌函數之間G:global全局作用域B:build-in內置作用域python閉包1.Closure:內部函數中對enclosing作用域變量的引用2.函數實質與屬性函數是一個對象函數執行完成后內部變量回收函數屬性函數返回值passline=60deffunc(val):ifval>=passline:print('pass')els" />

日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

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

系統 1856 0

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

LEGB L>E>G?B

  • L:local函數內部作用域
  • E:enclosing函數內部與內嵌函數之間
  • G:global全局作用域
  • B:build-in內置作用域

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):
  def 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_average(*arg):
  if len(arg) == 0:
    return 0
  for val in arg:
    if not isinstance(val,int): # 有一個非int則返回0
      return 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_aveage(1,2,3,4,5))
print(my_average())


          

閉包的使用

            
def my_sum(*arg):
  return sum(arg)
def my_average(*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 裝飾器

  1. 裝飾器用來裝飾函數
  2. 返回一個函數對象
  3. 被裝飾函數標識符指向返回的函數對象
  4. 語法糖 @deco

使用裝飾器的方式

            
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調用裝飾器后為None

# my_sum = dec(my_sum)  # 不手動傳參
@dec     # 裝飾器將my_sum作為參數傳入dec,并返回一個新的函數賦值給my_sum
def my_sum(*arg):
  return sum(arg)
def my_average(*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和閉包及裝飾器的介紹,如有疑問請留言或者到本站社區交流討論,本站關于Python 的文章還有很多,還希望大家搜索查閱,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 政和县| 铁岭市| 大连市| 大田县| 宽甸| 轮台县| 皮山县| 乌兰浩特市| 全南县| 富川| 福海县| 呼伦贝尔市| 莱阳市| 应城市| 广饶县| 都安| 石台县| 依安县| 湟源县| 应城市| 司法| 宜阳县| 固安县| 黔西县| 绥中县| 博爱县| 商南县| 元氏县| 正阳县| 巴楚县| 保亭| 高阳县| 鹤岗市| 休宁县| 铅山县| 临湘市| 厦门市| 南开区| 疏附县| 义乌市| 五寨县|