Semorphe

文字處理

把前面十一課接起來,做一件真的事。 · ⏱ 約 30 分鐘

你會學到三件事

  1. 字串常用的幾個方法
  2. split 把一句話拆成一串字
  3. 推導式:把一串變成另一串

開始之前

這是入門的最後一課。它沒有太多新概念—— 它是把清單、迴圈、函式接起來,做一件你真的可能會做的事。

🟢 先把編輯器打開,跟著下面一起做:跟著做

一、字串的方法

文字後面加一個點,就有一堆現成的可以用:

1s = "Hello, World"2print(s.upper())       # HELLO, WORLD3print(s.lower())       # hello, world4print(len(s))          # 12
"Hello, World"變數s轉大寫變數s轉小寫變數s的長度印出印出印出設定s為1234

積木盤上這兩顆寫著「… 轉大寫」與「… 轉小寫」。

⚠️ 它們都回傳新的,不會改到 s。

🚫 這一段是反例——課文在說不要這樣寫,別照著拉。

1s.upper()              # 算出來了,而沒有人接住它 → 白做2s = s.upper()          # ✅
變數s轉大寫變數s轉大寫設定s為12

字串在 Python 裡是不可變的——所有「改」字串的方法, 其實都是「做一個新的」。

常用的:

做什麼
s.strip() 去掉頭尾的空白(處理輸入時幾乎一定要)
s.replace(a, b) 把 a 換成 b
s.startswith(x) / endswith(x) 開頭/結尾是不是 x
s.find(x) x 在第幾個位置(找不到回 -1)
x in s x 在不在裡面

二、split:拆成一串

要把一段文字拆開,用 .split():

🔎 這一段是試一下——打了看結果就好,不要留在程式裡。

1print(s.split(", "))      # ['Hello', 'World']
變數s", "把用切開印出1

積木上這一顆寫著「把 … 用 … 切開」。

一段文字 → 一個清單。這是處理輸入最常用的一招:

🔎 這一段是試一下——打了看結果就好,不要留在程式裡。

1line = "3 1 4 1 5"2parts = line.split()              # ['3','1','4','1','5']3nums = [int(x) for x in parts]    # [3, 1, 4, 1, 5]
"3 1 4 1 5"變數line把用切開變數x把轉成整數變數parts收集對每一個x取自只留,再外面一層設定nums為設定parts為設定line為123

⚠️ split() 不給參數就是按空白拆,而且連續的空白算一個。

反過來是 join:

🔎 這一段是試一下——打了看結果就好,不要留在程式裡。

1print(", ".join(["a", "b", "c"]))     # a, b, c
", ""a""b""c"串列用把接成一段文字印出1

⚠️ 是「用什麼連」.join(要連的東西),順序很容易記反。

三、推導式

一行把一串換成另一串:

1words = ["a", "bb", "ccc"]2print([len(w) for w in words])        # [1, 2, 3]
"a""bb""ccc"串列變數w的長度變數words收集對每一個w取自只留,再外面一層印出設定words為12

積木上它是一整顆,讀起來就是它的形狀: 「收集 … 對每一個 … 取自 … 只留 …」——最後那一格是篩選(if),可以空著。

它就是這四行壓成一行:

🔎 這一段是試一下——打了看結果就好,不要留在程式裡。

1result = []2for w in words:3    result.append(len(w))
串列變數words變數result變數w的長度在末端加入對裡的每一個i設定result為123

從右邊往左邊讀:「走過 words 的每一個 w,把它換成 len(w)」。

加上篩選:

🔎 這一段是試一下——打了看結果就好,不要留在程式裡。

1[w for w in words if len(w) > 1]      # ['bb', 'ccc']
變數w變數words變數w的長度1>收集對每一個w取自只留,再外面一層1

⚠️ 短的時候才用它。 兩層迴圈、又有 if/else 的話, 寫成一般迴圈會好讀很多。

推導式是「把一串變成另一串」的寫法, 不是「用比較少的字寫迴圈」的寫法。

四、串起來

把前面那幾個接起來用:

🔎 這一段是試一下——打了看結果就好,不要留在程式裡。

1line = input()2words = line.strip().split()3lengths = [len(w) for w in words]4print(max(lengths))
讀一行輸入,提示變數line去掉的頭尾空白把用切開變數w的長度變數words收集對每一個w取自只留,再外面一層變數lengths最大值印出設定lengths為設定words為設定line為1234

四行裡面用到了:輸入(第 3 課)、方法鏈、清單(第 8 課)、 推導式、內建函式。這就是一支小 Python 程式平常的樣子。

完成的樣子

這一課的參考做法——程式碼每一行的號碼,就印在對應的那塊積木上。

1s = "Hello, World"2print(s.upper())3print(s.lower())4print(len(s))5print(s.split(", "))6print(s.replace("World", "Python"))7words = ["a", "bb", "ccc"]8print([len(w) for w in words])
"Hello, World"變數s轉大寫變數s轉小寫變數s的長度變數s", "把用切開變數s"World""Python"把裡的換成"a""bb""ccc"串列變數w的長度變數words收集對每一個w取自只留,再外面一層印出設定words為印出印出印出印出印出設定s為12345678

把積木打散,自己排回去:排回去:把剛才那支程式的積木排好

換你了

讀進一段英文,印出出現最多次的那個字。

⚠️ 裁判餵的是 the cat the dog the。 ⚠️ 用得到:split()(這一課)、dict 的 get(第 9 課)、 max(第 8 課)。這一題把三課接起來了。

到編輯器做這一題:練習:出現最多次的那個字(三課接起來)

做一個

讀進一行英文,印出最長的那個單字和它的長度。

⚠️ 裁判用的是 a program is a projection。 🔴 如果有兩個一樣長呢? 這一題沒有規定,你自己決定要留第一個還是最後一個——而那個決定會出現在你寫的是 > 還是 >=。

到編輯器做這一題:做一個:最長的那個單字

這一課你做了什麼

接下來

入門到這裡結束。你已經有了寫一支小程式需要的全部東西。

往下有兩條路:

如果卡住了

你看到 多半是因為
s.upper() 之後 s 沒變 字串不可變。要 s = s.upper()
split 拆出空字串 前後有空白。先 .strip()
join 說型別錯 裡面要全是文字。數字要先 str(...)
推導式看不懂 先拆成三行迴圈寫一次,再壓回去
在編輯器打開這一課 →