Python 的f-string(格式化字符串字面值)是从 Python 3.6 开始引入的特性,它提供了一种简洁、直观且高效的方式来格式化字符串。f-string 在运行时直接计算并嵌入值,性能优于%格式化和str.format()。以下是** f-string **的常见用法和示例:
一、基本语法
格式字符串字面值或称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 | replacement_field)*
literal_char ::= <any code point except "{", "}" or NULL>
1. 在字符串前添加f或F,并在字符串内部用{}包裹变量或表达式:
>>> name = "Alice"
... age = 25
... print(f"My name is {name} and I am {age} years old.")
# 输出:
My name is Alice and I am 25 years old.
2. 双花括号'{{'或'}}'被替换为单花括号,花括号内的字符串仍按字面值处理。
>>> print(f"{{Hello}}")
# 输出:
{Hello}
3. 在表达式后加等于号'=',可在求值后,同时显示表达式文本及其结果(用于调试)。
>>> today = datetime(year=2017, month=1, day=27)
... f"{today=:%B %d, %Y}" # using date format specifier and debugging
#输出:
'today=January 27, 2017'
4. f-string中,!符号用于对表达式的结果进行类型转换,支持以下三种转换方式:
📌 !r:调用repr()方法
将表达式的结果转换为“官方字符串表示形式”(适合调试和明确显示对象类型)。
>>> text = "Hello"
... print(f"{text!r}")
# 输出:(保留引号和转义字符)
'Hello'
📌 !s:调用str()方法
将表达式的结果转换为用户友好的字符串形式(适合直接显示内容)。
>>> num = 42
... print(f"{num!s}")
# 输出:(等同于 str(num))
42
📌 !a:调用ascii()方法
将非 ASCII 字符转换为 Unicode 转义序列。
>>> name = "Mèi"
... print(f"{name!a}")
# 输出:(非 ASCII 字符被转义)
'M\u00e8i'
📌 注意事项:
-
转换优先级:!符号需放在表达式和格式说明符(如:.2f)之间,例如{value!r:.10}会先转换类型再截取前 10 字符。
-
仅支持三种转换:!后只能接r、s或a,其他符号会导致语法错误。通过!符号,可以灵活控制 f-string 中值的输出形式,适用于调试、国际化等场景。
5. f-string中,冒号':'后附加格式说明符
📌 数值格式化
说明符 | 作用 | 示例 | 输出 |
---|---|---|---|
:.2f | 保留 2 位小数 | f"{3.1415:.2f}" | '3.14' |
:+.1f | 带符号保留 1 位小数 | f"{-3.1415:+.1f}" | '-3.1' |
:.3e | 科学计数法保留 3 位小数 | f"{10000:.3e}" | '1.000e+04' |
:, | 千位分隔符 | f"{123456789:,}" | '123,456,789' |
:b | 二进制格式 | f"{15:b}" | '1111' |
:#x | 带前缀的十六进制 | f"{255:#x}" | '0xff' |
:% | 百分比格式 | f"{0.85:.1%}" | '85.0%' |
📌 字符串对齐与填充
说明符 | 作用 | 示例 | 输出 |
---|---|---|---|
:>10 | 右对齐,宽度 10 | f"{'text':>10}" | ' text' |
:<10 | 左对齐,宽度 10 | f"{'text':<10}" | 'text ' |
:^10 | 居中对齐,宽度 10 | f"{'text':^10}" | ' text ' |
:*^10 | 用 * 填充并居中对齐 | f"{'text':*^10}" | '****text***' |
:.5 | 截断至 5 个字符 | f"{'hello world':.5}" | 'hello' |
📌 日期时间格式化
结合datetime模块,使用strftime风格的格式:
>>> from datetime import datetime
... now = datetime.now()
... print(f"{now:%Y-%m-%d %H:%M:%S}")
# 输出:
'2023-10-05 14:30:00'
常用符号:
%Y:四位年份
%m:两位月份
%d:两位日期
%H:24小时制小时
%M:分钟
%S:秒
📌 动态格式说明符
格式说明符可以通过变量动态指定:
>>> width = 10
... precision = 2
... value = 3.1415
... print(f"{value:{width}.{precision}f}")
# 输出:
' 3.14'
组合使用示例
>>> name = "Alice"
... balance = 12345.6789
... date = datetime(2023, 10, 5)
...
... # 组合对齐、千位分隔符和日期格式
... print(f"""
... 用户报告:
... {'-'*20}
... 姓名: {name:>10} # 右对齐,宽度 10
... 余额: ${balance:,.2f} # 千位分隔符 + 2 位小数
... 日期: {date:%Y-%m-%d} # 日期格式化
... """)
输出:
用户报告:
--------------------
姓名: Alice
余额: $12,345.68
日期: 2023-10-05
二、表达式嵌入
可以在{}内嵌入 Python 表达式,f-string 会在运行时对表达式进行求值。
>>> a = 5
... b = 3
... print(f"The sum of {a} and {b} is {a + b}.")
#输出:
The sum of 5 and 3 is 8.
三、嵌套表达式
可以在 f-string 中嵌套另一个 f-string 或其他表达式。
>>> x = 10
... y = 20
... print(f"The sum of {x} and {y} is {f'{x + y}'}")
#输出:
The sum of 5 and 3 is 8.
四、调用函数
可以直接在 f-string 中调用函数,函数的返回值将被插入字符串中。
>>> def greet(name):
... return f"Hello, {name}!"
...
... name = "Bob"
... print(f"{greet(name)}")
#输出:
Hello, Bob!
五、条件表达式(Ternary Operator)
在 f-string 内部,可以使用条件表达式(也叫三元操作符)。
>>> x = 5
... print(f"The number is {'positive' if x > 0 else 'non-positive'}.")
#输出:
The number is positive.
六、字典和对象属性访问
在 f-string 中直接访问字典中的值或对象的属性。
📌 字典
>>> person = {"name": "Alice", "age": 30}
... print(f"Name: {person['name']}, Age: {person['age']}")
#输出:
Name: Alice, Age: 30
📌 对象
>>>class Person:
... def __init__(self, name, age):
... self.name = name
... self.age = age
...
...person = Person("Bob", 25)
...print(f"Name: {person.name}, Age: {person.age}")
#输出:
Name: Bob, Age: 25