【Python 學習筆記】:四種字串格式化(String Formatting)的方法

瘋狂程式|Mad Coding
10 min readSep 5, 2021

--

Photo by Pedro Lastra on Unsplash

此篇文章將介紹四種字串格式化 ( string formatting ) 的方法,學會這些技巧,會讓你的程式更井然有序,還可增加程式的可讀性,那我們開始吧!

文章目錄

1. 使用 % 符號

2. str.format( )

3. f-Strings

4. Template Strings

參考文章

1. 使用 % 符號

常用的字串格式化符號

上圖是 Python 中常用的字串格式化符號,其中又以字串 %s 、整數 %d 及浮點數 %f 最常出現,以下簡單介紹這三個符號的使用方法

字串 %s| 整數 %d| 浮點數 %f

name='Ann'
age=20
height=170.1234
print('student\'s name: %s' % name)
print('student\'s age: %d' % age)
print('student\'s height: %f' % height)

>>>>>> output
student’s name: Ann
student’s age: 20
student’s height: 170.123400

使用%的字串格式化方法,就是先判斷要加入的變數其形態為何,再將對應的 % 符號加入' ' 內。

以上面的例子來說,學生的身高 height=170.1234,型態為浮點數,因此對應的符號為 % f

而輸出的結果之所以顯示為 height=170.123400 ,是因為如果沒有指定小數點要幾位,%f符號預設就是顯示到小數點後六位。

那要如何才能指定小數點後的顯示位數呢?

height=170.1234print('student\'s height: %.2f' % height)>>>>>> output
student’s height: 170.12

很簡單,同樣以上面的例子來說,如果想顯示到小數點後兩位,只要將 %f改為%.2f ,如上面的程式碼區塊就可以了。

那要如何才能一次顯示多個變數呢?

name='Ann'
age=20
height=170.1234
print('Name: %s | Age: %d | Height: %.2f' % (name,age,height))>>>>>> output
Name: Ann | Age: 20 | Height: 170.12

如果我們想一次加入不同的變數,只要將變數寫在括號內,並用逗號分隔就行了。

以上述為例即是(name,age,height) ,其型態為元組( tuple )。

小結

學過 C 語言的朋友應該對此方法很熟悉,使用 % 符號是 python 2 版本的字串格式化方法,年代頗為久遠,雖然 python 3 仍支援此方法,但現在已較少人使用。

優點

  • 年代較為久遠,所有的 python 3 系列版本都有支援,因此不用擔心版本不適用,無法使用的問題

缺點

  • 程式碼不易閱讀
  • 需詳記各個字串格式化符號所代表的意義
  • 有些過時

2. str.format( )

基本架構

"{ }".format( variable_name )

架構中的大括號{},就是變數所插入的位置。我們可以用這個方法,將前一個例子的程式碼改寫如下:

name='Ann'
age=20
height=170.1234
print('student\'s name: {}'.format(name))
print('student\'s age: {}'.format(age))
print('student\'s height: {}'.format(height))
>>>>>> output
student's name: Ann
student's age: 20
student's height: 170.1234

浮點數同樣可以指定要顯示的位數。假如要顯示到後兩位,只需寫成

{: .2f}前面加上分號就可以了。程式碼如下 :

height=170.1234
print('student\'s height: {: .2f}'.format(height))
>>>>>>output
student’s height: 170.12

指定變數插入位置

使用 str.format( ) 這個方法,還可以指定多個變數插入的位置,也就是說不用按照你 .format( )括弧內變數填寫的順序。

下面的區塊是不做指定所顯示的結果:

string='apple'
num=20
F=1000.1234
print('fruit:{}, number:{}, salary:{}'.format(string,num,F))
>>>>>>output
fruit:apple, number:20, salary:1000.1234

假設我想將變數 numf的插入順序交換,只要將 .format( ) 括弧內,變數名稱所對應的 index,寫入指定的大括號內,就能成功交換了。

程式碼如下:

string='apple'
num=20
F=1000.1234
print('fruit:{0}, number:{2}, salary:{1}'.format(string,num,F))
# 對應的index: 0 , 1 ,2
>>>>>>output
fruit:apple, number:1000.1234, salary:20

小結

str.format( ) 十分好用,往後若要將字串格式化,建議使用此方法。

優點

  • 顯著增加程式碼的易讀性
  • 所有的 python 3 及部分 python 2 版本,皆有支援此方法

3. f-Strings

基本架構

f"{ variable_name }”

{}內填入欲插入的變數名稱,並在最前面加入字母 f 即可。一樣沿用上面的舉例:

string='apple'
num=20
F=1000.1234
print(f'fruit:{string}, number:{num}, salary:{F}')>>>>>>output
fruit:apple, number:20, salary:1000.1234

和前面相同,浮點數同樣可以指定要顯示的位數。

但如果這次我們只想顯示整數部分,只需寫成{F : .0f}中間以分號隔開就行了。程式碼如下 :

string='apple'
num=20
F=1000.1234
print(f'fruit:{string}, number:{num}, salary:{F: .0f}')>>>>>>output
fruit:apple, number:20, salary:1000

對變數作運算

f-Strings 特別的是,它可以讓使用者在大括號內直接對變數作運算。

假如我想將變數 num 的數值乘上 3 倍,可以直接在大括號內寫下數學式,如下:

string='apple'
num=20
F=1000.1234
print(f'fruit:{string}, number:{num*3}, salary:{F}')
>>>>>>output
fruit:apple, number:60, salary:1000

小結

f-Strings 只有 python 3.6 以上的版本才能使用,需格外注意

優點

  • 程式碼更容易閱讀及理解
  • 能直接在{}內對變數進行運算

缺點

  • 僅有 python 3.6 以上的版本才有支援

4. Template Strings

基本架構

Template( '…….$ variable_name' )

又稱為樣板字串,使用時需先從 python string 模組中引入。

在欲代換的變數前加上$符號,再利用 substitute( ) 或 safe_substitute ( )兩種方法,即可指定該位置所插入的內容,如下面的舉例:

from string import Template     test=Template('Hi, my name is $name.I come from $city')result=test.substitute(name='Andy',city='Tokyo')
print(result)
>>>>>>output
Hi, my name is Andy.I come from Tokyo

下面接著介紹 substitute( ) 及 safe_substitute( ) 兩種方法的差異及使用時機

substitute( )

括弧內輸入 key 的內容,若缺少某個 key 的值,便會顯示 KeyError。以下面的舉例來說,因為缺少 key city 的值,即便 name有賦值仍會出現錯誤。

from string import Template test=Template('Hi, my name is $name.I come from $city')result=test.substitute(name='Andy')
print(result)
>>>>>>output
KeyError: 'city'

safe_substitute( )

用法和 substitute( ) 類似,但不同的是,即便缺少 key 的數值,或是增加非相關的 key,也不會顯示 KeyError。如下面的兩個例子:

Ex1:沒有賦值給任何 key

from string import Template test=Template('Hi, my name is $name.I come from $city')result=test.safe_substitute( )
print(result)
>>>>>>output
Hi, my name is $name.I come from $city

Ex2:增加非相關的 key

from string import Templatetest=Template('Hi, my name is $name.I come from $city')result=test.safe_substitute(fruit='apple') # fruit不在上述的Template裡
print(result)
>>>>>>output
Hi, my name is $name.I come from $city

可以看到兩者所輸出的內容是一樣的,這也是為何 safe_substitute( ) 被認為比 substitute( ) 安全一點,因為它較不容易發生錯誤,當程式中有資料是需要使用者輸入時,利用 safe_substitute( ) 這個方法能讓整個程式更加完整。

小結

Template Strings 大多用在程式有資料需要使用者輸入時。假設有一個資安漏洞的程式碼,如果又剛好碰到有心人士,刻意在使用者輸入欄位輸入特定字詞,那一些機密資料就可能曝光,造成嚴重的資安問題,這也是為何在特定時候,使用 Template Strings 會較安全的原因。

優點

  • 適用程式有資料需要使用者輸入時
  • 在特定時候比較安全

如果時間允許的話,我會再出更多 python 及資料科學相關的文章,希望我的文章有幫助到你,那下次見~

--

--

瘋狂程式|Mad Coding
瘋狂程式|Mad Coding

Written by 瘋狂程式|Mad Coding

Data Science | Machine Learning | Programming

No responses yet