Python是否像Ruby中的“string #{var}”一样进行变量插值?

48

在Python中,写起来很繁琐:

print "foo is" + bar + '.'

我能在Python中像这样做吗?

print "foo is #{bar}."


我想我已经找到了一个解决方案,你能看一下吗?https://dev59.com/xHLYa4cB1Zd3GeqPSQF6 - HarmonicaMuse
10个回答

66

Python 3.6+ 中确实有变量插值功能 - 在字符串前加上f

f"foo is {bar}"

对于 Python 版本低于此版本(Python 2 - 3.5),你可以使用 str.format 来传递变量:

# Rather than this:
print("foo is #{bar}")

# You would do this:
print("foo is {}".format(bar))

# Or this:
print("foo is {bar}".format(bar=bar))

# Or this:
print("foo is %s" % (bar, ))

# Or even this:
print("foo is %(bar)s" % {"bar": bar})

1
第三个看起来很整洁,但我记得这种方式有点过时了?这是真的吗? - mko
10
对于懒人,也可以使用print "foo is %(bar)s" % locals()来输出。 - Brian M. Hunt
1
@yozloy - 正确,据我所知,在Python 3中已被弃用。 - Sean Vieira
1
在Python 3中,“%”语法不再被弃用:https://dev59.com/gWYr5IYBdhLWcg3wuMb9#23381153 - Jeff Widman
1
这是不正确的,因为3.6引入了f-strings - smci
显示剩余4条评论

28

2
如果有人想知道:是的,您可以将其与原始字符串结合使用,例如 rf"foo is {bar}" - Toni Sučić

11

Python 3.6引入了f字符串

print(f"foo is {bar}.")

New answer:

自 Python 3.2 版本以来,str.format_map 可与 locals()globals() 结合使用,可以快速地实现:

Python 3.3.2+ (default, Feb 28 2014, 00:52:16) 
>>> bar = "something"
>>> print("foo is {bar}".format_map(locals()))
foo is something
>>> 

8

我从Python Essential Reference中学习到了以下编程技巧:

>>> bar = "baz"
>>> print "foo is {bar}.".format(**vars())
foo is baz.

当我们想在格式化字符串中引用许多变量时,这非常有用:

  • 我们无需再次重复所有变量在参数列表中:与基于显式关键字参数的方法(如"{x}{y}".format(x=x, y=y)"%(x)%(y)" % {"x": x, "y": y})进行比较。
  • 我们无需逐一检查变量在参数列表中的顺序是否与它们在格式化字符串中的顺序一致:与基于位置参数的方法(如"{}{}".format(x, y)"{0}{1}".format(x, y)"%s%s" % (x, y))进行比较。

2
这是一种奇怪的传递bar的方式...但相当不错,使其更符合Ruby的方式。 - Josiah
如果你正在处理一个对象,这似乎是最佳解决方案。例如,如果你正在报告urllib2.HTTPError,你可以使用"HTTP error: {error.code} {error.msg}".format(**vars())。但是,对于format(**locals())则不起作用。 - Mike T

5

3
或许有些老旧,但仍然常用的代码:print "foo is %s" % str(bar)。(注:该代码使用 Python 2 的语法,Python 3 中应使用 f-strings 或者 .format() 方法来实现。) - Edmon
那个应该已经被弃用了,尽管我找不到PEP。 - Josiah
不是已弃用,而是被取代。 - Sean Vieira
1
我猜在Python 2中不是这样,但至少应该在一段时间前被3.1废弃了。(参考链接) - Josiah

2

在Ruby中,以下两种写法有很大区别:

print "foo is #{bar}."

并且这些是Python中的:

print "foo is {bar}".format(bar=bar)

在Ruby示例中,bar评估
在Python示例中,bar只是字典的一个键
在使用变量时它们的行为大致相同,但总体而言,将Ruby转换为Python并不那么简单。

这是不正确的,自3.6版本以来就已经过时了。现在我们有了print(f"foo is #{bar}") - smci

2
我喜欢这种方法,因为你不必通过两次引用变量来重复自己:
alpha = 123
print '答案是 {alpha}'.format(**locals())

但我猜这很慢 - 对于参数解包一个可能很大的字典。 - warvariuc
@warwaruk 写入标准输出是限制因素,打印一个字符串需要比格式化它多花费10倍的时间,此外 locals() 返回一个引用,所以我认为这种方法非常快。 - jcr

0

0

你也可以像这样使用 模板字符串

from string import Template
s = Template('$who likes $what')
s.substitute(who='tim', what='kung pao')
# 'tim likes kung pao'

当你想要预先构建字符串模板并在其他地方注入变量时,这非常有效。

另请参阅: PEP 292 – 更简单的字符串替换


-1
几乎其他答案都不适用于我。可能是因为我使用的是Python3.5。唯一有效的方法是:
 print("Foobar is %s%s" %('Foo','bar',))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接