f-string是帶有 'f'
或 'F'
前綴的字符串字面值。這種字符串可包含替換字段,即以 {}
標示的表達式。而其他字符串字面值總是一個常量,格式化字符串字面值實際上是會在運行時被求值的表達式。
轉義序列會像在普通字符串字面值中一樣被解碼 (除非字面值還被標示爲原始字符串)。解碼之後,字符串內容所用的語法如下:
f_string ::= (literal_char | "{{" | "}}" | replacement_field)*
replacement_field ::= "{" f_expression ["!" conversion] [":" format_spec] "}"
f_expression ::= (conditional_expression | "*" or_expr)
("," conditional_expression | "," "*" or_expr)* [","]
| yield_expression
conversion ::= "s" | "r" | "a"
format_spec ::= (literal_char | NULL | replacement_field)*
literal_char ::= <any code point except "{", "}" or NULL>
字符串在花括號以外的部分按其字面值處理,除了雙重花括號 '{{'
或 '}}'
會被替換爲相應的單個花括號。單個左花括號 '{'
標示一個替換字段,它以一個 Python 表達式打頭,表達式之後可能有一個以歎號 '!'
標示的轉換字段。之後還可能帶有一個以冒號 ':'
標示的格式說明符。替換字段以一個右花括號 '}'
作爲結束。
格式化字符串字面值中的表達式會被當作正常的包含在圓括號中的 Python 表達式一樣處理,但有少數例外。空表達式不被允許,lambda
表達式必須顯式地加上圓括號。替換表達式可以包含換行 (例如在三引號字符串中),但是不能包含註釋。每個表達式會在格式化字符串字面值所包含的位置按照從左至右的順序被求值。
在 3.7 版更改: 在 Python 3.7 之前, await
表達式包含 async for
子句的推導式不允許在格式化字符串字面值表達式中使用,這是因爲具體實現存在一個問題。
如果指定了轉換符,表達式的求值結果會先轉換再格式化。轉換符 '!s'
即對結果調用 str()
,'!r'
爲調用 repr()
,而 '!a'
爲調用 ascii()
。
- 基本用法 用大括{ }表示被替換字段,其中直接填入替換內容
name = 'Jack'
print(f"str: {name}")
num = 6
print(f"int: {num}")
price = 3.33
print(f"float: {price}")
- 表達式
print(f"{2 * 3}")
print(f"{name.upper()}")
import math
print(f"{math.pi}")
print(f"{(lambda x, y: x+y*2)(3, 2)}")
lambda表達式必須顯式地加上圓括號, 第二個小括號表示傳入的參數
- 填充與截斷
- 默認使用空格填充
- >: 在字符串左側填充 <: 在字符串左側填充 ^: 字符串居中填充
- 數字表示字符串長度
- 長度大於字符串長度爲填充, 小於則爲截斷
slogan = 'Python NB'
print(f"{slogan:>20}")
# ' Python NB'
print(f"{slogan:<20}")
# 'Python NB '
print(f"{slogan:^20}")
# ' Python NB '
# 使用指定字符填充
print(f"{slogan:-^20}")
# '-----Python NB------'
- 僅針對數值有效的格式描述符
a = 1
b = -9
print(f"{a:+}", f"{b:+}")
# ('+1', '-9')
print(f"{a:-}", f"{b:-}")
('1', '-9')
print(f"{a: }", f"{b: }")
(' 1', '-9')
- 寬度與精度的格式描述符: 保留小數點位數
格式描述符 | 含義 |
---|---|
width | 整數width指定寬度 |
0width | 整數width指定寬度, 0表示最高位用0補足寬度 |
width.precision | 整數width指定寬度, 整數precision表示顯示精度 |
a = 123.456
# width
print(f'{a:10}')
# ' 123.456'
# 0width
print(f'{a:010}')
# '000123.456'
# width.precision
print(f"{a:8.2f}")
# ' 123.46'
- 對時間對象進行年月日 時分秒的提取
from datetime import *
d = date.today()
print(d)
# datetime.date(2020, 5, 13)
print(f"{d:%Y-%m-%d}")
# '2020-05-13'