Python中的高阶函数(funciton)的使用:传递函数、返回函数等高级技巧
高阶函数(funciton)是Python中非常常用的一种函数,它可以接受另一个函数作为参数,或者将函数作为返回值返回。高阶函数可以让我们的代码更加灵活和简洁。
一、 传递函数
1.1 在Python中,我们经常需要对一个序列进行操作,而这些操作有时候是非常相似的,例如计算一个序列中所有元素的和,或者对所有元素进行统一的操作。此时,可以使用高阶函数将操作函数作为参数传递给其他函数。
示例1:使用reduce函数计算列表中所有元素的和
from functools import reduce
lst = [1, 2, 3, 4, 5]
# 定义一个函数,用于计算两个数的和
def add(x, y):
return x + y
# 使用reduce函数,将列表中所有元素求和
sum = reduce(add, lst)
print(sum)
输出结果为:15
在上述示例中,我们定义了一个函数add,用于计算两个数的和。然后,我们使用reduce函数将add函数作为参数传递给它,从而计算列表中所有元素的和。
1.2 高阶函数可以让我们更加灵活地对序列进行操作,例如,我们可以通过传递不同的函数,对序列进行不同的操作。
示例2:
# 定义一个函数,用于将字符串转换为整型
def str2int(s):
def fn(x, y):
return x * 10 + y
def char2num(s):
return { '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9 }[s]
return reduce(fn, map(char2num, s))
# 将字符串 '1234' 转换为整型 1234
num = str2int('1234')
print(num)
输出结果为:1234
在上述示例中,我们定义了一个函数str2int,它将字符串转换为整型。这个函数将一个字符转换为一个数字,然后使用reduce函数将所有数字合并为一个整型。通过这种方式,我们可以使用同样的函数,对不同的序列进行不同的操作。
二、 返回函数
2.1 高阶函数不仅可以接受函数作为参数,还可以将函数作为返回值返回。这种技巧称为“闭包(closure)”。
示例3:
def count():
fs = []
for i in range(1, 4):
def f(i):
def g():
return i * i
return g
fs.append(f(i))
return fs
f1, f2, f3 = count()
print(f1())
print(f2())
print(f3())
输出结果为:
1
4
9
在示例3中,我们定义了一个函数count,它返回一个列表,列表中包含了三个函数。每个函数都有一个嵌套的函数g,在g中使用了一个外部变量i。我们通过对count函数的调用,获得了这三个函数,并分别对它们进行了调用。在这个过程中,三个函数分别返回了1、4、9,它们都使用了它们自己的版本的i变量。
三、 回调函数
3.1 在Python中,我们还可以使用回调函数(callback)。回调函数是一种特殊的函数,它是将一个函数作为参数传递给另一个函数,并在特定情况下被调用。回调函数可以让我们更加方便地控制程序的行为。
示例4:
# 定义一个函数,用于过滤出所有偶数
def is_even(x):
return x % 2 == 0
# 定义一个函数,用于过滤出所有奇数
def is_odd(x):
return x % 2 == 1
# 定义一个函数,用于过滤列表中的元素
def filter_list(lst, f):
return list(filter(f, lst))
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 输出所有偶数
print(filter_list(lst, is_even))
# 输出所有奇数
print(filter_list(lst, is_odd))
输出结果为:
[2, 4, 6, 8]
[1, 3, 5, 7, 9]
在示例4中,我们定义了一个函数filter_list,它接受一个列表和一个函数作为参数,用于过滤列表中的元素。我们定义了两个过滤函数,分别用于过滤出偶数和奇数。通过将这两个函数作为参数传递给filter_list函数,我们可以方便地控制程序的行为。
总结:
高阶函数是Python中非常常用的一种函数,它可以接受另一个函数作为参数,或者将函数作为返回值返回。高阶函数可以让我们的代码更加灵活和简洁。传递函数、返回函数和回调函数是高阶函数最常用的技巧。通过使用高阶函数,我们可以方便地对序列进行操作,并方便地控制程序的行为。
