一、高阶函数
1、函数就是变量
python中定义函数其实就是定义一个类型是 function 的变量,函数名就是变量名
可以当作变量来赋值,赋的是什么类型的值,它就变成什么类型的变量
也可以作为序列的元素
例:
def func1():
print('函数1')
a = 200
list1 = [a, 10, 20, 30, func1, func1()]
print(list1)
print(list1[-2]())
2、高阶函数
1) 实参高阶函数:参数是函数的函数就是实参高阶函数
实参高阶函数,函数作为实参
def func3(x):
print(x(1, 2))
func3(lambda m, n: m+n)
系统提供的常见的实参高阶函数:
max、min、sorted 都是实参高阶函数,有一个参数key需要传一个函数;被传入的函数需要一个参数和一个返回值,这个参数指向的是序列中的元素,返回值是比较对象
例:
list2 = [19, 90, 78, 67]
def func3(item):
# 个位数最大的元素
# return item%10
# 各位数的和的最大值
sum1 = 0
for x in str(item):
sum1 += int(x)
return sum1
print(max(list2, key=func3)) #78
# 求列表中个位数最大的元素
print(max(list2, key=lambda item: item % 10)) #19
#从小到大以age排序
print(sorted(students, key=lambda item: item['age']))
# [{'name': '张4', 'age': 16, 'score': 70}, {'name': '张3', 'age': 17, 'score': 90}, {'name': '张1', 'age': 18, 'score': 89}, {'name': '张2', 'age': 19, 'score': 85}]
map函数
map(函数,序列) -
将序列的元素按函数指定转换,返回的是map对象(map就是容器型数据中的一种)需要一个参数和一个返回值,参数指的是序列中的元素,返回值就是替换原来的元素的新元素
例:
list1 = [1, 2, 3, 4]
print(list(map(lambda item: item + 1, list1))) # [2, 3, 4, 5]
reduce(函数,序列,参数(默认序列第一个值))
对序列中的元素按照函数提供的功能进行累计的操作(加减乘除等等运算方式自己给定) 函数需要两个参数只有两个元素,需要一个返回值
例:求总成绩
students = [
{'name': '张1', 'age': 18, 'score': 89},
{'name': '张2', 'age': 19, 'score': 85},
{'name': '张3', 'age': 17, 'score': 90},
{'name': '张4', 'age': 16, 'score': 70}
]
print(reduce(lambda a,b:a+b['score'],students,0))
a如果不给默认值会取序列的第一个值,在计算过程中a保存的是上一次循环a+b的值
2) 返回值高阶函数:就是返回值是函数的函数
def func1():
def func2(x,y):
return x+y
return func2
print(func1()(100,200)) # 300
二、装饰器
1、装饰器的作用
在不修改函数的情况下给函数添加新的功能
2、什么是装饰器
装饰器的本质就是一个函数(这个函数是一个实参高阶函数也是返回值高阶函数)
无参装饰器的写法:
def 函数名1(函数名2):
def 函数名3(*args,**kwargs): #打包
新功能代码
result = 函数名2(*args,**kwargs) #拆包
return 函数名3
说明:
函数名1 - 装饰器名字,命名的时候和这个装饰器要添加的功能进行关联
函数名2 - 随便命名,指向被添加功能的函数;可以命名成fn
函数名3 - 随便命名,在原函数上添加完新的功能以后产生的新的函数
新功能代码 - 实现新加的功能的代码
*args和**kwargs同时存在的意义 - 不定参数
例:写一个装饰器将返回值是字符串的函数,返回值中的小写字母变成大写字母
def str_func2(fu):
def str_func3(*args, **kwargs):
# str1 = ''
a = fu(*args, **kwargs)
if type(a)==str:
str1=a.upper()
return str1
else:
return a
# for i in a:
# if 'a' <= i <= 'z':
# str1 += chr(ord(i) - 32)
# else:
# str1 += i
return str_func3
@str_func2 # 在需要装饰的函数前加上 @装饰器名
def str_func1():
return 'abc'
print(str_func1())