字符串格式:% vs. .format vs. f-string 文字

新手上路,请多包涵

有多种字符串格式化方法:

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

哪个更好,在什么情况下?


  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}"

  1. 字符串格式化何时运行,如何避免运行时性能损失?

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

原文由 NorthIsUp 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 490
2 个回答

回答你的第一个问题…… .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()

原文由 Claudiu 发布,翻译遵循 CC BY-SA 4.0 许可协议

模运算符( % )不能做的事情,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

原文由 eyquem 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题