Matlab-Umsteiger vermisst den Workspace - wie macht Ihr das?

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.
Antworten
King Louie
User
Beiträge: 5
Registriert: Samstag 13. März 2021, 15:10

Hallo zusammen,

ich habe bisher beruflich in MATLAB programmiert und möchte mich in Zukunft mit Python breiter aufstellen, dafür mache ich gerade einen Onlinekurs. An einer Stelle habe ich anscheinend aber noch nicht die richtige Python-Denke:

Ich benutze ein Modul oder einen Befehl, z.B. das CSV-Modul, und erhalte eine Variable/Instanz zurück. z.B.:

import csv
with open('../data/names.csv', newline='') as csvfile:
....namelist = csv.reader(csvfile, delimiter=',', quotechar='|')


Jetzt habe ich in "namelist" mein Ergebnis. Aber was ist das für ein Format? Wie finde ich raus, wie ich das ansprechen kann? Also ich will zum Beispiel den ersten Namen auslesen, wohl wissend, dass da noch mehr Informationen als nur Namen drin sein müssen. In Matlab könnte ich im Workspace schauen und sehen, aha, ich habe z.B. ein zweidimensionales Array von Strings. In Jupyter versuche ich sowas rauszukriegen über

print(namelist)
<_csv.reader object at 0x0000023AC54175E0>

Okay, es ist offensichtlich ein csv.reader-Objekt, klar. Das sagt mir aber nichts darüber, was in einem csv.reader -Objekt drin ist oder was ich damit machen kann. Nächster Versuch:

print(namelist[1])
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-be25cc4ac09f> in <module>
----> 1 print(namelist[1])

TypeError: '_csv.reader' object is not subscriptable


Okay, Indizes darf ich nicht verwenden. Aber was darf ich denn?

type(namelist)
_csv.reader

Ja, das wusste ich schon. Ein bisschen mehr Info wäre nett gewesen... :roll:

Ich weiß mittlerweile durch Googlen/Musterlösung, dass der folgende Code funktioniert:
for row in namelist:
....print(row[1])


Also ist es wohl eine Art Set von Lists oder so?

namelist.clear()
AttributeError: '_csv.reader' object has no attribute 'clear'

Also ein richtiges Set ist es auch nicht, sonst hätte es die .clear--Methode...

Wie finde ich raus was mit dem Objekt/der Klasse geht ohne ewig rumzuprobieren oder jedes Mal zu googlen und hoffen, dass es ein häufiges Problem ist? Und vor allem: Welche Methoden sind in csv.reader (oder anderswo, ist ein Beispiel) verfügbar, was machen sie und wie benutze ich sie? Hier muss es doch irgendwas geben in Richtung

print(csv.reader.structure)
print(csv.reader.methods(all))

Oder wird sowas in Python anders gemacht? Wie geht Ihr in der Situation vor? Es geht mit nicht speziell um csv.reader, sondern allgemein. Z.B. Chef meldet sich, Kollege ist krank, kannst Du mal bitte den Bug fixen? Und ich hab die Klasse noch nie gesehen und online kennt es auch keiner, weil das Modul vom krankgeschriebenen Kollegen programmiert wurde.

Danke schonmal für Eure Tipps! :)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Neben der Dokumentation, die man dazu zu Rate ziehen sollte, kann man in Python auch gerne mit dem REPL (read/eval/print/loop) arbeiten. Wenn man dazu noch ipython installiert, dann auch zb mit Vervollstaendigung. Ich benutzen auch viel den pdb-Debugger (per eingestreutem breakpoint()), und schaue mir dann Dinge an.

Es gibt auch andere IDEs wie PyCharm etc, die ggf. mehr Laufzeit-Inspektion beherrschen, wie du sie gewoehnt bist. Ich benutze so etwas aber nicht, darum kann ich da nicht weiter Ratschlaege geben.
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@King Louie: Dokumentation, IPython (oder eine ähnliche Python-Shell), und natürlich der Quelltext. Kombination Python-Shell und Dokumentation: `help()` bzw. ? in IPython.

Und bei etwas das „reader“ heisst würde ich vom Namen her nicht erwarten, dass das eine Datenstruktur mit Werten repräsentiert sondern ein Objekt mit dem man Daten (ein)lesen kann. Ich weiss nicht wie da so bei Matlab das Verhältnis zwischen ist Zahl, ist array-ähnlich, und ist etwas ganz anderes ist, aber bei Python gibt es gaaaaanz viele Datentypen die keine Zahl oder etwas array-ähnliches sind. Unendlich viele im Grunde, denn das ist eine allgemeine Programmiersprache in der man eigene Datentypen definieren kann, und die nicht nur hauptsächlich für Zahlen und Arrays verwendet wird.

Speziell beim `reader` wird Dir kaum eine IDE so richtig weiterhelfen können, es sei denn die Programmierer kennen das Objekt und schreiben da extra was für, denn so viel ”Angriffsfläche” bietet das nicht wenn man sich die Attribute auflisten lässt:

Code: Alles auswählen

In [347]: dir(reader)                                                           
Out[347]: 
['__class__',
 '__delattr__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__iter__',
 '__le__',
 '__lt__',
 '__ne__',
 '__new__',
 '__next__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 'dialect',
 'line_num']
 
In [348]: reader?                                                               
Type:        reader
String form: <_csv.reader object at 0x7f59f4f5cc18>
File:        /usr/lib/python3.6/lib-dynload/_csv.cpython-36m-x86_64-linux-gnu.so
Docstring:  
CSV reader

Reader objects are responsible for reading and parsing tabular data
in CSV format.
Quelltext bekommt man auch keinen zu sehen, weil das wie man am "File:" sehen kann, in C programmiert ist. Am vorhandensein von `__next__()` kann man erkennen, dass das Objekt iterierbar ist.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
King Louie
User
Beiträge: 5
Registriert: Samstag 13. März 2021, 15:10

__deets__ hat geschrieben: Samstag 13. März 2021, 16:17 Neben der Dokumentation, die man dazu zu Rate ziehen sollte, kann man in Python auch gerne mit dem REPL (read/eval/print/loop) arbeiten. Wenn man dazu noch ipython installiert, dann auch zb mit Vervollstaendigung. Ich benutzen auch viel den pdb-Debugger (per eingestreutem breakpoint()), und schaue mir dann Dinge an.

Es gibt auch andere IDEs wie PyCharm etc, die ggf. mehr Laufzeit-Inspektion beherrschen, wie du sie gewoehnt bist. Ich benutze so etwas aber nicht, darum kann ich da nicht weiter Ratschlaege geben.
Vielen Dank! Ich hab mal versucht zu verstehen, was Du da schreibst. Ich arbeite aktuell in einer Anaconda-Installation in Jupyter Notebooks, was ich nicht extra erwähnt hatte, weil ich den Eindruck habe, dass das jeder Python-Neuling macht.

Zum pdb-Debugger hab ich gleich mal Tutorials gefunden und ausprobiert. Ist auf jeden Fall eine super Sache, um in einer for-Schleife einen Breakpoint zu setzen und damit eine Ebene weiter zu kommen. So einen richtigen Ausgabebefehl wie ich ihn suche habe ich aber auch nicht gefunden; p scheint nur das gleiche zu machen wie print, was man auch ausführen kann.

Das mit REPL hab ich nicht ganz verstanden. Die (englische) Wikipedia-Seite zu REPL (https://en.wikipedia.org/wiki/Read%E2%8 ... print_loop) beschreibt ein System, das mich schon stark an die Jupyter Notebooks erinnert.

iPython habe ich auch gegooglet, die Seite https://ipython.org/ verweist aber auch direkt auf Jupyter.

Dann habe ich noch die Scratchpad notebook extension für Jupyter gefunden: https://github.com/minrk/nbextension-scratchpad . Meintest Du das, oder einfach Jupyter selbst? Wo gibts da eine Vervollständigung? Ist mit Vervollständigung gemeint, dass zu jedem Objekt bei mouseover die verfügbaren Methoden angezeigt werden oder so?

Sorry dass ich da etwas schwer von Begriff bin; für mich ist das halt Neuland... :roll:
King Louie
User
Beiträge: 5
Registriert: Samstag 13. März 2021, 15:10

__blackjack__ hat geschrieben: Samstag 13. März 2021, 17:48 @King Louie: Dokumentation, IPython (oder eine ähnliche Python-Shell), und natürlich der Quelltext. Kombination Python-Shell und Dokumentation: `help()` bzw. ? in IPython.
Erstmal Riesendankeschön für die schnelle Antwort!

Also sowohl ? als auch help(), wie auch dir() unten, kannte ich noch nicht, danke! Kam im Kurs noch nicht vor, und ich bin schon >20h dran...
Und bei etwas das „reader“ heisst würde ich vom Namen her nicht erwarten, dass das eine Datenstruktur mit Werten repräsentiert sondern ein Objekt mit dem man Daten (ein)lesen kann.
Okay, ich glaub ich verstehe. Mein Namelist ist nach Aufruf gar keine fertige Datenbank, sondern erst wenn ich damit was mache, werden Daten aus dem CSV-File extrahiert? Was z.B. bei großen Datenmengen Laufzeit spart, wenn man nicht alles auslesen muss?
Ich weiss nicht wie da so bei Matlab das Verhältnis zwischen ist Zahl, ist array-ähnlich, und ist etwas ganz anderes ist, aber bei Python gibt es gaaaaanz viele Datentypen die keine Zahl oder etwas array-ähnliches sind.
Matlab hat die Tendenz, dass alles ein Array/mehrdimensionale Matrix ist -> MATrix - LABor... Was nicht heißen soll, dass Objektorientierung nicht gehen würde. Aber es geht auch ohne.
Unendlich viele im Grunde, denn das ist eine allgemeine Programmiersprache in der man eigene Datentypen definieren kann, und die nicht nur hauptsächlich für Zahlen und Arrays verwendet wird.
Alle Daten im Computer, egal welcher Datentyp, sind ja letztlich Zahlen, z.B. bei einer Bilddatei die RGB-Werte der Pixel. Daher meine Frage, wo steht denn jetzt was? Auch bei komplexen Formaten wie Video würde ich denken, dass mir irgenddwas sagen kann, da sind auf oberster Ebene zwei Datensätze drin, Videospur und Audiospur. Und dann kann ich weiterfragen, was ist denn in der Videospur drin? Ich glaube mit dir() sollte ich da was sehen, aber es ist wahrscheinlich schwer zu finden im Wust anderer Attribute?
Speziell beim `reader` wird Dir kaum eine IDE so richtig weiterhelfen können, es sei denn die Programmierer kennen das Objekt und schreiben da extra was für, denn so viel ”Angriffsfläche” bietet das nicht wenn man sich die Attribute auflisten lässt: [...]
Quelltext bekommt man auch keinen zu sehen, weil das wie man am "File:" sehen kann, in C programmiert ist. Am vorhandensein von `__next__()` kann man erkennen, dass das Objekt iterierbar ist.
Irgendwo in der Liste der Attribute müsste, wenn ich das richtig verstehe, auch eines sein, was die aktuelle Zeile liefert, bevor die for-Schleife das Attribut __next()__ benutzt um in die nächste Zeile zu springen? Bloß ohne Doku ist es schwierig rauszufinden welche?

Danke schonmal bis hierher, bin heute einen Riesenschritt weitergekommen :)
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@King Louie: Mit Jupyter Notebooks/Jupyterlab fängt sicher nicht jeder an. Das bietet sich für Leute an die interaktiv etwas mit Datenanalyse/Visualisierung machen wollen, aber das will ja bei weitem nicht jeder. Wenn man ein Spiel, eine Desktopanwendung, eine Webanwendung, Systemautomatisierung oder so machen will, dann ist das eher nicht die passende Umgebung. Die meisten werden wahrscheinlich einfach erst einmal Python installieren, was ja mit einer sehr rudimentären IDE (IDLE) und der REPL in der Konsole geliefert wird, die man durch starten von Python selbst bekommt.

Ein Jupyter Notebook ist ein bisschen mehr als eine REPL. Eine „Console“ in Jupyterlab ist das eher, und das ist IPython im Browser. IPython gibt's auch normal für die Konsole des Betriebssystems ohne Browser und Server.

Vervollständigung gibt es mit der Tab-Taste in IPython/Jupyter. Hilfe zu einem Objekt mit ? und den Quelltext (wenn es denn in Python geschrieben ist) mit ??. Das ist aber auch alles dokumentiert. Die grösseren/besseren Projekte und Bibliotheken haben in der Regel eine ganz gute Dokumentation. Oft mit Schnelleinstieg, Tutorial, Benutzerhandbuch, und Referenz.

Ich benutze IPython in der Konsole vom Betriebssystem zum interaktiven ausprobieren von Code und einen Texteditor zum schreiben von Quelltext. Jupyterlab käme für mich da nicht in Frage. Der Texteditor davon im Browser ist mir dazu deutlich zu rudimentär.

Ansonsten gibt es unzählige zum programmieren geeignete Texteditoren und auch einen ganzen Haufen dedizierte Python-IDEs. Da kann man nicht wirklich etwas empfehlen, bzw. kannst Du fünf Leute fragen und bekommst sieben Antworten was wirklich gut ist. Im Endeffekt muss man dann doch ein bisschen durchprobieren was einem selbst am ehesten zusagt.

Re `reader`: Genau, man muss nicht die gesamte Datei lesen. Und auch wenn man das tut, muss man sie nicht komplett auf einmal in den Speicher einlesen, sondern kann sie Datensatz für Datensatz verarbeiten.

Das mit den Arrays bei MATLAB hatte ich vermutet. Das ist ja auch der Haupteinsatzzweck von MATLAB. Während Python grundsätzlich erst einmal ganz allgemein eine Programmiersprache ist, die man für sehr viele verschiedene Aufgaben nutzen kann. Da muss man die entsprechenden Datentypen für MATLAB-ähnliche Arrays, Bibliotheken mit speziellen Algorithmen, und zum Plotten auch extra installieren. Das gehört nicht zur Standardbibliothek.

Das `csv`-Modul gehört zur Standardbibliothek, aber die Bibliotheken für numerischen Kram haben auch noch mal Funktionalität zum lesen von CSV- und Textdateien mit Zahlen, die mehr tun als das `csv`-Modul. Das liest die Daten nur als Zeichenketten ein. Wenn da Zahlen drin stehen, muss man die Zeichenketten mit den Zahldarstellungen selbst in Zahlen umwandeln.

Klar sind letztlich alle Daten als Zahlen repräsentiert, aber es gibt viele Problemdomänen wo man nicht mit diesen Zahlen in Kontakt kommt und auch gar nicht kommen will, denn das ist ja doch recht low level.

Wie man an die Pixel als RGB-Werte einer Bilddatei kommt, hängt davon ab welche Bibliothek man verwendet. Und da steht das dann in der Dokumentation. Man kann sich natürlich auch in einer Python-Shell/REPL die Objekte live anschauen und damit herumspielen, aber das hat auch manchmal überrachende Fallen. Zum Beispiel das es auch Bibliotheken gibt die Pixel nicht in der Reihenfolge RGB sondern BGR speichern, was man den Zahlen eventuell nicht sofort ansieht. Bei OpenCV kann man darüber beispielsweise stolpern. Oder man hat ein Array mit den Pixeln mit gewissen Aussmassen, aber man muss darauf achten, dass pro Zeile ”padding” vorkommen kann wo zwar Werte stehen, die aber nicht zu den Bilddaten gehören.

Es kann auch mehrere Wege zu den Pixeldaten geben. Bei der Python Imaging Library (PIL) gibt es eine `getpixel()`-Methode um einzelne Pixelwerte zu bekommen, eine `getdata()`-Methode mit der man alle Pixelwerte als eine flache Sequenz bekommt, und man kann die Bildobjekte in ein Numpy-Array umwandeln. Was man da nimmt kommt darauf an was man letztlich mit den Pixeln machen will und ob man sich Numpy als Abhängigkeit ins Programm holen möchte oder nicht.

Es gibt nur `__next__()`. Das liefert das nächste Element oder löst eine StopIteration-Ausnahme aus wenn es keine Elemente mehr gibt.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
tonikae
User
Beiträge: 90
Registriert: Sonntag 23. Februar 2020, 10:27

Speziell wenn du bislang mit Matlab gearbeitest hast, würde ich dir eher einen Umstieg auf die Programmiersprache: Julia
empfehlen. Denn Julia ist Matlab viel ähnlicher https://cheatsheets.quantecon.org/und arbeitet auch zumeist mit Arrays.
Auch Bilder werden als Arrays gehandhabt
Du musst dich also kaum umstellen hältst dir aber alle Wege nach Python und andere Sprachen offen.

Julia hat auch eine REPL , für Julia gibt es auch Notebooks (IJulia - ist nur ein anderer/weiterer Kernel für Jupyter-Notebooks ) und man
kann auch Python&Python-Module und andere Sprachen einbinden. Man kann Julia auch in Anaconda , in Visual Studio Code und eben
in einer anderen IDE(z.B. Juno https://junolab.org/ ) nutzen. u.v.m.

Bsp:
Julia in Visual Studio Code
https://drive.google.com/file/d/1GHj_Ij ... 0oDhQ/view
https://drive.google.com/file/d/1oIbw0P ... PzeJy/view
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@tonikae: Bei dem Spickzettel finde ich die `reshape()`-Aufrufe in den ersten beiden Beispielen ja ein bisschen komisch. Die beiden Beispiele würde ich ohne `reshape()` schreiben:

Code: Alles auswählen

In [373]: np.array([[1, 2, 3]])                                                 
Out[373]: array([[1, 2, 3]])

In [374]: np.array([[1, 2, 3]]).T                                               
Out[374]: 
array([[1],
       [2],
       [3]])
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
King Louie
User
Beiträge: 5
Registriert: Samstag 13. März 2021, 15:10

tonikae hat geschrieben: Sonntag 14. März 2021, 11:03 Speziell wenn du bislang mit Matlab gearbeitest hast, würde ich dir eher einen Umstieg auf die Programmiersprache: Julia
empfehlen. Denn Julia ist Matlab viel ähnlicher https://cheatsheets.quantecon.org/und arbeitet auch zumeist mit Arrays.
Vielen Dank! Das Cheatsheet ist wirklich interessant. Allerdings ist der Umstieg auf Julia für mich nicht wirklich eine Option - die Standard-Programmiersprache bei mir im Geschäft für alles was Machine Learning angeht ist nun mal Python (per Anaconda-Installation) und auch im Web scheint für Python deutlich mehr verfügbar zu sein - von Julia hatte ich vor Deinem Post noch nicht gehört. Matlab bleibt bei uns verfügbar, aber für manche Aufgaben scheint Python einfach besser geeignet zu sein, weshalb ich mich da weiterbilden möchte. Auch wenn oder gerade weil es anders ist :wink:

Aber danke für den Vorschlag! Wieder was gelernt :)
King Louie
User
Beiträge: 5
Registriert: Samstag 13. März 2021, 15:10

__blackjack__ hat geschrieben: Sonntag 14. März 2021, 01:49 @King Louie: Mit Jupyter Notebooks/Jupyterlab fängt sicher nicht jeder an. Das bietet sich für Leute an die interaktiv etwas mit Datenanalyse/Visualisierung machen wollen, aber das will ja bei weitem nicht jeder. Wenn man ein Spiel, eine Desktopanwendung, eine Webanwendung, Systemautomatisierung oder so machen will, dann ist das eher nicht die passende Umgebung. Die meisten werden wahrscheinlich einfach erst einmal Python installieren, was ja mit einer sehr rudimentären IDE (IDLE) und der REPL in der Konsole geliefert wird, die man durch starten von Python selbst bekommt.
Okay, bei mir im Geschäft ist es Anaconda, was jeder hat und worüber alle reden. Als ich einen Kurs gebucht hatte und der basiert auch auf Anaconda habe ich gedacht das wäre der Standard. Wieder was gelernt.
Vervollständigung gibt es mit der Tab-Taste in IPython/Jupyter. Hilfe zu einem Objekt mit ? und den Quelltext (wenn es denn in Python geschrieben ist) mit ??. Das ist aber auch alles dokumentiert. Die grösseren/besseren Projekte und Bibliotheken haben in der Regel eine ganz gute Dokumentation. Oft mit Schnelleinstieg, Tutorial, Benutzerhandbuch, und Referenz.
Danke! Habe den Kurs "Python Bootcamp: Vom Anfänger zum Profi" auf Udemy gebucht. Ich finde ihn eigentlich didaktisch gut aufgebaut, aber ein paar Infos fehlen halt (oder kommen vielleicht später als ich erwartet hätte). Zum Beispiel diese.
Jupyterlab käme für mich da nicht in Frage. Der Texteditor davon im Browser ist mir dazu deutlich zu rudimentär.
Versteh ich, ich hab mich auch gewundert.
Es gibt nur `__next__()`. Das liefert das nächste Element oder löst eine StopIteration-Ausnahme aus wenn es keine Elemente mehr gibt.
Das hab ich immer noch nicht ganz verstanden. Ich kann ja for row in namelist: verwenden, womit "row" dann die Standard-Klasse "list" hat. Daher gehe ich davon aus, dass for intern irgendwas macht wie (sorry Pseudocode only)

row = namelist.zeilelesen............% Methode zum Auslesen der aktuellen Zeile
while row != empty:
....namelist.__next__()..................% springt in nächste Zeile der Datei
....row = namelist.zeilelesen


Was macht "for" da sonst? Und ist "for" wirklich der einzige Befehl, mit dem ich sinnvoll auf namelist zugreifen kann? Hört sich für mich komisch an, aber wie gesagt - ich hab ja keine Erfahrung mit Python...
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Anaconda ist auch nicht Jupyter.
Was bei einer for-Schleife intern alles passiert, braucht einen Anfänger normalerweise nicht zu interessieren. Dort ist es nur wichtig, was alles Iterierbare Objekte sind, also solche, die man mit einer for-Schleife benutzen kann.
Und eine Liste ist nur ein Objekt, das man dafür verwenden kann. Viele dieser Iteratoren liefern aber Daten on-the-fly, wie csv.reader auch.
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@King Louie: Anaconda ist als Python-Distribution unter Windows beliebt. Hauptsächlich bei Leuten die Numpy und Co brauchen oder irgendwas was sich per ``conda`` installieren lässt was Module in C (oder gar Fortran) hat, für die es im Python Package Index keine vorkompilierten Wheel-Dateien gibt.

Ich denke Du kannst von einem Kurs nicht erwarten das der wirklich *alle* Informationen vermittelt. Die Details wird man sich letztlich immer selbst erarbeiten müssen.

Was bei ``for`` so ganz grundsätzlich passiert ist folgendes (kein Pseudocode!):

Code: Alles auswählen

    for item in iterable:
        do_something(item)

    # ->
    
    _iterator = iter(iterable)
    while True:
        try:
            item = next(_iterator)
        except StopIteration:
            break
        
        do_something(item)
Der Unterstrich bei `_iterator` als Hinweis, dass das ein interner Name ist den wir nicht kennen und auf den man im Python-Code mit der ``for``-Schleife auch nicht heran kommt. Und der auch nicht fest ist, denn sonst könnte man ``for``-Schleifen ja auch nicht verschachteln.

Die `next()`-Funktion greift dann auf `__next__()` zurück. Auf die ”magischen” Methoden sollte man nicht direkt zugreifen wenn es anders geht, weil es sein kann das die dafür vorgesehenen Wege das effizienter können, oder sogar etwas anderes machen. `iter()` beispielsweise funktioniert auch bei einigen Objekten die keine `__iter__()`-Methode haben.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten