15分钟学 Python 第33天 :函数式编程简介

Day 33: 函数式编程简介

1. 引言

函数式编程是一种程序设计范式,它将计算视为数学函数的求值,避免了程序中的可变状态和副作用。Python虽然是一种多范式语言(支持命令式、面向对象和函数式编程),但其函数式编程的特性常常被初学者忽视。了解函数式编程可以帮助我们写出更简洁、高效和易维护的代码。

2. 函数式编程的基本概念

2.1 函数是头等公民

在函数式编程中,函数被视为头等公民,这意味着函数可以作为参数传递给其他函数,也可以作为返回值。这样的特性使得函数的组合和重用变得更加灵活。

2.2 不可变性

不可变性意味着一旦数据结构被创建,它就不能被修改。这种特性减少了副作用,使得代码更易理解和调试。Python中的元组就是一个不可变的数据结构。

2.3 纯函数

纯函数是指同样的输入总是会产生相同的输出,并且不产生副作用(如修改全局变量)。这使得函数的测试和理解变得更加简单。

2.4 高阶函数

高阶函数是指接受一个或多个函数作为参数,或返回一个函数的函数。比如,Python中的map()filter()reduce()都是高阶函数。

2.5 函数组合

函数组合是将多个函数组合成一个单一函数的过程,通过这种方式,我们可以构造复杂的行为而不改变各个函数的内部实现。

3. Python中的函数式编程特性

3.1 Lambda表达式

Lambda表达式是一种创建匿名函数的方式,语法简单且适合用于很小的功能。

示例代码

# 使用lambda表达式定义一个简单的加法函数
add = lambda x, y: x + y
print(add(2, 3))  # 输出: 5

3.2 map()函数

map()函数将给定的函数应用于指定序列的每个元素,并返回一个迭代器。

示例代码

# 定义一个函数将数字平方
def square(x):return x ** 2numbers = [1, 2, 3, 4, 5]
squared_numbers = list(map(square, numbers))
print(squared_numbers)  # 输出: [1, 4, 9, 16, 25]

3.3 filter()函数

filter()函数用于过滤序列,保留那些符合条件的元素。

示例代码

# 定义一个函数检查数字是否为偶数
def is_even(x):return x % 2 == 0numbers = [1, 2, 3, 4, 5]
even_numbers = list(filter(is_even, numbers))
print(even_numbers)  # 输出: [2, 4]

3.4 reduce()函数

reduce()函数需要导入functools模块,它用于对序列中的所有元素进行累积计算。

示例代码

from functools import reduce# 定义一个函数进行加法
def add(x, y):return x + ynumbers = [1, 2, 3, 4, 5]
sum_total = reduce(add, numbers)
print(sum_total)  # 输出: 15

3.5 列表推导式

Python支持使用推导式的方式来创建列表,使得代码更加简洁。

示例代码

# 使用列表推导式计算平方
numbers = [1, 2, 3, 4, 5]
squared_numbers = [x ** 2 for x in numbers]
print(squared_numbers)  # 输出: [1, 4, 9, 16, 25]

4. 函数式编程的优势

优势描述
简洁性函数式风格的代码通常更简洁,容易理解
可测试性由于纯函数特性,测试变得简单,且无需考虑副作用
可重用性函数作为一等公民,能够轻松组合,提升代码重用性
并发性不可变性使得函数式编程更适合并发处理
减少副作用避免使用全局变量,代码的副作用更少

5. 实际应用示例

以下是一个实际应用示例,我们将使用函数式编程的思想来处理数据。

5.1 示例场景:处理用户数据

假设有一组用户数据,我们需要筛选出年龄大于18岁并将他们的名字转换为大写字母。

用户数据

users = [{"name": "Alice", "age": 22},{"name": "Bob", "age": 17},{"name": "Charlie", "age": 19}
]

实现代码

def is_adult(user):return user['age'] > 18def get_uppercase_name(user):return user['name'].upper()# 首先过滤出成年用户,再提取他们的名称并转换为大写
adult_names = list(map(get_uppercase_name, filter(is_adult, users)))
print(adult_names)  # 输出: ['ALICE', 'CHARLIE']

5.2 代码运行流程图

开始├── 过滤用户:is_adult│   ├── Alice -> True│   ├── Bob -> False│   ├── Charlie -> True│   └── 返回:[Alice, Charlie]├── 映射名称:get_uppercase_name│   ├── Alice -> ALICE│   └── Charlie -> CHARLIE└── 返回:['ALICE', 'CHARLIE']
结束

6. 小结

函数式编程在Python中是一个强大的工具,能够增强程序的可读性和可维护性。通过理解和运用函数式编程的核心概念,您将能够写出更加高效和优雅的代码。鼓励您在日常编程中逐步应用这些概念,尝试将函数式编程与其他编程范式结合使用。

练习题

  1. 编写一个函数,使用lambda表达式来计算一个数的立方。
  2. 创建一个列表,包含1到100中的所有奇数,使用filter()函数过滤出这些奇数。
  3. 使用reduce()函数计算列表中所有数字的乘积。
  4. 使用列表推导式创建一个包含100以内所有质数的列表(质数只可被1和自身整除)。

在这里插入图片描述

怎么样今天的内容还满意吗?再次感谢观众老爷的观看。
最后,祝您早日实现财务自由,还请给个赞,谢谢!

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

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

相关文章

WPF之UI进阶--控件样式与样式模板及词典

WPF的优势之一就是能够更加容易快捷的对窗体和控件的外面进行改造,换句话说,那就是UI设计个性化更加容易。主要是借助了样式、模板及词典来实现的。那么本篇博文就一一对他们进行介绍。 文章目录 一、样式1: 定义样式2: 使用Setter设置属性关于Property和…

CSS3--美开二度

免责声明:本文仅做分享! 目录 定位 相对定位 绝对定位 定位居中 固定定位 堆叠层级 z-index 定位-小结 CSS 精灵 京东案例 字体图标 下载字体 使用字体 上传矢量图 CSS 修饰属性 垂直对齐方式 vertical-align 过渡 transition 透明度 opa…

二、kafka生产与消费全流程

一、使用java代码生产、消费消息 1、生产者 package com.allwe.client.simple;import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.pr…

C# 游戏引擎中的协程

前言 书接上回,我谈到了Unity中的协程的重要性,虽然协程不是游戏开发“必要的”,但是它可以在很多地方发挥优势。 为了在Godot找回熟悉的Unity协程开发手感,不得不自己做一个协程系统,幸运的是,有了Unity的…

TI DSP TMS320F280025 Note15:串口SCI的使用

TMS320F280025 串口SCI的使用 ` 文章目录 TMS320F280025 串口SCI的使用框图分析串口特点可编程数据格式SCI端口中断非FIFO/FIFO模式下SCI中断的操作/配置UartDriver.cUartDriver.h串口时钟由PCLKCR7控制使能,默认位系统时钟4分频 串口接收与发送都可以触发中断 串口使用的引脚…

JAVA并发编程高级——JDK 新增的原子操作类 LongAdder

LongAdder 简单介绍 前面讲过,AtomicLong通过CAS提供了非阻塞的原子性操作,相比使用阻塞算法的同步器来说它的性能已经很好了,但是JDK开发组并不满足于此。使用AtomicLong 时,在高并发下大量线程会同时去竞争更新同一个原子变量,但是由于同时只有一个线程的CAS操作会成功,…

【C语言】指针篇 | 万字笔记

写在前面 在学习C语言过程,总有一个要点难点离不开,那就是大名鼎鼎的C语言指针,也是应为有指针的存在,使得C语言一直长盛不衰。因此不才把指针所学的所有功力都转换成这个笔记。希望对您有帮助🥰🥰 学习指…

基于Springboot+Vue的饮食营养管理信息系统(含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统中…

Hystrix学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程:封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…

MAC M1 安装brew 配置环境变量,安装dart

一. 下载 brew 1. 终端输入 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 2. 如遇到下载失败情况,需要VPN/代理 curl: (7) Failed to connect to raw.githubusercontent.com port 443 after 8 m…

MongoDB简介

1、说到MongoDB就必须说下什么是NoSQL? NoSQL(NoSQL Not Only SQL),意即反SQL运动,指的是非关系型的数据库,是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系…

Java | Leetcode Java题解之第454题四数相加II

题目&#xff1a; 题解&#xff1a; class Solution {public int fourSumCount(int[] A, int[] B, int[] C, int[] D) {Map<Integer, Integer> countAB new HashMap<Integer, Integer>();for (int u : A) {for (int v : B) {countAB.put(u v, countAB.getOrDefa…

被字节恶心到了

字节 日常逛 xhs 看到一篇吐槽贴&#xff0c;表示被公司恶心到了&#xff1a; 这位网友表示&#xff0c;最近是公司举办了 Q2 和 H1 的优秀员工表彰&#xff0c;自己的 1&#xff08;直属领导&#xff09;评上了&#xff0c;但仔细一看&#xff0c;1 获奖的所有产出都是自己的&…

实时数字人DH_live使用案例

参看: https://github.com/kleinlee/DH_live ubuntu 测试 apt install ffmpeg 下载安装: git clone https://github.com/kleinlee/DH_live.git cd DH_liveconda create -n dh_live python=3.12 conda activate dh_live pip install -r requirements.txt pip install torch …

突发:Sam万字长文,OpenAI o1超越人类,o1模型训练原理、微调、能力来源-AI已死,大模型当立

OpenAl o1大模型&#xff1a;原理、突破、前景及影响 北京时间2024年9月13日凌晨&#xff0c;OpenAI正式发布了新的人工智能模型o1&#xff08;o是orion猎户座&#xff0c;1代表从头再来&#xff0c;也意味着后续将出现更多序列&#xff09;&#xff0c;就是此前OpenAI一直在高…

银河麒麟V10 SP1如何进入救援模式?

银河麒麟V10 SP1如何进入救援模式&#xff1f; 1、准备工作2、进入BIOS/UEFI进入救援模式注意事项 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在使用银河麒麟高级服务器操作系统V10 SP1时&#xff0c;如果遇到系统无法正常启动或需要进…

240 搜索二维矩阵 II

解题思路&#xff1a; \qquad 解这道题最重要的是如何利用从左到右、从上到下为升序的性质&#xff0c;快速找到目标元素。 \qquad 如果从左上角开始查找&#xff0c;如果当前matrix[i][[j] < target&#xff0c;可以向右、向下扩展元素都是升序&#xff0c;但选择哪个方向…

.Net 6.0 监听Windows网络状态切换

上次发了一个文章获取windows网络状态&#xff0c;判断是否可以访问互联网。传送门&#xff1a;获取本机网络状态 这次我们监听网络状态切换&#xff0c;具体代码如下&#xff1a; public class WindowsNetworkHelper {private static Action<bool>? _NetworkStatusCh…

初步认识产品经理

产品经理 思考问题的维度 1️⃣为什么要抓住核心用户&#xff1f; 所有和产品有关系的群体就是用户&#xff0c;存在共性和差异了解用户的付费点&#xff0c;更好的优化产品是否使用&#xff1a;&#xff08;目标用户-已使用产品&#xff1a;种子用户-尝鲜&#xff1b;核心用…

【在Linux世界中追寻伟大的One Piece】命名管道

目录 1 -> 命名管道 1.1 -> 创建一个命名管道 1.2 -> 匿名管道与命名管道的区别 1.3 -> 命名管道的打开规则 1.4 -> 例子 1 -> 命名管道 管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。如果我们想在不相关的进程之间交换数据&…