如何在一行中写多个字符串?
我开始学习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 个回答
这里有一种方法:
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
是一个变量。当你把它放在引号里时,它就不再被当作变量来处理了。
你最后的尝试看起来不错。它应该像这样:
"%s \n %s \n %s" % (line1, line2, line3)
这里使用了一个运算符 %
,它会对一个字符串(里面有3个 %s
的占位符)和一组要替换的值(在这里是字符串)进行处理。最终的结果就是格式化后的字符串。
所以你需要把这个结果放到一个函数里去处理:
target.write("%s \n %s \n %s" % (line1, line2, line3) )
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 + 2
或 2 * 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))