Python 不带'的字符串连接+';操作人员
我在玩python,我意识到我们不需要使用“+”操作符来连接静态字符串。但是如果我把它赋给一个变量,它就会失败 例如:Python 不带'的字符串连接+';操作人员,python,string,optimization,concatenation,string-concatenation,Python,String,Optimization,Concatenation,String Concatenation,我在玩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 =
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
现在我有两个问题:
这是隐式字符串文字连接。它只发生在字符串文本中,而不是变量或其他计算为字符串的表达式中。过去存在(微小的)性能差异,但现在,窥视孔优化器应该使表单本质上等效。回答第二个问题:根本没有差异(至少在我使用的实现中是如此)。分解这两条语句后,它们将呈现为
LOAD\u CONST STORE\u FAST
。它们是等效的。来自:
允许多个相邻字符串文字(由空格分隔),可能使用不同的引用约定,其含义与它们的串联相同。因此,“hello”‘world’相当于“helloworld”
语句3不起作用,因为: 必须使用“+”运算符在运行时连接字符串表达式 请注意,文档中副标题的标题也是“字符串文字连接”。这仅适用于字符串文字,而不适用于其他对象
可能没有什么不同。如果有的话,它可能非常小,任何人都不应该担心
此外,要了解这可能存在危险:
>>> def foo(bar, baz=None):
... return bar
...
>>> foo("bob"
... "bill")
'bobbill'
这是一个完美的例子,说明错误永远不应该悄无声息地过去。如果我想让“bill”作为参数
baz
,该怎么办?我忘记了逗号,但没有出现错误。相反,连接已经发生。您可以使用%s
,因为这比使用+号更有效
>>> string2 = "%s %s" %('Hello', 'World')
>>> string2
'Hello World'
(或)
还有一种方法是
.format
>>> string2 = "{0} {1}".format("Hello", "World")
>>> string2
'Hello World'
>>>
语句3的工作方式与连接两个字符串表达式以创建新字符串时的工作方式不同,您需要一个“+”运算符 然而,在sting 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次)
o/p
最慢的跑步比最快的跑长4.86倍。这可能意味着正在缓存中间结果。
每个循环25.7µs±21µs(7次运行的平均值±标准偏差,每个循环1次)为什么语句3不工作而语句1不工作? 因为,在第一个语句中,我们将一些常量赋给一个变量。变量赋值足够简单,这样我们就可以继续将多个常量赋给一个变量,并且赋值仍然会进行。术语
“hello”
和“world”
是同一类型的两个常量。因此,该声明起了作用
如果我们执行以下操作,我们将得到SyntaxError
string1 = "Hello" 1
原因是我们在一个变量赋值中提供了多个常量。这使python感到困惑,并将其作为错误抛出
语句3是关于基于两个变量分配一个变量的。这将产生SyntaxError
,因为python在将2个变量分配给变量之前不知道它可以对2个变量做什么
语句1和语句2之间是否存在任何技术差异,如计算速度等?
对。唯一的技术区别是可读性,而不是其他任何东西。可读性在Python中最为重要。对于未经训练的人来说,“hello”“world”
可能看起来像是编译器将向字符串添加空间。事实并非如此
但是,
"hello" + "world"
是明确和正常的。几乎总是显式比隐式好。在CPython中就是这样,但并非在每个实现中都是如此。@flornquake感谢您的输入。我更新并限制了我的回答。因此,在这种情况下,“错误永远不应该以静默方式传递”意味着语法应该定义为,如果从任何有效程序中删除逗号,则生成的程序要么无效,要么与原始程序具有相同的含义?我的意思是有语法意义的逗号,ofc,规则不应该应用于从字符串文本中删除逗号;-)@史蒂文:嗯,我想这不适合这个例子,不是吗。因为从技术上讲没有错误,对吗?另一个应用于Python和C的例子(尽管逗号的意思不同):
1-1
和1-1
是不同的。基本上,上下文敏感运算符会导致此类示例,并置实际上会将标记边界转换为上下文敏感运算符。字符串连接是一个特别容易犯的错误,因为在逗号分隔的字符串列表中引入换行符是很常见的。如果你写的是foo(1,-1)
,那么实际上你同样缺乏语言的能力,当你去掉后面的逗号时,你就无法分辨了。@SteveJessop哇,这太神奇了。我以前尝试学习C++,但我从来没有进入它,因为我非常喜欢Python(尤其是它的语法),但是你在这里一定教了我很多。非常感谢。这是python的一个可怕的“特性”。我的程序只是默默地失败了,因为我在为pandas头键入一长串名称时漏掉了一个逗号。这与C/C++类似,“hello”“world”
将自动连接在一起。有一个关于此行为的错误报告,但被拒绝,因为它是按设计:Py
"hello" + "world"