钻石蟒蛇正好有19条线

时间:2011-10-05 07:13:14

标签: python

  

可能重复:
  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。 这就是我想要的:

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

如何摆脱星号中间高度的倍增。

欢呼声。

5 个答案:

答案 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*'*'
相关问题