Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Asterisk art in python

I would like to produce this picture in python!

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

I entered this:

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

Which sadly seems to produce something composed of the right number of dots as the picture above, but each of those dot asterisks are separated by spaced apart from one another, rather than justified right as a whole.

Anybody have a clever mind on how I might achieve what I want?

like image 428
Azz Avatar asked Sep 05 '11 12:09

Azz


4 Answers

 '%10s'    %'*'*x

is being parsed as

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

because the % and * operators have the same precedence and group left-to-right[docs]. You need to add parentheses, like this:

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

If you want to loop through a range of numbers, it's considered more idiomatic to use a for loop than a while loop. Like this:

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

for x in range(0, 10) is equivalent to for(int x = 0; x < 10; x++) in Java or C.

like image 87
Jeremy Avatar answered Sep 24 '22 18:09

Jeremy


string object has rjust and ljust methods for precisely this thing.

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

or, alternatively:

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

My second example uses a space character as the printable character, and * as the fill character.

The argument to ljust or rjust is the terminal width. I often use these for separating sections with headings when you have chatty debug printout, e.g. print '--Spam!'.ljust(80, '-').

like image 26
wim Avatar answered Sep 21 '22 18:09

wim


It's because of the operator precedence, use this one:

x=1
while x<10:
 print '%10s' % ('*'*x)
 x=x+1
like image 34
Karoly Horvath Avatar answered Sep 21 '22 18:09

Karoly Horvath


print '\n'.join(' ' * (10 - i) + '*' * i for i in range(10))
like image 21
develerx Avatar answered Sep 24 '22 18:09

develerx