python复习21~24lambda表达式和递归

学习目标: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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值