Python的字串格式語法.format()與f-string

Sean Yeh
Python Everywhere -from Beginner to Advanced
11 min readApr 13, 2022

--

Shuei Nan Dong, Taiwan ,photo by Sean Yeh

在程式設計中,對於字串文字的處理是個免不了的工作。對於處理字串,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語法。

--

--

Python Everywhere -from Beginner to Advanced
Python Everywhere -from Beginner to Advanced

Published in Python Everywhere -from Beginner to Advanced

This place is All about Python. From Beginner to Advanced programing, by using Python, you can do anything you imagine.

Sean Yeh
Sean Yeh

Written by Sean Yeh

# Taipei, Internet Digital Advertising,透過寫作讓我們回想過去、理解現在並思考未來。並樂於分享,這才是最大贏家。