python 闭包函数,装饰器 理解

函数:只要是编程语言都绕不看函数,我们都知道 函数是我们从代码中提取出一段可重复使用,具有特定功能的代码块。我们定义函数时候会给函数名作为 这段代码块的唯一标识,或者说引用
函数调用: 而我们要调用函数,就需要一个标识,就是函数名,目前我接触语言函数调用 都是 函数名()来调用,一般()可已根据定义时候,来传入参数, 函数也可以有还回值,我们就可以通过传入不同参数,来获取不同返回值,这就是的代码变得更灵活,更智能了, 另外我们还可通过赋值方式来改变函数名 如 func1 = func() , 这样func()和func1()结果是一样的,
嵌套函数: 一般定义函数时,函数体都是执行语句,而python语言,做为脚本语言,和js一样 可以在函数内在定义函数,并在函数内调用,来实现代码编写效率 和精简代码

闭包函数:需要满足2条件:
1、函数体内嵌套函数,且嵌套函数(注意这里把内嵌函数名,也就函数引用,用,整个代码逻辑)作为函数返回值;
2 嵌套内部函数需要用 嵌套函数 外部 变量值;
闭包函数作用:
1.、可以实现函数中局部变量私有化,如下a=12 只有get1函数可以操作,get函数外是无法修改a的值的;
2、调用get()后 a变量 就绑定到 嵌套函数 get1() 上了,换句话说,一般函数执行完函数体内变量也就删除了(局部变量作用域理解), 但是这里,get 函数内a 在get() 后,不会删除掉,会和get1关联起来,还在运行内存中; 因为 inner 函数应用 通过return 还回 出来, 我们就可以通过一个变量接受,这样,通过变量不同调用 inner 函数,通过把结果累计存储在绑定变量a 中

实用性: 可以通过 counter = outer() 来实现计数功能,outer() 只执行一次,后续 调用一次counter( ), 就是调用一次inner函数;
第一次counter = a =1 ,
第二次 counter =a = 2

def outer():
  a= 0
    print( ' inner函数体外变量 a=',a)
    def inner():
        nonlocal a  # python语言,必须声明nonlocal 才能使用函数外部变量,而模块内全局必须使用global关键字
        a=a+1
        return a
    return inner

在平常工作当中,常常看到一个函数 @来修饰 函数 和类,如 @classmethod 修饰类方法;
理解了闭包函数,装饰器就好理解多了,装饰器也是一个定义好的函数,内部用了闭包函数, 这里内嵌函数内用到外部参数就是修饰函数引用(也就是函数名)
首先见面知意,装饰就是给装饰对象扩展一些功能逻辑,同时不改变被装饰函数内逻辑
import time
def deco(func):
print(‘装饰对象函数:’,func)
def wrapper():
print(‘扩展功能 运行时间’)
start = time.time()
func()
end = time.time()
print(‘运行时间 {:2f}秒’.format(end-start))
return wrapper

@deco # 这样就好计算add() 执行时间, 这里其实 add = deco(add),把add函数变成 wrapper
def add():
return a +b
当然我们还可以添加参数,到这里相信理解就水到渠成了, 只是如果@deco(params)传入了参数时,那对应wrapper 函数必须定义加wrapper(*args), 这个是函数的知识了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值