Tipps für Einsteiger und Meinungen zum Buch Python 3 von Heiko Kalista

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
Wunderkind89
User
Beiträge: 66
Registriert: Sonntag 15. November 2020, 01:28

Hallo zusammen,

da ich ein Neuling bin was Python angeht, habe ich mir das folgende Buch bestellt: https://www.amazon.de/Python-Einsteigen ... on&sr=8-16

Aus diesem Buch wollte ich mir die Basics zu Python aneignen und würde gern vorerst euch fragen, was ihr so von dem Buch haltet (falls ihr damit schon gearbeitet habt). Im Bereich c, c++ und c# hab ich des öfteren gehört, dass viele Bücher auf Deutsch einfach nur schlecht sind und mehr oder weniger grobe Fehler (durchgehend) aufweisen, welche Einsteiger so übernehmen und sich im schlimmsten Falle diese Fehler/falsche Programmierung angewöhnen. Da hat jemand zum Beispiel die deutschen Bücher schlecht bewertet und entsprechend seine Rezension dazu geschrieben: https://www.amazon.de/gp/profile/amzn1. ... tm?ie=UTF8
Könntet ihr das so bestätigen? Ist englische Literatur der deutschen vorzuziehen? Betrifft es die Literatur von Python genauso und hättet ihr Tipps für mich, wie ich mir Python gut beibringen kann bzw. bessere Literatur finden kann?


Zurück zu meinem gekauften Buch: ich bin jetzt beim Kapitel 2 "Variablen" und hab mir zu jedem Beispiel im Buch den entsprechenden Quellcode als eine zip Datei runtergeladen, welches von dem Autor frei zur Verfügung gestellt wurde. Jedoch bekomme ich bei dem Beispiel 2.5 einen Fehler und es funktioniert nicht (im Buch wird die Ausgabe jedoch angezeigt):

Quellcode:

# Beispiel 2.4
#
# Konvertierung von Datentypen - korrigierte Version
#
dollarkurs = input("Bitte aktuellen Dollarkurs eingeben: ")
kapital_in_euro = input("Bitte Kapital in Euro eingeben: ")

kapital_in_dollar = float(kapital_in_euro) * float(dollarkurs)

print(kapital_in_euro, "€ entsprechen", kapital_in_dollar, "$")


Fehler:
C:\Users\iljar\Desktop\Python\venv\Scripts\python.exe "C:\Program Files\JetBrains\PyCharm Community Edition 2020.2.3\plugins\python-ce\helpers\pydev\pydevd.py" --multiproc --qt-support=auto --client 127.0.0.1 --port 56136 --file "C:/Users/iljar/Desktop/pythonProject1/Beispiele/Kapitel 2/Beispiel_2_4.py"

pydev debugger: process 15008 is connecting
Connected to pydev debugger (build 202.7660.27)
Bitte aktuellen Dollarkurs eingeben:

>?

Was ist denn da passiert?
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Wunderkind89: Welcher Fehler? Das Programm läuft einwandfrei.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Wunderkind89
User
Beiträge: 66
Registriert: Sonntag 15. November 2020, 01:28

Ich glaube es lag an den Sonderzeichen, wie Euro und Dollar und dass ich statt 1.21 fälschlicherweise 1,21 eingegeben habe für den Dollarkurs. Aber selbst wenn ich es richtig eingebe kommt bei mir zwar die richtige Ausgabe, aber mit einer Meldung:


pydev debugger: process 18400 is connecting

Connected to pydev debugger (build 202.7660.27)
Bitte aktuellen Dollarkurs eingeben: Bitte Kapital in Euro eingeben: 100 € entsprechen 121.0 $

Ich bin zwar ein Neuling aber ich frag mich, ob das so sinnvoll ist einen Sting in ein float zu casten, welche Risiken da bestehen und ob es nicht bessere Alternativen gibt. Anscheinend liefert mir input() einen string zurück und ich versuche aus dem string irgendwelche Zahlen rauszukriegen, indem ich eine Datentypumwandlung mache. Jetzt frage ich mich, was wohl passiert, wenn da keine Zahlen stehen, dann wird versucht aus den Buchstaben einen float zu casten. Ai ai ai

Alles so im Rahmen oder würdet ihr als erfahrene Entwickler da auf den Autor schimpfen?

Zusatz:

Der Autor macht Unterschied zwischen Variablen in c++ und Python und sagt folgendes:

"Wenn c++ eine Variable erzeugt wird, dann wird im Arbeitsspeicher dafür der nötige Platz reserviert. Sobald der Variablen ein Wert zugewiesen wird, dann wird dieser in den zuvor reservierten Speicher geschrieben [...]" Bei Python hingegen "wird der Speicherplatz nicht reserviert und Werte werden nicht kopiert, was intern stattfindet ist eine Namensbindung, somit handelt es sich in Python NICHT um Variablen sondern um Namen"
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Wunderkind89: Zu Büchern generell: Da gilt mittlerweile das gleiche wie für's Internet: So gut wieder jeder kann seine Sicht der Dinge über Internetseiten wie über Bücher anbieten, nahezu egal wie der Wissensstand ist.

Ein typisches Phänomen bei Büchern zu Programmiersprachen sind Autoren die schon ein oder mehrere Bücher über Programmiersprachen geschrieben haben, sich umschauen welche Programmiersprachen gerade ”in” sind (Python hat ja Java gerade auf dem TIOBE-Index überholt und ist nun auf Platz zwei) und sich dann hinsetzen die In-Sprache schnell überfliegen, und ein Buch dazu schreiben. Und das mit nahezu Null praktischer Erfahrung mit der Sprache und/oder mit der ”Kultur” in der Community. Und vielleicht sogar noch schlimmer, mit Erfahrung in anderen Programmiersprachen, wo sie dann Konventionen und Vorgehensweisen im neuen Buch übernehmen, die auf die neue Sprache nicht zutreffen.

Ich würde das nicht als „casten“ bezeichnen, das könnte dann aber an meiner Vorbelastung aus der Programmiersprache C kommen, wo „casten“ in den meisten Fällen meint, das der gleiche Speicherinhalt anders interpretiert werden soll ohne ihn zu verändern. `float()` dagegen erzeugt bei einer Zeichenketten als Argument ein neues Objekt also neuen Inhalt an anderer Stelle im Speicher. Ein C++-Programmierer mag den Begriff „casten“ nicht so strikt sehen. Letztlich ist es aber ein sehr spezifischer Fachbegriff der in Python IMHO nichts zu suchen hat. In Python würde ich sagen `float()` konvertiert eine Zeichenkette in eine Gleitkommazahl. Und schon braucht man niemandem den Begriff „casten“ erklären. 🙂

Letztlich *muss* man die eingegebene Zeichenkette in eine Gleitkommazahl wandeln, denn sonst kann man damit ja nicht rechnen. Was Fehleingaben angeht: Ja, da sollte man sich drum kümmern. Ob das an der Stelle im Buch schlecht ist, hängt davon ab wo es vorkommt. Um das sauber zu lösen würde man ja die Ausnahme behandeln die Auftritt wenn ein ungültiger Wert eingegeben wird. Und zumindest negative Dollarkurse wird man wohl auch abfangen wollen. Und eigentlich auch, und der Fehler wird wahrscheinlich in sehr vielen, auch professionellen Programmen existieren, Unendlich und „not a number“. Da denken sowohl Programmierer als auch Benutzer oft nicht dran.

Die Aussage das Python keine Variablen hat finde ich schräg. Die Python-Dokumentation spricht von Variablen. Für mich ist eine Variable in einer imperativen Programmiersprache ein Name ein Wert und ein Ort im Speicher. Das haben sowohl Python als auch C++. Der Unterschied ist, das in Python der Speicherort zum Wert gehört, während bei C++ Name und Speicherort zueinander gehören.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Bei Variablen und Namen ist es manchmal für Umsteiger von anderen Programmiersprachen schwierig, da die immer ihre Zeiger und Referenzen suchen. Vermutlich wollte der Autor denen direkt ein anderes Verhalten von Python klar machen. Ich empfehle da Ned Batchelders Artikel "Facts and myths about Python names and values"
Wunderkind89
User
Beiträge: 66
Registriert: Sonntag 15. November 2020, 01:28

__blackjack__ hat geschrieben: Dienstag 24. November 2020, 13:23 Die Aussage das Python keine Variablen hat finde ich schräg. Die Python-Dokumentation spricht von Variablen. Für mich ist eine Variable in einer imperativen Programmiersprache ein Name ein Wert und ein Ort im Speicher. Das haben sowohl Python als auch C++. Der Unterschied ist, das in Python der Speicherort zum Wert gehört, während bei C++ Name und Speicherort zueinander gehören.
Der Autor schreibt dazu folgendes (Zitat):

"Da es sich bei Python um eine dynamisch typisierte Sprache handelt, muss beim Erzeugen einer Variablen der Datentyp nicht explizit angegeben werden. Dieser wird zur Laufzeit automatisch bestimmt. Im Gegensatz zu vielen anderen Sprachen wird in Python nicht für jede Variable ein neuer Speicher reserviert, in den der gewünschte Wert hineingeschrieben wird. Stattdessen wird intern eine Namensbindung vorgenommen. Der zugewiesene Wert kann also über den gewählten Namen referenziert werden. Eine solche Zuweisung findet immer mit dem = Operator statt".

Ich bin noch am Anfang des Buches und arbeite jeden Tag ein Kapitel durch (bin jetzt mit Kapitel 2 zu Ende) und bis jetzt waren die Aufgeben nicht schwer, da ich im Studium c++ gelernt habe, sehe ich viele Ähnlichkeiten (aber auch c++ muss irgendwann später gefestigt werden).

Danke für eure Antworten ;)

ein Autor mit langjähriger Erfahrung in der jeweiligen Sprache (vor allem beruflich) wäre mir lieber, als jemand, der nur nach dem Trend die Bücher schriebt.
Wunderkind89
User
Beiträge: 66
Registriert: Sonntag 15. November 2020, 01:28

Was mir noch aufgefallen ist, dass der Autor folgendes macht:

wert = 0.0
wert += 0.1
wert += 0.1
wer += 0.1

print(wert)

Ausgabe 0.300000...004

Seine Begründung für das Ergebnis: es ist die Art und Weise, wie Fließkommazahlen vom Prozessor in Deinem Computer repräsentiert werden. Jede Fließkommazahl wird als 64 Bit Wert gespeichert (ist das tatsächlich so?) und kann somit nicht beliebig genau sein. Darauffolgend bringt er ein Beispiel mit 1/3 was je nach Genauigkeit 0.3 ; 0.33 usw. sein kann.

Wie kommt die 4 am Ende zur Stande? Darauf geht er nicht ein und was heißt "nicht beliebig genau", wie ungenau ist das Ganze? Irgendwie zu schwammig an der Stelle.
Es kann sein, dass ich mich zu sehr im Detail verliere und erstmal nicht so kritisch an die Sache rangehen soll.

Grüße
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Aus der Perspektive eines allgemein gehaltenen Buches zur Programmierung reicht IMHO der Hinweis darauf, dass dem so ist. Wenn du darüber mehr wissen willst, kannst du da beliebig tief eintauchen - der Standard IEEE754 beschreibt all das.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich kannte das Buch bisher nicht, aber es macht auf mich einen recht soliden Eindruck.

Hier kann man eine Leseprobe als PDF herunterladen, Rezensionen zum Buch lesen und unter "Extras" sogar die ganzen Programm-Beispiele als ZIP-Archiv herunterladen:

https://www.hanser-fachbuch.de/buch/Pyt ... 3446454699

Ich finde, du solltest dem Buch eine Chance geben. Dass Python bei Floats anstatt eines Kommas die englische Schreibweise mit einem Punkt erwartet, hätte man vielleicht erwähnen können, wenn man schon in der Einleitung davon spricht, dass man anfängerfreundlich sein will. Das ist aber nicht so gravierend. Und wo du doch von der selbst behauptest, bereits Erfahrung in C++ zu haben, müsste dir das an sich auch nicht fremd sein. ;)

EDIT:
Hui, sogar PEP8 hat ein eigenes Unterkapitel gekriegt. *DaumenHochSmiley

Aber der Abschnitt zu Klassen ist leider recht knapp gehalten und finde die Beispiele auch nicht so gut. Da bräuchte man dann nochmal ein eigenes Buch, falls man tiefer eintauchen will in OOP (was definitiv zu empfehlen ist, wenn größere Projekte beherrschbar bleiben sollen).
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Wunderkind89: Das mit der Namensbindung ist nicht nur in Python so. Und auch nicht nur in statisch typisierten Programmiersprachen. In Java und C# sieht das grundsätzlich nicht viel anders aus. Da werden Objekte bei Zuweisung auch nicht in neu angeforderten Speicher kopiert, sondern der Name an den zugewiesen wird, referenziert das zugewiesene Objekt.

Nach Lektüre der Leseprobe scheint das kein schlechtes Buch zu sein. Für absolute Anfänger finde ich das manchmal unschön wenn Vergleiche mit anderen Sprachen gezogen werden, weil die der Anfänger ja gar nicht kennt und damit Vergleiche nicht richtig einordnen kann und die eventuell sogar mehr verwirren. Aber in diesem Fall kommt der Autor und Wunderkind89 von C++, da kann das natürlich nützlich sein.

Komisch finde ich bei Kapitel 1.2 „Dieses Buch bricht mit einigen Konventionen!“, dass der Autor meint mit Konventionen zu brechen wenn er nicht mit OOP anfängt. Jedenfalls keine Python-Konventionen, weil da eigentlich alle Bücher und Tutorials die sich an Anfänger richten, genau wie das Tutorial in der Python-Dokumentationen, mit den Grunddatentypen, Shell als Taschenrechner/Ausdrücke, Programmfluss mit Verzweigungen und Schleifen, und Funktionen anfangen, bevor die erste Klasse kommt. Ich finde die Folge der Themen in dem Buch ist sehr konventionell. Was ich auch gut finde, denn die Themen bauen ja aufeinander auf. Vor Klassen sollte man Funktionen verstanden haben.

Bei Kapitel 1.9 „Interpreter vs. Compiler“ habe ich die üblichen Bauchschmerzen wenn Leute versuchen das so hart zu trennen und diese Eigenschaft(en) so stark Sprachen zuordnen. Der Autor vermeidet beim Schritt von Python-Quelltext zu Bytecode anscheinend bewusst das Wort „kompilieren“, obwohl es ja genau das ist, weil damit diese scharfe Trennung zwischen kompiliert vs. interpretiert die er da beschreibt, nicht mehr aufrecht erhalten bleiben kann. Und PyPy wird auch nicht erwähnt. Oder das Maschinensprache auf modernen Prozessoren zum Teil auch noch mal von Microcode interpretiert wird.

C- und C++-Programme sind in der Regel auch nicht wie behauptet eigentständig lauffähig, der Benutzer merkt bloss nichts davon, dass die auch eine Laufzeit- und Standardbibliothek haben, weil die bereits installiert ist/mitinstalliert wird. Wenn Python-Installationen genau so verbreitet wären, sähen Python-Programme genaus so ”selbständig” lauffähig aus.

Der einzig wirklich negative Punkt in der Leseprobe ist IMHO der Tipp, dass man Code auch mal mit """ oder ''' als literale Zeichenketten auskommentieren kann.

Anmerkungen Beispielquelltexte zum Thema OOP:

Es werden Properties gezeigt, allerdings nicht als Dekoratoren sondern mit Aufruf von `property()` nachdem die Zugriffsmethode(n) definiert wurde(n). Das hat doch in Python 2.7 schon keiner mehr gemacht.

Als Klassenattribute werden Konstanten gezeigt, aber klein geschrieben.

Beispiel 5.15 zeigt zwar syntaktisch eine Mehrfachvererbung in dem `Smartphone` von `Telefon`, `Kamera`, und `Taschenrechner` erbt, aber das ist IMHO ziemlich eindeutig ein Fall für Komposition und nicht für Vererbung.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
steveO_O
User
Beiträge: 22
Registriert: Montag 23. März 2020, 20:08

Habe das Buch gestern erhalten und in der kurzen Zeit schon 50 Seiten gelesen, liest sich wunderbar runter! Dickes Lob an Heiko! Bis jetzt war alles verständlich und toll aufbereitet. Eventuell ergänze ich diesen Kommentar wenn ich mal weiter fortgeschritten bin.
steveO_O
User
Beiträge: 22
Registriert: Montag 23. März 2020, 20:08

Von den fast 500 Seiten habe ich ca. 350 gelesen. Und das in ca. einem Monat. Ich finde das Buch SEHR gut, insbesondere für Anfänger wird alles verständlich erklärt. Habe zwar keinen Vergleich zu anderen Büchern, aber das kann aus meiner Sicht nur schwer getoppt werden. Werde das Buch definitiv behalten und noch oft zum Nachschlagen verwenden.

Das Minecraft-Kapitel bringt mir persönlich wenig, da ich da kein Interesse habe. Aber das ist ok. Das zugehörige Thema Raspberry Pi dagegen könnte für mich irgendwann einmal interessant werden.

Für Profis wird das Buch eher nichs sein, aber das sagt ja schon der Untertitel "Einsteigen und durchstarten" und genau das geschieht so gut, dass man ohne Motivationsverlust bei der Sache bleibt. Danke Heiko!
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

__blackjack__ hat geschrieben: Dienstag 24. November 2020, 13:23 Die Aussage, dass Python keine Variablen hat finde ich schräg. Die Python-Dokumentation spricht von Variablen. Für mich ist eine Variable in einer imperativen Programmiersprache ein Name ein Wert und ein Ort im Speicher. Das haben sowohl Python als auch C++. Der Unterschied ist, das in Python der Speicherort zum Wert gehört, während bei C++ Name und Speicherort zueinander gehören.
Das war noch nie einfach zu erklären und die Tatsache, dass in der Python-Dokumentation von Variablen die Rede ist, verbessert die Situation nicht.
Wenigstens ist die Exception richtig: NameError
Diejenigen, die das implementiert haben, haben sich auch dabei bestimmt etwas gedacht.
Hätte auch VariableError heißen können.

Nach einem VariableError suche ich aber noch...
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DeaD_EyE: Verstehe die Aussage jetzt nicht. Variable und Name sind nicht das gleiche. Eine Variable ist mehr. Die hat einen Namen und einen Wert (und einen Speicherort). Und es gibt so etwas in Python, die Einheit von Name, Wert, und Speicherort, also gibt es Variablen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

__blackjack__ hat geschrieben: Dienstag 24. November 2020, 13:23 Für mich ist eine Variable in einer imperativen Programmiersprache ein Name ein Wert und ein Ort im Speicher. Das haben sowohl Python als auch C++. Der Unterschied ist, das in Python der Speicherort zum Wert gehört, während bei C++ Name und Speicherort zueinander gehören.
Das eine Variable aus einem Namen und einem Ort im Speicher besteht ist für mich nachvollziehbar aber einem Wert? Zumindest in C++ und Rust kann ich Werte ja von einer Variablen zu einer anderen bewegen, damit ist für mich der Wert von der Variable und die Variable vom Wert unabhängig. Zugegeben eine Variable an dessen Speicherort kein Wert liegt ist nicht valide aber trotzdem ist es für mich noch klar als Variable erkennbar.

Gerade weil bei Python Wert und Speicherort gekoppelt und unabhängig vom Namen sind, denke ich schon dass man sagen dass es Variablen in Python nicht gibt, zumindest nicht in der gleichen Form die C/C++ oder Rust haben.

In Python könnte man allerdings vielleicht Variablen als Name und +1 im Referenzzähler definieren, also Variablen als Referenzen die einen Namen haben. Welche sich unterscheiden von Referenzen innerhalb einer Liste oder Namen die Parameter (und anders als Argumente keine Referenz) sind.
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Auch in C++ und Rust gehört zum Konzept Variable auch ein Wert. Der kann halt auch undefiniert sein. In Python übrigens auch: lokale Variablen ”existieren” durch den Compiler, haben aber erst einen Wert wenn ihnen einer zugewiesen wird.

Ich komme bei der Betrachtung vom Compilerbau wo ich das so gelernt habe das zum Konzept Variable Name, Typ, Speicherplatz, und Wert gehören. Das sind die Sachen die man bei der Implementierung einer Programmiersprache ganz allgemein irgendwie zusammenbringen muss. Und welche Sachen davon jetzt zusammen gehören, also ob Typ und/oder Speicherplatz jetzt zum Namen oder zum Wert gehören, ist von der Programmiersprache abhängig. Also ja, Python macht das anders als C, aber es sind trotzdem diese Komponenten über die man reden muss, wenn man über Variablen redet.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten