首頁  >  文章  >  後端開發  >  一起聊聊python程式設計思想

一起聊聊python程式設計思想

WBOY
WBOY轉載
2022-06-27 13:55:052720瀏覽

這篇文章為大家帶來了關於python的相關知識,其中主要整理了程式設計想法的相關問題,Python是一種物件導向oop(Object Oriented Programming)的腳本語言,程式設計想法的核心就是理解功能邏輯,下面一起來看一下,希望對大家有幫助。

一起聊聊python程式設計思想

推薦學習:python影片教學

Python是一種物件導向oop(Object Oriented Programming)的腳本語言。

物件導向是採用基於物件(實體)的概念建立模型,模擬客觀世界分析、設計、實現軟體的辦法。

在物件導向程式設計中,物件包含兩個意義,其中一個是數據,另外一個是動作。物件導向的方法把資料和方法組合成一個整體,然後對其進行系統建模。

python程式設計思想的核心就是理解功能邏輯#,如果對解決一個問題的邏輯沒有搞清楚,那麼你的程式碼看起來就會非常的紊亂,讀起來非常的拗口,所以一旦邏輯清晰,按照模組對功能進行系統編程,那麼你的代碼設計肯定是漂亮的! ! !

1 基本的程式設計模式

任何的程式設計都包含IPO,它們分別代表如下:

  • I:Input 輸入,程式的輸入

  • P:Process 處理,程式的主要邏輯流程

  • O:Output 輸出,程式的輸出

因此如果想要透過電腦實現某個功能,那麼基本的程式設計模式包含三個部分,如下:

  • 確定IPO:明確需要實現功能的輸入和輸出,以及主要的實現邏輯過程;

  • 編寫程式:將計算求解的邏輯過程透過程式語言進行設計展示;

  • 偵錯程式:對所寫的程式依照邏輯流程進行偵錯,確保程式依照正確邏輯正確運作。

2 解決複雜問題的有效方法:自頂向下(設計)

2.1 自頂向下-分而治之

如果要實現功能的邏輯比較複雜的時候,就需要對其進行模組化設計,將複雜問題分解,轉化為多個簡單問題,其中簡單問題又可以繼續分解為更簡單的問題,直到功能邏輯可以透過模組程式設計實現,這也是程式設計的自頂向下特徵。總結如下:

  • 將一個總問題表達為若干個小問題組成的形式
  • 使用同樣方法進一步分解小問題
  • 直至,小問題可以用電腦簡單明了的解決

2.2 舉例1:運動競技分析

2.2.1 程式總體架構

printlnfo()                步驟1:列印程序的介紹性資訊              參數:proA, proB, n         
simNGames()         步驟3:利用球員A和B的能力值,模擬n局比賽        
printSummary()      步驟4:輸出球員A和B獲勝比賽的場次及機率      

# 导入python资源包
from random import random
 
# 用户体验模块 
def printIntro():
    print("这个程序模拟两个选手A和B的某种竞技比赛")
    print("程序运行需要A和B的能力值(以0到1之间的小数表示)")
 
# 获得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, 0
    for i in range(n):
        scoreA, scoreB = simOneGame(probA, probB)
        if scoreA > scoreB:
            winsA += 1
        else:
            winsB += 1
    return winsA, winsB
 
# 判断比赛结束条件 
def gameOver(a, b):
    return a == 15 or b == 15
 
# 模拟n次单局比赛=模拟n局比赛 
def simOneGame(probA, probB):
    scoreA, scoreB = 0, 0
    serving = "A"
    while not gameOver(scoreA, scoreB):
        if serving == "A":
            if random() < probA:
                scoreA += 1
            else:
                serving = "B"
        else:
            if random() < probB:
                scoreB += 1
            else:
                serving = "A"
    return scoreA, scoreB
 
# 打印结果模块 
def printSummary(winsA, winsB):
    n = winsA + winsB
    print("竞技分析开始,共模拟{}场比赛".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能力值与比赛场次N
    winsA, winsB = simNGames(n, probA, probB)     # 获得A与B的场次
    printSummary(winsA, winsB)                    # 返回A与B的结果
 
 
main()

2.2.3 測試結果

2.3 舉例2:的斐波那契數列

自頂向下的方式其實就是使用遞歸來解子問題

,最終解只需要呼叫遞歸式,子問題逐步往下層遞歸的求解。

程式設計:

cache = {}

def fib(number):
    if number in cache:
        return cache[number]
    if number == 0 or number == 1:
        return 1
    else:
        cache[number] = fib(number - 1) + fib(number - 2)
    return cache[number]

if __name__ == &#39;__main__&#39;:
    print(fib(35))
#執行結果:

##
14930352
>>>

理解自頂向下的設計思維:分而治之

3 逐步組成複雜系統的有效測試方法:自底向上(執行)

3.1 自底向上-模組化整合

自底向上(执行)就是一种逐步组建复杂系统的有效测试方法。首先将需要解决的问题分为各个三元进行测试,接着按照自顶向下相反的路径进行操作,然后对各个单元进行逐步组装,直至系统各部分以组装的思路都经过测试和验证。

理解自底向上的执行思维:模块化集成

自底向上分析思想:

  • 任何时候栈中符号串和剩余符号串组成一个句型,当句柄出现在栈顶符号串中时,就用该句柄进行归约,这样一直归约到输入串只剩结束符、栈中符号只剩下开始符号,此时认为输入符号串是文法的句子,否则报错。

自底向上是⼀种求解动态规划问题的方法,它不使用递归式,而是直接使用循环来计算所有可能的结果,往上层逐渐累加子问题的解。在求解子问题的最优解的同时,也相当于是在求解整个问题的最优解。其中最难的部分是找到求解最终问题的递归关系式,或者说状态转移方程。

3.2 举例:0-1背包问题

3.2.1 问题描述

你现在想买⼀大堆算法书,有一个容量为 V 的背包,这个商店⼀共有 个商品。问题在于,你最多只能拿 W kg 的东西,其中 wi vi 分别表示第 i 个商品的重量和价值。最终的目标就是在能拿的下的情况下,获得最大价值,求解哪些物品可以放进背包。

对于每⼀个商品你有两个选择:拿或者不拿。

3.2.2 自底向上分析

⾸先要做的就是要找到“子问题”是什么。通过分析发现:每次背包新装进⼀个物品就可以把剩余的承重能力作为⼀个新的背包来求解,⼀直递推到承重为0的背包问题。

m[i,w] 表示偷到商品的总价值,其中 i 表示⼀共多少个商品,w 表示总重量,所以求解 m[i,w]就是子问题,那么看到某⼀个商品i的时候,如何决定是不是要装进背包,需要考虑以下:

  • 该物品的重量大于背包的总重量,不考虑,换下⼀个商品;
  • 该商品的重量小于背包的总重量,那么尝试把它装进去,如果装不下就把其他东西换出来,看看装进去后的总价值是不是更高了,否则还是按照之前的装法;
  • 极端情况,所有的物品都装不下或者背包的承重能力为0,那么总价值都是0;

由以上的分析,可以得出m[i,w]的状态转移方程为:

m[i,w] = max{m[i-1,w], m[i-1,w-wi]+vi}

3.2.3 程序设计

# 循环的⽅式,自底向上求解
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 = 4

def knapsack():
    for w in range(W+1):
        cache[get_key(0,w)] = 0
    for i in items:
        cache[get_key(i,0)] = 0
        for 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__':
    # 背包把所有东西都能装进去做假设开始
    print(knapsack())
29
>>>

推荐学习:python

以上是一起聊聊python程式設計思想的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除