Heim  >  Artikel  >  Backend-Entwicklung  >  Eine ausführliche Erklärung von LEGB, Schließungen und Dekoratoren in Python

Eine ausführliche Erklärung von LEGB, Schließungen und Dekoratoren in Python

黄舟
黄舟Original
2017-08-04 10:43:401308Durchsuche

Dieser Artikel stellt hauptsächlich die relevanten Informationen zu LEGB, Verschlüssen und Verschlüssen in Python vor. Er führt hauptsächlich in das Verständnis und die Verwendung von Funktionsumfang und Verschlüssen ein und die Dekoratoren in Python können sich darauf beziehen 🎜>

Detaillierte Erklärung von LEGB, Schließungen und Dekoratoren in Python

LEGB L>E>G?B

    L: Interner Bereich der lokalen Funktion
  • E: Zwischen dem internen Bereich der umschließenden Funktion und der eingebetteten Funktion
  • G: globaler Bereich
  • B: integrierter integrierter Bereich
Python-Schließung

1 .Verschluss: Verweis auf die umschließende Bereichsvariable in der internen Funktion


2. Funktionsessenz und -attribute


    Die Funktion ist ein Objekt
  • Interne Variablen werden recycelt, nachdem die Funktion ausgeführt wurde
  • Funktionsattribute
  • Funktionsrückgabewert


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


Schließung
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)


Abschluss: Ein Verweis auf die umschließende Bereichsvariable in der inneren Funktion, der die umschließende Bereichsvariable an den Abschluss der inneren Funktion übergibt
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)

Die Rolle des Abschlusses:

    Kapselung
  • Code-Wiederverwendung

Python-Schließung 2

Summe


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())
Verwendung von Verschlüssen


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-Dekorator

    Der Dekorator wird zum Dekorieren von Funktionen verwendet
  1. Ein Funktionsobjekt zurückgeben
  2. Der dekorierte Funktionsbezeichner zeigt auf das zurückgegebene Funktionsobjekt
  3. Syntaxzucker @deco

  4. Verwendungsmöglichkeiten Dekorateure


Ein weiteres Beispiel
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'))


Das obige ist der detaillierte Inhalt vonEine ausführliche Erklärung von LEGB, Schließungen und Dekoratoren in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn