La stampa senza newline (stampa 'a',) stampa uno spazio, come rimuovere?


124

Ho questo codice:

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

Voglio produrre 'a', senza in ' 'questo modo:

aaaaaaaaaaaaaaaaaaaa

È possibile?


4
Sono sorpreso che nessuno sia ancora menzionato "".join("a" for i in xrange(20)). (È molto più flessibile del semplice fare "a" * 20, dato che presumo sia un esempio semplificato).
Thomas K,

Risposte:


131

Esistono diversi modi per raggiungere il tuo risultato. Se stai solo cercando una soluzione per il tuo caso, usa la moltiplicazione di stringhe come menziona @Ant . Funzionerà solo se ciascuna delle tue printistruzioni stampa la stessa stringa. Si noti che funziona per la moltiplicazione di qualsiasi stringa di lunghezza (ad es. 'foo' * 20Opere).

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa

Se vuoi farlo in generale, crea una stringa e poi stampala una volta. Ciò consumerà un po 'di memoria per la stringa, ma effettuerà una sola chiamata a print. Nota che la concatenazione di stringhe utilizzando +=ora è lineare nella dimensione della stringa che stai concatenando, quindi sarà veloce.

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

Oppure puoi farlo più direttamente usando sys.stdout . write () , che printè un wrapper. Questo scriverà solo la stringa grezza che gli dai, senza alcuna formattazione. Si noti che nessuna riga nuova viene stampata anche alla fine degli 20 as.

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

Python 3 modifica l' printistruzione in una funzione print () , che consente di impostare un endparametro. Puoi usarlo in> = 2.6 importando da __future__. Eviterei questo in qualsiasi serio codice 2.x, poiché sarebbe un po 'confuso per coloro che non hanno mai usato 3.x. Tuttavia, dovrebbe darti un assaggio di alcuni dei benefici che 3.x porta.

>>> from __future__ import print_function
>>> for i in xrange(20):
...     print('a', end='')
... 
aaaaaaaaaaaaaaaaaaaa>>> 

4
@AAI ho letto la domanda quando era presente la risposta alla moltiplicazione delle stringhe e ho pensato di dare una panoramica di diverse opzioni. Gli altri sono venuti mentre stavo mettendo insieme la mia risposta. Fu accettato poco dopo, altrimenti l'avrei probabilmente cancellato.
Moinudin,

10
-1 Non creare stringhe per concatenazione; è O (n ^ 2) invece di O (n). Usa "".join(...)invece.
Katriel,

10
Non ho problemi con la tua risposta, riassume tutto e va bene. Ma facendo questo, scoraggi altre persone che rispondono. Ci sono molte buone risposte e tutte meritano +1. Immagina se tutti iniziassero a fare dei riassunti.
user225312

3
@katrielalex: importa? L'OP ha chiesto l'ottimizzazione o la complessità? E avrà importanza per 20 stringhe? Dai, stai seriamente scherzando.
user225312

1
@katrielalex Sbagliato, la concatenazione di stringhe utilizzando +=in Python è un'operazione a tempo costante per la concatenazione di un singolo carattere.
Moinudin,

119

Da PEP 3105: stampa come funzione nel documento Novità di Python 2.6 :

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

Ovviamente funziona solo con Python 3.0 o versioni successive (o 2.6+ con from __future__ import print_functiona all'inizio). L' printistruzione è stata rimossa ed è diventata la print()funzione per impostazione predefinita in Python 3.0.


41

È possibile sopprimere lo spazio stampando una stringa vuota da stdout tra le printistruzioni.

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

Tuttavia, una soluzione più pulita consiste nel creare prima l'intera stringa che si desidera stampare e quindi inviarla con una singola printistruzione.


4
@Soulseekah: Sì, utilizzare solo sys.stdout.write()è più conveniente in questo caso. Tuttavia, volevo mostrare che scrivere una stringa vuota su stdout sopprime lo spazio tra gli elementi scritti usando print, il che potrebbe essere utile in situazioni simili.
Pär Wieslander,

34

È possibile stampare un carattere backspace ( '\b'):

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

risultato:

aaaaaaaaaaaaaaaaaaaa

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

10

Se vuoi che vengano visualizzati uno alla volta, puoi farlo:

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

sys.stdout.flush() è necessario per forzare la scrittura del personaggio ogni volta che il ciclo viene eseguito.


7

Proprio come una nota a margine:

La stampa è O (1) ma la costruzione di una stringa e quindi la stampa è O (n), dove n è il numero totale di caratteri nella stringa. Quindi sì, mentre la creazione della stringa è "più pulita", non è il metodo più efficiente per farlo.

Il modo in cui lo farei è il seguente:

from sys import stdout
printf = stdout.write

Ora hai una "funzione di stampa" che stampa qualsiasi stringa che le dai senza restituire ogni volta il carattere di nuova riga.

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

L'output sarà: Ciao, mondo!

Tuttavia, se si desidera stampare numeri interi, float o altri valori non stringa, è necessario convertirli in una stringa con la funzione str ().

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

L'output sarà: 2 4


Dici che posso produrre una quantità infinita di testo contemporaneamente a emettere un carattere?
ctrl-alt-delor

Quando ho ridefinito printf in stdout.write, il mio stdout.write sembra stampare il numero di caratteri grafici che la stringa è: "Ciao, 6" Cosa dà? Cosa sta succedendo? E come posso fermarlo?
Tom,

1
Inoltre, puoi spiegare cosa intendi con O (1) O (n)? Non capisco a cosa si riferisca
Tom

@ Tom Si riferisce alla complessità (notazione Big O) come riflesso del costo dell'operazione. O (1) è tempo costante - ideale - e O (n) è tempo lineare - va bene ma è troppo costoso per qualcosa di così semplice. Sebbene, per le piccole cose, il tempo che passi usando il cervello per preoccuparti di queste cose sia più dispendioso dal punto di vista computazionale rispetto al semplice utilizzo della concatenazione di stringhe.
Benjamin R,

6

O quello che dice Ant o si accumulano in una stringa, quindi stampano una volta:

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

6

senza cosa? vuoi dire

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa

?


3

questo è davvero semplice

per le versioni di python 3+ devi solo scrivere i seguenti codici

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

converti il ​​loop nei seguenti codici, non devi preoccuparti di altre cose


2

WOW!!!

È passato molto tempo fa

Ora, in Python 3.x sarà abbastanza semplice

codice:

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

produzione:

aaaaaaaaaaaaaaaaaaaa 

Ulteriori informazioni sulla funzione print ()

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

Qui :

value1,value2,value3

puoi stampare più valori usando le virgole

sep = '-'

3 valori saranno separati dal carattere '-'

puoi usare qualsiasi carattere al posto di quella stringa pari come sep = '@' o sep = 'buono'

end='\n'

per impostazione predefinita, la funzione di stampa mette il carattere '\ n' alla fine dell'output

ma puoi usare qualsiasi carattere o stringa modificando il valore di fine variale

come end = '$' o end = '.' o end = 'Ciao'

file=sys.stdout

questo è un valore predefinito, output standard di sistema

usando questo argomento è possibile creare un flusso di file di output come

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

con questo codice creerai un file chiamato output.txt dove sarà memorizzato il tuo output I am a Programmer

flush = False

È un valore predefinito che utilizza flush = True per forzare lo svuotamento del flusso


2

così semplice

def printSleeping():
     sleep = "I'm sleeping"
     v = ""
     for i in sleep:
         v += i
         system('cls')
         print v
         time.sleep(0.02)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.