2011-09-05 25 views
5

¡Me gustaría producir esta imagen en python!Arte de asterisco en python

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

entré en esto:

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

que por desgracia parece producir algo compuesto por el número correcto de puntos como la imagen de arriba, pero cada uno de esos asteriscos puntos están separados por separados el uno del otro , en lugar de derecho justificado como un todo.

¿Alguien tiene una mente inteligente sobre cómo puedo lograr lo que quiero?

+8

¿qué pasa con Obelix? – Tsar

+3

3 ediciones han corregido Asterix-> Asterisk =) – Tsar

Respuesta

13
'%10s' %'*'*x 

está siendo analizada como

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

porque los % y * operadores tienen la misma precedencia y el grupo de izquierda a derecha [docs]. Es necesario agregar paréntesis, así:

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

Si quieren colocar a través de un rango de números, se considera más idiomática utilizar un bucle for que un bucle while. De esta manera:

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

for x in range(0, 10) es equivalente a for(int x = 0; x < 10; x++) en Java o C

+0

¡Excelente! Walla! ¡Qué buena respuesta! ¡Muchas gracias, funciona a la perfección! - Esta es la primera respuesta que veo, así que estoy comentando para agradecerte, pero por supuesto muchas gracias a todos los demás. Mi más profundo agradecimiento, por supuesto! – Azz

+0

Creo que te refieres a "Voila!", En francés significa "¡Ahí está!", "¡Presto!", O "¡Woot, perrito!" – PaulMcG

+0

http://en.wikipedia.org/wiki/Wallah_(Árabe) –

8

objeto de cadena tiene rjust y métodos para ljust precisamente esta cosa.

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

o, alternativamente:

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

Mi segundo ejemplo utiliza un carácter de espacio como el carácter imprimible, y * como el carácter de relleno.

El argumento para ljust o rjust es el ancho del terminal. A menudo los utilizo para separar secciones con encabezados cuando tiene una impresión de depuración de conversación, p. print '--Spam!'.ljust(80, '-').

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

Es debido a la prioridad de los operadores, utilice la siguiente:

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

Para ser exactos, ya que su imagen termina con 10 asteriscos, lo que necesita.

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