1.递归函数
我们知道,一个函数的内部可以调用其他函数。但是,吐过一个函数在内部不调用其他的函数,而是调用自身的话这个函数就是递归函数。
接下来,通过一个计算阶乘n! = 1 * 2 * 3 * ... * n的例子来演示递归函数的使用。
def fn(num):
if num == 1:
result = 1
else:
result = fn(num - 1) * num
return result
n = int(input("请输入一个正整数:"))
print("%d! ="%n,fn(n))
运行结果:
接下来通过图来描述阶乘5!算法的执行原理。
2.匿名函数
简单来说,匿名函数就是没有名称的函数,也就是不再使用def语句定义的函数。如果要声明匿名函数,则需要使用lambda关键字,匿名函数的声明格式如下:
lambda[arg1[,arg2,...,argn]]:expression
上述格式中,"[arg1[,arg2,...,argn]]"表示的是函数的参数,"expression"表示的是函数的表达式。
sum = lambda arg1, arg2: arg1 + arg2
#调用sum函数
print("运行结果:", sum(10,20))
print("运行结果:", sum(20,20))
运行结果:
需要注意的是,使用lambda声明的匿名函数能接受任何数量的参数,但只能返回一个表达式的值。匿名函数不能直接调用print(),因为lambda需要一个表达式。
某些场景下,匿名函数非常有用。假设之前我们要对两个数进行运算,如果希望声明的函数支持所有的运算,可以将匿名函数作为函数参数传递。
def fun(a,b,opt):
print("a =%d" %a)
print("b =%d" %b)
print("result = ",opt(a,b))
fun(11,22,lambda x, y:x + y)
print("-------------------")
fun(11,22,lambda x,y:x-y)
运行结果:
除此之外,匿名函数还通常作为内置函数的参数来使用。
students = [
{"name":"喜小乐","age":18},
{"name":"石敢当","age":17},
{"name":"扬州蟹","age":19}
]
#按name排序
students.sort(key = lambda x:x["name"])
print("按name排序后的结果为:",students)
#按age排序
students.sort(key = lambda x:x["age"])
print("按age排序后的结果为:",students)
运行结果:注意:与def相比,lambda创建的函数有很多不同的地方。def创建的函数是有名称的,而lambda没有函数名称,这是最明显的区别之一。
lambda返回的结果通常是一个对象或者一个表达式,它不会将结果赋给一个变量,而def则可以。
lambda只是一个表达式,函数体比def简单很多,而def是一个语句。
lambda表达式的冒号后面只能有一个表达式,def则可以有多个。
像if或for等语句不能用于lambda中,def则可以。
lambda一般用来定义简单的函数,而def可以定义复杂的函数。
lambda函数不能共享给别的程序调用,def可以。
Python其实没有那么难。