内容正文:
任务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.3 map函数
同学们,这一节,我们来讲一下特殊函数,主要是递归函数,匿名函数,map函数以及filter函数
2.2.3 map函数
map(function, iterable, ...)
map()函数是Python的内置高阶函数,会根据提供的函数对指定序列做映射。其语法格式如下:
(1)function:函数
(2)iterable:一个或多个序列
这个函数是将function应用于iterable中的每一个元素,并将结果以列表的形式返回。
map函数是Python内置的高阶函数,会根据提供的函数对指定序列做映射。所谓高阶函数就是把函数作为参数或者返回值的一类函数。
map函数形式如下:map(function, iterable, ...),function是指一个函数,iterable是指一个或多个序列。map函数就是将function应用于iterable的每一个元素,结果以列表的形式返回。
2.2.3 map函数
func=lambda x:x+2
result=map(func,[1,2,3,4,5])
print(list(result))
[3, 4, 5, 6, 7]
【例5-18】map()函数的使用。
我们来看一个例子,这里定义了一个匿名函数,并用变量func指向匿名函数的内存地址,同时又定义了一个map函数,里面两个参数,一个是匿名函数,一个是列表,根据map函数的定义,将func匿名函数分别作用于列表中的元素,而匿名函数的功能是把参数+2后,作为返回值返回。所以结果为返回一个列表,里面的值 为3,4,5,6,7。
2.2.3 map函数
边学边练:
利用map()函数,把用户输入的不规范的英文名字变为首字母大写、其他字母小写的规范名字。
5.2.4 filter函数
同学们,这一节,我们来讲一下特殊函数,主要是递归函数,匿名函数,map函数以及filter函数
5.2.4 filter函数
filter(function, iterable)
filter()函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表
(1)function:判断函数
(2)iterable:可迭代对象
filter函数的作用是接收一个函数func和一个list,函数func的作用是对每个元素进行判断,通过返回True或False来过滤掉不符合条件的元素,符合条件的元素组成新list。
filter()函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。filter函数格式如下:filter(function, iterable)
这里的function是判断函数,iterable是可迭代对象。filter函数的作用是接收一个函数func和一个list,函数func的作用是对每个元素进行判断,通过返回True或False来过滤掉不符合条件的元素,符合条件的元素组成新list。
5.2.4 filter函数
func=lambda x:x%2
result=filter(func,[1,2,3,4,5])
print(list(result))
[1,3,5]
2
3
4
5
1
1
3
5
return x%2
seq
function
newList
True
filter
【例5-19】filter()函数的使用。
相比map()的全部保留,filter()只会留下符合要求的部分。filter()函数接收两个参数,第一个为函数,第二个为序列。序列的每个元素作为参数传递给函数进行判断,然后返回True或False,最后将返回True的元素存放到新列表中,如下图5-6所示。
我们来看一个实例,在这里首先定义一个匿名函数,匿名函数的作用是对传入的参数对2求余。同时又定义一个filter函数,其中的过滤函数为func,可迭代对象为列表,里面的元素为1,2,3,4,5。 filter函数用匿名函数分别作用于列表,匿名函数的作用是对2求余,所以奇数的值为1,偶数为0,转为布尔值为true,False,所以最终奇数被保留下来。 好了同学们,特殊函数这一节我们就讲到这里。
5.2.5 reduce()函数
同学们,这一节,我们来讲一下特殊函数,主要是递归函数,匿名函数,map函数以及filter函数
5.2.5 reduce()
reduce(function, iterable[, initializer])
reduce()函数将一个数据集合(链表、元组等)中的所有数据进行下列操作:先用reduce()中的函数function(有两个参数)对集合中的第1、2个元素进行操作,然后将得到的结果与第三个数据用function函数运算,最后得到一个结果。reduce()函数的语法格式如下:
(1)function:函数,有两个参数。
(2)iterable:可迭代对象。
(3)initializer:可选,初始参数
filter()函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。filter函数格式如下:filter(function, iterable)
这里的function是判断函数,iterable是可迭代对象。filter函数的作用是接收一个函数func和一个list,函数func的作用是对每个元素进行判断,通过返回True或False来过滤掉不符合条件的元素,符合条件的元素组成新list。
5.2.4 filter函数
15
15
【例5-20】reduce()函数的使用。
from functools import reducedef add(x, y) : # 两数相加 return x + ysum1 = reduce(add, [1,2,3,4,5]) # 计算列表和:1+2+3+4+5sum2 = reduce(lambda x, y: x+y, [1,2,3,4,5]) # 使用 lambda 语句创建匿名函数print(sum1)print(sum2)
我们来看一个实例,在这里首先定义一个匿名函数,匿名函数的作用是对传入的参数对2求余。同时又定义一个filter函数,其中的过滤函数为func,可迭代对象为列表,里面的元素为1,2,3,4,5。 filter函数用匿名函数分别作用于列表,匿名函数的作用是对2求余,所以奇数的值为1,偶数为0,转为布尔值为true,False,所以最终奇数被保留下来。 好了同学们,特殊函数这一节我们就讲到这里。
5.2.6 任务实现——打印斐波那契数列
大家好,这一节我们讲解如何用python的递归函数来实现斐波那契数列的打印
16
5.2.6 任务实现——打印斐波那契数列
【任务描述】
斐波那契数列(Fibonacci Sequence),又称黄金分割数列,由数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例引入,故又称“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34。请用递归函数实现以上数列的打印。
5.2.6 任务实现——打印斐波那契数列
【任务分析】
为了明确递归的过程,下面简述一下计算过程(假设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.6 任务实现——打印斐波那契数列
def fib_recur(n):
assert n >= 0
if n in (0, 1):
return n
return fib_recur(n - 1) + fib_recur(n - 2)
for i in range(20):
print(fib_recur(i), end=" ")
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
【例5-20】reduce()函数的使用。
下面我们来看python实现该任务的具体代码,首先定义一个递归函数fib_recur(n),函数体里面assert是一个断言,直接用于判断一个表达式,在表达式条件为 false 的时候触发异常。
断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况。这个递归函数体内设置断言,是要满足n>=0的条件,如果不满足,直接触发异常,if n in(0,1) return n,该语句判断n的值,当n的值为0,函数的返回值为0,当n的值为1的时候,返回值为1。当大于等于2的时候,则返回fib_recur(n - 1) + fib_recur(n - 2),即调用函数本身,也即开始递归,层层下去,n-1,n-2,n-3直到n的值为1。然后再层层上去,得到fib_recur(n)的值。这里的for I in range(20): print(fib_recur(i), end=“ ”)语句是一个循环语句,依次遍历0,1,2,3,4…到19,并计算相应的值,进行输出。最后的输出结果为斐波那契数列的前20项
19
$$