HOWTO · Python
Python 中的 String Builder 等效
本教程演示了 Python 中 StringBuilder 類的等效方法
本頁內容
Python 沒有像某些其他語言那樣內建的 StringBuilder 類別。應依片段的來源選擇組字串方式:若輸入是可迭代的字串,使用 str.join();若只有少數固定片段,使用 +;若程式會逐步寫入片段,則使用 io.StringIO。F 字串適合將值格式化為字串,並不是可處理任意片段序列的通用緩衝區。
Python 字串是不可變的:修改字串內容的操作會產生新的字串值,而不是直接改動原字串。這有助於理解為何反覆累加不斷變長的結果通常不是理想的一般做法,但不代表每次使用 + 都很慢。對少量且固定的片段而言,串接既清楚又實用。
Python 中 StringBuilder 的等效方式是什麼
當程式需要從許多片段組合文字時,StringBuilder 風格的 API 會很實用。Python 提供了可完成相同大致任務的標準工具,但沒有一個適用於所有情況、可以取代其他做法的單一類別。要讓程式碼更容易閱讀,應依輸入資料的形式以及文字的產生方式來選擇工具。
使用 str.join() 組合字串片段
如果手上已有可迭代的字串,請在分隔字串上使用 join()。分隔字串會出現在相鄰項目之間,首尾都不會多出分隔符號。例如," / ".join(parts) 會用前後帶有空格的斜線串接各個值。每個項目都必須是字串;串接前請先將非字串值轉換為字串,或在需要把值放進較完整的訊息時使用格式化。
執行此範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
parts = ["docs", "python", "strings"]
path = " / ".join(parts)
print(path)
docs / python / strings
當要組合一批已知字串時,join() 是實用的預設選擇。它能明確表達分隔方式,也免去撰寫迴圈反覆累加結果變數。它不保證在所有情況下都更快;應在輸入形式和用途符合任務時選用。
何時適合使用 + 串接
當片段數量少而且固定時,適合使用 +,例如將問候語與姓名組合,或在標籤後加上標點符號。這種運算式直接呈現要組合的片段,通常比為了串接而先建立集合更簡單。
若片段是在多次迴圈中逐步產生,反覆指定 result = result + piece 可能會建立一連串新的字串值,造成不必要的工作。可以改為先收集字串片段,再一次串接;如果每個片段自然地在產生時寫入,也可以使用 StringIO。實際效能取決於程式和 Python 的實作方式,因此不要根據缺乏依據的普遍速度排名來選擇方法。
使用 io.StringIO 逐步寫入
當程式分階段產生文字時,io.StringIO 會提供具有 write() 方法的記憶體文字串流。從 io 匯入它,逐一寫入字串片段,最後呼叫 getvalue() 取得累積完成的字串。如果片段來自不同分支或步驟,這種寫法能讓以輸出為主的程式碼更清楚。傳給 write() 的每個引數都必須是字串。若使用情境適合,可用內容管理器清楚界定串流的生命週期;若離開該範圍後還需要完成的字串,請在離開前呼叫 getvalue()。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
from io import StringIO
with StringIO() as output:
output.write("Hello")
output.write(", ")
output.write("Python")
message = output.getvalue()
print(message)
Hello, Python
通常不需要自訂包裝類別;如果應用程式確實需要,請將緩衝區設為各個實例自己的狀態,避免不同的建構器共用同一份狀態。
使用 F 字串格式化值
若任務是將值格式化為字串,請使用 F 字串。大括號內的運算式會先求值,再轉換成可顯示的內容,讓簡短訊息保持易讀:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
name = "Ada"
count = 3
message = f"{name} has {count} tasks."
print(message)
F 字串用於插入值,不適合逐步附加任意集合中的片段。如果值來自集合,請先將各項準備成字串,再使用 join();如果文字是分步寫入,可考慮使用 StringIO。將格式化與累積文字分開處理,能讓用途更明確。
選擇合適的組字串方式
- 若有可迭代的字串,並想在它們之間加入分隔符號,請使用
str.join()。 - 若只有少量且固定、能清楚列出的片段,請使用
+。 - 若文字透過類似串流的介面逐步寫入,請使用
io.StringIO。 - 若要將少數值放入訊息或其他格式化字串,請使用 F 字串。
Python 沒有能在所有情況下取代 StringBuilder 的單一對應工具。應依片段的提供方式選擇方法,並在所選操作要求字串輸入時,先將值轉換為字串。這些方法都能實際用來組合文字,不必依賴哪種方法永遠最快之類的籠統說法。