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

server/2024/9/22 13:56:59/

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 nreturn 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.futuresdef square(x):return x * xwith concurrent.futures.ThreadPoolExecutor() as executor:results = list(executor.map(square, [1, 2, 3, 4]))
print(results)  # 输出:[1, 4, 9, 16]

http://www.ppmy.cn/server/100573.html

相关文章

专栏十七:如何选择你的单细胞亚群的分辨率--chooseR

好久没更,没想到还是有小伙伴订阅,那就更一个最近看到的问题 1.缘起 是因为在文章Single-cell RNA sequencing and spatial transcriptomics reveal cancer-associated fibroblasts in glioblastoma with protumoral effects(https://doi.org/10.1172/JCI147087.)中看到 也…

舵机模块学习

舵机是一种根据输入PWM信号占空比来控制输出角度的装置 执行逻辑&#xff1a;PWM信号输入到控制板&#xff0c;给控制版一个指定的目标角度&#xff0c;然后电位器检测输出轴的当前角度&#xff0c;如果大于目标角度&#xff0c;电机反转&#xff0c;小于正转&#xff0c;最终使…

【区块链+乡村振兴】链上云仓智慧动产监管平台 | FISCO BCOS应用案例

2021 年初 ,《中共中央国务院关于全面推进乡村振兴加快农业农村现代化的意见》将“乡村振兴”的重要性提升 到前所未有的战略高度。而随着科技与金融的深度融合&#xff0c;金融行业亦开始步入大数据、云计算、人工智能、区块 链的新技术发展。启动金融科技赋能乡村振兴示范工程…

Java语言程序设计——篇十三(3)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f333;&#x1f333;&…

Android14 大屏开机后蓝牙可搜索但无法连接分析解决

Android14 大屏开机后蓝牙可搜索但无法连接分析解决 文章目录 Android14 大屏开机后蓝牙可搜索但无法连接分析解决一、前言二、分析解决1、Bluetooth相关日志2、源码分析和解决 三、其他1、Android 蓝牙配对Settings应用里面的简要流程记录2、Android 蓝牙相关广播介绍3、蓝牙设…

架构设计(3)Lambda 架构在生鲜网购平台中的应用

Lambda 架构在生鲜网购平台中的应用&#xff1a;电商行业案例分析 摘要 本文结合在生鲜网购平台项目中的实际经验&#xff0c;探讨 Lambda 架构在大数据处理中的应用&#xff0c;尤其是针对电商行业的数据处理需求。生鲜网购平台面临高并发和海量数据的挑战&#xff0c;需要实…

Mybatis-springBoot

MyBatis 是一个流行的 Java 持久层框架&#xff0c;它简化了与关系型数据库的交互。通过将 SQL 语句与 Java 代码进行映射&#xff0c;MyBatis 提供了一种方便、灵活的方式来执行数据库操作。它支持动态SQL、缓存机制和插件扩展&#xff0c;使得开发人员能够更高效地编写和管理…

后端调优——分布式锁选型——入门

文章目录 引言正文分布式锁的定义分布式锁的具体应用场景如何实现分布式锁主动轮询型分布式锁实现思路一、MySQL分布式锁二、Redis分布式锁 监听回调型分布式锁Etcd分布式锁Zookeeper分布式锁 锁的对比 总结 引言 最近面试&#xff0c;一直被问到分布式锁&#xff0c;然后仅仅…