Drucken ohne Zeilenumbruch ('a' drucken) druckt ein Leerzeichen. Wie wird es entfernt?

124

Ich habe diesen 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

Ich möchte ausgeben 'a', ohne ' 'wie folgt:

aaaaaaaaaaaaaaaaaaaa

Ist es möglich?

pythonFoo
quelle
4
Ich bin überrascht, dass noch niemand erwähnt hat "".join("a" for i in xrange(20)). (Es ist viel flexibler als nur zu tun "a" * 20, da ich davon ausgehe, dass es ein vereinfachtes Beispiel ist).
Thomas K

Antworten:

131

Es gibt verschiedene Möglichkeiten, um Ihr Ergebnis zu erzielen. Wenn Sie nur eine Lösung für Ihren Fall suchen , verwenden Sie die Zeichenfolgenmultiplikation als @ Ant- Erwähnungen. Dies funktioniert nur, wenn jede Ihrer printAnweisungen dieselbe Zeichenfolge druckt. Beachten Sie, dass es für die Multiplikation einer beliebigen Zeichenfolge 'foo' * 20funktioniert (z . B. funktioniert).

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa

Wenn Sie dies im Allgemeinen tun möchten, bauen Sie eine Zeichenfolge auf und drucken Sie sie einmal aus. Dies verbraucht etwas Speicherplatz für die Zeichenfolge, ruft jedoch nur einen einzigen Aufruf auf print. Beachten Sie, dass die Verkettung +=von Zeichenfolgen in der Größe der zu verkettenden Zeichenfolge jetzt linear ist, sodass dies schnell geht.

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

Oder Sie können es direkter mit sys.stdout tun . write () , die printeine Hülle um ist. Dadurch wird nur die von Ihnen angegebene Rohzeichenfolge ohne Formatierung geschrieben. Beachten Sie, dass auch am Ende der 20 as keine neue Zeile gedruckt wird .

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

Python 3 ändert die printAnweisung in eine print () - Funktion , mit der Sie einen endParameter festlegen können . Sie können es in> = 2.6 verwenden, indem Sie aus importieren __future__. Ich würde dies jedoch in jedem ernsthaften 2.x-Code vermeiden, da es für diejenigen, die 3.x noch nie verwendet haben, etwas verwirrend sein wird. Es sollte Ihnen jedoch einen Vorgeschmack auf einige der Vorteile geben, die 3.x mit sich bringt.

>>> from __future__ import print_function
>>> for i in xrange(20):
...     print('a', end='')
... 
aaaaaaaaaaaaaaaaaaaa>>> 
Moinudin
quelle
4
@AAI las die Frage, als die Antwort auf die Zeichenfolgenmultiplikation vorhanden war, und dachte, ich würde einen Überblick über verschiedene Optionen geben. Die anderen kamen, während ich meine Antwort zusammenstellte. Es wurde bald danach akzeptiert, sonst hätte ich es wahrscheinlich gelöscht.
Moinudin
10
-1 Bauen Sie keine Zeichenfolgen durch Verkettung auf. es ist O (n ^ 2) anstelle von O (n). Verwenden Sie "".join(...)stattdessen.
Katriel
10
Ich habe kein Problem mit Ihrer Antwort, sie fasst alles zusammen und das ist gut so. Auf diese Weise entmutigen Sie jedoch andere Personen, die antworten. Es gibt viele gute Antworten und alle verdienen +1. Stellen Sie sich vor, alle würden Zusammenfassungen erstellen.
user225312
3
@katrielalex: Ist das wichtig? Hat das OP nach Optimierung oder Komplexität gefragt? Und wird es für 20 Saiten wichtig sein? Komm schon, du musst ernsthaft scherzen.
user225312
1
@katrielalex Falsche, String-Verkettung mit +=in Python ist eine konstante Zeitoperation für die Verkettung eines einzelnen Zeichens.
Moinudin
119

Ab PEP 3105: Drucken als Funktion im Dokument Was ist neu in Python 2.6 :

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

Offensichtlich funktioniert das nur mit Python 3.0 oder höher (oder 2.6+ mit einem from __future__ import print_functionam Anfang). Die printAnweisung wurde entfernt und wurde print()standardmäßig zur Funktion in Python 3.0.

Antoine Pelisse
quelle
41

Sie können das Leerzeichen unterdrücken, indem Sie eine leere Zeichenfolge zwischen den printAnweisungen drucken .

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

Eine sauberere Lösung besteht jedoch darin, zuerst die gesamte Zeichenfolge zu erstellen, die Sie drucken möchten, und sie dann mit einer einzelnen printAnweisung auszugeben .

Pär Wieslander
quelle
4
@Soulseekah: Ja, nur zu verwenden sys.stdout.write()ist in diesem Fall bequemer. Ich wollte jedoch zeigen, dass das Schreiben einer leeren Zeichenfolge in stdout den Abstand zwischen Elementen unterdrückt, die mit geschrieben wurden print, was in ähnlichen Situationen nützlich sein kann.
Pär Wieslander
34

Sie können ein Rücktastezeichen ( '\b') drucken :

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

Ergebnis:

aaaaaaaaaaaaaaaaaaaa
Lucas Moeskops
quelle
30

Python 3.x:

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

Python 2.6 oder 2.7:

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

Wenn Sie möchten, dass sie einzeln angezeigt werden, können Sie Folgendes tun:

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

sys.stdout.flush() ist erforderlich, um zu erzwingen, dass das Zeichen bei jedem Ausführen der Schleife geschrieben wird.

daviewales
quelle
7

Nur als Randnotiz:

Das Drucken ist O (1), aber das Erstellen einer Zeichenfolge und das Drucken ist O (n), wobei n die Gesamtzahl der Zeichen in der Zeichenfolge ist. Also ja, während das Erstellen des Strings "sauberer" ist, ist es nicht die effizienteste Methode, dies zu tun.

Ich würde es so machen:

from sys import stdout
printf = stdout.write

Jetzt haben Sie eine "Druckfunktion", die jede Zeichenfolge druckt, die Sie ihr geben, ohne jedes Mal das neue Zeilenzeichen zurückzugeben.

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

Die Ausgabe lautet: Hallo Welt!

Wenn Sie jedoch Ganzzahlen, Gleitkommazahlen oder andere Nicht-Zeichenfolgenwerte drucken möchten, müssen Sie diese mit der Funktion str () in eine Zeichenfolge konvertieren.

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

Die Ausgabe ist: 2 4

Kyle Siopiolosz
quelle
Sagen Sie, dass ich unendlich viel Text gleichzeitig mit der Ausgabe eines Zeichens ausgeben kann?
Strg-Alt-Delor
Wenn ich printf in stdout.write neu definiert habe, scheint mein stdout.write die Anzahl der Diagrammzeichen zu drucken, die die Zeichenfolge lautet: "Hallo, 6" Was gibt es? Was ist los? Und wie höre ich damit auf?
Tom
1
Können Sie auch erklären, was Sie mit O (1) O (n) meinen? Ich verstehe nicht, worauf sich das bezieht
Tom
@ Tom Es bezieht sich auf Komplexität (Big O-Notation) als Spiegelbild der Kosten der Operation. O (1) ist konstante Zeit - ideal - und O (n) ist lineare Zeit - okay, aber viel zu teuer für etwas so Einfaches. Obwohl für kleine Dinge die Zeit, die Sie mit Ihrem Gehirn verbringen, um sich um diese Dinge zu kümmern, rechenintensiver ist als nur die Verkettung von Zeichenfolgen.
Benjamin R
6

Entweder was Ant sagt oder sich in einer Zeichenfolge ansammeln, dann einmal drucken:

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

ohne was? meinst du

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa

?

Ameise
quelle
3

das ist wirklich einfach

Für Python 3+ -Versionen müssen Sie nur die folgenden Codes schreiben

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

Konvertieren Sie einfach die Schleife in die folgenden Codes, Sie müssen sich nicht um andere Dinge kümmern

Shad Munir
quelle
2

BEEINDRUCKEND!!!

Es ist ziemlich lange her

In Python 3.x wird es jetzt ziemlich einfach sein

Code:

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

Ausgabe:

aaaaaaaaaaaaaaaaaaaa 

Weitere Informationen zur Funktion print ()

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

Hier :

value1,value2,value3

Sie können mehrere Werte mit Kommas drucken

sep = '-'

3 Werte werden durch '-' getrennt

Sie können ein beliebiges Zeichen anstelle dieser geraden Zeichenfolge wie sep = '@' oder sep = 'good' verwenden.

end='\n'

Standardmäßig setzen Sie die Druckfunktion '\ n' am Ende der Ausgabe

Sie können jedoch ein beliebiges Zeichen oder eine beliebige Zeichenfolge verwenden, indem Sie den Wert end variale ändern

wie end = '$' oder end = '.' oder end = 'Hallo'

file=sys.stdout

Dies ist ein Standardwert, Systemstandardausgabe

Mit diesem Argument können Sie einen Ausgabedateistream wie erstellen

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

Mit diesem Code erstellen Sie eine Datei mit dem Namen output.txt, in der Ihre Ausgabe als Programmierer gespeichert wird

flush = False

Dies ist ein Standardwert mit flush = True. Sie können den Stream zwangsweise leeren

SHAH MD IMRAN HOSSAIN
quelle
2

so einfach ist das

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