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

news2024/11/23 20:52:08

目录

目标

匿名函数

多个形参

匿名函数的局限性

递归

语言例子

数学例子

递归的实现

递归代码

练习

总结


目标

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

匿名函数

        在前面,我们使用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))

总结

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

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

相关文章

前端css笔记(pink老师)

css css书写顺序 自适应屏幕 html { width: 100%; height: 100%; display: table; } body { display: table-cell; } 用了这个方法以后,如果希望页面内的盒子也适应屏幕大小,则使用以下方法,会根据父亲的宽高计算出该盒子的宽高 width:xx%; …

策略模式(知识点)——设计模式学习笔记

文章目录 0 概念1 使用场景2 优缺点2.1 优点2.2 缺点 3 实现方式4 和其他模式的区别5 具体例子实现5.1 实现代码 0 概念 定义:定义一个算法族,并分别封装起来。策略让算法的变化独立于它的客户(这样就可在不修改上下文代码或其他策略的情况下…

死锁的成因, 和解决方案.

死锁 死锁就是两个或两个以上线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。 成因 1.一个线程一把锁 一个线程,对同一个对象,重复加锁两次,如…

相机参数的意义

相机标定的意义: 相机标定:使用带有pattern的标定板来求解相机参数的过程;用一个简化的数学模型来代表复杂的三维到二维的成像过程;相机参数包括:相机内参(焦距等),外参&#xff08…

⑤-1 学习PID--什么是PID

​ PID 算法可以用于温度控制、水位控制、飞行姿态控制等领域。后面我们通过PID 控制电机进行说明。 自动控制系统 在直流有刷电机的基础驱动中,如果电机负载不变,我们只要设置固定的占空比(电压),电机的速度就会稳定在…

Solana 上创建自己的 SLPToken:简明指南

Solana 定义 Solana 是由 Solana Labs 创建的区块链平台,旨在提供高吞吐量和低延迟的去中心化应用(DApps)开发环境。它采用一系列创新技术,如 PoH(Proof of History)共识机制和 Tower BFT(BFT …

好用的企业知识管理SaaS产品推荐来啦,小白必看!

知识管理在企业运营中扮演了重要角色,特别是在现代化办公环境下,一个高效卓越的知识管理系统是企业提高生产力、促进创新和保持竞争力的关键。SaaS(Software as a Service) 我们通常称之为“软件即服务”,为企业提供了灵活、高效和划算的知识…

每日一题(力扣)---插入区间

官方网址:. - 力扣(LeetCode) 题目: 给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束,并且 intervals按照 st…

开源免费AI引擎:智能合同审查技术的应用与优势

随着数字化转型的加速,合同作为商业活动中的重要法律文件,其审查和管理变得越来越重要。传统的合同审查方式耗时且容易出错,而智能AI合同审查技术的引入,为这一领域带来了革命性的变化。本文将探讨智能AI合同审查技术的应用和优势…

【Delphi 爬虫库 1】GET和POST方法

文章目录 1.最简单的Get方法实现2.可自定义请求头、自定义Cookie的Get方法实现3.提取响应协议头4.实现Post请求完成单词翻译 爬虫的基本原理是根据需求获取信息并返回。就像当我们感到饥饿时,可以选择自己烹饪食物、外出就餐,或者订外卖一样。在编程中&a…

d盘无法格式化说另一个正在使用怎么办

在日常生活和工作中,我们经常会遇到需要对电脑硬盘进行格式化的情况。然而,有时在尝试格式化D盘时,会遇到一个常见的错误提示:“另一个程序正在使用此文件,因此无法进行操作”。这个提示可能会让许多人感到困惑&#x…

煤化工废水末端杂盐母液主流处置技术,你一定要了解么!

煤化工废水零排放的意义 随着能源结构的转型升级,现代煤化工产业也将有力推动绿色可再生市场的健康发展。“十一五”时期我国先后建成多个现代煤化工首批示范工程,基本实现了工艺流程贯通、产出合格产品的目标,但在水系统优化、废水处理等方…

水箱缺水保护使用元件

水箱缺水保护一般使用哪种液位传感器?液位传感器分为接触式和非接触式,能点科技的光电接触式需要在水箱上开孔安装,非接触式分为两种,一种是光电分离式,一种是电容式传感器。 光电一体式液位传感器内部器件都是树脂胶…

IPv4头部

IPv4头部 互联网协议(IP)的核心部分,用于在互联网上传输数据包。IPv4头部包含多个字段,这些字段对于正确地路由和传递数据至目的地至关重要。IPv4头部通常是20字节长,但可以因选项字段的存在而更长。以下是IPv4头部各个…

【Java探索之旅】方法的概念 定义 执行流程 实参与形参的交互

🎥 屿小夏 : 个人主页 🔥个人专栏 : Java编程秘籍 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一、方法的概念及定义1.1 方法的概念1.2 方法的定义 二、方法的调用执行过程2.1 执行流…

【matlab非线性规划工具箱安装1 SeDuMi 1.3工具箱】

【matlab非线性规划工具箱安装1 SeDuMi 1.3工具箱】 该博客是非线性手眼标定代码中所依赖的matlab工具箱的安装内容,除了进行手眼标定以外,该工具箱还可以用于其他的非线性规划问题 手眼标定传送门: 【从零开始进行高精度手眼标定 eye in …

【Unity】常见性能优化

1 前言 本文将介绍下常用的Unity自带的常用优化工具,并介绍部分常用优化方法。都是比较基础的内容。 2 界面 2.1 Statistics窗口 可以简单查看Unity运行时的统计数据,当前一帧的性能数据。 2.1.1 Audio 音频相关内容。 Level:音量大小&a…

学习javaEE的日子 Day36 字符流

Day36 1.字符流 应用场景:操作纯文本数据 注意:字符流 字节流编译器 编译器:可以识别中文字符和非中文字符,非中文字符获取1个字节(一个字节一个字符),编译器会根据编码格式获取中文字符对应的…

Python测试框架 —— pytest与unittest的区别!

前言 在Python中进行测试时,两个最流行的测试框架是unittest和pytest。虽然它们的目标相同,但它们之间存在许多不同之处。 本文将详细比较它们在用例编写规则、前置和后置方法、参数化、断言功能、用例执行和报告生成等方面的差异,并适当补…

分类预测 | Matlab实现SSA-LSSVM麻雀算法优化最小二乘支持向量机数据分类预测

分类预测 | Matlab实现SSA-LSSVM麻雀算法优化最小二乘支持向量机数据分类预测 目录 分类预测 | Matlab实现SSA-LSSVM麻雀算法优化最小二乘支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现SSA-LSSVM麻雀算法优化最小二乘支持向量机数据…