ホームページ  >  記事  >  バックエンド開発  >  Python の LEGB、クロージャ、デコレータの詳細な説明

Python の LEGB、クロージャ、デコレータの詳細な説明

黄舟
黄舟オリジナル
2017-08-04 10:43:401347ブラウズ

この記事では主にPythonのLEGB、クロージャ、デコレータの理解と使い方を紹介していますので、必要な方は参考にしてください

LEGBの詳細な説明。 Python のクロージャとデコレータ

LEGB L>E>G?B

  • L: ローカル関数の内部スコープ

  • E: 囲んでいる関数の内部と埋め込まれた関数の間

  • G: グローバル グローバル スコープ

  • B: 組み込みの組み込みスコープ

Python クロージャ

1.Closure: 内部関数内の囲んでいるスコープ変数への参照

2. 関数の本質と属性

  • 関数はオブジェクトです

  • 関数の実行後、内部変数はリサイクルされます

  • 関数の属性

  • 関数の戻り値


rrreええ

全体的な状況


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__)

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)

Closure: 内部関数の囲んでいるスコープ変数への参照。これは、囲んでいるスコープ変数を内部関数のクロージャに渡します

クロージャの役割:

  • カプセル化

  • コードの再利用


Pythonクロージャ2

sum


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)

クロージャの使用


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())

pythonデコレータ

  1. デコレータが使用されています関数を装飾するには

  2. 関数オブジェクトを返す

  3. 装飾された関数識別子は、返された関数オブジェクトを指します

  4. 糖衣構文 @deco


デコレータの使い方


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 の LEGB、クロージャ、デコレータの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。