【Python 學習筆記】:四種字串格式化(String Formatting)的方法
此篇文章將介紹四種字串格式化 ( string formatting ) 的方法,學會這些技巧,會讓你的程式更井然有序,還可增加程式的可讀性,那我們開始吧!
文章目錄
1. 使用 % 符號
上圖是 Python 中常用的字串格式化符號,其中又以字串 %s 、整數 %d 及浮點數 %f 最常出現,以下簡單介紹這三個符號的使用方法
字串 %s| 整數 %d| 浮點數 %f
name='Ann'
age=20
height=170.1234print('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.1234print('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.1234print('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.1234print('fruit:{}, number:{}, salary:{}'.format(string,num,F))
>>>>>>output
fruit:apple, number:20, salary:1000.1234
假設我想將變數 num
及 f
的插入順序交換,只要將 .format( ) 括弧內,變數名稱所對應的 index,寫入指定的大括號內,就能成功交換了。
程式碼如下:
string='apple'
num=20
F=1000.1234print('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.1234print(f'fruit:{string}, number:{num}, salary:{F}')>>>>>>output
fruit:apple, number:20, salary:1000.1234
和前面相同,浮點數同樣可以指定要顯示的位數。
但如果這次我們只想顯示整數部分,只需寫成{F : .0f}
中間以分號隔開就行了。程式碼如下 :
string='apple'
num=20
F=1000.1234print(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.1234print(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 及資料科學相關的文章,希望我的文章有幫助到你,那下次見~