不使用“+”运算符的字符串连接
- 2025-02-27 09:07:00
- admin 原创
- 78
问题描述:
我在玩 Python,我意识到我们不需要使用“+”运算符来连接静态字符串。但是如果我将它分配给变量,它就会失败。
例如:
string1 = 'Hello' 'World' #1 works fine
string2 = 'Hello' + 'World' #2 also works fine
string3 = 'Hello'
string4 = 'World'
string5 = string3 string4 #3 causes syntax error
string6 = string3 + string4 #4 works fine
现在我有两个问题:
为什么语句 3 不起作用而语句 1 起作用?
表述1和表述2在计算速度等方面是否存在技术上的差异?
解决方案 1:
来自Python 3.12 文档:
允许使用多个相邻的字符串文字(以空格分隔),可能使用不同的引用约定,并且它们的含义与它们连接在一起时相同。因此,
"hello" 'world'
相当于"helloworld"
。
语句 3 不起作用,因为:
运行时必须使用“+”运算符来连接字符串表达式。
请注意,文档中的子标题也是“字符串文字连接”。这仅适用于字符串文字,不适用于其他对象。
可能没什么区别。如果有区别,那可能也是微不足道的,没什么好担心的。
另外,要知道这样做可能会有危险:
>>> def foo(bar, baz=None):
... return bar
...
>>> foo("bob"
... "bill")
'bobbill'
这是一个完美的例子,说明错误不应该默默地传递。如果我想"bill"
成为参数怎么办baz
?我忘了一个逗号,但没有引发任何错误。相反,发生了连接。
解决方案 2:
这是隐式字符串文字连接。它只发生在字符串文字中,而不是变量或其他求值为字符串的表达式中。过去存在(微小的)性能差异,但如今,窥孔优化器应该使这些形式基本等同。
解决方案 3:
回答你的第二个问题:完全没有区别(至少在我使用的实现中没有区别)。拆解这两个语句,它们被呈现为LOAD_CONST STORE_FAST
。它们是等效的。
解决方案 4:
您可以使用%s
,因为这比使用 + 号更有效。
>>> string2 = "%s %s" %('Hello', 'World')
>>> string2
'Hello World'
(或者)
另一种方法是.format
>>> string2 = "{0} {1}".format("Hello", "World")
>>> string2
'Hello World'
>>>
解决方案 5:
语句 3 不起作用,因为当您连接两个字符串表达式来创建一个新字符串时,您需要一个“+”运算符。
而在字符串 1、2 和 4 的情况下,由空格分隔的相邻文字使用不同的引用约定。因此,允许它们打印与它们的连接相同的内容。
此外,运行这两项操作不会有任何显著或明显的时间差异。
%%timeit -n 1
s1='ab'
s2='ba'
print(s1+s2)
o/p 最慢的运行时间比最快的运行时间长 17.08 倍。这可能意味着中间结果正在被缓存。每循环 57.8 µs ± 92.5 µs(7 次运行的平均值 ± 标准差,每次 1 次循环)
%%timeit -n 1
s3='ab' 'ba'
print(s3)
o/p 最慢的运行时间比最快的运行时间长 4.86 倍。这可能意味着中间结果正在被缓存。每循环 25.7 µs ± 21 µs(7 次运行的平均值 ± 标准差,每次 1 次循环)
解决方案 6:
为什么语句 3 不起作用而语句 1 起作用?
因为在第一个语句中,我们将某个常量赋值给一个变量。变量赋值非常简单,我们可以继续将多个常量赋值给一个变量,赋值仍然会成功。术语"hello"
和"world"
是两个相同类型的常量。所以,这个语句有效。
如果我们执行以下操作,我们将得到SyntaxError
string1 = "Hello" 1
原因是我们在单个变量赋值中提供了多个常量。这让 Python 感到困惑,并抛出了错误。
语句 3 是关于根据两个变量分配一个变量。这将产生结果SyntaxError
,因为 Python 在将其分配给变量之前不知道它可以用 2 个变量做什么。
表述1和表述2在计算速度等方面是否存在技术上的差异?
是的。唯一的技术差异是可读性,而不是其他任何东西。可读性在 Python 中最为重要。对于未经训练的人来说,"hello" "world"
可能看起来像是编译器会在字符串中添加空格。但事实并非如此。
然而,
"hello" + "world"
是明确且正常的。几乎总是,明确比隐含更好。
扫码咨询,免费领取项目管理大礼包!