程序設計方法學
體育競技分析
需求:如何科學分析體育競技比賽
輸入球員的水平,能否輸出比賽成績???
簡單來說就是不斷地進行比賽,最後選手的能力的而顯示的輸贏情況,會越來越精確
比賽規則
簡單來說,兩個人打乒乓球。
自定向下的方法:將總問題分解爲很多個小問題,再劃分爲小問題,直到我們可以解決這個小問題,
自底向上的執行,分別執行每一個實際單元,進行測試,測試通過,組合測試。也就是小問題測試沒問題,就合併另一個小問題稱謂一個略大的問題,再進行測試,通過,再合併再測試。
程序總體框架及步驟:
- 打印程序的介紹性信息 -》printInfo()
- 獲得程序運行的參數 -》getInput()
- 利用球員A和球員B的能力值,模擬N局比賽 -》 simNGames()
- 輸出球員A和球員B獲勝比賽的場次及概率 -》 printSummary()
定義四個函數來完成以上的功能。
printIntro():打印一些介紹函數
from random import random
def printIntro():
print("這個程序模擬 兩個選手A和B的某種競技比賽")
print("程序運行需要A和B的能力值(以0到1之間的小數表示)")
#獲得用戶輸入的參數
def getInputs():
a = eval(input("請輸入選手A的能力值(0-1)"))
b = eval(input("請輸入選手B的能力值(0-1)"))
n = eval(input("模擬比賽的場次"))
return a,b,n
#打印結果
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))
#模擬N局 分解爲模擬一局比賽
#獲得A 和B 的能力值,最後不斷的進行一場比賽,對輸贏進行累加,
def simNgame(n,proA ,proB):
winsA,winsB=0,0
for i in range(n):
scoreA,scoreB = simOneGame(proA,proB)
if(scoreA > scoreB):
winsA+=1
else:
winsB+=1
return winsA,winsB
#一句比賽,如何對局?什麼時候結束
#當比賽ganmeOver()返回爲True時結束也就是得了15分
def simOneGame(proA,proB):
#初始值
scoreA,scoreB = 0 , 0
#設置A 發球
serving ="A"
while not gameOver(scoreA,scoreB):
#如果A 發球
if serving == "A":
#設置一個隨機數,如果這個隨機數小於A,也就是說A能夠應付的過來
if random() < proA:
scoreA+=1
#更換髮球方
else:
serving = "B"
#同上
else:
# 設置一個隨機數,如果這個隨機數小於B,也就是說b能夠應付的過來
if random() < proB:
scoreB += 1
else:
serving = "A"
return scoreA,scoreB
def gameOver(a,b):
#任意一方的分數等於15就結束
return a ==15 or b == 15
def mian():
printIntro()
proA,proB,n = getInputs()
winsA,winsB = simNgame(n,proA,proB)
printSummary(winsA,winsB)
mian()
python程序設計思維
邏輯思維:推理和演繹
實證思維:實驗和驗證
計算思維:設計和構造
抽象和自動化是計算思維的核心,抽象問題的計算過程,利用計算機自動化求解
舉個例子,計算求和
以前的數學家高斯,創造出了求和公式,An = (a1+an)*n/2,典型的邏輯思維
計算思維,不斷地累加幾行代碼就出來了。
量化分析:股票
經驗和預測未來的股票去購買,這是普通人的實證和邏輯思維。
然後計算思維,是將歷史數據全部進行量化,計算未來可能的漲跌概率,去進行購買和拋出
python第三方庫安裝
如何搜索相關的庫?
假如要做的是相關的區塊鏈開發, 那麼直接在搜索框裏搜索 blockchain 即可
挑選一個庫,檢索和查看對應的方法,選擇合適的庫進行安裝
庫安裝方法分別有:pip , 集成 ,文件
pip安裝 : 直接在終端上輸入 pip install <第三方庫名> 非常簡單
pip install -U <第三方庫名> 升級對應的第三方庫
pip uninstall <第三方庫名> 卸載第三方庫
pip download <第三方庫名> 下載但不安裝第三方庫
pip show <第三方庫名> 列出某個指定第三方庫的詳細信息
pip serach <第三方庫名> 根據關鍵詞在名稱中介紹和搜索第三方庫(假如要搜索blockchain的庫,那麼直接pip serach blockchain 他會顯示那些標題以及介紹中含有blockchain的第三方庫)
pip list 顯示當前機器安裝的第三方庫
集成安裝:結合特定的python開發工具批量的安裝一批庫
舉個例子:數據計算領域的 Anaconda,當我們安裝好Anaconda相關的開發程序安裝好,與它相關的800個庫,就不需要安裝了。
文件安裝: 有些第三方庫用pip 可以直接下載,但是無法安裝沒因爲有的第三方庫,並不是一個可執行文件,而是源代碼,所以我們需要對他進行編譯。如果機器上沒有編譯環境,那麼只能下載,不能安裝。
當然,有一個網站就提供了那些編譯後的第三方庫 :UCI界面
這個網址是一個UCI 界面,是加州大學的一個教授所維護的一個網站。如果自己的機器不具備編譯環境,那麼就可以直接去這個網站去搜索,然後進行下載對應的版本,然後使用 pip install 文件名
安裝。
os庫調用
os庫是與操作系統相關的基本庫,os庫提供同樣的基本的操作系統交互功能
os庫是python標準庫,包含幾百個函數
常用的路徑操作,進程和管理,環境參數等幾類
路徑操作
:os.path 字庫,處理文件路徑及信息
進程管理
:啓動系統中其他進程
環境參數
:獲得系統硬件信息等環境參數
路徑操作
os.path字庫以path爲入口,用於操作和處理文件路徑
導入庫
import os.path
#或者import os.path as op
函數:
os.path.abspath(path)
:返回 path 在系統中的絕對路徑。 os.path.abspath(“file.txt”) -》 “C\…\file.txt”
os.path.normpath(path)
: 歸一化path的表示形式,統一用 \ 分隔路徑,os.path.normpath(“D://PYE//file.txt”) -> “D:\PYE\file.txt”
os.path.relpath(path)
: 返回當前python程序與文件之間的相對路徑。 os.path.relpath(“C://PYE//file.txt”) -> “…\…\…\PYE\file.txt”
os.path.dirname(path)
: 返回path中目錄名稱。 os.path.dirname(“D//PYE//file.txt”) -》返回目錄"D//PYE"
os.path.basename(path)
:返回path中最後的文件名稱。 os.path.basename(path) -》 返回最後的文件名 “file.txt”
os.path.join(path,*paths)
: 組合path 與 paths , 返回一個新的字符串,os.path.join(“D:/”,“pye/file.txt”) -> 組合爲一個符合路徑格式的字符串 “D:/PYE/file.txt”
os.path.exists(path)
:判斷path對應的文件或者目錄是否存在,返回True或者False。 os.path.exists(“D//PYE//file.txt”) 找這個路徑,並不會打開文件,找到了就返回True,找不到返回False
os.path.isfile(path)
:判斷path所對應的文件是否存在,返回True / False
os.path.isdir(path)
:判斷path對應的目錄是否存在,返回True / False
os.path.getatime(path)
: 返回path對應文件或目錄上一次訪問時間 , os.path.getatime(“D//PYE//file.txt”) - > 15152131232.1231233 返回的是以秒爲單位的數
os.pathmtime(path)
: 返回path對應文件或目錄最近一次訪問時間,同上依舊返回以秒爲單位的數字類型
os.path.getctime(path)
: 返回pathh對應文件或目錄的創建時間,time.ctime(os.path.getctime(“D/PYE/file.txt”)) -》 因爲使用了time.ctime 進行格式化,所以返回的是 “SUM Feb 11 21:43:53 2020”
os.path.getsize(path)
: 返回path對應文件的大小,以字節爲單位. os.path.getsize(“D//PYE/file.txt”) -》 123213 單位爲字節
進程管理
os.system(command)
: 執行程序或命令command ,相當於在終端輸入command命令,如果程序正確運行,那麼就返回 0,
調用計算器程序
import os
os.system("C:\\Windows\\System32\\calc.exe")
執行後會直接打開此進程
讓電腦打開畫圖程序,並且打開圖片
import os
os.system("C:\\Windows\\System32\\mspaint.ext \ C:\\Users\\ZHB\\Desktop\\JAVA1.png")
環境參數
os.chdir(path)
: 修改當前程序操作文件的路徑: os.chdir(“D:”) 相當於切換目錄
os.getcwd()
: 獲得當前路徑。(與linux的pwd一樣)
os.getlogin()
:獲得當前系統登陸用戶名名稱
os.cpu_count ()
: 獲得當前系統的CPU數量。 返回的是一個整形數字
os.urandom(n)
: 獲得n個字節長的隨機字符串,通常用於加密運算, os。urandom(10) -> b’'ajsiodjasoidhasodha" (一共十個字節長的字符串)
第三方庫自動安裝腳本
需求:批量安裝第三方庫,需要人工干預,能否自動安裝呢??
安裝一個第三方庫 pip 指令即可,我們需要在控制檯輸入 pip install 第三方庫名
那麼我們之前學過的os.system(command)
這個函數我們可以輸入對應的字符串安裝一個第三方庫
那麼安裝多個,實際上就很簡單了。
先確定一下要安裝那些庫
這20個庫,就是我們要安裝的了,其實安裝這些非常簡單
import os
libs = {"numpy", "matplotlib" ,"p1l1ow" ,"sklearn","requests",\
"jieba" , "beautifulsoup4" , "wheel","networkx" ,"sympy",\
"pyinstaller" ,"django" ,"flask" ,"werobot" ,"pyqt5",\
"pandas" ," pyopeng1", "pypdf2" ,"docopt" , "pygame" }
#安裝時可能會失敗,所以會有一場拋出
try :
for lib in libs:
os.system("pip install {}".format(lib))
print(lib,"Successful")
except:
print("Failed Somehow")
練習:
strs = input()
for char in strs:
##A Unicode編碼爲65 z的Unicode編碼爲122
if ord("a") <= ord(char)<= ord("z") or ord("A")<= \
ord(char)<=ord("Z"):
print(char,end="")
numbers = input()
try:
#不論什麼數字都當作複數來處理,如果將字符串轉爲負數和將字符串轉爲數字再轉爲複數一致,那麼就說明輸入正確
if complex(numbers) == complex(eval(numbers)):
print(eval(numbers)**2)
except:
print("輸入有誤")