一、PyFunctional 库概述
PyFunctional 是一款专注于函数式编程的 Python 库,核心用于简化序列、迭代器、字典、集合等数据的链式处理,无需编写复杂循环与嵌套函数。其基于函数式编程思想,将 map、filter、reduce、flatmap 等操作封装为链式调用,底层通过惰性计算优化性能,支持流式数据处理。该库采用 MIT 许可证,优点是语法简洁、可读性强、上手门槛低,适合数据清洗与转换;缺点是处理超大规模数据时性能不及原生 Pandas,更适合轻量数据场景。

二、PyFunctional 安装方法
PyFunctional 可通过 pip 快速安装,兼容 Python 3.6 及以上版本,安装命令如下:
pip install pyfunctional安装完成后,在 Python 脚本或交互式环境中导入核心模块即可使用:
from functional import seqseq 是 PyFunctional 最核心的入口类,所有数据处理操作都基于该对象展开,也是后续所有代码示例的基础。
三、PyFunctional 基础使用与核心操作
3.1 创建序列对象
PyFunctional 支持将列表、元组、集合、生成器、字典等可迭代对象转换为 seq 对象,从而使用链式函数式接口:
# 从列表创建
data_list = seq([1, 2, 3, 4, 5])
# 从元组创建
data_tuple = seq((6, 7, 8, 9, 10))
# 从集合创建
data_set = seq({11, 12, 13, 14, 15})
# 从字符串创建(按字符拆分)
data_str = seq("python")
# 从字典创建(默认处理键值对元组)
data_dict = seq({"name": "pyfunc", "version": "1.0"})转换为 seq 对象后,无需手动编写循环,可直接链式调用处理方法。
3.2 map 映射操作
map 用于对序列中每个元素执行指定函数,返回处理后的新序列,是最常用的数据转换操作:
# 对每个数字平方
numbers = seq([1, 2, 3, 4, 5])
result = numbers.map(lambda x: x ** 2)
# 转换为列表查看结果
print(list(result))代码说明:通过 lambda 表达式定义平方逻辑,map 遍历所有元素并执行计算,最终输出 [1, 4, 9, 16, 25]。
也可使用自定义函数替代 lambda,适合复杂逻辑:
def process_text(s):
return s.strip().upper()
words = seq([" hello ", " python ", " functional "])
processed = words.map(process_text)
print(list(processed))代码说明:定义文本清洗函数,去除空格并转为大写,输出 ['HELLO', 'PYTHON', 'FUNCTIONAL']。
3.3 filter 过滤操作
filter 用于根据条件筛选元素,保留返回 True 的元素,丢弃返回 False 的元素:
# 筛选偶数
numbers = seq([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
even_numbers = numbers.filter(lambda x: x % 2 == 0)
print(list(even_numbers))代码说明:判断元素是否能被 2 整除,筛选出所有偶数,输出 [2, 4, 6, 8, 10]。
# 筛选长度大于3的字符串
words = seq(["cat", "dog", "elephant", "tiger", "lion"])
long_words = words.filter(lambda x: len(x) > 3)
print(list(long_words))代码说明:根据字符串长度筛选,保留长度大于3的单词,输出 ['elephant', 'tiger', 'lion']。
3.4 flatmap 展平映射
flatmap 先执行 map 映射,再自动将嵌套序列展平为一维序列,适合处理嵌套数据:
# 拆分句子为单词
sentences = seq(["hello python", "functional programming", "data process"])
words = sentences.flatmap(lambda x: x.split())
print(list(words))代码说明:先按空格拆分每个句子为单词列表,再自动展平,最终得到一维单词序列 ['hello', 'python', 'functional', 'programming', 'data', 'process']。
3.5 reduce 聚合操作
reduce 用于将序列聚合为单个值,如求和、求积、拼接字符串等:
# 数字求和
numbers = seq([1, 2, 3, 4, 5])
total = numbers.reduce(lambda a, b: a + b)
print(total)代码说明:依次累加所有元素,输出结果 15。
# 字符串拼接
words = seq(["Py", "Functional", "is", "useful"])
sentence = words.reduce(lambda a, b: a + " " + b)
print(sentence)代码说明:将所有字符串用空格拼接,输出 Py Functional is useful。
3.6 链式组合操作
PyFunctional 最大优势是支持无限链式调用,可将 map、filter、flatmap、reduce 等操作组合,一行代码完成复杂数据处理:
# 筛选偶数 → 平方 → 求和
result = seq([1,2,3,4,5,6,7,8,9,10])\
.filter(lambda x: x%2==0)\
.map(lambda x: x**2)\
.reduce(lambda a,b: a+b)
print(result)代码说明:先筛选偶数 [2,4,6,8,10],再平方得到 [4,16,36,64,100],最后求和得到 220。
3.7 去重、排序、切片
PyFunctional 内置常用序列操作,无需依赖原生复杂语法:
# 去重
data = seq([1,2,2,3,3,3,4,5])
unique_data = data.distinct()
print(list(unique_data)) # [1,2,3,4,5]
# 排序
sorted_data = data.sorted(reverse=True)
print(list(sorted_data)) # [5,4,3,3,3,2,2,1]
# 切片(前3个元素)
slice_data = data.take(3)
print(list(slice_data)) # [1,2,2]
# 跳过前2个元素
skip_data = data.drop(2)
print(list(skip_data)) # [2,3,3,3,4,5]3.8 字典与键值对处理
PyFunctional 可便捷处理字典数据,支持按键、值筛选与转换:
# 处理字典数据
users = seq([
{"name": "张三", "age": 20, "score": 85},
{"name": "李四", "age": 22, "score": 92},
{"name": "王五", "age": 19, "score": 78}
])
# 筛选分数大于80的用户,只保留姓名和年龄
high_score_users = users\
.filter(lambda u: u["score"] > 80)\
.map(lambda u: {"name": u["name"], "age": u["age"]})
print(list(high_score_users))代码说明:先筛选分数大于80的用户,再提取指定字段,输出结果:
[{'name': '张三', 'age': 20}, {'name': '李四', 'age': 22}]四、PyFunctional 高级功能
4.1 惰性计算特性
PyFunctional 默认使用惰性计算,即链式操作不会立即执行,只有在转换为列表、元组、求和等最终操作时才会真正计算,大幅节省内存:
# 定义超长序列,惰性计算不会占用大量内存
large_data = seq(range(1000000))\
.map(lambda x: x*2)\
.filter(lambda x: x%5==0)
# 仅取前5个,无需计算全部数据
print(list(large_data.take(5)))代码说明:即使序列包含100万个元素,也不会一次性加载到内存,适合处理流式数据。
4.2 分组操作 groupby
groupby 可按指定条件对序列分组,返回键值对形式的分组结果:
# 按奇偶分组
numbers = seq([1,2,3,4,5,6,7,8,9,10])
grouped = numbers.groupby(lambda x: "even" if x%2==0 else "odd")
for key, values in grouped.items():
print(key, list(values))代码说明:将数字分为奇数、偶数两组,输出:
odd [1,3,5,7,9]
even [2,4,6,8,10]4.3 统计功能
PyFunctional 内置求和、最大值、最小值、平均值、计数等统计方法:
data = seq([10, 20, 30, 40, 50])
print("总和:", data.sum()) # 150
print("最大值:", data.max()) # 50
print("最小值:", data.min()) # 10
print("平均值:", data.avg()) # 30.0
print("元素数量:", data.count()) # 54.4 条件判断 any 与 all
any 判断是否存在满足条件的元素,all 判断是否所有元素都满足条件:
numbers = seq([1,2,3,4,5])
# 是否存在大于3的元素
print(numbers.any(lambda x: x>3)) # True
# 是否所有元素都小于10
print(numbers.all(lambda x: x<10)) # True五、真实业务场景实战案例
5.1 学生成绩数据清洗与统计
模拟学生成绩数据,完成数据清洗、筛选、分组、统计等完整流程:
from functional import seq
# 原始数据(含空值、异常分数)
students = seq([
{"name": "小明", "score": 88, "class": "一班"},
{"name": "小红", "score": 95, "class": "一班"},
{"name": "小刚", "score": 59, "class": "二班"},
{"name": "小丽", "score": 72, "class": "二班"},
{"name": "小亮", "score": None, "class": "一班"}, # 空分
{"name": "小芳", "score": 105, "class": "二班"} # 异常分数
])
# 数据清洗:去除空分、分数0-100之外的异常数据
clean_students = students\
.filter(lambda s: s["score"] is not None)\
.filter(lambda s: 0 <= s["score"] <= 100)
# 按班级分组统计平均分
class_avg = clean_students\
.groupby(lambda s: s["class"])\
.map(lambda g: {
"class": g[0],
"avg_score": round(seq(g[1]).avg(lambda s: s["score"]), 2)
})
print("各班平均分:")
for item in class_avg:
print(item)
# 筛选90分以上优秀学生
excellent = clean_students\
.filter(lambda s: s["score"] >= 90)\
.map(lambda s: f"{s['name']}({s['class']}): {s['score']}分")
print("\n优秀学生:")
print(list(excellent))代码说明:
- 过滤空分数与超出0-100范围的异常数据;
- 按班级分组并计算平均分;
- 筛选90分以上学生并格式化输出。
5.2 日志文本分析
模拟日志数据,提取关键词、统计频次、筛选异常日志:
from functional import seq
# 模拟日志数据
logs = seq([
"2025-01-01 10:00 INFO user login success",
"2025-01-01 10:05 ERROR database connection failed",
"2025-01-01 10:10 INFO user logout",
"2025-01-01 10:15 ERROR request timeout",
"2025-01-01 10:20 INFO user login success"
])
# 提取所有ERROR日志
error_logs = logs.filter(lambda l: "ERROR" in l)
print("错误日志:")
print(list(error_logs))
# 统计日志级别频次
level_count = logs\
.map(lambda l: l.split()[2])\
.count_by_value()
print("\n日志级别统计:", level_count)代码说明:
- 筛选包含 ERROR 的错误日志;
- 提取日志级别并统计出现次数。
六、相关资源
- Pypi地址:https://pypi.org/project/PyFunctional
- Github地址:https://github.com/EntilZha/PyFunctional
- 官方文档地址:https://pyfunctional.readthedocs.io/
关注我,每天分享一个实用的Python自动化工具。

