Learning Objectives
- 使用輸入內建函數 input(),以及 eval() 的用途與風險
- 使用輸出函數 print() 與 sep、end 參數
- 解釋三種文字格式化(f-string、str.format()、% 運算子)的優缺點與用法
程式怎麼和人溝通
到目前為止,程式裡的資料都是寫死的。要讓程式真的有用,它得能讀進使用者給的資料,再把結果整齊地顯示出來:
| 方向 | 函數 | 說明 |
|---|---|---|
| 輸出 | print() |
把資料轉成文字,送到標準輸出(預設是螢幕) |
| 輸入 | input() |
從鍵盤讀一行文字,傳回的一定是字串 |
| 計算 | eval() |
把一段字串當成 Python 運算式來計算 |
本課最後介紹三種格式化字串的方式,讓數字可以控制寬度、小數位數、對齊,輸出看起來像一張表。
本課的範例會用到
input()。播放軌跡時,程式讀到的輸入已經預先準備好,你也可以在下方改掉輸入內容再跑一次。
print() 與 sep、end
print(*objects, sep=' ', end='\n'):可以一次給好幾個值,用逗號隔開;sep 決定值和值之間放什麼,end 決定印完之後放什麼。看輸出區每一行是怎麼接起來的。
input() 讀到的是字串
兩次都輸入 21。第一次直接用,第二次先用 int() 轉成整數。比較第 4 行和第 8 行的結果:同樣是 +,字串是「接起來」,整數是「相加」。
eval():把字串當成運算式
eval() 會把字串當成 Python 程式碼來執行,所以輸入 3 * (4 + 5) 會真的算出 27,輸入 2.5 會得到浮點數。最後一段示範:只是要讀數字時,用 int()、float() 就好。
使用 eval() 要小心
eval() 很方便,但它會執行任何輸入的 Python 程式碼。如果輸入的內容來自不認識的人(例如網頁表單),
對方可以輸入一段刪除檔案的程式,eval() 也會照做。
| 需求 | 建議做法 |
|---|---|
| 讀一個整數 | int(input()) |
| 讀一個小數 | float(input()) |
| 讓自己在練習時計算運算式 | eval(input())(只在自己的電腦、自己輸入時使用) |
原則:不要對別人提供的文字使用
eval()。
想一想:print 與 input
下面的程式會印出什麼?
print("a", "b", sep="-", end="!")
print("c")
使用者在 x = input() 輸入 5,接著執行 print(x * 3),會印出什麼?(下面的程式用 x = "5" 模擬輸入)
x = "5"
print(x * 3)
網頁表單讓訪客輸入一個年齡,程式要把它轉成整數。哪一種寫法最適合?
三種格式化字串
Python 內建三種格式化方式,不需要額外的程式庫:
| 方式 | 範例 | 特色 |
|---|---|---|
| f-string(Python 3.6 起) | f'{name} is {age}' |
最新、最好讀;大括號裡可以放任何運算式、呼叫方法;效能也較好 |
| str.format() | '{} is {}'.format(name, age) |
較新風格,可以用位置編號、關鍵字、字典 |
| % 運算子 | '%s is %d' % (name, age) |
舊風格,類似 C 語言的 sprintf,常見於 Python 2 的程式,新程式盡量少用 |
三種方式的格式規格寫法很像:在冒號後面寫 寬度.小數位數 型別。
| 規格 | 意思 | 12.34567 的結果 |
|---|---|---|
4.0f |
寬度 4、小數 0 位 | ' 12' |
5.2f |
寬度 5、小數 2 位 | '12.35' |
06.2f |
寬度 6、不足補 0 | '012.35' |
>10 / <10 / ^10 |
寬度 10,靠右/靠左/置中 |
f-string
字串前面加 f,大括號 {} 裡的運算式就會被計算、換成結果。{值:格式} 的冒號後面可以控制寬度、小數位數、補零與對齊;日期時間也可以用 %Y-%m-%d 這種格式碼。
str.format() 與 % 運算子
str.format() 用 {} 當置換欄位,可以寫位置編號 {0}、{1},也可以寫關鍵字 {name};**data 會把字典拆成關鍵字引數。最後三行是舊式的 % 運算子:%s 對應文字、%d 對應整數、%f 對應浮點數。
想一想:格式化
下面的程式會印出什麼?
print(f"[{3.14159:6.2f}]")
下面的程式會印出什麼?
print("{1}-{0}".format("a", "b"))
下面的程式會印出什麼?
print("%05.1f" % 3.14159)
實作:讀兩個分數,印出平均
程式會讀入姓名和兩個分數(下方的輸入已經準備好:Amy、85、92)。請完成 TODO:先把讀到的字串轉成數字,再用 f-string 印出平均(小數 2 位),用 str.format() 印出總分。
重點精華回顧
print()可以一次印多個值;sep改變值之間的分隔,end改變結尾(預設換行)。input()一定傳回字串,要做數學運算先用int()、float()轉換。eval()會把字串當成 Python 運算式執行;方便但有風險,不要用在別人提供的文字上。- 三種格式化:f-string(最新、最好讀,建議優先使用)、str.format()(位置、關鍵字、字典)、% 運算子(舊風格)。
- 格式規格
寬度.小數位數 型別:5.2f、06.2f、>10;日期時間用%Y-%m-%d %H:%M:%S。