python函数式编程

函数式编程是一种编程范式,它强调使用纯函数、无副作用和不可变性。在Python中,可以使用高阶函数(接受其他函数作为参数的函数)和lambda表达式来实现函数式编程。

Python函数式编程主要包括以下内容:

  • 头等函数:在Python中,函数被视为一等公民,这意味着函数可以像其他数据类型一样被赋值给变量、作为参数传递给其他函数、存储在数据结构中,以及作为返回值。
  • 函数作为对象:由于Python中的函数也是对象,可以将函数赋值给变量,然后通过这个变量来调用函数。
  • 高阶函数:这类函数可以接受其他函数作为参数,或者将其他函数作为结果返回。例如,内置的map()、filter()和reduce()函数就是典型的高阶函数。
  • 匿名函数:即lambda表达式,它允许快速定义单行的小型函数,通常用于临时使用的小功能。
  • 偏函数:是固定一个或多个函数参数的函数,它返回一个新的函数,该新函数接受剩余的参数。在Python中,functools模块提供了partial函数,用于创建偏函数。
扫一扫欢迎关注,一起学习!

1. 头等函数

在Python中,函数被视为一等公民,这意味着函数与其他数据类型(如整数、字符串等)处于平等地位。这种特性使得函数可以像其他数据类型一样被赋值给变量、作为参数传递给其他函数、存储在数据结构中,以及作为返回值。具体来说,头等函数主要包括以下几个方面:

  1. 函数赋值:可以将函数赋值给一个变量,然后通过这个变量来调用该函数。
  2. 函数作为参数:函数可以作为参数传递给另一个函数。这是高阶函数的一个特点,它们可以接受函数作为输入,或者将函数作为输出返回。
  3. 函数作为返回值:函数可以作为另一个函数的返回值。这使得可以在运行时动态地创建和返回函数,增加了编程的灵活性。
  4. 函数存储在数据结构中:函数可以存储在列表、字典等数据结构中,这使得可以组织和分类不同的函数,便于管理和调用。
  5. 函数式编程的思维方式:函数式编程鼓励将问题分解为一系列函数调用,每个函数完成单一的任务,这样可以使程序更加模块化,易于理解和维护。
# 定义一个函数,接受一个数字作为参数,返回这个数字的两倍
def multiply_by_two(x):
    return x * 2

# 创建一个包含数字的列表
numbers = [1, 2, 3, 4, 5]

# 使用map函数和multiply_by_two函数,将列表中的每个元素都乘以2
result = map(multiply_by_two, numbers)

# 将结果转换为列表并打印输出
print(list(result))  
# 输出:[2, 4, 6, 8, 10]

2. 匿名函数

匿名函数是指没有具体名称的函数,它允许快速定义单行的简单函数,通常用于临时使用的小功能。

在Python中,可以使用lambda关键字来创建匿名函数。

# 定义一个匿名函数,接受一个参数n,返回n的平方
square = lambda n: n * n

# 调用匿名函数
result = square(5)
print(result)  # 输出:25

3. 偏函数

偏函数是指固定一个函数的部分参数,生成一个新的函数。在Python中,可以使用functools.partial函数来创建偏函数。

例如,我们有一个求平方的函数square:

def square(x):
    return x * x

使用functools.partial来创建一个只传入一个参数的偏函数

import functools

square_of_2 = functools.partial(square, 2)
print(square_of_2())  # 输出:4

4. 闭包

闭包是指一个函数可以访问并操作其外部作用域中的变量。在Python中,闭包是通过嵌套函数实现的。

def outer_function(x):
    def inner_function(y):
        return x + y
    return inner_function

closure = outer_function(10)
print(closure(5))  # 输出:15

4.1. 闭包的优点

主要包括保护变量、避免全局污染和实现私有成员

  1. 闭包可以使得内部函数访问外部函数的变量,这些变量会被保留在内存中,即使外部函数执行完毕。这样可以在多次调用内部函数时保持变量的状态,实现数据的持久化。
  2. 闭包通过创建私有作用域来避免全局变量的污染。由于闭包内部的变量不会被外部环境直接访问,这有助于减少因全局变量过多而引起的命名冲突和意外修改的风险。
  3. 闭包可以实现私有成员的存在。在面向对象的编程中,闭包可以用来模拟类的私有属性和方法,这些私有成员只能通过特定的接口访问,而不能直接从外部访问,从而增强了封装性。

4.2. 主要应用场景

  1. 封装和保护

闭包可以用来封装和保护变量,使得这些变量不会被外部环境所影响。例如,在计数器或累加器中,可以使用闭包来保存计数状态。

def counter(start=0):
    count = [start]
    def increment():
        count[0] += 1
        return count[0]
    return increment

my_counter = counter()
print(my_counter())  # 输出:1
print(my_counter())  # 输出:2
  1. 缓存

闭包可以用于缓存函数的结果,避免重复计算。这在处理递归或计算密集型任务时特别有用。

def memoize(f):
    cache = {}
    def decorated_function(*args):
        if args in cache:
            return cache[args]
        else:
            cache[args] = f(*args)
            return cache[args]
    return decorated_function

@memoize
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))  # 输出:55
  1. 实现特定的设计模式

闭包可以用于实现某些设计模式,如单例模式、策略模式等。例如,在单例模式中,可以使用闭包来确保类只有一个实例。

def singleton(cls):
    instances = []
    def wrapper(*args, **kwargs):
        if cls not in instances:
            instance = super().__new__(cls)
            instances.append(instance)
            return instance
    return wrapper

@singleton
class MyClass:
    pass

a = MyClass()
b = MyClass()
print(a is b)  # 输出:True

4.3. 闭包的缺点

内存占用

由于闭包会使得函数中的变量一直保存在内存中,这可能导致较大的内存占用。如果闭包数量多或者闭包内部保存的数据量大,那么内存占用将会成为一个问题。

执行效率

闭包的使用可能会影响代码的执行效率。因为闭包需要维护外部作用域的引用,这可能会增加垃圾回收的负担,从而影响程序的运行速度。

代码复杂度

闭包的使用可能会增加代码的复杂度。对于不熟悉闭包的开发者来说,理解和维护包含闭包的代码可能会更加困难。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RustDesk私有化部署,自建远程桌面搭建教程

以linux操作系统为例&#xff1a; 解压安装 # 使用wget进行下载1.1.8-2版本&#xff08;最新版本可以看上述发布地址&#xff09; wget https://github.com/rustdesk/rustdesk-server/releases/download/1.1.8-2/rustdesk-server-linux-amd64.zip # 使用unzip解压 unzip rust…

UBUNTU中NGINX的负载均衡和环境搭建

1.准备三台ubuntu版本的虚拟机 2.开始安装&#xff0c;下载&#xff0c;解压&#xff0c;以及编译nginx所需的环境依赖 这里需要注意我们创建了一个新的目录 /home/nginx,所以在编译中记得更改 然后再编译过程中我们会发现提示无法编译&#xff0c;原因是缺少c语言的插件&…

林浩然的哲学冒险乐园:尼采与超人哲学的诙谐解读与深度探索

林浩然的哲学冒险乐园&#xff1a;尼采与超人哲学的诙谐解读与深度探索 Lin Haoran’s Philosophical Adventureland: A Whimsical Exploration of Nietzsche and the Philosophy of the Superman 在一场思维的盛宴中&#xff0c;林浩然同学勇敢地踏入了尼采哲学的探险乐园&…

WPS复制时不能对多重选定区域使用此命令问题

今天在进行两个表格复制过程中频繁出现下面这个提示&#xff0c;就很烦&#xff0c;且不知道是什么原因。 后来在操作过程中发现了规律&#xff0c;所以记录一下。 问题复现&#xff1a; 1、这里鼠标随机点了一个方格 2、与此同时&#xff0c;我按着ctrl键选中第一列&…

蓝桥杯省赛无忧 编程13 肖恩的投球游戏

#include <iostream> #include <vector> using namespace std; int main() {int n, q;cin >> n >> q;vector<int> a(n 1);vector<int> diff(n 2, 0); // 初始化差分数组// 读取初始球数&#xff0c;构建差分数组for (int i 1; i < …

shell编程之循环语句与函数

一 echo命令 echo -n 表示不换行输出 echo -e 表示输出转义符 常用的转义符 二 date date查看当前系统时间 -d 你描述的日期&#xff0c;显示指定字符串所描述的时间&#xff0c;而非当前时间 %F 完整日期格式&#xff0c;等价于 %Y-%m-%d % T 时间&#xff08;24小时…

提升工作效率,畅享便捷PDF编辑体验——Adobe Acrobat Pro DC 2023

作为全球领先的PDF编辑软件&#xff0c;Adobe Acrobat Pro DC 2023将为您带来前所未有的PDF编辑体验。无论您是个人用户还是企业用户&#xff0c;Adobe Acrobat Pro DC 2023将成为您提高工作效率、简化工作流程的得力助手。 一、全面编辑功能 Adobe Acrobat Pro DC 2023提供了…

硬件知识(1) 手机的长焦镜头

#灵感# 手机总是配备好几个镜头&#xff0c;研究一下 目录 手机常配备的摄像头&#xff0c;及效果举例 长焦的焦距 焦距的定义和示图&#xff1a; IPC的焦距和适用场景&#xff1a; 手机常配备的摄像头&#xff0c;及效果举例 以下是小米某个手机的摄像头介绍&#xff1a…

再学http

HTTP状态码 1xx 信息性状态码 websocket upgrade 2xx 成功状态码 200 服务器已成功处理了请求204(没有响应体)206(范围请求 暂停继续下载) 3xx 重定向状态码 301(永久) &#xff1a;请求的页面已永久跳转到新的url302(临时) &#xff1a;允许各种各样的重定向&#xff0c;一般…

UE5 Chaos系统 学习笔记

记得开插件&#xff1a; 1、锚点场&#xff08;构造场&#xff09; 在锚点场范围内的物体静止且不被其他力场损坏 需要在Geometry Collection的初始化场把构造场设置过去 2、ClusterStrain 破裂效果的力 3、DisableField chaos破裂后的模拟物理在绿色范围内禁止行为和模拟物…

Mac中java jdk、android sdk、flutter sdk目录

1、Java JDK 目录 &#xff08;1&#xff09;官网下载的 Java JDK Java JDK下载官网 /Library/Java/JavaVirtualMachines&#xff08;2&#xff09;Android Studio下载的 Java JDK /Users/用户名/Library/Java/JavaVirtualMachines2、Android SDK 目录 /Users/用户名/Libr…

STM32第一节——初识STM32

1 硬件介绍 1.1 硬件平台 配套硬件&#xff1a;以野火的STM32 F1霸道开发板为平台&#xff0c;若用的是别的开发板&#xff0c;可自己进行移植。 1.2 什么是STM32 STM32是由意法半导体&#xff08;STMicroelectronics&#xff09;公司推出的一系列32位的ARM Cortex-M微控制…

【数据库】聊聊explain如何优化sql以及索引最佳实践

在实际的开发中&#xff0c;我们难免会遇到一些SQL优化的场景&#xff0c;虽然之前也看过周阳的课程&#xff0c;但是一直没有进行细心的整理&#xff0c;所以本篇会进行详细列举explain的相关使用&#xff0c;以及常见的索引最佳实践&#xff0c;并通过案例进行讲解。 数据准…

Python学习之路-Django基础:PythonWeb

Python学习之路-Django基础:PythonWeb Python Web 框架要点 处理流程 图片来源于未来的小牛的CSDN博客 意义 用于搭建Web应用程序&#xff0c;免去不同Web应用相同代码部分的重复编写&#xff0c;只需关心Web应用核心的业务逻辑实现 Web应用程序的本质 接收并解析HTTP请求…

【七、centos要停止维护了,我选择Almalinux】

搜索镜像 https://developer.aliyun.com/mirror/?serviceTypemirror&tag%E7%B3%BB%E7%BB%9F&keywordalmalinux dvd是有界面操作的&#xff0c;minimal是最小化只有命里行 镜像下载地址 安装和centos基本一样的&#xff0c;操作命令也是一样的&#xff0c;有需要我…

搞定App关键词和评论

从关键词优化的三大基本概念走起&#xff01; 关联性 优化师一般如何选择关联性高的关键词呢&#xff1f; 主要思路如下&#xff1a;品牌词-关联词-竞品词-竞品关键词&#xff0c;优先级从前到后依次降低&#xff0c;通过ASO优化工具筛选出合适的关键词。做ASO有一个好处就是…

实体店怎么引流推广?实体店铺引流推广方法

随着互联网的发展&#xff0c;越来越多的实体店面临着客源流失的问题。为了吸引更多的顾客&#xff0c;实体店需要采取有效的引流推广方法。那么实体店怎么引流推广呢&#xff1f;下面分享一些实体店铺引流推广方法。 1、优惠券 优惠券有以下好处&#xff1a; ①拉新&#x…

Github配置2FA认证

Github配置2FA认证 Github官方声明&#xff1a;从 2023 年 3 月开始到 2023 年底&#xff0c;GitHub 将逐渐开始要求在 GitHub.com 上贡献代码的所有用户启用一种或多种形式的双因素身份验证 (2FA)。 如果你在符合条件的组中&#xff0c;当选择该组进行注册时&#xff0c;将收到…

Ubuntu 22.04 安装tomcat

tomcat是常用的Java服务容器,这篇文章我们就来讲讲如何安装它。 更新软件包 首先是更新软件包,这是最常规的操作 sudo apt update 然后是开始安装,不多一会就可以安装好了 sudo apt install tomcat9 然后看一下状态 sudo systemctl status tomcat9 发现虽然启动了,但…

Qt下使用QWebEngineView实现百度地图的显示

文章目录 前言一、前期准备二、HTML文件创建三、实现步骤四、示例完整代码总结 前言 本文讲述了在Qt下使用QWebEngineView来加载HTML页面&#xff0c;实现该需求是需要连接网络的&#xff0c;这里进行了百度地图的嵌入显示&#xff0c;主要内容将结合相应的示例进行讲解&#…