《艰难学Python:第16章额外学分》

11 投票
5 回答
6627 浏览
提问于 2025-04-17 02:38

我在额外加分的第三个问题上卡住了。问题中的代码是这样的:

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

这个问题要求你“使用字符串、格式和转义字符,只用一个target.write()命令来打印出line1、line2和line3,而不是6个命令。”

所以,我想我可以这样写:

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

结果返回了:TypeError: unsupported operand type(s) for %: 'NoneType' and 'tuple.' 我查了一下这个错误,但没找到什么有用的信息,而且用%r也返回了同样的错误。

我觉得加号可能写错了,因为这都是一个字符串,所以我把它们删掉了,变成了:

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

结果还是不行。然后我试了这个:

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

这次至少把错误改成了:TypeError: unsupported operand type(s) for %: 'NoneType' and 'str'。这个变体也产生了同样的错误:

target.write("%s") % (line1 + line2 + line3)

总之,很明显我卡在某个地方。我觉得我的问题可能和我使用的%s/%r有关,但我找不到其他可以用的替代方法,或者可能是我写的write语句不对。

抱歉说了这么多,我只是想解释一下我的思路。谢谢你的帮助!

5 个回答

0

你最开始的尝试是想用 % 操作符来处理 target.write() 的返回值,但这个返回值是 None,也就是没有值。你需要把 % 放在 () 里面,跟 target.write 一起使用:

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

另外一种解决方案是:

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

编辑

在最后加了一个空字符串,以强制添加第三个换行符(否则只会有两个换行符)。

1

% 插值操作符是用在字符串上的。你现在把它用在 target.write 的返回值上,但这个返回值其实什么都不返回(所以是 NoneType)。你应该直接在字符串上进行插值:

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

大多数学习 Python 的人第一次接触 % 时,都是在 print 语句的上下文中,所以很容易认为它和输出有很大关系,但实际上它的工作都是在字符串层面上进行的。

17

这个怎么样?

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

撰写回答