钻石Python有整整19行

2024-10-01 11:35:30 发布

您现在位置:Python中文网/ 问答频道 /正文

Possible Duplicate:
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英镑。 这就是我想要的:

^{pr2}$

我怎样才能摆脱星宿星中间的双倍高度。在

干杯。在


Tags: infor高度asciirange星号printwhile
3条回答

其基本思想是决定哪个循环应该打印每边只有一个开始的行。然后修改其他循环以不打印该行(即以2星线结束或开始)。在

改变

for x in range(1,11):

^{pr2}$

另外,您可以去掉最后一行,因为第二个循环独立完成x的所有递增操作。在

为了可读性的缘故,我也只切换到一种循环。在

例如,您可以使用编写第一个循环(注意:这个循环将而不是运行x=1用例,因此您必须使用第二个循环的未修改的版本)。在

for x in range(10, 1, -1):
    print x* '*' + 2*(10-x)*' '+ x*'*'

我很难找到窍门:

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)

抽签

^{pr2}$

注意到了吗

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)),然后一次性打印它,而

for i in xrange(500):
    print str(i)

显示的时间要长得多,因为计算机一个接一个地打印500个字符串,每次调用print都很长

一。在

还有另一种方法来印钻石,我现在就写。在

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)*'*'

你已经学会了如何打印每一行。 现在最后一部分是生成正确的数字序列来驱动行打印。在

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]
********************
*********  *********
********    ********
*******      *******
******        ******
*****          *****
****            ****
***              ***
**                **
*                  *
**                **
***              ***
****            ****
*****          *****
******        ******
*******      *******
********    ********
*********  *********
********************

相关问题 更多 >