1. 高阶函数
在Python中,函数是一等公民,因此我们可以把函数当作变量来传递和操作。高阶函数是以函数作为参数和返回值的函数,因此它可以用来封装通用的操作。
1.1 map函数
map函数会对传入的可迭代对象中的每个元素应用一个函数,然后返回一个新的可迭代对象。
#例子:将列表中每个元素平方
mylist = [1,2,3,4,5]
squared_list = list(map(lambda x: x*x, mylist))
print(squared_list) #[1, 4, 9, 16, 25]
在上述代码中,我们使用了lambda表达式来定义一个平方函数,然后将这个函数作为参数传递给了map函数。
1.2 filter函数
filter函数会对传入的可迭代对象中的每个元素应用一个函数,如果函数返回True,那么这个元素就会被保留下来,否则就会被过滤掉。
#例子:过滤掉列表中的偶数
mylist = [1,2,3,4,5]
odd_list = list(filter(lambda x: x%2==1, mylist))
print(odd_list) #[1, 3, 5]
在上述代码中,我们使用了lambda表达式来定义一个判断奇偶性的函数,然后将这个函数作为参数传递给了filter函数。
1.3 reduce函数
reduce函数会对传入的可迭代对象中的元素依次应用一个函数,然后将结果依次合并,最终返回一个单一的结果。
#例子:计算列表中所有元素的和
from functools import reduce
mylist = [1,2,3,4,5]
sum = reduce(lambda x,y: x+y, mylist)
print(sum) #15
在上述代码中,我们使用了reduce函数和一个求和函数,将mylist中的所有元素相加得到15。
1.4 partial函数
partial函数会将一个函数的部分参数固定下来,返回一个新的函数。
#例子:创建一个新的函数,将字符串转换为指定进制的整数
from functools import partial
int_base_2 = partial(int, base=2)
int_base_16 = partial(int, base=16)
print(int_base_2('1010')) #10
print(int_base_16('ff')) #255
在上述代码中,我们使用了partial函数和int函数,将int函数的base参数固定为2和16,分别得到了将字符串转换为二进制整数和十六进制整数的新函数。
2. 函数柯里化
函数柯里化是一种基于高阶函数的技术,它将一个接受多个参数的函数转换为一系列接受单一参数的函数。
2.1 简单的柯里化
假设我们有一个接受两个参数的函数,计算两个数的乘积。
def multiply(x, y):
return x*y
我们可以使用函数柯里化将这个函数转换为一系列接受单一参数的函数。
def curry_multiply(x):
def multiply_y(y):
return x*y
return multiply_y
#使用curry_multiply函数创建一个新的函数
double = curry_multiply(2)
print(double(3)) #6
#也可以直接链式调用
triple = curry_multiply(3)(4)
print(triple) #12
在上述代码中,我们定义了一个curry_multiply函数,它接受一个参数x,并返回一个新的函数multiply_y,这个新函数接受一个参数y,返回x和y的乘积。我们使用curry_multiply函数创建了一个新的函数double,它将x固定为2,最终返回一个计算输入数值两倍的函数。我们还可以直接链式调用curry_multiply,得到一个计算输入数值三倍的新函数triple。
2.2 带默认参数的柯里化
当原函数带有默认参数时,函数柯里化也需要考虑这些默认参数。
def add(x, y, z=0):
return x+y+z
#定义柯里化函数
def curry_add(x):
def add_y(y, z=0):
return x+y+z
return add_y
#使用柯里化函数创建新函数
add_5_6 = curry_add(5)(6)
print(add_5_6) #11
#使用原函数的默认参数
add_5_6_7 = curry_add(5)(6, 7)
print(add_5_6_7) #18
在上述代码中,我们定义了一个带有默认参数z的添加函数add,然后使用curry_add定义了一个柯里化函数。这个柯里化函数接受一个参数x,并返回一个新的函数add_y。这个新函数接受两个参数,其中z的默认值为0。我们使用curry_add函数创建了一个新的函数add_5_6,它将x固定为5,并返回一个接受一个参数y,和一个默认参数z的新函数。最终我们使用这个新函数将y设为6,得到add_5_6的值为11。
我们还可以使用原函数的默认参数,以得到一个接受两个参数的新函数。例如,我们使用带有默认参数的原函数add,将第三个参数设为7,得到add_5_6_7的值为18。
3. 总结
本文讲述了Python中的高阶函数和函数柯里化。我们介绍了map、filter和reduce等常用的高阶函数,以及partial函数的使用。我们还介绍了简单的和带有默认参数的函数柯里化,并且提供了实例来说明这些概念。这些技术可以帮助我们编写高效和简洁的代码,提高Python编程的效率。