從零開始學習PYTHON3講義(二)把Python當做計算器
《從零開始PYTHON3》第二講
上一講我們說過了如何啟動Python IDLE整合開發學習環境,macOS/Linux都可以在命令列執行idle3。Windows則從開始選單中去尋找IDLE程式的圖示。

上一講我們還見到了Python的兩種工作模式,互動模式和程式模式。
通常在一個大型的系統中,程式模式是必然的選擇。因為一個完整的專案,都需要大量的準備工作。為很多運算的必要條件準備最初的值(專有名詞也叫“初始化”),接下來的運算也往往邏輯複雜,需要作出多種選擇和頻繁的組合計算。這個過程,需要用計算機能明白的文字完整描述出來。描述的過程,也就是稱為編寫程式的過程。(下圖僅為示意性,先不要管程式的內容)

命令列方式則看上去更簡單,Python對你的每條命令即時的給出反饋,適合使用者邊想邊試,快速的看到結果,並根據結果調整策略、再次嘗試。
Python語言應用於工程界和科學界的時候,經常就是工作在這種模式。互動模式下一遍遍嘗試的過程,實際也是“研究”的過程。當然研究取得了成果,最終還是需要用“程式設計”的模式,把研究結果變成一個產品。
通常這樣編寫的程式的主體部分,就是在互動模式中,順序輸入的命令的總和。
在我們剛剛接觸Python的階段,互動模式也為我們的學習提供了良好的支援,動手實驗每一個小的學習過程,根據反饋的結果驗證我們的思考。學習->思考->動手驗證->再次學習,這是我們學習的一般路徑。

啟動IDLE程式之後,Python預設就工作在互動方式下,也就是上面這張圖的樣子。在File(檔案)選單中選擇New File(新檔案)或者Open(開啟)以前的老程式,則Python會再開啟一個視窗,在新視窗中可以編輯、修改程式,也就是程式模式。本節課我們主要講解互動模式。
互動模式可以完成很多工作,在其它程式語言中需要用複雜的程式才能完成的工作,可能在Python互動模式中簡單的幾條命令就能完成。今天實際是我們正式踏上程式設計之旅的第一課,我們從最強大易用的Python數學計算來開始。
把Python當做計算器
首先是最基本的四則運算和常用的乘方:
數學運算 | 操作符 |
---|---|
加法 | + |
減法 | - |
乘法 | * (不是:heavy_multiplication_x:) |
除法 | / (不是:heavy_division_sign:) |
乘方 | ** |
這是最好理解的部分,加、減兩項運算跟我們數學課上學的完全相同,乘法、除法、乘方的運算子則使用了替代的符號。
這樣設計的原因說起來話題比較長。
大概講就是計算機發展之初,輸入裝置是由傳統的英文打字機改裝而來的,鍵盤佈局當然就採用了同英文打字機相同的佈局。
但是在這種佈局上,加、減符號是有的,乘除符號則沒有,因此乘法使用了從外形看比較接近的“*”,除法則使用了意義上最接近的“/”。
為什麼不使用“x”?當然是為了避免歧義。
下面就是幾個簡單四則運算的例子,希望你也多動手試試:
>>> 2 + 2 4 >>> 50 - 5*6 20 >>> (50 - 5*6) / 4 5.0 >>> 8 / 5 1.6 >>>5**2 25 >>>2**7 128
上面這種程式碼塊,在我們以後的講解中還會不斷的出現,所以我們這裡給出一個簡單的說明。
通常程式的講解,最重要的是能容易的定位到某個特定位置。定位的方法最直接就是使用第幾行、第幾列這樣的方式,因此程式碼塊要能清晰的體現出來行、列的關係。行的位置在程式碼塊中使用了行號,就是你在這個例子中看到的從1到12的編號,比如說第4行的數字20,就是第三行命令的執行結果,這看起來非常清楚。
列編號顯然不那麼方便,但程式字型都會額外要求“相等寬度”,這樣你偶爾需要去計數和分辨格式的時候,就容易了很多。
程式塊通常還使用顏色“區分”程式不同部分的要求,上面的例子能看到顏色的變化,但是還不夠明顯,我們在以後的講解中你會看到更清晰的例子。
言歸正傳我們再說一下跟互動方式相關的內容:
>>>
符號,也就是3個大於號,這個是Python互動模式的“提示符”,意思是說“Hi,我準備好了,你可以輸入命令了!”。
見到這樣的提示符,在其後輸入你的命令,才能被Python互動方式所接受。再說一遍,這是Python互動模式在做完上一個任務、並且完成自身準備之後,主動給出的,不是你輸入的,你輸入的話,因為並沒有一個命令是3個大於號,所以也無法被Python互動模式所識別,只會給出報錯資訊。
在提示符之後,你輸入的每條命令,最後都要使用“回車鍵”來告訴Python:“我的命令輸入完了,你開始執行吧!”。在我們使用的電腦上,回車鍵通常標記為“ENTER”或者“RETURN”,不同的鍵盤可能有不同的標註,現在電腦和手機這麼普及了,我相信你早就知道了。
回車符在螢幕上並不會特別的顯示出來,你唯一能看到的就是引導文字輸入位置的游標,換了一行並出現在行的最開始位置,所以回車符也稱為換行符。隨後很快的等Python處理完命令,在這一行開始的位置開始顯示命令計算的結果。從上面的程式碼塊例子來看,偶數行,都是Python計算上一條命令所輸出的結果。結果顯示完成後,Python再次給出“>>>”提示符,等待你的下一條命令。
剛才我們講過了,互動模式每輸入一條命令,Python都會立即執行,並給出結果反饋,這會讓我們產生一種誤解,似乎Python反饋的結果,就是由上面輸入的這一條命令決定的。事實並非如此,Python每一次的反饋,都是由Python啟動之後,輸入的所有的命令累計一起,互相作用,所得到的結果。你之所以有誤會,是因為你輸入的命令,可能之間並沒有什麼相互影響的關係,所以這種“累計”沒有體現出來而已。之所以每個程式都需要由大量的命令組合而成,就是因為這種“累計相互作用”的結果。這個我們在後面會詳細講。
請儘量的多動手做一些練習來嘗試使用Python進行四則運算。對於本課程的學習者來說,四則運算太簡單了,但是希望你能從開始學習程式設計的心態來看待這些練習。所有的學習,都是從你已知的知識開始,接觸新知識,從而探索你所不知道的部分。如果上來就用你不懂的概念來解釋另外一個你不懂的概念,你一定會崩潰。
練習中還有一個對於亞洲人非常重要的注意事項:計算機在西方發明之初,實際上只有英文的處理能力。直到上世紀80年代,才有了中文的輸入法和電腦上的中文字元。所以,所有在Python(以及幾乎所有的主流程式語言中)使用的命令,都只能接受英文的字元輸入,中文字元、其它國家的語言字元,可以被Python處理,但並不能當做命令。
這些中文的字元,通常比同樣的英文字元要寬一倍,被稱為“全形”字元,對應的英文字元就是“半形”字元。最可怕的還有比空格字元寬一倍的中文空格。這種出現的錯誤非常難以排查。所以 如果看起來沒有敲錯,但Python持續報錯,建議你仔細用英文半形字元重新輸入。 使用英文半形字元,其實就是關閉中文輸入法的情況下輸入的字元。下面的程式塊示意性的讓你看到這種區別:
+#奇數行:英文半形字元 +#偶數行:中文全形字元 - - * * / /
回到使用Python做數學計算。在複雜計算中,運算優先順序是必須考慮的問題,上面的例子你已經看到了使用括號( )來確保優先執行的例子。Python的運算優先順序跟數學中的定義是相同的:
數學運算 ,優先順序由高到低 | 操作符 |
---|---|
括號 | () |
乘法、除法 | *** /** |
加法、減法 | + - |
在Python和大多的程式語言中,大括號{}、中括號[]都是有特定作用的,不能當做Python中的數學符號來使用。在數學中多重括號需要用到大括號和中括號的地方,可以重疊使用小括號()來實現,這種多重的重疊使用在程式設計中也稱為“巢狀”。
>>> (5+((3+2)*7-227))/4 -47
練習時間
1.請使用Python的互動模式來計算下面算式的值:
2100-21×53+2255 (103-336÷21)×15 800-(2000-9600÷8) 40×48-(1472+328)÷5 (488+344)÷(202-194) 2940÷28+136×7
2.如何求開平方運算?
應用題
每個程式編寫之前,都要先弄明白這個程式是幹什麼用的,執行在什麼樣的情形之下,解決什麼問題。這些前置的條件,有一個專有的名詞叫“程式需求”,也就是說,程式設計序的第一步是弄清楚“需求”。
這很類似上面的這些數學算式,每個枯燥的算式背後都有其背景,這個背景就是應用場景。下面我們就看一個應用題的例子:
某班有50名學生,準備集體去看電影,買到的電影票中,有30元一張的,有20元一張的。已知買電影票總共花1240元,問票價是30元和20元的電影票各幾張?
現在回答小學的問題,肯定容易的很。
設票價是20元的電影票為X張,則票價為30元的應有(50-X)張。
可列出方程:20X + 30(50 – X)= 1240
化簡方程:X=(30x50-1240):heavy_division_sign:(30-20),隨後就可以在Python中計算了。
>>> (30*50-1240)/(30-20) 26.0
求得X=26之後,50-X,可以得到票價為1.5元的電影票張數:24。我們在Python中計算的時候,可以直接使用:
>>> 50-26 24
還可以在X計算結束之後,直接使用:
>>> (30*50-1240)/(30-20) 26.0 >>> 50-_ 24.0
這個“_”,就是減號“-”鍵按住SHIFT鍵才能打出來的第二功能鍵。在Python互動模式中,“_”儲存了上一次計算的結果,等於把上一次的計算結果,替換到“_”出現的位置。
所以“_”符號,必須在所需要的計算完成之後,馬上使用才有效。如果還進行了其它計算,那“_”的值,會變成新計算的結果值。
這種功能是計算機的記憶儲存功能,“_”也被稱為“結果變數”。
變數
變數這個詞也源於數學,是計算機區別於其它非智慧計算裝置很重要的一個體現。變數的概念是所有程式語言中的重點之一。
你可以把每個變數理解為一個空盒子,盒子中可以用來儲存物品,當然這裡就是資料。每個盒子都要有一個容易記憶的名字,好讓你在需要的時候使用特定的盒子。盒子能夠在需要儲存的時候放入資料,在需要用到的時候再取出資料。為了儲存新的資料而不影響原來儲存過資料的盒子,我們可能需要建立一個新的空盒子來儲存新的資料。總結一下剛才說到的這幾種操作,我們可以得到變數的幾個要素:

- 變數名;
- 變數的值;
- 變數的宣告(準備新的空盒子);
- 變數的初始化(把值儲存到盒子);
幾乎在所有的程式語言中,學到變數,都要關注這幾點。
在Python中,因為變數並不需要宣告,每當你第一次使用一個變數名的時候,Python會自動的完成“新盒子的準備工作”,所以通常在Python中,你只要關注1、2、4共3點就好。
變數值的概念,是相對“立即數”常量而言的,上圖盒子中的數字“2”,上一節中我們使用Python計算器時候輸入的那些數字,都是常數。在電腦中因為是無需計算就能知道的值,所以也叫“立即數”。一個立即數總是顯而易見確定的,不會變化,因此在這裡也可以稱為常量。
立即數是確定的值,不可能變化。而變數,就是一個盒子,其中的容納的數字,當然可以變化。
這個變化是指變數盒子可以儲存不同的值。而在一個特定時刻,變數的值當然是確定的。
不要把變數跟數學中的未知數弄混,變數的值在任何一個特定時刻都是確定的,在Python中使用的時候,就當做那個確定的值來使用,是不折不扣的已知數。容易混淆的原因不過是因為變數名看上去像數學中的未知數而已。比如變數名和未知數可能都剛巧叫做“X”。
每種程式語言對於變數的命名都有一定規則,這是語言語法的一部分。Python對變數名的要求非常簡單:以任何字母開頭,後面可以是數字或者下劃線“_”。
Python3中還允許使用中文作為變數名,但是因為相容性、效率、容易出錯等原因,我們不推薦大家使用中文變數名。
語法之外,通常還有非強制性的習慣來規範變數名的寫法,比如:儘量使用有意義的單詞或者拼音來當做變數名。多個單詞的變數名,每個單詞的首字母大寫或者在兩個單詞之間使用下劃線。比如下面就是幾個有意義的變數名:
dogs rabbit1 price jia_ge numberOfBalls
下面幾個則算是不太理想的變數名:
abc aaa xyz
再下面幾個,乾脆是非法的變數名,用在Python中會報錯:
2floorballs!
numberOfBalls這樣的命名規則俗稱叫做“駝峰命名法”,原因你懂的。
jia_ge這樣的方式則稱為:“下劃線命名法”
變數就像一個空盒子,只有其中儲存了值,變數才有意義。讓變數儲存確定值的過程就是為變數“賦值”。變數宣告之後的第一次為變數賦值的操作被稱為“初始化”。當然因為Python不需要變數宣告,所以初始化跟賦值,在Python語言中看起來沒有什麼不同。
比如我們為兩個變數賦值:
x = 42 y = 42
用圖來表示的話,大概就是這個樣子:

這裡特別要注意的,是Python語言中的等號“=”是賦值命令的意思,或者叫賦值運算子。表示把“=”右側的值,賦值給“=”左側的變數。這跟數學中學到的等式是完全不同的概念。幾個重點:
- “=”左側必須是可以用來儲存值的變數名,也稱為“左值”。
- “=”右側必須是類似“42”這樣的立即數,或者是合法的表示式可以計算出數值,也稱為“右值”。
- “=”左右側的內容含義是確定的,不是等式,不可以左右側內容互換。
修改變數的值就是為變數再次賦值,跟初次為變數賦值沒有什麼不同。
下面我們使用變數的方法,再來計算一次上面的應用題:
某班有50名學生,準備集體去看電影,買到的電影票中,有30元一張的,有20元一張的。已知買電影票總共花1240元,問票價是30元和20元的電影票各幾張?
- 設票價是20元的電影票為X張,則票價為30元的應有(50-X)張。
- 可列出方程:20X + 30(50 – X)= 1240
- 化簡方程:X=(30x50-1240):heavy_division_sign:(30-20),Y=(50-X)。
在Python中計算一下試試吧。
說了變數,我們對應說了立即數。其實在其它語言中還有常量的概念,顧名思義,在程式完整的執行過程中,不能被修改的量就是常量。在Python中沒有常量的概念。但我們在學習中,思想上還是要有常量的概念,因為畢竟有很多值是常量,比如π,比如常數e,比如重力加速度g。
前面講過,立即數也是常量的一種,稱為常數。
函式
今天我們的概念都是圍繞著初級的數學概念展開的。當然也不能少了函式。有個很形象的圖可以描述函式的功能:

有特定的輸入,經過一系列的計算,完成特定的輸出,這就是函式的功能。數學中的y=f(x),x是輸入值,y是輸出值(數學中是等式,所以稱為y是輸出值,在Python中的話,y是儲存了輸出結果),f()就是函式本身。
函式的詳細內容我們會在下面一講進行,這裡只介紹一個非常常用的Python內建函式print(),功能是輸出引數的值。
比如上面一節的練習,如果你真的做了的話,會發現計算X和Y的值,似乎都沒有得到期望的結果。原因是計算的結果被賦值給了變數X或者Y,因此沒有自動顯示到Python互動式環境中,因此你沒有辦法像前面的那些計算一樣,直接看到結果。如果想看到結果怎麼辦呢?就是使用print()函式:
>>> print(X,Y) (26.0, 24.0)
在一個大的程式中,通常都要把程式按照功能劃分,使用很多個小的函式來實現,並組裝到一起。因此函式通常也被稱為子程式,但嚴格意義上講,通常只有沒有輸入值、輸出值的函式才可以稱為子程式。
整數和小數
幾乎所有的計算機都非常擅長整數運算,而通常整數運算也非常適合某些場景。比如螢幕解析度是1920*1080,在繪圖中計算出來小數通常也沒有意義;玩遊戲,打出了5發炮彈,計算出來5.5發也同樣用途不大。
整數的運算在計算機中如此重要,以至於雖然同樣是數學運算,整數運算和帶有小數的運算被大多數程式語言當做兩種型別來區別對待。這樣在特定的運算場景中,速度更快,精度更高。
整數的例子:3 4 5 101 256
小數的例子:3.14 1.414 2.1343e02
在計算機表示小數的時候,通常使用科學計數法,小數點的位置在科學計數法中是固定的,但跟原值比都不是原來的位置,因此也被稱為浮點數。以後我們都用“浮點數”這種更準確的方法來稱呼小數。
在實際應用中,經常會發生兩種型別的資料互相轉換的情況,你會頻繁的看到。
整數可以直接當做浮點數來使用,不需要轉換,但是要求算式中,有浮點數先參與了運算,比如5.1+4,4雖然是整數,但因為5.1是浮點數,整體算式會自動採用浮點數的方式來計算。整數常數轉換成浮點數,可以在其後加上小數位,比如:4.0。
浮點數轉換成整數則需要明確的指定轉換,這也稱為“顯式”的轉換。
-
使用int()函式轉換,比如int(3.54)的結果是3,小數部分,無論多少,都會捨去。
-
如果希望四捨五入,要附加使用round()函式,比如int(round(3.54)),結果是4。round()函式的功能是四捨五入,但結果依然是浮點數,上例中是4.0,所以還要再經過一次int()函式轉換。
針對整數和浮點數兩種不同的型別,運算也有一些區分:
整數運算 | 浮點數運算 |
---|---|
除法: 17 // 3 取餘數:17 % 3 |
除法:17 / 3 沒有取餘數的運算 |
賦值: a = 5 | 賦值:a = 5.0 |
整數運算和浮點數運算,雖然都是數學運算,也沒有數學意義上的難度,但是很重要,我們後面的課程會有大量不同型別的運算,所以一定要理解清楚兩者的區別。浮點數、整數轉換、整數運算相關的內容,暫且先以瞭解為主,後面我們還會詳細講解。
練習時間
使用Python計算下面應用題:
甲、乙兩人相距36千米,相向而行,如果甲比乙先走2小時,那麼他們在乙出發2.5小時後相遇;如果乙比甲先走2小時,那麼他們在甲出發3小時後相遇,甲、乙兩人每小時各走多少千米?(假設甲乙的速度均勻穩定)
本課程結尾的練習,通常是要求在輔導老師的幫助下由學生自己完成。並且課程所留下的練習時間一般無法讓學生能夠完成所有練習,所以需要學生回家後繼續,直至完成所有練習專案。
本講小結
今天是大家開始Python程式設計學習的第一節,介紹了Python的兩種工作模式,互動式模式和程式模式。並且使用互動模式的計算器功能讓大家使用小學數學的知識,開始熟悉Python的使用。
先學習了Python的基本運算和運算優先順序。然後學習了變數、函式的基本相關知識。理解變數的概念是學習的重點。
我們還穿插介紹了全形、半形的區別,這是初學中容易犯的錯誤,需要特別注意。
本講的練習重點是用Python語言的方式,來描述通常所見的數學公式,從而使用Python完成數學計算。在這個過程中,解題思路、題目含義等都屬於數學範疇,並不在本課的討論範圍內,我們盡力使用非常簡單的數學概念來引導大家入門Python的學習。
部分練習答案
1.開平方,也就是求平方根,可以使用指數的倒數形式,比如:
>>> 3 ** 0.5 1.7320508075688772 >>> 3 ** (1/2) 1 >>> 3 ** (1.0/2) 1.7320508075688772
注意上面第3行,因為1、2都是整數,所以實際當做了整數除法,而結果是0,所以導致3 ** 0結果是1。這種情況下應當採用第5行的形式,強制要求浮點運算。
2.最後應用題的思路
- 假設甲的速度為x千米/小時,假設乙的速度為y千米/小時
- 列方程式(2.5+2)x+2.5y=36,3x+(3+2)y=36
- 根據方程2推導為:x=(36-5y)/3,代入方程1
- y=(12 4.5-36)/(4.5 5/3-2.5)
- 最後得:y=3.6,將y值代回方程,得到x=6
有些同學可能希望更多的瞭解數學計算的知識,今天課程中的數學內容顯然太簡單。
Python官方提供了數學計算庫math,有能力的同學可以參考官方的文件: ofollow,noindex" target="_blank">https://docs.python.org/3/library/math.html ,我們以後的課程也會按照計劃做摘要的介紹。