学习笔记:Python之偏函数、闭包、装饰器

偏函数

偏函数主要是用于内置函数
当内主函数不能满足我们的需求时,我们可以在内置函数的基础上生成一个新函数,这样两个函数可以满足不同的需求

以int()方法为例

# int()方法是强制转换的方法,将其他的数据类型转为整型数据
# 也可以用来转换进制
# 比如将'123'分别转为十进制、二进制、八进制、十六进制
print(int('123',base=10))
print(int('123',base=2))
print(int('123',base=8))
print(int('123',base=16))

# 自定义偏函数需要使用functools模块
import functools
# 自定义一个直接转为二进制的int()方法
int_2 = functools.partial(int,base=2)
print(int_2('123'))
# 定义一个直接转为十六进制的方法
int_16 = functools.partial(int,base=16))
print(int_16('123'))

闭包

闭包函数需要用到函数的嵌套,和循环嵌套一个道理,就是一个函数内部再写了一个函数
写在外面的函数叫做外部函数,写在里面的函数叫做内部函数

闭包函数则是用到了函数的return返回
用法:如在一个函数a中写了一个函数b,并且函数a的返回值是函数b,此时函数b就叫做闭包函数

  • 闭包成立的条件
    • 必须是函数内部嵌套函数
    • 外部函数的返回值一定是内部函数
    • 内部函数引用一个定义在闭包范围外的外部函数的变量
# 定义一个最简单地闭包
def outer():
	def inner():
		print('这是个闭包函数')
	return inner
fn = outer()
fn()
# 打印结果为:
# 这是个闭包函数

# 完整的闭包函数
def outer(num):
	a = 12
	def inner():
		# 引用一个外部函数的变量
		print(a + num)
	return inner
fun = outer(12)
fun()
# 打印结果为:
# 24

闭包函数主要用于装饰器中

装饰器

简单装饰器

装饰器本身也是个闭包,在代码运行期间,可以动态的给原函数添加功能,被称作为装饰器
作用:

在团队开发中,如果有两个或更多的方法使用了相同的功能,但是功能中又有一定的区别,这时候采用装饰器解决,互不影响,还可以简化代码

代码示例:

# 有一个方法test
def test():
	print('一个人哭,真爱无敌')
# 要求给test()方法后面添加一句'这句话出自人间清醒-经典语录'
# 方法一
# 直接重写方法
def test():
	print('一个人哭,真爱无敌')
	print('这句话出自人间清醒-经典语录')
# 方法二
# 函数嵌套
def test1():
	test()
	print('这句话出自人间清醒-经典语录')
# 方法三
# 装饰器
# 传入方法名
def outer(fn):
	def inner():
		# 调用函数方法
		fn()
		print('这句话出自人间清醒-经典语录')
	return inner

# 装饰器的简写方式
# 调用outer()方法
# @outer	等价于	demo = outer(demo)
@outer
def demo():
	print('Hello World!')
# 此处会自动执行函数
fn = demo()
# 或者这样,直接调用函数
demo()

不定长参数装饰器

定义一个装饰器,用来装饰多个函数
比如定义一个调用计算方法的装饰器

# 装饰器
def outer(fn):
	def inner(*args):
		print('计算结果为:',end=' ')
		fn(*args)
	return inner

# 使用装饰器
@outer
def add(x,y):
	print(x + y)

@outer
def subtract(x,y,z):
	print(x - y - z)

@outer
def cal(x,y,m,n)
	print((x+y)*(m+n))

add(2,3)
subtract(20,8,9)
cal(1,2,5,6)
# 执行结果为:
# 5
# 3
# 33

多个装饰器修饰一个函数

多个装饰器修饰一个函数时,会把装饰器中的内容按照代码中@装饰器 的顺序,就近依次执行

# 装饰器1
def outer1(fn):
	def inner1():
		fn()
		print('!!!!!!!!!!!!!!!!!')
	return inner
# 装饰器2
def outer2(fn):
	def inner2():
		print('----------')
		fn()
	return inner

# 使用装饰器
@outer1
@outer2
def fun():
	print('希望疫情早点过去')
fun()

# 执行结果为:
# ----------
# 希望疫情早点过去
# !!!!!!!!!!!!!!!!!

带返回值的装饰器

带返回值的装饰器,也可以理解成给带返回值的函数添加一个装饰器功能
这时候要输出对应的内容,就需要装饰器返回这个函数

# 比如:给hobby()方法新增一个功能,多输出一行:'我的爱好是:'
def outer(fn):
	def inner():
		print('我的爱好是:')
		return fn()
	return inner

@outer
def hobby():
	return '我喜欢看书'
print(hobby())
# 执行结果为:
# 我的爱好是:
# 我喜欢看书

装饰器种类的选择,需要看需要被装饰的原函数是什么样的,根据需求定义装饰器
如果原函数不需要用到return返回值,那么装饰器也不需要返回值;如果原函数的返回值是重要内容,那就需要带有返回值的装饰器了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

(#`O′)凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值