字符串格式化:% vs. .format vs. f-字符串字面量
有几种不同的字符串格式化方法:
- 在Python 2.6之前:
"Hello %s" % name
- 在Python 2.6及以上版本:
"Hello {}".format(name)
(使用了str.format
) - 在Python 3.6及以上版本:
f"{name}"
(使用了f-strings)
那么,哪种方法更好,适合什么情况呢?
下面这些方法的结果是一样的,那它们有什么不同呢?
name = "Alice" "Hello %s" % name "Hello {0}".format(name) f"Hello {name}" # Using named arguments: "Hello %(kwarg)s" % {'kwarg': name} "Hello {kwarg}".format(kwarg=name) f"Hello {name}"
字符串格式化是在什么时候运行的?我该如何避免运行时性能下降呢?
如果你想关闭一个重复的问题,只是想找一种格式化字符串的方法,请参考如何将变量的值放入字符串中?。
16 个回答
假设你在使用Python的logging
模块,你可以把字符串格式化的参数直接作为参数传给.debug()
方法,而不是自己去格式化字符串:
log.debug("some debug info: %s", some_info)
这样做的好处是,只有在记录器真的记录信息的时候,才会进行格式化,避免了不必要的操作。
我知道的,取模运算符(%)有些事情是做不到的:
tu = (12,45,22222,103,6)
print '{0} {2} {1} {2} {3} {2} {4} {2}'.format(*tu)
结果
12 22222 45 22222 103 22222 6 22222
这个功能非常有用。
还有一点:format()
是一个函数,可以作为其他函数的参数使用:
li = [12,45,78,784,2,69,1254,4785,984]
print map('the number is {}'.format,li)
print
from datetime import datetime,timedelta
once_upon_a_time = datetime(2010, 7, 1, 12, 0, 0)
delta = timedelta(days=13, hours=8, minutes=20)
gen =(once_upon_a_time +x*delta for x in xrange(20))
print '\n'.join(map('{:%Y-%m-%d %H:%M:%S}'.format, gen))
结果是:
['the number is 12', 'the number is 45', 'the number is 78', 'the number is 784', 'the number is 2', 'the number is 69', 'the number is 1254', 'the number is 4785', 'the number is 984']
2010-07-01 12:00:00
2010-07-14 20:20:00
2010-07-28 04:40:00
2010-08-10 13:00:00
2010-08-23 21:20:00
2010-09-06 05:40:00
2010-09-19 14:00:00
2010-10-02 22:20:00
2010-10-16 06:40:00
2010-10-29 15:00:00
2010-11-11 23:20:00
2010-11-25 07:40:00
2010-12-08 16:00:00
2010-12-22 00:20:00
2011-01-04 08:40:00
2011-01-17 17:00:00
2011-01-31 01:20:00
2011-02-13 09:40:00
2011-02-26 18:00:00
2011-03-12 02:20:00
关于你第一个问题的回答... .format
在很多方面看起来更高级一些。使用 %
的一个烦人之处是,它可以接受一个变量或者一个元组。你可能会认为下面的写法总是能正常工作:
"Hello %s" % name
但是,如果 name
是 (1, 2, 3)
,就会出现 TypeError
的错误。为了确保它总是能正确打印,你需要这样做:
"Hello %s" % (name,) # supply the single argument as a single-item tuple
这看起来就很糟糕。.format
就没有这些问题。而且在你给的第二个例子中,.format
的写法看起来要干净得多。
只有在需要兼容 Python 2.5 的情况下才使用 %
。
关于你第二个问题的回答,字符串格式化和其他操作是同时进行的——当字符串格式化表达式被计算时。Python 不是一种懒惰的语言,它会在调用函数之前先计算表达式,所以表达式 log.debug("some debug info: %s" % some_info)
会先计算出字符串,比如 "some debug info: roflcopters are active"
,然后这个字符串会被传递给 log.debug()
。