在 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))