Python f-Strings魔法:每位编码者都需要了解的5个改变游戏规则的技巧

Python f-Strings魔法:每位编码者必须掌握的5个改变游戏规则的技巧

如果你已经使用Python一段时间了,很可能会停止使用老式的format()方法来格式化字符串,而转而使用更简洁易维护的f-Strings,它是在Python 3.6中引入的。

但是还有更多的功能。

从Python 3.8开始,有一些很棒的f-string功能,可以用于调试、格式化日期时间对象和浮点数,以及其他很多用途。我们将在本教程中探索这些用例。

注意:要运行代码示例,需要安装Python 3.8或更高版本。

1. 更容易调试

在编程时,你可能会使用print()语句打印变量,以验证它们的值是否符合预期。使用f-Strings,你可以在字符串中包含变量名和它们的值,以便更容易进行调试。

考虑以下示例:

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-Strings提供了一种简单的方式,根据你的要求格式化浮点数和日期。

在下面的示例中,你可以使用{price:.2f}来将price变量格式化为小数点后两位:

price = 1299.500
print(f'Price: ${price:.2f}')

这将输出:

Output >>> Price: $1299.50

在Python中,你可以使用strftime()方法格式化日期时间对象。但是你也可以使用f-Strings来完成。以下是一个示例:

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-Strings支持对数字数据类型进行进制转换,允许你在不同进制中转换数字,而无需编写单独的进制转换函数或lambda表达式来查看数值。

要打印十进制数42的二进制和十六进制等效值,可以使用如下的f-string:

num = 42
print(f'Decimal {num},in binary: {num:b},in hexadecimal: {num:x}')

 

输出 >>>十进制 42,in binary: 101010,in hexadecimal: 2a

 

从上面的例子中可以看出,在需要以不同进制(如二进制或十六进制)打印出数字时,这个方法非常有用。再来看一个将十进制转换为八进制的例子:

num = 25
print(f'Decimal {num},in octal: {num:o}')

 

输出 >>> 十进制 25,in octal: 31

 

还记得十进制25等于八进制31吗?这个例子受到了“为什么开发者把万圣节和圣诞节搞混了?”梗的启发。

 

4. 有用的ASCII和repr转换

 

你可以在f-string中使用!a!r转换标志将字符串格式化为ASCII和repr字符串。

有时候你可能需要将字符串转换为其ASCII表示法。以下是使用!a标志的方法:

emoji = "🙂"
print(f'Emoji的ASCII表示:{emoji!a}')

 

输出 >>> Emoji的ASCII表示:'\U0001f642'

 

要访问任何对象的repr,可以使用带有!r标志的f-string:

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'3D点的repr:{point!r}')

 

Python数据类自带了对__repr__的默认实现,所以我们不需要显式编写一个。

输出 >>> 3D点的repr:Point3D(x=0.5, y=2.5, z=1.5)

 

5. LLM提示模板的格式化

 

当使用像Llama和GPT-4这样的大型语言模型时,f-string对于创建提示模板非常有用。

您可以使用f-string创建可重用和可组合的提示模板,而不是硬编码提示字符串。然后,根据需要插入变量、问题或上下文。

如果您正在使用像LangChain这样的框架,则可以使用该框架的PromptTemplate功能。但即使没有,您仍然可以使用基于f-string的提示模板。

提示可以简单地如下所示:

prompt_1 = "给我列出史蒂芬·金(Stephen King)的前5本畅销书。"

 

或者稍微灵活一些(但仍然非常简单):

num = 5
author = '史蒂芬·金'
prompt_2 = f"给我列出{author}的前{num}本畅销书。"

 

在某些情况下,为提示提供上下文和一些示例会很有帮助。

考虑以下示例:

# 上下文
user_context = "我计划去巴黎旅行,需要一些信息。"
# 示例
few_shot_examples = [
    {
        "查询": "巴黎有哪些热门旅游景点?",
        "答案": "艾菲尔铁塔、卢浮宫和巴黎圣母院是一些热门景点。",
    },
    {
        "查询": "巴黎11月份的天气如何?",
        "答案": "11月份,巴黎天气凉爽湿润,气温大约在10-15℃左右。",
    },
]
# 问题
user_question = "你能推荐一些在巴黎的好餐厅吗?"

这是一个使用f-strings的可重复使用的提示模板。您可以在任何情境、示例或查询用例中使用:

# 使用多行字符串构建提示prompt = f'''情境:{user_context}示例:'''for example in few_shot_examples:   prompt += f'''问题:  {example['query']}\n答案: {example['answer']}\n'''prompt += f'''查询:{user_question}'''print(prompt)

以下是此例子的提示信息:

输出 >>>情境:我打算去巴黎旅行,我需要一些信息。示例:问题:巴黎有哪些热门旅游景点?答案:埃菲尔铁塔、卢浮宫和巴黎圣母院是一些热门景点。问题:11月份的巴黎天气如何?答案:11月份,巴黎的天气凉爽而潮湿,气温约为10-15°C。查询:你能推荐一些巴黎的好餐厅吗?

总结

内容到此结束。希望您发现了几个有用的Python f-string特性,可以添加到您的程序员工具箱中。如果您有兴趣学习Python,请查看我们整理的 5本免费Python大师级图书。祝您学习愉快!

[Bala Priya C](https://twitter.com/balawc27)是来自印度的开发人员和技术作家。她喜欢在数学、编程、数据科学和内容创作的交叉领域工作。她感兴趣的领域和专长包括DevOps、数据科学和自然语言处理。她喜欢阅读、写作、编码和咖啡!目前,她正在通过编写教程、指南、观点文章等,与开发者社区分享她的知识。