教会新手写Python(8)—— 使用“f”格式化字符串

17 阅读4分钟

注意:python 3.6以上的版本才开始支持 f_string

2015年,PEP 498提案提出了"Literal String Interpolation"概念,这就是后来的f-string。核心团队希望通过语法革新解决三个关键问题:

  1. 直观性:让代码表达更贴近自然语言,像写句子一样写代码
  2. 性能优化:传统方式需要运行时解析格式,影响效率
  3. 功能扩展:允许在字符串内直接执行表达式和函数调用

当时Python之父Guido van Rossum在邮件列表中这样比喻:"就像给字符串装上了智能芯片,让它能自己处理内部的数据"。这个生动的描述准确传达了f-string的设计理念。随着Python 3.12的更新,f-string支持更宽松的嵌套规则和引号使用,比如可以自由选择单双引号而不必刻意错开

f-string的基本语法结构

f-string其实就是"格式化字符串"的简称,它的使用非常简单:只需在字符串前面加上字母"f"或"F",然后在字符串里用花括号{}包住你想插入的变量或表达式。

name = "小明"
print(f"你好,我是{name}!")  # 输出:你好,我是小明!

如何在字符串中插入变量和表达式

插入变量

使用f-string插入变量简直不能更直观了:

name = "小红"
age = 25
print(f"我叫{name},今年{age}岁。")  # 输出:我叫小红,今年25岁。

插入表达式

f-string不仅能插入变量,还能插入各种表达式,比如计算:

apple_price = 5
apple_count = 3
print(f"买{apple_count}个苹果,总共需要{apple_price * apple_count}元。")
# 输出:买3个苹果,总共需要15元。

插入函数调用

你甚至可以在花括号中调用函数:

def say_hello(name):
    return f"Hello, {name}!"

user_name = "张三"
print(f"系统消息:{say_hello(user_name)}")
# 输出:系统消息:Hello, 张三!

使用时需要注意的常见错误

1. 引号使用问题

如果f-string中的内容需要包含引号,要注意不要与外部引号冲突:

# 错误写法
# message = f'小王说:'你好!''  # 这会报错

# 正确写法(使用不同类型的引号)
message = f'小王说:"你好!"'  # 外单内双
message = f"小王说:'你好!'"  # 外双内单

2. 花括号的转义

如果你需要在f-string中显示花括号本身,需要使用双花括号:

print(f"这是一个花括号:{{变量}}")  # 输出:这是一个花括号:{变量}

3. 未定义变量错误

使用f-string时,花括号中的变量必须已经定义:

# 错误写法
# print(f"你好,{undefined_variable}")  # 会报错:NameError

# 正确写法
defined_variable = "小张"
print(f"你好,{defined_variable}")

基础用法

变量嵌入

name = "王小明"
print(f"欢迎{name}登录系统")  # 输出:欢迎王小明登录系统

数学运算嵌入

price = 15.5
quantity = 3
print(f"总价:{price * quantity}元")  # 输出:总价:46.5元

函数调用

import math
print(f"圆周率近似值:{math.pi:.3f}")  # 输出:圆周率近似值:3.142

以上是常见的用法,下面的用法可以了解,或者先收藏起来,方便使用时查询

数字精确控制

ratio = 0.8513
print(f"合格率:{ratio:.1%}")    # 输出:合格率:85.1%
print(f"序列号:{123:06d}")     # 输出:序列号:000123
print(f"科学计数:{12345678:.2e}")  # 输出:1.23e+07

文本对齐

product = "智能手机"
print(f"|{product:_^20}|")  # 输出:|______智能手机_______|
print(f"|{product:>20}|")   # 输出:|              智能手机|

数字处理

revenue = 123456789
print(f"年度营收:{revenue:,}元")  # 输出:年度营收:123,456,789元

自记录表达式

user_id = 10086
print(f"{user_id=}")  # 输出:user_id=10086

多行字符串

contact = f"""
姓名:{'张伟'}
电话:{10000000000}
地址:{'北京市朝阳区'}
"""
print(contact)

字典值获取

user = {'name': '李娜', 'age': 28}
print(f"用户:{user['name']},年龄:{user['age']}")

三元条件运算

score = 85
print(f"成绩等级:{'优秀' if score >=90 else '良好'}")

布尔值转换

is_valid = True
print(f"状态:{is_valid and '正常' or '异常'}")  # 输出:状态:正常