Seite 1 von 2
frage zu "print" befehl
Verfasst: Samstag 24. Oktober 2009, 23:56
von LP640
hallo hab wieder ne neue frage
und zwar wollte ich fragen, wie man folgendes vermeiden kann:
Code: Alles auswählen
>>> x=7
>>> print"Der x-Wert beträgt:",x,"."
Der x-Wert beträgt: 7 .
so ich hätte jetzt aber gern, dass der das
nicht so printed: Der x-Wert beträgt: 7 .
sondern so: Der x-Wert beträgt:7.
also ohne platz zwischen doppelpunkt und punkt
geht das irgendwie?
mfg
LP640
Verfasst: Sonntag 25. Oktober 2009, 00:09
von tordmor
Verfasst: Sonntag 25. Oktober 2009, 00:19
von problembär
Verfasst: Sonntag 25. Oktober 2009, 07:07
von numerix
Mit Python 3 geht auch das:
Code: Alles auswählen
>>> x = 7
>>> print("Der x-Wert beträgt:",x,".",sep="")
Der x-Wert beträgt:7.
Verfasst: Sonntag 25. Oktober 2009, 09:15
von LP640
vielen dank!
hab leider python 2.5 aber die lösung von problembär klappt einwandfrei
mfg
LP640
Verfasst: Sonntag 25. Oktober 2009, 09:56
von BlackJack
@LP640: Die Lösung von problembär ist aber nicht die typische, die man in Python-Quelltexten sieht. Das erinnert mich mehr an BASIC. Der Link von tordmor war da schon besser.
Verfasst: Sonntag 25. Oktober 2009, 13:14
von ms4py
So:
Oder so (Python 2.6)
Die Lösung von problembär ist untypisch und unperformant (String-Konkatenation sollte in Python nie mit +-Operator gemacht werden, sondern durch ``join`` oder durch die gezeigte String-Formatierung).
Verfasst: Sonntag 25. Oktober 2009, 13:22
von HWK
ice2k3 hat geschrieben:...unperformant (String-Konkatenation sollte in Python nie mit +-Operator gemacht werden, sondern durch ``join`` oder durch die gezeigte String-Formatierung).
Siehe dazu aber auch
diesen Thread.
MfG
HWK
Verfasst: Sonntag 25. Oktober 2009, 18:19
von problembär
ice2k3 hat geschrieben:Die Lösung von problembär ist untypisch und unperformant
Ja, so sind meine Lösungen.
LP640 hat geschrieben:die lösung von problembär klappt einwandfrei
So aber eben auch

.
Gruß
Verfasst: Sonntag 25. Oktober 2009, 18:32
von numerix
problembär hat geschrieben:LP640 hat geschrieben:die lösung von problembär klappt einwandfrei
So aber eben auch

.
Die anderen Lösungen "klappen" nicht weniger gut.
Das Argument ist meistens kein gutes. Es gibt genügend Beispiele hier im Forum, wo Leute mit genau diesem Argument grausamen Code rechtfertigen.
Verfasst: Sonntag 25. Oktober 2009, 19:25
von problembär
numerix hat geschrieben:Die anderen Lösungen "klappen" nicht weniger gut.
Das Argument ist meistens kein gutes. Es gibt genügend Beispiele hier im Forum, wo Leute mit genau diesem Argument grausamen Code rechtfertigen.
Da ist sie wieder, die Frage, was Python eigentlich sein soll.
Nach meiner Meinung soll Python-Code vor allem einfach zu verstehen sein, und dem Menschen die Arbeit so einfach wie möglich machen. Performance ist daneben erst an zweiter Stelle wichtig.
Andere Sprachen habe andere Prioritäten: In C würde man z.B. schreiben:
Python wurde meiner Meinung nach erfunden, um sowas zu vermeiden und Code leichter verständlich schreiben zu können als das. Daran scheitert Dein Vorschlag ebenso wie der von ice2k3.
Gruß
Verfasst: Sonntag 25. Oktober 2009, 19:38
von ms4py
Weiß nicht, was an dem Beispiel jetzt unverständlich sein soll.
Bei komplexeren Strings wie dein Beispiel ist es über Stringformatierung außerdem deutlich verständlicher! Reicht schon ein geklammter Ausdruck:
Vom höheren Schreibaufwand mal ganz abgesehen...
Verfasst: Sonntag 25. Oktober 2009, 19:41
von CM
@problembär:
SNCR

Verfasst: Sonntag 25. Oktober 2009, 19:58
von numerix
problembär hat geschrieben:Da ist sie wieder, die Frage, was Python eigentlich sein soll.
Nach meiner Meinung soll Python-Code vor allem einfach zu verstehen sein, und dem Menschen die Arbeit so einfach wie möglich machen. Performance ist daneben erst an zweiter Stelle wichtig.
Was den letzten Satz betrifft, so hängt das von den Umständen ab, aber darum ging es eigentlich gar nicht, weil die Frage der Performance bei der Verkettung von Zeichenketten nämlich gar nicht so einfach und eindeutig zu beantworten ist. Ein Link dazu wurde schon gepostet.
Mit dem Verständnis ist es natürlich eine relative Sache. Ich persönlich habe gar nichts gegen deine Variante und finde es gerade für Programmieranfänger (ob du einer bist, weiß ich nicht, wollte ich damit auch nicht gesagt haben) einfacher, zunächst einmal über die String-Verkettung zu gehen. Wer nicht von C/C++ und vergleichbaren Sprachen kommt, für den ist die String-Formatierung mit dem "%" doch zunächst sehr gewöhnungsbedürftig; für die format-Methode gilt das nicht weniger. Das ändert aber nichts daran, dass das nicht die übliche Art und Weise ist, wie man in Python Werte in einen String einbaut.
problembär hat geschrieben:Python wurde meiner Meinung nach erfunden, um sowas zu vermeiden und Code leichter verständlich schreiben zu können als das. Daran scheitert Dein Vorschlag ebenso wie der von ice2k3.
So kann man das nicht sagen. Es hat ganz einfach etwas mit Gewohnheit zu tun. Das, was ich selbst praktiziere, kann ich auch schneller erfassen.
Verfasst: Sonntag 25. Oktober 2009, 20:01
von BlackJack
@ice2k3: Wobei das nur bedingt äquivalent ist, denn beim zweiten Beispiel müssen `a` und `b` Zeichenketten sein (oder `unicode`-Exemplare).
Code: Alles auswählen
'(%s, %s)' % (a, b)
# vs.
'(' + str(a) + ', ' + str(b) + ')'
@problembär: Es geht nicht nur um Geschwindigkeit, sondern auch um Lesbarkeit und Flexibilität. Versuch mal bei Deiner Variante den Text in den die Ausgabe eingebettet wird, austauschbar zu machen, zum Beispiel um Ausgaben in anderen Sprachen zu realisieren. Oder einfach nur mal den Text anders zu formulieren. Dann muss man an den zwischen den ``+``\en stehenden Textfragmenten herumdoktorn. Das macht mir jedenfalls keinen Spass. Solche Template-basierten Ausgaben haben die meisten moderneren Sprachen. Wie gesagt, das mit ``+`` und `str()` erinnert mich stark daran, wie man das früher in BASIC gemacht hat.
Verfasst: Sonntag 25. Oktober 2009, 20:20
von ms4py
Hab jetzt mal einen eigenen Performance-Test gemacht, und String-Konkatenation ist messbar etwas schlechter wie join und String-Formatierung mit %s. Mit %d schneidet es ca. gleich ab.
Hier der Code:
http://paste.pocoo.org/show/146927/
Und die Ergebnisse:
Code: Alles auswählen
1) 164.55 usec/pass + Konkenation
2) 151.45 usec/pass join (Schleife)
3) 109.62 usec/pass join (LC)
4) 2.00 usec/pass + Konkenation
5) 2.11 usec/pass %d Formatierung
6) 0.71 usec/pass %s Formatierung
(Python 2.6, Win7)
Verfasst: Sonntag 25. Oktober 2009, 20:38
von numerix
ice2k3 hat geschrieben:Hab jetzt mal einen eigenen Performance-Test gemacht, und String-Konkatenation ist messbar etwas schlechter wie join und String-Formatierung mit %s. Mit %d schneidet es ca. gleich ab.
Stimmt nicht in jedem Fall. Es hängt - abgesehen von der konkreten Implementierung und Python-Version - von der Länge der zu verbindenden Zeichenketten, von der Anzahl der zu verbindenen Zeichenketten und vom Datentyp der einzufügenden Werte ab.
Verfasst: Sonntag 25. Oktober 2009, 22:00
von ms4py
Das war ja auch nur die Beschreibung von meinem Performance-Test.
Deshalb hab ich ja extra auch noch die Python-Version und mein OS gepostet

Verfasst: Montag 26. Oktober 2009, 09:51
von snafu
ice2k3 hat geschrieben:String-Konkatenation sollte in Python nie mit +-Operator gemacht werden
Naja, die Aussage steht für mich persönlich in etwa auf einer Ebene mit "es sollte nie gegen PEP 8 verstoßen werden". Ich hatte kürzlich selber ein Snippet gepostet, wo es darum ging, einen String solange mit einer unbekannten Anzahl an Zeichen zu erweitern bis er eine bestimmte Mindestlänge hat. Es wäre da unnötig kompliziert gewesen, bei jedem Durchlauf der `while`-Schleife die Anzahl der Zeichen in allen Elementen einer Liste zusammen zu zählen.
Was entscheidenden Grund angeht, wieso man in dem Beispiel aus diesem Thread keine Konkatenation machen sollte, so schließe ich mich meinen Vorrednern an: Es geht vor allem um die Lesbarkeit. Wenn man es so sagen will, ist problembärs Vorschlag, der die Werte erstmal von Hand "zurechtcasten" muss und dann mit dem +-Operator zusammensetzt, quasi der Lowlevel-Ansatz, während man ab Python 2.6 nur noch seine geschweiften Klammern setzt, die Python dann mit den gewünschten Werten füllt. Ab Python 2.7 bzw. 3.1 (glaub ich) ist dann nicht mal mehr eine Zahl in dem Klammernpaar für den Index notwendig, wenn man das nicht braucht.
Sehr praktisch wird String Formatting in solchen Fällen:
Code: Alles auswählen
>>> class McOrder(object):
... def __init__(self, burger, side, drink):
... self.burger = burger
... self.side = side
... self.drink = drink
...
>>> order = McOrder('Cheeseburger', 'French Fries', 'Coke')
>>> 'Your order was a {0.burger} with {0.side} and {0.drink}'.format(order)
'Your order was a Cheeseburger with French Fries and Coke'
Verfasst: Montag 26. Oktober 2009, 10:49
von Leonidas
snafu hat geschrieben:Ich hatte kürzlich selber ein Snippet gepostet, wo es darum ging, einen String solange mit einer unbekannten Anzahl an Zeichen zu erweitern bis er eine bestimmte Mindestlänge hat. Es wäre da unnötig kompliziert gewesen, bei jedem Durchlauf der `while`-Schleife die Anzahl der Zeichen in allen Elementen einer Liste zusammen zu zählen.
Ja, eben, wenn man auch eine Zählvariable mit der Länge nehmen könnte und diese bei jedem ``liste.append(string)`` um ``len(string)`` inkrementieren könnte. Am Schluss noch ein ``''.join(liste)`` und fertig
