有多种字符串格式设置方法:
Python<2.6:“您好%s”%namePython 2.6+:“Hello{}”.format(name)(使用str.format)Python 3.6+:f“{name}”(使用f-string)
哪种情况更好?在什么情况下?
以下方法具有相同的结果,那么有什么区别?name=“爱丽丝”“你好%s”%name“您好{0}”.format(名称)f“您好{name}”#使用命名参数:“您好%(kwarg)s”%{'kwarg':name}“你好{kwarg}”.format(kwarg=name)f“您好{name}”字符串格式化何时运行,如何避免运行时性能损失?
如果您试图结束一个重复的问题,该问题只是在寻找一种格式化字符串的方法,请使用How do I put a variable value in a string?。
回答第一个问题。格式在许多方面似乎更为复杂。关于%的一个令人讨厌的问题是,它可以接受变量或元组。你会认为以下方法总是有效的:
"Hello %s" % name
然而,如果name恰好是(1,2,3),它将抛出一个TypeError。为了保证它总是打印出来,你需要
"Hello %s" % (name,) # supply the single argument as a single-item tuple
这太难看了。格式没有这些问题。同样在您给出的第二个示例中,.format示例看起来更简洁。
仅用于向后兼容Python 2.5。
为了回答第二个问题,字符串格式化与任何其他操作同时发生-当计算字符串格式化表达式时。Python不是一种惰性语言,它在调用函数之前会对表达式求值,因此表达式log.debug(“somedebuginfo:%s”%some_info)将首先将字符串求值为,例如“somedebug-info:roflcopters is active”,然后将该字符串传递给log.debug()。
正如我今天发现的,通过%格式化字符串的旧方法不支持Decimal,这是Python的十进制定点和浮点运算模块,开箱即用。
示例(使用Python 3.3.5):
#!/usr/bin/env python3
from decimal import *
getcontext().prec = 50
d = Decimal('3.12375239e-24') # no magic number, I rather produced it by banging my head on my keyboard
print('%.50f' % d)
print('{0:.50f}'.format(d))
输出:
0.000000000000000000000003123752390000000099074648500.00000000000000000000000312375239000000000000000000
当然可能会有变通办法,但您仍然可以考虑立即使用format()方法。
我想补充一下,从3.6版开始,我们可以使用fstring,如下所示
foo = "john"
bar = "smith"
print(f"My name is {foo} {bar}")
这给了
我叫约翰·史密斯
所有内容都转换为字符串
mylist = ["foo", "bar"]
print(f"mylist = {mylist}")
结果:
mylist=['fo','bar']
您可以像其他格式方法一样传递函数
print(f'Hello, here is the date : {time.strftime("%d/%m/%Y")}')
举个例子
您好,这里是日期:2018年4月16日