《從零開始PYTHON3》第二講
上一講我們說過了如何啟動Python IDLE集成開發學習環境,macOS/Linux都可以在命令行執行idle3。Windows則從開始菜單中去尋找IDLE程序的圖標。
上一講我們還見到了Python的兩種工作模式,交互模式和程序模式。
通常在一個大型的系統中,程序模式是必然的選擇。因為一個完整的項目,都需要大量的准備工作。為很多運算的必要條件准備最初的值(專有名詞也叫“初始化”),接下來的運算也往往邏輯復雜,需要作出多種選擇和頻繁的組合計算。這個過程,需要用計算機能明白的文字完整描述出來。描述的過程,也就是稱為編寫程序的過程。(下圖僅為示意性,先不要管程序的內容)
命令行方式則看上去更簡單,Python對你的每條命令即時的給出反饋,適合用戶邊想邊試,快速的看到結果,並根據結果調整策略、再次嘗試。
Python語言應用於工程界和科學界的時候,經常就是工作在這種模式。交互模式下一遍遍嘗試的過程,實際也是“研究”的過程。當然研究取得了成果,最終還是需要用“編程”的模式,把研究結果變成一個產品。
通常這樣編寫的程序的主體部分,就是在交互模式中,順序輸入的命令的總和。
在我們剛剛接觸Python的階段,交互模式也為我們的學習提供了良好的支持,動手實驗每一個小的學習過程,根據反饋的結果驗證我們的思考。學習->思考->動手驗證->再次學習,這是我們學習的一般路徑。
啟動IDLE程序之后,Python默認就工作在交互方式下,也就是上面這張圖的樣子。在File(文件)菜單中選擇New File(新文件)或者Open(打開)以前的老程序,則Python會再打開一個窗口,在新窗口中可以編輯、修改程序,也就是程序模式。本節課我們主要講解交互模式。
交互模式可以完成很多工作,在其它編程語言中需要用復雜的程序才能完成的工作,可能在Python交互模式中簡單的幾條命令就能完成。今天實際是我們正式踏上編程之旅的第一課,我們從最強大易用的Python數學計算來開始。
把Python當做計算器
首先是最基本的四則運算和常用的乘方:
數學運算 | 操作符 |
---|---|
加法 | + |
減法 | - |
乘法 | * (不是✖️) |
除法 | / (不是➗) |
乘方 | ** |
這是最好理解的部分,加、減兩項運算跟我們數學課上學的完全相同,乘法、除法、乘方的運算符則使用了替代的符號。
這樣設計的原因說起來話題比較長。
大概講就是計算機發展之初,輸入設備是由傳統的英文打字機改裝而來的,鍵盤布局當然就采用了同英文打字機相同的布局。
但是在這種布局上,加、減符號是有的,乘除符號則沒有,因此乘法使用了從外形看比較接近的“*”,除法則使用了意義上最接近的“/”。
為什么不使用“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)➗(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中會報錯:
2floor balls!
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)➗(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=(124.5-36)/(4.55/3-2.5)
- 最后得:y=3.6,將y值代回方程,得到x=6
有些同學可能希望更多的了解數學計算的知識,今天課程中的數學內容顯然太簡單。
Python官方提供了數學計算庫math,有能力的同學可以參考官方的文檔:https://docs.python.org/3/library/math.html,我們以后的課程也會按照計划做摘要的介紹。