一、高阶函数
1.函数就是变量
定义函数的时候,其实就是在等一一个类型的function的变量,函数名就是变量名
普通变量能做的事情,函数都可以做
def a():
print('函数1')
b = [1, 2, 3]
1)查看变量类型
print(type(b))
print(type(a))
2)使用变量中保存的数据
print(b)
print(a)
3)修改变量的值
b = 100
a = 'abc'
print(b)
print(a)
4)变量可以作为列表元素
x = 10
def y():
return 'abc'
list1 = [x,y,y()]
print(list1)
print(list1[0] * 2, list1[0] % 10)
print(list1[2][0], list1[2].replace('a', 'A'))
print(list1[1]()) # 调用函数
面试题 考点:执行函数时赋值
list1 = []
for i in range(5):
list1.append(lambda x:x*i)
print(list1[1](2)) #8
print(list1[2](2)) #8
二、实参高阶函数
普通变量可以作为函数的参数
函数可以作为函数的参数
将函数的返回值作为实参
1.实参高阶函数
如果一个函数的参数是函数,那么这个函数就是实参高阶函数
1)怎么确定调用函数的时候参数传什么值
看这个参数在函数中是怎么使用的
func5就是一个高阶参数
def func5(x):
print(x(100))
def test(a):
# a = 100
return a*10 # return 1000
func5(test)
2.实参高阶函数的应用
除了写装饰器以外,一般不会自己取定义实参高阶函数,主要使用系统已经定义好的实参高阶函数
系统中常用的实参高阶函数:max、min、sorted、reduce、map
1) max、min
max(序列)\min(序列) - 求序列中的元素的最大值\最小值
max(序列,key)\min(序列,key) - 参数key的类型就是一个函数
key的要求:
a.是一个函数
b.有且只有一个参数,并且这个参数指向的是序列中的每一个元素
c.函数需要一个返回值,这个返回值就是比较大小的比较对象
# 求个位数最大的元素
nums = [12, 13, 43, 78, 9]
print(max(nums))
print(max(nums, key=lambda item: item))
print(max(nums, key=lambda item: item % 10))
# 求分数最高的学生,最小的学生
stu = [
{'name': '小明', 'score': 90, 'age': 18},
{'name': '小红', 'score': 95, 'age': 21},
{'name': '小刚', 'score': 89, 'age': 25}
]
print(max(stu, key=lambda item: item['score'])['name'])
print(min(stu, key=lambda item: item['age'])['name'])
2)sorted
sorted(序列) - 将序列按照序列元素大小进行排序,返回一个列表
sorted(序列,key) - 参数key的类型就是一个函数
key的要求:
a.是一个函数
b.有且只有一个参数,并且这个参数指向的是序列中的每一个元素
c.函数需要一个返回值,这个返回值就是比较大小的比较对象
# 按照个位数的大小从小到大排序
nums = [78, 69, 57, 28, 71, 54]
print(sorted(nums))
print(sorted(nums, key=lambda item: item % 10))
# 按学生分数从高到底排序
stu = [
{'name': '小明', 'score': 90, 'age': 18},
{'name': '小红', 'score': 95, 'age': 21},
{'name': '小刚', 'score': 89, 'age': 25}
]
print(sorted(stu, key=lambda item: item['name'], reverse=True))
3)map
用法一:
map(函数,序列) - 将序列按照函数给定的规则创建成一个新的序列
函数的要求:
a.是一个函数
b.有一个参数(指向序列中的每个元素)
c.有一个返回值(产生新元素的规则)
# 打印出个位数
nums = [23, 35, 67, 91, 25, 45]
new_nums = list(map(lambda item: item %10, nums))
print(new_nums)
# 转化成百分数
nums = [0.23, 0.45, 0.89, 0.12, 0.65]
new_nums = list(map(lambda item: f'{item:.2%}', nums))
print(new_nums)
方法二:
map(函数,序列1,序列2) - 将序列按照函数给定的规则创建成一个新的序列
函数的要求:
a.是一个函数
b.有两个参数(第一个参数指向第一个序列中的每个元素,第二个参数指向第二个序列中的每个元素)
c.有返回值(产生新元素的规则)
注意:两个序列中元素的个数要一致
# 合并字符串
strs = ['abc' ,'how' ,'you' ,'love']
nums = [1, 20, 4, 60]
new_list = list(map(lambda x, y: x+ str(y), strs, nums))
print(new_list)
# 计算打折价格
prices = [67, 250, 35, 1564, 25]
discount = [1, 0.8, 0.75, 0.95, 0.5]
new_prices = list(map(lambda x, y: f'{x * y:.2f}元', prices, discount))
print(new_prices)
4)reduce
方法一:
reduce(函数,序列) - 将序列中所有元素按照函数规定的操作进行合并
函数的要求:
a.函数
b.有两个参数(第一个参数第一次指向序列的第一个元素,从第二次开始指向上次运算的结果,第二个元素指向序列第二个开始的每个元素)
# 拼接字符串
nums = [11, 12, 52, 24, 35, 18]
result = reduce(lambda x,y: str(x)+str(y),nums)
print(result)
方法二:
reduce(函数,序列,初始值) - 将序列中所有的元素按照函数规定的操作进行合并
函数的要求:
a.函数
b.有两个参数(第一个参数第一次是初始值,第二次开始时上一次的运算结果)
# 求年龄和
stu = [
{'name': '小明', 'score': 90, 'age': 18},
{'name': '小红', 'score': 95, 'age': 21},
{'name': '小刚', 'score': 89, 'age': 25}
]
result = reduce(lambda x,y:x+y['score'],stu,0)
print(result)
三、列表推导式
1.什么是列表推导式
用来快速创建列表
方法一:
方法一:
列表 = [表达式 for 变量 in 序列]
产生一个新的列表,变量在序列中每取一个元素就将表达式的值添加到新列表中
方法二:
列表 = [表达式 for 变量 in 序列 if 条件语句]
方法三:
列表 = [表达式 for 变量1 in 序列1 for 变量2 in 序列2]
列表 = [表达式 for 变量1 in 序列1 for 变量2 in 序列2 if 条件语句]
# 方法一
list1 = [10 for x in range(5)]
print(list1)
list2 = [x * 2 for x in range(1,5)]
print(list2)
list3 = [f'{x:0>3}'for x in range(10,15)]
print(list3)
# 方法二:
list4 = [x for x in range(10) if x % 2]
print(list4)
list5 = ['str'+str(x) for x in [1,2,3]]
print(list5)
nums = [23,89,67,56,10,33]
new_nums = [x%10 for x in nums ]
print(new_nums)
# 方法三:
list6 = [f'{x}:{y}' for x in range(1,5) for y in range(10,14) if x % 2 if y % 2 ==0]
print(list6)
2.字典推导式
字典 = {key:value for 变量 in 序列}
字典 = {key:value for 变量 in 序列 if 条件语句}
dict1 = {'a':1,'b':2,'c':3}
dict2 = {value:key for key,value in dict1.items()}
print(dict2)