第二章 變數、運算式與敘述
新增 .py 檔案
特別說明一下,想新增副檔名為 .py 的文字檔,例如 1-1.py,
需要先在檔案總管下的資料夾中 alt 功能表「檢視」中核取「副檔名」這個項目,這樣檔案才會把真正的副檔名顯示出來。
而在新增檔案時,新增 -> 文字文件 會顯示 「新文字文件.txt」,此時直接刪除原本的檔名,改成例如 1-1.py 按 enter,
如果系統詢問是不是確認要修改就選是,這樣就可以了。
2-1 數值與型態
數值 (value) 在程式中是最基本的元素,廣義來講,由字母與數字所組成(包含中文字)。
這些組成數值的元素又可分為不同的資料型態:
- 整數 (integer): 例如 1, 17, 100 這些數字
- 字串 (string): 例如 'hello', 'a', '你好'
- 浮點數 (float): 例如 3.14, 2.5, 0.01
其中,整數與符點數可以計算,就是可以寫成數學式子。
而字串是利用一對引號 '' 包起來的文字,所以 '3.14' 與 '100' 不是浮點數,也不是整數,而是字串。
使用 type() 函數可以確認資料的型態,如下所示:
>>> type('Hello, World!')
<class 'str'>
>>> type('你好')
<class 'str'>
>>> type(17)
<class 'int'>
>>> type(3.2)
<class 'float'>
>>> type('17')
<class 'str'>
>>> type('3.2')
<class 'str'>
這邊列出 python 所有內建基本資料型態:
- 數字 (number)
- 正整數、負整數
- 正浮點數、負浮點數、科學記號表示法 3.14E10
- 複數 (a+bJ)
- 字串 (string)
- 'marry'
- "marry"
- 'the string is "word"'
- "the string is 'word'"
'it\'s a good "student"'
"it's a good \"student\""
- 布林值 (boolean)
- a = True
- b = False
- 位元物件 (bytes object)
- b'python' 這部分超出基本課程的範圍,在這份講義我們先不詳細討論,不過檔案讀寫的章節會帶到。
2-2 變數 (variable)
程式語言中很強大的功能就是可以操作變數。
變數是用來儲存數值的一個記憶體空間,在 python 中,更確切的說,變數是一個指向數值的標籤。
我們使用指派 (assign) 敘述語句直接把值給變數。
>>> message = 'I am string'
>>> type(message)
<class 'str'> # 字串
>>> chi = '你好'
>>> type(chi)
<class 'str'> # 字串
>>> n = 17
>>> type(n)
<class 'int'> # 整數
>>> pi = 3.1415926535897932
>>> type(pi)
<class 'float'> # 浮點數
變數的型態取決於它所指向資料的型態,在 python 中,你可以隨時變更一個變數的值與型態。
讓我們來改變變數 n 的值與資料型態:
>>> n = 1.1
>>> n
1.1
>>> type(n)
<class 'float'> # 浮點數
>>> n = 'abc'
>>> n
'abc'
>>> type(n)
<class 'str'> # 字串
2-3 變數名稱與關鍵字
變數名稱可以自訂,通常會使用有意義且與用途相關的單字來命名。
名稱雖然可以自訂,但還是有一些規則需要遵循:
- 只可以使用字母、數字、底線來命名(不推薦用中文)
- 名稱開頭一定要是字母或底線(不建議用底線開頭,通常底線開頭是系統變數)
- 名稱有區分大小寫
- 不能使用關鍵字/保留字 (keyword) 來命名
先來看一下,比較好的命名範例
我們的錢
# 你的錢真的是我的錢嗎?
>>> your_money = 100
>>> my_money = your_money
>>> your_money
100
>>> my_money
100
>>> your_money = 500
>>> my_money
100
賣水果
# 蘋果是香蕉的兩倍
>>> banana = 10
>>> apple = banana * 2
>>> apple
20
# 香蕉被吃掉 3 根
>>> remaining_banana = banana - 3
>>> remaining_banana
7
以下變數命名的範例都是錯誤的,請思考哪裡不對?或者觸犯了上面四條的哪一條規則。
>>> 76trombones = 'big parade'
SyntaxError: invalid syntax
>>> more@ = 1000000
SyntaxError: invalid syntax
>>> class = 'Advanced Theoretical Zymurgy'
SyntaxError: invalid syntax
系統關鍵字通常是有特殊用途的,例如語法的關鍵字或命令,所以不能使用關鍵字來命名變數。
這邊列出 python 的關鍵字:
- and del from not while
- as elif global or with
- assert else if pass yield
- break except import class in
- raise continue finally is return
- def for lambda try nonlocal
所以 int, str, float 等都不是關鍵字,理論上可以拿來當作變數名稱,但習慣上不會這樣做,因為怕自己搞混。
由於 python 在使用變數前不需要事先宣告變數的型態,所以這些字不會被當成關鍵字,但有些語言則會把這些字當作關鍵字。
2-4 運算子與運算元
運算子是式子中做運算的符號。
最直覺的就是 + - * / = 等等。
運算元則是式子中被用來做運算的成員。
運算子與運算員構成運算式。這裡是一些運算式的例子:
- 20 + 32
- hour - 1
- hour * 60 + minute
- minute / 60
- minute // 60
- 5**2
- (5 + 9) * (15 - 7)
- 9 % 5 = 4 (取餘數 mod)
上面的單字是變數名稱,我們假設這些變數已經有值了,在有值的情況下才能拿來做運算。
值得注意的是除法,/ 是自然除法,而 // 是整數除法,整數除法又稱 地板除 (floor)。
>>> a = 59
>>> b = 60
>>> a / b
0.9833333333333333
>>> a // b
0
當算式中有浮點數時,程式會自動將結果轉型為浮點數型態。
>>> a // 60.0
0.0
由上例看來,當兩者同時發生時,自動轉型功能會優於整數除法。
其他運算子還有: <, >, <=, >=, ==, !=, and, or, not, in, is 等等。
這些運算符號,我們之後會一一提到。
2-5 運算式與敘述
運算式是由運算元與運算子所組合而成。運算元可能是數值或者變數。在剛剛我們已經舉了一些例子。
敘述是程式執行的語句,我們目前學會了一些,像是:
- 列印字串(與印表機無關,這裡是指把資訊顯示在畫面的意思)
print('你好')
- 賦值
n = 17
事實上運算式(列式)也可以說是程式的敘述,而運算式與敘述的不同之處在於,運算式一定會有值,但敘述可以沒有。
在 python 程式中,賦值的運算式也可以這樣使用:
>>> a = b = c = 10
>>> x = a + b + c + 12
>>> x
42
初學程式設計也經常會有一個疑惑,就是變數的值到底會不會被改變,有時的確跟數學算式不太一樣,請看以下例子:
>>> x = 10
>>> y = x / 3
>>> x
10
>>> type(x)
<class 'int'>
>>> y
3.3333333333333335
>>> type(y)
<class 'float'>
理論上運算式中除非有等號,不然變數的值不會被改變,看一下改變的例子:
>>> x = 10
>>> x
10
>>> type(x) # 加法前列出x資料型態
<class 'int'>
>>> x = x + 5.5 # 數學不會這樣寫
15.5
>>> type(x) # 加法後列出x資料型態
<class 'float'>
在終端機也就是 python 命令列試看看以下算式,變數的值將不會被改變。
>>> a = 10
>>> a
10
>>> a + 5
15
>>> a
10
# 如果沒有等號,結果只保留到該式子結束,並不影響變數的值。
在一個等式中,最左邊的運算元不可以是常數 (constant):
>>> 10 = x
File "<stdin>", line 1
SyntaxError: can't assign to literal
常數也就是數值,它不能被改變。
2-6 交互模式與腳本模式
交互模式就是直接在 python 的終端機裡(>>>
提示符號下) 直接輸入程式碼並取得結果的方式。
這部分我們在第一章已經介紹過,講義也處處可見類似的例子,範例中三個大於開頭的就是了。
腳本模式就是將程式碼寫在檔案裡,透過 python 直譯器,將程式直譯成機器碼執行顯示結果在畫面上的方式。
在第一章中,我們已經把作業寫在檔案裡了,讓我們複習一下使用 python 來直譯程式。
也就是將程式碼寫好存入檔案後,怎麼讓你的程式執行的過程。
- 按 windows + r 開啟執行列
- 輸入 cmd 並按 enter 進入 windows 的命令提示列
- 使用 cd 指令將工作路徑切換到你要直譯的程式路徑。(建議用英文命名比較容易書寫) 例如
cd\py
並按 enter - 我們使用
\
(反斜線) 來分隔一層層的資料夾路徑,所以資料夾名稱本身有空格也沒關係,但必須用引號包住 - 如果檔案不是在本機磁碟 C 的狀況,假設在本機磁碟 D, 你必須先輸入 d: 並按 enter 切換磁碟機才能使用 cd 指令切換路徑。
- 請確認你目前已經位在正確的磁碟機與路徑上,使用 NVDA 可按 nvda + 上方向鍵 來聽取確認,或直接摸讀點字觸摸顯示器。
- 在該提示符號下輸入 python 檔名 並按 enter 來直譯 python 程式,例如 python 1-1.py
- 執行結果位在提示符號上方,如果使用 NVDA 必須按 九宮格7 往上閱讀執行結果(numlock關)。
- 在提示符號下輸入 exit 並按 enter 可以結束並關閉該命令提示視窗
- 在輸入檔名時可按 tab 鍵來補齊檔名,可避免打錯與節省時間
- 如果是 win10 可以直接按 alt+F4 把命令提示列視窗直接關閉,不用打 exit
好了,目前這兩種方式我們都已經熟悉了。
寫好的程式一定要先使用 python 轉譯,看看能否順利輸出預期結果,
如果有錯誤,試著自己排除,無法解決則應向有經驗的伙伴求助。
這兩個模式,他們之間存在一些差異,讓我們觀察一下。
現在,請在交互模式中輸入以下程式碼:
>>> twd = 100
>>> twd * 30
3000
在交互模式中,你可以立刻看到運算式在 python 被計算的回應結果。
請在檔案中輸入以上三個大於開頭後的程式碼,並且使用 python 直譯器執行看看。
你會發現畫面上沒有輸出任何東西,如果你有做過第一章的練習,你應該會知道它少了什麼。
答案是在檔案中的程式碼,除非你使用列印的函數將結果印出,否則程式不會自動幫你輸出。
將上例的程式碼改成這樣,你就可以在畫面上看到結果:
twd = 100
print(twd * 30)
請注意,在 print() 中有沒有加引號的差別是什麼,加引號就是把裡面的字串完整呈現,
不加引號就是去執行實際的運算並獲得結果,或者將變數替代成程式裡設定的值到式子裡。
2-7 運算順序
python 對於數學式的運算跟我們平常所認知的處理順序相同,也就是 先乘除後加減 的原則,如果有括號的算式就會優先處理。
這邊整理四條規則並舉例如下供參:
-
括號優先等級最高:
2 * 3 - 1 = 5
2 * (3 - 1) = 4
-
取次方具有第二優先級:
2**1 + 1 = 3
-
乘除優先級高於加減,但乘除本身優先級一樣,加減也是:
2 + 2 * 3 = 8
6 + 4 / 2 = 8
-
如果優先級一樣,那就以由左至右的順序進行運算,但剛剛提過的取次方除外(由右至左)。
4 * 5 / 2 = 10
如果能夠記住優先順序固然很好,但忘了也無所謂,因為可以善用括號來安排好想要的運算順序。
2-8 字串操作
你不能對字串做數學運算,可能會有錯誤或出現意想不到的結果。
>>> '2' - '1'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'str' and 'str'
以上的操作會發生錯誤。
但我們可以使用 + 或 * 這兩個符號來處理字串。
如果你對字串使用 + (加號) 則表示將字串相連接:
>>> a = 'he'
>>> b = 'llo'
>>> a + b
'hello'
如果你對字串使用 * (乘號) 則表示該字串連續重複的次數:
>>> s = 'hello'
>>> s * 3
'hellohellohello'
2-9 註解 (comment)
註解可讓程式更容易閱讀,並且讓你快速地了解該區塊的程式碼用途,通常我們使用自然語言撰寫註解。
在一個團隊合作中,註解是很重要的,另外,對於我們非英語系的人來說,可以用自己的母語撰寫註解,肯定可以讓你更直覺地弄懂當初的程式邏輯與架構想法。
註解只會在查看程式原始碼時被看見,程式真正執行時會被 python 直譯器忽略,所以註解只是用來給人看的而已。
整行(單行)註解:
從註解符號 #
井號開始到行尾都不會被執行,註解也可以放在程式碼的行尾。
# 計算一星期工作幾小時
week_work_time = day_work_time * 7
放於程式碼後行尾的註解:
week_work_time = day_work_time * 7 # 計算一星期工作幾小時
有必要下註解時,可以簡潔撰寫原因或目的,讓閱讀程式的人可以更加了解當時的狀況。
在官方的建議中,希望井號與註解本身中間可以空一格,如果是寫在程式碼後面的註解,則建議程式碼與井號之間可以空兩格,請參考本章我們的範例。
以下的註解包含了程式碼本身沒有的訊息(較有意義):
player = 2 # 目前該遊戲可允許2-4位使用者同時進行遊戲,2為預設值
以下的註解是多餘的(較沒意義):
week_work_time = day_work_time * 7 # 把 day_work_time 乘以 7 之後把答案給 week_work_time
如果有好幾行的註解,除了每行使用井號外,也可以借用 ''' 前後包住文字,當作區塊註解,這就是多行的註解。
會說借用,是因為這個符號用在定義多行字串,後面章節的範例會提到,還有 docstring 也就是函數說明文件的應用。
'''
程式功能:井字遊戲
作者:王小明
時間:2021/03/10
版本:0.1
'''
player = 'O'
pc = 'X'
好的變數名稱可以讓我們更直覺地理解該變數的意義與用途,但變數名稱太長又會使程式不易閱讀,因此需要權衡一下輕重。
註解也是一門學問,太冗長不利於程式閱讀,反而造成干擾,但太隨意的註解又可能沒有任何幫助。
通常註解並不需要描述語法,註解是給懂程式語法的工程師看的,並不是程式教學說明,
註解的意義是描述為什麼我們要這樣做,或者這一段程式難讀的地方在哪裡等,也就是從程式碼無法直接獲得的重要資訊,才是關鍵所在。
2-10 讓 print() 一次印出多個值
在 python 中,兩個值之間必須使用 , 逗號來隔開,看看 print() 的例子:
print('a = ', a)
上例,第一個參數是字串,第二個參數則是變數。
在 print 中你可以使用 + (加號) 來串接所要印出的內容,但必須注意字串與數值不能混用,就是之前提到的串接字串。
print('abc' + 'def')
除錯
這一章可能會遇到的語法錯誤如下:
- 變數名稱裡有關鍵字
- 變數名稱裡有包含空格或非底線的特殊符號
- 變數名稱的開頭是數字
這一章可能會遇到的語意錯誤如下:
- 同一個變數名稱發生拼字錯誤
- 以為大小寫不同的變數是同一個變數
- 把運算子的優先順序弄錯,所以得到了一個不是原本想要的計算結果
動動腦
1.如何交換兩個變數的值?
a = 5
b = 10
print(a, b)
a, b = b, a
print(a, b)
2.我們知道 'a' * 5 相當於印出 5 個 a 字母,那 5 * 'a' 也可以嗎?
答案是肯定的,因為乘法有交換率。
3.當運算子的優先順序相同時,會由左至右進行運算,現在有一個式子 2 * 2 * 5 * 5
, 對人來說還可以怎樣快速地計算或理解它?
這似乎是個數學問題,可以看成 2 的平方乘 5 的平方,之後的習題應該會用到。
2**2 * 5**2
練習
第1題 檔名 2-1.py
以下程式是在交互模式下執行的,請你將它寫入檔案並修改成可以用 python 直譯器執行的版本,輸出結果要與在交互模式下相同。
>>> x = 5
>>> x
5
>>> x + 2
7
第2題 檔名 2-2.py
根據以下條件:
- width = 17
- height = 12.0
- delimiter = '.'
寫出底下各個式子中的值與資料型態:
- width / 2
- width / 2.0
- height / 3
- 1 + 2 * 5
- delimiter * 5
請使用 python 驗證上面的答案,如果結果不是你預期的,請思考一下為什麼。
第3題 檔名 2-3.py
你在一家書店打工,你的月薪是 22000 元,如果賣出一本書,你可以得到 10% 的利潤,
這個月共賣出 5 本書,每本 200 元,但因為遲到,所以被老闆扣了一天的工資 1000 元,
寫一支程式,計算這個月可以拿到多少工資,程式中必須有變數與註解。
第4題 檔名 2-4.py
寫一支程式,計算 1 到 10 的和。(不可以使用迴圈)
除了一般的算法,還有什麼快速的計算式子。
第5題
測試小於零的整數使用 //
也就是地板除的結果會是怎樣,有什麼特性?
參考資料
影片
最後更新:2021-10-08 22:39:17
From: 111.249.165.250
By: 特種兵