【Python】f-strings

Python 3.6 引入了一种名为 "Formatted String Literals" 的新字符串格式化方法,通常被称为 f-strings。通过将字面量字符串前缀从 u, r, b 变为 fF,你可以直接在字符串中插入表达式的值, f-strings 提供了一种非常快捷和直观的方式来格式化字符串。

为何使用 f-strings?

  • f-strings 提供了一种极其简洁的方式来嵌入变量或者表达式到字符串中。
  • 它们通常比老式的 % 格式化或 str.format() 方法更快、更直观。
  • {} 中书写的任何有效的 Python 表达式都可以被求值并转换为字符串。

基础用法

使用 f-strings,你只需要在字符串前加上 fF,然后在 {} 括号中放入变量或表达式:

name = 'Alice'
age = 30
f"Hello, {name}. You are {age} years old."

这段代码将输出:"Hello, Alice. You are 30 years old."

你还可以在大括号中执行简单的计算:

f"{2 * 37}"

输出将是 "74"

表达式和函数调用

f-strings 中你可以使用任意类型的表达式,包括函数调用:

def to_uppercase(input):
    return input.upper()

name = "Bob"
f"{to_uppercase(name)} is my name."

这将输出: "BOB is my name."

字典和列表

你也可以从字典和列表中提取值:

person = {'name': 'John', 'age': 42}
f"{person['name']} is {person['age']} years old."

这将输出: "John is 42 years old."

格式化

还可以在 f-strings 中执行格式化指令,与 str.format() 方法相似:

import datetime
today = datetime.date.today()
f"{today:%B %d, %Y}"

如果今天是 2023 年 3 月 23 日,这将输出: "March 23, 2023"

多行 f-strings

对于跨多行的字符串,f-strings 同样有效:

name = "Alice"
profession = "Programmer"
affiliation = "Python"
message = (
    f"Name: {name}\n"
    f"Profession: {profession}\n"
    f"Affiliation: {affiliation}"
)
print(message)

上面的代码将格式化并打印出:

Name: Alice
Profession: Programmer
Affiliation: Python

大括号字符

如果你需要在 f-strings 中包含大括号,你可以通过双重大括号来实现:

f"{{73}} is my favorite number."

输出将是:"{73} is my favorite number."

进阶

要更深入地探索 f-strings,我们可以讨论它们的一些高级用法,包括复杂表达式、调用方法、使用格式说明符和执行内联字符串操作。

调用对象的方法和属性

您可以在 f-string 表达式中调用对象的方法和属性,例如:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def greet(self):
        return f"My name is {self.name} and I am {self.age} years old."

alice = Person("Alice", 30)
message = f"Alice says: {alice.greet()}"
print(message)

这将输出:"Alice says: My name is Alice and I am 30 years old."

复杂表达式和函数调用

f-strings 可以包含复杂的表达式,如列表推导式和函数调用:

numbers = [1, 2, 3, 4, 5]
f"Double of numbers: {[n * 2 for n in numbers]}"

这将输出:"Double of numbers: [2, 4, 6, 8, 10]"

使用格式说明符

通过使用格式说明符(冒号 : 后跟格式代码),你可以控制如何格式化f-string内的值:

import decimal
value = decimal.Decimal("12345.6789")
f"Formatted value: {value:.2f}"

输出:"Formatted value: 12345.68"

动态精度

可以通过另一个大括号表达式来动态地设置格式说明符:

precision = 3
f"Value with dynamic precision: {value:.{precision}f}"

输出:"Value with dynamic precision: 12345.679"

多行 f-strings 和字面量拼接

f-strings 支持多行。如果需要在多行间维持代码的可读性,可以用圆括号括起来实现自然的拼接:

name = "Bob"
profession = "Builder"
age = 25

message = (
    f"Name: {name}\n"
    f"Profession: {profession}\n"
    f"Age in five years: {age + 5}"
)
print(message)

输出将会是:

Name: Bob
Profession: Builder
Age in five years: 30

调试变量和表达式

Python 3.8 引入了一个新的 = 号后缀功能,它允许你在f-string内部嵌入变量名和它们的值,这对于调试非常有用:

x = 3
y = 4
f"{x} times {y} equals {x * y} | x={x}, y={y}"

输出:"3 times 4 equals 12 | x=3, y=4"

或者更简洁的方式:

f"{x=} and {y=}"

输出:"x=3 and y=4"

安全性和局限性

需要提醒的是,由于 f-strings 在运行时进行计算,它们可能引发安全问题,尤其是当它们包含用户提供的输入时。因此,和任何涉及执行代码的特性一样,需要在使用 f-strings 时保持警惕。

此外,f-strings 不能被直接用在那些需要在定义时不立即执行格式化操作的场景中,例如在i18n(国际化)系统中定义翻译字符串。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值