《艰难学Python:第16章额外学分》
我在额外加分的第三个问题上卡住了。问题中的代码是这样的:
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 个回答
你最开始的尝试是想用 %
操作符来处理 target.write()
的返回值,但这个返回值是 None,也就是没有值。你需要把 %
放在 ()
里面,跟 target.write
一起使用:
target.write ( "%s\n%s\n%s\n" % (line1, line2, line3))
另外一种解决方案是:
target.write('\n'.join([line1, line2, line3, '']))
编辑
在最后加了一个空字符串,以强制添加第三个换行符(否则只会有两个换行符)。
% 插值操作符是用在字符串上的。你现在把它用在 target.write 的返回值上,但这个返回值其实什么都不返回(所以是 NoneType)。你应该直接在字符串上进行插值:
target.write("%s\n%s\n%s\n" % (line1, line2, line3) )
大多数学习 Python 的人第一次接触 % 时,都是在 print 语句的上下文中,所以很容易认为它和输出有很大关系,但实际上它的工作都是在字符串层面上进行的。
这个怎么样?
target.write("%s\n%s\n%s\n" % (line1, line2, line3))