f-strings: Python字串處理的瑞士軍刀

奧森iorson發表於2022-12-17

從 3.6 開始,Python 新增了一個格式化字串的方法,稱之為 f-string。

其用法就是在python原始字串的基礎上增加 f/F 字首,以大括號 {} 標明被替換的欄位。

f-string在本質上並不是字串常量,而是一個在執行時運算求值的表示式。

變數嵌入 & 變數拼接

改變以往佔位符或加號拼接的方式,使得字串拼接更加簡單直觀,可讀性也更好。

name = "Tom"

print(f"I'm {name}")
# I'm Tom

表示式求值

print(f"3 x 2 = {3*2}")
# 3 x 2 = 6

print(f"{3 * 2 = }")
# 3 * 2 = 6

呼叫函式

name = "Tom"

print(f"I'm {name.lower()}")
# I'm tom

多行string

name, job = "tom", "student"

s = f"""I'm {name.capitalize()}, 
and I'm a {job.capitalize()}"""

print(s)
"""
I'm Tom, 
and I'm a Student
"""

對齊

先看下語法規則:

Syntax: {:[width][.precision][type]}

對齊效果由width控制:

  • <:左對齊
  • >:右對齊(預設)
  • ^:居中對齊
word = "python"

>>> f"|{word:<10}|"
'|python    |'

>>> f"|{word:>10}|"
'|    python|'

>>> f"|{word:^10}|"
'|  python  |'

帶有補全的對齊效果:

# 本例用小數點來補全空餘內容
>>> f"|{word:.<10}|"
'|python....|'

>>> f"|{word:.>10}|"
'|....python|'

>>> f"|{word:.^10}|"
'|..python..|'

例子:

格式化一個日期,要求月份、天數用兩位表示,不足兩位補0

year, month, day = 2022, 1, 1

>>> f"{year}-{month:0>2}-{day:0>2}"
'2022-01-01'

數字格式化

Syntax: {:[width][.precision][type]}

由precision指定精度,type對應資料型別。

type:

  • s:字串格式(預設)
  • d:整型
  • e:科學計數,預設precision為6
  • f:浮點數,預設precision為6
  • %:百分比格式,預設浮點數格式,外加百分比格式化

浮點數精度格式化

同時會自動四捨五入。

pi = 3.141592654
print(f"PI = {pi:.2f}")
# PI = 3.14

print(f"PI = {pi:.3f}")
# PI = 3.142

科學計數

print(f"{pi:e}")
# 3.141593e+00

print(f"{pi:.2e}")
# 3.14e+00

百分比格式化

兼顧小數位保留和百分號格式化功能。

print(f"PI = {pi:.3%}")
# PI = 314.159%

print(f"PI = {pi:.2%}")
# PI = 314.16%

千位分隔符

使用 , 格式化數字展示(常用於金額),易於閱讀

>>> f"{234234234:,}"
'234,234,234'

>>> f"{234234234.1314:,.2f}"
'234,234,234.13'

進位制轉換

先看看python中常用的用法及其效果:

num = 23
bin(num)	# '0b10111'
oct(num)	# '0o27'
hex(num)	# '0x17'

在f-string中,b、o、d、x分別代表二進位制、八進位制、十進位制、十六進位制

f"{num:b}"	# '10111'
f"{num:o}"	# '27'
f"{num:d}"	# '23'
f"{num:x}"	# '17'

要想實現常用用法的效果,進位制規則程式碼前需要加#號:

f"{num:#b}"	# '0b10111'
f"{num:#o}"	# '0o27'
f"{num:#d}"	# '23'
f"{num:#x}"	# '0x17'

lambda表示式

>>> f"result is {(lambda x: x**2+1)(5)}"
'result is 26'

日期格式化

日期格式資訊,適用於 datedatetimetime 物件

today = datetime.datetime.today()
f"{today:%Y}"			# '2022'
f"{today:%Y-%m}"		# '2022-12'
f"{today:%Y-%m-%d}"		# '2022-12-16'

f"{today:%F}"		# '2022-12-16'
f"{today:%D}"		# '12/16/22'
f"{today:%X}"		# '21:01:27'
f"{today:%F %X}"	# '2022-12-16 21:01:27'

參考

相關文章