使用 for 循环将字符串风格化为 ASCII 艺术

Using for loop to stylize strings into ASCII art

我正在尝试获取此输出:

+-+-+-+-+-+-+
|P|Y|T|H|O|N|
+-+-+-+-+-+-+

是否可以在不在代码中添加新行的情况下获得该输出?

def art(name):
  for i in range(len(name[0]), len(name) + 1):
    head = "+" + i * "-+"
    middle = "|" + i * "{}|".format(name[0].upper())
    bottom = "+" + i * "-+"
  print(head + "\n" + middle + "\n" + bottom)

art("Python")

实际输出:

+-+-+-+-+-+-+
|P|P|P|P|P|P|
+-+-+-+-+-+-+

我不知道如何操作它才能让它工作。我尝试使用 index()i 作为变量,但出现如下错误:“IndexError: string index out of range”

headbottom 不需要在 for 循环中,因为它们会一次性计算出完整的字符串。就此而言,因为它们是相同的字符串,所以根本没有理由将它们作为两个单独的变量。

您的循环不需要遍历索引——它可以遍历字符,因此您可以自己直接添加这些字符;并且使用 f 弦有点过于复杂。

无论如何——如果你要使用循环,你应该加法构造你的字符串;只是在每次迭代时覆盖整个内容,根本没有必要使用循环。

def art(name):
  head = "+" + len(name) * "-+"
  middle = ''
  for character in name:
    middle += '|{}'.format(character.upper())
  print(head + "\n" + middle + "|\n" + head)

art("Python")

当您查找要打印的字符时,您硬编码了索引 0

def art(name):
  for i in range(len(name[0]), len(name) + 1):
    head = "+" + i * "-+"
    middle = "|" + i * "{}|".format(name[0].upper())
                                         ^-- here
    bottom = "+" + i * "-+"
  print(head + "\n" + middle + "\n" + bottom)

art("Python")

相反,您可以使用 i 来引用 name 中的实际字符:

middle = "|" + i * "{}|".format(name[i].upper())

您的 range 也有错误。没有必要使用 len(name[0]) - 这将永远是 1,并且会导致你的循环 运行 一次迭代比 name 的长度长(因为索引开始于0)。这就是你 IndexError.

的原因

相反,使用 0 作为开始 - 这与根本不提供开始参数相同:

for i in range(len(name)):

但您实际上并不需要索引;无需遍历 name 即可执行您想要的操作。您可以改为使用 | 作为分隔符连接 name 中的每个字母。 header/footer 可以通过重复 +-name 的长度相同的时间来创建。所以你的循环可以替换为:

print('+-' * len(name) + '+') 
print('|' + '|'.join(name.upper()) + '|')
print('+-' * len(name) + '+') 

.. 或分配给 headmiddlebottom(如果需要的话)。