格式化字符串方法
- %-formatting
最传统的用%格式化字符串
传入单个变量
>>> name = "Kobe"
>>> "Hello, %s." % name
'Hello, Kobe.'
传入多个变量
>>> name = "Kobe"
>>> age = "40"
>>> "Hello, %s. You are %s." % (name, age)
'Hello, Kobe. You are 40.'
此方法为最传统的方法,缺点是,当需要很多变量输出时,会导致代码比较乱,而且不同格式的字符需要不同的占位符来代替。
- string.format ()
从python2.6诞生的方法
该方法是对%-formatting的改进。它使用正常的函数调用语法,并且可以通过对要转换为字符串的对象的__format __()方法进行扩展。
使用大括号{ }来作为占位符,不区分格式。
>>> name = "Kobe"
>>> age = "40"
>>> "Hello,{}. You are {}".format(name,age)
'Hello,Kobe. You are 40'
可以根据索引来调整参数的传递
>>> name = "Kobe"
>>> age = "40"
>>> "Hello,{1}. You are {0}".format(name,age)
'Hello,40. You are Kobe'
如果插入变量名称,则可以按照变量名称传递对象:
>>> "Hello,{name}. You are {age}".format(name=name,age=age)
'Hello,Kobe. You are 40'
也可以按照字典传参:
>>> person = {"name":"Kobe","age":"40"}
>>> "Hello,{name}. You are {age}".format(**person)
'Hello,Kobe. You are 40'
- f-string
python3.6诞生的新方法
该方法叫做“F字符串方法”,又称为“格式化字符串文字”。F字符串是开头有一个f的字符串文字,以及包含表达式的大括号将被其值替换。表达式在运行时进行渲染,然后使用__format__协议进行格式化。
>>> name = 'kobe'
>>> f'his name is {name}'
'his name is kobe'
由于f字符串是在运行时进行渲染的,因此可以将任何有效的Python表达式放入其中:
>>> a = 3
>>> b = 4
>>> f'{a+b}'
'7'
可以使用带有f字符串的类创建对象:
class Comedian:
def __init__(self, first_name, last_name, age):
self.first_name = first_name
self.last_name = last_name
self.age = age
def __str__(self):
return f"{self.first_name} {self.last_name} is {self.age}."
def __repr__(self):
return f"{self.first_name} {self.last_name} is {self.age}. Surprise!"
>>> new_comedian = Comedian("kobe", "bryant", "40")
>>> f"{new_comedian}"
'kobe bryant is 40.'
__str __()和__repr __()方法处理对象如何呈现为字符串,因此您需要确保在类定义中包含至少一个这些方法。如果必须选择一个,请使用__repr __(),因为它可以代替__str __()。
__str __()返回的字符串是对象的非正式字符串表示,应该可读。__repr __()返回的字符串是官方表示,应该是明确的。调用str()和repr()比直接使用__str __()和__repr __()更好。
默认情况下,f字符串将使用__str __(),但如果包含转换标志!r,则可以确保它们使用__repr __():
>>> new_comedian = Comedian("kobe", "bryant", "40")
>>> f"{new_comedian}"
'kobe bryant is 40.'
>>> new_comedian = Comedian("kobe", "bryant", "40")
>>> f"{new_comedian!r}"
'kobe bryant is 40. Surprise!'
多行f-string:
>>> a = 3
>>> b = 4
>>> print(f'{a}'
... f'{b}'
... f'{a+b}')
347
多行时必须每行都要有f,不然会有下面结果:
>>> print(f'{a}'
... '{b}'
... '{a+b}')
3{b}{a+b}
lambda表达式
如果需要使用lambda表达式,请记住,解析f-字符串的方式会稍微复杂一些。
如果!, :或}不在括号,大括号,括号或字符串中,则它将被解释为表达式的结尾。由于lambda使用:,这可能会导致一些问题:
>>> f"{lambda x:x*37 (2)}"
File "<fstring>", line 1
(lambda x)
^
SyntaxError: unexpected EOF while parsing
可以通过将lambda嵌套在圆括号中来解决此问题:
>>> f"{(lambda x:x*37) (2)}"
'74'
- 性能
f字符串中的f也可以代表“速度快”。
f-字符串比%-formatting和str.format()都快。正如你已经看到的,f-字符串是运行时渲染的表达式,而不是常量值。
参考文档:
https://realpython.com/python-f-strings/#multiline-f-strings
中文翻译的(有错):
https://mlln.cn/2018/05/19/python3 f-string格式化字符串的高级用法/#旧时代的格式化字符串