Python String

2026 資訊之芽 Python 語法班 String 簡報

2026 Mar. 08 講師 藍少君

Outline

  1. 字串簡介
  2. 字串詳細
  3. 字串使用

字串簡介

什麼是字串(string)

  • 和整數(int)、浮點數(float)一樣,是 Python 的一種內建資料類別
  • 用來在程式內表示一串文字
  • 這裡的 "Hello, World" 就是一個字串。
print("Hello, World")

如何表示字串

單引號(' ')雙引號(" ") 夾注文字。

合法的字串:

str1 = "a valid string"
str2 = 'a valid string'
str3 = "s" # a string with a single character
str4 = ' ' # a string with one "space" character
str5 = ""  # an empty string

在程式內直接寫出字串的內容,這樣的字串表示被稱為 string literal。

隨便玩玩字串

h = "Hello"
w = "World"
hw = h + ", " + w # 字串串接
print(hw) # Hello, World
hw = "Hello World"
h, w = hw.split() # 用空白分割
print(h) # Hello
print(w) # World

隨便玩玩字串

# 如果輸入 1
number_str = input() # number_str = "1"
number = int(number_str) # number = 1

字串詳細

字元 vs. 字串

  • 字元(character)
  • 字元是電腦處理文字的單位,可能是一個字母、符號,如: 'a''1'' '(空白)、','(逗號) 等。
  • 字串可看作連續多個字元組成的序列,如: "OuO" 可以想像成是 ['O', 'u', 'O'],三個字元的序列。
  • 在某些程式語言 (如: C、C++、Rust、...) 中,可以定義字元與字串兩種不同型別的變數,常以單引號表示字元,雙引號表示字串。
  • Python 中並沒有字元的型別,只有長度為 1 的字串

跳脫字元

  • 在寫程式時,常會因某些限制,造成無法輸入想要的字元。
  • 使用 反斜線(\) 加一些字,來代表原本要輸入的字元。

想要表示換行字元 => 輸入 \n。 (常見)

str1 = "abc\n123"
print(str1)
# abc
# 123

Fun Fact: print() 預設會在輸出完字串後,補一個換行字元 '\n'

更多跳脫字元

想要在單(雙)引號字串中表示單(雙)引號 => 輸入 \'(\")。

錯誤寫法:

str1 = "He said "Hello" to me."

正確寫法:

str1 = "He said \"Hello\" to me."

更多跳脫字元

想要表示反斜線 => 輸入 \\

str1 = "I'm not going to make a \new line."
# I'm not going to make a
# ew line

str2 = "I'm not going to make a \\new line."
# I'm not going to make a \new line

1 vs. "1"

  • 數字 1字元 "1" 在電腦內是不一樣的兩種資料
  • 數字 1 在記憶體內儲存的,是數字 1 的二進制表示
  • 字元 "1" 在記憶體內儲存的,是字元 "1" 的編碼結果,數字 49 的二進制表示

center

為何需要編碼

  • 電腦只認得數字 0、1,不認得文字。
  • 編碼 可以想像成,為不同的 東西 給一個 號碼 用來稱呼他。
  • 現實生活中的編碼例子: 姓名 -> 班級座號。
  • 電腦無法儲存文字,透過建立 文字 -> 數字 的編碼,儲存編碼的結果,進而能夠儲存、處理文字。
  • 編碼方式需有統一的標準,解碼的結果才會一致。

ASCII 編碼

  • 廣泛使用的字元編碼標準,定義了常見的英文、數字、符號、控制符號字元的編碼。
  • 共定義了 128 個字元,將字元編碼成 0 - 127 的數字。
  • 常見的 ASCII 編碼:
    • '0' - '9' -> 48 - 57
    • 'A' - 'Z' -> 65 - 90
    • 'a' - 'z' -> 97 - 122

ASCII 編碼表: https://en.wikipedia.org/wiki/ASCII#Table_of_codes

操作 ASCII

在 Python 中可以使用 ord() 來獲得某個字元的 ASCII 編碼;使用 chr() 來獲得某個 ASCII 編碼對應的字元。

print(ord('0')) # 48
print(chr(48)) # '0'

透過操作 ASCII 編碼,將字母小寫轉大寫:

alphabet = 'x'
print(chr(ord(alphabet) - ord('a') + ord('A'))) # 'X'

Python 的字元編碼

  • ASCII 只定義了 128 個字元,但世界上還有很多不同的文字系統。
  • 出現 Unicode 編碼,完整兼容 ASCII 編碼 (0 - 127 的編碼完全相同),並支援世界上大部分的文字系統,包括中、日、韓、俄、德、西、...,以及各種符號、emoji。
  • Python 支援 Unicode 編碼。
print("你好")
print("これもOKです")
print("🥺")

1 vs. "1"

1:

  • 整數(int) 型別,在記憶體內儲存的內容是數字 1。
  • 可進行整數相關的操作,如算術運算(加、減、乘、除)、比大小等。

"1":

  • 字串(string) 型別,在記憶體內儲存的內容是數字 49。
  • 可進行字串相關的操作,如字串串接、.replace().split() 等方法。

1 vs. "1"

1 + "1" = ?

TypeError: unsupported operand type(s) for +: 'int' and 'str'

不支援將整數(int)及字串(str)相加。

Behind print("string")

  • 使用 print() 時,本質上 Python 是把字串中每個字元的編碼結果,逐一送給 console
  • console 手上有 字元編碼字元圖形 的對應表,也就是 字體
  • console 根據收到的字串,將每個字元的圖形一一畫在螢幕上,成為我們看到的輸出結果。
  • 從這個角度來看,print() 的參數必定是字串。

About print(1)

  • print("1") 可以嗎 ? 可以,因為 "1" 是合法的字串。
  • print(1) 可以嗎 ? 可以,不過原因是,在 print() 的實做中,Python 會偷偷將 整數 1 透過 "類似" str(1) 的概念,先轉型成 字串 "1"

可以參考 pypy 的實做更深入理解: pypy/module/__builtin__/app_io.py#L96
"類似" str(1) 的說法,是因為在我們使用的 CPython 實做中,並不會有顯式的 str(1) 呼叫。

字串使用

取得字串

  1. 直接寫在程式裡,如: str1 = "string"
  2. 透過呼叫的回傳取得,如: str2 = input()
  3. 透過轉型(本質上還是 2.),如: str3 = str(1.1)

字串運算

  1. 加法 - 串接: "He" + "llo" => "Hello"
  2. 乘法 - 重複: "Ha" * 3 => "HaHaHa"
  3. 比大小 - 字典序(編碼後的數字)比較:
    • 'A' > 'a' => False
    • 'a' > '?' => True
    • 判斷字元是否為大寫字母: 'A' <= c <= 'Z'
    • 'aca' > 'abz' (多字元則依序比較,直到第一個分出大小) => True
    • 'aaaa' > 'aaa' (若字元比完比不出來,最後比長度) => True

可迭代物件(iterable)

  • string 是一個 iterable,可以使用 iterable 相關的功能
  • list 也是 iterable,可以想像某些 list 的功能也可以被用在 string 上。
hw = "Hello, World"

# 可以透過 index 來得到單一字元
print(hw[0]) # H

# 可以使用 slice 相關的功能
print(hw[0:5], hw[11:6:-1]) # Hello dlroW

可迭代物件(iterable)

hw = "Hello, World"

# 可以使用 for 來遍歷
for c in hw:
    print(c, end='_')
# H_e_l_l_o_,_ _W_o_r_l_d_

# 可以透過 len() 取得長度
print(len(hw)) # 12

不可變(immutable)

string 和 list 不同的是,string 在 Python 中是不可變的

h = "Hollo"
h[1] = 'e'
TypeError: 'str' object does not support item assignment

不可變指的是在 string 的實做中,不存在有任何能改變其內部結構的功能。
有興趣可以到網路上查詢相關設計的原因。

雖然但是... 我還是想修改

h = "Hollo"
h = h[:1] + 'e' + h[2:] # "Hello"

雖然最後達到了修改的效果,但背後運作並不是把原字串的第二個字改掉,而是創建 "H""e""llo" 三個字串,最後串接起來

String 方法(methods)

  • Python 為 string 內建實做了許多有用的功能,可以不用自己實做。
  • 以下介紹的常用 method 可以記憶、熟悉其用法。但不用背下 string 所有的內建 method
  • 大多數的內建 method,都可以自行在 Python 內實做。但使用內建的 method 可以有更多好處,如: 更好的執行效率不用擔心正確性
  • 在需要操作字串時,可以上網搜尋是否有相關的內建方法。若找不到,就面對挑戰,自己做吧~

.split()

原字串(放在點點前面)提供的分隔符號(另一個字串,放在小括號內) 進行分割,回傳一個字串的 list,表示所有被分開的段落。

str1 = "A, B, C"
outcome = str1.split(", ")
print(outcome) # ["A", "B", "C"]

若不指定分隔字串,預設會用空白 ' ' 當作分隔字串。

Judge usage

Judge 中經常會有 第一行為兩個數字 n, m,用空白分隔,... 相關的輸入規格,這時就會用到 .split()

judge_input = input() # "1 2"
split_outcome = judge_input.split() # ["1", "2"]
n, m = split_outcome # unpack, n = "1", m = "2"
n, m = int(n), int(m)

精簡版本: n, m = map(int, input().split())

.replace()

原字串(放在點點前面)指定的 pattern (另一個字串,放在小括號內的第一個參數) 替換成另一個 pattern (另一個字串,放在小括號內的第二個參數),回傳替換後的字串。

text = "I like banana"
new_text = text.replace("banana", "apple")
print(text) # I like banana
print(new_text) # I like apple

.strip()

原字串(放在點點前面) 字串最前方連續、最後方連續指定的字元們 (另一個字串,放在小括號內) 刪除,回傳處理後的字串。

str1 = "   123 "
strip_str1 = str1.strip() # "123"

str2 = "www.example.com"
strip_str2 = str2.strip("w.com") # "example"

若不指定 strip 字元,預設為 ' '

More

  • .join(): split 的逆運算。
  • .find(): 在原字串中尋找一個 pattern。
  • .lower()/.upper(): 將原字串字母全部轉成小寫/大寫。

多行字串

三個雙引號(""") 開始一個多行字串,可以用來撰寫有結構文字,也是 Python 內多行註解的標準方法

str1 = """
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
"""

print(str1)

多行註解

"""
for i in range(10):
    print("foo")
"""

for i in range(10):
    print("bar")

f-string 簡介

  • Formatted string literal。
  • 在一般的字串前加上 f,用來表示這是一個 f-string。
answer1, answer2 = 1, 2

# Without f-string
print("The answer is: (" + str(answer1) + ", " + str(answer2) + ")")

# With f-string:
print(f"The answer is: ({answer1}, {answer2})")

f-string 語法

  • 在 f-string 內,用一對 大括號({}),表示要將括號內的內容格式化成文字,裡面可以放變數、運算式、函式呼叫等等。
  • 在大括號內,可以在最後加上 modifier 額外調整格式化的方式
w, h = 50, 1.7
print(f"BMI is: {w / (h ** 2)}")

f-string modifier

padding and alignment:

print(f"|{'姓名':^10}|{'座號':^10}|")
# |    姓名    |    座號    |

print(f"|{'姓名':*<4}|{'座號':*<4}|")
# |姓名**|座號**|

print(f"|{'姓名':->8}|{'座號':->8}|")
# |------姓名|------座號|

f-string modifier

小數進位:

pi = 3.1415926

print(f"pi: {pi:.2f}")
# 3.14

print(f"pi: {pi:.3f}")
# 3.142

f-string modifier

Debug:

outcome = "haha"

print(f"{outcome=}")
# outcome='haha'

作業

References

End