装饰器、闭包与偏函数
这两天在学习《python核心编程》,对函数与函数编程章节的装饰器、闭包、偏函数的内容理解的不是很好,这边对目前理解的情况,做一下记录,理解可能有出入,但是还是想先进行其他知识点的学习,就不纠结把他完全搞明白,后续还会在回来的
主要内容:
一、装饰器
1. 函数调用参数的语法:
func(positional_args, keyword_args,*tuple_grp_nonkw_args, **dict_grp_kw_args)<br/>
2. 函数装饰器:在不原代码的情况下,增加新功能
import functools
def mydecor_1(fun_1): #无参装饰器(两层嵌套)
@functools.wraps(fun_1) #参考廖雪峰官方网站
def wrapperFun():
print ("hell world!")
return fun_1()
return wrapperFun
def mydecor_2(text): #带参装饰器(三层嵌套)
def decor_text(fun_2):
@functools.wraps(fun_2) #参考廖雪峰官方网站
def wrapperFun():
print("tihs is mydecor_2(%s)()" % text)
return fun_2()
return wrapperFun
return decor_text
@mydecor_1 #无参装饰器,等价于 mydecor_1(fun())
def fun_1():
print("this is the fun_1()")
@mydecor_2("hahaha") #带参装饰器,等价于 mydecor_2("hhahha")((fun_2))
def fun_2():
print("this is the fun_2()")
""" 堆叠装饰器,不知道咋写啊,跳过
@mydecor_2("hahha")
@mydecor_1
def fun()
"""
#测试部分
fun_1()
fun_2()
#fun.__name__="fun()"
print(fun_1.__name__)
print(fun_2.__name__)
二、闭包
1. 装饰器好像就是用闭包实现的
2. 闭包:内部函数使用l外部函数中定义的变量
3. 考虑闭包用于传递,会发生什么呢,和一般函数的传递有什么不一样(闭包可以传递数据和功能)
4. 参考博客:闭包与装饰器
def counter(num=0):
count=num
def incr():
nonlocal count #与global不同,nonlocal用于标记上一级函数的局部变量,此处没有会报错:local variable 'count' referenced before assignment
count+=1 #内部函数使用外部函数的变量
return count
return incr
f=counter(5) # f好像是获得了内部函数局部变量的引用,资源没办法释放掉;和一般函数调用完就消失不同,这边相当于创建了一个类实例对象??
print(f())
print(f())
print(f())
三、偏函数
一般函数,比如有多个默认参数:
def fun(name,age,sex="female",country="China"):
print(name,age,sex,country)
fun("zhangsan",20,"male","USA") #这样输入是不是很麻烦
fun("lisi",20,"male","USA")
fun("wangwu",20,"male","USA")
我们可以在定义一个函数fun_male_usa()的函数将,sex和country固定下来,
fun_male_usa(“zhangsan”,“20”),这样是不是少输入两个呢?但是我想打印“female” “USA”,怎么办呢,在定义一个函数 fun_female_usa(),显然不是这样的
使用偏函数可以解决上述问题,代码可复用性高
#偏函数示例:格式 functools.partial(原函数,想要固定函数)
from functools import partial
fun_male_usa=partial(fun,sex="male",country="China")
fun_male_usa("zhaoliu",40)
#其他偏函数例子:
int_2=partial(int,base=2) #int表示int()工厂函数,参考《python核心编程》
print(int_2('101010'))