frage zu "print" befehl

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

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
tordmor
User
Beiträge: 100
Registriert: Donnerstag 20. November 2008, 10:29
Wohnort: Stuttgart

http://www.felix-benner.com
problembär

Ich mach' das so:

Code: Alles auswählen

x = 7
print "Der x-Wert beträgt:" + str(x) + "."
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Zuletzt geändert von numerix am Dienstag 27. Oktober 2009, 10:22, insgesamt 1-mal geändert.
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

vielen dank!
hab leider python 2.5 aber die lösung von problembär klappt einwandfrei

mfg
LP640
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.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

So:

Code: Alles auswählen

print "Der Wert beträgt: %d." % x
Oder so (Python 2.6)

Code: Alles auswählen

print "Der Wert beträgt: {0}.".format(x)
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).
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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
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 :P.

Gruß
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

problembär hat geschrieben:
LP640 hat geschrieben:die lösung von problembär klappt einwandfrei
So aber eben auch :P.
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.
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:

Code: Alles auswählen

printf("%d Ziegen zogen %d Zentner.\n", 10, 10);
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ß
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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:

Code: Alles auswählen

'(%s, %s)' % (a, b)
# vs.
'(' + a + ', ' + b + ')'
Vom höheren Schreibaufwand mal ganz abgesehen...
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

@problembär:

Code: Alles auswählen

import this
SNCR ;-)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
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.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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 ;)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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'
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten