Python字符串连接 - 连接'\n'

9

我刚接触Python,遇到了两个关于字符串拼接的问题,需要帮助理解。我知道可以使用+符号将字符串添加在一起进行拼接,例如:

>>> 'a' + 'b'
'ab'

然而,最近我发现甚至无需使用加号符号即可连接字符串(偶然/试验),这引起了我第一个理解问题 - 这是如何/为什么可能的!?

>>> print 'a' + 'b'
ab

此外,我也理解'\n'字符串会产生一个换行符。但是当与我的第一个问题结合使用时,我得到了以下结果。
>>> print '\n' 'a'*7

a
a
a
a
a
a
a

我的第二个问题是:“为什么我得到了7行新的字母'a'。换句话说,重复符号'*'不应该将字母'a'重复7次吗?如下所示。

>>> print 'a'*7
aaaaaaa

请帮我澄清发生了什么事情。


4
print '\n' 'a'*7 produce '\na' * 7, not a a a a a a a - Ruggero Turra
这只是他发布的格式错误。 - agf
4个回答

17

"a" "b"变为"ab"时,这与使用+连接字符串不同。在读取Python源代码时,相邻的字符串会自动连接起来以方便操作。

这不是一种常规操作,因此它不遵循您对+*的操作顺序的预期。

print '\n' 'a'*7

实际上被解释为相同的东西

print '\na'*7

而不是

print '\n' + 'a'*7

2

如果没有用逗号分隔,Python会将字符串连接在一起:

>>> print 'a' 'b'
ab

>>> print 'a', 'b'
a b

所以实际上你打印了'\na'七次。

他知道字符串是这样连接的,请阅读他的帖子的其余部分。 - agf

1
  1. 我不确定你所说的“怎么可能”的意思。你编写一个规则:将两个字符串连接在一起。然后在解析器中实现它。为什么?因为它允许你方便地做这样的事情:

    re.findall('(<?=(foo))'   # 复杂正则表达式的第一部分
               '>asdas s'     # 下一部分
               '[^asd]'       # 最后一部分
              )
    

    这样,你就可以描述你正在做的事情。

  2. 当你执行 A * B + C 时,计算机总是先执行 A 乘以 B,然后加上 C,因为乘法比加法优先级高。

    当你通过将字符串字面量放在一起并使用乘法进行字符串连接时,特殊的字符串连接首先执行。这意味着 '\n' 'a' * 7('\n' 'a') * 7 是相同的,因此你重复的字符串是 '\na'


1
你可能已经意识到,依赖相邻字符串的隐式连接有时会出现问题。此外,使用+运算符进行连接也不是很高效。如果只连接几个小字符串,则不会注意到,但在大规模操作时会非常明显。
要明确表达,请使用''.join()
print '\n'.join(['a'*7])

在许多短字符串上循环执行此操作会非常缓慢,因为它必须每次获取'\n'.join()方法。请尽量将其放在循环外部,或者改用map(str.join, sequence)。 - agf
嗯,根据上下文可以进行优化。不过,OP没有提到循环。 - Rob Cowie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接