python程序設(shè)計思想
0 Python編程思想
1 基本的程序設(shè)計模式
2?解決復雜問題的有效方法:自頂向下(設(shè)計)
2.1?自頂向下-分而治之
將一個總問題表達為若干個小問題組成的形式
使用同樣方法進一步分解小問題
直至,小問題可以用計算機簡單明了的解決
2.2 舉例1:體育競技分析
2.2.1 程序總體框架
2.2.2 程序設(shè)計
# 導入python資源包from random import random# 用戶體驗模塊def printIntro():print("這個程序模擬兩個選手A和B的某種競技比賽")print("程序運行需要A和B的能力值(以0到1之間的小數(shù)表示)")# 獲得A和B的能力值與場次模塊def getIntputs():a = eval(input("請輸入A的能力值(0-1):"))b = eval(input("請輸入B的能力值(0-1):"))n = eval(input("模擬比賽的場次:"))return a, b, n# 模擬n局比賽模塊def simNGames(n, probA, probB):winsA, winsB = 0, 0for i in range(n):scoreA, scoreB = simOneGame(probA, probB)if scoreA > scoreB:winsA += 1else:winsB += 1return winsA, winsB# 判斷比賽結(jié)束條件def gameOver(a, b):return a == 15 or b == 15# 模擬n次單局比賽=模擬n局比賽def simOneGame(probA, probB):scoreA, scoreB = 0, 0serving = "A"while not gameOver(scoreA, scoreB):if serving == "A":if random() < probA:scoreA += 1else:serving = "B"else:if random() < probB:scoreB += 1else:serving = "A"return scoreA, scoreB# 打印結(jié)果模塊def printSummary(winsA, winsB):n = winsA + winsBprint("競技分析開始,共模擬{}場比賽".format(n))print("選手A獲勝{}場比賽,占比{:0.1%}".format(winsA, winsA / n))print("選手B獲勝{}場比賽,占比{:0.1%}".format(winsB, winsB / n))def main():printIntro()probA, probB, n = getIntputs() # 獲得用戶A、B能力值與比賽場次NwinsA, winsB = simNGames(n, probA, probB) # 獲得A與B的場次printSummary(winsA, winsB) # 返回A與B的結(jié)果main()
2.2.3 測試結(jié)果
2.3 舉例2:的斐波那契數(shù)列
cache = {}def fib(number):if number in cache:return cache[number]if number == 0 or number == 1:return 1else:cache[number] = fib(number - 1) + fib(number - 2)return cache[number]if __name__ == '__main__':print(fib(35))
14930352>
3 逐步組建復雜系統(tǒng)的有效測試方法:自底向上(執(zhí)行)
3.1?自底向上-模塊化集成
任何時候棧中符號串和剩余符號串組成一個句型,當句柄出現(xiàn)在棧頂符號串中時,就用該句柄進行歸約,這樣一直歸約到輸入串只剩結(jié)束符、棧中符號只剩下開始符號,此時認為輸入符號串是文法的句子,否則報錯。
3.2 舉例:0-1背包問題
3.2.1 問題描述
3.2.2 自底向上分析
該物品的重量大于背包的總重量,不考慮,換下?個商品;
該商品的重量小于背包的總重量,那么嘗試把它裝進去,如果裝不下就把其他東西換出來,看看裝進去后的總價值是不是更高了,否則還是按照之前的裝法;
極端情況,所有的物品都裝不下或者背包的承重能力為0,那么總價值都是0;
3.2.3 程序設(shè)計
# 循環(huán)的?式,自底向上求解cache = {}items = range(1,9)weights = [10,1,5,9,10,7,3,12,5]values = [10,20,30,15,40,6,9,12,18]# 最?承重能?W = 4def knapsack():for w in range(W+1):cache[get_key(0,w)] = 0for i in items:cache[get_key(i,0)] = 0for w in range(W+1):if w >= weights[i]:if cache[get_key(i-1,w-weights[i])] + values[i] > cache[get_key(i-1,w)]:cache[get_key(i,w)] = values[i] + cache[get_key(i-1,w-weights[i])]else:cache[get_key(i,w)] = cache[get_key(i-1,w)]else:cache[get_key(i,w)] = cache[get_key(i-1,w)]return cache[get_key(8,W)]def get_key(i,w):return str(i)+','+str(w)if __name__ == '__main__':# 背包把所有東西都能裝進去做假設(shè)開始print(knapsack())
29>

推薦閱讀
(點擊標題可跳轉(zhuǎn)閱讀)
教你用Python制作實現(xiàn)自定義字符大小的簡易小說閱讀器
【專家推薦】保姆級開源工具推薦,一用一個爽,非常勁爆(收藏系列)
【恭喜考研擬錄取】極力推薦科研必備軟件,讓你科研生涯事半功倍
匯總超全Matplotlib可視化最有價值的 50 個圖表(附?Python 源代碼)(一)
老鐵,三連支持一下,好嗎?↓↓↓


點分享

點點贊

點在看
評論
圖片
表情



