Python字符串格式化:%、format、f-string与Template详解
本文深入解析Python中四种字符串格式化方式:%占位符、str.format、f-string及string.Template。通过代码示例展示各方法的位置参数、字典解包、对齐填充及精度控制用法,并基于timeit进行性能基准测试。结果显示f-string在Python 3.6+中执行效率最高,适合高频调用场景;而Template类因安全性高,适用于处理用户输入。
一、%号占位符
这是Python中最早引入且易于理解的格式化方式。其基本使用逻辑包含三个核心步骤:
1. 在需要动态插入内容的字符串位置使用占位符(如%s、%d等); 2. 将待格式化的变量封装为元组形式提供; 3. 使用%操作符将格式化字符串与变量元组连接起来。
使用%占位符时,格式化字符串中的占位符顺序必须与传入的变量值在位置上严格一一对应。
注意:当需要格式化的变量数量较多时,手动维护位置对应关系容易出错,导致参数错位。
例如:
a = 'zhangsan'
b = 'lisi'
print('%s eated %s' % (a, b)) # zhangsan eated lisi
print("%s asked %s to do something" % ("zhangsan", 'lisi')) # zhangsan asked lisi to do something
2. 除了位置参数,还可以使用字典方式格式化。这种方式通过键名匹配值,打破了位置顺序的限制,使代码更具可读性。
print("我的名字是%(name)s,我的年龄是%(age)s" % {"name": 'zhangsan', "age": "list"}) # 我的名字是zhangsan,我的年龄是list
kwargs = {"name": "zhangsan", "age": 18}
print("my name is %(name)s, my age is %(age)s" % kwargs) # my name is zhangsan, my age is 18二、str.format 内建函数
str.format方法自Python 2.6版本起引入,作为字符串类型的内置方法,它提供了比%操作符更高的性能和更丰富的灵活性。
1. 使用位置参数 按照参数在字符串中出现的顺序一一对应。
print("{} and {} is good friedng".format('zhangsan', 'lisi')) # zhangsan and lisi is good friedng
2. 使用索引 通过指定索引号来引用对应位置的参数值。
print('{0}{0}{1}{0}'.format('哈哈', '隔')) # 哈哈哈哈隔哈哈
3. 使用关键字参数或字典 支持通过关键字参数或解包字典的方式进行格式化,这种方式同样打破了位置限制,提升了代码的可读性和维护性。
print('我的名字是 {name}, 我的年龄是 {age}.'.format(age=18, name='egon'))
kwargs = {'name': 'egon', 'age': 18}
print("my name is {name}, my age is {age}".format(age=18, name="zhangsan"))
kwargs = {'name': 'zhangsan', "age": 18}
print("my name is {name}, my age is {age}".format(**kwargs)) # 使用**进行解包操作4. 填充与格式化控制 在获取值后,可通过冒号后的格式说明符设定填充样式,语法结构为:[填充字符][对齐方式][宽度]。
例如:<20表示左对齐,总宽度为20个字符,不足部分默认用空格填充(若指定字符则用该字符填充)。
print("my name is {0:*<20},my age is {1:*<10}".format("zhangsan",
18)) # my name is zhangsan************,my age is 18********
# *>10: 右对齐,总共10个字符,不足部分用*填充
print("my name is {0:*<10}".format("zhangsan")) # my name is zhangsan**
# *^10: 居中,总共18个字符,不足部分用*填充
print("my name is {0:*^18}".format("zhangsan")) # my name is *****zhangsan*****
# ^20: 居中,总共20个字符,不足部分用空白填充
print("my name is {0:^20}".format("zhangsan")) # my name is zhangsan5. 精度与进制转换 支持对数字进行精度控制(如小数位数)以及进制转换(二进制、八进制、十六进制等)。
print("{salary:.2f}".format(salary=123456.1234567)) # 123456.12精确到小数点后3位,四舍五入
print("{salary:.10f}".format(salary=123456.1234567)) # 123456.1234567890精确到小数点后3位,四舍五入
print("{:-^10.2f}".format(3.1415926)) # ---3.14--- 取2位小数后,居中,共10位,其余用-填充
print("{0:b}".format(123)) # 1111011 转成二进制
print("{0:o}".format(123)) # 173 转成八进制
print("{0:x}".format(123)) # 7b 转成十六进制
print("{0:,}".format(1234567)) # 1,234,567 千分位格式化
三、f-Strings
f-string(Formatted String Literals)是Python 3.6版本引入的特性,称为字面量格式化字符串。它以f或F开头,后跟字符串,字符串内的表达式被大括号{}包裹,Python会在运行时计算表达式并将结果替换到字符串中。
f-string的核心在于利用{}符号嵌入变量或表达式。
1. {}中可以直接放置变量名
name = ‘zhangsan'
print(f"my name is {name}") # my name is zhangsan2. {}中也可以放置表达式
大括号内可以包含任意合法的Python表达式,这些表达式会在运行时被求值。
print(f"{3 * 3 / 2}") # 4.5
a = 1
b = 2
print(f"a + b = {a + b}") # a + b = 3例如,可以在{}中直接调用函数。
name = 'zhangsan'
print(F"my name is {name.upper()}") # my name is ZHANGSAN
def foo(n):
print("zhangsan is beautifull")
return n
print(F"{foo(10)}") # 10 执行时打印函数的返回值
# 在{}中使用‘或者” 保证{}内外使用的不一样即可,如下
print(F'test {"str"}') # teststr
print(F"test {'str'}") # teststr
# 在{}中需要同时使用'和“,则需要外部字符串使用文档字符串符号'‘'或者”“”
name = 'zhangsan'
print(F'''it's name is "{name}" ''') # it's name is "zhangsan" 注意各个'‘'是不一样的
print(F"{'{}'}") # 输出{} 注意两种引号不一样
# {}中不允许出现\即使作为函数参数;必须使用的话,可以将包含\的内容放到一个变量里,如下
a = 'zhangsan'
b = f'my name is {a:-^10}'
print(b) # my name is -zhangsan-
# a = f'print the {"\t"}'
# print(a) # 语法错误
a = '\n'
print(F"print the {a}") # print the \n没有显示 但打印正常
# f.str 格式可用于多行字符串,有两种方式:使用连接符\ 和使用doc签字串。如下
name = 'zhangsan '
age = 18
res = f'my name is {name},' \
F"my age is {age}," \
F"and i'm happy"
print(res) # my name is zhangsan ,my age is 18,and i'm happy
res = f'''my name is {name} ,my age is {age},and i'm happy,
my name is {name} ,my age is {age},and i'm happy
my name is {name} ,my age is {age},and i'm happy
my name is {name} ,my age is {age},and i'm happy'''
print(res) # 输出4行文本四、string模块的Template
这是string模块提供的一个模板类,默认使用$或${}作为占位符(推荐使用${}),而非%。具体用法如下:
from string import Template
s = 'hi ${name}'
res = Template(s).substitute(name='zhangsan') # substitute替代品的意思
print(res) # hi zhangsan
# 当需要输出一个$符号时,可以使用$$
s1 = f'{name}‘s salary is $$1000'
res = Template(s1).substitute(name='zhangsan')
print(res)
# Template还有一个safe_substitute函数,
# 当格式化字符串中有变量未给出值时,此函数将占位符当成字符串输出,
# 而substitute会报错
name = 'zhangsan'
# s2 = f'{name} and {name2}‘s salary is $$1000'
# res = Template(s2).substitute()
# print(res) # 报错NameError: name 'name2' is not defined
#学习中遇到问题没人解答?小编创建了一个Python学习交流群:725638078
s3 = 'hi ${apple}, ${peach}'
res = Template(s3).safe_substitute(apple='apple')
print(res) # hi apple, ${peach}五、总结四种方式的应用场景
性能对比
from timeit import timeit
def test_s():
name = 'zhangsan'
age = 18
return "%s:%s" % (name, age)
def test_format():
name = 'zhangsan'
age = 18
return '{}:{}'.format(name, age)
def test_f():
name = 'zhangsan'
age = 18
return f'{name}:{age}'
def test_t():
return Template('{name}:{age}').substitute(name='zhangsan', age=18)
res1 = timeit(test_s, number = 100000)
res2 = timeit(test_format, number = 100000)
res3 = timeit(test_f, number = 100000)
res4 = timeit(test_t, number = 100000)
print(res1) # 0.027567900004214607
print(res2) # 0.03230700000131037
print(res3) # 0.020800700003746897
print(res4) # 0.0893696999992244从执行效率来看,最新的f-string表现最佳。
到此这篇关于Python中格式化字符串输出的4种方式小结的文章就介绍到这了,更多相关Python 格式化字符串输出内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













