python装饰器,闭包函数
Posted 发奋的小虫子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python装饰器,闭包函数相关的知识,希望对你有一定的参考价值。
- 闭包函数:在函数A内部定义另外一个函数B,之后B作为A的返回值直接被返回。此时函数B称为A的闭包函数。在闭包函数B中如果使用A函数中定义的变量,此时A函数中被定义的变量会被临时存储,直到B函数调用结束时该变量才会被系统收回,从而实现A中变量延迟释放
例如
def put(num):
print(num)
def wrapper():
nonlocal num
num +=20
print(num)
return wrapper
fun = put(0)
fun()
此函数运行过程为:先依次从上往下运行,直到fun = put(0)语句,该语句为调用函数put,则执行函数put,输出结果为0,fun = wrapper,返回一个函数给fun,然而没有调用。当继续执行程序fun()时,程序运行的为wrapper函数,因为上面已经的num已经有值(nonlocal为不是本地变量的意思),所以函数会输出20
- global:声明的变量属于全局变量,此时在使用该变量时,计算机直接到函数的最外层寻找该变量是否存在
- nonlocal:声明变量属于非本地变量,此时计算机不会在当前变量使用的函数中寻找该变量,而是到该函数的外层寻找离该函数比较近的对应变量进行声明
- 装饰器:通过@语法直接使用定义好的函数修饰之前已经存在的函数,从而实现对原函数功能的扩充
优点:不需要修改原代码,即可实现对原函数功能的扩充;利于后期代码的维护
**(装饰器本质上是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器也是一个函数对象。他经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用)
import time
import functools
def log_time(fun):
@functools.wraps(fun)
def jj(*args1,**kb):
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
return fun(*args1,**kb)
return jj
@log_time # now = log_time(now)
def now(*a):
print(a)
now(19,20)
#定义一个自带参数的装饰器
def log(txt):
def de(fun):
@functools.wraps(fun)
def wrapper(*m,**km):
print(txt,end = ‘‘)
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
return fun(*m,**km)
return wrapper
return de
@log(‘对应时间是:‘)#等价于max_num = log(‘对应时间是:‘)fun(max_num)
def max_num(num1,num2):
print(max(num1,num2))
max_num(2,43)
- 获取绝对值:print(abs(-4))
列表遍历:
def callBack(num):
num **= 2
return num
list1 = [x for x in range(10)]
result = map(callBack,list1)
print(list(result))#map(fun,list):map用来对列表list的遍历操作,每一次遍历都会自动调用fun函数完成对本次遍历所得到的元素的计算,当遍历结束后返回一个map对象
6.列表过滤:
list2 = [1,3,4,54,5,4,3,35,"sdf","dsf"]
li = filter(lambda x:isinstance(x,int),list2)
print(list(li))#列表过滤:filter(fun,list)用来遍历列表list,按照给定的过滤条件,完成对满足条件的数据保存,不满足条件的进行过滤(删除)的操作。其中fun是回调函数,充当过滤的条件
7.#偏函数
import functools
int2 = functools.partial(int,base = 2)#将指定的函数和函数中默认值的参数进行绑定,生成一个新的函数,比如吧int函数和int的默认参数base绑定生成一个新函数int2,int2此时进行数据转换时按二进制进行转换
result = int2("10101000010100")
print(result)
以上是关于python装饰器,闭包函数的主要内容,如果未能解决你的问题,请参考以下文章