# % 号
%
号格式化字符串的方式从 Python 诞生之初就已经存在,时至今日,python 官方也并未弃用 %
号,但也并不推荐这种格式化方式。
| |
| |
| print('%s asked %s to do something' % ('egon', 'lili')) |
| print('%s asked %s to do something' % ('lili', 'egon')) |
| |
| |
| |
| kwargs={'name': 'egon', 'age': 18} |
| print('我的名字是 %(name)s, 我的年龄是 %(age)s.' % kwargs) |
该 format 方法是在 Python 2.6 中引入的,是字符串类型的内置方法。因为 str.format 的方式在性能和使用的灵活性上都比 % 号更胜一筹,所以推荐使用
# 使用位置参数
| |
| print('{} asked {} to do something'.format('egon', 'lili')) |
| print('{} asked {} to do something'.format('lili', 'egon')) |
# 使用索引
| |
| print('{0}{0}{1}{0}'.format('x','y')) |
# 使用关键字参数 or 字典
| |
| print('我的名字是 {name}, 我的年龄是 {age}.'.format(age=18, name='egon')) |
| |
| kwargs = {'name': 'egon', 'age': 18} |
| print('我的名字是 {name}, 我的年龄是 {age}.'.format(**kwargs)) |
# 填充与格式化
| |
| |
| |
| print('{0:*<10}'.format('开始执行')) |
| |
| |
| print('{0:*>10}'.format('开始执行')) |
| |
| |
| print('{0:*^10}'.format('开始执行')) |
# 精度与进制
| print('{salary:.3f}'.format(salary=1232132.12351)) |
| print('{0:b}'.format(123)) |
| print('{0:o}'.format(9)) |
| print('{0:x}'.format(15)) |
| print('{0:,}'.format(99812939393931)) |
# f-Strings
str.format()
比 %
格式化高级了一些,但是它还是有自己的缺陷。当需要传入的字符串过多时,仍然会显得非常冗长。与在 Python 3.6 中引入 了 f-strings
,不仅比 str.format
更简洁,性能上也更胜一筹
# {} 中可以是变量名
| name = 'egon' |
| age = 18 |
| print(f'{name} {age}') |
| print(F'{age} {name}') |
# {} 中可以是表达式
| |
| |
| print(f'{3*3/2}') |
| |
| |
| def foo(n): |
| print('foo say hello') |
| return n |
| |
| print(f'{foo(10)}') |
| |
| |
| name='EGON' |
| print(f'{name.lower()}') |
# 在类中的使用
| >>> class Person(object): |
| ... def __init__(self, name, age): |
| ... self.name = name |
| ... self.age = age |
| ... def __str__(self): |
| ... return f'{self.name}:{self.age}' |
| ... def __repr__(self): |
| ... return f'===>{self.name}:{self.age}<===' |
| ... |
| >>> |
| >>> obj=Person('egon',18) |
| >>> print(obj) |
| egon:18 |
| >>> obj |
| ===>egon:18<=== |
| >>> |
| >>> |
| >>> |
| >>> |
| >>> f'{obj}' |
| 'egon:18' |
| >>> f'{obj!r}' |
| '===>egon:18<===' |
# 多行 f-Stings
| |
| name = 'Egon' |
| age = 18 |
| gender = 'male' |
| hobbie1='play' |
| hobbie2='music' |
| hobbie3='read' |
| info = [f'名字:{name}年龄:{age}性别:{gender}',f'第一个爱好:{hobbie1}第二个爱好:{hobbie2}第三个爱好:{hobbie3}'] |
| |
| |
| info = [ |
| |
| f'名字:{name}' |
| f'年龄:{age}' |
| f'性别:{gender}', |
| |
| |
| f'第一个爱好:{hobbie1}' |
| f'第二个爱好:{hobbie2}' |
| f'第三个爱好:{hobbie3}' |
| ] |
| |
| print(info) |
| |
# 引号的嵌套
| |
| |
| print("my name is 'egon'") |
| |
| |
| print('my name is \'egon\'') |
# 注意
# 括号的处理
由于不能在 {}
内出现反斜杠 \
,所以,当我们的输出的结果中需要包含 {}
时,下面的做法就是错误的
类似于输出 %
号的做法
若想输出 {}
, 那么需要在原有的基础上再套一层,如下
# 标准库模板
从 Python 2.4 起,Python 标准库 string 引入了 Template
也可以用来格式化字符串。
所以说,与前三种方式的一个显著区别就是: Template
并属于 python 语言的核心语法特征,使用方式如下:
| from string import Template |
| |
| name='EGON' |
| t = Template('Hello $name!') |
| res=t.substitute(name=name) |
| |
| print(res) |
另外一个不同的地方是这个模板字符串不支持类似 str.format
那样的进制转换,需要我们自己处理
| from string import Template |
| |
| name='EGON' |
| templ_string = 'Hello $name, there is a $error error!!!' |
| res=Template(templ_string).substitute(name=name, error=hex(12345)) |
| |
| print(res) |
使用模板字符串 Template 的最佳的时机就是当你的程序需要处理由用户提供的输入内容时。模板字符串是最保险的选择,因为可以降低复杂性。
其他一些复杂的字符串格式化技巧的可能会给你的程序带来安全漏洞。
# 本文引用
文章参考:https://zhuanlan.zhihu.com/p/110406030
文章作者:程序员 Egon 老湿