6.5 lambda表达式 谐音:懒不嗒?lam-b-da 匿名函数
代码
def my(x):
teturn 2*x+1
e=my(5)
print(e)
---------------------
11
如果使用lambda语句来定义,会是这样
lambda x:2*x+1 返回的是一个函数对象
进行使用,代码如下
g=lambda x:2*x+1
print(g(5))
------------------------
11
=========================================================
练习修改普通函数为匿名函数
def add(x,y):
return x+y
print(add(3,4))
------------ 修改后 -----------
g=lambda x,y:x+y
print(g(3,4))
总结,lambda函数的作用
1)写一些执行脚本时候,省下定义过程,可以使得代码更加精简。
2)程序执行只需要调用少数次,起名头疼,可以不必考虑命名问题。
3)简化代码可读性。
介绍两个BIF filter()和map()
1.filter() 俗称过滤器 2个参数,前面为None或者函数,后面为迭代数据,将
后面的每个元素作为函数的参数进行计算,把返回为True的值筛选出来。
代码如下
temp=filter(None,[1,0,True,False])
print(list(temp))
-------------运行结果-------------
[1,True]
利用这个BIF,尝试写一个筛选奇数的过滤器
def fun(x):
return x%2
temp=filter(fun,range(10))
print(temp)
-----------------------------------
[1,3,5,7,9]
===============================================
学习了lambda后,可以简化为一行
print(list(filter(lambda x:x%2,range(10))))
2.map() 不是地图的意思,映射。将每个元素进行处理。
print(list(maplambda x:x*2,range(10))))
-------------------------------------------
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
6.6递归
6.6.1递归是什么?从原理上来讲就是函数调用自身的这么一个行为。
代码例子
def fun():
fun()
fun()
可以无限循环下去,Python处于善意保护,限制了1000层。
设置递归深度的限制方法如下
import sys
sys.setrecursionlimit(100000)
6.6.2写一个求阶乘的函数
def jc(x):
k=x
for i in range(1,x):
k*=i
return k
e=int(input("请输入一个整数:"))
d=jc(e)
print("【%d】的阶乘结果是:【%d】"%(e,d))
-------------------------------------------------
请输入一个整数:5
【5】的阶乘结果是:【120】
普通的函数实现,大家都会,再来看看递归版本的代码
def myfun(n):
if n==1:
return 1
else:
return n*myfun(n-1)
------------以上是递归写法-------------------
e=int(input("请输入一个整数:"))
d=myfun(e)
print("【%d】的阶乘结果是:【%d】"%(e,d))
================================================
递归的条件 1.调用函数本身 2.设置了正确的返回条件
6.6.3 这帮兔崽子 斐波那契数列Fibonacci
月数1 2 3 4 5 6 7 8 9
对数1 1 2 3 5 8 13 21 34
---------------------------------------------------
数学函数定义为 n=1时 f(n)=1
n=2时 f(n)=1
n>2时 f(n)=f(n-1)+f(n-2)
题目:20个月后,共有多少对兔子?
==========================================
迭代实现代码如下
def tuzi(n):
a1=1
a2=1
a3=1
if n<1:
print("输入有误!")
return -1
while n>2:
a3=a1+a2
a1=a2
a2=a3
n-=1
return a3
b=tuzi(20)
if b!=-1:
print("20个月后一共有%d对兔子"%b)
----------------------------------------
20个月后一共有6765对兔子
=======================================================
递归实现代码如下
def tu(n):
if n<1:
print("你的输入有误")
return -1
if n==1 or n==2:
return 1
else:
return tu(n-1)+tu(n-2)
jieguo=tu(20)
if jieguo!=-1:
print("20个月后一共有%d对兔子"%jieguo)
----------------------------------------
20个月后一共有6765对兔子
============== 递归有优势 也有劣势 必须使用得当 ====================
6.6.4 汉诺塔【难点,未突破,放置......】
代码如下
def hnt(n,x,y,z)
if n==1:
print(x,"------->",z) #如果只有一层,直接从x移动到z
else:
hnt(n-1,x,z,y)#将前n-1个盘子从X移动到Y上
print(x,"------->",z)将#最底下的第64个盘子从X移动到Z上
hnt(n-1,y,x,z)将#Y上的63个盘子移动到Z上
n=int(input("请输入汉诺塔的层数:"))
hnt(n,"X","Y","Z")