到了中午,Maya 腦子裡記著六個數,已經漏掉兩個。給每個數起名字——杯數、單價、找零——是第一步。可如果同一個名字這次裝的是文字,而不是數字呢?
變數給值起名字,讓程式可以重複使用它。Python 是動態型別語言:你不需要聲明型別,但每個值仍然有型別。理解型別,才能預測運算子和函式的行為。 你還會看到別名如何改變列表,以及為什麼轉換應該放在邊界。
賦值就是給值起名
等號把右邊的值賦給左邊的名字。重新賦值會替換舊值。變數名要描述用途,例如用 order_total 而不是 t。
price = 4.5
quantity = 3
total = price * quantity
print(total)一次小計算
先認識四種型別
整數儲存整數值,浮點數儲存小數,字串儲存文字,布林值只有 True 和 False。type() 可以查看任何值的型別。看起來像數字的值,如果加了引號,仍然是字串。
print(type(7).__name__)
print(type(4.5).__name__)
print(type("7").__name__)
print(type(True).__name__)查看型別
有意識地轉換型別
int() 把兼容的文字或小數轉成整數,float() 轉成小數,str() 把值轉成文字。轉換可能失敗:int("hello") 會拋出 ValueError,後面會學習如何處理它。
count = int("12")
price = float("4.5")
label = str(2026)
print(count, price, label)顯式型別轉換
一個名字可以指向可變物件
賦值不會複製列表。alias = orders 讓兩個名字指向同一個物件,所以通過一個名字修改,另一個也會看到。orders[:] 建立淺拷貝;如果列表裡還有列表,內層物件仍然共用。
orders = ["latte", "tea"]
alias = orders
copy = orders[:]
alias.append("mocha")
copy.append("water")
print(orders)
print(copy)
records = [{"id": 1}]
shallow = records[:]
shallow[0]["id"] = 99
print(records)別名、淺拷貝和共用的內層物件
在邊界處轉換一次
來自檔案、網址和表單的值一開始都是文字。在邊界處轉換一次,之後就用數字計算。反覆轉換會把型別錯誤擴散到整個程式;只轉換一次,後面的程式碼才可預測。
raw_count = "3"
raw_price = "4.50"
count = int(raw_count)
price = float(raw_price)
total = count * price
print(type(count).__name__, type(price).__name__)
print(f"{total:.2f}")把文字變成數字一次
不要直接用 == 比較浮點數
在二進位浮點數裡,0.1 + 0.2 並不精確等於 0.3。這個微小差異用 print() 看不出來,但用在相等判斷裡就會出錯。展示時可以 round,做判斷時用 math.isclose(),或者改用整數分。金額常用整數分儲存,就是這個原因。
total = 0.1 + 0.2
print(total)
print(total == 0.3)
print(round(total, 2) == 0.3)
cents = 10 + 20
print(cents / 100)近似浮點數與精確整數分
本課要點
- 賦值把名字綁定到值,重新賦值會替換原值。
- int、float、str、bool 是最先要熟悉的四種型別。
- type(value).__name__ 會回傳可讀的型別名稱。
- 做算術前,先把輸入或文字轉換成數字。
- 給列表賦值可能只是起別名;切片只複製外層列表。
- 浮點數是近似值;比較時用誤差範圍,或者改用整數分。
常見錯誤
- 把字串和數字直接相加,沒有先轉換其中一邊。
- 以為 / 回傳整數;在 Python 3 中,除法總是回傳浮點數。
- 在賦值之前使用變數,會觸發 NameError。
- 以為 b = a 複製了列表,其實兩個名字指向同一個物件。
- 浮點數運算之後直接寫 if total == 0.3。
為一個商品建立名稱、單價和數量變數,列印保留兩位小數的總價。
動手試試
改改變數、先預測輸出,再執行程式碼。第一次點擊「執行程式碼」時會下載 Python 執行時,可能需要幾秒鐘。
練習本課
12 道題,作答後立即看到解釋。