name = "Spongebob Squarepants"
puts "Who lives in a Pineapple under the sea? \n#{name}."
成功的Python字符串连接对我来说似乎很冗长。
#1 楼
Python 3.6将添加与Ruby的字符串插值类似的文字字符串插值。从该版本的Python(计划于2016年底发布)开始,您将能够在“ f-strings”中包含表达式,例如name = "Spongebob Squarepants"
print(f"Who lives in a Pineapple under the sea? {name}.")
在3.6之前,最接近此函数的是
name = "Spongebob Squarepants"
print("Who lives in a Pineapple under the sea? %(name)s." % locals())
%
运算符可用于Python中的字符串插值。第一个操作数是要插入的字符串,第二个操作数可以具有不同的类型,包括“映射”,将字段名称映射到要插入的值。在这里,我使用局部变量locals()
的字典将字段名称name
映射为其值作为局部变量。使用最新Python版本的
.format()
方法的相同代码如下所示:name = "Spongebob Squarepants"
print("Who lives in a Pineapple under the sea? {name!s}.".format(**locals()))
还有
string.Template
类别:tmpl = string.Template("Who lives in a Pineapple under the sea? $name.")
print(tmpl.substitute(name="Spongebob Squarepants"))
评论
@Caste参见此处:docs.python.org/library/stdtypes.html#string-formatting,如果需要更多详细信息,请发表后续评论
–mikej
2010-12-15 13:59
我了解它的基本要点,但是我不完全理解文档示例中找到的所有其他符号和文本。为什么在此处使用转换为字符串:%(language)s'03d'中的3表示什么?为什么字符串后面有%\?在打印表达式之后分配变量(如果实际上是变量)也使我感到困惑。抱歉,这很痛苦!
–粘贴
2010-12-15 14:07
示例中使用的两种基本格式是%s表示字符串,%03d表示填充到3位数字前的零。它可以只写为“%s has%03d”%(“ Python”,2)。然后,该示例利用将映射键放在%之后的方括号中,这是一种为占位符提供有意义的名称的方式,而不是依赖于其在字符串中的顺序。然后,您传递一个将键名映射到其值的字典。这就是Sven使用locals()函数的原因,该函数返回一个包含所有局部变量的字典,因此它将name映射为name的值
–mikej
2010-12-15 14:15
首先使我困惑的是转换类型的必需用法。因此,使用文档术语。 %启动说明符。没有(语言)的转换标志,只有转换类型(尾随的“ s”); (数字)具有一个(或两个)转换标志,分别为“ 0”(和“ 3”)。 “ d”是转换类型,表示它是整数。我理解正确吗?
–粘贴
2010-12-15 14:32
@Caste:是的,基本上是正确的。请注意,您始终可以将s用作转换类型-Python可以将几乎所有内容转换为字符串。但是,您当然会失去其他转换类型的特殊格式化功能。
– Sven Marnach
2010-12-15 14:37
#2 楼
从Python 2.6.X开始,您可能要使用:"my {0} string: {1}".format("cool", "Hello there!")
评论
请注意,Python 3.x中不建议使用字符串内插的%运算符。 docs.python.org/dev/py3k/whatsnew/…宣布了从3.1开始弃用%的计划,但这从未发生。
– Sven Marnach
2010-12-15 14:52
%语法仍然存在于Python 3中(从Python 3.2开始不推荐使用)
– Corey Goldberg
2010-12-15 17:49
请注意:{}中的数字可以消除。
–画
2015年3月30日,下午2:55
#3 楼
我已经开发了interpy软件包,该软件包可在Python中启用字符串插值。只需通过
pip install interpy
进行安装即可。然后在文件开头添加
# coding: interpy
行!示例:
#!/usr/bin/env python
# coding: interpy
name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? \n#{name}."
评论
这似乎真的不安全。
– d33tah
2015年12月12日下午16:01
@ d33tah:不,只要在编译时就知道字符串即可。
–Clément
16 Dec 8'在0:59
#4 楼
Python的字符串插值类似于C的printf()如果尝试:
name = "SpongeBob Squarepants"
print "Who lives in a Pineapple under the sea? %s" % name
标签
%s
将替换为name
变量。您应该看一下打印功能标签:http://docs.python.org/library/functions.html 评论
我如何用2个变量来做到这一点?
–朱利奥·马林斯(Julio Marins)
15年7月15日在22:39
@JulioMarins使用元组:打印“第一个是%s,第二个是%s”%(var1,var2)。
–kirbyfan64sos
2015年11月5日在20:07
#5 楼
PEP 498中指定的Python 3.6将包含字符串插值。您将可以执行以下操作:name = 'Spongebob Squarepants'
print(f'Who lives in a Pineapple under the sea? \n{name}')
请注意,我讨厌海绵宝宝,所以写这个有点痛苦:)
评论
那个海绵宝宝参考(/ disaste)的想法:现在得投票支持。
– StephenBoesch
17年11月16日在3:47
#6 楼
您也可以拥有此name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? \n{name}.".format(name=name)
http://docs.python.org/2/library/string.html#formatstrings
评论
我不认为OP打算印刷#号。他们只是使用Ruby语法。
– Jaynp
15年1月3日,21:02
你是对的。我编辑了答案。我不熟悉Ruby,所以我认为#字符会被打印出来。
–全权
2015年2月4日,11:14
#7 楼
import inspect
def s(template, **kwargs):
"Usage: s(string, **locals())"
if not kwargs:
frame = inspect.currentframe()
try:
kwargs = frame.f_back.f_locals
finally:
del frame
if not kwargs:
kwargs = globals()
return template.format(**kwargs)
用法:
a = 123
s('{a}', locals()) # print '123'
s('{a}') # it is equal to the above statement: print '123'
s('{b}') # raise an KeyError: b variable not found
PS:性能可能有问题。这对本地脚本很有用,而不对生产日志有用。
重复项:
Python字符串格式:%vs.format
什么是Python相当于将表达式嵌入字符串中? (即Ruby中的“#{expr}”)
Ruby等同于Python的`s =“ hello,%s。%s在哪里?” %(“ John”,“ Mary”)`
是否有一个与Ruby的字符串插值等效的Python?
#8 楼
对于旧的Python(在2.4上测试),最佳解决方案指明了方向。您可以执行以下操作:import string
def try_interp():
d = 1
f = 1.1
s = "s"
print string.Template("d: $d f: $f s: $s").substitute(**locals())
try_interp()
您会得到
d: 1 f: 1.1 s: s
#9 楼
Python 3.6和更高版本使用f字符串进行文字字符串内插:name='world'
print(f"Hello {name}!")
评论
这里的问题是name是位于字符串中的局部变量,在Python中,如果要使用局部变量的字典,则必须将其显式传递给字符串格式化程序。这不是原始问题,但谢谢。您的评论使我对可变范围有了更好的理解(我仍然对此有所了解)。 :)
那么,您对此有何看法? stackoverflow.com/questions/16504732 / ...
PEP 215-字符串插值-被python.org/dev/peps/pep-0292
取代
有关3.6中的此确切功能,请参见stackoverflow.com/a/33264516/55721