python编程基础(1)- 函数与函数编程

装饰器、闭包与偏函数

这两天在学习《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'))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值