python函数式编程大全,简洁代码的艺术

news/2025/3/16 19:41:06/文章来源:https://www.cnblogs.com/yoyoliwu/p/18775478

函数式编程(Functional Programming)是一种编程范式,它将计算视为数学函数的求值,并避免使用可变数据结构和状态改变。在 Python 中,虽然它不是一种纯函数式编程语言,但提供了许多支持函数式编程的特性,使得我们可以用函数式编程的思想来编写代码。

以下是 Python 中函数式编程的一些核心概念和常用工具:

1. 不可变数据

函数式编程强调不可变性,即数据一旦创建,就不能被修改。Python 中的不可变数据类型包括:

  • 数字(如 intfloat
  • 字符串(str
  • 元组(tuple

例如:

a = (1, 2, 3)
# a[0] = 10  # 这会报错,因为元组是不可变的

2. 纯函数

纯函数是指没有副作用的函数,即它的输出只依赖于输入参数,不会修改外部状态。例如:

def add(a, b):return a + b

这个函数不会修改任何外部变量,也不会产生任何副作用。

3. 高阶函数

高阶函数是指可以接受函数作为参数,或者返回函数的函数。Python 中的 map()filter()reduce() 是典型的高阶函数。

map()

map() 函数接受一个函数和一个可迭代对象,将函数应用于可迭代对象的每个元素,并返回一个新的可迭代对象。

numbers = [1, 2, 3, 4, 5]
squared = map(lambda x: x ** 2, numbers)
print(list(squared))  # 输出: [1, 4, 9, 16, 25]

filter()

filter() 函数接受一个布尔函数和一个可迭代对象,返回一个新可迭代对象,其中包含满足布尔函数条件的元素。

numbers = [1, 2, 3, 4, 5]
even_numbers = filter(lambda x: x % 2 == 0, numbers)
print(list(even_numbers))  # 输出: [2, 4]

reduce()

reduce() 函数位于 functools 模块中,它接受一个二元函数和一个可迭代对象,将可迭代对象的元素依次应用到函数中,最终返回一个值。

from functools import reducenumbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
print(product)  # 输出: 120

4. 匿名函数(Lambda)

匿名函数是一种没有名字的函数,通常用于简单的函数定义。在 Python 中,匿名函数使用 lambda 关键字定义。例如:

double = lambda x: x * 2
print(double(5))  # 输出: 10

5. 递归

递归是函数式编程中常用的技术,函数调用自身来解决问题。Python 支持递归,但需要注意 Python 的递归深度限制(默认为 1000)。例如:

def factorial(n):if n == 0:return 1else:return n * factorial(n - 1)print(factorial(5))  # 输出: 120

6. 列表推导式和生成器表达式

虽然这些不是函数式编程的专有特性,但它们可以以函数式编程的方式简化代码。例如:

# 列表推导式
squared = [x ** 2 for x in range(10)]
print(squared)  # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]# 生成器表达式
squared_gen = (x ** 2 for x in range(10))
print(list(squared_gen))  # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

7. 函数式编程库

Python 还有一些第三方库支持更复杂的函数式编程,例如 toolzfn.py。这些库提供了更多函数式编程的工具和特性。

8. 函数式编程的优点

  • 可读性和可维护性:函数式编程的代码通常更简洁,逻辑更清晰。
  • 可组合性:高阶函数和纯函数可以方便地组合。
  • 并发性:由于没有副作用,函数式编程的代码更容易并行化。

9. 函数式编程的缺点

  • 学习曲线:对于习惯了命令式编程的人来说,函数式编程可能需要一些时间来适应。
  • 性能问题:某些情况下,函数式编程可能会引入额外的性能开销,例如频繁的函数调用和内存分配。
  • Python 的限制:Python 不是纯函数式编程语言,某些函数式编程特性可能不够自然。

总之,函数式编程是一种强大的编程范式,可以在 Python 中灵活运用。它可以帮助我们编写更优雅、更可维护的代码,但需要根据具体问题选择合适的编程范式。

文章来源于zlibrary图书馆中《Python编程从入门到实践》书的Python函数式编程章节内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/899942.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Visual Studio Code-设置展示多行TAB页

Visual Studio Code-设置展示多行TAB页 一、ctrl + shift + p -> 打开工作区设置(Open Workspace Settings 二、输入 ‘workbench.editor.wrapTabs’

Git-git生成SSH密钥

Git-git生成SSH密钥 一、生成 SSH 密钥 如果你还没有生成 SSH 密钥,可以使用以下命令生成新的 SSH 密钥对: 这里 -t rsa 指定密钥类型为 RSA,-b 4096 指定密钥长度为 4096 位,-C 添加一个注释,通常是你的电子邮件地址。 ssh-keygen -t rsa -b 4096 -C "your_email@ex…

鲜花:《一种基于错误的寻找重心方法的点分治的复杂度分析》注

原文:一种基于错误的寻找重心方法的点分治的复杂度分析 LCA 还是太神了,研究半天才看明白。 所以这里提供一种说人话版本。 为什么法一是错的? 原文提出了这样一个 hack:这是三个等长度的共端点的链,初始以红色箭头所指的点为根。 进行第一次分治:红色箭头所指的点是重心…

SpringBoot的WebServlet的兼容

一.使用SpringBean注册JavaWeb的三大组件 在 Spring Boot 中,使用 @Bean 注册的 Servlet、Filter 和 Listener 组件会被加载到 Servlet 容器 中管理,而不是直接由 Spring 容器管理。然而,Spring Boot 提供了一些机制来确保这些组件能够与 Spring 容器无缝集成。Servlet 容器…

第二章课上练习

TempConvert.py TempStr = input("请输入带有符号的温度值:") if TempStr[-1] in [F,f]: C = (eval(TempStr[0:-1]) - 32)/1.8 print("转换后的温度是{:.2f}C".format(C)) elif TempStr[-1] in [C,c]: F = 1.8*eval(TempStr[0:-1])+32 print("转换后…

叠加等边三角形

import turtle 设置画布和画笔 screen = turtle.Screen() screen.bgcolor("white") # 设置背景颜色 pen = turtle.Turtle() pen.shape("turtle") # 设置画笔形状为小乌龟 pen.color("blue") # 设置画笔颜色 pen.pensize(2) # 设置画笔…

Citia Composer2024软件下载与安装教程

CATIA是法国达索公司的产品开发旗舰解决方案。作为PLM协同解决方案的一个重要组成部分,CATIA软件具有以下主要功能和应用领域:‌设计‌:提供从概念设计到最终产品形成的完整设计能力,支持2D、3D、参数化混合建模及数据管理‌3。 ‌分析‌:进行产品分析和仿真,确保设计的可…

Peach-Printer2.0 Web 打印服务解决方案

Peach-Printer1.0在沉寂许久后迎来了一个使用客户,非常感谢客户的支持和理解。 通过客户的使用反馈本人尝试对1.0版本进行完善修改,但始终打印效果未能实现预期。思索许久后决心更改打印控件的底层框架,重新设计打印组件。通过一段时间的摸索与研究终于在3月11日推出了第一个…

老八股谈事务处理,到底在谈什么?

hello, 我是马甲哥, 这是我的第184篇原创技术文章, 也是周志明的软件架构课的读书笔记。 1. 事务处理的目标:数据状态的一致性 当我们谈事务处理,就是在谈确保数据状态的一致性Consistency。 一致性: 确保数据是正确的,不同数据间不会产生矛盾 (这里的一致性与分布式共…