L'impression sans nouvelle ligne (imprimer 'a',) imprime un espace, comment supprimer?


124

J'ai ce code:

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

Je veux sortir 'a', sans ' 'comme ça:

aaaaaaaaaaaaaaaaaaaa

C'est possible?


4
Je suis surpris que personne n'en ait encore parlé "".join("a" for i in xrange(20)). (C'est beaucoup plus flexible que de simplement faire "a" * 20, car je suppose que c'est un exemple simplifié).
Thomas K

Réponses:


131

Il existe plusieurs façons d'atteindre votre résultat. Si vous souhaitez simplement une solution pour votre cas, utilisez la multiplication de chaînes comme le mentionne @Ant . Cela ne fonctionnera que si chacune de vos printinstructions imprime la même chaîne. Notez que cela fonctionne pour la multiplication de toute chaîne de longueur (par exemple, 'foo' * 20fonctionne).

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa

Si vous voulez faire cela en général, créez une chaîne et imprimez-la une fois. Cela consommera un peu de mémoire pour la chaîne, mais ne fera qu'un seul appel à print. Notez que la concaténation de chaînes en utilisant +=est maintenant linéaire dans la taille de la chaîne que vous concaténez donc ce sera rapide.

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

Ou vous pouvez le faire plus directement en utilisant sys.stdout . write () , qui printest un wrapper autour. Cela n'écrira que la chaîne brute que vous lui donnez, sans aucun formatage. Notez qu'aucune nouvelle ligne n'est imprimée même à la fin des 20 as.

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

Python 3 transforme l' printinstruction en une fonction print () , qui vous permet de définir un endparamètre. Vous pouvez l'utiliser dans> = 2.6 en important depuis__future__ . J'éviterais cela dans tout code 2.x sérieux, car ce sera un peu déroutant pour ceux qui n'ont jamais utilisé 3.x. Cependant, cela devrait vous donner un avant-goût de certains des bienfaits que la 3.x apporte.

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

4
@AAI a lu la question lorsque la réponse de multiplication de chaînes était présente et j'ai pensé que je donnerais un aperçu de plusieurs options. Les autres sont venus pendant que je préparais ma réponse. Il a été accepté peu de temps après, sinon je l'aurais probablement supprimé.
moinudin

10
-1 Ne construisez pas de chaînes par concaténation; c'est O (n ^ 2) au lieu de O (n). Utilisez "".join(...)plutôt.
Katriel

10
Je n'ai aucun problème avec votre réponse, elle résume tout et c'est bien. Mais en faisant cela, vous découragez les autres personnes qui répondent. Il y a beaucoup de bonnes réponses et toutes méritent +1. Imaginez si tout le monde a commencé à faire des résumés.
user225312

3
@katrielalex: Est-ce important? Le PO a-t-il demandé une optimisation ou une complexité? Et cela importera-t-il pour 20 cordes? Allez, tu dois sérieusement plaisanter.
user225312

1
@katrielalex Mauvaise, la concaténation de chaînes +=en Python est une opération à temps constant pour la concaténation d'un seul caractère.
moinudin


41

Vous pouvez supprimer l'espace en imprimant une chaîne vide vers stdout entre les printinstructions.

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

Cependant, une solution plus propre consiste d'abord à créer la chaîne entière que vous souhaitez imprimer, puis à la sortir avec une seule printinstruction.


4
@Soulseekah: Oui, utiliser uniquement sys.stdout.write()est plus pratique dans ce cas. Cependant, je voulais montrer que l'écriture d'une chaîne vide dans stdout supprime l'espace entre les éléments écrits en utilisant print, ce qui pourrait être utile dans des situations similaires.
Pär Wieslander

34

Vous pouvez imprimer un caractère de retour arrière ( '\b'):

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

résultat:

aaaaaaaaaaaaaaaaaaaa

30

Python 3.x:

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

Python 2.6 ou 2.7:

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

10

Si vous souhaitez qu'ils s'affichent un par un, vous pouvez le faire:

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

sys.stdout.flush() est nécessaire pour forcer l'écriture du caractère à chaque exécution de la boucle.


7

Juste comme note latérale:

L'impression est O (1) mais la construction d'une chaîne, puis l'impression est O (n), où n est le nombre total de caractères dans la chaîne. Donc oui, bien que la construction de la chaîne soit "plus propre", ce n'est pas la méthode la plus efficace pour le faire.

La façon dont je le ferais est la suivante:

from sys import stdout
printf = stdout.write

Maintenant, vous avez une "fonction d'impression" qui imprime toute chaîne que vous lui donnez sans retourner le caractère de nouvelle ligne à chaque fois.

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

Le résultat sera: Hello, World!

Cependant, si vous souhaitez imprimer des entiers, des flottants ou d'autres valeurs non-chaîne, vous devrez les convertir en chaîne avec la fonction str ().

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

La sortie sera: 2 4


Dites-vous que je peux produire une quantité infinie de texte en même temps que la sortie d'un caractère?
ctrl-alt-delor

Quand j'ai redéfini printf en stdout.write, mon stdout.write semble imprimer le nombre de caractères de la chaîne: "Hello, 6" Qu'est-ce qui donne? Que se passe-t-il? Et comment puis-je l'arrêter?
Tom

1
Pouvez-vous également expliquer ce que vous entendez par O (1) O (n)? Je ne comprends pas à quoi cela fait référence
Tom

@Tom Il fait référence à la complexité (notation Big O) comme un reflet du coût de l'opération. O (1) est le temps constant - idéal - et O (n) est le temps linéaire - d' accord mais bien trop cher pour quelque chose d'aussi simple. Bien que, pour les petites choses, le temps que vous passez à utiliser votre cerveau pour vous soucier de ces choses est plus coûteux en calcul que la simple concaténation de chaînes.
Benjamin R

6

Soit ce que dit Ant , soit accumulé dans une chaîne, puis imprimez une fois:

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

6

sans quoi? tu veux dire

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa

?


3

c'est vraiment simple

pour les versions de python 3+, il vous suffit d'écrire les codes suivants

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

convertissez simplement la boucle dans les codes suivants, vous n'avez pas à vous soucier d'autres choses


2

SENSATIONNEL!!!

C'est joli longtemps il y a

Maintenant en python 3.x, ce sera assez facile

code:

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

production:

aaaaaaaaaaaaaaaaaaaa 

En savoir plus sur la fonction print ()

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

Ici :

value1,value2,value3

vous pouvez imprimer plusieurs valeurs en utilisant des virgules

sep = '-'

3 valeurs seront séparées par le caractère '-'

vous pouvez utiliser n'importe quel caractère au lieu de cette chaîne paire comme sep = '@' ou sep = 'good'

end='\n'

par défaut la fonction d'impression place le caractère '\ n' à la fin de la sortie

mais vous pouvez utiliser n'importe quel caractère ou chaîne en changeant la valeur de fin variale

comme end = '$' ou end = '.' ou end = 'Bonjour'

file=sys.stdout

il s'agit d'une valeur par défaut, sortie standard du système

en utilisant cet argument, vous pouvez créer un flux de fichier de sortie comme

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

par ce code vous créerez un fichier nommé output.txt où votre sortie Je suis un programmeur sera stockée

flush = False

C'est une valeur par défaut en utilisant flush = True, vous pouvez vider de force le flux


2

aussi simple que cela

def printSleeping():
     sleep = "I'm sleeping"
     v = ""
     for i in sleep:
         v += i
         system('cls')
         print v
         time.sleep(0.02)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.