Python的字串格式語法.format()與f-string
在程式設計中,對於字串文字的處理是個免不了的工作。對於處理字串,Python內建各種不同的工具,本篇要討論的是關於Python處理字串格式化的各種語法。
舊式語法
最早的方式是使用「 %
」符號來設定格式字串。例如下面的方式:
# 程式碼1
person = 'Sean'
print("My name is %s" %person)
舊式的語法使用「 %
」符號來提示Python直譯器此處需要替換成字串。並且到下一個「 %
」符號找到變數person,並且以person的值帶入第一個「 %
」符號中。
大家可以發現第一個「 %
」符號後面跟著一個 s
字母。這個字母代表的是字串。下面列出其他可以轉換的類型:
轉換類型
新式語法:.format()
這裡的新舊式語法的區分,是以Python 3作為切割的時間點。Python 3引進了這種新式的語法。新式語法,丟掉原先的 %
符號,改透過format()
方法在字串中插入變數。使用時需要搭配花括號標記。
譬如說有一個字串「My name is xxx.」並且希望將變數person的值插入字串,替換裡面的xxx的話,可以使用下面的方式表示。
# 程式碼2
person = 'Sean'
print("My name is {}".format(person))
可以看到花括號「 { }
」取代了xxx,而 .format(person)
可以將person 變數的值插入花括號中。
在舊式的語法需要依照字串中的%符號所在的順序依序的提供值,在新的語法中則無此限制,我們可以指定順序。
# 程式碼3
a = 'Sean'
b = 'John'
c = 'Luis'
print("{},{} and {} are my friends.".format(a, c, b))
上面的「程式碼3」使用的是位置參數。花括號「 { }
」的順序代表的是.format()
方法中參數值的順序。第一個為a、第二個為b,依此類推。
除了使用位置參數外,也可以利用編號參數來設定替換欄位,以改變順序:
# 程式碼4
a = 'Sean'
b = 'John'
c = 'Luis'
print("{2},{1} and {0} are my friends.".format(a, c, b))# John,Luis and Sean are my friends.
以上面的「程式碼4」來說,編號參數0代表的是format方法裡面的第一個、1則代表的是format方法裡面的第二個,依此類推。
也可以使用指名參數來替換欄位。例如下面的「程式碼5」。
# 程式碼5
print("{a},{b} and {c} are my friends.".format(a = 'Sean', b = 'John', c = 'Luis'))# John,Luis and Sean are my friends.
新式語法的缺點
整體來說,使用format()
字串格式化的語法比舊式的語法強大,使用起來算是方便,Python3也推薦大家使用這個方式。
然而這種格式化方式也不是沒有缺點。比如說,當format()
需要處理多個引數或者是更長的字串時,整個程式碼會顯得過於冗長。下面的「程式碼5」是一個簡單的例子:
# 程式碼5
first_name = 'John'
last_name='Snow'
city = 'Winterfell'
print("Hi, My name is {} {}. I am from {} ".format(first_name, last_name,city ))
因此,Python 3.6對此做了一些改變。
Python3.6以後:f-string
從Python 3.6之後,開始使用f-strings作為字串格式化的方式。f-Strings 又稱為「string interpolation」。例如,上面的「程式碼2」可以改用f-strings表示。
# 程式碼6
person = 'Sean'
print(f"My name is {person}")
# My name is Sean
f-String在使用上較format()簡便,其開頭是 f,花括號「 { }
」裡面放入參數名稱,字串則使用雙引號( “ ”
)標註。
這種新的作法讓我們得以把Python運算式直接嵌入在字串中。你可以嵌入各種運算式,比如直接從字串裡面計算結果。
# 程式碼7
x =10
y = 3
print(f" {x} 加 {y} 等於 {x+y} ")
# 10 加 3 等於 13
Python直譯器會把 f-string轉換成一連串的字串和運算式,再進而結合成為最終的字串。
使用在字典與串列
此外,字串格式語法也可以使用在Python物件,例如字典或串列上:
字典
.format()
可以使用 **
來完成將字典的值填入字串中:
# 程式碼8
a_dic = {'a':321, 'b':789}
print("The number is {a} and {b}".format(**a_dic))# The number is 321 and 789
或者是,逐一的透過字典的鍵Key,指定填入的對應值Value:
# 程式碼9
a_dic = {'a':321, 'b':789}
print("The number is {} and {}".format(a_dic['a'], a_dic['b']))
f-string
使用f-string填入字典的值,可以使用下面方式:
# 程式碼10
a_dic = {'a':321, 'b':789}
print(f"My number is {a_dic['a']}")
需要注意的是,若要對字典的鍵key使用單引號( ‘’
),請記住確保對包含鍵的 f-Strings 使用雙引號。
串列
串列的使用方式與字典類似。
.format()
使用format的方式:
# 程式碼11
my_list = [0,1,2]
print("My number is {}".format(my_list[0]))
f-string
使用f-string的方式:
# 程式碼12
my_list = [0,1,2] print(f"My number is {my_list[0]}")
f-string語法在Tuple的使用
我們再來看看在資料存成Tuple的情況下如何搭配使用f-string語法。先假設有一組Tuple。如下面的串列books
。串列裡面由數個Tuple組成。
books = [
('James Clear','Atomic Habits: An Easy & Proven Way to Build Good Habits & Break Bad Ones','320'),
('Daniel Kahneman','Thinking, Fast and Slow','499'),
('Charles Duhigg','The Power of Habit: Why We Do What We Do in Life and Business','416'),
('Dr. Dan Ariely','Predictably Irrational, Revised and Expanded Edition: The Hidden Forces That Shape Our Decisions','384')
]
首先,我們可以透過使用「for迴圈」的方式把Tuple資料列出來看看:
for book in books:
print(book)
結果:
('James Clear', 'Atomic Habits: An Easy & Proven Way to Build Good Habits & Break Bad Ones', '320')
('Daniel Kahneman', 'Thinking, Fast and Slow', '499')
('Charles Duhigg', 'The Power of Habit: Why We Do What We Do in Life and Business', '416')
('Dr. Dan Ariely', 'Predictably Irrational, Revised and Expanded Edition: The Hidden Forces That Shape Our Decisions', '384')
可以看見列出來的結果是一組組的Tuple。包含Tuple的括號都ㄧ起顯示出來。
當然,我們也可以利用下面方式只印出作者的資料:
for book in books:
print(f"作者是: {book[0]}")
結果呈現如下:
作者是: James Clear
作者是: Daniel Kahneman
作者是: Charles Duhigg
作者是: Dr. Dan Ariely
又或者是將作者、標題與頁碼全部都印出來:
for author, topic, pages in books:
print(f"{author}: {topic}, {pages}")
結果:
James Clear: Atomic Habits: An Easy & Proven Way to Build Good Habits & Break Bad Ones, 320
Daniel Kahneman: Thinking, Fast and Slow, 499
Charles Duhigg: The Power of Habit: Why We Do What We Do in Life and Business, 416
Dr. Dan Ariely: Predictably Irrational, Revised and Expanded Edition: The Hidden Forces That Shape Our Decisions, 384
看起來有點亂,我們還可以透過在資料中間加上間距來整理 一下,讓資料整齊的排列在一起:
for author, topic, pages in books:
print(f"{author:{20}} {topic:{100}} {pages:{1}} Pages")
結果:
James Clear Atomic Habits: An Easy & Proven Way to Build Good Habits & Break Bad Ones 320 Pages
Daniel Kahneman Thinking, Fast and Slow 499 Pages
Charles Duhigg The Power of Habit: Why We Do What We Do in Life and Business 416 Pages
Dr. Dan Ariely Predictably Irrational, Revised and Expanded Edition: The Hidden Forces That Shape Our Decisions 384 Pages
此外,還可以加上輔助符號:
for author, topic, pages in books:
print(f"{author:{20}} {topic:{96}} {pages:->{10}} Pages")
結果:
James Clear Atomic Habits: An Easy & Proven Way to Build Good Habits & Break Bad Ones -------320 Pages
Daniel Kahneman Thinking, Fast and Slow -------499 Pages
Charles Duhigg The Power of Habit: Why We Do What We Do in Life and Business -------416 Pages
Dr. Dan Ariely Predictably Irrational, Revised and Expanded Edition: The Hidden Forces That Shape Our Decisions -------384 Pages
結語
字串格式化可以增加程式的可讀性,也可以降低程式的出錯機率,提高維護的便利性。然而先前介紹的Python格式化字串的三種方法中,在實際寫程式的時候到底該選用哪一個呢?
如果您使用的是Python3.6以前的版本,建議使用.format()進行字串的格式化;如果是Python3.6以後的版本,則建議可以使用f-string語法。