函数做为变量
python中声明函数就是声明类型是function的变量,函数名就是变量名
普通的变量能做的事情,函数都可以
def fun():
print('======')
print(id(fun), type(fun)) #1938944946248 <class 'function'>
# 用一个变量给另一个变量赋值
c = fun
print(c()) # ======
list1 = [fun, fun(), 10] # <function fun1 at 0x0000027225B100D8>
# 做为函数的参数
def fun1():
print('======')
def fun2(x):
print(x) # <function fun1 at 0x000001E7785600D8>
print(fun2(fun1))
# 变量做为函数的返回值
def fun4(x):
def fun5():
print('函数5',x)
return fun5
fun4(2)() # 函数5 2
实参高阶函数
参数是函数的函数就是实参高阶函数
python中内置的sorted、max、min、等函数、以及列表的sort方法都是实参高阶函数
这些函数中都有一个参数key,要求船餐的时候传一个函数。这个函数需要一个参数和一个返回值,参数代表序列中的元素返回值是比较对象
num = [10, 17, 23, 45, 65, 23]
# 问题:按各位数之和从大到小排序
def func2(item):
sum = 0
for char in str(item):
sum += int(char)
return sum
num.sort(reverse=True, key=func2)
print(num)
dicts = [
{'name': '小小1', 'score': 98},
{'name': '小小2', 'score': 68},
{'name': '小小3', 'score': 76},
{'name': '小小4', 'score': 34}
]
dicts.sort(key=lambda wz_dict: wz_dict['score'])
print(dicts)
返回值高阶函数
函数的返回值是函数,这样的函数就是返回值高阶函数
# 真正的返回值高阶函数
def func1():
def func2():
print('函数2')
return func2
闭包
什么是闭包
闭包就是一个函数,这个函数需要满足一下两个条件:
1.函数的返回值是声明在这个函数中的函数(内函数)
2.这个内函数必须使用外函数中的临时变量(外函数中的局部变量)闭包的作用:
保存临时变量的值(函数调用结束后,函数值的数据不销毁)
装饰器
装饰器是python的三大神器之一
装饰器 = 实参高阶函数 + 返回值高阶函数 + 糖语法
什么是装饰器:本质还是一个函数
装饰器的作用:在不修改函数的本身的前提下添加功能
语法:
def 函数名1(参数1):
def 函数名2(*args,**kwargs):
函数体(添加功能的代码)
(保证出现:参数1(*args, **kwargs))
returns 函数名2
@函数名1 -- 相当于-- 函数名3 = 函数名1(函数名3)
声明需要添加功能的函数3
函数3()
# 练习:写一个装饰器给函数添加权限
def passwords(fn):
def test(*args, **kwargs):
user_password = '123'
password = input('请输入密码:')
while True:
if user_password == password:
fn(*args, **kwargs)
print('登录成功')
break
else:
password = input('密码正确请重新输入:')
return test
@passwords
def fun3(x, y):
print(x + y)
fun3(10, 20)
回调函数
什么是回调函数:
函数的调用是在其他函数的内部满足条件的时候自动调用的函数