第八天
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


浙公网安备 33010602011771号