我是一个新手程序员,最近我们的任务是打印一个完整的星号金字塔,根据输入的行数,然后打印这些金字塔的金字塔。
当用户输入Number of Rows: 4
时,我期望的输出基本上是:
*
***
*****
*******
* * *
*** *** ***
***** ***** *****
*******************
* * * * *
*** *** *** *** ***
***** ***** ***** ***** *****
*******************************
* * * * * * *
*** *** *** *** *** *** ***
***** ***** ***** ***** ***** ***** *****
*******************************************
这是我使用循环所能做的最好的。
rowInput = int(input("Number of Rows: "))
rowCount = 0
min = rowInput
max = rowInput
while (rowCount < rowInput):
digit = 1
while (digit < min):
print(end=" ")
digit += 1
while (digit >= min and digit <= max):
print(end="*")
digit += 1
print()
min -= 1
max += 1
rowCount += 1
输入:
Number of Rows: 4
输出:
*
***
*****
*******
我认为它可以与顶部的另一个循环工作,但我想不出一个可行的方法来增加两个三角形之间的空间。还有其他选择吗?
您可以使用嵌套的列表推导来构建要打印的行列表,但这有点复杂。
rows = 4
lines = [" "*(rows-r//2-1)*(2*rows-1) + f"{'*'*i:^{2*rows-1}}"*r
for r in range(1,2*rows+1,2)
for i in range(1,2*rows+1,2)]
print(*lines,sep='n')
*
***
*****
*******
* * *
*** *** ***
***** ***** *****
*********************
* * * * *
*** *** *** *** ***
***** ***** ***** ***** *****
***********************************
* * * * * * *
*** *** *** *** *** *** ***
***** ***** ***** ***** ***** ***** *****
*************************************************
为了更容易理解代码,For循环可能更好:
rows = 4
width = 2*rows-1 # width of one pyramid
for r in range(1,rows+1): # row with r pyramids
indent = " "*(rows-r)*width # indent pyramids
for p in range(rows): # pyramid lines
fill = "*"*(2*p+1) # filled width/stars for line
print(indent+(2*r-1)*f"{fill:^{width}}") # repeated pyramid stars
解决这个问题的另一个好方法是将问题分解成更小的部分,然后在单独的函数中实现。将执行小任务的功能组合起来,可以更容易地实现和测试您的解决方案:
# produce lines for one pyramid
def pyramid(n):
return [f"{'*'*r:^{2*n-1}}" for r in range(1,2*n+1,2)]
# combine pyramids horizontally
def pyramidRow(count,n):
return [count*line for line in pyramid(n)]
width = 2*rows-1 # width of one pyramid
for r in range(1,rows+1): # row of r pyramids
indent = " "*width*(rows-r) # indent pyramids
for line in pyramidRow(2*r-1,rows): # print repeated pyramids
print(indent+line)
测试:
for line in pyramid(4): print(line)
*
***
*****
*******
for line in pyramidRow(3,4): print(line)
* * *
*** *** ***
***** ***** *****
*********************