Python基础 – 递归与匿名函数

2022/8/12 11:42:52admin0 阅读2 评论

<p>在 Python 中,我们可以使用【def 函数名(参数):】的方式定义函数。</p>
<p>如果我们把 def 定义的函数看作“有名字函数”,那么还有一类函数,其不需要显示定义函数名。</p>
<p>这就是匿名函数。</p>
<h2>匿名函数</h2>
<p>匿名函数是一种不需要为函数命名的函数定义方式,以 lambda 关键字开头。
<img src=“https://assets.moshanghua.net/images/2022/08/msh-2595-01.png” alt=“” /></p>
<p>匿名函数之所以叫匿名函数,是因为它没有函数名称。
本例中,我们是把一个匿名函数赋值给了变量 <code>square</code>,该变量就可以调用函数。
<img src=“https://assets.moshanghua.net/images/2022/08/msh-2595-02.png” alt=“” /></p>
<h3>匿名函数的结构</h3>
<pre><code class=“language-python”>square = lambda x:x*x
result = square(9)
print(result)

multiply = lambda x,y:xy
newResult = multiply(9,10)
print(newResult)</code></pre>
<p><strong>代码的作用</strong>
这两段代码创建两个匿名函数,并且使用变量调用,传入参数,输出了结果。</p>
<p><strong>lambda</strong>
一个关键字 <code>lambda</code>,用来创建匿名函数。
<img src=“https://assets.moshanghua.net/images/2022/08/msh-2595-03.png” alt=“” /></p>
<p><strong>空格</strong>
一个空格,<strong>固定格式,关键字 <code>lambda</code> 和具体计算式之间的空格。</strong>
<img src=“https://assets.moshanghua.net/images/2022/08/msh-2595-04.png” alt=“” /></p>
<p><strong>参数</strong>
这个位置表示该匿名函数的参数,为形参。
<strong>如果传入多个参数,需要使用“逗号”隔开。</strong>
<img src=“https://assets.moshanghua.net/images/2022/08/msh-2595-05.png” alt=“” /></p>
<p><strong>冒号:</strong>
一个冒号<code>:</code>,<strong>是“匿名函数”的固定格式,冒号后面是具体如何计算冒号前面的输入数值。</strong>
<img src=“https://assets.moshanghua.net/images/2022/08/msh-2595-06.png” alt=“” /></p>
<p><strong>表达式</strong>
冒号后面是函数的返回值,<strong>注意这里不需使用 <code>return</code> 关键字。</strong>
<img src=“https://assets.moshanghua.net/images/2022/08/msh-2595-07.png” alt=“” /></p>
<p><strong>变量</strong>
将匿名函数赋给一个变量,再由该变量来调用函数。
<img src=“https://assets.moshanghua.net/images/2022/08/msh-2595-08.png” alt=“” /></p>
<p><strong>调用函数</strong>
<strong>匿名函数同样需要被调用才能执行,调用仍然使用<code> ( ) </code>传参的方式实现。</strong>
<img src=“https://assets.moshanghua.net/images/2022/08/msh-2595-09.png” alt=“” /></p>
<p><strong>变量</strong>
变量,这个变量会“接受”匿名函数返回出来的值。
<img src=“https://assets.moshanghua.net/images/2022/08/msh-2595-10.png” alt=“” /></p>
<p><strong>代码小结</strong>
当要定义匿名函数时,可以使用这样的格式
<img src=“https://assets.moshanghua.net/images/2022/08/msh-2595-11.png” alt=“” /></p>
<h3>小练习</h3>
<p><strong>幂</strong>
定义一个“匿名函数”,它的功能是计算一个输入值的3次幂,将匿名函数赋值给变量power,然后输入一个数值 5,并输出计算结果。</p>
<pre><code class=“language-python”>power = lambda number:number
numbernumber
print(power(5))</code></pre>
<p><strong>立方体体积</strong>
定义一个“匿名函数”,它的功能是计算立方体的体积,其公式为:长<em>宽</em>高,将匿名函数赋值给变量 area。</p>
<p>然后传入参数10, 8, 6,并输出计算结果。</p>
<pre><code class=“language-python”>area = lambda length,width,height:length
width*height

print(area(10, 8, 6))</code></pre>
<p>匿名函数使用起来比较方便,但是它也有局限性。
<code>lambda</code> 的主体是一个表达式,而不是一个代码块,不适合处理复杂的逻辑情况。
我们在创建函数时,如果需要处理较为复杂的逻辑,建议使用 <code>def</code> 创建函数,如本例所示,计算列表各元素的累加。
<img src=“https://assets.moshanghua.net/images/2022/08/msh-2595-12.png” alt=“” /></p>
<p>在之前的学习中,都是先定义函数以后,在代码的其他地方调用这个函数。
其实,在函数的内部还可以调用自己,这种调用自己函数就是<strong>递归函数</strong>。
<img src=“https://assets.moshanghua.net/images/2022/08/msh-2595-13.png” alt=“” /></p>
<h2>递归</h2>
<p>一段程序调用自身的过程我们叫做递归,多见于函数调用函数自身。</p>
<p>当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现的。也可以理解为自我复制的过程
<img src=“https://assets.moshanghua.net/images/2022/08/msh-2595-14.jpg” alt=“” /></p>
<p>语言例子
如果我们用语言的形式表示递归的话,这个通俗的故事最能体现:</p>
<p>从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?“从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?‘从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……
<img src=“https://assets.moshanghua.net/images/2022/08/msh-2595-15.jpg” alt=“” /></p>
<p>接下来,就在案例中,学习递归的使用方法和其中的程序运行逻辑。
<img src=“https://assets.moshanghua.net/images/2022/08/msh-2595-16.png” alt=“” /></p>
<h2>递归</h2>
<p>递归概念比较抽象,我们来一起梳理下。</p>
<p>假设创建一个递归函数,用于计算数字累加,传入数字 5 ,计算 5 以内的数字累加。
5+4+3+2+1+0
<img src=“https://assets.moshanghua.net/images/2022/08/msh-2595-17.png” alt=“” /></p>
<p>由于 <code>5</code> 大于 <code>0</code>,程序不会执行函数中 <code>if</code> 判断的代码块,而是返回<code> 5 + sum(4)</code>。
这里的 <code>sum(4) </code>又是一次 <code>sum()</code> 函数的调用,程序就会返回 <code>4 + sum(3)</code>。
<img src=“https://assets.moshanghua.net/images/2022/08/msh-2595-18.png” alt=“” /></p>
<p>程序就一直调用自己,直到<code> sum(0)</code>,因为<code> if </code>语句的存在,它不需要等待 <code>sum(0)</code> 的计算了,而是直接给出结果<code> 0</code>。
然后程序一路返回,回到最初的 <code>sum(5)</code>,并给出最终的答案:<code>5+4+3+2+1+0 = 15</code>
<img src=“https://assets.moshanghua.net/images/2022/08/msh-2595-19.png” alt=“” /></p>
<p><strong>递归函数会终止么?</strong></p>
<p>在递归函数中,<strong><code>if</code> 判断就是终止条件</strong>,在本例中当<code> n</code> 小于等于<code> 0</code>,就返回<code> 0</code> ,递归就终止了。
如果不加这个终止条件会无休止的递归下去,最终造成程序报错。
<img src=“https://assets.moshanghua.net/images/2022/08/msh-2595-20.png” alt=“” /></p>
<p>类似的,我们要算一个数的阶乘,一个正整数的阶乘是所有小于及等于该数的正整数的积,例如
<code>5! = 5×4×3×2×1</code></p>
<p>我们可以用图中的代码,当<code> n > 0 </code>的时候,函数会调用它本身,直到<code> n <= 0</code>。
<img src=“https://assets.moshanghua.net/images/2022/08/msh-2595-21.png” alt=“” /></p>
<h3>小练习</h3>
<p>200以内求和
写一个递归函数可以实现 200 以内的整数和。</p>
<p>将函数名命名为 sum,传入参数为 n。</p>
<pre><code class=“language-python”># 定义名为sum()函数,传入参数n
def sum(n):
# 如果n小于等于0
if n <= 0:
# 返回0
return 0
# 返回n加上sum(n-1)
return n + sum(n-1)

调用sum()传入200并输出

print(sum(200))</code></pre>

评论区

  • 电脑教程网#1
    电脑教程网2022/11/2 00:37:02

    看到你的文章,感觉很不错,想与你友情链接
    网站名:电脑教程网
    网站:https://dnjcw.com.cn/
    同意的话给我发邮件Internetyewu@163.com

    WindowsChrome

    • 陌上花#1
      陌上花2023/1/28 14:12:31
      @电脑教程网

      抱歉,目前只添加博客相关的,感谢您的来访!!

      WindowsFirefox