学习目标:lambda表达式和递归的方法
学习内容:
lambda表达式:
lambda表达式与def的区别:
lambda表达式是一个表达式,会创建一个函数对象,但不会把函数对象赋给一个标识符,而def是一个语句,会把函数对象赋值给一个变量。
关于lambda表达式的使用:
>>> g=lambda x:2*x+1
>>> g(5)
11
>>> g=lambda x:2*x+1
>>> f=[g(x) for x in range(10)]
>>> print(f)
SyntaxError: invalid character in identifier
>>> print(f)
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
>>> g=lambda x,y:x+y
>>> g(3,4)
7
filter相当于一个过滤器:
>>> list(filter(None,[1,0,False,True]))
[1, True]
>>> def odd(x):
return x%2
>>> temp = range(10)
>>> show = filter(odd,temp)
>>> list(show)
[1, 3, 5, 7, 9]
>>> list(filter(lambda x:x%2,range(10)))
[1, 3, 5, 7, 9]
map表示一个映射关系
>>> list(map(lambda x:x%2,range(10)))
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
关于def与lambda的联合使用
>>> def f(n):
return lambda s:s*n
>>> d=f(2)
>>> print(d(8))
16
>>> print(d('carrot'))
carrotcarrot
zip将两个数以元祖的形式绑定在一起,下面介绍zip的解压*zip
>>> a=[1,2,5,6,7]
>>> b=[2,3,7,8,9]
>>> list(zip(a,b))
[(1, 2), (2, 3), (5, 7), (6, 8), (7, 9)]
>>> a1,a2=zip(*zip(a,b))
>>> list(a1)
[1, 2, 5, 6, 7]
>>> list(a2)
[2, 3, 7, 8, 9]
如果想以列表的形式打包,可以使用map:
>>> list(map(lambda x,y:[x,y],[1,2,3,5,6],[2,6,7,8,9]))
[[1, 2], [2, 6], [3, 7], [5, 8], [6, 9]]
使用filter函数和lambda表达式求出100以内所有3的倍数:
>>> a=list(filter(lambda x:not(x%3),range(1,100)))
>>> a
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
>>> a=list(filter(lambda x:x if x%3==0 else None,range(1,100)))
>>> a
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
递归:
编写函数f(x,y),计算并返回x的y次幂的值
#常规写法
>>> def f(x,y):
result=1
for i in range(y):
result*=x
return result
>>> a=f(2,4)
>>> print(a)
16
#递归写法
>>> def f(x,y):
if y==0:
return 1
else:
return x*f(x,y-1)
>>> a=f(2,4)
>>> print(a)
16
递归求汉诺塔:将x盘移动到z盘
def hanoi(n,x,y,z):
if n == 1:
print(x,'--<',z)
else:
hanoi(n-1,x,z,y)##将前n-1个盘子从x移动到y上
print(x,'--<',z)#将最底下的最后一个盘子从x移动到z
hanoi(n-1,y,x,z)#将y上的n-1个盘子移动到z上
#这里中间的两个z,x相当于中间变量
n=int(input('请输入汉诺塔的层数:'))
hanoi(n,'X','Y','Z')
改用递归方法判断回文联:
def f(words,start,end):
if start>end:
return 1
else:
if words[start]== words[end]:
return f(words,start+1,end-1)
else:
0
a=input('请输入一段文字:')
end=len(a)-1
if f(a,0,end):
print('%s是一个回文联'%a)
else:
print('%s不是一个回文联'%a)