如果你已经使用Python一段时间,你可能已经不再使用老式的format()
方法来格式化字符串,而转向了更简洁且易于维护的f-字符串,这种功能是在Python 3.6中引入的。但这还不是全部。
自Python 3.8以来,有一些巧妙的f-字符串特性可以用于调试、格式化日期时间对象和浮点数等等。在本教程中,我们将探索这些用例。
注意:要运行这些代码示例,你需要安装Python 3.8或更高版本。
1. 更简单的调试
在编写代码时,你可能会使用print()
语句打印变量,以验证其值是否符合预期。使用f-字符串,你可以同时包括变量名和它们的值,以便更轻松地进行调试。
考虑以下示例:
length = 4.5
breadth = 7.5
height = 9.0
print(f'{length=}, {breadth=}, {height=}')
这将输出:
Output >>> length=4.5, breadth=7.5, height=9.0
这一特性在你想了解变量状态时尤其有用。然而,对于生产代码,你应该设置日志记录,并使用所需的日志级别。
2. 漂亮的浮点数和日期格式化
在Python中打印浮点数和日期时间对象时,你需要:
- 格式化浮点数以包含小数点后的固定位数
- 将日期格式化为特定的统一格式
F-字符串提供了一种直接的方法来根据你的需求格式化浮点数和日期。
在这个例子中,你可以通过指定{price:.2f}
来格式化price
变量,以显示小数点后两位:
price = 1299.500
print(f'Price: ${price:.2f}')
Output >>> Price: $1299.50
你可能已经使用strftime()方法来格式化Python中的日期时间对象。但你也可以使用f-字符串来实现。下面是一个例子:
from datetime import datetime
current_time = datetime.now()
print(f'Current date and time: {current_time:%Y-%m-%d %H:%M:%S}')
Output >>> Current date and time: 2023-10-12 15:25:08
让我们编写一个示例,其中包括日期和浮点数的格式化:
price = 1299.500
purchase_date = datetime(2023, 10, 12, 15, 30)
print(f'Product purchased for ${price:.2f} on {purchase_date:%B %d, %Y at %H:%M}')
Output >>>
Product purchased for $1299.50 on October 12, 2023 at 15:30
3. 数值的进制转换
F-字符串支持数值数据类型的进制转换,允许你将数字从一个进制转换为另一个进制。因此,你不必编写单独的进制转换函数或lambda表达式来查看不同进制下的数字。
要打印十进制数42的二进制和十六进制等效值,你可以使用f-字符串,如下所示:
num = 42
print(f'Decimal {num}, in binary: {num:b}, in hexadecimal: {num:x}')
Output >>>
Decimal 42, in binary: 101010, in hexadecimal: 2a
正如所见,这在需要以不同进制(如二进制或十六进制)打印数字时非常有用。让我们再看一个十进制到八进制的转换示例:
num = 25
print(f'Decimal {num}, in octal: {num:o}')
Output >>> Decimal 25, in octal: 31
还记得Oct 31 = Dec 25吗?是的,这个例子灵感来自“为什么程序员会把万圣节和圣诞节搞混?”的笑话。
4. 有用的ASCII和repr转换
你可以在f-字符串中使用!a和!r转换标志来将字符串格式化为ASCII和repr
字符串。
有时你可能需要将字符串转换为其ASCII表示。你可以使用!a标志来实现:
emoji = "🙂"
print(f'ASCII representation of Emoji: {emoji!a}')
Output >>>
ASCII representation of Emoji: '\U0001f642'
要访问任何对象的repr
,可以在f-字符串中使用!r标志:
from dataclasses import dataclass
@dataclass
class Point3D:
x: float = 0.0
y: float = 0.0
z: float = 0.0
point = Point3D(0.5, 2.5, 1.5)
print(f'Repr of 3D Point: {point!r}')
Python数据类自带__repr__
的默认实现,所以我们不必显式编写一个。
Output >>>
Repr of 3D Point: Point3D(x=0.5, y=2.5, z=1.5)
5. 格式化大型语言模型的提示模板
在使用像Llama和GPT-4这样的大型语言模型时,f-字符串对于创建提示模板非常有用。
你可以创建可重用且可组合的提示模板,而不是硬编码提示字符串。然后可以根据需要插入变量、问题或上下文。
如果你正在使用像LangChain的框架,你可以使用框架的PromptTemplate功能。但即使不使用框架,你也可以始终使用基于f-字符串的提示模板。
提示可以很简单,例如:
prompt_1 = "Give me the top 5 best selling books of Stephen King."
或者稍微灵活一些(但仍然非常简单):
num = 5
author = 'Stephen King'
prompt_2 = f"Give me the top {num} best selling books of {author}."
在某些情况下,提供上下文和一些示例在提示中是有帮助的。
考虑这个例子:
# context
user_context = "I'm planning to travel to Paris; I need some information."
# examples
few_shot_examples = [
{
"query": "What are some popular tourist attractions in Paris?",
"answer": "The Eiffel Tower, Louvre Museum, and Notre-Dame Cathedral are some popular attractions.",
},
{
"query": "What's the weather like in Paris in November?",
"answer": "In November, Paris experiences cool and damp weather with temperatures around 10-15°C.",
},
]
# question
user_question = "Can you recommend some good restaurants in Paris?"
这是一个使用f-字符串的可重用提示模板。你可以将其用于任何上下文、示例、查询用例:
# Constructing the Prompt using a multiline string
prompt = f'''
Context: {user_context}
Examples:
for example in few_shot_examples:
prompt += f'''
Question: {example['query']}\nAnswer: {example['answer']}\n'''
prompt += f'''
Query: {user_question}
print(prompt)
这是我们为此示例构建的提示:
Output >>>
Context: I'm planning to travel to Paris; I need some information.
Examples:
Question: What are some popular tourist attractions in Paris?
Answer: The Eiffel Tower, Louvre Museum, and Notre-Dame Cathedral are some popular attractions.
Question: What's the weather like in Paris in November?
Answer: In November, Paris experiences cool and damp weather with temperatures around 10-15°C.
Query: Can you recommend some good restaurants in Paris?
总结
这就是全部内容。希望你找到了几个可以添加到程序员工具箱中的Python f-字符串特性。