后浪小萌新Python ---实参高阶函数

一、实参高阶函数

如果一个函数的参数是函数, 那么这个函数就是实参高阶函数

怎么确定调用函数的时候参数传什么值

def func2(x):
    print(x + 10)

func2(1)
func2(1.34)
func2(True)

def func3(x):
    print(x[1])

func3('abc')
func3([10, 20, 30])
func3((1, 2, 3))

def func4(x: list):
    x.append(100)

func4([1, 2, 3])

def func5(x):
    print(x(100))

def test(a):
    return  a * 10

func5(test)

func5(lambda  item: 'a')

运行结果:

11
11.34
11
b
20
2
1000
a

二、实参高阶函数的应用

除了写装饰器以外, 一般不会自己去定义实参高阶函数, 主要是使用系统已经定义好的实参高阶函数

系统中常用的实参高级函数:max、min、sorted、reduce、map

max、min

max(序列)/min(序列) - 获取指定序列中元素的最大值/最小值

max(序列, key)/min(序列, key) - 参数key的类型是函数

key的要求: a. 是一个函数

                   b. 有且只有一个参数, 并且这个参数指向的是序列中的每一个元素

                   c. 需要一个返回值, 这个返回值就是比较大小的时候的比较对象

举例:

nums = [12, 34, 56, 78, 9]
print(max(nums))

print(max(nums, key=lambda item: item))   
print(max(nums, key=lambda item: item % 10))   

def test(item):
    # item = 12
    sum1 = 0
    for x in str(item):
        sum1 += int(x)
    return  sum1

print(max(nums, key=test))  # 78

运行结果:

78
78
9
78

sorted

sorted(序列) - 讲序列按照序列元素的大小进行排序, 返回排序后的列表

sorted(序列, key) - key: a. 函数

                                      b. 有且只有一个参数(参数就是序列中的元素)

                                      c. 有一个返回值(比较大小的比较对象)

举例:

nums = [73, 69, 57, 28, 71, 54]
print(sorted(nums))

# 按照个位数的大小从小到大排序:
print(sorted(nums, key=lambda item: item % 10))

nums.sort(key=lambda  item: item % 10)
print(nums)

students = [
    {'name': '小明', 'score': 90, 'age': 23},
    {'name': '张三', 'score': 95, 'age': 22},
    {'name': '隔壁老王', 'score': 60, 'age': 35}
]
print(sorted(students, key=lambda item: item['score']))
print(sorted(students, reverse = True, key=lambda item: item['score']))

运行结果:

[28, 54, 57, 69, 71, 73]
[71, 73, 54, 57, 28, 69]
[71, 73, 54, 57, 28, 69]
[{'name': '隔壁老王', 'score': 60, 'age': 35}, {'name': '小明', 'score': 90, 'age': 23}, {'name': '张三', 'score': 95, 'age': 22}]
[{'name': '张三', 'score': 95, 'age': 22}, {'name': '小明', 'score': 90, 'age': 23}, {'name': '隔壁老王', 'score': 60, 'age': 35}]

map

用法一:

map(函数, 序列) - 将序列按照函数给定的规则创建成一个新的序列

函数的要求: a.是一个函数 b.有一个参数(指向序列中的每个元素) c.返回值(产生新元素
的规则)

用法二:

map(函数, 序列1, 序列2) - 将序列按照函数给定的规则创建成一个新的序列

函数的要求: 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.35, 0.67, 0.91, 0.25, 0.45]
new_nums1 = list(map(lambda item: item * 100, nums))
print(new_nums1)

new_nums2 = list(map(lambda item: f'{item:.2%}',nums))
print(new_nums2)


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, 256, 304, 89]
discount = [1, 0.8, 0.75, 0.95]
new_list = list(map(lambda x, y: x*y, prices, discount))
print(new_list)

运行结果:

[3, 5, 7, 1, 5, 5]
[23.0, 35.0, 67.0, 91.0, 25.0, 45.0]
['23.00%', '35.00%', '67.00%', '91.00%', '25.00%', '45.00%']
['abc1', 'how20', 'you4', 'love60']
[67, 204.8, 228.0, 84.55]

reduce

方法一:

reduce(函数, 序列) - 将序列中所有的元素按照函数规定的操作进行合并
函数的要求: a.函数 b.有两个参数(第一个参数第一次指向的是序列的第一个元素, 从第二次开始指向的是上次运算的结果)第二个参数指向的是序列第二个开始的每个元素

方法二:

reduce(函数, 序列, 初始值)- 将序列中所有的元素按照函数规定的操作进行合并
函数的要求: a.函数 b.有两个参数(第一个参数第一次指向的是序列的第一个元素, 从第二次开始指向的是上次运算的结果)第二个参数指向的是序列的每个元素

注:需要导入 from functools import reduce

举例:

from  functools import  reduce

nums = [12, 34, 45, 67, 89, 23]
result = reduce(lambda x, y: x+y, nums)
print(result)

students = [
    {'name': '小明', 'score': 90, 'age': 23},
    {'name': '张三', 'score': 95, 'age': 22},
    {'name': '隔壁老王', 'score': 60, 'age': 35}
]

result = reduce(lambda x, y: x + y['score'], students, 0)
print(result)

运行结果:

270
245

猜你喜欢

转载自blog.csdn.net/qq_26209771/article/details/107769796