本节重点
- 偏函数
- 返回函数
- 高阶函数
- 闭包
- 简单装饰器
一、偏函数
函数的参数偏爱某个值,类似于缺省参数,但是在此基础之上,可以设定函数的参数靠拢哪个偏爱值
# 先定义好一个函数
def show(num1,num2,num3 = 3):
return num1+num2+num3
# 定义偏函数来修改偏爱值
def show2(num1,num2,num3 = 4):
return show(num1,num2,num3)
print(show2(1,2))
'''
7
'''
# 另一种实现偏函数的方式,使用functools模块
import functools
newfunc = functools.partial(show,num3 = 1)
print(newfunc(1,2))
'''
4
'''
具体的应用场景:可以使用偏函数来对系统的内置函数设置偏爱值
# 譬如说对int()函数的参数进行偏爱,转换时偏爱二进制
int_b = functools.partial(int,base = 2)
result = int_b("11")
print(result,type(result))
'''
3 <class 'int'>
'''
二、返回函数
定义:
在函数中定义,从函数调用中返回,类似于函数嵌套。根据传入的不同参数,返回不同的函数(返回函数的重要意义)。
示例:
def calc(operation):
if operation == "+":
def sum(num1,num2):
return num1+num2
return sum
if operation == "-":
def sub(num1,num2):
return num1-num2
return sub
顺便一提:函数可以返回多个值,多个返回值被包装为元组
def more(num1,num2):
return num1+num2,num1-num2
result = more(2,1)
print(result)
'''
(3,1)
'''
三、高阶函数
函数参数可以接收外部的函数名,或返回值也为函数名,二者满足其一即可。
示例:
# 两个条件都满足的情况
def text(new_func):
# 调用传入的外部函数
new_func()
# 内部函数
def inner():
print("我是返回的内部函数")
return inner
def show_msg():
print("供调用外部的函数")
new_func = text(show_msg)
new_func()
'''
供调用外部的函数
我是返回的内部函数
'''
四、闭包
在函数嵌套的前提下,内部函数使用了外部函数的参数或变量。并把这个内部函数返回,返回的函数称为闭包。(一种高阶函数)
示例:
def show(msg):
#外部变量
num = 100
def inner():
print(num,msg)
return inner
new_func = show("开始")
new_func()
一般闭包的应用场景:可以根据参数的不同生成不同的函数
示例:
# 通过闭包生成不同函数
def show(msg,count):
return msg*count
print(show("a",10))
def show1(mesg,count):
def msg():
return mesg*count
return msg # msg就是返回的闭包
# new_func1、new_func2为闭包生成的不同功能函数
new_func1 = show1("a",10)
new_func2 = show1("b",10)
print(new_func1())
print(new_func2())
print(new_func1,new_func2)#对应内存地址不同
'''
aaaaaaaaaa
aaaaaaaaaa
bbbbbbbbbb
<function show1.<locals>.msg at 0x0000022BB6C0D620>
<function show1.<locals>.msg at 0x0000022BB6C0D510>
'''
五、简单装饰器
定义:
本质上也是闭包,可以给原函数的功能进行扩展,不改变原函数定义与调用操作。
示例:
#在AAAA前面加上BBBBB,装饰器本质是一个闭包
def show4():
print("AAAAA")
def decorator(new_func):
def inner():
print("BBBBB")
new_func()
return inner
# 重新给show4赋值
show4 = decorator(show4)
show4()
#语法糖形式
@decorator
def show5():
print("CCCCCCCC")
show5()
'''
BBBBB
AAAAA
BBBBB
CCCCCCCC
'''
网友评论