python求两数之和的命令_数学建模:科学计算Python2小时-Python基础
這一部分主要面向數(shù)模活動(dòng)中的python基礎(chǔ)知識(shí)進(jìn)行討論
作者
系列文章(科學(xué)計(jì)算Python2小時(shí))目錄:李似:科學(xué)計(jì)算Python2小時(shí)-前言與目錄?zhuanlan.zhihu.com
首先要說(shuō)明的是,目前常用的Python版本包括Python2和Python3,二者有一些語(yǔ)法和一些包是互不兼容的。部分Python的拓展庫(kù)已經(jīng)放棄了對(duì)Python2的支持所以本分文檔推薦使用Python3作為解釋器。當(dāng)然對(duì)于數(shù)學(xué)建模而言,Python2也是一個(gè)可選的方案,但是可能會(huì)在使用過(guò)程中遇到一些問(wèn)題,如果你是Python2的忠實(shí)擁護(hù)者,那么使用Python2來(lái)完成數(shù)學(xué)建模工作,也未嘗不可。
接下來(lái)我們可能需要理清幾個(gè)概念解釋器,文本編輯器,IDE和包管理工具
解釋器
一般我們編寫(xiě)Python源程序時(shí),會(huì)得到一個(gè)后綴名為py的文件,當(dāng)你想要運(yùn)行這份代碼的時(shí)候,操作系統(tǒng)是不能夠認(rèn)識(shí)py這份文件怎怎么樣工作的,這時(shí)就需要一個(gè)解釋器,將這份文件翻譯成機(jī)器可以識(shí)別的機(jī)器碼。
通常我們?cè)诰W(wǎng)絡(luò)上看到一些教程說(shuō),我們可以直接去Python的官方網(wǎng)站上下載某一個(gè)版本的Python,并將它們安裝在我們自己的電腦上,那么這里我們所安裝的Python其實(shí)就是解釋器。
如果說(shuō)的更明確一些,他應(yīng)該被稱(chēng)為CPython解釋器,一個(gè)用C語(yǔ)言寫(xiě)的Python解釋器,當(dāng)我們?cè)诿钚兄羞\(yùn)行下面這行代碼的時(shí)候,其實(shí)就是它在執(zhí)行作用
python demo.py
IPython是另外一種Python解釋器,與其說(shuō)它跟CPython上有什么不同,還不如說(shuō)它只是在CPython的交互方式上進(jìn)行了一些改進(jìn),IPython使用代碼塊的方式展現(xiàn)和運(yùn)行代碼。
CPython使用>>>做命令提示符,而IPython使用IN[num]作為命令提示符,從這里可以就可以很容易的把二者分辨開(kāi).
比如在命令行中進(jìn)行Python或者在pycharm這類(lèi)軟件中運(yùn)行Python使用的都是CPython解釋器
而在jupyter notebook或者spyder這樣的軟件中運(yùn)行,用的都是IPython解釋器
二者并沒(méi)有什么明顯的區(qū)別,當(dāng)我們已經(jīng)完成了功能的測(cè)試時(shí),我們可以使用CPython來(lái)進(jìn)行大規(guī)模的計(jì)算,到我們測(cè)試功能時(shí),我們可以使用IPython來(lái)進(jìn)行交互式的代碼書(shū)寫(xiě)。如果要進(jìn)行一些展示性的或者教程性的代碼書(shū)寫(xiě)的時(shí)候,使用IPython一般是比較友好的一種展示方式。
文本編輯器
就像電腦中最常用的記事本軟件一樣,文本編輯器其實(shí)就就是用來(lái)敲代碼的一個(gè)界面而已但是有一些文本編輯器,集成了代碼補(bǔ)全、代碼高亮、縮管理之類(lèi)的插件,所以在代碼的編寫(xiě)中會(huì)用的比較順手。
比如記事本,Vim,VSCode都是常用的文本編輯器
通常使用純文本編輯器編輯好的程序,需要在命令行中調(diào)用對(duì)應(yīng)的文件來(lái)運(yùn)行它
IDE
集成開(kāi)發(fā)環(huán)境(IDE,Integrated Development Environment )是用于提供程序開(kāi)發(fā)環(huán)境的應(yīng)用程序,使用集成開(kāi)發(fā)環(huán)境的好處在于你可以在一處完成代碼測(cè)試編寫(xiě)到運(yùn)行的所有步驟,通常在側(cè)邊欄它會(huì)有文件夾的管理,在占程序空間的大塊的區(qū)域,會(huì)有代碼編寫(xiě)的位置,一些菜單欄會(huì)提供給你運(yùn)行程序和顯示程序運(yùn)行結(jié)果的按鍵和區(qū)域。
甚至相當(dāng)一部分IDE還會(huì)貼心的給你安裝好Python的運(yùn)行環(huán)境。(我說(shuō)的就是Anaconda)
諸如 Anaconda,pycharm,spyder,VS 都屬于集成開(kāi)發(fā)環(huán)境
包管理工具
原生的Python其實(shí)并沒(méi)有什么特別強(qiáng)大的功能,許多常用的科學(xué)計(jì)算軟件包或者繪圖軟件包比如我們熟知的numpy或者matplotlib,都是獨(dú)立出來(lái)的程序庫(kù),那怎么樣把他們導(dǎo)入到我們的程序中,并且為我們所用呢?這時(shí)候就需要包管理工具,常用的包管理工具有pip和conda
一般情況下再安裝好Python的解釋器之后,pip就是默認(rèn)的包管理工具,你可以在命令行中使用pip install來(lái)安裝某些你想要的包。這時(shí)候 Pip會(huì)從網(wǎng)絡(luò)上把對(duì)應(yīng)的軟件包下載下來(lái),并且安裝到你的電腦上,但是Python默認(rèn)的下載源在國(guó)外,所以下載速度會(huì)比較慢,這里推薦使用清華大學(xué)的鏡像源,來(lái)下載你所需要的軟件包。
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple [軟件包名字]
許多情況下,當(dāng)你iimport某個(gè)包時(shí)它會(huì)報(bào)錯(cuò),那么問(wèn)題就在于這個(gè)包你根本沒(méi)有安裝和下載過(guò),那么使用上面這一條代碼在命令行中運(yùn)行,基本就可以解決問(wèn)題。
Hello world
等你完成安裝Python環(huán)境以及相關(guān)軟件的一些工作之后,就可以開(kāi)始正式的踏入Python的世界了,那么其實(shí)任何編程語(yǔ)言的第1步都是一樣的,打印出hello world。嘗試運(yùn)行以下這行代碼
print("Hello wold")
Hello wold
那么接下來(lái)將這個(gè)部分,我們將開(kāi)始進(jìn)行Python科學(xué)計(jì)算的一些基本常識(shí)的了解
在Python中行注釋的用法是在當(dāng)前行最前面加一個(gè)井號(hào) #,而多行數(shù)式是用三個(gè)單引號(hào)或者三個(gè)雙引號(hào)將代碼塊框起來(lái)
而在大部分的文本編輯器或者IDE中如果你想在很多行前面都加一個(gè)井號(hào)來(lái)做單行注釋,那么對(duì)應(yīng)的快捷鍵是Ctrl+/,(這個(gè)超級(jí)好用)
# 這是一行注釋
# 這也是一行注釋
# 這還是一行注釋
這是一行忘加的注釋符號(hào)的注釋
那么就可以清晰的看出來(lái),我們引入了一個(gè)錯(cuò)誤,他表示這一個(gè)變量沒(méi)有被定義.
在代碼的編寫(xiě)過(guò)程中,你可能會(huì)遇到很多這樣類(lèi)似的問(wèn)題,善用搜索引擎之前需要先讀一下他到底是說(shuō)了些什么,就我們這點(diǎn)英語(yǔ)水平,還是能讀懂他的報(bào)錯(cuò)的很多報(bào)錯(cuò)都已經(jīng)將問(wèn)題出現(xiàn)原因講得很清晰了。
運(yùn)算與數(shù)據(jù)類(lèi)型
在Python中一個(gè)變量,如果你想要使用它,其實(shí)你并不用像C一樣首先去定義,直接用它來(lái)計(jì)算就好了。
數(shù)據(jù)類(lèi)型
a = 2
b = 3
c = 4
str_ = "a,b,c"
strWithFormat = "{},{},{}".format(a,b,c)
list_ = [a,b,c]
tuple_ = (a,b,c)
map_ = {"a":a,"b":b,"c":c}
print("字符串:\t",str_)
print("帶占位符的字符串:\t",strWithFormat)
print("列表:\t",list_)
print("元組:\t",tuple_)
print("字典:\t",map_)
#更多關(guān)于數(shù)據(jù)類(lèi)型:Python 變量類(lèi)型 | 菜鳥(niǎo)教程
字符串: a,b,c
帶占位符的字符串: 2,3,4
列表: [2, 3, 4]
元組: (2, 3, 4)
字典: {'a': 2, 'b': 3, 'c': 4}
運(yùn)算
# 加減乘除
print(a+b)
print(a-b)
print(a*b)
print(a/b)
# 對(duì)結(jié)果四舍五入
print(round(a/b))
# 取余
print(a%b)
#更多關(guān)于運(yùn)算:Python3 運(yùn)算符 | 菜鳥(niǎo)教程
5
-1
6
0.6666666666666666
1
2
部分?jǐn)?shù)學(xué)函數(shù)
判斷與循環(huán)
balls = ['white','white','white','otherColor','white','white','otherColor','otherColor','otherColor','white','white','otherColor']
numOfWhiteColorBalls = 0
numOfOtherColorBalls = 0
for ball in balls:
if ball == 'white':
numOfWhiteColorBalls += 1
else :
numOfOtherColorBalls += 1
if numOfWhiteColorBalls == 0:
print("There has no white ball in all {} balls".format(numOfWhiteColorBalls+numOfOtherColorBalls))
elif numOfWhiteColorBalls == 1:
print("There is 1 white ball in all {} balls".format(numOfWhiteColorBalls+numOfOtherColorBalls))
else :
print("There are {} white balls in all {} balls".format(numOfWhiteColorBalls,numOfWhiteColorBalls+numOfOtherColorBalls))
#更多關(guān)于判斷和循環(huán)語(yǔ)句:
# Python 條件語(yǔ)句 | 菜鳥(niǎo)教程
# Python 循環(huán)語(yǔ)句 | 菜鳥(niǎo)教程
There are 7 white balls in all 12 balls
這段代碼運(yùn)用到了相當(dāng)多的知識(shí)點(diǎn)和需要討論的部分。
首先你所有的變量都應(yīng)該有意義,可以使用下劃線命名法或者駝峰命名法來(lái)對(duì)你的變量進(jìn)行命名。
其次for循環(huán)可以對(duì)相當(dāng)多的數(shù)據(jù)類(lèi)型進(jìn)行迭代,其中列表就是一個(gè)有迭代能力的數(shù)據(jù)類(lèi)型,代碼中ball在循環(huán)中指的是每一個(gè)球的顏色
在Python中沒(méi)有像C語(yǔ)言中i++這樣的變量自增方法,你可以使用+= 1代替它
Python中沒(méi)有像C語(yǔ)言中那樣使用分號(hào)來(lái)作為每一行代碼的結(jié)尾,但是Python對(duì)于縮進(jìn)的要求相當(dāng)嚴(yán)格,像很多初學(xué)者常犯的問(wèn)題都是出現(xiàn)在縮進(jìn)上面
下面這一幅動(dòng)圖是在循環(huán)和判斷中的一個(gè)流程
函數(shù)
函數(shù)指的是一段可以執(zhí)行特定功能的代碼段,一般又稱(chēng)為子程序。函數(shù)存在的意義是可以將大量的重復(fù)性工作打包成一個(gè)固定的流程,當(dāng)你給這個(gè)流程一些符合條件的輸入時(shí),在這個(gè)程序里面進(jìn)行計(jì)算之后返回給你計(jì)算的結(jié)果。
函數(shù)之間可以相互調(diào)用,這個(gè)特性也促成了一些算法的實(shí)現(xiàn),比如遞歸。
那在數(shù)學(xué)建模這種使用程序代碼來(lái)幫助我們運(yùn)算的應(yīng)用背景下,一般都是我們有一系列的數(shù)據(jù),需要經(jīng)過(guò)相同或者類(lèi)似的處理,那這個(gè)時(shí)候我們就把他們一個(gè)一個(gè)送進(jìn)寫(xiě)好的函數(shù)中,再去接收他返回回來(lái)的輸出,這樣就可以起到批次計(jì)算的效果。
接下來(lái)我們把上一個(gè)例子用函數(shù)來(lái)重新寫(xiě)一遍。
def countSelectColorBalls(balls,selectColor):
numOfSelectColorBalls = 0
numOfOtherColorBalls = 0
for ball in balls:
if ball == selectColor:
numOfSelectColorBalls += 1
else :
numOfOtherColorBalls += 1
if numOfSelectColorBalls == 0:
print("There has no {} ball in all {} balls".format(selectColor,numOfSelectColorBalls+numOfOtherColorBalls))
elif numOfSelectColorBalls == 1:
print("There is 1 {} ball in all {} balls".format(selectColor,numOfSelectColorBalls+numOfOtherColorBalls))
else :
print("There are {} {} balls in all {} balls".format(numOfSelectColorBalls,selectColor,numOfSelectColorBalls+numOfOtherColorBalls))
return {selectColor:numOfSelectColorBalls}
balls = ['white','white','white','yellow','white','white','yellow','red','yellow','white','red','red','blue']
ballColorList = []
ballColorList.append(countSelectColorBalls(balls,"white"))
ballColorList.append(countSelectColorBalls(balls,"black"))
ballColorList.append(countSelectColorBalls(balls,"yellow"))
ballColorList.append(countSelectColorBalls(balls,"red"))
ballColorList.append(countSelectColorBalls(balls,"blue"))
print(ballColorList)
#更多關(guān)于函數(shù):
# https://www.runoob.com/python3/python3-function.html
There are 6 white balls in all 13 balls There has no black ball in all 13 balls There are 3 yellow balls in all 13 balls There are 3 red balls in all 13 balls There is 1 blue ball in all 13 balls [{'white': 6}, {'black': 0}, {'yellow': 3}, {'red': 3}, {'blue': 1}]
在這個(gè)例子中,我們把主要的運(yùn)算部分包裝成了一個(gè)叫做countSelectColorBalls的函數(shù),這個(gè)函數(shù)有兩個(gè)輸入?yún)?shù),返回值是顏色和對(duì)應(yīng)該顏色的球的個(gè)數(shù),其外還打印了一些輸出在屏幕上.兩個(gè)輸入?yún)?shù)分別是balls和selectColor,代表了球的列表和被選擇的顏色。返回值是一個(gè)以所選顏色為key,以所選顏色球的個(gè)數(shù)為value的字典,在主程序之外使用一個(gè)列表接收返回值,append指的是將參數(shù)接到列表末端。
之后我們將上一個(gè)例子中對(duì)白球的計(jì)數(shù)器換成了對(duì)所選顏色的球的計(jì)數(shù)器,使它對(duì)其他的顏色也同樣具有適配性。
這里我們看到仍然有幾行代碼是高度重復(fù)的,那么我們可以用下面的例子來(lái)替代它。
ballColorList = []
for color in set(balls):
ballColorList.append(countSelectColorBalls(balls,color))
print(ballColorList)
There are 3 yellow balls in all 13 balls There are 6 white balls in all 13 balls There are 3 red balls in all 13 balls There is 1 blue ball in all 13 balls [{'yellow': 3}, {'white': 6}, {'red': 3}, {'blue': 1}]
set是一種叫做集合的數(shù)據(jù)類(lèi)型,它的特點(diǎn)就是集合內(nèi)的元素是不重復(fù)的.那么對(duì)一個(gè)列表取集合,就能夠得到里面不重復(fù)的所有元素。在將每一個(gè)顏色作為函數(shù)的輸入值進(jìn)行查詢(xún)和運(yùn)算。就能夠得到相同的效果。
日期和時(shí)間 這里有一個(gè)計(jì)算機(jī)中非常常見(jiàn)的關(guān)于時(shí)間的概念叫做時(shí)間戳,它指的是從1970年1月1日零時(shí)開(kāi)始的時(shí)間秒數(shù)或者毫秒數(shù).
import time # 引入time模塊
ticks = time.time()
print("當(dāng)前時(shí)間戳為:", ticks)
#更多關(guān)于日期和時(shí)間:
# https://www.runoob.com/python3/python3-date-time.html
當(dāng)前時(shí)間戳為: 1611793367.7136235
時(shí)間戳基本上就是所有關(guān)于時(shí)間的運(yùn)算的基礎(chǔ),包括計(jì)算時(shí)間差值轉(zhuǎn)換成日期,或者轉(zhuǎn)換成其他什么別的格式。
當(dāng)然在Python中還包括了一些其他關(guān)于時(shí)間的操作,不用我們自己從時(shí)間戳開(kāi)始轉(zhuǎn)換。
這里我們只做一些比較基本的示例,更多的更具體的使用方法,可以去參考其他的教程。
為了方便后面的運(yùn)算,我們先上兩個(gè)函數(shù)。
# 輸出指定范圍內(nèi)的所有質(zhì)數(shù)算法1
def primeList_1(numMax):
primes = []
for num in range(2,numMax):
for m in range(2,num):
if num % m == 0:
break
else:
primes.append(num)
return primes
# 輸出指定范圍內(nèi)的所有質(zhì)數(shù)算法2
def primeList_2(numMax):
primes = []
numsList = []
for i in range(numMax):
numsList.append(True)
for num in range(2,numMax):
addSum = num + num
while addSum < numMax :
numsList[addSum] = False
addSum += num
for i in range(2,numMax):
if numsList[i]:
primes.append(i)
return primes
# 計(jì)算程序運(yùn)行時(shí)間
import time
ticks1 = time.time()
primeList_1(50000)
ticks2 = time.time()
print("時(shí)間差為:", ticks2-ticks1)
ticks1 = time.time()
primeList_2(50000)
ticks2 = time.time()
print("時(shí)間差為:", ticks2-ticks1)
時(shí)間差為: 6.9387428760528564 時(shí)間差為: 0.04651689529418945
其實(shí)這個(gè)時(shí)間差計(jì)算還挺簡(jiǎn)單的,主要就是在代碼塊前面打一個(gè)時(shí)間戳,在代碼塊后面打一個(gè)時(shí)間戳把兩個(gè)時(shí)間戳做一下減法就可以了。
那么這里額外還要再說(shuō)幾個(gè)比較有價(jià)值的點(diǎn)。
首先看函數(shù)primeList_1定義的第6行和第9行,這是一個(gè)for else結(jié)構(gòu) else在前面的for中break生效時(shí)會(huì)生效。
再有就是當(dāng)我們寫(xiě)程序時(shí)需要考慮城市的時(shí)間復(fù)雜度的問(wèn)題,我們能看到上面的一端程序,第1種算法執(zhí)行6-7秒,而第2種方法只需要執(zhí)行0.04-0.06秒,效率差了100多倍,這就是一個(gè)很普通的計(jì)算質(zhì)數(shù)的兩種方法,在其他的問(wèn)題中也有類(lèi)似的優(yōu)化途徑,如果當(dāng)你的循環(huán)達(dá)到了兩層或者三級(jí)以后,你就可能需要用一些方法來(lái)進(jìn)行優(yōu)化。
總結(jié)
以上是生活随笔為你收集整理的python求两数之和的命令_数学建模:科学计算Python2小时-Python基础的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: h5与小程序服务器如何辨别,小程序丨教你
- 下一篇: python处理时间和日期_python