如果你的程序需要在运行时才决定执行哪一段逻辑,或者根据条件“组装”出一个新的行为,你觉得该如何实现?高阶函数提供了将逻辑“参数化”的能力,让程序变得更智能。
如何让代码更富弹性?
答案是:让逻辑本身成为参数。高阶函数能将一段行为(函数)像数据一样传递,这标志着思维方式从“如何做”转向“做什么”,是函数式编程高度抽象的体现。
在Python中,abs()函数可以完成对数字求绝对值计算。
① 正数的绝对值是它本身
② 负数的绝对值是它的相反数
abs()返回的结果都是正数
round()函数可以完成对数字的四舍五入计算
round(1.2) # 输出结果:1round(1.9) # 输出结果:2
需求:任意两个数字,按照指定要求(① 绝对值 ② 四舍五入)整理数字后再进行求和计算。
def fn1(num1, num2): returnabs(num1) + abs(num2)print(fn1(-10, 10))
def fn2(num1, num2): returnround(num1) + round(num2)print(fn2(10.2, 6.9))
要求:我们能不能对以上进行简化,然后合并为同一个函数 => 设计思想(高阶函数)
def fn(num1, num2, f): # f代表要传入的参数(参数是一个函数名,如abs或round) returnf(num1) + f(num2)# 绝对值求和print(fn(-10, 10, abs))print(fn(10.2, 6.9, round))
map(func, lst),将传入的函数变量func作用到lst变量的每个元素中,并将结果组成新的列表(Python2)/迭代器(Python3)返回。
lst = [1, 2, 3]
func函数:求某个数的平方,如输入2返回4,输入3返回9
map(func, lst)返回结果[1, 4, 9]
def func(n): return n ** 2# 定义一个列表list1 = [1, 2, 3]# 使用map对lst进行func函数操作list2 = list(map(func, list1))print(list2)
reduce(func, lst),其中func必须有两个参数。每次func计算的结果继续和序列的下一个元素做累加计算。> 注意:reduce()传入的参数func必须接收2个参数。
list1 = [1, 2, 3]
def func(a, b):
return a + b
reduce(func, lst)则把列表中的每个元素放入func中进行加工,然后进行累加操作
import functools# 定义一个函数def func(a, b): return a + b# 定义一个列表list1 = [10, 20, 30, 40, 50]sums = functools.reduce(func, list1)print(sums)
filter(func, lst)函数用于过滤序列, 过滤掉不符合条件的元素, 返回一个 filter 对象。如果要转换为列表, 可以使用 list() 来转换。
# 定义一个函数def func(n): return n % 2 == 0# 定义一个序列list1 = [1,2,3,4,5,6,7,8]# 调用filter函数进行过滤操作result = filter(func, list1)print(list(result))
今日学习完毕,课后作业:
给定一个包含若干整数的列表 numbers = [12, 5, -8, 0, 21, -15, 7, -3],请依次完成以下操作,并打印结果:
(1)转换绝对值:使用 map()函数,将列表中的每个数字转换为其绝对值。
(2)过滤正数:使用 filter()函数,筛选出所有大于0的正数。
(3)计算乘积:使用 reduce()函数,计算过滤后列表中所有数字的乘积。