增量式開發
面對複雜的程式,可以採用增量式開發
增量式開發的目標是通過每次只增加和測試少量**,來避免長時間的除錯
這種開發而關鍵在於
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...