【Python函数和类4/6】递归与匿名函数

目录

目标

匿名函数

多个形参

匿名函数的局限性

递归

语言例子

数学例子

递归的实现

递归代码

练习

总结


目标

        在之前的博客中,我们学习了定义函数、调用函数以及设置函数的参数。在今天,我们会补充函数的两个常见的知识点,一个是匿名函数,另一个是递归函数。下面我们先来看看什么是匿名函数吧~

匿名函数

        在前面,我们使用def 函数名(参数): 的结构来定义一个函数。如果,我们把def定义的函数看作“有名字函数”。那么还有一类函数,无需定义函数名,即匿名函数

        下面这段代码创建了一个匿名函数,并赋值给了变量square。然后通过变量名square调用函数,输出了结果。

# 使用lambda创建匿名函数,并赋值给变量square
square = lambda x:x*x
# 通过变量名square,传入参数9,调用该匿名函数,并输出
print(square(9))

lambda

一个关键字lambda,用来创建匿名函数。

空格

一个空格,是创建匿名函数的固定格式。关键字lambda和后面的式子间要有一个空格。

形参

这个位置是匿名函数的参数,也就是我们前面学习的形参,用于接收实参传递来的数据

冒号:

一个冒号:,是匿名函数的固定格式。冒号前面是形参,冒号后面是进行计算的表达式。

表达式

一个计算形参的表达式,紧跟在冒号后面。这个表达式,就是函数的返回值。也就是说,这个表达式的结果将返回到调用函数的地方。所以,匿名函数可以看作return型函数的简便写法。

变量

将匿名函数的值赋给变量,后续,能通过该变量来调用匿名函数。

调用函数

只要将匿名函数赋值给了变量,就需要通过对应的变量名来调用函数。示例中,通过变量square来调用该匿名函数,在括号()中传入了实参9

多个形参

        当然,匿名函数还可以设置多个形参,形参之间以逗号分隔。实例中,冒号前设置了两个形参x和y,在进行函数调用时,还是采取位置形参的方式依次传递数据。

匿名函数的局限性

        匿名函数使用起来比较方便,但是它也有局限性。一般只能用来改写包含了return的简单函数。示例中,是匿名函数和普通函数的等价写法。

递归

        无论是前面的自定义函数,还是匿名函数, 都是先定义好,然后函数外调用这个函数。其实,函数在自己的内部还可以调用自己,我们把这种函数称为递归函数

        下面,我们通过几个例子来熟悉一下递归的概念。

定义:通常,我们在函数定义中调用函数自身的过程叫做递归

隐喻两面镜子平行放置时,镜子一层一层嵌套自己就是一种递归。

语言例子

        其实,有这样一个通俗的故事最能体现递归:从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?“从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……

        这里的“故事”嵌套的“故事”,就是“故事”本身。除非讲故事的人自己停下来不讲了,不然这个故事可以“无限”讲下去。

数学例子

        现在,我们假设sum(n)等于前n个正整数的和,即:sum(n)=1+2+3+……+(n-1)+n如果直接计算sum(n),我们可能会从小到大一个数一个数接连相加,1加2再加3……,依次类推。

        那么使用递归的思想,又该如何解决呢?

        递归的核心思想,就是大事化小,即将原始问题拆解为等价的子问题。换句话说,我们要计算sum(n),不妨先去计算更简单的sum(n-1)。但是,由于n变成了n-1,范围变小,为了保证等价,可以用sum(n-1)加上n

        同样的道理,我们要计算sum(n-1),又可以先去计算sum(n-2)。以此类推,一直计算到最简单的sum(1)=1为止。

递归的实现

        如图,我们展示了计算sum(5)的递归过程。首先把sum(5)变成5+sum(4);同理,把sum(4),变成4+sum(3);……以此类推,一直到最简单的sum(1)。然后,我们就能倒推结果。由于知道sum(1),就知道了sum(2),然后可知sum(3)、sum(4)和sum(5)。

递归代码

        简单学习了递归的概念和函数原理后。下面,我们将以计算5以内正整数的累加和为例,来学习递归代码

        这段函数定义一个求和函数sum,并通过递归的方式求得了5以内的数字的累加和。

# 定义名为sum()函数,传入参数n
def sum(n):
    if n == 1:
        return 1
    return n + sum(n-1)

# 调用sum()函数,传入参数5,并输出
print(sum(5))

终止条件

        终止条件,是递归执行到满足某一条件后,就返回具体的结果,避免程序无限递归下去。因为,要计算5以内的正整数之和,而最小的正整数为1。所以,示例中n的值为1时,就会将1返回到调用函数处。

递归前进条件

        递归的前进条件,表示函数调用自身的代码,通常是和原函数等价的表达式。通过前面的例子,我们知道sum(n)等于n加上sum(n-1)。所以,函数返回了n+sum(n-1)

练习

200以内求和

定义一个递归函数,用于计算实现 200 以内的正整数之和。将函数名命名为 sum,传入参数为 n。

参考代码

# 定义sum()函数,传入参数n
def sum(n):
    if n==1:
        return 1
    return n+sum(n-1)
# 调用sum()函数,传入200,并输出
print(sum(200))

总结

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

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

相关文章

【Linux】安装及管理程序

目录 一、Linux应用程序基础 1.应用程序与系统命令 2.典型应用程序的目录结构 3.软件包封装类型 二、RPM 1.RPM 软件包管理器 2.RPM软件包命名格式 3.RPM命令的格式 4.查询已安装的rpm软件信息 5.查询未安装的 RPM 软件包文件中信息 6.安装、升级、卸载 RPM 软件包 …

gitlab:Could not resolve host

fatal: unable to access http://xxx.git/: Could not resolve host: yyy Git-fatal: unable to access ‘https://gitlab.XX.git/‘: Could not resolve host: gitlab.XX.com.cn_drone unable to access .git/: could-CSDN博客 原因: 克隆的时候使用的是这里的HTT…

jenkins+docker集成harbor实现可持续集成

目录 一、前言 二、Harbor介绍 2.1 什么是Harbor 2.1.1 Harbor架构图 2.2 Harbor 特征 2.3 Harbor 核心组件 2.4 Harbor使用场景 三、Harbor部署 3.1 安装docker compose 3.1.1 安装方式一 3.2 基于python3 pip安装docker compose 3.2.1 安装python3 3.2.2 安装pyt…

我的新书,在西西弗书店上架了!

大家好,我是程序员小灰。今天告诉大家一个好消息,我的新书在西西弗书店上架了! 熟悉小灰的朋友都知道,我以前是京东的一名程序员,现在全职投入到IT领域的自媒体创作。在2019年,我出版了人生中的第一本书《漫…

MacBook Pro找不到fffmpeg

报错信息 ffmpeg: command not found 在macOS上,可以使用Homebrew通过运行brew install ffmpeg 这期间可能涉及brew的更新

使用 MTK 迁移 Oracle 11g 数据库 至 MogDB 3.0 运维指南

一、环境概述 本次是进行Oracle到MogDB测试迁移,具体生产迁移,还需考虑更多步骤细节,请查看MogDB官方文档。 操作系统版本内核版本数据库类型数据库版本字符集数据库端口源端CentOS release 6.8 (Final)2.6.32-642.el6.x86_64单机Oracle 11.2…

[C++]哈希应用之位图布隆过滤器

🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:c大冒险 总有光环在陨落,总有新星在闪烁 前言: 我们之前…

【Spring进阶系列丨第九篇】基于XML的面向切面编程(AOP)详解

文章目录 一、基于XML的AOP1.1、打印日志案例1.1.1、beans.xml中添加aop的约束1.1.2、定义Bean 1.2、定义记录日志的类【切面】1.3、导入AOP的依赖1.4、主配置文件中配置AOP1.5、测试1.6、切入点表达式1.6.1、访问修饰符可以省略1.6.2、返回值可以使用通配符,表示任…

【深度学习实战(3)】打印自己模型的推理帧率

一、FPS(每秒传输帧数-Frames Per Second) FPS就是目标网络每秒可以处理(检测)多少帧(多少张图片),FPS简单来理解就是图像的刷新频率,也就是每秒多少帧,假设目标检测网络处理1帧要0.02s,此时FPS就是1/0.0250 其中Processing tim…

配置DHCP服务器实现为动态客户端和静态客户端分配不同网络参数

相关学习推荐:什么是DHCP?为什么要使用DHCP? 华为HCIP课程【视频教程】:华为HCIP必考题:DHCP协议原理与配置 组网需求 如图1所示,Router作为企业出口网关,PC和IP Phone为某办公区办公设备。为了方便统一管…

五子棋:不会下五子棋也没关系,会用Java写五子棋就行

关注公号“微澜网络”获取完整源代码! 效果展示: 目录 效果展示: 导语: 游戏介绍: 程序设计: 1.游戏规则和功能: 2.用户界面设计: 3.程序架构设计: 4.可扩展性和灵…

ES增强框架easy-es

因为最近做的功能是关于舆情的,所以数据量比较大的,本来打算用MySQL做时间分表来做,但是经过一段时间的测试,发现数据量太大,用时间分表不能满足性能的要求,所以决定将数据存储改为ES,但是短时间内改底层框架又不是一个小工程,时间上不允许,所以找到了一个很合适的框架,他跟myb…

记一次Oracle DG备库实例宕分析

一、问题现象 同事反馈国外点在国内的XXX备库实例宕,尝试将该实例重启,结果重启报如下错误,未能正常启动该数据库。 Standby crash recovery failed to bring standby database to a consistent point because needed redo hasnt arrived yet…

Python | 宝妈自述:离职4年,求职屡遭拒后,如何成功重返职场

我是⼀名已经30岁的宝妈。 怀孕后检查出来是双胎,为了宝宝健康,毅然决然辞职待产。 孩⼦出生后,因为是龙凤胎,婆婆⼀个人照顾不过来,再加上其中⼀个⾝体较弱,为了专注照顾宝宝,就这样⼀直做了…

(四)qt中使用ffmpeg播放视频,可暂停恢复

一、在qt中添加ffmpeg库及头文件 INCLUDEPATH /usr/local/ffmpeg/include LIBS -L/usr/local/lib -lavutil -lavcodec -lavformat -lswscale 二、详细代码 FFempegVideoDecode 视频解码类(放入线程中) ffmpegvideodecode.h #ifndef FFMPEGVIDEODE…

SQL——多表连接查询

若一个查询同时涉及两个或两个以上的表, 则称之为连接查询(在FROM子句中体现)。 参与连接的表可有多个,但连接操作在两个表之间进行,即两两连接。 连接查询包括: 内连接 等值连接:用“”比较被连接列的列值…

Mistral AI突围:开源大模型Mixtral 8x22B颠覆行业格局

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

SVN的介绍

首先SVN是什么: Apache下的一个开源的项目Subversion,通常缩写为 SVN,是一个版本控制系统。 版本控制系统是一个软件,它可以伴随我们软件开发人员一起工作,让我们编写代码的完整的历史保存下来。 目前它的各个版本的…

RTC的基本概念以及相关例程

实时时钟(RTC) 北京时间跟伦敦时间错8个小时 BKP简介 BKP本质上是RAM存储器,没有掉电不丢失的能力。 VBAT的作用就是,当VDD断电时,BKP会切换到VBAT供电,这样可以继续维持BKP里面的数据,如果VDD断电,VBAT也…

YOLO系列 | 正负样本分配策略

文章目录 1 Max-IoU matching(YOLOv1~V3)2 Multi-Anchor策略(YOLOv4)3 基于宽高比的领域匹配策略(YOLOv5)4 simOTA(Simple Optimal Transport Assignment)匹配策略(YOLOX, YOLOv6)5 领域匹配simOTA(YOLOv7)6 TaskAlignedAssigner匹配策略(YOLOv8, YOLOv9)参考资料 1 Max-IoU ma…