首页 > 解决方案 > 任何人都知道一个简单的方法来编码这个问题?

问题描述

编写一个 Python 程序,打印带有星号的钻石,其中钻石的高度(行数)由变量 height 的值确定。您可以(可选)要求用户输入 height 的值。

该值只能有奇数行,因此如果用户输入偶数值,您应该打印一条描述性消息。

这就是我所拥有的,但我不明白这个......有人知道解决这个任务的更简单方法吗?

import math as m

height = int(input("Enter height - odd number: "))

if ((height > 2) and (height % 2 == 1)):
    
    a = list(range(1, m.floor(height/2) + 1))
    a.append(m.ceil(height/2))
    a = a + list(reversed(list(range(1, m.floor(height/2) + 1))))
    
    for h in a:
        repeat = 2*h-1
        ast = "*"*repeat
        blank = int((height - repeat) /2)
        blk = " "*blank
        print(str(blk) + str(ast) + str(blk))
        
else:
    print("The height must be a positve odd value")

标签: pythonloops

解决方案


打印逐渐减少然后增加的空间数量,然后增加,然后减少星星的数量:

height = 7

for i in range(1-height,height,2):
    print(abs(i)//2*" " + "*"*(height-abs(i)))

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

i from 的进展range(1-height,height,2)将是:

-6 -4 -2 0 2 4 6

如果你取 i 的绝对值,它会减少然后增加abs(i)

6 4 2 0 2 4 6

此范围进展可以转换为每行的空格数和星号数:

spaces: abs(i)//2     = 3 2 1 0 1 2 3
stars:  height-abs(i) = 1 3 5 7 5 3 1

垂直:

spaces  stars  |  result (underlines are spaces)
  3       1    |  ___*
  2       3    |  __***
  1       5    |  _*****
  0       7    |  *******
  1       5    |  _*****
  2       3    |  __***
  3       1    |  ___*

使用这些数字,您可以乘以相应的字符并获得模式所需的重复字符串。

请注意,它也适用于偶数,尽管形状在左侧和右侧没有那么尖

如果需要,可以将循环转换为单行中的理解:

h = 7

print(*(i//2*' '+(h-i)*'*' for i in map(abs,range(1-h,h,2))),sep='\n')

或者

for i in map(abs,range(1-h,h,2)):print(i//2*' '+(h-i)*'*')

推荐阅读