内容正文:
任务5.2 特殊函数
打印斐波那契数列
同学们,这一节,我们来讲一下特殊函数,主要是递归函数,匿名函数,map函数以及filter函数
5.2 特殊函数——打印斐波那契数列
【任务描述】
递归是编程语言中较难学的知识点,但小T不畏困难,想要通过斐波那契数列学习递归。斐波那契数列(Fibonacci Sequence),又称黄金分割数列,由数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例引入,故又称“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34。
5.2 特殊函数——打印斐波那契数列
【任务分析】
在数学上,斐波那契数列以递归的方法定义:F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2)(n>=2,n∈N*),从定义可知,函数的每次调用都是对自己的调用。fib(n-1)+fib(n-2)就是调用了函数本身实现递归。递归的计算过程简述如下(假设n=3):
(1)n=3,fib(3),判断为计算fib(3-1)+fib(3-2)。
(2)看fib(3-1),即fib(2),返回结果为1。
(3)看fib(3-2),即fib(1),返回结果也为1。
(4)计算第(1)步,结果为fib(n-1)+fib(n-2)=1+1=2,将结果返回。
5.2 特殊函数——打印斐波那契数列
递归函数
匿名函数
map()函数
filter()函数
reduce()函数
前面小节我们看到函数可以调用其他函数的函数实例。例如,函数A可以调用函数B,而函数 B 又可以调用函数 C。实际上,函数也可以调用它自己。调用自己的函数称为递归函数
5.2 特殊函数——打印斐波那契数列
5.2.1 递归函数
5.2.2 匿名函数
5.2.3 map()函数
5.2.4 filter()函数
5.2.5 reduce()函数
5.2.1 递归函数
同学们,这一节,我们来讲一下特殊函数,主要是递归函数,匿名函数,map函数以及filter函数
5.2.1 递归函数
函数也可以调用它自己,调用自己的函数称为递归函数。
n!=1*2*3*4*......*n
我们来看个例子,图中是求n阶乘的递归过程,以n=5为例,计算factorial(5),factorial=5*factorial(4),需要调用factorial(4),而factorial(4)=4*factorial(3),又需要调用factorial(3),直到factorial(1)=1,返回函数值,不再递归调用。有了factorial(1)=1,就可以得到factorial(2),factorial(3),factorial(4),最终得到factorial(5)的值为120。 由些我们可知,每个递归函数必须包括两个主要部分。
(1)终止条件。表示递归的结束条件,用于返回函数值,不再递归调用。在factorial()函数中,递归的结束条件为“n=1”。
(2)递归步骤。递归步骤把第n步的函数与第n-1步的函数关联。对于factorial()函数,其递归步骤为“n*factorial(n-1)”,即把求n的阶乘转化为求n-1的阶乘。
5.2.1 递归函数
def func(n):
if n==1:
result=1
else:
result=func(n-1)*n
n=int(input('输入一个正整数:'))
print('%d!=%d'%(n,func(n)))
上面是求n阶乘的递归函数定义,在定义中,我们可知,递归终止条件为n等于1,递归步骤,为func(n-1)*n。从键盘输入一个正整数n,通过调用func(n)函数,得得n的阶乘,最后通过格式化输出。
5.2.2 匿名函数
同学们,这一节,我们来讲一下特殊函数,主要是递归函数,匿名函数,map函数以及filter函数
5.2.2 匿名函数
lambda [arg1 [,arg2,.....argn]]:expression
匿名函数,即函数没有具体的名称。Python允许使用lambda语句创建匿名函数,从而省去定义函数的过程。它的语法格式为:
(1)[arg1 [,arg2,.....argn]]:参数
(2)expression:返回值
lambda语句中冒号前是函数参数,如有多个函数参数须使用逗号分隔,冒号后是返回值。
lambda接受的参数数量不是固定的,可运用多个参数。
匿名函数,也就是说函数没有具体的名称。Python允许使用lambda语句创建匿名函数,从而省去定义函数的过程。它的使用格式为:lambda [arg1 [,arg2,.....argn]]:expression 。lambda语句中冒号前是函数参数,如有多个函数参数须使用逗号分隔,冒号后是返回值。
lambda接受的参数数量不是固定的,可运用多个参数。
5.2.2 匿名函数
两数之和
【例5-17】匿名函数的定义及使用。
sum=lambda arg1,arg2:arg1+arg2
print("运行结果:",sum(10,20))
print("运行结果:",sum(20,20))
30
40
我们来看一个例子,在这里使用lambda定义了一个匿名函数,参数为arg1和arg2,返回值为arg1和arg2的和。运行结果为30与40。同学们这里的sum不是函数的名称,而是一个变量,指向匿名函数的内存空间。可以通过变量名括号,参数来调用匿名函数,在一些场合不需要变量,直接写上匿名函数即可。
5.2.2 匿名函数
两数之和
【例5-17】匿名函数的定义及使用。
sum=lambda arg1,arg2:arg1+arg2
print("运行结果:",sum(10,20))
print("运行结果:",sum(20,20))
30
40
我们来看一个例子,在这里使用lambda定义了一个匿名函数,参数为arg1和arg2,返回值为arg1和arg2的和。运行结果为30与40。同学们这里的sum不是函数的名称,而是一个变量,指向匿名函数的内存空间。可以通过变量名括号,参数来调用匿名函数,在一些场合不需要变量,直接写上匿名函数即可。
5.2.2 匿名函数
(1)无参匿名函数
t=lambda:True
print(t())
(2)带参数匿名函数
lambda x: x**3 #一个参数
lambda x,y,z:x+y+z #多个参数
lambda x,y=3: x*y #允许参数存在默认值
我们来看一个例子,在这里使用lambda定义了一个匿名函数,参数为arg1和arg2,返回值为arg1和arg2的和。运行结果为30与40。同学们这里的sum不是函数的名称,而是一个变量,指向匿名函数的内存空间。可以通过变量名括号,参数来调用匿名函数,在一些场合不需要变量,直接写上匿名函数即可。
5.2.2 匿名函数
(a)lambda定义的是单行函数,如果需要复杂的函数,应使用def语句。
(b)lambda语句有且只有一个返回值。
(c)lambda语句可以包含多个参数。
(d)lambda语句中的表达式不能含有命令,且仅一条表达式。这是为了避免匿名函数的滥用,过于复杂的匿名函数不易于解读。
在使用匿名函数时,我们要注意以下几点:
(a)lambda定义的是单行函数,如果需要复杂的函数,应使用def语句。
(b)lambda语句有且只有一个返回值。
(c)lambda语句可以包含多个参数。
(d)lambda语句中的表达式不能含有命令,且仅一条表达式。这是为了避免匿名函数的滥用,过于复杂的匿名函数不易于解读。
5.2.2 匿名函数
边学边练:
快速编写一个匿名函数实现如下功能:输入两个整数,输出它们的和。
$$