51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Python基础 – 递归与匿名函数

在 Python 中,我们可以使用【def 函数名(参数):】的方式定义函数。

如果我们把 def 定义的函数看作"有名字函数",那么还有一类函数,其不需要显示定义函数名。

这就是匿名函数。

匿名函数

匿名函数是一种不需要为函数命名的函数定义方式,以 lambda 关键字开头。

匿名函数之所以叫匿名函数,是因为它没有函数名称。
本例中,我们是把一个匿名函数赋值给了变量 square,该变量就可以调用函数。

匿名函数的结构

square = lambda x:x*x
result = square(9)
print(result)

multiply = lambda x,y:x*y
newResult = multiply(9,10)
print(newResult)

代码的作用
这两段代码创建两个匿名函数,并且使用变量调用,传入参数,输出了结果。

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

空格
一个空格,固定格式,关键字 lambda 和具体计算式之间的空格。

参数
这个位置表示该匿名函数的参数,为形参。
如果传入多个参数,需要使用"逗号"隔开。

冒号:
一个冒号是"匿名函数"的固定格式,冒号后面是具体如何计算冒号前面的输入数值。

表达式
冒号后面是函数的返回值,注意这里不需使用 return 关键字。

变量
将匿名函数赋给一个变量,再由该变量来调用函数。

调用函数
匿名函数同样需要被调用才能执行,调用仍然使用( )传参的方式实现。

变量
变量,这个变量会"接受"匿名函数返回出来的值。

代码小结
当要定义匿名函数时,可以使用这样的格式

小练习


定义一个"匿名函数",它的功能是计算一个输入值的3次幂,将匿名函数赋值给变量power,然后输入一个数值 5,并输出计算结果。

power = lambda number:number*number*number
print(power(5))

立方体体积
定义一个"匿名函数",它的功能是计算立方体的体积,其公式为:长高,将匿名函数赋值给变量 area。

然后传入参数10, 8, 6,并输出计算结果。

area = lambda length,width,height:length*width*height

print(area(10, 8, 6))

匿名函数使用起来比较方便,但是它也有局限性。
lambda 的主体是一个表达式,而不是一个代码块,不适合处理复杂的逻辑情况。
我们在创建函数时,如果需要处理较为复杂的逻辑,建议使用 def 创建函数,如本例所示,计算列表各元素的累加。

在之前的学习中,都是先定义函数以后,在代码的其他地方调用这个函数。
其实,在函数的内部还可以调用自己,这种调用自己函数就是递归函数

递归

一段程序调用自身的过程我们叫做递归,多见于函数调用函数自身。

当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现的。也可以理解为自我复制的过程

语言例子
如果我们用语言的形式表示递归的话,这个通俗的故事最能体现:

从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?'从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?......

接下来,就在案例中,学习递归的使用方法和其中的程序运行逻辑。

递归

递归概念比较抽象,我们来一起梳理下。

假设创建一个递归函数,用于计算数字累加,传入数字 5 ,计算 5 以内的数字累加。
5+4+3+2+1+0

由于 5 大于 0,程序不会执行函数中 if 判断的代码块,而是返回5 + sum(4)
这里的 sum(4)又是一次 sum() 函数的调用,程序就会返回 4 + sum(3)

程序就一直调用自己,直到sum(0),因为if语句的存在,它不需要等待 sum(0) 的计算了,而是直接给出结果0
然后程序一路返回,回到最初的 sum(5),并给出最终的答案:5+4+3+2+1+0 = 15

递归函数会终止么?

在递归函数中,if 判断就是终止条件 ,在本例中当n 小于等于0,就返回0 ,递归就终止了。
如果不加这个终止条件会无休止的递归下去,最终造成程序报错。

类似的,我们要算一个数的阶乘,一个正整数的阶乘是所有小于及等于该数的正整数的积,例如
5! = 5×4×3×2×1

我们可以用图中的代码,当n > 0的时候,函数会调用它本身,直到n <= 0

小练习

200以内求和
写一个递归函数可以实现 200 以内的整数和。

将函数名命名为 sum,传入参数为 n。

# 定义名为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))
赞(1)
未经允许不得转载:工具盒子 » Python基础 – 递归与匿名函数