可能重复:
ASCII Python Art # 2
i = 10
while i>0:
print i*'*' + 2*(10-i)*' ' + i*'*'
i -=1
for x in range(1,11):
print x* '*' + 2*(10-x)*' '+ x*'*'
x +=1
我正在尝试用19行制作一个星号钻石。 我改为20。 这就是我想要的:
********************
********* *********
******** ********
******* *******
****** ******
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
****** ******
******* *******
******** ********
********* *********
********************
如何摆脱星号中间高度的倍增。
欢呼声。
答案 0 :(得分:2)
基本思想是决定哪个循环应该打印线,每一侧只有一个开头。然后修改其他循环不打印该行(即结束或以2星线开头)。
更改
for x in range(1,11):
到
for x in range(2,11):
此外,您可以摆脱最后一行,因为第二个循环会自行完成x
的所有递增。
为了便于阅读,我还要切换到一种循环。
例如,您可以使用编写第一个循环(注意:此循环将不运行x=1
大小写,因此您必须使用未修改的你的第二个循环的版本。)
for x in range(10, 1, -1):
print x* '*' + 2*(10-x)*' '+ x*'*'
答案 1 :(得分:2)
您已经研究过如何打印每一行。 现在最后一部分是生成正确的数字序列来驱动行打印。
l = range(10,1,-1)
l.extend(range(1,11))
for x in l:
print x*'*' + 2*(10-x)*' ' + x*'*'
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
********************
********* *********
******** ********
******* *******
****** ******
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
****** ******
******* *******
******** ********
********* *********
********************
答案 2 :(得分:2)
找到诀窍我遇到了一些困难:
def diamond(ni):
li = [ i*'*' + (2*(ni-i) - 1)*' ' + (i - i//ni)*'*'
for i in xrange(ni,0,-1)]
li.extend(i*'*' + (2*(ni-i) - 1)*' ' + (i - i//ni)*'*'
for i in range(2,ni+1))
return '\n'.join(li)
print diamond(7)
平
*************
****** ******
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
****** ******
*************
注意到
li.extend(i*'*' + (2*(ni-i) - 1)*' ' + (i - i//ni)*'*'
for i in range(2,ni+1))
与
相同(少于一行) li = [ i*'*' + (2*(ni-i) - 1)*' ' + (i - i//ni)*'*'
for i in xrange(ni,0,-1)]
但是按相反的顺序,我们可以简化:
def symetric_diamond(ni):
li = [i*'*' + (2*(ni-i) - 1)*' ' + (i - i//ni)*'*'
for i in xrange(ni,0,-1)]
li.extend(li[-2::-1])
return '\n'.join(li)
print '\n'.join(str(i) for i in xrange(500))
立即显示,因为程序计算字符串'\ n'.join(str(i)for i in xrange(500))之前一次打印它,而> p>
for i in xrange(500):
print str(i)
显示的时间要长得多,因为计算机一个接一个地打印500个字符串,每次调用打印很长
还有另一种打印钻石的方式,我现在就写下来。
def format_diamond(nl):
ni = (nl+1)/2
li = ['{:{fill}{align}{width}}'.format((2*(ni-x) - 1)*' ',fill='*',align='^',width=2*ni-1)
for x in xrange(ni,0,-1)]
li.extend(li[-2::-1])
return '\n'.join(li)
- >当 nl 为偶数时,所有这些函数都会给出 nl-1 行的菱形。
最后,我更喜欢的是:
def symetric_diamond(nl):
'''Returns a diamond of nl lines if nl is odd,
and nl-1 lines if nl is even'''
ni = (nl+1)//2
li = [ (2*ni-1) * '*' ]
li.extend(i*'*' + (2*(ni-i) - 1)*' ' +i*'*' for i in xrange(ni-1,0,-1))
li += reversed(li[0:-1]) # in-place extension
return '\n'.join(li)
因为就地扩展(有延伸和反转)而没有可怕的(i - i//ni)*'*'
答案 3 :(得分:1)
x = list(range(0, 20, 2))
x += reversed(x[:-1])
for _ in x:
stars, spaces = "*" * ((20 - _) / 2), " " * _
print stars + spaces + stars
答案 4 :(得分:0)
当您将代码翻倍时,可以将程序重写为
def line(x): print x* '*' + 2*(10-x)*' '+ x*'*'
i = 10
while i>0:
line(i)
i -=1
for x in range(1,11):
line(x)
# x +=1 # unnecessary - happens already due to the for loop
现在,您可以从两个循环中取出一个循环(再次删除该功能):
rg = list(range(10, 1, -1)) + list(range(1, 11))
for x in rg:
print x* '*' + 2*(10-x)*' '+ x*'*'