关于Python中LEGB与闭包以及装饰器的具体讲解


本文摘自php中文网,作者黄舟,侵删。

这篇文章主要介绍了详解 Python中LEGB和闭包及装饰器的相关资料,主要介绍了函数作用域和闭包的理解和使用方法及Python中的装饰器,需要的朋友可以参考下

详解 Python中LEGB和闭包及装饰器

LEGB L>E>G?B

  • L:local函数内部作用域

  • E:enclosing函数内部与内嵌函数之间

  • G:global全局作用域

  • B:build-in内置作用域

python 闭包

1.Closure:内部函数中对enclosing作用域变量的引用

2.函数实质与属性

  • 函数是一个对象

  • 函数执行完成后内部变量回收

  • 函数属性

  • 函数返回值


1

2

3

4

5

6

7

8

9

10

11

12

13

14

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

一般情况


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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)

闭包


1

2

3

4

5

6

7

8

9

10

11

12

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

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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

闭包的使用


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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 装饰器

  1. 装饰器用来装饰函数

  2. 返回一个函数对象

  3. 被装饰函数标识符指向返回的函数对象

  4. 语法糖 @deco

使用装饰器的方式


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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

另一个例子


1

2

3

4

5

6

7

8

9

10

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与闭包以及装饰器的具体讲解的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

Python字符串格式化的方法介绍

Python中swapcase是什么意思

Python在每个字符后添加空格的实例

Python //什么意思

Python如何另起一行

Python图片转字符画代码是什么

Python中关于eval函数与ast.literal_eval使用的区别介绍(图文)

Python数据怎么处理numpy.median

怎么安装Python

Python中的命名空间和范围

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...