如何在一行中写多个字符串?

19 投票
12 回答
81582 浏览
提问于 2025-04-17 09:20

我开始学习Python,使用的是《用艰难的方式学Python》这本书,现在到了第16个练习:

http://learnpythonthehardway.org/book/ex16.html

我觉得自己很笨,因为我搞不懂一个看起来很简单的“额外加分”作业,要求把以下内容:

target.write(line1)
target.write('\n')
target.write(line2)
target.write('\n') 
target.write(line3)
target.write('\n') 

压缩成一行代码。我试过一些方法:

target.write(line1 \n, line2 \n, line3 \n)

或者:

target.write('line1 \n, line2 \n, line3 \n')

或者:

target.write(%r \n, %r \n, %r \n) % (line1, line2, line3)

我就是无法把line1、line2和line3这几个字符串都写在同一行里。我还尝试了各种其他组合,有的有逗号,有的有引号等等,但总是出现不同的错误,比如“语法无效”或者“参数太多”。

12 个回答

4

这里有一种方法:

target.write(line1 + '\n' + line2 + '\n' + line3 + '\n')

下面这个不工作的原因是:

target.write(line1 \n, line2 \n, line3 \n)

line1 是一个变量(注意它没有加引号),而 '\n' 是一个字符串字面量(因为它有引号)。在这里,加法运算符被用来连接(合并)字符串。

这个不工作的原因是:

target.write('line1 \n, line2 \n, line3 \n')

因为 line1 是一个变量。当你把它放在引号里时,它就不再被当作变量来处理了。

7

你最后的尝试看起来不错。它应该像这样:

"%s \n %s \n %s" % (line1, line2, line3)

这里使用了一个运算符 %,它会对一个字符串(里面有3个 %s 的占位符)和一组要替换的值(在这里是字符串)进行处理。最终的结果就是格式化后的字符串。

所以你需要把这个结果放到一个函数里去处理:

target.write("%s \n %s \n %s" % (line1, line2, line3) )
51
target.write(line1 \n, line2 \n, line3 \n)

'\n' 只有在字符串中才有意义。如果没有引号,你就没有字符串。

target.write('line1 \n, line2 \n, line3 \n')

好吧,现在所有的东西都是字符串了。但是你希望 line1、line2、line3 不是字符串。你需要把它们当作 Python 表达式来引用相关的变量。简单来说,你需要把实际的文本,比如 "\n" 用引号括起来,但变量则不需要。如果你这样做了,可能会得到类似这样的结果:

target.write(line1 '\n' line2 '\n' line3 '\n')

什么是 2 2? 这没什么意义。你必须告诉 Python 怎么把这两个部分结合起来。所以你可以写 2 + 22 * 2,但 2 2 是没有意义的。在这种情况下,我们使用加法来连接两个字符串。

target.write(line + '\n' + line2 + '\n' + line3 + '\n')

接下来,

target.write(%r \n, %r \n, %r \n) % (line1, line2, line3)

再次强调,\n 只有在字符串中才有意义。% 操作符在生成字符串时,需要左边是一个字符串。所以你需要把所有的格式化细节放在字符串里面。

target.write('%r \n', '%r \n', '%r \n') % (line1, line2, line3)

但这样会产生三个字符串,而你只想要一个。如果你这样做,写入时会出错,因为它只接受一个字符串,而不是三个。所以你可能尝试过类似这样的:

target.write('%r \n%r \n%r \n') % (line1, line2, line3)

但是你想把 line1、line2、line3 写入文件。在这种情况下,你试图在写入已经完成后进行格式化。当 Python 执行这个时,它会先执行 target.write,留下:

None % (line1, line2, line3)

这将没有任何用处。要解决这个问题,我们需要把 % () 放在 .write() 里面。

target.write('%r\n%r\n%r\n' % (line1, line2, line3))

撰写回答