Python f-字符串魔法:每个程序员都需要知道的5个改变游戏规则的小技巧

如果你已经使用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-字符串特性。
 
 

更多