[python] [VI coding] 第二章 變數、運算式與敘述 - 教學區

[python] [VI coding] 第二章 變數、運算式與敘述

文章瀏覽次數 3399

特種兵

特種兵圖像(預設)

2020-07-09 15:25:33

From:211.23.21.202

第二章 變數、運算式與敘述

新增 .py 檔案

特別說明一下,想新增副檔名為 .py 的文字檔,例如 1-1.py,

需要先在檔案總管下的資料夾中 alt 功能表「檢視」中核取「副檔名」這個項目,這樣檔案才會把真正的副檔名顯示出來。

而在新增檔案時,新增 -> 文字文件 會顯示 「新文字文件.txt」,此時直接刪除原本的檔名,改成例如 1-1.py 按 enter,

如果系統詢問是不是確認要修改就選是,這樣就可以了。

2-1 數值與型態

數值 (value) 在程式中是最基本的元素,廣義來講,由字母與數字所組成(包含中文字)。

這些組成數值的元素又可分為不同的資料型態:

  1. 整數 (integer): 例如 1, 17, 100 這些數字
  2. 字串 (string): 例如 'hello', 'a', '你好'
  3. 浮點數 (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 所有內建基本資料型態:

  1. 數字 (number)
    • 正整數、負整數
    • 正浮點數、負浮點數、科學記號表示法 3.14E10
    • 複數 (a+bJ)
  2. 字串 (string)
    • 'marry'
    • "marry"
    • 'the string is "word"'
    • "the string is 'word'"
    • 'it\'s a good "student"'
    • "it's a good \"student\""
  3. 布林值 (boolean)
    • a = True
    • b = False
  4. 位元物件 (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 變數名稱與關鍵字

變數名稱可以自訂,通常會使用有意義且與用途相關的單字來命名。

名稱雖然可以自訂,但還是有一些規則需要遵循:

  1. 只可以使用字母、數字、底線來命名(不推薦用中文)
  2. 名稱開頭一定要是字母或底線(不建議用底線開頭,通常底線開頭是系統變數)
  3. 名稱有區分大小寫
  4. 不能使用關鍵字/保留字 (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 運算式與敘述

運算式是由運算元與運算子所組合而成。運算元可能是數值或者變數。在剛剛我們已經舉了一些例子。

敘述是程式執行的語句,我們目前學會了一些,像是:

  1. 列印字串(與印表機無關,這裡是指把資訊顯示在畫面的意思)
    • print('你好')
  2. 賦值
    • 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 來直譯程式。

也就是將程式碼寫好存入檔案後,怎麼讓你的程式執行的過程。

  1. 按 windows + r 開啟執行列
  2. 輸入 cmd 並按 enter 進入 windows 的命令提示列
  3. 使用 cd 指令將工作路徑切換到你要直譯的程式路徑。(建議用英文命名比較容易書寫) 例如 cd\py 並按 enter
  4. 我們使用 \ (反斜線) 來分隔一層層的資料夾路徑,所以資料夾名稱本身有空格也沒關係,但必須用引號包住
  5. 如果檔案不是在本機磁碟 C 的狀況,假設在本機磁碟 D, 你必須先輸入 d: 並按 enter 切換磁碟機才能使用 cd 指令切換路徑。
  6. 請確認你目前已經位在正確的磁碟機與路徑上,使用 NVDA 可按 nvda + 上方向鍵 來聽取確認,或直接摸讀點字觸摸顯示器。
  7. 在該提示符號下輸入 python 檔名 並按 enter 來直譯 python 程式,例如 python 1-1.py
  8. 執行結果位在提示符號上方,如果使用 NVDA 必須按 九宮格7 往上閱讀執行結果(numlock關)。
  9. 在提示符號下輸入 exit 並按 enter 可以結束並關閉該命令提示視窗
  10. 在輸入檔名時可按 tab 鍵來補齊檔名,可避免打錯與節省時間
  11. 如果是 win10 可以直接按 alt+F4 把命令提示列視窗直接關閉,不用打 exit

好了,目前這兩種方式我們都已經熟悉了。

寫好的程式一定要先使用 python 轉譯,看看能否順利輸出預期結果,

如果有錯誤,試著自己排除,無法解決則應向有經驗的伙伴求助。

這兩個模式,他們之間存在一些差異,讓我們觀察一下。

現在,請在交互模式中輸入以下程式碼:

>>> twd = 100
>>> twd * 30
3000

在交互模式中,你可以立刻看到運算式在 python 被計算的回應結果。

請在檔案中輸入以上三個大於開頭後的程式碼,並且使用 python 直譯器執行看看。

你會發現畫面上沒有輸出任何東西,如果你有做過第一章的練習,你應該會知道它少了什麼。

答案是在檔案中的程式碼,除非你使用列印的函數將結果印出,否則程式不會自動幫你輸出。

將上例的程式碼改成這樣,你就可以在畫面上看到結果:

twd = 100
print(twd * 30)

請注意,在 print() 中有沒有加引號的差別是什麼,加引號就是把裡面的字串完整呈現,

不加引號就是去執行實際的運算並獲得結果,或者將變數替代成程式裡設定的值到式子裡。

2-7 運算順序

python 對於數學式的運算跟我們平常所認知的處理順序相同,也就是 先乘除後加減 的原則,如果有括號的算式就會優先處理。

這邊整理四條規則並舉例如下供參:

  1. 括號優先等級最高:

    2 * 3 - 1 = 5

    2 * (3 - 1) = 4

  2. 取次方具有第二優先級:

    2**1 + 1 = 3

  3. 乘除優先級高於加減,但乘除本身優先級一樣,加減也是:

    2 + 2 * 3 = 8

    6 + 4 / 2 = 8

  4. 如果優先級一樣,那就以由左至右的順序進行運算,但剛剛提過的取次方除外(由右至左)。

    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. 變數名稱裡有關鍵字
  2. 變數名稱裡有包含空格或非底線的特殊符號
  3. 變數名稱的開頭是數字

這一章可能會遇到的語意錯誤如下:

  1. 同一個變數名稱發生拼字錯誤
  2. 以為大小寫不同的變數是同一個變數
  3. 把運算子的優先順序弄錯,所以得到了一個不是原本想要的計算結果

動動腦

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 = '.'

寫出底下各個式子中的值與資料型態:

  1. width / 2
  2. width / 2.0
  3. height / 3
  4. 1 + 2 * 5
  5. delimiter * 5

請使用 python 驗證上面的答案,如果結果不是你預期的,請思考一下為什麼。

第3題 檔名 2-3.py

你在一家書店打工,你的月薪是 22000 元,如果賣出一本書,你可以得到 10% 的利潤,

這個月共賣出 5 本書,每本 200 元,但因為遲到,所以被老闆扣了一天的工資 1000 元,

寫一支程式,計算這個月可以拿到多少工資,程式中必須有變數與註解。

第4題 檔名 2-4.py

寫一支程式,計算 1 到 10 的和。(不可以使用迴圈)

除了一般的算法,還有什麼快速的計算式子。

第5題

測試小於零的整數使用 // 也就是地板除的結果會是怎樣,有什麼特性?

參考資料

python 3 的 print 變成函數

python 命名與保留字

影片

第二章 變數、運算式與敘述 part one

第二章 變數、運算式與敘述 part two

最後更新:2021-10-08 22:39:17

From: 111.249.165.250

By: 特種兵