偏函数
偏函数主要是用于内置函数
当内主函数不能满足我们的需求时,我们可以在内置函数的基础上生成一个新函数,这样两个函数可以满足不同的需求
以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返回值,那么装饰器也不需要返回值;如果原函数的返回值是重要内容,那就需要带有返回值的装饰器了