>  기사  >  백엔드 개발  >  Python의 LEGB, 클로저 및 데코레이터에 대한 자세한 설명

Python의 LEGB, 클로저 및 데코레이터에 대한 자세한 설명

黄舟
黄舟원래의
2017-08-04 10:43:401305검색

이 글에서는 주로 Python의 LEGB, 클로저, 데코레이터 관련 정보를 소개합니다. 주로 함수 범위와 클로저에 대한 이해와 사용법을 소개하며, 필요한 친구들이 참고할 수 있습니다

LEGB에 대한 자세한 설명, Python의 클로저 및 데코레이터

LEGB L>E>G?B

  • L: 로컬 함수의 내부 범위

  • E: 둘러싸는 함수 내부와 포함된 함수 사이

  • G: 전역 전역 범위

  • B: 내장 내장 범위

python 클로저

1. 클로저: 내부 함수에서 둘러싸는 범위 변수에 대한 참조

2. 함수 본질 및 속성

  • 함수는 객체입니다

  • 함수가 실행된 후 내부 변수는 재활용됩니다

  • 함수 속성

  • 함수 반환 값


rr 리

일반적인 상황


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

또 다른 예


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

위 내용은 Python의 LEGB, 클로저 및 데코레이터에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.