Искусство звездочки в python

Я хотел бы создать эту картину в python!

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

Я поступил так:

x=1
while x<10:
 print '%10s'    %'*'*x
 x=x+1

который, к сожалению, производит что-то, состоящее из правильного числа точек, как показано на рисунке выше, но каждая из этих точечных звездочек отделена друг от друга расстоянием, а не оправданным правом в целом.

у кого-нибудь есть умный ум о том, как я могу достичь того, что я хочу?

5 ответов


 '%10s'    %'*'*x

анализируется как

('%10s' % '*') * x

потому что % и * операторы имеют одинаковый приоритет и группируются слева направо[docs]. Вам нужно добавить круглые скобки, например:

x = 1
while x < 10:
    print '%10s' % ('*' * x)
    x = x + 1

если вы хотите перебирать ряд чисел, считается более идиоматичным использовать for цикл, чем цикл while. Вот так:

for x in range(1, 10):
    print '%10s' % ('*' * x)

for x in range(0, 10) эквивалентно for(int x = 0; x < 10; x++) в Java или C.


объект string имеет rjust и ljust методы именно для этой вещи.

>>> n = 10
>>> for i in xrange(1,n+1):
...   print (i*'*').rjust(n)
... 
         *
        **
       ***
      ****
     *****
    ******
   *******
  ********
 *********
**********

или же:

>>> for i in reversed(xrange(n)):
...   print (i*' ').ljust(n, '*')
... 
         *
        **
       ***
      ****
     *****
    ******
   *******
  ********
 *********
**********

мой второй пример использует символ пробела в качестве символа для печати и * в качестве символа заполнения.

аргумент ljust или rjust - ширина терминала. Я часто использую их для разделения разделов с заголовками, когда у вас есть распечатка отладки chatty, например print '--Spam!'.ljust(80, '-').


Это из-за приоритета операторов, используйте этот:

x=1
while x<10:
 print '%10s' % ('*'*x)
 x=x+1

print '\n'.join(' ' * (10 - i) + '*' * i for i in range(10))

чтобы быть точным, как ваша картина заканчивается 10 звездочек, вам необходимо.

for i in range(1, 11):
    print "%10s"%('*' *i)