Python的变量插值是否类似于;字符串#{var}”;用红宝石?

Python的变量插值是否类似于;字符串#{var}”;用红宝石?,python,ruby,string-formatting,string-interpolation,language-comparisons,Python,Ruby,String Formatting,String Interpolation,Language Comparisons,在Python中,编写以下代码非常繁琐: print "foo is" + bar + '.' 我可以在Python中执行类似的操作吗 打印“foo是#{bar}”。是的,绝对是。在我看来,Python非常支持字符串格式、替换和运算符 这可能会有帮助: Python3.6+确实有变量插值-在字符串前面加一个f: f"foo is {bar}" 对于以下版本的Python(Python 2-3.5),可以使用str.format传入变量: # Rather than this: print(

在Python中,编写以下代码非常繁琐:

print "foo is" + bar + '.'
我可以在Python中执行类似的操作吗


打印“foo是#{bar}”。
是的,绝对是。在我看来,Python非常支持字符串格式、替换和运算符

这可能会有帮助:


Python3.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})

我从中学到了以下技巧:

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

  • 我们不必再次重复参数列表中的所有变量:将其与基于显式关键字参数的方法(例如
    “{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)
    )进行比较

我更喜欢这种方法,因为您不必重复引用变量两次:

alpha = 123 print 'The answer is {alpha}'.format(**locals()) α=123 打印“答案为{alpha}”。格式(**locals())
这在Ruby中有一个很大的区别:

print "foo is #{bar}."
Python中的这些:

print "foo is {bar}".format(bar=bar)
在Ruby示例中,
bar
被计算
在Python示例中,
bar
只是字典的一个键

在您仅使用变量的情况下,变量的行为或多或少是相同的,但一般来说,将Ruby转换为Python并不是那么简单


旧答案:

由于3.2版Python提供了与之配套的或允许您快速完成的功能:

Python 3.3.2+ (default, Feb 28 2014, 00:52:16) 
>>> bar = "something"
>>> print("foo is {bar}".format_map(locals()))
foo is something
>>> 
Python 3.6将使用f字符串:


几乎所有其他的答案都不适合我。可能是因为我在玩Python3.5。唯一有效的办法是:

 print("Foobar is %s%s" %('Foo','bar',))

我想我已经找到了一个解决方案,你能检查一下吗?可能与旧版本重复,但仍很流行:print“foo is%s”%str(bar),虽然我找不到PEP,但现在应该已经弃用了。没有弃用,只是被取代了。但它至少应该被不久前发布的3.1弃用。这是一个。。。奇怪的方式通过酒吧。。。虽然非常简洁,但它更接近Ruby的方式。如果您使用对象,这似乎是最好的解决方案。例如,如果您报告一个urllib2.HTTPError,您可以执行HTTP错误:{error.code}{error.msg}.format(**vars())这不适用于
格式(**locals())
第三个看起来很整洁,但我记得这种方式有点不推荐?这是真的吗?对于懒惰的人来说,
print“foo is%(bar)s”%locals()
@yozloy-correct在python3中被弃用(据我所知)。Python 3中不再反对%语法:这是不正确的,因为我想它非常慢-为参数解包一个可能很大的dict。@warwaruk写入std out是限制因素,打印字符串比格式化字符串需要10倍的时间,而且locals()返回一个引用,所以我认为这个方法非常快,如果有人想知道的话:是的,你可以把它和原始字符串结合起来,比如so
rf“foo is{bar}”
。这是不正确的,因为3.6版。我们现在有了
print(f“foo is{bar}”)
print(f"foo is {bar}.")
Python 3.3.2+ (default, Feb 28 2014, 00:52:16) 
>>> bar = "something"
>>> print("foo is {bar}".format_map(locals()))
foo is something
>>> 
print(f"foo is {bar}.")
 print("Foobar is %s%s" %('Foo','bar',))