[Python-de] Wie sieht Python fuer mich aus?
Stefan Schwarzer
sschwarzer at sschwarzer.net
Mo Jan 9 00:23:06 EST 2017
Hi Stefan,
On 2017-01-08 18:52, Stefan Ram wrote:
> Ausgeben
>
> »print« rundet Zahlen bei der Ausgabe etwas, während die
> Konsole alle Nachkommastellen anzeigt.
`print` verwendet die Methode `__str__` zur Umwandlung in
einen String, während in der Konsole (Python-Shell)
`__repr__` verwendet wird. Beide Methoden können
unterschiedlich implementiert sein (siehe unten).
> Variablen
>
> Eine Variable wird durch eine Zuweisung definiert. Eine
> Variable hat keinen Typ, sondern Werte haben einen Typ.
Eine wichtige Einsicht!
> Eine Variable wird an eine Liste gebunden, die Liste wird
> also bei einer Zuweisung nicht kopiert. (Kopieren kann mit
> nachgestelltem slice »[:]« erfolgen.)
Das kopiert nur die erste "Ebene" der Liste ("flache Kopie",
"shallow copy"). "Innere" Listen oder Objekte werden dabei
also nicht kopiert, sondern deren Referenzen übernommen.
>>> L = [[1, 2], [3, 4]]
>>> L2 = L[:]
>>> L[0].append(2)
>>> L2
[[1, 2, 2], [3, 4]]
> »range(2,7)« ergibt einen Bereich (einen Iterator) und
> »range(2)« bedeutet »range(0,2)«.
In Python 2 ergibt `range` eine Liste, in Python 3 einen
Iterator.
> Die spezielle Methode »__string__« repräsentiert Objekte
> einer Klasse als Zeichenfolge.
>
> Muster
>
> def __string__(self,...):
> return "string"
Du meintest wahrscheinlich `__str__`. Wie oben gesagt, gibt
es auch noch `__repr__`. Üblicherweise wird `__str__` für
eine "nutzerfreundliche" Darstellung verwendet und
`__repr__` eher für eine "entwicklerfreundliche".
>>> s = "abc "
>>> print(s)
abc
>>> s # Nur hier sieht man das Leerzeichen am Ende
'abc '
>>> import decimal
>>> d = decimal.Decimal("1.23")
>>> print(d)
1.23
>>> d
Decimal('1.23')
Zu deinem Beispiel: "Technisch" kann man `__str__` und
`__repr__` mit weiteren Argumenten außer `self` definieren,
aber es wird praktisch nie gemacht: Beide Methoden werden
üblicherweise in Zusammenhängen verwendet, bei denen keine
Argumente übergeben werden (können).
>>> class A:
... def __str__(self, x="x"):
... return "a" + x
...
>>> a = A()
>>> print(a)
ax
>>> print(a.__str__("y"))
ay
Wie du siehst, ist der explizite Aufruf von `__str__`
relativ "unhandlich". :-)
Viele Grüße
Stefan
Mehr Informationen über die Mailingliste python-de