2、Python面试题解析:如何进行字符串插值?
Python字符串插值详解
字符串插值是将变量或表达式嵌入字符串中的一种技术,Python提供了多种方式实现字符串插值。以下是常见的几种方法及其详细解析和代码示例。
1. 百分号(%)格式化
这是Python早期版本中的字符串插值方法,类似于C语言的printf
风格。
语法
"格式化字符串" % (变量1, 变量2, ...)
示例
name = "Alice"
age = 25
print("My name is %s and I am %d years old." % (name, age))
格式化符号
符号 | 描述 |
---|---|
%s | 字符串 |
%d | 十进制整数 |
%f | 浮点数 |
%x | 十六进制整数 |
%o | 八进制整数 |
优点
- 简单直观,适合少量变量插值。
缺点
- 可读性差,尤其是变量较多时。
- 不支持复杂表达式。
2. str.format()
方法
Python 2.6引入的字符串格式化方法,功能更强大。
语法
"格式化字符串".format(变量1, 变量2, ...)
示例
name = "Bob"
age = 30
print("My name is {} and I am {} years old.".format(name, age))
高级用法
-
位置参数
print("{1} is {0} years old.".format(age, name))
-
关键字参数
print("My name is {name} and I am {age} years old.".format(name="Charlie", age=35))
-
格式化数字
pi = 3.14159 print("Pi is approximately {:.2f}".format(pi)) # 保留两位小数
优点
- 支持位置和关键字参数,灵活性高。
- 可读性较好。
缺点
- 语法稍显冗长。
3. f-string(格式化字符串字面量)
Python 3.6引入的字符串插值方法,是目前推荐的方式。
语法
f"格式化字符串{表达式}"
示例
name = "David"
age = 40
print(f"My name is {name} and I am {age} years old.")
高级用法
-
表达式计算
a, b = 5, 10 print(f"The sum of {a} and {b} is {a + b}.")
-
格式化数字
pi = 3.14159 print(f"Pi is approximately {pi:.2f}.") # 保留两位小数
-
调用函数
def greet(name): return f"Hello, {name}!" print(f"{greet('Eve')}")
优点
- 语法简洁,可读性极佳。
- 支持复杂表达式和函数调用。
- 性能优于
%
和str.format()
。
缺点
- 仅支持Python 3.6及以上版本。
4. Template Strings(模板字符串)
Python标准库string
模块提供的模板字符串,适合用户可控的简单插值。
语法
from string import Template
template = Template("格式化字符串")
template.substitute(变量字典)
示例
from string import Template
name = "Frank"
age = 45
template = Template("My name is $name and I am $age years old.")
print(template.substitute(name=name, age=age))
优点
- 安全性高,适合处理用户输入。
- 语法简单。
缺点
- 功能有限,不支持复杂表达式。
5. 性能对比
以下是对四种方法的简单性能测试:
import timeit
# 测试代码
setup = 'name = "Alice"; age = 25'
tests = {
"% operator": '"My name is %s and I am %d years old." % (name, age)',
"str.format": '"My name is {} and I am {} years old.".format(name, age)',
"f-string": 'f"My name is {name} and I am {age} years old."',
"Template": 'Template("My name is $name and I am $age years old.").substitute(name=name, age=age)'
}
# 运行测试
for method, code in tests.items():
time = timeit.timeit(code, setup=setup, number=100000)
print(f"{method}: {time:.6f} seconds")
结果(示例)
% operator: 0.123456 seconds
str.format: 0.234567 seconds
f-string: 0.098765 seconds
Template: 0.345678 seconds
- f-string性能最优。
- %操作符次之。
- Template最慢,但安全性最高。
6. 总结与推荐
方法 | 适用场景 | 推荐指数 |
---|---|---|
f-string | Python 3.6+,高性能、简洁 | ⭐⭐⭐⭐⭐ |
str.format | Python 2.6+,兼容性好 | ⭐⭐⭐⭐ |
%操作符 | 旧代码维护,简单插值 | ⭐⭐⭐ |
Template | 用户输入处理,安全性要求高 | ⭐⭐ |
推荐使用f-string,除非需要兼容旧版本或处理用户输入。