@Max77: Vor Python hatte ich schon Kontakt mit vielen anderen Programmiersprachen. Solange eine Sprache nicht komplett anders tickt, als die die man davor gelernt hat, fällt das dann schon mal leichter. Man muss dann nur die ”Differenz” lernen, also einiges aus anderen Sprachen ”verlernen” und was neu oder anders ist dazu lernen. Zum ”verlernen” gehörte bei Python zum Beispiel das Indexzugriffe in Schleifen ”unpythonisch” sind wenn man stattdessen direkt über die Objekte iterieren kann.
Bücher haben bei mir beim lernen von Python noch eine Rolle gespielt, es wäre aber auch ohne gegangen, denn Online war und ist eine Menge Stoff vorhanden. Allerdings das allermeiste in Englisch. Um diese Sprache kommt man beim Programmieren nicht herum.
IT-Studium hat geholfen — hauptsächlich weil ich dort mit Java gequält wurde und deshalb motiviert war was schöneres zu lernen, und dankbar war, dass Python deutlich schöner ist.
Mit Java habe ich eine Spielart von OOP gelernt — diese klassenfixierte, statisch typisierte. Davor kannte ich OOP von Borland Pascal aus der Schule, und da habe ich es nur so halb verstanden gehabt. Danach habe ich mich noch ein bisschen mit Smalltalk beschäftigt, das ist OOP wie's mal erfunden wurde, und mit Io, das ist OOP ohne Klassen.
Namensräume haben nichts mit OOP zu tun, das ist ein orthogonales Thema. Man kann Namensräume auch ohne OOP haben und verwenden. Bei klassischer prozeduraler Programmierung mit Pascal sind Units zum Beispiel Namensräume. Auch ohne eigene Klassen zu definieren, nutzt man in Python schon Module als Namensräume. Klassen sind welche. Eigentlich jedes Objekt, und da in Python jeder Wert ein Objekt ist, ist in Python im Grunde auch jeder Wert ein Namensraum. Man kann allerdings nicht auf jedem Objekt Namen a.k.a. Attribute definieren. Es gibt welche die erlauben das nicht.
Namensräume sind ”Räume” in denen man Namen definieren kann. Eben in einem Modul. Oder in einer Klasse. Und per Zuweisung eines Attributs auf (fast) jedem Objekt.
Was eine „Quere“ ist weiss ich auch nicht, aber eine Queue ist eine Datenstruktur mit bestimmten Eigenschaften. Python hat sowas schon in der Standardbibliothek als `collections.deque` und `Queue.Queue`. Ähnlich wie eine Liste, nur das man da effizient Werte am einen Ende hinzufügen und am anderen entfernen kann. Und die beiden Implementierungen sind threadsicher.
Ein Iterator ist ein Wert mit bestimmten Eigenschaften. Man kann sich mit der `next()`-Funktion ”den nächsten Wert holen” und bekommt entweder diesen Wert oder es wird eine `StopIteration`-Ausnahme ausgelöst. Was ”der nächste Wert” ist, hängt davon ab was das für ein Iterator ist. Dateiobjekte sind beispielsweise Iteratoren und da ist der nächste Wert die nächste Zeile aus der Datei. Wenn man sich von einer Liste mit `iter()` einen Iterator geben lässt, dann liefert der nach und nach die Werte aus der Liste. Iteratoren sind in Python sehr wichtig, denn die kommen in jeder ``for``-Schleife vor. Nach dem ``in`` muss ein Ausdruck stehen der zu einem iterierbaren Objekt ausgewertet wird, also ein Objekt von dem man mit der `iter()`-Funktion einen Iterator bekommt.
Ereignismenge? Ich habe eine Ergebnismenge erwähnt. Und da habe ich jetzt ein ganz klein bisschen ein Problem das Problem zu sehen. Wenn man eine Datenbankabfrage durchführt, bekommt man eine Ergebnismenge. Der Begriff Menge wird hier zugegebenermassen etwas gedehnt, weil eine Menge ungeordnet ist und damit ein Positionsanzeiger keinen Sinn macht, aber so streng sieht man das in der praktischen Anwendung nicht immer.
Prozessglobaler Zustand ist ein Zustand der für den gesamten Prozess gilt, also für alle Teile des Programms. Und wenn Du in einem Teil des Programms das aktuelle Arbeitsverzeichnis änderst, kann es passieren, dass andere Teile des Programms etwas mit Dateien machen und davon ausgehen das sich das Arbeitsverzeichnis *nicht* geändert hat, und dann gibt es Fehler. Globale Zustände sollte man so gut es geht vermeiden. Schon in Modulen, und erst recht für den gesamten Prozess. Das macht Programme undurchsichtig, fehleranfällig, und schwer zu warten.
Es ist eben gerade nicht alles umständlich benannt. Wenn es die Fachbegriffe nicht gäbe, dann müsste man ja jedes mal wenn man eine Queue meint, ausführlich beschreiben was für einen Wert mit welchen Eigenschaften man meint. Und jeder beschreibt das dann ein bisschen anders und jeder versteht das dann ein bisschen anders. Der Begriff Queue ist ziemlich klar definiert, da gibt es relativ wenig Spielraum. Das ist ein abstrakter Datentyp den es in vielen Programmiersprachen implementiert gibt. Bei Iterator ist es so ähnlich, nur das es dort deutlich mehr Spielraum bei der konkreten Umsetzung gibt.
Wenn Du tatsächlich keine Begabung für Fremdsprachen hast, dann liegt vielleicht da das Problem. Programmier*sprachen* sind halt auch Sprachen. Und von keinem von uns die Muttersprachen, also sind es Fremdsprachen. Und Dokumentation ist im Überfluss vorhanden, allerdings überwiegend in Englisch.
Das Python grundsätzlich leicht zu lernen ist wage ich zu bezweifeln. Es ist leichter als bestimmte andere Sprachen, weil es eine recht übersichtliche und lesbare Syntax hat, weil man in der interaktiven Shell leicht experimentieren kann, weil es eine umfangreiche Standardbibliothek gibt, und weil sich die Laufzeitumgebung um die Speicherverwaltung kümmert und hilfreichere Ausgaben liefert als einen kommentarlosen Programmabsturz wenn man Fehler macht.
Die Materie an sich ist halt auch recht komplex. Also Kodierungen und Texte, Betriebssystemkram wie Prozesse/Dateioperationen, GUIs, nebenläufige Programmierung, relationale Datenbanken — das sind alles für sich genommen schon recht umfangreiche Themen. Da braucht man Zeit.
Wenn man das Programm anschaut, fehlt Dir auch noch ein Schritt vor OOP: Funktionen.Wenn man seinen Code nicht sinnvoll auf Funktionen einteilt, und globale Variablen verwendet, dann ist man mindestens zwei Schritte von OOP entfernt. Denn bei OOP werden zusammengehörende Funktionen und Daten zu Objekten zusammengefasst.