think python學習筆記(6)

2021-10-06 22:40:10 字數 3592 閱讀 2912

增量式開發

面對複雜的程式,可以採用增量式開發

增量式開發的目標是通過每次只增加和測試少量**,來避免長時間的除錯

這種開發而關鍵在於

1.從乙個能執行的程式開始,每次只增加少量改動

2.用臨時變數儲存中間值,便於檢查

3.刪除腳手架**

組合寫乙個函式,接受兩個點作為引數,分別是圓心和圓周上一點,然後計算圓的面積

圓心座標xc,yc 圓周上的點的座標儲存在xp和yp中

第一步是計算兩點距離,也就是半徑

radius = diatance(xc,yc,xp,yp)
用得到的半徑計算圓的面積

result = area(radius)
將這些步驟封住在乙個函式裡

def

circle_area

(xc,yc,xp,yp)

: radius = distance(xc,yx,xp,yp)

result = area(radius)

return result

臨時變數radius和result作為中間變數,在函式除錯的過程中很有用,但是如果確定可以正常執行,就可以將他們合併,使程式更加簡潔

def

circle_area

(xc,yc,xp,yp)

:return area(distance(xc,yc,xp,yp)

)

布林函式

函式可以返回布林值,對於隱藏函式內部的複雜測試**非常方便

def

is_divisible

(x,y)

:if x%y ==0:

return

true

else

:return

false

==運算子的返回值就是乙個bool值,可以通過直接返回判斷運算的結果,讓**變得更簡單

def

is_divisible

(x,y)

:return x%y==

0

使用if判斷語句寫條件的時候,當條件返回值是bool型變數,無需加判斷

再談遞迴

計算一些遞迴定義的數學函式。遞迴定義類似迴圈定義,因為定義中包含乙個對已經定義事物的引用

類似階乘

如果可以遞迴定義某樣東西,就可以通過程式計算他,第一步是先決定有哪些形參,階乘很明顯輸入是乙個整型數

def

factorial

(n):

if n==0:

return

1#0的階乘是1,與其他數不同

else

: recurse = factorial(n-1)

result = n*recurse

return result

先是不斷地遞迴,直到n=0不再進行遞迴呼叫,然後將返回的值,再向上層傳遞,傳遞給recurse,進行向上傳遞的階乘運算

信仰之躍

當遇到乙個函式呼叫的時候,不再去跟蹤執行流程,而是假設這個函式正確執行並且返回了正確的結果

遞迴程式也可以這樣理解,當遇到遞迴呼叫時,不用順著執行流程,假設每次遞迴呼叫能夠正確工作,假設函式可以正常得到前n-1的階乘,那麼能否正常得到n的階乘

再舉一例

除了階乘外,使用遞迴定義的最常見的數學函式就是fibonacci(斐波那契數列)

fibonacci(0) = 0

fibonacci(1) = 1

fibonacci(n) = fibonacci(n-1) + fibonacci(n-2)

用**來表示

def

fibonacci

(n):

if n ==0:

return

0elif n ==1:

return

1else

:return fibonacci(n-1)

+fibonacci(n-

2)

通過假設可以很好地驗證這個遞迴寫法的正確性

檢查型別

如果階乘函式輸入1.5會出現無限迴圈,因為在不斷減1的遞迴中,n永遠不會等於0,所以遞迴呼叫永遠不會停止

有兩個方法

第一泛化factorial函式,使其能夠處理浮點數

第二用factorial檢查實參的型別

使用內建函式isinstance來驗證實參的型別,同時確保是正數

def

factorial

(n):

ifnot

isinstance

(n,int):

print

('not int'

)return

none

elif n<0:

print

('negative integars'

)return

none

elif n ==0:

return

1else

:return n*factorial(n-

1)

除錯

將乙個大函式分解為較小的函式為除錯生成了自然的檢查點,如果乙個函式的執行沒有按照預期,有三個可能

1.該函式獲得的實參有問題,違反先決條件

2.該函式的問題,違反後置條件

3.返回值或者它的使用方法有問題

通過在函式開頭和return前新增print,來顯示執行流程

迭代即重複執行某個**塊的能力,在遞迴中也利用了遞迴實現了迭代,在for迴圈中也可以實現迭代,接下來使用while語句實現迭代

重新賦值

多同一變數進行多次賦值是合法的,新的賦值會使得已有的變數指向新的值

注意賦值與相等的區別

更新變數

重新賦值的乙個常見方式是更新,更新操作中變數的新值會取代舊值

更新變數一定要先確定變數存在

要先對它進行初始化

while語句

def

countdown

(n):

while n>0:

print

(n) n = n-

1print

('blastoff'

)

while流程

1.判斷條件為真還是假

2.如果為假,退出while語句,然後執行接下來的語句

3.如果為真,則執行while語句體,執行後返回第一步

重點改變量的值,不要產生無限迴圈

break

有些時候迴圈執行到一半才結束迴圈,這種情況下,你可以使用break語句來跳出迴圈

while

true

: line =

input

('>'

)if line == done:

break

print

(line)

print

('done'

)

迴圈條件是true,所以迴圈會一直執行直到碰到break

think python學習筆記(5)

鏈式條件 當有多個可能的時候,我們需要多個分支 表示這種情況的方法之一是鏈式條件 if x y print 0 elif xprint 1 else print 2 elif是else if的縮寫,elif語句數目沒有限制,如果只有乙個else1從句,那麼這個從句必須在最末,但這個語句並不是必須的 ...

think python學習筆記(7)

平方根 迴圈常用於計算數值的程式中,這類程式一般從乙個大概的值開始,然後迭代式的進行改進 例如,牛頓法是計算平方根的一種方法 當我們想求a的平方根時,從任意乙個估算值開始x,利用下面的公式可以計算出更為精確地估算值 y x a x 2 得到的y的值會更加接近平方根的真實值,不斷的用y去代替x,利用這...

think python學習筆記(12)

字典和列表 在字典中,列表可以作為值出現。例如,當倒轉字典的時候,可能有的鍵對應的值,就是由列表組成的 def invert dict d inverse dict for key in d val d key if val not in inverse inverse val key else i...