it-swarm.com.de

Warum ist% s für die Verkettung besser als +?

Ich verstehe, dass wir %s Verwenden sollten, um einen String zu verketten, anstatt + In Python.

Ich könnte Folgendes tun:

hello = "hello"
world = "world"

print hello + " " + world
print "%s %s" % (hello, world)
print "{} {}".format(hello, world)
print ' '.join([hello, world])

Aber warum sollte ich etwas anderes als den + Verwenden? Es ist schneller, eine Verkettung mit einem einfachen + Zu schreiben. Wenn Sie sich dann die Formatierungszeichenfolge ansehen, geben Sie die Typen an, z. %s Und %d Und so weiter. Ich verstehe, es könnte besser sein, explizit über den Typ zu sprechen.

Aber dann habe ich gelesen, dass die Verwendung von + Für die Verkettung vermieden werden sollte, obwohl es einfacher zu tippen ist. Gibt es einen klaren Grund, warum Zeichenfolgen auf eine dieser anderen Arten verkettet werden sollten?

91
Niklas
  1. Lesbarkeit. Die Format-String-Syntax ist besser lesbar, da sie den Stil von den Daten trennt. In Python zwingt die Syntax %s Alle Nicht-str -Typen automatisch zu str; während die Verkettung nur mit str funktioniert und Sie str nicht mit int verketten können.

  2. Performance. In Python str ist unveränderlich, daher müssen die linke und rechte Zeichenfolge für jedes Verkettungspaar in die neue Zeichenfolge kopiert werden. Wenn Sie vier Zeichenfolgen der Länge 10 verketten, müssen Sie kopiert (10 + 10) + ((10 + 10) +10) + (((10 + 10) +10) +10) = 90 Zeichen anstelle von nur 40 Zeichen. Und die Zahl wird quadratisch schlechter als die Zahl und die Größe der Zeichenfolge nimmt zu. Java optimiert diesen Fall manchmal, indem die Verkettungsreihe so transformiert wird, dass StringBuilder verwendet wird, CPython jedoch nicht.

  3. In einigen Anwendungsfällen bietet die Protokollierungsbibliothek eine API, die mithilfe der Formatzeichenfolge die Protokolleintragszeichenfolge träge erstellt (logging.info("blah: %s", 4)). Dies ist ideal für eine verbesserte Leistung, wenn die Protokollierungsbibliothek entschieden hat, dass der aktuelle Protokolleintrag von einem Protokollfilter verworfen wird, sodass die Zeichenfolge nicht formatiert werden muss.

93
Lie Ryan

Bin ich der einzige, der von links nach rechts liest?

Für mich mit %s ist wie das Hören deutscher Sprecher, bei denen ich bis zum Ende eines sehr langen Satzes warten muss, um zu hören, was das Verb ist.

Welche davon ist auf einen Blick klarer?

"your %s is in the %s" % (object, location)

oder

"your " + object + " is in the " + location  

Ein Beispiel zur Verdeutlichung des Lesbarkeitsarguments:

print 'id: ' + id + '; function: ' + function + '; method: ' + method + '; class: ' + class + ' -- total == ' + total

print 'id: %s; function: %s; method: %s; class: %s --total == %s' % \
   (id, function, method, class, total)

(Beachten Sie, dass das zweite Beispiel nicht nur besser lesbar, sondern auch einfacher zu bearbeiten ist. Sie können die Vorlage in einer Zeile und die Liste der Variablen in einer anderen ändern.)

Ein separates Problem ist, dass% s-Code auch in die Zeichenfolge konvertiert wird. Andernfalls müssen Sie den Aufruf str () verwenden, der auch weniger lesbar ist als ein% s-Code.

13
Rainy

Die Verwendung von + Sollte nicht generell vermieden werden. In vielen Fällen ist der richtige Ansatz. Die Verwendung von %s Oder .join() ist nur in bestimmten Fällen vorzuziehen, und es ist normalerweise ziemlich offensichtlich, wann sie die bessere Lösung sind.

In Ihrem Beispiel verketten Sie drei Zeichenfolgen miteinander, und das Beispiel mit + Ist eindeutig das einfachste und am besten lesbare und daher das empfohlene.

%s Oder .format() sind nützlich, wenn Sie Zeichenfolgen oder Werte in der Mitte einer größeren Zeichenfolge interpolieren möchten. Beispiel:

print "Hello %s, welcome to the computer!" % name

In diesem Fall ist es mit %s Besser lesbar, da Sie vermeiden, die erste Zeichenfolge in mehrere Segmente zu zerlegen. Vor allem, wenn Sie mehrere Werte interpolieren.

.join() ist geeignet, wenn Sie eine Folge von Zeichenfolgen variabler Größe haben und/oder mehrere Zeichenfolgen mit demselben Trennzeichen verketten möchten.

7
JacquesB

Da sich die Wortreihenfolge in verschiedenen Sprachen ändern kann, wird die Form mit %s ist unerlässlich, wenn Sie die Übersetzung von Zeichenfolgen in Ihrer Software ordnungsgemäß unterstützen möchten.

2
martjno