快速掌握Python函数式编程
Python是一种多范式编程语言,支持面向对象编程、函数式编程等多种编程范式。其中函数式编程是近年来在Python中越来越受到关注和认可的编程方式,它的特点是将函数作为 等公民,注重函数之间的组合和变换,通过不可变性等特征实现高效、可靠和简洁的程序设计。本文将介绍Python函数式编程的一些基础概念和技巧,希望可以帮助读者快速掌握该编程范式。
一、函数作为参数和返回值
在Python中,函数是一种可以像其他数据类型一样作为参数传递和返回值返回的对象。这个特性被称为高阶函数。例如,我们定义了两个函数:
def add(x, y):
return x + y
def mul(x, y):
return x * y
现在我们可以定义另外一个函数,称之为高阶函数,它将一个函数f作为参数,并返回一个新函数g,这个新函数g将把f作用于其它两个函数的结果。代码如下:
def compose(f, g):
def h(x, y):
return f(g(x, y), g(y, x))
return h
使用该函数,我们可以实现不同的函数组合:
addmul = compose(add, mul) muladd = compose(mul, add) print(addmul(2, 3)) # 11 print(muladd(2, 3)) # 12
这里我们将add和mul两个函数作为参数传入compose函数,然后得到了两个新的函数addmul和muladd,这两个新函数将调用compose函数内部返回的h函数,h函数将先对g(x,y)和g(y,x)进行计算,然后将结果分别传入f函数中进行计算,最终返回计算结果。
二、匿名函数lambda
除了使用函数定义来表达逻辑,Python 还提供 lambda 表达式这种简单的函数定义方式。lambda 表达式定义方式类似于传统函数定义,但它只需要一个表达式就能定义出一个新函数,并且返回值就是该表达式的结果。而且,使用 lambda 表达式可以让我们更加简洁的写出一些高阶函数。
例如:
add = lambda x, y: x + y print(add(2, 3)) # 5 addmul = lambda f, g: lambda x, y: f(g(x, y), g(y, x)) AM = addmul(add, mul) print(AM(2, 3)) # 11
这里我们定义了一个匿名函数lambda x,y:x+y,该函数实现的功能和之前定义的add函数一样,只需要输入两个参数并返回它们的和。我们还将其作为参数传给addmul函数,从而使用较为简洁方式实现了之前的例子。
三、map, filter和reduce函数
map, filter和reduce是Python内置的三个高阶函数,它们广泛应用于函数式编程中。
map函数接收一个函数和一个序列(可以是list、tuple、set或者其他可迭代对象),它将函数依次作用于序列的每个元素,并将每个元素的计算结果存储到一个新的迭代器中返回。例如:
lst = [1, 2, 3, 4, 5] square = map(lambda x:x**2, lst) print(list(square)) # [1, 4, 9, 16, 25]
这里我们将lst序列中的每个元素作为输入,将其平方并存储到迭代器中返回。最后,我们通过list函数将迭代器转换为列表再输出。
filter函数接收一个函数和一个序列,它将函数依次作用于序列的每个元素,并将符合条件的元素过滤出来,返回一个新的迭代器。例如:
lst = [1, 2, 3, 4, 5] even = filter(lambda x:x%2==0, lst) print(list(even)) # [2, 4]
这里我们将lst序列中的每个元素作为输入,使用%判断是否为偶数,将其过滤出来并存储到迭代器中返回。最后,我们通过list函数将迭代器转换为列表再输出。
reduce函数库也叫累积器,它接收一个函数和一个序列,该函数必须接收两个参数,并将这两个参数的值进行计算,返回一个新的值。reduce函数首先对序列的前两个元素进行计算,然后将计算结果作为参数传给第三个元素,再进行计算,依此类推,直到序列中的所有元素都被计算完成,返回最终结果。例如:
from functools import reduce lst = [1, 2, 3, 4, 5] product = reduce(lambda x,y:x*y, lst) print(product) # 120
这里我们将lst序列中的每个元素进行累乘,返回结果是1*2*3*4*5=120。
四、装饰器
装饰器是一种高级函数,它可以用来修改之前定义的函数并返回一个新的函数。装饰器可以简化代码,提高代码复用性和可读性。装饰器函数需要使用@decorator的格式来将其应用到另一个函数上。以下是一个简单的装饰器示例:
def mydecorator(func):
def wrapper(*args, **kw):
print('Before decorated function.')
result = func(*args, **kw)
print('After decorated function.')
return result
return wrapper
@mydecorator
def add(x, y):
return x + y
print(add(2, 3)) # 5
在这里,我们首先定义了一个装饰器函数mydecorator,该函数接收一个函数func并返回一个新函数wrapper。wrapper函数将在原函数func之前和之后打印一些信息并调用原函数,最后返回原函数的结果。在add函数前面加上@mydecorator,我们成功将装饰器应用到add函数上,使得在调用add函数时会先调用mydecorator装饰器函数中的代码,然后再执行add函数本身。
总结:
本文介绍了Python函数式编程的一些基础概念和技巧,包括高阶函数、lambda表达式、map、filter和reduce函数、装饰器等。这些特性和技巧都可以帮助我们写出更加简洁、高效、可靠的程序,提高代码复用性和可读性。希望读者可以通过本文的介绍,掌握Python函数式编程的基础知识和应用技巧,进一步提高自己的编程能力和水平。
