Python学习6---高级函数式编程

1. 函数式编程简介

函数式编程(Functional Programming, FP)是一种编程范式,主要基于数学中的函数概念。与面向对象编程(OOP)不同,FP 更关注函数的应用而不是对象的状态。FP 的主要特点包括:

**纯函数:**函数的输出仅依赖于其输入,没有副作用。
不可变数据 :数据一旦创建就不能被修改。

**高阶函数:**可以接受函数作为参数或返回函数的函数。

2. 函数式编程的核心概念
2.1 纯函数

纯函数的输出只依赖于输入参数,不依赖于外部状态,也不会改变外部状态。这样的函数具有可预测性和可测试性。

示例:

python 复制代码
def pure_add(x, y):
    return x + y

# 调用纯函数
result = pure_add(2, 3)
print(result)  # 输出:5

2.2 不可变数据

不可变数据一旦创建就不能修改。使用不可变数据可以避免因为数据修改导致的错误。

示例:

python 复制代码
from collections import namedtuple

# namedtuple:创建一个和tuple类似的对象,而且对象拥有可访问的属性。
# 定义一个namedtuple类型Point,并包含x和y属性。
Point = namedtuple('Point', ['x', 'y'])
p1 = Point(1, 2)

# 不可变数据不能直接修改
# p1.x = 3  # 这会导致错误

# 修改对象属性,注意要使用"_replace"方法
Point= Point._replace(x=3)

p2 = Point(p1.x, 3)
print(p2)  # 输出:Point(x=1, y=3)

2.3 高阶函数

高阶函数是可以接受其他函数作为参数或返回值的函数。常见的高阶函数包括map、filter和reduce。

示例:

python 复制代码
def apply_twice(func, x):
    return func(func(x))

def increment(x):
    return x + 1

# 调用高阶函数
result = apply_twice(increment, 5)
print(result)  # 输出:7

3. 函数式编程工具
3.1 lambda函数

lambda函数是匿名函数,可以在需要一个简单函数而不想定义完整函数时使用。

示例:

python 复制代码
# 使用lambda函数
add = lambda x, y: x + y
print(add(2, 3))  # 输出:5

3.2 map, filter 和 reduce

这些函数用于函数式数据处理:

map:将一个函数应用到序列的每个元素上,返回一个迭代器。

filter:过滤序列中的元素,返回一个迭代器。

reduce:对序列中的元素进行累积操作,返回一个单一结果。

python 复制代码
from functools import reduce

# map函数
squares = map(lambda x: x * x, [1, 2, 3, 4])
print(list(squares))  # 输出:[1, 4, 9, 16]

# filter函数
evens = filter(lambda x: x % 2 == 0, [1, 2, 3, 4])
print(list(evens))  # 输出:[2, 4]

# reduce函数
product = reduce(lambda x, y: x * y, [1, 2, 3, 4])
print(product)  # 输出:24

3.3 functools模块

functools模块提供了许多有用的工具来辅助函数式编程,比如partial和lru_cache。

示例:

python 复制代码
from functools import partial, lru_cache

# partial函数:把一个函数的某些参数给固定住,返回一个新的函数。
def power(base, exponent):
    return base ** exponent	
    
# 此处,固定的是power函数的exponent参数。
# partial(power, 2):固定的是power函数的第一个参数
square = partial(power, exponent=2)
print(square(5))  # 输出:25

# lru_cache装饰器
@lru_cache(maxsize=None)
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))  # 输出:55

4. 函数式编程的实际应用
4.1 列表处理

函数式编程在列表处理和数据转换方面非常高效。

示例:

python 复制代码
data = [1, 2, 3, 4, 5]

# 使用map和filter处理列表
squared_evens = map(lambda x: x * x, filter(lambda x: x % 2 == 0, data))
print(list(squared_evens))  # 输出:[4, 16]

4.2 数据转换

利用高阶函数和lambda函数,可以轻松地进行数据转换。

示例:

python 复制代码
data = [{'name': 'Alice', 'age': 30}, {'name': 'Bob', 'age': 25}]

# 将数据转换为另一种形式
names = map(lambda x: x['name'], data)
print(list(names))  # 输出:['Alice', 'Bob']

4.3 并行处理

通过使用函数式编程技术,可以简化并行处理任务。

示例:

python 复制代码
import concurrent.futures

def square(x):
    return x * x

with concurrent.futures.ThreadPoolExecutor() as executor:
    results = list(executor.map(square, [1, 2, 3, 4]))
print(results)  # 输出:[1, 4, 9, 16]
相关推荐
zzzzzz31011 小时前
当产品经理说这个很简单:我用Python自动化处理奇葩需求的实战指南
python·pycharm·产品经理
雪隐11 小时前
个人电脑玩AI-06让5060 Ti给你打工——不光能画画,Qwen3-TTS还能学人说话,连我老板都信了!
人工智能·后端·python
兵慌码乱1 天前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构
hboot1 天前
AI工程师第三课 - 机器学习基础
python·scikit-learn·kaggle
顾林海1 天前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
呱呱复呱呱1 天前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
曲幽2 天前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码2 天前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱2 天前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵2 天前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学