1. 程式人生 > >第六章 函數[DDT書本學習 小甲魚]【3】

第六章 函數[DDT書本學習 小甲魚]【3】

地圖 函數對象 輸入 第六章 例子 版本 什麽 map 需要

技術分享圖片

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")

第六章 函數[DDT書本學習 小甲魚]【3】