2010-11-12 8 views
22

Ich weiß, dass wenn Sie eine iterable haben, sollten Sie immer .join(iterable) anstelle von for x in y: str += x verwenden. Aber wenn es nur eine feste Anzahl von Variablen gibt, die nicht bereits in einem iterablen Zustand sind, ist die Verwendung von .join() immer noch der empfohlene Weg?Python .join oder String-Verkettung

Zum Beispiel habe ich

user = 'username' 
host = 'host' 

soll ich tun

ret = user + '@' + host 

oder

ret = '@'.join([user, host]) 

Ich bin nicht so viel von einem Performance-Sicht zu fragen, denn beide werden ist ziemlich trivial. Aber ich habe Leute hier gelesen sagen immer .join() verwenden und ich fragte mich, ob es einen bestimmten Grund dafür gibt oder wenn es im Allgemeinen eine gute Idee ist, .join() zu verwenden.

+6

Ich habe immer teilweise auf ' '% s @% s' % (user, host) 'gewesen. –

+0

+1 für eine interessante Frage, ich habe das gleiche gefragt. Normalerweise verwende ich Format für diese Art von Dingen. – GWW

Antwort

28

Wenn Sie eine Zeichenfolge wie das erstellen, möchten Sie normalerweise Zeichenfolge Formatierung verwenden:

>>> user = 'username' 
>>> host = 'host' 
>>> '%[email protected]%s' % (user, host) 
'[email protected]' 

Python 2.6 eine andere Form gegeben, die auf Betreiber Überlastung stützt sich nicht und hat einige zusätzliche Funktionen:

Als allgemeine Richtlinie verwenden die meisten Leute + nur für Strings, wenn sie genau dort zwei Strings hinzufügen. Für mehr Teile oder komplexere Strings verwenden sie entweder String-Formatierung wie oben oder assemblieren Elemente in einer Liste und fügen sie zusammen (besonders, wenn irgendeine Art von Schleifen involviert ist.) Der Grund für die Verwendung von str.join() ist, dass das Hinzufügen von Strings zusammen das Erstellen bedeutet eine neue Zeichenfolge (und potenziell die alten zu zerstören) für jede Addition. Python kann dies manchmal optimieren, aber str.join() wird schnell klarer, offensichtlicher und deutlich schneller.

+11

Es ist erwähnenswert, dass die '%' Notation veraltet ist und dass die '.format()' Methode * Der Weg der Zukunft * ist. Relevante Dokumentation: http://docs.python.org/library/string.html#formatstrings – syrion

+2

'%' -Formatieren Operationen sind noch nicht veraltet. Sie gelten als * veraltet *, aber sie sind immer noch in allen Python-Versionen verfügbar, wurden noch nicht für die tatsächliche Entfernung geplant und lösen keine Warnung aus. –

+2

Nebenbei finde ich das ein wenig traurig, denn String-Formatierung * als Operator * ist eine der liebenswerten Python-Macken, die mich anfangs zur Sprache brachten. – kindall

8

(Ich bin mir ziemlich sicher, dass alle Menschen auf Zeichenfolge Formatierung zeigt fehlen die Frage völlig.)

eine Zeichenfolge Erstellen von ein Array konstruieren und es Beitritt ist nur aus Leistungsgründen. Wenn Sie diese Leistung nicht benötigen oder es sich ohnehin nicht um die natürliche Methode zur Implementierung handelt, ist dies kein Vorteil, sondern eine einfache Stringverkettung.

Sprechen '@'.join([user, host]) ist nicht intuitiv. Ich frage mich: Warum macht er das? Gibt es irgendwelche Feinheiten? Gibt es einen Fall, in dem es mehr als ein "@" geben könnte? Die Antwort ist natürlich nein, aber es braucht mehr Zeit, um zu dieser Schlussfolgerung zu kommen, als wenn es auf natürliche Weise geschrieben wäre.

Verändern Sie den Code nicht, um die Verkettung von Strings zu vermeiden. da ist nichts an sich falsch. Das Verbinden von Arrays ist nur eine Optimierung.

+1

Ich bin mir nicht sicher, wie ich den Punkt in meiner Antwort "verpasst" habe. Auch "Array" und "Liste" sind nicht dasselbe. –

+0

@Thomas: Mit ein paar Jahrzehnten der Angewohnheit Arrays Arrays zu benennen, gehe ich nicht immer zu dem Versuch, sie von Pythons weniger gebräuchlichem Namen zu nennen. Ich denke, Ihre Antwort hat den Punkt verfehlt, weil seine Frage spezifisch "[] .join" mit der String-Verkettung vergleicht und fragt, ob String-Verkettungen vermieden werden sollen, selbst in einfachen Fällen; * nicht * frage nach dem idealen Weg, um dieses spezielle, konstruierte Beispiel zu formatieren. –

+3

Die Frage lautete "eine feste Anzahl von Variablen", was häufig der Fall ist, wenn die Formatierung von Strings - mit '%' oder mit 'str.format' - verwendet wird. Meine Antwort erklärt, warum Leute sich für 'str.join()' entscheiden. Was die Listen im Vergleich zu den Arrays anbelangt, denke ich nicht, dass die Verwendung des falschen Namens eine besonders gute Idee ist, wenn man bedenkt, dass Python * Arrays hat und sie ziemlich unterschiedliche Dinge sind. (Und aus dem gleichen Grund, um sicherzustellen, dass Leser nicht verwirrt werden, werde ich feststellen, dass '[] .join' nicht existiert.) –

12

Ich nehme die Frage zu verstehen: „Ist es in Ordnung, dies zu tun:“

ret = user + '@' + host 

..und die Antwort ja ist. Das ist völlig in Ordnung.

Sie sollten natürlich die coole Formatierung, die Sie in Python tun können, bewusst sein, und Sie sollten wissen, dass für lange Listen "Join" der Weg zu gehen ist, aber für eine einfache Situation wie diese, Was du hast, ist genau richtig. Es ist einfach und klar und Leistung wird kein Problem sein.

7

Ich werde nur bemerken, dass ich immer dazu tendiert, In-Place-Verkettung zu verwenden, bis ich einen Teil des allgemeinen Python-Stils PEP PEP-8 Style Guide for Python Code erneut las.

  • -Code sollte in einer Weise geschrieben werden, die nicht benachteiligt andere Implementierungen von Python (PyPy, Jython, Ironpython, Pyrex, Psyco, und so weiter). Verlasse dich beispielsweise nicht auf CPythons effiziente Implementierung der In-Place-String-Verkettung für Anweisungen in der Form a + = b oder a = a + b. Diese Anweisungen laufen in Jython langsamer ab. In leistungssensitiven Teilen der Bibliothek sollte stattdessen das Formular '' .join() verwendet werden. Diese stellt sicher, dass Verkettung in linearer Zeit über verschiedene Implementierungen auftritt.

durch diese gehen, ich habe verbindet der Verwendung von in die Praxis umgesetzt worden Umwandlung, so dass ich die Gewohnheit als eine automatische Praxis beibehalten kann, wenn die Effizienz besonders kritisch ist.

So denn ich werde in meiner Abstimmung:

ret = '@'.join([user, host])