12.用递归函数计算阶乘
def fac(n):if n==0:
return 1
else:
return n*fac(n-1)
print('Enter a positive integer:')
n = int(input())
y = fac(n)
print(y)
13.头递归和尾递归
头递归:在一般条件条件(如n==1)满足时,返回一个确定的值,而在其他情况下,返回一个包含本身函数的递归调用的这种递归设计。如下:
def factorial(int n):if n == 1:
return 1
else:
return factorial(n - 1) * n
尾递归:每一次函数的递归调用都会将一个阶段性的结果传递到下一个被调用的函数中,当最终的一般条件(如这里的n==0)满足时,把最终结果直接返回。
def factorial(n,product):if n == 0:
return product
product = product * n
return factorial(n - 1, product)
在头递归的实现中,我们在进行下一层的调用前,没有进行计算。在下一层返回后,我们才完成了这一层的计算。
在尾递归的实现中,我们在进行下一层的调用前,会先进行计算,而在最终一般条件满足时,会将计算的结果逐层直接返回。
学习递归的函数调用更多的是学习这种与数学归纳法有异曲同工之妙的思想。在遇到问题时,很多情况,我们可以把待问题逐层归约为更简单的问题。递归方式很直观情况下,再优先考虑递归。
14.Python中的迭代器
在python中,如果要访问一个对象中的每一个元素,可以:(以列表为例)
lst = ['j','i','s','u','a','n']for i in lst:
print(i, end = ' ')
除此之外,还能这样:
lst = ['j','i','s','u','a','n']lst_iter = iter(lst)
print(lst_iter.__next__()) # 输出 j
print(lst_iter.__next__()) # 输出 i
...
iter函数是python中内建的系统函数之一——它的作用是返回一个迭代器对象。所有的迭代器对象,在python3中都有 _next_ 方法,其作用 是取得下一个元素。实际上,for循环的实现,就是通过迭代器来完成的。
15.函数作为参数传递
问题:对一列表的每个元素都进行三种运算,然后返回一个新的列表。三种运算如下:
(1)将列表中的每一个元素都求平方
(2)将列表中的每一个元素(数字)转换为字符串
(3)给每一个元素的值加上1
一般先想到的是写三个for循环,但是这些函数的逻辑其实可以分为两个部分:
A.遍历每一个元素,对每一个元素都进行某种操作(如下func_seq函数)
B.具体执行这种操作,也就是上面是那种运算其中之一
def func_seq(func,ls):return [func(i) for i in ls]
def sqrt(num):
return num **2
def to_str(num):
return str(num)
def plus(num):
return num+1
ls = [11, 23, 33]
print(func_seq(sqrt,ls))
print(func_seq(to_str,ls))
print(func_seq(plus,ls))
结果为右
16.Python中的lambda函数
函数式编程是一种编程范式,跟【面向过程编程】和【面向对象编程】具有并列关系。
def func_seq(func, ls):return [func(i) for i in ls]
上面就是我们刚才的func_seq,如果我们要进行的运算比较简单,再写一个函数就麻烦了,为此Python提供了一种特殊的函数 lambda 。
如果我们要定义一个函数:返回参数的值的平方:
sqrt= lambda x : x ** 2print(sqrt(2)) #像调用普通函数一样调用它
C++11,JAVA 8 和C#3.0等。
在python中,lambda函数的正式定义如下:
lambda arg1, args, ... argN: expressions_with_args可见lambda函数可以接受任意多个参数。如:
func = lambda x, y : x + y # 返回 x + y 的值注意:lambda包含的表达式不能超过一个——如果想定义更复杂的东西,最好还是定义一个普通函数。
17.map和reduce
考虑之前的这个代码:
def func_seq(func, ls):return [func(i) for i in ls]
这个函数是对一个列表中的每一个元素应用func函数,然后用得到的新元素建立一个新的列表,并直接返回。而map函数其实和这个func_seq的作用是相同。
map语法如下:
map(function, iterable, ...)# 第一个参数function表示一个函数
# iterable表示一个可迭代对象(如列表)
举例:有一个列表,并定义了一个返回一个数加1的函数:
ls = [11,22,33]plus = lambda x : x + 1
在python 3 中,调用map函数时,我们会得到一个迭代器:
print(map(plus, ls)) # <map object at 0x000001BF7F46C6A0>当我们需要使用map的结果时,我们可以直接用list函数将其转化为一个列表:
>>> list(map(plus, ls01))[2, 2, 3, 4]
iterable后有几个省略号——map可使用的可迭代对象参数个数并不是只有一个。
>>> def abc(a, b, c):... return a * 10000 + b * 100 + c
...
>>> list1 = [11, 22, 33]
>>> list2 = [44, 55, 66]
>>> list3 = [77, 88, 99]
>>> list(map(abc, list1, list2, list3))
[114477, 225588, 336699]
当function的参数不止一个时,map函数将会从后面的可迭代对象里一次选取相同下标的元素,然后“并行”应用于函数function。这里的“并行”是python官方文档原文的直译。
map的function也可以使None——这时函数的作用就是把多个列表相同位置的元素归并到一个元组,如下:
>>> list1 = [11, 22, 33]>>> list2 = [44, 55, 66]
>>> list3 = [77, 88, 99]
>>> list(map(None, list1, list2, list3))
[(11, 44, 77), (22, 55, 88), (33, 66, 99)]
-------------------------------------------
还有一个类似map的函数reduce——也有两个参数:一个函数f,一个list,但行为和map()不同,reduce()传入的函数f必须接受两个参数,reduce()对list()的每个元素反复调用函数f,并返回最终结果值。如求和函数f:
def f(a, b):return a + b
reduce(f,[1,3,5,7,9]) 将以此执行以下计算:
(1)先计算2个元素:f(1,3) ,结果为4
(2)把结果和第3个元素计算:f(4,5) ,结果为9
(3)以此类推——f(9,7),结果为16
(4)f(16,9),结果为25
(5)所有元素都用过了,计算结束,返回结果25
18.汉诺塔问题
def hannuo(n,t1,t2,t3):if n==1:
s = "-->"
seq = (t1,t3)
f= s.join(seq)
print (f)
return
hannuo(n-1,t1,t3,t2)
hannuo(1,t1,t2,t3)
hannuo(n-1,t2,t1,t3)
n = int(input())
hannuo(n,"A","B","C")