【发布时间】:2020-06-13 03:56:43
【问题描述】:
我对 Python 和一般编程非常陌生,并且一直在思考一本名为“Think Python”的书中所谓的简单练习,并希望得到一些帮助以更好地理解和解决这个问题。如果这被认为太“简单”或离题,我提前道歉,但我不确定如何进一步研究这个具体示例。
编写一个名为 right_justify 的函数,它接受一个名为 s 的字符串作为参数,并打印带有足够前导空格的字符串,以便 字符串的最后一个字母在显示的第 70 列中。
right_justify('monty')
提示:使用字符串连接和重复。此外,Python 提供了一个 名为 len 的内置函数返回字符串的长度,因此 len('monty') 的值为 5。
我已经找到了这个具体练习的答案here,但在我找到这个解决方案之前,我尝试了一个自己的解决方案,并希望从不同的解决方案中学习,尽管它更加冗长。
起初,我认为这似乎很简单;我只需要使用提示的 len 函数获取参数的长度,然后将 70 除以该长度,然后简单地使用字符串重复和该除法结果进行打印。但是,我很快意识到这不适用于除法不是整数而是浮点数的长度的参数。于是我想出了一个主意:
def right_justify(s):
length = len(s)
HP = int(70/length)
#HP = Highest possible integer you can multiply with len(s) before exceeding total length of 70 , since int() will truncate a floating point result
remainder = 70 - HP*length
x = ' ', 'x', 'xx', 'xxx', 'x'*4, 'x'*5, 'x'*6, 'x'*7, 'x'*8, 'x'*9
remainder = len(x)
print(s*(HP-1)+x+s)
我在这里尝试做的是,首先我通过重复填充整行,同时为输入的最后一次迭代以及剩余长度(如果有)留出空间。为了确保最后一个字母是参数的最后一个字母,我首先将余数连接到 s*(HP-1),然后加入 s 的最后一次重复。
我已经看到我的代码存在问题,但我不知道如何解决它。首先是余数:如何编写程序,使 x 具有可变长度,并确保长度等于余数的 x 始终在最终的 print 语句中?
另外,当我尝试运行程序时,我收到一条错误消息:
Traceback (most recent call last):
File "<pyshell#25>", line 1, in <module>
right_justify('test')
File "<pyshell#24>", line 8, in right_justify
print(s*(HP-1)+x+s)
TypeError: can only concatenate str (not "tuple") to str
我尝试用谷歌搜索 TypeError,但答案太具体或太高级,以至于我无法从他们那里获得任何理解。我希望有人可以帮助我理解解决这个问题所涉及的概念以及如何执行它们。谢谢!
编辑:感谢大家提供的所有信息丰富的答案!我很欣赏给出的所有不同的解决方案,有很多东西可以向他们学习。我决定选择 Pepi 的答案,因为他在我最初的思路中使用元组指导了解决这个问题的方法。
这是我使用我新发现的元组和索引知识来解决这个问题所写的:
def right_justify(s):
length = len(s)
HP = int(70/length)
#HP = Highest possible integer you can multiply with len(s) before exceeding total length of 70 , since int() will truncate a floating point result
remainder = 70 - HP*length
x = '', 'x', 'xx', 'xxx', 'x'*4, 'x'*5, 'x'*6, 'x'*7, 'x'*8, 'x'*9
y = x[remainder]
print(s*(HP-1)+y+s)
感谢 Jack Taylor 和 Alain T. 提供的其他非常优雅的解决方案。
【问题讨论】:
-
嗨!欢迎来到堆栈溢出!实际上有一个模运算符可以用来查找余数“%”,例如 8%3 将是 2,因为余数是 2。至于您的错误,请注意您的“x”变量定义为一个包含 10 个不同值的元组,“”是第一个,“x”*9 是最后一个。您不能将字符串 s 与 x 组合,因为 x 不是字符串(而是元组)。如果您打算获得 x 的特定值,则需要通过索引来访问它。如果我所说的令人困惑,请随时提出更多问题:)
-
@Arch2K 感谢模运算符提示,我不知道!我将阅读更多关于索引和元组以及如何将这两者连接在一起的内容。
标签: python