惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog RSS Feed
Security Archives - TechRepublic
Security Archives - TechRepublic
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
小众软件
小众软件
V
V2EX
B
Blog
腾讯CDC
D
DataBreaches.Net
H
Hackread – Cybersecurity News, Data Breaches, AI and More
月光博客
月光博客
The Cloudflare Blog
T
The Blog of Author Tim Ferriss
云风的 BLOG
云风的 BLOG
Latest news
Latest news
L
LINUX DO - 最新话题
C
Check Point Blog
Attack and Defense Labs
Attack and Defense Labs
H
Hacker News: Front Page
Forbes - Security
Forbes - Security
H
Help Net Security
S
Securelist
D
Docker
Blog — PlanetScale
Blog — PlanetScale
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Last Watchdog
The Last Watchdog
N
News and Events Feed by Topic
G
Google Developers Blog
AI
AI
I
Intezer
L
LangChain Blog
NISL@THU
NISL@THU
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
人人都是产品经理
人人都是产品经理
Hugging Face - Blog
Hugging Face - Blog
罗磊的独立博客
T
Tenable Blog
Jina AI
Jina AI
I
InfoQ
C
Cybersecurity and Infrastructure Security Agency CISA
Cisco Talos Blog
Cisco Talos Blog
C
CERT Recently Published Vulnerability Notes
GbyAI
GbyAI
T
Tailwind CSS Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
O
OpenAI News
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Know Your Adversary
Know Your Adversary
T
Troy Hunt's Blog
Google Online Security Blog
Google Online Security Blog

博客园 - 箫笛

Tkinter - Entry 输入框组件 Tkinter - Button 组件 Tkinter - Label 组件 Tkinter - tk 变量 Tkinter - 事件与绑定 Tkinter - 几何管理器 Tkinter - 核心概念 Tkinter - 快速开始 Tkinter - 介绍 Python 编程 - 条件表达式 Python 编程 - 星号下划线参数释义 shell 编程 - shell 脚本的交互方式 Python insall - macOS 系统安装python的几种方式 Miniconda - Python 环境管理工具 Tkinter - Python GUI 开发 Python 编程 - 下划线命名的区别 Python 编程 - 元类编程 Python 编程 - 多重继承与MRO Python 编程 - 描述符协议 Python 编程 - 类型注解 Python 编程 - 生成器表达式 Python 编程 - 集合 Python 编程 - 装饰器 Python 编程 - 闭包 Python 编程 - 列表推导式 Python 编程 - lambda 函数 Python 编程 - 文件操作 Python 编程 - 输入与输出 Python 编程 - 面向对象编程 Python 编程 - 元组(tuple) Python 编程 - 字符串(str) Python 编程 - 字典(dict) Python 编程 - 列表(list) Python 编程 - 数据类型和数据结构 Python 编程 - 语句 Python 编程 - 函数 windows - WSL 的安装与使用 shell编程 - dialog 程序使用指南 FE Team - 如何做好前端代码审查 git 提交的撤销和恢复 React15 - redux-saga 如何在saga中实现轮询接口调用? React15 - React CSS Modules BEM命名实践 React15 - React 15 中 componentWillReceiveProps 为什么会多次调用, 同时componentDidUpdate 也会多次调用? React15 - React15类组件多次执行render方法的原因? React15 - React15应用中代码逻辑复用方案 React15 - React状态同步问题解决 React15 - React 15 中 React.pureComponent 的使用场景 React15 - React 15应用在页面渲染时会多次执行类组件的render 函数的原因 React15 - React 15 中能用 componetDidUpdate 代替 componentWillReceiveProps 吗? React15 - React 15 生命周期函数详解 React15 - 如何在React 15中实现自定义的事件订阅与发送(例如组件间通信) React15 - React15应用中的事件订阅和发送机制 React15 - CSS中的BEM规范 React15 - React CSS Modules BEM命名实践 React15 - 写sass 样式文件,嵌套的结构好,还是扁平的结构好? React15 - sass 中 @mixin 和 @extend 的区别是什么? React15 - React 15 应用 如何使用Css moudules 方式进行模块化开发 React15 - React15应用Sass使用指南 React15 - React 15 应用如何进行性能优化?
Python 编程 - 函数式编程
箫笛 · 2026-06-21 · via 博客园 - 箫笛

Python 对函数式编程(Functional Programming, FP)提供了良好的支持。它是一种编程范式,核心思想是将计算过程视为一系列数学函数的求值,并避免使用可变状态和副作用

纯函数式语言(如 Haskell)要求极高的纯洁性,而 Python 是一门多范式语言,它的函数式编程风格更灵活务实:鼓励使用纯函数,但不强制。一个函数在内部仍可使用局部变量,只要不修改全局变量或产生其他副作用即可。

🧱 核心概念

  • 纯函数 (Pure Functions):这是函数式编程的基石。纯函数是指对于相同的输入,总是返回相同的输出,并且不产生任何可观察的副作用。例如,不修改全局变量、不进行 I/O 操作等。
  • 不可变性 (Immutability):数据一旦创建就不应被改变。函数式编程倾向于创建新的数据,而非修改原有数据,这能有效避免许多棘手的并发问题和程序错误。
  • 函数是一等公民 (First-Class Functions):这是实现函数式编程的技术前提。在 Python 中,函数可以像任何其他对象(如整数、字符串)一样被使用:
    • 赋值给变量。
    • 作为参数传递给其他函数。
    • 作为其他函数的返回值。
  • 高阶函数 (Higher-Order Functions):满足以下任一条件的函数即为高阶函数:
    1. 接收函数作为参数
    2. 返回一个函数作为结果

🛠️ 核心函数与技巧

Python 提供了一系列内置函数和标准库,用于支持函数式编程风格。

1. 三大基本高阶函数

  • map(function, iterable)

    • 作用:将 function 依次作用于 iterable 的每个元素,并返回一个包含所有结果的迭代器。
    • 示例:将列表中的每个数字乘以 2。
      numbers = [1, 2, 3, 4, 5]
      doubled = map(lambda x: x * 2, numbers)
      print(list(doubled))  # 输出: [2, 4, 6, 8, 10]
      
  • filter(function, iterable)

    • 作用:用 function 测试 iterable 的每个元素,并返回一个只包含测试结果为 True 的元素的迭代器。
    • 示例:过滤出列表中的所有偶数。
      numbers = [1, 2, 3, 4, 5]
      evens = filter(lambda x: x % 2 == 0, numbers)
      print(list(evens))  # 输出: [2, 4]
      
  • reduce(function, iterable)

    • 作用:将 function(接收两个参数)累积地应用到 iterable 的元素上,从而将序列归约为一个单一的值。
    • 注意:在 Python 3 中,reduce() 不再是内置函数,需要从 functools 模块导入。
    • 示例:计算列表中所有元素的乘积。
      from functools import reduce
      numbers = [1, 2, 3, 4, 5]
      product = reduce(lambda x, y: x * y, numbers)
      print(product)  # 输出: 120
      

2. 匿名函数:Lambda

lambda 关键字用于创建匿名的、单行的小型函数。它常与 map()filter() 等高阶函数配合使用,使代码更简洁。

# 一个简单的 lambda 函数,计算平方
square = lambda x: x ** 2
print(square(5))  # 输出: 25

3. 其他重要工具

  • 列表推导式 (List Comprehensions):在 Python 中,列表推导式通常是实现 mapfilter 功能的更 Pythonic、更易读的方式。例如,[x*2 for x in numbers] 等价于 list(map(lambda x: x*2, numbers))
  • sorted():这是一个高阶函数,因为它可以接受一个 key 函数来自定义排序逻辑。
  • 装饰器 (Decorators):本质上是接收一个函数并返回一个新函数的高阶函数,常用于在运行时动态增强函数功能(如 @lru_cache)。
  • 闭包 (Closures):指在一个外部函数中定义的、能够捕获并记住其外部函数作用域中变量的内部函数。这是实现返回函数作为结果的重要方式。
  • 偏函数 (Partial Function):通过 functools.partial 可以固定原函数的某些参数,从而创建一个新的、更简单的函数。

📚 核心库支持

  • itertools:提供了大量用于高效操作迭代器的工具,这些工具大多基于惰性计算,能处理无限数据流且节省内存。主要功能包括:
    • 无限迭代器:如 count(), cycle(), repeat()
    • 组合生成器:如 product(), permutations(), combinations()
    • 迭代器终结器:如 chain(), groupby(), islice()
  • functools:提供了一系列用于高阶函数操作的工具。
    • reduce():如前所述,用于归约操作。
    • partial():用于创建偏函数。
    • @lru_cache:一个装饰器,用于缓存函数的调用结果,优化递归等重复计算。
  • operator:提供了对应 Python 内置运算符的函数,如 operator.add(加法)、operator.mul(乘法)等。使用它们可以避免编写很多简单的 lambda 函数,使代码更简洁。

💎 实践建议

在 Python 中应用函数式编程时,不必追求纯粹,关键是“取其精华”:

  1. 拥抱纯函数:尽可能编写无副作用的纯函数,这会让代码更易于测试、调试和推理。
  2. 善用推导式:对于简单的 mapfilter 操作,优先考虑使用列表、字典或集合推导式,它们通常更清晰。
  3. 利用标准库:熟练使用 itertoolsfunctools,它们是进行函数式编程的利器。
  4. 避免滥用:不要为了使用函数式风格而强行使用。例如,一个简单的 for 循环有时比复杂的 reduce 更容易理解。根据任务选择最自然、最可读的方式。在大型项目中,不同部分可以采用不同范式。

总而言之,Python 的函数式编程是一种强大的编程范式,通过 mapfilterreduce 等核心函数,以及 itertoolsfunctools 等标准库支持,能显著提升代码的简洁性、可读性和健壮性。