python的闭包与装饰器

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、闭包

1.什么是闭包?

闭包,定义函数时,在其内部又定义了一个函数,内部函数的内部作用域引用了外部函数的局部变量,外部函数返回内部函数,这种函数嵌套的方式就是闭包。

# 闭包函数
# outer为外部函数,a、b为其临时变量
def outer(a):
    b = 12
    # inner为内部函数
    def inner():

        print(a+b)

    return inner # 返回内部函数引用


if __name__ == '__main__':
    number = outer(6)
    number() # 18
    

2.global与nonlocal 

2.1、什么是global?

global关键字用来在函数或局部作用域下对全局变量修改

# number 为全局变量
number = 1
# 函数
def global_test():
    global number
    number += 2
    print(number)
global_test() # number为3

2.2、什么是nonlocal?

 nonlocal是外部函数嵌套下的变量

def nonlocal_test():
    num = 0

    def non_1():
        nonlocal num
        num += 2
        return num
    return non_1

abc = nonlocal_test()
print(abc())    # 2
print(abc())    # 4
print(abc())    # 6

2.3 、global与nonlocal 的区别?

1.global可以用在任何地方,包括上层函数与嵌套函数中,对未定义变量修饰后也可直接使用。

2.nonlocal只能用于嵌套函数,并且外层函数中必须定义了相应的局部变量。

3.global是对全局变量的修改,nonlocal是对上一级函数的局部变量进行修改

二、装饰器

1.什么是装饰器?

装饰器,它是闭包的一种应用形式,可以在不改变源码的情况下扩展函数的功能。使用\@高阶函数去装饰另一个函数,进行功能扩展。

装饰器 

import functools


def login(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print('call %s():' % func.__name__)
        print('args = {}'.format(*args))
        return func(*args, **kwargs)

    return wrapper

调用

@login
def test(p):
    print(test.__name__ + " param: " + p)
    
test("I'm a param")

输出

call test():
args = I'm a param
test param: I'm a param

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值