我了解我们应该使用%s来连接字符串而不是在Python中使用+

我可以执行以下任何操作:

hello = "hello"
world = "world"

print hello + " " + world
print "%s %s" % (hello, world)
print "{} {}".format(hello, world)
print ' '.join([hello, world])


但是为什么我应该使用+以外的其他东西吗?使用简单的+可以更快地编写连接。然后,如果您查看格式设置字符串,则可以指定类型,例如%s%d等。我知道最好对类型进行明确说明。

但是我读到即使应该更容易键入,也应避免使用+进行串联。是否有明确的理由应该以其他方式之一来连接字符串?

评论

谁告诉你更好?

%s不是用于串联的,它是从C的printf(3)派生的字符串格式的转换规范。在某些情况下,可以使用那个或一个串联运算符。您使用的信息应基于对情况的判断,而不是教条。编写代码的难易程度完全无关紧要,因为您只需要执行一次即可。

我将问题重新集中在了python上(尽管我不是python的人,并且代码中可能仍然存在故障)。请确保这是您要提出的问题,进行任何适当的更新,如果您对C或Java感兴趣,请考虑提出其他问题。

现在,我们有了上乘的F弦! print(f“ {hello} {world}”)具有连接的可读性,因为在字符串中可以看到变量的位置,并且比str.format更快。

@EnricoBorba同意。读取内插字符串的简便性是众所周知的。 F字符串类似于Shell,Perl和其他语言中使用的语法:echo“ $ hello $ world”。

#1 楼


可读性。格式字符串语法更具可读性,因为它可以将样式与数据分开。同样,在Python中,%s语法会自动将任何非str类型强制转换为str;而串联仅适用于str,而不能串联strint
性能。在Python中,str是不可变的,因此对于每对串联,必须将左右字符串复制到新字符串中。如果串联四个长度为10的字符串,则将复制(10 + 10)+((10 + 10)+10)+(((10 + 10)+10)+10)= 90个字符,而不是40个字符字符。随着字符串数量和大小的增加,情况将变得更加糟糕。 Java有时通过将一系列串联转换为使用StringBuilder来优化这种情况,但CPython则没有。
对于某些用例,日志记录库提供了一个API,该API使用格式字符串懒惰地创建日志条目字符串(logging.info("blah: %s", 4))。如果日志记录库确定当前日志条目将被日志过滤器丢弃,那么这对于提高性能非常有用,因此不需要格式化字符串。


评论


您是否有#1的科学或经验来源?因为我认为它的可读性要差得多(尤其是带有两个或三个以上的参数)

–爱神
2015年12月7日,12:58

@L.Möller:我不太确定您从最终的主观体验(易于阅读)中期望什么样的来源,但是如果您要我的推理:1)%s每个占位符需要2个额外的字符,而+需要至少4个(如果遵循PEP8,则为8;如果强制,则为13),2)%s包含在单个字符串中,因此使用+可以更直观地进行解析,您可以使用更多的移动部分:闭合字符串,运算符,变量,运算符,开放字符串,3)语法着色%s为每种功能提供一种颜色:字符串和占位符,使用+可获得三种着色:字符串,运算符和可变着色。

– Lie Ryan
2015年12月7日13:28



@L.Möller:4)我可以选择将更长的格式字符串放在变量或字典中,而无需进行格式化,5)可以从配置文件,命令args或数据库中指定用户指定格式字符串,不能用串联来表示。但是,是的,当要插入的内容超过4-5个时,我也不会使用%s,而是在Python中使用%(varname)s变体或“ {foo}”。format()。我认为显式名称提高了带有许多插值变量的较长格式字符串的可读性。

– Lie Ryan
2015年12月7日在13:46

我不知道什么是“真实的”,这就是为什么我问你是否有证据:-)。真的同意你的第二条评论

–爱神
2015年12月7日13:48



我发现#2值得怀疑-您有文件证明吗?我对Java并不是很熟悉,但是在C#中,串联比字符串插值要快。我完全同意#1并真的依靠它来决定何时使用它,但是您必须记住,插值需要大量的字符串解析和复杂性,而级联则不需要。

–吉米·霍法(Jimmy Hoffa)
2015年12月7日14:02

#2 楼

我是唯一一个从左到右阅读的人吗?

对我来说,使用%s就像听德语一样,我必须等很长的句子结束才能听到动词是什么。 。

哪些一目了然?

"your %s is in the %s" % (object, location)


"your " + object + " is in the " + location  


评论


显然,这是主观的,因为我发现第一个更具可读性-并且更容易编写和编辑。第二个将文本与使两者都模糊并增加噪音的代码混合在一起。例如,很容易在第二个错误的空格。

–雅克B
16年7月27日在6:28



@JacquesB我实际上认为您的大脑非常熟悉这种格式,以至于您立即跳到方括号中并立即替换单词。从技术上讲,这不是从左到右的阅读,但这很好。我发现我也这样做,所以是的,1更容易阅读,因为我知道我必须处理第二个引号之前和之后的愚蠢间距问题,这确实很慢。

–尼尔森
16-9-29在2:37

第一个对我来说更具可读性,因为它在句子中间的“草皮”更少。我的眼睛看向末尾要容易得多,而脑中解析出多余的引号,空格和加号会更容易。当然,我现在更喜欢Python 3.6格式的字符串:f“您的{object}在{location}中”。

–达斯汀·怀亚特(Dustin Wyatt)
17年1月26日在23:29

当变量本身需要用引号引起来时,我也发现更难读写。 “您的” +对象+“”位于“” +位置+“'” ......我什至不确定我现在是否正确...

–达斯汀·怀亚特(Dustin Wyatt)
17年1月26日在23:32

我发现f“您的{object}在{kitchen}中”(Python 3.6+)是最易读的。是的,进步。

–地狱
18年8月26日在7:48

#3 楼

阐明可读性参数的示例:

print 'id: ' + id + '; function: ' + function + '; method: ' + method + '; class: ' + class + ' -- total == ' + total

print 'id: %s; function: %s; method: %s; class: %s --total == %s' % \
   (id, function, method, class, total)


(请注意,第二个示例不仅可读性强,而且易于编辑,您可以在一行和

另外一个问题是%s代码也会转换为字符串,否则您必须使用str()调用,该调用的可读性也比%s代码低。

评论


我不同意您的第一个陈述,但我们可以同意不同,我正要按照您的第二个陈述发布答案,所以赞成

–莫格说要恢复莫妮卡
16-9-29在7:13

#4 楼

通常不应避免使用+。在许多情况下是正确的方法。仅在特定情况下才使用%s.join(),当它们是更好的解决方案时通常很明显。

在您的示例中,您将三个字符串连接在一起,而使用+的示例显然是如果想在更大的字符串中间插入字符串或值,则%s.format()非常有用。示例:

print "Hello %s, welcome to the computer!" % name


在这种情况下,使用%s更具可读性,因为避免了将第一个字符串分成多个段。尤其是当您要插入多个值时。

如果您有可变大小的字符串序列和/或想要使用相同的分隔符连接多个字符串,则.join()是合适的。

#5 楼

由于单词顺序可能会因不同的语言而变化,因此如果您要在软件中正确支持字符串的翻译,则必须使用%s形式。