一种方法
最简单的方法可能是有两个循环;一个i
向上计数width
,另一个i
向下计数1
。
width = int(input("Width: "))
i = 1
while i < width:
print " " * (width-i) + "* " * i
i += 1
while i > 0:
print " " * (width-i) + "* " * i
i -= 1
这有点不吸引人,因为它有点笨拙,但它很简单。
另一种方法
另一种方法是有一个循环计算为宽度的两倍,做两件事之一。它的作用取决于是否i
通过了最大宽度点。所以它在同一个循环中“向上”和“向下”,i
从1
向上计数到width*2
。
width = int(input("Width: "))
i = 1
while i < width*2:
if i < width:
print " " * (width-i) + "* " * i
else:
print " " * (i-width) + "* " * (2*width-i)
i += 1
这个:
print " " * (width-i) + "* " * i
...是你的代码。空格从width
下到上0
,*
从1
上到上width
。
和这个:
print " " * (i-width) + "* " * (2*width-i)
...是同一件事,但倒置了。空格从0
back up to 开始计数width
,而*
's go back down 从width
to开始计数1
。这在i
超过时起作用width
。
Width: 4
* # first half does this onward
* *
* * *
* * * *
* * * # second half does the rest downward
* *
*
还有一个
另一种更复杂的替代方法是在包含向上和向下计数的数字的列表上使用 for 循环。例如:[1, 2, 3, 2, 1]
要制作此列表,此代码必须是。我知道,这有点难看:
rows = []
for i in range(1, max+1):
rows.append(i)
rows += rows[-2::-1]
然后,你看,我们运行 for 循环。
width = int(input("Width: "))
rows = []
for i in range(1, width+1):
rows.append(i)
rows += rows[-2::-1] # takes a reversed list and adds it on to the end: [1, 2, 3, 2, 1]
for i in rows:
print " " * (width-i) + "* " * i
i
遍历rows
列表中的每个数字,看起来像[1, 2, 3, 2, 1]
. 然后我们只需要一个打印小工具。
在 python 中,几乎总是有一种更短且更难理解的 for 循环方式,在这种情况下,我们可以通过缩短第一个 for 循环来去掉两行额外的代码:
width = int(input("Width: "))
rows = [ i for i in range(1, width+1)] # Brain-bending way of doing a for loop
rows += rows[-2::-1]
for i in rows:
print " " * (width-i) + "* " * i
如果你觉得有点疯狂,这里只是整件事的两行版本!
width = int(input("Width: "))
print "\n".join([ " "*(width-i) + "* "*i for i in [ i for i in range(1, width+1) ]+[ i for i in range(1, width+1) ][-2::-1] ])
但我一般不推荐这种编码风格。
抱歉,最后我有点走神了……但我现在能对你说的最好的事情就是尝试一切,尽情玩耍!
希望有帮助。:)