python装饰器

标签: python 二三事

慕课网学习笔记



主要内容
+ 函数作用域LEGB
+ 闭包理解与使用
+ 装饰器


LEGB L>E>G?B

L:local函数内部作用域
E:enclosing函数内部与内嵌函数之间
G:global全局作用域
B:build-in内置作用域

python 闭包

  • Closure:内部函数中对enclosing作用域变量的引用
  • 函数实质与属性
    • 函数是一个对象
    • 函数执行完成后内部变量回收
    • 函数属性
    • 函数返回值
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__)

一般情况

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)

闭包

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闭包二

求和

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

闭包的使用

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

  • 装饰器用来装饰函数
  • 返回一个函数对象
  • 被装饰函数标识符指向返回的函数对象
  • 语法糖 @deco

使用装饰器的方式

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

另一个例子

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值