Python_函数式编程核心(高阶函数、闭包等)

news2024/10/12 16:14:27

函数式编程(functional programming)其实是个很古老的概念,诞生距今快60年啦!最古老的函数式编程语言Lisp新出现的函数式编程语言:比如Erlang、Scala、clojure等热门语言:Python、java、JavaScript、C++等都增加了函数式编程的一些特性。

⚠️函数式编程在某些时刻,非常方便!但不需大家二选一。⚠️我们通过一些常见的函数式编程的内容,先学习,后体会“函数式编程”。

                              

高阶函数和内存分析函数是一等公民:

             

函数式编程最鲜明的特点就是:函数是一等公民(first class),指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。12一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数。3Python内建的高阶函数有map、reduce、filter、sorted

高阶函数_内存状态分析【示例】高阶函数案例:

#coding=utf-8
def test1():
   print("I'm test!")
def test2(func):    # test2就是一个高阶函数
func()
print("test2 running...")
if__name__ == '__main__':
   print(test1)  # <function test1 at0x00000240A5FA3E20>
   print(type(test1)) # <class 'function'>
   a = test1   # a和test1都指向了同一个函数对象
   a()     # I'm test!
   test2(a)    #a作为参数传递给test2()

        

lambda表达式和匿名函数:

lambda表达式可以用来声明匿名函数。lambda函数是一种简单的、在同一行中定义函数的方法。lambda函数实际生成了一个函数对象。lambda表达式只允许包含一个表达式,不能包含复杂语句,该表达式的计算结果就是函数的返回值。lambda表达式的基本语法如下:

          

              

        

       

         

Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial function)。要注意,这里的偏函数和数学意义上的偏函数不一样。偏函数:作用就是把一个函数某些参数固定住(也就是设置默认值),返回一个新的函数,调用这个新的函数会更简单。举例如下:int()函数可以把字符串转换为整数,当仅传入字符串时,int()函数默认按十进制转换,代码如下:print(int('12345'))但int()函数还提供额外的base参数,默认值为10。如果传入base参数,就可以做N进制的转换:

               

假设要转换大量的二进制字符串,每次都传入int(x,base=2)非常麻烦,于是,我们想到,可以定义一个int2()的函数,默认把base=2传进去,现在定义一个int2函数,代码如下:

             

functools.partial就是帮助我们创建一个偏函数的,不需要我们自己定义int2(),可以直接使用下面的代码创建一个新的函数int2:

闭包closure:

             

根据字面意思,可以形象地把闭包理解为一个封闭的包裹,这个包裹就是一个函数。当然,还有函数内部对应的逻辑,包裹里面的东西就是自由变量(外部函数的局部变量),自由变量可以随着包裹到处游荡。局部变量:如果名称绑定再一个代码块中,则为该代码块的局部变量,除非声明为nonlocal或global全局变量:如果模块绑定在模块层级,则为全局变量自由变量:如果变量在一个代码块中被使用但不是在其中定义,则为自由变量

闭包概念和第一个闭包程序我们知道,函数作用域是独立的、封闭的,外部的执行环境是访问不了的,但是闭包具有这个能力和权限。闭包是一个函数,只不过这个函数有[超能力],可以访问到另一个函数的作用域。「函数」和「自由变量」的总和,就是一个闭包。

闭包的特点

第一,闭包是一个函数,而且存在于另一个函数当中

第二,闭包可以访问到父级函数的变量,且该变量不会销毁

【示例】一个简单的闭包:

def outer():
   a = 1
   def inner():
       nonlocal a
      #闭包是由于函数内部使用了函数外部的变量。这个函数对象不销毁,则外部函数的局部变量也不会被销毁!
       print("a:",a)
       a += 1
   return inner
inn = outer()
inn()
inn()
"""
a: 1
a: 2
a: 3
a: 4
"""

闭包内存分析

             

闭包可以当成两个部分组成的整体:1函数2自由变量

闭包的作用作用1:隐藏变量,避免全局污染作用2:可以读取函数内部的变量同时闭包使用不当,优点就变成了缺点:缺点1:导致变量不会被垃圾回收机制回收,造成内存消耗缺点2:不恰当的使用闭包可能会造成内存泄漏的问题闭包和自由变量【示例】使用全局变量实现变量自增,但污染了其他程序

map函数:

map()函数接收两种参数,一是函数,一种是序列(可以传入多个序列),map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。比如我们有一个函数f(x)=x2,要把这个函数作用在一个list [1, 2, 3,4, 5, 6, 7, 8, 9]上,就可以用map()实现如下:

【示例】map高阶函数的使用案例

reduce位于functools模块reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:reduce(f,[x1,x2,x3,x4])=f(f(f(x1,x2),x3),x4)

【示例】reduce实现对一个序列求和

  

filter函数:

【示例】filter序列中的空字符串删掉

sorted函数排序算法,排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。1如果是数字,我们可以直接比较如果是自定义对象呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。通常规定,对于两个元素x和y,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1,这样,排序算法就不用关心具体的比较过程,而是根据比较结果直接排序。

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

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

相关文章

SpringBoot购物推荐网站开发:架构设计与技术实现

3系统分析 3.1可行性分析 通过对本东大每日推购物推荐网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本东大每日推购物推荐网站采用JAVA作为开发语言&…

SpringBoot框架下购物推荐系统的架构与实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

VSCode搭建C/C++开发环境【Windows】

VSCode搭建C/C开发环境 1. 配置C/C开发环境1.1 下载和配置MinGW-w64编译器套件1.2 安装C/C插件 2. 在VSCode上编写C语言代码&#xff0c;并编译执行2.1 先打开一个文件夹&#xff0c;写一份C语言代码2.2 设置C/C编译的选项&#xff1a;c_cpp_properties.json2.3 创建执行任务&a…

CDGA|数据治理:唤醒“沉睡”的数据,激发无限价值潜能

在当今这个信息爆炸的时代&#xff0c;数据已成为企业最宝贵的资产之一。然而&#xff0c;许多企业面临着数据孤岛、数据质量低下、数据利用率不高等问题&#xff0c;导致大量“沉睡”的数据未能发挥其应有的价值。数据治理&#xff0c;作为解锁这些数据宝藏的钥匙&#xff0c;…

连夜爆肝收藏各大云服务新老用户优惠活动入口地址(内含免费试用1个月的地址),适用于小白,大学生,开发者,小企业老板....

具体请前往&#xff1a;云服务器优惠活动入口大全--收藏各主流云厂商的云服务器等系列产品的优惠活动入口&#xff0c;免费试用1个月活动入口&#xff0c;让新老用户都能根据使用场景和身份快速锁定优惠权益 经济下滑&#xff0c;被优化增多&#xff0c;大学生就业难&#xff0…

Linux之如何找回 root 密码?

1、启动系统&#xff0c;进入开界面&#xff0c;在界面中按“e"进入编辑界面 2、进入编辑界面&#xff0c;使用键盘上的上下键把光标往下移动&#xff0c;找到以”Linux16“开通内容所在的行数&#xff0c;在行的最后面输入&#xff1a;init/bin/sh 3、输入完成后&…

Windows,MySQL主从复制搭建

前提&#xff1a;windows环境&#xff0c;同一个服务器安装多个相同版本的mysql数据库 多个MySQL服务搭建完成后&#xff0c;下面我们进行主从复制的相关配置 1.主数据库 执行指令 #创建用户 CREATE USER slavelocalhost IDENTIFIED BY 123456;#授权 GRANT REPLICATION SLA…

plpo vue实战版教程

vue实战版教程 什么是plpo安装1.将plop添加到您的项目2.全局安装plop(可选&#xff0c;但建议使用方便)3.在项目根目录下创建一个 plopfile.js vue 实战&#xff08;后台管理系统 - 增删改查&#xff09;所需文件文件介绍创建配置文件 plopfile.js创建模板和脚本命令文件模板创…

Emu3:北京智源推出AI多模态世界模型,超越DeepMind和微软,刷新了8项性能指标

Emu3是北京智源人工智能研究院推出的一款原生多模态世界模型&#xff0c;采用智源自研的多模态自回归技术路径&#xff0c;在图像、视频、文字上联合训练&#xff0c;使模型具备原生多模态能力&#xff0c;实现图像、视频、文字的统一输入和输出。Emu3将各种内容转换为离散符号…

食堂校园预约就餐系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;商品管理&#xff0c;论坛管理&#xff0c;用户管理&#xff0c;商家管理&#xff0c;公告信息管理&#xff0c;基础数据管理 微信端账号功能包括&#xff1a;系统首页&#xf…

【Flutter、H5、Web?前端个人总结】分享从业经历经验、自我规范准则,纯干货

前言 hi&#xff0c;正式接触web前端已经经过了两年的时间&#xff0c;从大学的java后端转型到web前端&#xff0c;再到后续转战Flutter&#xff0c;逐渐对前端有了一些心得体会&#xff0c;其实在当下前端的呈现形式一直在变化&#xff0c;无论你是用原生、还是web还是混编的…

vulnhub-Kioptrix_Level_1靶机的测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、解决检测不到IP的问题 2、信息搜集 3、利用exp ①mod_ssl2.8版本漏洞 ②smb2.2版本漏洞 四、结论 一、测试环境 1、系统环境 渗透机&#xff1a;kali2021.1(192.168.202.134) 靶 机…

【前端构建】Webpack: 现代前端开发的核心工具

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Webpack: 现代前端开发的核心工具1. 引言2. Webpack 的核心概念2.1 入口&#x…

vmware下ubuntu18.04中使用笔记本的摄像头

步骤1&#xff1a;在windows中检查相机状态 win10系统中&#xff0c;在左下的搜索栏&#xff0c;搜索“相机”&#xff0c;点击进入即可打开相机&#xff0c;并正常显示图像。 注意&#xff1a;如果相机连接到了虚拟机&#xff0c;则不能显示正常。 步骤2&#xff1a;…

解决ubuntu 下 VS code 无法打开点击没反应问题

从Ubuntu 22.04 升级到ubuntu 24.04 后&#xff0c;发现Vsode无法打开&#xff0c;不论是点击图标&#xff0c;还是terminator里面运行code 可执行程序&#xff0c;均没有反应。debug如下: 提示权限不够。 解决方案&#xff1a; sudo sysctl -w kernel.apparmor_restrict_unp…

最佳BD仓储物流方案选择秘诀!

BD仓储部署策略的执行方案是一项既精细又全面的流程&#xff0c;目的在于保障BD装备的安全保管、高效化管理以及迅速调动。以下详列了一项涵盖众多核心环节及要素的具体执行方案&#xff1a; 一、项目开展与策划 确立项目核心目标&#xff1a;精准定位BD仓储解决方案的关键目…

瑞芯微RK3399开发板Android7.1修改网络优先级方法,触觉智能演示

本文介绍Android7.1修改网络优先级方法&#xff0c;基于触觉智能SBC3968主板&#xff0c;搭载瑞芯微RK3399芯片&#xff0c;这块主板的网络优先级默认是网口&#xff1e;WiFi&#xff1e;4G&#xff0c;下面就手把手教大家怎么修改。 1、查看当前网络优先级数值 源码根目录下执…

springboot乐享田园系统

基于springbootvue实现的乐享田园系统 &#xff08;源码L文ppt&#xff09;4-080 4.3 系统结构设计 构图是系统的体系结构&#xff0c;体系结构是体系结构体系的重要组成部分。系统的总体结构设计如图4-2所示。 图4-2 系统总体架构图 4.4 数据库设计 4.4.1 数据…

IDEA使用Alibaba Cloud Toolkit插件自动化部署jar包

一、下载插件 二、添加服务器主机 三、填写自己服务器配置 四、添加配置 五、配置说明 六、选择maven打包模块 七、maven打包后的jar包位置配一下 八、点击运行发现成功

MySQL-数据库的基础操作 o(´^`)o

文本目录&#xff1a; ❄️一、数据库操作&#xff1a; ☑ 1、查看所有的数据库&#xff1a; ☑ 2、创建数据库&#xff1a; ☑ 3、使用数据库&#xff1a; ☑ 4、删除数据库&#xff1a; ❄️二、常用的数据类型&#xff1a; ➷ 1、数值类型&#xff1a; ➷ 2、字符串类型&a…