[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