Imprimir sin nueva línea (imprimir 'a',) imprime un espacio, ¿cómo eliminarlo?

124

Tengo este codigo:

>>> for i in xrange(20):
...     print 'a',
... 
a a a a a a a a a a a a a a a a a a a a

Quiero dar salida 'a', sin ' 'esto:

aaaaaaaaaaaaaaaaaaaa

¿Es posible?

pythonFoo
fuente
44
Me sorprende que nadie haya mencionado aún "".join("a" for i in xrange(20)). (Es mucho más flexible que solo hacerlo "a" * 20, ya que supongo que es un ejemplo simplificado).
Thomas K

Respuestas:

131

Hay varias formas de lograr su resultado. Si solo desea una solución para su caso, use la multiplicación de cadenas como menciona @Ant . Esto solo funcionará si cada una de sus printdeclaraciones imprime la misma cadena. Tenga en cuenta que funciona para la multiplicación de cualquier cadena de longitud (por ejemplo, 'foo' * 20funciona).

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa

Si desea hacer esto en general, cree una cadena y luego imprímala una vez. Esto consumirá un poco de memoria para la cadena, pero solo hará una sola llamada a print. Tenga en cuenta que la concatenación de cadenas que utiliza +=ahora es lineal en el tamaño de la cadena que está concatenando, por lo que será rápido.

>>> for i in xrange(20):
...     s += 'a'
... 
>>> print s
aaaaaaaaaaaaaaaaaaaa

O puede hacerlo más directamente usando sys.stdout . write () , que printes una envoltura alrededor. Esto escribirá solo la cadena sin formato que le dé, sin ningún formato. Tenga en cuenta que no se imprime nueva línea incluso al final de los 20 as.

>>> import sys
>>> for i in xrange(20):
...     sys.stdout.write('a')
... 
aaaaaaaaaaaaaaaaaaaa>>> 

Python 3 cambia la printdeclaración en una función print () , que le permite establecer un endparámetro. Puede usarlo en> = 2.6 importando desde __future__. Sin embargo, evitaría esto en cualquier código serio 2.x, ya que será un poco confuso para aquellos que nunca han usado 3.x. Sin embargo, debería darle una idea de algunas de las bondades que trae 3.x.

>>> from __future__ import print_function
>>> for i in xrange(20):
...     print('a', end='')
... 
aaaaaaaaaaaaaaaaaaaa>>> 
moinudin
fuente
44
@AAI leyó la pregunta cuando estaba presente la respuesta de multiplicación de cadenas, y pensé que daría una visión general de varias opciones. Los otros vinieron mientras yo estaba preparando mi respuesta. Fue aceptado poco después, de lo contrario, probablemente lo habría eliminado.
moinudin
10
-1 No acumule cadenas por concatenación; es O (n ^ 2) en lugar de O (n). Usar en su "".join(...)lugar.
Katriel
10
No tengo ningún problema con su respuesta, resume todo y eso es bueno. Pero al hacer esto, desalienta a otras personas que responden. Hay muchas buenas respuestas y todas merecen +1. Imagínense si todos comenzaran a hacer resúmenes.
user225312
3
@katrielalex: ¿Importa? ¿El OP ha pedido optimización o complejidad? ¿Y será importante para 20 cuerdas? Vamos, en serio debes estar bromeando.
user225312
1
@katrielalex Incorrecto, la concatenación de cadenas que se usa +=en Python es una operación de tiempo constante para la concatenación de un solo carácter.
moinudin
119

Desde PEP 3105: imprimir como una función en el documento What's New in Python 2.6 :

>>> from __future__ import print_function
>>> print('a', end='')

Obviamente, eso solo funciona con python 3.0 o superior (o 2.6+ con un from __future__ import print_functional principio). La printdeclaración fue eliminada y se convirtió en la print()función por defecto en Python 3.0.

Antoine Pelisse
fuente
41

Puede suprimir el espacio imprimiendo una cadena vacía para stdout entre las printdeclaraciones.

>>> import sys
>>> for i in range(20):
...   print 'a',
...   sys.stdout.write('')
... 
aaaaaaaaaaaaaaaaaaaa

Sin embargo, una solución más limpia es construir primero la cadena completa que desea imprimir y luego generarla con una sola printdeclaración.

Pär Wieslander
fuente
44
@Soulseekah: Sí, usar solo sys.stdout.write()es más conveniente en este caso. Sin embargo, quería mostrar que escribir una cadena vacía en stdout suprime el espacio entre los elementos escritos usando print, lo que podría ser útil en situaciones similares.
Pär Wieslander
34

Puede imprimir un carácter de retroceso ( '\b'):

for i in xrange(20):
    print '\ba',

resultado:

aaaaaaaaaaaaaaaaaaaa
Lucas Moeskops
fuente
30

Python 3.x:

for i in range(20):
    print('a', end='')

Python 2.6 o 2.7:

from __future__ import print_function
for i in xrange(20):
    print('a', end='')
codeape
fuente
10

Si desea que aparezcan uno a la vez, puede hacer esto:

import time
import sys
for i in range(20):
    sys.stdout.write('a')
    sys.stdout.flush()
    time.sleep(0.5)

sys.stdout.flush() Es necesario forzar la escritura del carácter cada vez que se ejecuta el bucle.

daviewales
fuente
7

Solo como una nota al margen:

La impresión es O (1) pero la construcción de una cadena y luego la impresión es O (n), donde n es el número total de caracteres en la cadena. Entonces sí, mientras que construir la cadena es "más limpia", no es el método más eficiente para hacerlo.

La forma en que lo haría es la siguiente:

from sys import stdout
printf = stdout.write

Ahora tiene una "función de impresión" que imprime cualquier cadena que le dé sin devolver el nuevo carácter de línea cada vez.

printf("Hello,")
printf("World!")

La salida será: ¡Hola, mundo!

Sin embargo, si desea imprimir números enteros, flotantes u otros valores que no sean cadenas, deberá convertirlos en una cadena con la función str ().

printf(str(2) + " " + str(4))

La salida será: 2 4

Kyle Siopiolosz
fuente
¿Dices que puedo generar una cantidad infinita de texto al mismo tiempo que imprimo un carácter?
ctrl-alt-delor
Cuando redefiní printf en stdout.write, mi stdout.write parece estar imprimiendo el número de caracteres que la cadena es: "Hola, 6" ¿Qué da? ¿Que esta pasando? ¿Y cómo lo detengo?
Tom
1
Además, ¿puedes explicar qué quieres decir con O (1) O (n)? No entiendo a qué se refiere
Tom
@Tom Se refiere a la complejidad (notación Big O) como un reflejo de la costo de la operación. O (1) es tiempo constante, ideal , y O (n) es tiempo lineal, bueno, pero demasiado caro para algo tan simple. Aunque, para cosas pequeñas, el tiempo que pasa usando su cerebro para preocuparse por estas cosas es más inútil desde el punto de vista computacional que simplemente usar la concatenación de cadenas.
Benjamin R
6

O lo que dice Ant , o se acumula en una cadena, luego imprime una vez:

s = '';
for i in xrange(20):
    s += 'a'
print s
jensgram
fuente
6

¿sin que? Quieres decir

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa

?

Hormiga
fuente
3

esto es realmente simple

para las versiones de Python 3+ solo tienes que escribir los siguientes códigos

for i in range(20):
      print('a',end='')

solo convierta el bucle a los siguientes códigos, no tiene que preocuparse por otras cosas

Shad Munir
fuente
2

¡¡¡GUAU!!!

Es bastante mucho tiempo atrás

Ahora, en python 3.x será bastante fácil

código:

for i in range(20):
      print('a',end='') # here end variable will clarify what you want in 
                        # end of the code

salida:

aaaaaaaaaaaaaaaaaaaa 

Más información sobre la función print ()

print(value1,value2,value3,sep='-',end='\n',file=sys.stdout,flush=False)

Aquí :

value1,value2,value3

puedes imprimir múltiples valores usando comas

sep = '-'

3 valores estarán separados por el carácter '-'

puede usar cualquier carácter en lugar de esa cadena uniforme como sep = '@' o sep = 'good'

end='\n'

de forma predeterminada, la función de impresión coloca el carácter '\ n' al final de la salida

pero puede usar cualquier carácter o cadena cambiando el valor de la variable final

como end = '$' o end = '.' o end = 'Hola'

file=sys.stdout

este es un valor predeterminado, salida estándar del sistema

usando este argumento puede crear una secuencia de archivo de salida como

print("I am a Programmer", file=open("output.txt", "w"))

por este código va a crear un archivo llamado salida.txt donde su salida Soy un programador se almacenará

flush = False

Es un valor predeterminado que usa flush = True , puede eliminar el flujo a la fuerza

SHAH MD IMRAN HOSSAIN
fuente
2

Tan sencillo como eso

def printSleeping():
     sleep = "I'm sleeping"
     v = ""
     for i in sleep:
         v += i
         system('cls')
         print v
         time.sleep(0.02)
tlejmi
fuente