Python3: 生成带星星的图案,必须使用二维列表

Python3: Produce a patern with stars and must use a 2 dimensional list

Python3.6: 我有一个作业需要生成一个带有星号的模式并且必须使用二维列表。

第一部分只是使用 print() 进行连接。 def 角():

"""This function will display a Stars in the top left
   and bottom right corners"""
a4 = '****'
a3 = '***'
a2 = '**'
a1 = '*'
s3 = '   '
s4 = '    '
s5 = '     '
print(a4 + s3)
print(a3 + s4)
print(a2 + s5)
print(a1 + s5 + a1)
print(s5 + a2)
print(s4 + a3)
print(s3 + a4)

角球()

(显示的图像是这样的)

****   
***    
**     
*     *
     **
    ***
   ****

现在,第二部分是做同样的事情,但使用二维列表和循环。我试过了,但我被卡住了。该作业共有 5 个不同的伙伴。如果有人愿意提供一些助手来找出其中一个,那么其他 4 个应该更容易。 谢谢

让我们从与您的原始静态解决方案相匹配的具体案例开始。假设用户输入是 7。您的任务是打印 7 行。每行由 7 个字符组成:

  • 4 星,3 个空格,无星
  • 3 星,4 个空格,无星
  • 2 星,5 个空格,无星
  • 1 星,5 个空格,1 星
  • ...然后反过来也是一样。

因此,列表的第一个元素是 [4,3,0],然后是 [3,4,0],依此类推。

完整的二维列表将是 [[4,3,0], [3,4,0], ... etc]

调用您的列表 rows:

rows = [[4,3,0], [3,4,0], ... etc]

现在如果你这样做:

for (l_stars, spaces, r_stars) in rows:

第一次,l_stars 为 4,spaces 为 3,r_stars 为 0。在 for 循环中,打印适当数量的星号和空格:

for (l_stars, spaces, r_stars) in rows:
    print("*" * l_stars, " " * spaces, "*" * r_stars, sep="")

如果 l_stars 的值为 4,则 "*" * l_stars 将为 "****",依此类推。 print 语句中的 sep 是为了停止 print 在逗号所在的位置放置额外的空格。

现在您看到了使用二维列表的价值。您的程序从 14 条语句减少到 3 条,并且模式更容易更改。如果程序要响应用户输入,则需要更改模式的能力。我必须说这对初学者来说是一项非常具有挑战性的任务。

在一般情况下,您的任务是打印 n 行。每行由n个字符组成:

  • n-3星,n-4个空格,无星
  • n-4星,n-3个空格,无星
  • n-5星,n-2个空格,无星
  • ...等等
  • 1 星,n-2 个空格,1 星
  • ...然后反过来也是一样。

要打印的行数是可变的:您需要 n 行。一种方法是使用 列表理解 。如果用户的输入是 n,那将类似于

rows = [ [...something...] for i in range(n) ]

这里棘手的部分是你的模式在中间是不变的:

*     *      

所以rows由左上角、中部、右下角3部分组成,并从中间向上和向下增长或收缩。因此,您必须将其构建为 3 个部分。如果 n 是偶数,您的描述并不清楚您想要发生什么。在这种情况下,我假设您需要同一中间行的两个副本。

try:
    n = int(input("Enter size of pattern:"))
except:
    print("Invalid input, using 7")
    n = 7

top_left = [[n-i, i, 0] for i in range (3,n-1)]
middle = [[1,n-2,1]]
if not n % 2:   # n is even, need two copies
    middle *= 2
bottom_right = [[0, i, n-i] for i in range (n-2,2,-1)]

rows = top_left + middle + bottom_right

for (l_stars, spaces, r_stars) in rows:
        print("*" * l_stars, " " * spaces, "*" * r_stars, sep="")

我会留给您对所需的输入进行任何范围检查。