Maison  >  Article  >  développement back-end  >  Une explication détaillée de LEGB, des fermetures et des décorateurs en Python

Une explication détaillée de LEGB, des fermetures et des décorateurs en Python

黄舟
黄舟original
2017-08-04 10:43:401305parcourir

Cet article présente principalement les informations pertinentes sur LEGB, les fermetures et les décorateurs en Python. Il présente principalement la compréhension et l'utilisation de la portée des fonctions et des fermetures et les amis qui en ont besoin peuvent s'y référer. 🎜>

Explication détaillée de LEGB, fermetures et décorateurs en Python

LEGB L>E>G?B

    L : Portée interne de la fonction locale
  • E : Entre la portée interne de la fonction englobante et la fonction intégrée
  • G : Portée globale
  • B : portée intégrée intégrée
fermeture python

1 .Fermeture : référence à la variable de portée englobante dans la fonction interne


2. Essence et attributs de la fonction


    La fonction est un objet
  • Les variables internes sont recyclées après l'exécution de la fonction
  • Attributs de la fonction
  • Valeur de retour de la fonction


Cas général
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__)


Clôture
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)


Fermeture : Une référence à la variable de portée englobante dans la fonction interne, qui transmettra la variable de portée englobante à la fermeture de la fonction interne
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)

Le rôle de la fermeture :

    Encapsulation
  • Réutilisation du code

fermeture python 2

Somme


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())
Utilisation des fermetures


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
Décorateur Python

    Le décorateur est utilisé pour décorer des fonctions
  1. Renvoyer un objet fonction
  2. L'identifiant de fonction décoré pointe vers l'objet fonction renvoyé
  3. Syntaxe sugar @deco

  4. Façons d'utiliser décorateurs


Autre exemple
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'))


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn