1.递归函数:
def func(n): if n ==1: return 1 return n*func(n-1) print(func(5)) 结果是 120
2.执行过程如下图:
见书上147页
递归的特性;
1.递归函数必须有一个明确的结束·条件
2.每一次进入更深递归时,问题的规模相比上一次都要减少
3.递归效率不搞,而且容易溢出
递归·的第二个程序:(关于问路)
person_list = ['alex','wupeiqi','yuanhao','linhaifeng'] def ask_way(person_list): if len(person_list) ==0: return '没有人知道' person = person_list.pop(0) if person == 'linhaifeng': return '%s说我知道老男孩就在沙河地铁站旁边'%person print('hi美男(%s),敢问路在何方'%person) print('%s回答道,我不知道,但念在你慧眼是猪,你等着我帮你问问%s'%(person,person_list)) res =ask_way(person_list) print('%s 问的结果时:%s'%(person,res)) return res res = ask_way(person_list) print(res) 结果是: hi美男(alex),敢问路在何方 alex回答道,我不知道,但念在你慧眼是猪,你等着我帮你问问['wupeiqi', 'yuanhao', 'linhaifeng'] hi美男(wupeiqi),敢问路在何方 wupeiqi回答道,我不知道,但念在你慧眼是猪,你等着我帮你问问['yuanhao', 'linhaifeng'] hi美男(yuanhao),敢问路在何方 yuanhao回答道,我不知道,但念在你慧眼是猪,你等着我帮你问问['linhaifeng'] yuanhao 问的结果时:linhaifeng说我知道老男孩就在沙河地铁站旁边 wupeiqi 问的结果时:linhaifeng说我知道老男孩就在沙河地铁站旁边 alex 问的结果时:linhaifeng说我知道老男孩就在沙河地铁站旁边 linhaifeng说我知道老男孩就在沙河地铁站旁边
3.作用域的问题:如果只是函数名则代表地址,如果是函数名()则代表运行程序:
name = 'alex ' def foo(): name='lichengguang' def bar(): print(name) return bar b =foo() 如果是这只会执行foo函数,返回bar函数的地址 print(b) c =foo()() 如果是这个则运行玩foo之后便会运行bar函数 print(c) 结果是:<function foo.<locals>.bar at 0x0000018E3D975620> lichengguang None
4.匿名函数:lambda:用于创建匿名函数,语法格式是:(lambda:形参(可以是多个):expression;experssion是一个表达式,自动带有retrun返回值:
func = lambda x:x+1 b=func(10) print(b) 结果是: 11
5.与def相比;lambda函数有许多不同的地方;
1.def创建的函数时有名称的,而lambda没有函数名称,
2.lambda返回的结果通常是一个对象或者是一个表达式,他不会是将一个结果赋给一个变量,而def可以
3.lambda只是一个表达式,而def是一个语句
4.lalmbda表达式后面只能跟一个表达式,def可以跟多个表达式
5.像if和for语句不能用于lambda语句中,def可以
6.lambda一般可以用来定义简单函数,而def可以定义复杂的函数
77.如果使用lambda函数表达式中有多个变量必须使用括号括起来(即以元组的形式来表达)
错的案例: func = lambda x,y,z:x+1,y+1,z+1 b=func(1,3,4) print(b) 结果是: File "D:/python 程序/第八天/第八天.py", line 30, in <module> func = lambda x,y,z:x+1,y+1,z+1 NameError: name 'y' is not defined 正确的案列: func = lambda x,y,z:(x+1,y+1,z+1) b=func(1,3,4) print(b) 返回结果是 (2, 4, 5)
6.常用的函数:
6.1.map函数
1.将集合中所有的元素平方并输出:
num_1 = [1,2,10,3,5,6] ret=[] def map_test(array): for i in num_1: ret.append(i**2) return ret ret =map_test(num_1) print(ret) 结果是: [1, 4, 100, 9, 25, 36]
2.如果使用map函数来写:(注:如果使用map函数会根据提供的的函数对指定的序列进行映射)map的格式为:map(func,*iterables)-》objects
第一个参数是函数的名称,第二个参数是一个迭代类型,他返回的结果是一个object类型;map的功能是以参数序列中的每一个元素分别调用func()函数,把每次调用的结果保存到返回值中。
num_1 = [1,2,10,3,5,6] def map_test(x): return x**2 b=map(map_test,num_1) #方法一: 使用函数 print(list(b)) c =map(lambda x :x**2,num_1) #方法二:使用lambda print(list(c)) 结果是: [1, 4, 100, 9, 25, 36] [1, 4, 100, 9, 25, 36]
6.2filter函数:
1. 请找出列表中不带sb的元素并返回列表:
movie_people = ['sb_alxe','sb_wupeiqi','linhanfeng','sb_yuanhao'] def filter_test(array): ret = [] for p in array: if not p.startswith('sb'): ret.append(p) return ret print(filter_test(movie_people) )
2.使用filter函数来进行编写,filter()函数对指定的序列执行过滤操作。filter()函数方法:filter(func or none,iterables)---->objects,在上述定义中,第一个参数可以是函数名称或者是None,第二个参数可以是可迭代类型,返回值是一个object类型的数据类型对象。如果第一个参数是func,他只是接收一个参数,而且返回值是一个布尔值(True或False)
方法一: num_1 = [1,3,4,6,7,5,11] result =filter(lambda x:x%2,num_1) print(list(result)) 方法二·: num_1 = [1,3,4,6,7,5,11] def filter_test(array): ret =[] for p in array: if p %2: ret.append(p) return ret print(filter_test(num_1)) 结果是: [1, 3, 7, 5, 11]
6.3reduce函数:
1.计算列表里所有元素的和:
num_1 = [1,3,4,6,99,20] def reduce_test(array): res = 0 for num in array: res+=num return res print(reduce_test(num_1)) 结果是: 133
2.使用reduce函数来做:reduce函数会对参数序列里所有的元素进行累计。reduce()函数的定义如下:reduce(function,sequence[,initial])--->value,在上述定义上,function()是一个带两个参数的函数,第二个参数可以是序列、元组、字符串;initial表示固定的初始值,reduce会一次从seqence中取出每一个元素,和上一次调用的func的结果作为参数再次在调用func ,而且使用此功能要先调用: from functools import reduce
num_1 = [1,3,4,199] print(reduce(lambda x,y:x+y,num_1,1)) 结果是: 208
第二个, from functools import reduce result =reduce(lambda x,y:x+y,['aa','bb','cc'],'dd') print(result) 结果是: ddaabbcc