字符串格式:% 与 .format 与 f 字符串文本

有多种字符串格式设置方法:

  • Python <2.6:"Hello %s" % name
  • Python 2.6+:(使用 str.format"Hello {}".format(name))
  • Python 3.6+:(使用 f 字符串)f"{name}"

哪个更好,适用于什么情况?


  1. 以下方法具有相同的结果,那么有什么区别呢?

    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}"
    
  2. 字符串格式设置何时运行,如何避免运行时性能损失?


如果您试图关闭一个重复的问题,只是在寻找一种格式化字符串的方法,请使用 如何将变量的值放在字符串中?


答案 1

要回答您的第一个问题... 只是在很多方面看起来更复杂。一个令人讨厌的事情也是它如何采用变量或元组。您可能会认为以下内容始终有效:.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()


答案 2

模运算符 (% ) 无法做到的事情,afaik:

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

推荐