python - Python 练习:使用重复和连接
问题描述
我对 Python 和一般编程非常陌生,并且一直在思考一本名为“Think Python”的书中所谓的简单练习,并希望在更好地理解和解决这个问题方面得到一些帮助。如果这被认为太“简单”或离题,我提前道歉,但我不确定如何进一步研究这个具体例子。
编写一个名为 right_justify 的函数,它接受一个名为 s 的字符串作为参数,并以足够的前导空格打印该字符串,以便该字符串的最后一个字母在显示的第 70 列中。
right_justify('monty')
提示:使用字符串连接和重复。此外,Python 提供了一个名为 len 的内置函数,它返回字符串的长度,因此 len('monty') 的值为 5。
我在这里找到了这个特定练习的答案,但在找到该解决方案之前,我尝试了自己的解决方案,并希望从不同的解决方案中学习,即使它更加冗长。
起初,我认为这似乎很简单;我只需要使用提示的 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. 提供的其他非常优雅的解决方案。
解决方案
如果您觉得懒惰,可以使用右对齐格式字符串:
def right_justify(s):
return "{:>70}".format(s)
推荐阅读
- sql - SQL - 如何在特定列中选择具有最大值的数据行?[版本 2]
- terminal - MicroBlaze:应用程序烧录后如何通过 JTAG 链接查看应用程序消息
- docker - Dokku:没有看到集装箱港口
- android - 为什么 setEnabled(false) 没有停用按钮
- java - Java Docusign 身份验证
- javascript - Node.js——如何以最快的方式获取 Google Drive API 的内容
- django - 如何解决“NoneType”对象不可下标
- azure-devops - 我们可以使用代理池“Hosted VS2017”将文件从构建服务器的 $(System.DefaultWorkingDirectory) 复制到 Azure Iaas 服务器吗
- computer-vision - 在图像上映射直方图
- testing - 如何检查线程组在jmeter中停止执行