National Taiwan University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try a Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

1

Local AI

--

Uedu Code

--

台灣大學 AQI 69 24°C PM2.5 18
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 06

基本輸入與輸出

print()、input() 與三種格式化字串
Interaction實作 20 minute(s)

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

1.

下面的程式會印出什麼?

print("a", "b", sep="-", end="!")
print("c")
2.

使用者在 x = input() 輸入 5,接著執行 print(x * 3),會印出什麼?(下面的程式用 x = "5" 模擬輸入)

x = "5"
print(x * 3)
3.

網頁表單讓訪客輸入一個年齡,程式要把它轉成整數。哪一種寫法最適合?

第 1 次作答

三種格式化字串

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 這種格式碼。

互動練習:格式規格

改變寬度、小數位數、對齊和填充字元,看 f-string 的結果怎麼變。試試看把型別改成 e(科學記號)或 %(百分比),或是勾選千分位逗號。

str.format() 與 % 運算子

str.format() 用 {} 當置換欄位,可以寫位置編號 {0}、{1},也可以寫關鍵字 {name};**data 會把字典拆成關鍵字引數。最後三行是舊式的 % 運算子:%s 對應文字、%d 對應整數、%f 對應浮點數。

想一想:格式化

1.

下面的程式會印出什麼?

print(f"[{3.14159:6.2f}]")
2.

下面的程式會印出什麼?

print("{1}-{0}".format("a", "b"))
3.

下面的程式會印出什麼?

print("%05.1f" % 3.14159)
第 1 次作答

實作:讀兩個分數,印出平均

程式會讀入姓名和兩個分數(下方的輸入已經準備好: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。
這一課完成了!
Next lesson:流程控制:條件判斷
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。