Python 内建函数列表 > Python 的内置函数 format
Python 的内置函数 format() 是一个功能强大的字符串格式化工具,它提供了灵活且可读性强的格式化方式。该函数主要通过两种形式使用:
作为字符串对象的方法:
"格式化字符串".format(参数)
这是最常见的用法,在字符串内部使用 {} 作为占位符,然后通过 format() 方法传入参数进行替换。
作为独立的内置函数:
format(value, format_spec)
这种形式主要用于对单个值进行特定格式的转换,常用于数字格式化等场景。
format() 提供了丰富的格式化功能,包括:
位置参数:
"{} {}".format("Hello", "World") # 输出:"Hello World"
"{name}今年{age}岁".format(name="小明", age=12)
下标访问:
"{0[0]} {0[1]}".format(["Python", "Java"]) # 输出:"Python Java"
数字格式化:
"{:*^20}".format("Python") # 居中,用*填充:"*******Python*******"
"{:<20}".format("Python") # 左对齐:"Python "
进制转换:
"{:b}".format(10) # 二进制:"1010"
"{:x}".format(255) # 十六进制:"ff"
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("张三", 30)
"{p.name}今年{p.age}岁".format(p=p) # 输出:"张三今年30岁"
相比于旧的 % 格式化方式,format() 方法具有以下优势:
语法更直观,可读性更强
支持更复杂的格式化需求
可以灵活处理不同类型的数据
支持自定义格式化方式(通过 __format__ 方法)
在实际应用中,format() 方法常用于:
生成报告时的数据格式化
日志信息的格式化输出
用户界面的文本显示
数据导出时的格式转换
Python 3.6 之后新增的 f-string(格式化字符串字面量)实际上是 str.format() 方法的语法糖,但提供了更简洁直观的表达方式。它在字符串前缀加上 f 或 F 标志,允许直接在字符串中嵌入表达式,用大括号 {} 包裹。
与 format() 方法相比,f-string 有以下特点:
直接在字符串内写变量名或表达式,无需像 format() 那样先定义再引用
执行效率更高,因为 f-string 在编译时就被转换为字节码
支持完整 Python 表达式,包括函数调用、算术运算等
示例对比:
# 使用 format() 方法
name = "Alice"
age = 25
msg = "My name is {} and I'm {} years old".format(name, age)
# 使用 f-string
msg = f"My name is {name} and I'm {age} years old"
f-string 还支持格式化规范,如:
price = 19.99
print(f"Price: {price:.2f}") # 输出: Price: 19.99
from datetime import datetime
print(f"Current time: {datetime.now():%Y-%m-%d %H:%M}") # 输出当前时间
常见应用场景包括:
构建动态 SQL 查询语句
生成日志信息
创建报告模板
调试时快速查看变量值
需要特别注意的是,Python 中的 f-string 是在运行时进行动态求值的表达式。这意味着字符串中的表达式会在程序执行时才会被计算和解析,而不是在编译阶段。这一特性带来了重要的安全考量:
安全风险具体表现:
如果直接将未经处理的用户输入放入 f-string 表达式,恶意用户可能会注入可执行的Python代码
例如:f"Result: {user_input}",如果user_input是"import('os').system('rm -rf /')",将导致严重后果
典型应用场景中的风险:
用户输入作为变量名:f"{user_defined_var}"
数据库查询参数:f"SELECT * FROM {table_name}"
文件路径拼接:f"/path/{filename}"
防御措施:
对用户输入进行严格验证和过滤
使用参数化查询代替字符串拼接
需要处理动态内容时,考虑使用str.format()或%格式化
限制f-string只处理可信的、程序内部生成的变量
安全使用示例:
# 不安全的方式
user_input = input("Enter value: ")
print(f"User entered: {user_input}") # 潜在危险
# 相对安全的方式
safe_input = html.escape(user_input) # 先进行转义处理
print(f"User entered: {safe_input}")
这种运行时求值的特性虽然提供了强大的表达能力,但也要求开发者必须格外注意安全防护措施。