Neues deutsches Python Tutorial

Gute Links und Tutorials könnt ihr hier posten.
Antworten
Cero
User
Beiträge: 3
Registriert: Dienstag 26. Dezember 2023, 12:40

Hallo liebes Forum,

Ich habe folgende Webseite erstellt (https://www.information-nugget.de), in der die Basics rundum Python vorgestellt werden. Da ich selber Data Scientist und gelernter Informatiker bin möchte ich gerne um Feedback bitten hinsichtlich des Contents und der besprochenen Thematiken.

Mir ist es wichtig die Basics gut zu beschreiben, bevor weitere komplexere Themen besprochen werden hins. Data Engineering, Cloud Computing & Künstliche Intelligenz.

Es würde mich freuen, wenn ihr die Webseite austesten könntet und mir feedback geben könntet.

Liebe Grüsse,
Cero
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also auch bei einem nur kurzen Blick offenbaren sich schon recht grobe Schnitzer - https://www.information-nugget.de/python/math/ zeigt Code wie

Code: Alles auswählen

# Quadratwurzel
ergebnis = math.quadratwurzel(25)
print("Quadratwurzel:", ergebnis)
der sehr offensichtlich niemals nicht gelaufen ist. Ist das einfach nur durch ChatGPT gejagt?
Benutzeravatar
snafu
User
Beiträge: 6742
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Vielleicht handelt es sich um eine neue Version von Teuton (http://www.fiber-space.de/EasyExtend/do ... teuton.htm)? :)
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

LOL

Ich wollte gerade in einem anderen Beitrag schreiben, dass das Erfinden von Schlüsselwörtern den Computer nicht auf magische Weise dazu veranlasst, die Gedanken des Entwicklers auszuführen.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Cero
User
Beiträge: 3
Registriert: Dienstag 26. Dezember 2023, 12:40

__deets__ hat geschrieben: Dienstag 26. Dezember 2023, 14:40 Also auch bei einem nur kurzen Blick offenbaren sich schon recht grobe Schnitzer - https://www.information-nugget.de/python/math/ zeigt Code wie

Code: Alles auswählen

# Quadratwurzel
ergebnis = math.quadratwurzel(25)
print("Quadratwurzel:", ergebnis)
der sehr offensichtlich niemals nicht gelaufen ist. Ist das einfach nur durch ChatGPT gejagt?
Danke dir! Wird umgehend angepasst. Hast du weitere Anmerkungen z.B. hinsichtlich der Form oder Kontent?
Selbst Anmerkungen zur UI. Ist das intuitiv, sind die Themen realititätsfern und es wäre besser spwzifische Tutorials zu definieren statt das ganze pro Thematik zu bearbeiten die eh nicht relevant sind oder schon durch gekaut wurde?
Benutzeravatar
snafu
User
Beiträge: 6742
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Naja, was soll man dazu sagen? Ist jetzt nicht das erste Python-Tutorial im Netz. Auch auf deutsch gibt es schon einige. Der Schreibstil ist gut (egal ob nun generiert oder selbst erstellt) und wenn du Spaß dran hast, dann mach halt weiter. Vielleicht möchtest du dich auch am Tutorial aus der offiziellen Python-Doku orientieren (https://docs.python.org/3/tutorial/).

Und für die Modulbeschreibungen finde ich (neben der Doku natürlich) die Klamotten von MOTW (https://pymotw.com/3/), sowie https://diveintopython.org/ ganz nützlich. Vielleicht hilft dir davon ja auch was weiter.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

der Sprachstil ist extrem inkonsistent. Mal wird gesiezt, mal gedutzt, mal von "wir" geredet. Das sollte einheitlich sein. Alleine auf der Startseite wird "Sie" und "du" gemischt.

Die Fokussierung auf VS Code halte ich für falsch. Zumal die Schreibweise auf der Startseite IMHO impliziert, dass VS Code zwingend benötigt wird. Also nichts gegen eine IDE, aber zum Lernen braucht man echt keine.

https://www.information-nugget.de/python/class/: "Eine Klasse ist ein grundlegendes Programmierkonzept, um ähnliche Code-Objekte zu gruppieren und strukturieren." Stimmt so nicht. Wieso "ähnlich" und wieso "gruppieren".

https://www.information-nugget.de/python/read-write/: Es fehlt komplett der Hinweis auf den Contextmanager mit "with" zum Lesen und Schreiben von Dateien. So wie gezeigt funktioniert das zwar, aber das macht doch (hoffentlich) seit min 10 Jahren keiner mehr so.

https://www.information-nugget.de/python/data-types/: IMHO ist die Einteilung hier irreführend bis falsch. Listen und Wörterbücher sind nicht fortgeschritten, sondern elementar. Ohne kommt man auch als Anfänger in Python echt nicht weit.

https://www.information-nugget.de/python/iterator/: Ist an der Stelle ungünstig platziert, weil da wird mit Klassen und Dunder-Methoden rumgeworfen, bevor Klassen überhaupt erklärt worden sind. Mal abgesehen davon, dass man IMHO allerfrühsten als fortgeschrittener Python-Programmierer vielleicht mal wissen muss, wie man für ein Objekt das Iterator-Protokoll implementiert.

Mehr als die vier oben verlinkten Seiten habe ich mir noch nicht angeschaut.

Wie oben schon gesagt wurde gibt es viele Python-Tutorials, aber für Neueinsteiger halte ich das offizielle Python-Tutorial in Sachen Struktur, Didaktik und Fehlerfreiheit nach wie vor für unerreicht gut.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Was nicht lauffähige Beispiele angeht: Die kann man vermeiden in dem man die Beispiele testbar macht und dann auch tatsächlich testet. Dafür gibt es das `doctest`-Modul aus der Standardbibliothek schliesslich.

Was mir ansonsten so aufgefallen ist beim kurzen überfliegen:

Mehrzeilige Zeichenketten sind keine Kommentare und werden dafür auch nicht verwendet. Eine solche Verwendung würde auch sehr leicht mit Docstrings kollidieren, also das man einen ”Kommentar” setzt, der dann aber fälschlicherweise von Python selbst oder einem Dokumentationswerkzeug als Dokumentation verwendet wird. Die üblichen Werkzeuge ”erkennen” Docstrings üblicherweise auch an Stellen wo Python als Sprache keine vorgesehen hat! Man kann also auch nicht einfach sagen man kann Zeichenketten an Stellen im Quelltext als Kommentare missbrauchen wo sie vom Compiler nicht für ein `__doc__`-Attribut verwendet werden.

Auch mehrzeilige Kommentare werden mit einem # pro Zeile geschrieben und zum auskommentieren von mehreren Zeilen Code hat jeder Editor der sich zum programmieren eignet, eine entsprechende Funktion + Tastenkürzel um das mit #-Zeichen zu machen. Und eine Umkehrfunktion dazu.

Die „Was ist eine Variable“-Beschreibung ist im Grunde falsch, oder führt zumindest später zu unnötig umständlichen Erklärungen um das wieder irgendwie gerade zu biegen. Variablen in Python sind keine Behälter mit Namen wo man Werte/Objekte rein tut, sondern Post-It-Zettel mit Namen, die man auf Werte/Objekte klebt. Sonst muss man nämlich über kurz oder lang erklären können wie ein Objekt in mehreren Behältern gleichzeitig stecken kann.

Der `print()`-Befehl ist keine Befehl. Das war mal in Python 2. Also schon länger Vergangenheit.

„Datentypen“ kann man im Inhaltsverzeichnis anklicken, aber da passiert nicht wirklich etwas. Insbesondere kommt man nicht zu einem Abschnitt über Datentypen.

Bei den Operatoren die als Schlüsselworte umgesetzt sind, wurden welche auf Deutsch übersetzt. Die funktionieren so in Theuton, aber nicht in Python. 😜

Das man ``for``-Schleifen über Sequenzen schreiben kann ist zwar nicht falsch, aber Sequenzen sind bei weitem nicht die einzigen Werte über die man so eine Schleife schreiben kann. Die Abschnitte zu ``for`` und „Iteratoren“ sind sehr oberflächlich und unvollständig bis falsch. Dafür kommt da schon ein Vorgriff auf ``class`` und `__iter__()`, `__next__()`, wobei `__next__()` sehr exotisch ist. So eine Klasse mit den beiden Methoden gehört zur Vollständigkeit irgendwo in den Anhang, wenn man alles andere erklärt hat. Denn so etwas implementiert man nicht in normalen Programmen. Seit ``yield``, also seit jetzt ca. 21 Jahren, schreibt das keiner mehr so umständlich.

`len()` gibt nicht die Anzahl der Elemente in einem Iterator zurück. Die werden „lazy“ ausgewertet, was das Tutorial ja sogar selbst sagst, und es kann unendliche Iteratoren geben. Wie sollte `len()` unter diesen beiden Bedingungen denn sinnvoll funktionieren können?

Das zwischen Schleifen und Iteratoren ein Abschnitt über anonyme Funktionen eingeschoben ist, macht keinen Sinn. Bei den drei Beispielen sind das erste und das letzte Beispiel komplett Banane, also Negativ-Beispiele die zeigen wo man das *nicht* verwenden sollte. Beide Beispiele rufen die definierte ``lambda``-Funktion *sofort* im gleichen Ausdruck auf. Das macht ausserhalb von Code-Golf so überhaupt gar keinen Sinn. Beide Beispiele sind kürzer und leichter verständlich ohne den ``lambda``-Ausdruck. Ebenso das mittlere Beispiel.

Gut das gerade Weihnachten ist, sonst könnte ich mich glatt dazu hinreissen lassen persönlich beleidigend zu werden. `eval()`? ECHT JETZT!!!1!

Der Abschnitt „Exception“ enthält als Einleitungstext exakt den gleichen wie „Iteratoren“. Auch das scheint ein typischer ”KI”-Fehler bei generierten Tutorials zu sein, denn das habe ich jetzt auch schon mehrfach gesehen.

An der Stelle höre ich dann mal auf. Wie gesagt, Weihnachten. Darum spare ich mir zu sagen was ich von Leuten halte, die das Netz mit solchem Müll vollkleistern.

Wenn man ein Python-Tutorial schreibt sollte man ein Tutorial schreiben wollen und Python können, bei dem was da auf der Seite ist, ist mindestens eine dieser Voraussetzungen offensichtlich nicht gegeben.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
snafu
User
Beiträge: 6742
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Cero
Die Aussagen für das math-Modul sind in Bezug auf die Operatoren immer noch falsch. Man braucht keinen math-Import, um Berechnungen freizuschalten (so liest sich das irgendwie). Vielleicht solltest du erstmal selber ein Python-Tutorial durcharbeiten, bevor du so etwas verbreitest. Oder einfach mal die generierten Inhalte mehr als nur überfliegen. Denn was hat ein unbedarfter Anfänger, der auf deine Seite stößt, von einem Tutorial, was du in 2 Tagen hingeklatscht hast, aber das eine Menge fragewürdiger bis unsinniger Aussagen enthält? Und das Schlimme: Der Anfänger kann noch nicht einschätzen, was richtig und was falsch ist. Das ist dann ziemlich kontraproduktiv, wenn du so an die Sache herangehst...
Benutzeravatar
snafu
User
Beiträge: 6742
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Die Anweisung "Versuchen mit Ressourcen"
In Python 3.10 und späteren Versionen können Sie die try-Anweisung mit Ressourcen verwenden. Dies erleichtert die Verwaltung von Ressourcen, die nach der Verwendung gereinigt werden müssen, wie Dateiobjekte oder Netzwerkverbindungen.
Ganz schlecht übersetzt und auch inhaltlich falsch. Die try-Anweisung gab es schon lange vor Python 3.10, wenn nicht sogar seit dem allerersten Python-Release. Was später dazu kam, war ``with`` und das scheint ja auch gemeint zu sein, wenn man sich den darunter stehenden Code anschaut. ``with`` gibt es glaube ich seit Python 2.5, müsste ich aber nachsehen. Jedenfalls noch vor der ersten 3er-Version. Warum hier von 3.10 gesprochen wird, erschließt sich mir daher nicht wirklich.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

die Seite zur "main Funktion" ist auch extrem irreführend, weil das der Unterschied zwischen `def main` und `if __name__ == '__main__': überhaupt nicht klar wird (und IMHO vom Schreiber auch nicht wirklich verstanden wurde). `main` kann heißen, wie man möchte. Wie z.B.

Code: Alles auswählen

def rhein():
    print('Hallo Welt')

if __name__=='__main__':
    rhein()
funktioniert auch. Trotz `rhein` statt `main`.

Und https://www.information-nugget.de/python/arrays/ ist ja katastrophal falsch. Auf der Seite stimmt gar nichts, weil da an keiner Stelle ein Python Array verwendet wird.

Gruß, noisefloor
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

„try with resources“ ist die Java-Version vom `with`-Statement in Python:

Code: Alles auswählen

try (var file = new FileReader(path)) {
    // do something with file
}
Wie dieser Ausdruck in einem Python-Tutorial auftauchen kann... Ich wüschte, ich könnte mir das nicht erklären, aber ... ChatGPT existiert.

Wobei diese komischen Übersetzungen auch eher auf Google Translate hinweisen? Also vielleicht auch ein englisches Java-Tutorial, bei dem man ChatGPT den Code in Python hat übersetzen lassen und dann das ganze (inklusive Code) mit Google Translate nach Deutsch übersetzt hat? :shock:
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@snafu: Ich würde da nicht schlecht übersetzt zu sagen sondern falsche Quelle. „try with ressources“ ist Java (ab Java 7) und nicht Python:

Code: Alles auswählen

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

public final class Test {
    private Test() {}

    public static void main(String... args) throws IOException {
        try (final var reader = Files.newBufferedReader(Path.of("text.txt"))) {
            final var firstLine = reader.readLine();
            System.out.println(firstLine);
        }
    }
}
Das was da in Klammern hinter dem ``try`` steht muss das `AutoClosable`-Interface implementieren, also eine `close()`-Methode haben, und die wird beim verlassen des ``try``-Blocks aufgerufen. Egal warum der verlassen wird. Entspricht also in etwa folgendem, nur das dort `reader` auch ausserhalb des ``try``-Blocks sichtbar ist:

Code: Alles auswählen

        final var reader = Files.newBufferedReader(Path.of("text.txt"));
        try {
            final var firstLine = reader.readLine();
            System.out.println(firstLine);
        } finally {
            reader.close();
        }
Und ja, das entspricht in diesem Fall ``with`` in Python. Wobei Kontextmanager in Python ja noch ein bisschen mehr sind als die `__exit__()`-Methode. Und das `close()` in Java bekommt auch nicht mit, ob eine Ausnahme aufgetreten ist, oder der ``try``-Block gezielter verlassen wurde. Also man könnte da bei einer Datenbankverbindung an der Stelle beispielsweise nicht entscheiden ob man ein COMMIT oder ein ROLLBACK machen sollte.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Code: Alles auswählen

# Division
result = 6 / 3
print("Division:", result) # Output: 2
Diese Operation liefert einen float.
2 ist falsch. Das Ergebnis muss 2.0 sein


Die Integer-Division fehlt noch.

Code: Alles auswählen

# Division
result = 6 // 3
print("Division:", result) # Output: 2
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
snafu
User
Beiträge: 6742
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Oh, da ist aber jemand ganz schön still geworden. Wie gesagt: Ich finde die Idee an sich super und bin ja nach wie vor für ein Update der deutschen Übersetzung vom offiziellen Tutorial. Jedoch haben sich hier bei genauerer Betrachtung doch erhebliche Defizite gezeigt. Und auch, dass die Fähigkeiten von ChatGPT (oder was auch immer es nun war) doch arg überschätzt werden. Vor allem das blinde Vertrauen in diese Technik fällt einem oft auf die Füße, wenn so eine Art Faktencheck von Anderen gemacht wird. Ich frage mich, wie viele SchülerInnen nach dem anfänglichen Hype damit schon auf die Nase gefallen sind...
Benutzeravatar
snafu
User
Beiträge: 6742
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

narpfel hat geschrieben: Dienstag 26. Dezember 2023, 19:55 „try with resources“ ist die Java-Version vom `with`-Statement in Python (...) Also vielleicht auch ein englisches Java-Tutorial, bei dem man ChatGPT den Code in Python hat übersetzen lassen und dann das ganze (inklusive Code) mit Google Translate nach Deutsch übersetzt hat? :shock:
Ist schon ziemlich spooky, aber durchaus denkbar, dass es in ähnlicher Form tatsächlich so entstanden ist. :o
Cero
User
Beiträge: 3
Registriert: Dienstag 26. Dezember 2023, 12:40

snafu hat geschrieben: Dienstag 26. Dezember 2023, 21:50 Oh, da ist aber jemand ganz schön still geworden. Wie gesagt: Ich finde die Idee an sich super und bin ja nach wie vor für ein Update der deutschen Übersetzung vom offiziellen Tutorial. Jedoch haben sich hier bei genauerer Betrachtung doch erhebliche Defizite gezeigt. Und auch, dass die Fähigkeiten von ChatGPT (oder was auch immer es nun war) doch arg überschätzt werden. Vor allem das blinde Vertrauen in diese Technik fällt einem oft auf die Füße, wenn so eine Art Faktencheck von Anderen gemacht wird. Ich frage mich, wie viele SchülerInnen nach dem anfänglichen Hype damit schon auf die Nase gefallen sind...
Feedback ist the breakfast of the Champions ;)
Also, ich nehme definitiv jeden Input entgegen und überlege dann die Tage wie ich weitermache.

Initial wollte ich eine Seite generieren, wo ich einfach nur „Code Snippets“ reinpacke, ohne Grosses tam tam rund um Erklärungen. Also ähnlich im Stil von w3schools, eventuell sogar etwas leaner.

Die Texte wurden tatsächlich teilweise via Chat-Bots generiert, aber wie gesehen nicht sonderlich präzise.

Ich muss dann mal schauen ob ich diese dann manuell anpasse mit mehr Zeit und Hirnschmalz oder einfach direkt umschwenke auf den „Code Snippet Ansatz“ a la W3Schools.

LG,
Cero
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Solche Beispiele meiden (https://www.information-nugget.de/python/exception/):

Code: Alles auswählen

try:
    # Code, der eine Ausnahme auslösen kann
except SyntaxError:
    # Behandlung von Syntax Fehlern z.B. print("Hello World"
except TypeError:
    # Behandlung von TypeErrors z.B. 1 + "Zwei"
else:
    # Führe diesen Code aus, wenn keine Exception ausgelöst wird
    print("Success!")
finally:
    # Code, der immer ausgeführt wird, unabhängig davon (egal ob Exception geworfen wird oder nicht)
Wenn man den Code so 1:1 übernimmt, bekommt man einen SyntaxError. Das liegt daran, dass in den jeweiligen Blöcken nur Kommentare sind und die gelten nicht als Statements. Es muss mindestens ein Statement im Block vorhanden sein, damit der Code überhaupt interpretiert werden kann. Gleichzeitig wird Anfänger annehmen, dass man Syntaxfehler im gleichen Modul haben kann und diese ggf. abfangen könnte. Das ist aber falsch, denn es betrifft Module, die importiert werden. Ein Syntaxfehler lässt sich nicht mit Code im gleichen Modul abfangen, da dieser Code nicht geparst werden kann und dann auch nicht ausgeführt werden kann.

Code: Alles auswählen

def funktion():
    "a" + 1


try:
    print("Code, der eine Ausnahme auslösen kann")
    funktion()
except ValueError:
    print("Behandlung eines ValueError")
except TypeError:
    print("Behandlung eines TypeError")
else:
    print("Führe diesen Code aus, wenn keine Exception ausgelöst wird")
    print("Erfolg!")
finally:
    print("Code, der immer ausgeführt wird, unabhängig davon (egal ob Exception geworfen wird oder nicht)")
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten