Python 内建函数列表 > Python 的内置函数 format

Python 的内置函数 format() 是一个功能强大的字符串格式化工具,它提供了灵活且可读性强的格式化方式。该函数主要通过两种形式使用:

  1. 作为字符串对象的方法
    "格式化字符串".format(参数)
    

    这是最常见的用法,在字符串内部使用 {} 作为占位符,然后通过 format() 方法传入参数进行替换。

  2. 作为独立的内置函数
    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() 方法具有以下优势:

  1. 语法更直观,可读性更强
  2. 支持更复杂的格式化需求
  3. 可以灵活处理不同类型的数据
  4. 支持自定义格式化方式(通过 __format__ 方法)

在实际应用中,format() 方法常用于:

  • 生成报告时的数据格式化
  • 日志信息的格式化输出
  • 用户界面的文本显示
  • 数据导出时的格式转换

Python 3.6 之后新增的 f-string(格式化字符串字面量)实际上是 str.format() 方法的语法糖,但提供了更简洁直观的表达方式。它在字符串前缀加上 fF 标志,允许直接在字符串中嵌入表达式,用大括号 {} 包裹。

format() 方法相比,f-string 有以下特点:

  1. 直接在字符串内写变量名或表达式,无需像 format() 那样先定义再引用
  2. 执行效率更高,因为 f-string 在编译时就被转换为字节码
  3. 支持完整 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 是在运行时进行动态求值的表达式。这意味着字符串中的表达式会在程序执行时才会被计算和解析,而不是在编译阶段。这一特性带来了重要的安全考量:

  1. 安全风险具体表现:
    • 如果直接将未经处理的用户输入放入 f-string 表达式,恶意用户可能会注入可执行的Python代码
    • 例如:f"Result: {user_input}",如果user_input是”import(‘os’).system(‘rm -rf /’)”,将导致严重后果
  2. 典型应用场景中的风险:
    • 用户输入作为变量名:f"{user_defined_var}"
    • 数据库查询参数:f"SELECT * FROM {table_name}"
    • 文件路径拼接:f"/path/{filename}"
  3. 防御措施:
    • 对用户输入进行严格验证和过滤
    • 使用参数化查询代替字符串拼接
    • 需要处理动态内容时,考虑使用str.format()或%格式化
    • 限制f-string只处理可信的、程序内部生成的变量
  4. 安全使用示例:
    # 不安全的方式
    user_input = input("Enter value: ")
    print(f"User entered: {user_input}")  # 潜在危险
       
    # 相对安全的方式
    safe_input = html.escape(user_input)  # 先进行转义处理
    print(f"User entered: {safe_input}")
    

这种运行时求值的特性虽然提供了强大的表达能力,但也要求开发者必须格外注意安全防护措施。