f-string(格式化字符串字面值)

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右对齐,宽度 10f"{'text':>10}"' text'
:<10左对齐,宽度 10f"{'text':<10}"'text '
:^10居中对齐,宽度 10f"{'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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值