python - 任何人都知道一个简单的方法来编码这个问题?
问题描述
编写一个 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")
解决方案
打印逐渐减少然后增加的空间数量,然后增加,然后减少星星的数量:
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)*'*')
推荐阅读
- nginx - 如何允许图像但拒绝其他一切?
- javascript - 从函数中全局化变量
- javascript - 为什么我的代码没有正确复制选择项?
- javascript - 如何从 Date jQuery 中获取特定月份
- javascript - 如何缩放图标背景?
- python - 无法在 pygame.mixer 中打开任何声音文件
- string - 从 Go 中的字符串整数中获取整数切片?
- python-3.x - 您可以在 Google App Engine 的灵活环境中的处理程序元素的脚本设置中指定什么?
- r - 如何根据组获取数据框中变量的最大值行?
- installation - 无法在 Windows 上启动 Nsight Compute 命令行界面