注意:python 3.6以上的版本才开始支持 f_string
2015年,PEP 498提案提出了"Literal String Interpolation"概念,这就是后来的f-string。核心团队希望通过语法革新解决三个关键问题:
- 直观性:让代码表达更贴近自然语言,像写句子一样写代码
- 性能优化:传统方式需要运行时解析格式,影响效率
- 功能扩展:允许在字符串内直接执行表达式和函数调用
当时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 '异常'}") # 输出:状态:正常