Python 的 format 函数

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

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

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

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

1format(value, format_spec)  

这种形式主要用于对单个值进行特定格式的转换,常用于数字格式化等场景。

format() 提供了丰富的格式化功能,包括:

1"{} {}".format("Hello", "World")  # 输出:"Hello World"  
1"{name}今年{age}岁".format(name="小明", age=12)  
1"{0[0]} {0[1]}".format(["Python", "Java"])  # 输出:"Python Java"  
1"{:*^20}".format("Python")  # 居中,用*填充:"*******Python*******"  
2"{:<20}".format("Python")   # 左对齐:"Python              "  
1"{:b}".format(10)  # 二进制:"1010"  
2"{:x}".format(255) # 十六进制:"ff"  
1class Person:  
2    def __init__(self, name, age):  
3        self.name = name  
4        self.age = age  
5p = Person("张三", 30)  
6"{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 表达式,包括函数调用、算术运算等

示例对比

1# 使用 format() 方法
2name = "Alice"
3age = 25
4msg = "My name is {} and I'm {} years old".format(name, age)
5
6# 使用 f-string
7msg = f"My name is {name} and I'm {age} years old"
8

f-string 还支持格式化规范,如:

1price = 19.99
2print(f"Price: {price:.2f}")  # 输出: Price: 19.99
3
4from datetime import datetime
5print(f"Current time: {datetime.now():%Y-%m-%d %H:%M}")  # 输出当前时间
6

常见应用场景包括:

  • 构建动态 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. 安全使用示例:
1# 不安全的方式  
2user_input = input("Enter value: ")  
3print(f"User entered: {user_input}")  # 潜在危险  
4# 相对安全的方式  
5safe_input = html.escape(user_input)  # 先进行转义处理  
6print(f"User entered: {safe_input}")  

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


Python 的内置函数 format》 是转载文章,点击查看原文