【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 1return 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 1return n+sum(n-1)
# 调用sum()函数,传入200,并输出
print(sum(200))

总结

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

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

相关文章

学浪视频怎么缓存?

缓存学浪视频轻而易举!推荐使用“小浪助手”,一款便捷的工具,助你轻松实现。工具已经预先打包好,需要的朋友可以自行下载。快试试,畅享学习吧! 学浪下载器链接:https://pan.baidu.com/s/1y7vcq…

spring容器

spring容器 实现方式 spring中提供了各式各样的IOC容器的实现供用户选择和使用,使用什么样的容器取决于用户的需要 BeanFactory 该接口是最简单的容器,提供了基本的DI支持。最常用的BeanFactory实现是XmlBeanFactory类,根据XML文件中的定义加…

STL--什么是迭代器的失效

迭代器失效指的是当容器发生变化时,之前获取的迭代器不再指向有效的元素或者不再有意义,这种情况在 C STL 编程中比较常见。迭代器失效主要发生在以下几种情况: 1.元素被删除或修改: 如果你删除了某个迭代器所指向的元素,那么这个…

RetinalNet论文笔记

RetinalNet 概述1. 引言2. 相关工作3. 焦点损失4. RetinaNet Detector 检测器5. 实验6. 结论 3. Focal loss3.1. 平衡交叉熵3.2. 焦点损失定义3.3. 类别不平衡和模型初始化3.4. 类别不平衡和两阶段检测器 4. RetinaNet Detector特征金字塔网络骨干(Feature Pyramid …

前端的导航栏数据是前端自己写好还是建议从后端拿数据渲染出来吗?

关于前端导航栏的数据来源,这实际上取决于具体的项目需求和应用场景。以下是两种方式的优缺点,供您参考: 前端自己写好: 优点: 加载速度快:导航栏数据直接嵌入前端代码中,无需等待后端接口响…

PostgreSQL入门到实战-第二十五弹

PostgreSQL入门到实战 PostgreSQL中表连接操作(九)官网地址PostgreSQL概述PostgreSQL中NATURAL JOIN命令理论PostgreSQL中NATURAL JOIN命令实战更新计划 PostgreSQL中表连接操作(九) 使用PostgreSQL NATURAL JOIN从两个表中查询数据。 官网地址 声明: 由于操作系统, 版本更新…

Failed to resolve ‘bss.myhuaweicloud.com‘ ([Errno -2] Name or service not know

Failed to resolve ‘bss.myhuaweicloud.com’ ([Errno -2] Name or service not know 解決方案: 修改/etc/resolv.conf文件来指定DNS服务器,例如添加Google的公共DNS服务器: nameserver 8.8.8.8 nameserver 8.8.4.4

【软件设计师知识点】九、网络与信息安全基础知识

文章目录 计算机网络的概念网络分类网络拓扑结构网络体系结构ISO/OSI 7层参考模型TCP/IP 4层模型TCP/IP 协议族应用层协议传输层协议网络层协议IP 地址IPV4 数据报IP 地址分类子网划分子网掩码IPv6地址

C++实现AVL树

文章目录 一、平衡树的优势二、二叉平衡搜索树的节点定义三、二叉搜索树的插入3.1 寻找插入位置3.2 开始判定平衡因子,平衡因子有变就开始旋转3.2.1 左旋的情况3.2.2 左旋代码(一定要考虑平衡因子为2或者-2的节点是否有父节点)3.2.2 右旋的情…

mybatis分页实现总结

1.mybatis拦截器相关知识 1.作用 mybatis的拦截器是mybatis提供的一个拓展机制,允许用户在使用时根据各自的需求对sql执行的各个阶段进行干预。比较常见的如对执行的sql进行监控,排查sql的执行时间,对sql进行拦截拼接需要的场景&#xff0c…

DC-5渗透测试复现

DC-5渗透测试复现 目的: 获取最高权限以及5个flag 过程: 信息打点-文件包含漏洞-弹shell- scren-4.0.5提权 环境: 攻击机:kali(192.168.85.136) 靶机:DC_3(192.168.85.134) 复现: 一.信息收集 nma…

PlantUML 实战示例(使用 PlantUML 画用例图、类图、活动图、时序图)

目录 前言 需求场景 用例图 类图 活动图 时序图 前言 在软件开发的生命周期中,需要先进行设计,最后才是进行具体的编码和测试。设计时就需要画各种 UML 图,有专业的 UML 画图软件,也有很多在线的 UML 画图网站可以来画图&a…

哈希表函数 —— uthash的简单使用

目录标题 哈希表函数 —— uthash的简单使用添加头文件定义结构体哈希表的初始化哈希表的添加哈希表的添加哈希表的排序 哈希表函数 —— uthash的简单使用 添加头文件 在使用uthash函数实现哈希表前,要先添加头文件: #include "uthash.h"定…

Dubbo面试回答简单版

一、dubbo特性 超时重试机制地址缓存多版本负载均衡:随机、权重轮询、最少活跃调用、一致性哈希集群容错:失败重试、快速失败、失败安全、失败自动恢复、并行调用、广播服务降级:异常时返回mock 集群容错 FailOver 失败重试,读…

链表算法题总结(二十一天)

203. 移除链表元素 题目 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5]示例 2: 输入&…

正方形(c++题解)

题目描述 给定一组不同长度的木棍,是否有可能将它们端对端地连接起来形成 个正方形? 输入格式 第1行输入包含N,即测试数据的数量。 每组测试数据第一个数为 ,即木棒的根数。之后有 个整数, 每个都给出了一根棍子的长度 。 …

求存款本息和(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <math.h>int main() {//初始化变量值&#xff1b;double P 1000, r1 0.015, r2 0.021, r3 0.0275, r4 0.03, r5 0.0035;int judge 0;//…

富文本编辑器的下载安装使用

为什么选择vue-quill-editor&#xff1f; 在众多的富文本编辑器中&#xff0c;vue-quill-editor因其易用性、灵活性以及对Vue框架友好的特性而受到开发者的青睐。它基于Quill编辑器&#xff0c;Quill是一款现代的WYSIWYG&#xff08;所见即所得&#xff09;编辑器&#xff0c;…

【每日刷题】Day13

1. 1041. 困于环中的机器人 - 力扣&#xff08;LeetCode&#xff09; //思路&#xff1a;可以利用轴上四个方向的单位坐标表示机器人的运动。遍历字符串&#xff0c;根据字符串内容进行相应的行动。 bool isRobotBounded(char* instructions) { int arr[4][2] {{0,1},{1,0},{0…

Redis漏洞利用

未授权 可以利用超级弱口令工具来判断redis是否能未授权登录 telnet #尝试登录info #查看redis信息 RCE方法 写shell 需要写权限需要知道web网站路径 config set dir /var/www/html config set dbfilename redis.php set test "<?php phpinfo(); ?>" sa…