Python函数式编程入门及实验
函数式编程是一种基于Lambda演算的计算模型的编程范式。在Python中,函数一等公民的特性让它可以很好地支持函数式编程。本文将介绍函数式编程的基本概念和Python中的函数式编程实现。
1. 函数式编程的特点
1.1. 纯函数
函数式编程的核心思想是纯函数。纯函数指的是 的函数,它的输出只与输入有关,不会对外部状态产生影响。纯函数具有以下特点:
- 不会修改传入的参数,而是返回新的值。
- 不依赖外部状态,即不会访问全局变量、类属性、单例等等。
- 不会引发异常,程序的行为完全可预测。
1.2. 高阶函数
高阶函数是指接受函数作为参数或返回函数的函数。在函数式编程中,高阶函数是非常常见的。
1.3. 不可变性
不可变性指的是一旦创建了一个对象,就不能对其进行修改。在函数式编程中,不可变性是非常重要的概念,因为它可以保证数据的安全性。
1.4. 延迟求值
延迟求值指的是只有在需要时才会进行计算。这种计算方式可以提高程序的性能。
2. Python中的函数式编程
2.1. Lambda表达式
在Python中,Lambda表达式可以用来创建匿名函数。Lambda表达式的写法为:
lambda 参数列表 : 表达式
例如,定义一个求平方的Lambda表达式可以这样写:
f = lambda x: x ** 2
这个Lambda表达式可以传入一个参数x,返回x的平方。Lambda表达式可以用于高阶函数中,例如:
def apply_func(func, x):
return func(x)
apply_func(lambda x: x ** 2, 10) # 输出:100
2.2. map函数
map函数可以将一个函数应用于一个可迭代对象中的每个元素,返回一个新的可迭代对象。map函数的写法为:
map(函数, 可迭代对象)
例如,定义一个将字符串转换为整数的函数可以这样写:
def str_to_int(s):
return int(s)
使用map函数将一个字符串列表转换为整数列表可以这样写:
s_list = ['1', '2', '3']
i_list = list(map(str_to_int, s_list)) # [1, 2, 3]
2.3. filter函数
filter函数可以根据一个函数的返回值筛选出一个可迭代对象中符合条件的元素,返回一个新的可迭代对象。filter函数的写法为:
filter(函数, 可迭代对象)
例如,定义一个判断整数是否为质数的函数可以这样写:
def is_prime(n):
if n <= 1:
return False
for i in range(2, n):
if n % i == 0:
return False
return True
使用filter函数将一个整数列表中的质数筛选出来可以这样写:
i_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
prime_list = list(filter(is_prime, i_list)) # [2, 3, 5, 7]
2.4. reduce函数
reduce函数可以将一个函数应用于一个可迭代对象中的所有元素,返回一个单一的值。reduce函数的写法为:
reduce(函数, 可迭代对象)
例如,定义一个求和函数可以这样写:
def my_sum(x, y):
return x + y
使用reduce函数求一个整数列表的和可以这样写:
i_list = [1, 2, 3, 4, 5]
total = reduce(my_sum, i_list) # 15
2.5. functools模块
Python的functools模块中提供了一些更高级的函数式编程工具,例如:
- partial函数可以用来部分应用函数参数,返回一个新的函数。
- wraps函数可以用来装饰一个函数,它可以将函数的元数据赋值给装饰后的函数,使得装饰后的函数与原函数的行为一致。
- lru_cache函数可以用来缓存函数的返回值,当调用相同参数的函数时,直接返回缓存的结果。
3. 实验
以下是一些函数式编程的实验。请尝试使用Python实现它们。
3.1. 斐波那契数列
斐波那契数列是指从0和1开始,后面每个数都是前面两个数的和。斐波那契数列的前几项为:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …
请尝试使用递归函数和迭代函数实现斐波那契数列。
3.2. 质数
请尝试使用filter函数和递归函数分别实现筛选出一个整数列表中的质数。
3.3. 求和
请尝试使用reduce函数和递归函数分别实现求一个整数列表的和。
3.4. 偏函数
请尝试使用functools模块中的partial函数构造一个将字符串转换为二进制数的偏函数,输出二进制数的长度。
3.5. 装饰器
请尝试使用functools模块中的wraps函数构造一个装饰器,用于记录函数的调用次数和调用时间。
