70、Python之函数式编程:一文搞懂函数式编程的核心概念

news2024/11/15 23:40:25

引言

从这篇文章开始,我打算稍微聊一下函数式编程,以及Python中对函数式编程有哪些支持,我们在Python中如何应用函数式编程。虽然不会对函数式编程做一个很详尽的讲述,但也会做一个简短的系列性讲述,以便于Python爱好者能够对Python这门支持多个编程范式的语言,能够使用地更加得心应手。

本文作为函数式编程系列的开篇,希望能对函数式编程做一个系统性介绍,从全局上解决函数式编程是什么,为什么要使用函数式编程的问题。

本文的主要内容有:

1、编程语言与编程范式的关系

2、为啥要用函数式编程

3、函数式编程的核心概念

编程语言与编程范式的关系

从Python系列文章写到目前,我们主要涉及过的编程范式有:过程式编程、面向对象编程,以及今天开始介绍的函数式编程。更多的编程范式的介绍,可以看上一篇文章的内容。

关于编程语言和编程范式的关系,其实,前面也介绍过。编程范式是以几个核心编程理念构建的一套组织程序的行为规范,应用编程范式就是在组织程序的过程中,践行这些核心理念。

所以,编程范式与编程语言的关系有:

1、编程范式是脱离于具体的编程语言而独立存在的,是组织程序所需要遵循的理念、原则的一个集合。

2、编程语言的设计者决定了该语言对编程范式的支持,一门编程语言可以完全支持某一种编程范式,也可以部分支持某一种编程范式。

3、大部分编程语言对过程式编程范式都是完全支持的,因为,真正完成计算过程的处理器硬件本身不是函数式的,严格意义上也不是面向对象的,CPU实际上是过程式的。

说回我们一直在介绍的主角——Python,是一门典型的支持多范式的编程语言。过程式编程范式的支持可以认为是大部分编程语言默认支持的,所以,Python也是完全支持的。一切接对象的设计理念,使得Python对面向对象编程范式也是完全支持的。Python中的一些特性、工具、模块,使得我们可以进行函数式编程,但是,Python并不完全支持函数式编程,所以,跟纯函数式编程语言还是有所区别的,不过并不影响我们进行函数式编程的尝试与实践。

需要特别说明的是,Python作为一门多范式的编程语言,使得我们可以根据具体的业务场景,选择、甚至组合不同编程范式的优势,从而更加高效地进行程序的组织,有效支持业务需求的扩展。

为啥要用函数式编程

没有哪种编程范式一定优于其他编程范式,对函数式编程比较陌生的同学,首先需要解决的不是如何学的问题,而是是“为什么”的问题。过程式编程或者面向对象编程很好,完全够用的话,其实是没有必要学习编程式范式的。

接下来,我来试着论述一下函数式编程的好处。

有位计算机科学领域的大佬说过,“编程是一种让他人了解你想让电脑做什么的艺术”。

编程人员的实际工作中,只有很少的时间是在编写新的代码,与编码相关的工作时间中,绝大部分的时间是在阅读自己的或者别人的代码,或者是对现有的代码进行更新、维护。

3d1600a789b07d6901b9d5ed0e737582.jpeg

所以,程序的可读性很关键。使用函数式编程范式进行程序的组织时,程序会更加简洁、可读。

此外,程序的可读性还在于相关业务逻辑的梳理的便捷性。同样的一套业务逻辑,使用函数式编程时,所带来的最大的好处是“确定性”。这些确定性来自于函数式编程中“不可变性”和“纯函数”的特性,因为在函数式的代码中,任何一个变量的状态都是确定的,任何函数的功能、影响也都是确定的。

函数式编程通过在函数中定义表达式和对表达式求值完成计算。它尽量避免由于状态变化和使用可变对象引入复杂性,让程序变得简洁明了。

由于确定性,函数式编程范式所组织的代码是易于阅读、易于调试和维护的。

如果你有读自己历史的代码或者读别人的代码,很恶心也要坚持读下去的经历,那么,在某些场景下,函数式编程一定是一个更好的选择。

函数式编程的核心概念

相较于过程式编程、面向对象编程,函数式编程虽然是较晚才被提及的,但是,其实是这三个范式里面,最先发明的。

函数式编程的概念是基于与阿兰·图灵同时代的数学家Alonzo Church在1936年发明的lambda演算的直接衍生物。

1、不可变性(Immutability)

lambda演算的一个核心思想就是不可变性——某个符号所对应的值是永远不变的,所以,从理论上来说,函数式编程语言中应该是没有赋值语句的。大部分函数式编程语言只允许在非常严格的限制条件下,才可以更改某个变量的值。

所以,函数式编程的一个最核心的概念就是——不可变性,概括来说,就是函数式编程对程序中的赋值进行了限制和规范。

2、纯函数(Pure Function)

纯函数,是函数式编程的第二个核心概念。纯函数具有如下特征:

a、该函数是幂等的:给定相同的输入参数,函数总是返回精确的相同的结果。

b、该函数没有副作用:函数不以任何方式依赖或者修改外部世界的状态。副作用的例子我们在过程式编程或者面向对象编程中经常见到,比如:改变全局变量、写入到硬盘、读取用户控制台的输入等。

3、函数作为一等公民(First-Class and Higher-Order Functions)

在函数式编程中,函数被视为一等公民,可以像变量一样被传递和使用。而且,当一个函数能够接收函数作为参数,或者返回一个函数,则该函数自然而然就成了一个高阶函数。这些内容,其实我们前面已经反复提及。

4、函数组合(Function Composition)

函数组合是指将多个函数组合起来形成一个新的函数,使得输出一个函数的结果作为输入传递给另一个函数。函数组合有助于更加清晰地快速构建复杂的操作流程。

5、惰性求值(Lazy Evaluation)

惰性求值是指需要结果时才计算表达式的值,而不是在表达式定义时就进行计算。在Python中,可以通过生成器和迭代器实现惰性求值。这些内容,我们在后面会逐步介绍。

简单小结一下,函数式编程的核心概念主要有:

1、不可变性,简单来说就是不能重复赋值。

2、纯函数,就是具备幂等性、无副作用的函数。

3、函数作为一等公民,可以像变量一样被使用。

4、函数组合,通过将单一职责的纯函数进行组合,从而实现更加复杂、强大的功能。

5、惰性求值,在需要的时候才真正计算,从而提高性能。

概括来说,函数式编程可以这样理解:以函数为基本单元,没有变量(更准确地说是不能重复赋值)也没有副作用的编程方式。但是从更深的层次上看,它彻底隔离了可变性,变量或者状态默认就是不可变的,如果要变化,则必须经过合理设计的专门机制来实现。所以,它也避免了死锁、状态冲突等众多麻烦。

总结

本文首先简单介绍了编程范式的概念,然后梳理了编程语言与编程范式的关系。在此基础上,引入了函数式编程这一范式,着重介绍了为什么要学习函数式编程。最后,系统梳理了函数式编程的核心概念,从而对后续学习函数式编程有一个纲领性的了解。

感谢您的拨冗阅读,希望对您学习Python有所帮助。

d2ff349a6ffbc8c2f6501a56d23b8d9c.jpeg

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

响应式网站真的就只是多了一个媒体查询吗?

响应式网站不仅仅是多了一个媒体查询,而是通过一系列技术和设计理念的结合来实现自适应布局和内容展示。以下将详细分析响应式网站的多个方面: 技术基础 CSS3 Media Query:响应式设计的核心在于使用CSS3的媒体查询(Media Query&a…

应用程序已被 Java 安全阻止:Java 安全中的添加的例外站点如何对所有用户生效

如题:应用程序已被 Java 安全阻止,如下图所示: 在寻找全局配置的时候花了一个上午的时间,到处搜解决方法,都不可行。最后还是参考官方的文档配置好了。如果你碰到了同样的问题,这篇文章一定可以帮到你。 环…

QT支持C/C++工业边缘计算网关带RS485、HDMI视频输出

ARM工业控制器是一种在工业领域广泛应用的设备,以下详细分析ARMxy ARM 工业控制器带 HDMI 支持 QT 应用于工业车间数据采集: 一、ARM 工业控制器概述 ARM 架构的优势: 低功耗:在工业环境中,长时间运行的设备需要较低…

uniapp性能优化专题

运行原理 逻辑层和视图层分离,且非 H5 端通信有折损 逻辑层详解 视图层详解 逻辑层和视图层分离的利与弊 app-vue 和小程序的数据更新,分页面级和组件级 优化建议 避免使用大图 优化数据更新 长列表 展示全部 #性能优化专题 #运行原理 #逻辑…

LDR6020,单C口OTG,充放一体新潮流!

PD(Power Delivery)芯片实现单Type-C接口输入和输出OTG(On-The-Go)功能,主要是通过支持USB Power Delivery规范和OTG功能的特定硬件和软件设计来实现的。以下是对这一过程的具体解释: 一、PD芯片基础功能 …

海外最新外太空投资理财系统源码

海外最新外太空投资理财系统源码 源码下载:https://download.csdn.net/download/m0_66047725/89744826 更多资源下载:关注我。

ARTS Week 38

Algorithm 本周的算法题为 2432. 处理用时最长的那个任务的员工 共有 n 位员工,每位员工都有一个从 0 到 n - 1 的唯一 id 。 给你一个二维整数数组 logs ,其中 logs[i] [idi, leaveTimei] : idi 是处理第 i 个任务的员工的 id ,…

openmpi 的应用编译使用方式的探讨

0&#xff0c;源码 hello_openmpi.c #include <stdio.h> #include <mpi.h>int main(int argc, char **argv) {printf("1 Hello, world! \n");MPI_Init(&argc, &argv);int rank;MPI_Comm_rank(MPI_COMM_WORLD, &rank);printf("2 Hello…

Java语法1

注释 单行注释// 多行/* */ 字面量 同C \n \t不需要加单引号 数据的存储 十进制转二进制 除2取余法 数据在计算机中的最小存储单位字节1B8b KB MB GB TB 相邻的转换 2的10次方等于1024 字符存进去则存ASSIC编码对应的数,比如49对应’1’,65对应’A’,97对应’a’ 图片,声音…

基于YOLO V8的学生上课行为检测系统【python源码+Pyqt5界面+数据集+训练代码】有报告

目的是利用YOLOV8这一先进的深度学习技术&#xff0c;开发一个自动化的学生上课行为检测系统。通过对上课行为数据集进行深入分析和标注&#xff0c;我们训练了YOLOV8模型&#xff0c;使其能够精确识别学生在课堂上的各种行为状态。这一系统能够实时监控并分析学生的行为&#…

从词到句,可以让你快速无忧看日文的翻译软件

不知道你喜欢看日漫吗&#xff0c;可能是身边的氛围吧&#xff0c;打小身边就很多这类的书籍。但是因为语言的问题基本都是把它当小人书了。但是现在看书就方便多了&#xff0c;有不少支持日语翻译的工具可以帮我们解决这个语言问题。 1.福昕在线翻译 链接直达>>https:…

『功能项目』事件中心【43】

我们打开上一篇42怪物的有限状态机的项目&#xff0c; 本章要做的事情是利用事件中心&#xff08;和观察者模式相仿&#xff09;将Update()函数中写的GameObject.Find()这些语句替换掉&#xff0c;因为在Update()函数中每帧的执行频率非常快&#xff0c;如果在Update()函数中写…

Centos入门必备基础知识

CentOS&#xff08;Community ENTerprise Operating System&#xff09;是一个开源的Linux发行版&#xff0c;基于Red Hat Enterprise Linux&#xff08;RHEL&#xff09;源代码构建。以下是CentOS入门必备的一些基础知识&#xff1a; 前言 本文由浪浪云赞助发布&#xff0c;…

设计模式 桥接模式(Bridge Pattern)

文章目录 桥接模式简绍桥接模式的核心概念包括以下几个部分&#xff1a;桥接模式的工作流程桥接模式优缺点桥接模式优点桥接模式缺点 UML图代码示例适用场景 桥接模式简绍 桥接模式&#xff08;Bridge Pattern&#xff09;是对象结构型设计模式中的一种&#xff0c;它将抽象与…

艾丽卡的区块链英语小课堂

系列文章目录 IT每日英语&#xff08;三&#xff09; 文章目录 系列文章目录前言1.principle2.efficient3.implement4.accumulated5,occupation6.phases7.validator8.nominated9.commissions10.significantly 前言 欢迎来到艾丽卡的区块链英语小课堂&#xff0c;在这里&…

650人微软员工被裁,动视暴雪制作团队调整,游戏行业风云再起

易采游戏网9月14日消息&#xff1a;微软宣布将裁员650人&#xff0c;这一消息在游戏行业引起了广泛的关注和讨论。此次裁员主要集中在微软的子公司动视暴雪&#xff0c;涉及到《魔兽大作战》和《使命召唤&#xff1a;战争地带》这两个备受瞩目的游戏团队。尽管裁员让很多玩家感…

基于python+django+vue的二手电子设备交易平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的二…

wget不管用的情况下,如何在centos中手动安装yum

wget不管用的情况下&#xff0c;如何在centos中手动安装yum 1、卸载python和yum2、手动下载需要的包3、更换yum源4、清理yum缓存&#xff0c;并生成新的缓存5、更新yum6、最后试试安装wget 问题背景&#xff0c;我在使用yum遇到了问题&#xff0c;想着重新安装一下&#xff0c;…

生成式人工智能(AIGC)对职业院校“云课堂”的赋能路径与价值边界

一、前言 随着教育技术的快速发展&#xff0c;生成式人工智能&#xff08;Artificial Intelligence General Content, AIGC&#xff09;正在成为推动教育改革的重要力量。生成式人工智能&#xff08;AIGC&#xff09;技术的应用&#xff0c;为职业院校的“云课堂”提供了新的教…

Oracle数据库软件的下载与安装步骤(适用于初学者)

目录 背景: 安装过程&#xff1a; 验证是否安装成功&#xff1a; 背景: Oracle&#xff0c;全程Oracle Corporation(甲骨文公司)&#xff0c;是全球领先的企业级软件公司&#xff0c;其最著名的产品是Oracle数据库&#xff0c;Oracle数据库是一款关系型数据库系统(RDBMS)&am…