跳到內容

字串 String

字串就是一段文字。前面已經一直在用它,這一章專門看字串能做哪些事:拆開、拼接、搜尋,以及把它排得整整齊齊。

字串裡的每個字都有索引,可以像串列一樣用索引和切片來取。len() 算的是有幾個字:

word = "Python"
print(word[0])
print(word[-1])
print(word[0:3])
print(len(word))

切片一樣可以用第三個數字當間隔。[::-1] 就是把字串反過來,是很常見的小技巧:

word = "Python"
print(word[::-1])

字串內建很多好用的方法,這裡是幾個最常見的:

text = " Hello, World "
print(text.upper())
print(text.strip())
print(text.replace("World", "Python"))
  • upper() / lower():全部轉大寫/小寫。
  • strip():去掉頭尾的空白。
  • replace(舊, 新):把字串裡的某段換成別的。

這幾個方法有個共通點:都是回傳一個新的字串,原本的字串不會被改到(字串和元組一樣,建立後不能直接修改)。

split() 依你指定的符號把字串切成一個串列;join() 相反,把串列裡的字串用某個符號串成一整段:

sentence = "蘋果,香蕉,橘子"
fruits = sentence.split(",")
print(fruits)
joined = "".join(fruits)
print(joined)

處理一行用逗號隔開的資料時,這兩個方法幾乎天天用到。

想知道某段文字在不在、在哪裡、出現幾次:

print("@" in email)
print(email.find("@"))
print(email.count("e"))
  • x in 字串:檢查有沒有,回傳 TrueFalse
  • find(x):回傳第一次出現的索引(找不到會回傳 -1)。
  • count(x):數出現幾次。

有一組方法用來檢查字串「是不是某種樣子」,回傳 TrueFalse,常用在檢查使用者輸入(例如密碼、帳號):

print("abc123".isalnum())
print("12345".isdigit())
print("Hello".isupper())
print("HELLO".isupper())
print("hello world".title())
  • isdigit():是不是全部都是數字。
  • isalnum():是不是全部都是文字或數字(沒有符號、空白)。
  • isupper() / islower():是不是全大寫/全小寫。
  • title():把每個單字的字首轉大寫。

rjust() 把字串靠右、補到指定寬度,第二個參數是拿什麼來補(預設是空白)。zfill() 則專門在左邊補 0,常用來排數字:

print("7".rjust(3))
print("7".rjust(3, "0"))
print("42".zfill(5))

每個字元在電腦裡都對應一個數字編號。ord() 把字元轉成它的編號,chr() 反過來把編號轉回字元。例如大寫 A 是 65:

print(ord("A"))
print(chr(65))
print(chr(ord("a") + 1))

chr(ord("a") + 1) 先拿到 a 的編號、加 1、再轉回字元,就得到 b。處理「下一個字母」這類問題時會用到。

前面用過 f-string 把變數塞進字串。在大括號裡,變數後面加冒號還能指定格式,最常用的是控制小數位數:

price = 1234.5678
print(f"{price:.2f}")
print(f"{price:,.2f}")

:.2f 是「保留兩位小數」,:,.2f 再加上千分位逗號,很適合印金額。

在冒號後面指定寬度和方向,可以把文字對齊,排出整齊的欄位:

for name in ["Ann", "Bob", "Cathy"]:
print(f"|{name:<8}|{name:>8}|{name:^8}|")

< 靠左、> 靠右、^ 置中,數字是欄位的寬度。(這裡用英文示範,因為寬度算的是「字數」,而中文字比英文寬,中英混排時對齊會有點跑掉。)

你在別人的程式裡可能會看到另外兩種比較舊的格式化寫法,%.format()

name = "小明"
age = 18
print("%s 今年 %d" % (name, age))
print("{} 今年 {}".format(name, age))

三種寫法做的事一樣。知道它們長什麼樣就好,自己寫的時候,用 f-string 通常最直覺、最好讀。