關於Python中LEGB與閉包以及裝飾器的具體講解

黄舟
發布: 2017-08-04 10:43:40
原創
1363 人瀏覽過

這篇文章主要介紹了詳解Python中LEGB和閉包及裝飾器的相關資料,主要介紹了函數作用域和閉包的理解和使用方法及Python中的裝飾器,需要的朋友可以參考下

詳解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閉包二


  1. #求和

  2. 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裝飾器


裝飾器用來裝飾函數


####傳回一個函數物件###########被裝飾函數標識符指向傳回的函數物件############語法糖@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與閉包以及裝飾器的具體講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板