Index out of Range, was mach ich falsch?

Fragen zu Tkinter.
Benutzeravatar
Chrisu
User
Beiträge: 11
Registriert: Sonntag 13. September 2020, 09:05

Hy Leute!

Ich stehe bei meinem Python Grundkursbuch grade in einer tkinker Aufgabe/Lernprojekt [Wiederwissens habe ich mich einfach mal daran versucht, obwohl ich dafür eigentlich noch zu wenig Verständnis habe .. Neugierde halt] mächtig an, ich bekomme den Index out of Range Fehler einfach nicht weg (Denkfehler?)

Kurze Beschreibung:

Auto Händler-Tool

4 Buttons:

Sortiment Listen (.txt anzeigen)
Fahrzeug verkaufen (aus .txt entfernen)
Fahrzeug hinzufügen (zu .txt hinzufügen)
Preis ändern (letzte Zeile in .txt ändern)

Sieht so aus:

Bild

Es arbeiten 3 Klassen bzw Module so wie es sein soll, nur das herauslöschen aus der Liste ('Verkaufen') nicht, da bekomme ich stets diesen Indexfehler,
wenn ich die richtige Artikelnummer eintippe UND er löscht mir die ganze Textdatei.
Gebe ich die falsche Nummer ein, komme ich (wie gewollt) in den 'else' Block und er zeigt mir die Fehler Meldung im Programm an.


Code: Alles auswählen

from tkinter import *


class Verkaufen(Button):
    def verkaufen(self):
        class MyButton(Button):
            def aktion(self):
                artnr = eingabe1.get()
                f = open('dateien\sortiment.txt', 'r')
                liste = f.readlines()
                f.close()
                geloescht = False
                for i in range(len(liste)): # Schleife zum durchlaufen der Eingegeben ArtNr
                    if liste[i] == artnr + '\n':    
                        f = open('dateien\sortiment.txt', 'w') 
                        liste = liste[:i] + liste[i + 6:]
                        for linie in liste:
                            f.write(linie)
                            geloescht = True
                            break
                f.close()
                fenster.destroy()
                if geloescht:
                    fenster2 = Tk()
                    fenster2.geometry("300x100")
                    fenster2.title('Auto erfolgreich verkauft!')
                    rahmen2 = Frame(fenster2, relief="ridge", borderwidth=5)
                    rahmen2.pack(fill="both", expand=1)
                    label2 = Label(rahmen2, text="Auto aus dem Sortiment entfernt!")
                    label2.pack(expand=1)
                    button2 = Button(rahmen2, text="OK", command=fenster2.destroy)
                    button2.pack(side="bottom", pady=5)
                    fenster2.mainloop()
                else:
                    fenster2 = Tk()
                    fenster2.geometry("300x100")
                    fenster2.title("Warnung!")
                    rahmen2 = Frame(fenster2, relief="ridge", borderwidth=5)
                    rahmen2.pack(fill="both", expand=1)
                    label2 = Label(rahmen2, text="Artikelnummer nicht gefunden!")
                    label2.pack(expand=1)
                    button2 = Button(rahmen2, text="OK", command=fenster2.destroy)
                    button2.pack(side="bottom", pady=5)
                    fenster2.mainloop()

        fenster = Tk()  # Fenster erstellen
        fenster.geometry("500x400")  # Fenstergrösse
        fenster.title("Fahrzeug löschen")  # Fenstertitel
        rahmen = Frame(fenster, relief="ridge", borderwidth=5)  # Fensterrahmen
        rahmen.pack(fill="both", expand=1)  # Fensterrahmen ins Fenster packen
        label = Label(rahmen, text="Welches Auto möchten Sie verkaufen?")  # Label mit Titel
        label.config(font=("Arial", 14, "bold"))  # Labelschriftart/Stil
        label.place(x=50, y=10)  # Labelposition

        label1 = Label(rahmen,
                       text="Artikelnummer:")  # Label zum Eingeben der Artikelnr. zum späteren löschen erstellen
        label1.place(x=100, y=100) 
        eingabe1 = Entry(rahmen, bd=2, width=22)
        eingabe1.place(x=200, y=100)

        button = MyButton(rahmen, text="Eingabe") 
        button["command"] = button.aktion
        button.place(x=180, y=220)
        fenster.mainloop()
Das wäre der Fehler dazu:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python38\lib\tkinter\__init__.py", line 1883, in __call__
    return self.func(*args)
  File "C:\Users\chris\Desktop\python_work\verkaufen.py", line 14, in aktion
    if liste[i] == artnr + '\n':    
IndexError: list index out of range
(Zeile 14 ist der -- if liste --- Block in der for-Schleife)


Habt ihr ne Idee dazu und könnt mir so vom 'Profiblick' da drauf erklären wo es happert :D , oder braucht ihr dazu den ganzen Code mit den 4 Modulen?

Danke euch schonmal ganz nett!!


Lg Chris
Benutzeravatar
sparrow
User
Beiträge: 4213
Registriert: Freitag 17. April 2009, 10:28

Zu deinem Fehler: Du versuchst per Index-Zugriff auf eine Element der Liste "liste" zuzugreifen, das nicht das ist.

Aber ganz ehrlich: Wenn du aus irgend einem Buch gelernt hast, so Code zu schreiben, dann werf es weg.

In Python iteriert man nicht mit einer Laufvariablen über die Elemente einer Liste, denn man kann direkt über die Elemente iterieren.

Und was soll denn die Klassendifinition von "MyButton" (ganz schlechte Namensgebung) innerhalb einer Funktion der Klasse "Verkaufen"?

Du musst dich, bevor du anfängst über GUIs nachzudenken, erst einmal mit den Grundlagen vertraut machen. Und dann mit objektorientierter Programmierung.
Benutzeravatar
__blackjack__
User
Beiträge: 13157
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei `Verkaufen` auch noch von `Button` abgeleitet ist und nur eine Methode `verkaufen()` besitzt und das steckt auch noch in einem eigenen Modul `verkaufen`. Das macht alles so gar keinen Sinn.

Zudem werden an mehreren Stellen `Tk`-Objekte erstellt — das ist *das* Hauptfenster. Davon darf es nur *ein* Exemplar geben, sonst können komische Dinge passieren. Falls man zusätzliche Fenster benötigt, nimmt man `Toplevel`. Für einfache Fenster mit Nachrichten (Info, Warnung, Fehler) gibt es schon etwas fertiges in `tkinter.messagebox`. Für simple Fragen nach Zahlen oder Zeichenketten gibt es Funktionen in `tkinter.simpledialog`. Und eine `Dialog`-Klasse falls man sich selbst einen modalen Dialog basteln möchte, der mehr enthält als nur einen Text und ein Eingabefeld + Schaltflächen für Ok und Abbrechen.

`place()` verwendet man nicht. `pack()` kennst Du ja bereits. Und es gäbe noch `grid()`. Darf man nicht im gleichen Container-Widget mischen, aber man kann `Frame`s verschachteln und in jedem entscheiden was man da für die Anordnung verwendet.

Sternchen-Importe sind Böse™. Da holt man sich gerade bei `tkinter` fast 200 Namen ins Modul von denen nur ein kleiner Bruchteil verwendet wird. Auch Namen die gar nicht in `tkinter` definiert werden, sondern ihrerseits von woanders importiert werden. Das macht Programme unnötig unübersichtlicher und fehleranfälliger und es besteht die Gefahr von Namenskollisionen.

Der Code der das Auto aus dem Bestand nimmt hat nichts im GUI-Code zu suchen. Man trennt Programmlogik und GUI.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Benutzeravatar
Chrisu
User
Beiträge: 11
Registriert: Sonntag 13. September 2020, 09:05

Guten Morgen!

Danke für eure Infos!
Mich schockt das jetzt ehrlich gesagt etwas. Ich hab mich da richtig dran gehalten und mein (Halb-)Basiswissen darauf aufgebaut... Wie kann man ein Buch entwerfen, dass für Anfänger sein soll, wenn dann so ein Mist drinnen verzapft wird der in echt nicht mal so angewandt wird... Kotzt mich gerade tierisch an.

Bild
Sirius3
User
Beiträge: 17778
Registriert: Sonntag 21. Oktober 2012, 17:20

Es gibt kein Buch über Programmieren, das einem alles erklärt, und wenn man mit den Grundlagen anfängt und dann etwas komplexeres programmiert, wird man irgendwann an eine Grenze stoßen, wo tieferes Wissen über Programmierung im Allgemeinen und der Sprache im Speziellen nötig ist. Python ist eine schwierig zu erlernende Sprache, weil man so vieles machen kann, was man aber nicht darf.
Dass der Autor Python nicht richtig verstanden hat, zeigt er schon im Vorwort:
In vielen Programmiersprachen ist es notwendig, die Variablen zunächst zu deklarieren und ihnen einen festen Datentyp zuzuweisen. [...]. Vergessene Variablendeklarationen und inkompatible Typen stellen dabei eine häufige Fehlerquelle dar.
Soweit so richtig. Im nächsten Satz geht er aber in die falsche Richtung:
Da Python auf die Deklaration der Variablen verzichtet und den Typ dynamisch vergibt – weshalb es innerhalb des Programms problemlos möglich ist, ihn zu verändern – fällt diese bei dieser Programmiersprache jedoch weg.
Dass man in Python keine Deklaration braucht vereinfacht nur das Programmieren. Man spart sich viel Schreib- (und Lese-)arbeit. Und obwohl man es kann, darf man keine verschiedenen Typen an die selbe Variable binden. Das führt nur zu schwer zu lokalisierenden Fehlern und macht das Programm unverständlich. Und damit fällt auch nicht die Fehlerquelle weg: inkompatible Typen gibt es immer noch, das ist aber eine Sache der Programmlogik und nicht der Syntax.

Das nächste Problem, das viele Bücher haben, obwohl es sich nur um eine Kleinigkeit handelt, ist, dass sie sich nicht an Konventionen halten. Das ist so, als ob der Fahrlehrer nicht sagt, dass man rechts fahren sollte. Es gibt Bücher die fahren konsequent links, weil sie aus einem anderen Land (äh Programmiersprache) kommen. Die meisten aber kreuz und quer. Das geht so lange gut, solange man alleine auf der Straße ist. Konventionen sind das selbe, die die Rechtschreibung, und jedes Buch wird auf korrekte Rechtschreibung gegengelesen. Für Programmcode gilt dies aber scheinbar nicht.
Man muß nur schauen, welche Bücher der Autor noch geschrieben hat, und merkt sofort, ein Pythonexperte ist der nicht. Das ist jetzt nur ein halber Vorwurf an den Autor, weil ich weiß aus eigener Erfahrung, dass Bücherschreiben ein großer Aufwand ist und dazu noch äußerst schlecht bezahlt. Aber Bücher am Fließband zu produzieren liefert halt die entsprechende Qualität, und die merkt man dem Werk auch an.

Nichtsdestotrotz, man kann mit Büchern Programmieren lernen, man muß sich nur bewußt sein, dass vieles nicht erklärt wird und einiges falsch ist. Da hilft nur, viel selbst programmieren, aus den eigenen Fehlern lernen und viel Code von Leuten lesen. Und flexibel sein.
Sirius3
User
Beiträge: 17778
Registriert: Sonntag 21. Oktober 2012, 17:20

So jetzt habe ich mich für den Newsletter registriert um an den Beispielcode im Buch zu kommen, und ja, es ist schlimm.
Wenn Du jemals gelernt hast, dass `eval` etwas ist, was man verwenden könnte, merk Dir, "nein, eval darf nicht verwendet werden!"
Der Autor schafft es tatsächlich, im selben Buch mal mit 2, 3 oder 4 Leerzeichen pro Ebene einzurücken.
Bei der Auto-Klasse werden dann wirklich kryptische Variablennamen benutzt. Auch etwas, was man als Anfänger sofort lernen sollte, aber als Buchautor einfach konsequent durchziehen muß, benutze keine Abkürzungen.
Aus dem Kapitel 11.5 sehe ich dann wieder, dass der Autor eigentlich Java programmieren möchte (Code). Falls da irgendetwas über Private Attribute und doppelte Unterstriche steht, und triviale Setter und Getter verwendet werden. Alles Quatsch. Darf man als Anfänger erst gar nicht lernen.
In Kapitel 13 (Code) sieht man dann, dass bisher noch nichts über Listen im Buch gelernt hat. Wenn man einen Index in eine Liste braucht, dann hat man Python noch nicht verstanden.
Weil dieser Code besonders schrecklich ist, hier mal die Aufgeräumte Variante:

Code: Alles auswählen

class Auto:
    """
    Erstellt das Objekt Auto für einen Gebrauchtwagenhändler.
    """ 
    def __init__(self, marke, modell, baujahr, preis):
        """
        Initialisiert ein neues Objekt Auto
        Argumente:
        *    Marke (string): Marke des Gebrauchtwagens
        *    Modell (string): Modell des Gebrauchtwagens
        *    Baujahr (int): Baujahr des Fahrzeugs
        *    Preis (int): Angestrebter Verkaufspreis
        """
        self.marke = marke
        self.modell = modell
        self.baujahr = baujahr
        self._preis = preis

    @property
    def preis(self):
        return self._preis
    
    @preis.setter
    def preis(self, neuer_preis):
        """
        Ändert den Preis des Autos
        """
        @TODO: eine interaktive Abfrage hat nichts in der Klasse zu suchen
        if abs(self._preis - neuer_preis) >= self._preis * 0.05:
            print("Die Abweichung zum vorherigen Preis ist sehr groß.") 
            bestaetigung = input(f"Soll {neuer_preis} als neuer Preis"
                                "festgelegt werden? (ja/nein)")
            if bestaetigung != "ja":
                print("Alter Preis wird beibehalten")
                return
        self._preis = neuer_preis

autos = []
with open(r'dateien\sortiment.txt', encoding="utf8") as sortiment_file:
    while True:
        try:
            marke, modell, baujahr, preis, _ = islice(sortiment_file, 5)
        except ValueError:
            # end of file
            break
        autos.append(Auto(marke, modell, baujahr, preis))
for auto in autos:
    print(auto.marke) 
    print(auto.modell) 
    print(auto.baujahr) 
    print(auto.preis)
    print()
Das Lesen der Datei ist unschön, weil das Dateiformat unschön ist.

In Kapitel werden dann munter Klassen definiert, die aber nur aus einer Methode bestehen, keinen Zustand haben und damit völlig unsinnig sind, weil trotzdem alles über globale Variablen gelöst wird.
Und dieser Quatsch mit den in Methoden verschachtelten Klassendefinitionen kommt tatsächlich aus einem Buch!
Da würde mich jetzt interessieren, wie das da erklärt wird.
Benutzeravatar
__blackjack__
User
Beiträge: 13157
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wir haben dieses Buch, und Aufgaben daraus, ja schon an anderer Stelle hier im Forum. Habe gerade eine Lösung für die gleiche Aufgabe aber mit `print()` und `input()` statt GUI, und in echtem Python hier gepostet: viewtopic.php?f=1&t=49707#p374395

So richtig schlimm finde ich, dass der Autor nicht nur kein Python kann, sondern grundsätzlich nicht programmieren kann. Denn diese Entwürfe sind ja auch kein als Python verkleidetes Java oder so, die wären auch in jeder anderen objektorientierten Programmiersprache falsch und gruselig. Bei Java würde einen der Compiler zwar noch davor retten eine Klasse innerhalb einer Methode zu definieren, aber ansonsten würde man auch dort nicht von GUI-Elementen wie Schaltflächen ableiten um die dahinter liegende Funktionalität zu implementieren. Ich habe bisher erst *ein* Rahmenwerk erlebt wo das so vorgesehen war, und das war 💩. Das erste was ich da gemacht habe war *eine* Klasse von der Schaltfläche abzuleiten deren Aktion der Aufruf einer Rückruffunktion war die man bei der Initialisierung übergeben hat, damit man das ”normal” verwenden konnte.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Benutzeravatar
Chrisu
User
Beiträge: 11
Registriert: Sonntag 13. September 2020, 09:05

Danke für eure tollen Hinweise. Super. Echt super. Da entschließt du dich vor 2 Monaten neben Arbeit, Familie und Hobby das lang ersehnte Programmieren zu lernen um evtl doch noch einmal im Leben einen neuen Zweitg einschlagen zu können, der mit persönlichen Interessen verbunden ist und dan suchst du dir von unzähligen Nachschlagewerken genau das falsche raus.
Toll. Echt toll.

Was sagt ihr zu dem Schinken hier? (Kann das gerne auch mal reinstellen, wenn erlaubt - gabs mal als Free Download irgendwo glaub ich...)

Bild


Ist das auch schon bekannt zufällig?
Ich kenne auch die Tutorial-Reihe von Morpheus auf Youtube aber ich tue mich mit Nachschlagewerken eher leichter als mit Videos.

eval() (so stehts zumindest im Buch) ist dafür da um .. moment habs in meiner Lerndatei gespeichert :

Code: Alles auswählen

eval()	# Liest das Eingegebene (z.b. 'input') unter den passenden Datentyp str/int/float/bool 

Wisst ihr was? Dan lass ich dieses 'Projekt' hier sein und hoffe mein Glück bei einem kompetenteren Autos zu finden .
Wie habt ihr Programmieren gelernt? Also die Do-it-Yourself Methoden ohne Schule/Kurse.

Mir ist nur eins klar: Ich möchte das unbedingt erlernen! Mir wäre nicht mal eine berufliche Veränderung am wichtigsten .. ich möchte einfach noch einen Schritt weiter gehen im Leben ;)


Danke euch vielmals für die vielen Infos und Ratschläge!!


Chris
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es war eine andere Zeit, aber ich war Autodidakt auf einem ATARI ST und dann AMIGA. Mich hat motiviert ein Demo/Intro programmieren zu koennen. Darauf habe ich hingearbeitet, unterstuetzt durch ein paar Schnipsel aus Zeitschriften wie der 68'000er oder dem AMIGA-Magazin, in denen die ein oder andere Grundlage erklaert wurde. Letztlich war es eben einfach stundenlang, tagelang, wochenlang gegen die Wand rennen. Was etwas einfacher ist, wenn man 14 ist.

Mein Vorgehen war damals abtippen von Dingen aus der Zeitung, und es wenig verstehen. Tippen musst du nicht mehr, nur runterklauben von github. Und dann zu versuchen, etwas am Code zum eigenen besseren zu aendern. Hat eine Weile gedauert, bis es ausreichend klick gemacht hat.

Fuer Python wuerde ich dir raten das Python-eigene Tutorial durchzuarbeiten, und dann wirklich Augenmerk auf Datenstrukturen zu legen. Zu verstehen, was die fundemantalen Eigenschaften von Listen vs Woerterbuechern sind, und wie man mit denen umgeht, ist mE immens wichtig.
Sirius3
User
Beiträge: 17778
Registriert: Sonntag 21. Oktober 2012, 17:20

@Chrisu: die meisten Bücher sind schlecht und es wird viel Zeugs gezeigt, was man so nicht machen würde, aber irgendwo muß man ja anfangen. Das wichtigste ist, selbst was zu programmieren und dann jemanden, der sich damit auskennt zu fragen. Programmieren lernt man ja nicht von heute auf morgen, und auch wenn man das Anfängerniveau gelernt hat, kann man noch nicht alles, und auch ein Profi lernt jeden zweiten Tag etwas neues.
Dass wir hier jedes Buch zerreißen heißt nicht, dass man damit nicht etwas lernen kann, man muß sich nur bewußt sein, dass jemand kommt und sagt, dass es besser geht.
Benutzeravatar
__blackjack__
User
Beiträge: 13157
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Chrisu: Der Kommentar greift ein bisschen zu kurz: Wenn `eval()` eine Zeichenkette als Argument bekommt, dann muss die einen beliebigen gültigen Python-Ausdruck enthalten, der dann ausgewertet wird. Also alles was man hier ``name = <expression>`` in Python-Quelltext für den Platzhalter <expression> schreiben könnte, kann man auch `eval()` präsentieren. Das wird (ohne weitere Argumente) in dem Kontext ausgeführt in dem es steht. Wenn das also in einer Funktion steht in der es einen lokalen Namen `x` mit dem Wert 41 gibt, kann man ``print(eval("x + 1"))`` ausführen und würde 42 ausgegeben.

Warum man `eval()` nicht verwendet: Der Code der das benutzt muss im Grunde mit *jeder* Ausnahme klar kommen können. Also nicht nur mit allen ”Eingebauten” was viele sind, und nicht mit allen die in der Standardbibliothek definiert sind, sondern letztlich wirklich mit jeder. Wahrscheinlich bekäme man es sogar hin, das der Ausdruck in der Zeichenkette eine vollkommen neue, vorher undefinierte Ausnahme auslöst. Moment… Ja, ist sogar gar nicht schwer:

Code: Alles auswählen

In [46]: eval("exec('class E(Exception): pass; raise E()')")                    
---------------------------------------------------------------------------
E                                         Traceback (most recent call last)
<ipython-input-46-c267e5d4c1c4> in <module>
----> 1 eval("exec('class E(Exception): pass; raise E()')")

<string> in <module>

<string> in <module>

<string> in E()

E:
Wenn die Zeichenkette im Programm generiert wird, ist es in der Regel einfach nur undurchsichtig, fehleranfällig, und in 99,9% der Fälle unnötig kompliziert. Falls die Zeichenkette aber von aussen kommt, ist das *zusätzlich* eine riesige Sicherheitslücke, denn derjenige der den Code da eingibt, kann wie schon gesagt beliebige Python-Ausdrücke rein füttern, die im Kontext des Programms ausgeführt werden. Und wie man am Beispiel sieht ist das nicht auf einfache Ausdrücke beschränkt, weil der `exec()`-Aufruf zwar ein einfacher Ausdruck ist, aber seinerseits beliebige Code-Fragmente ausführen kann, die nicht mehr auf einen einfachen Ausdruck beschränkt sein müssen.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Benutzeravatar
__blackjack__
User
Beiträge: 13157
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Zu dem Buch hat der Autor den Code of Github und einen Haufen „Spickzettel“ zu den Themen als PDF: https://github.com/ehmatthes/pcc_2e/blo ... cc_all.pdf

Über dieses PDF bin ich mal oberflächlich drüber und das sieht nicht so schlecht aus. Da werden die Namenskonventionen erwähnt und der Code bei den Beispielen hält sich daran. Nach Funktionen und Klassen ist ein kleiner Textkasten zur „Zen of Python“-Zeile „Simple is better than complex“. Bei Importen von Funktionen ist das Beispiel für Sternchen-Import mit der Anmerkung „Don't do this, but recognize it when you see it in others' code.It can result in naming conflicts, which can cause errors.“ versehen. Wenn das Buch nicht komplett anders aussieht als das, dann ist das sicher nicht eines der schlechteren.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Benutzeravatar
Chrisu
User
Beiträge: 11
Registriert: Sonntag 13. September 2020, 09:05

Ich antworte euch mal alle pauschal um nicht jeden Zitieren zu müssen, da es hier eh bei allen Beiträgen ums gleiche Thema geht:

Nochmals: Fettes Danke für eure Infos und Tipps zum Thema.
Ich habe das oben genannte 'Projekt' jetzt verworfen und beginne mit meinem jetzigen Stand (das ist ja zumindest schonmal etwas bzw mehr als vor einigen Wochen) nochmal bei 0 und arbeite die Neuauflage 2020 von Eric Matthes durch.
Wie ihr schon gesagt habt: In einem Buch steht natürlich niemals alles oder eine 'Perfect Way'- Strategie - aber es ist zumindest schonmal ein Anfang um die Grundkenntnisse wenigstens ein bisschen durchzuarbeiten. Zumindest wenn man nicht, wie ich, das komplett falsche Buch erwischt.
Alles andere kommt dan nach und nach dazu, wie bei euch ja auch.

Und Ja. Ich bin keine 14 mehr, sondern hatte heuer meinen 30. Geburtstag. Wenn man mit Verpflichtungen mitten im Leben steht ist es natürlich umso schwerer, als wenn man die Nacht durch am PC arbeiten kann. Ich bin aber auch der festen Überzeugung, dass das gar nichts heißt. Wenn man etwas will, und nicht nur so 'ich probier das mal kurz' sondern, so wie ich, wirklich will, dan kann das bestimmt klappen ;)
Mein Drang danach eine Programmiersprache zu erlernen .. eine Lektüre dazu ... und ein Forum voll mit Anfängern und Profis .. was kann da noch schief gehen? :D

Danke auch für die eval() Erläuterung. Das ist natürlich eine ganz andere Erklärung dazu.
Ich habs ja schon rein geschrieben: Recht viel mehr als in meiner Beschreibung dazu stand im Buch auch nicht dazu, wie ich sehe ich es aber etwas komplexer als der Typ dies dort beschrieben hat. Ich hab mir fast schon angewöhnt eval() ziemlich oft zu benutzen.


Ärgern tuts mich trotzdem noch ein wenig ... wenns wirklich so ein Quatsch war .. wie kann jemand ohne ordentliche bzw mit schlampigen Python Kenntnissen sich anmaßen Neulingen so einen Quatsch weiterzugeben?


Lg Chris
Benutzeravatar
__blackjack__
User
Beiträge: 13157
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Eine vollständige Beschreibung zu jeder Funktion, auch bei denen die tatsächlich in einem Buch vorkommen, würde ich auch bei guten Bücher nicht erwarten. Das kann kein Autor leisten, und das gehört auch nicht wirklich in so ein Buch, denn als Referenz und Nachschlagewerk ist am Ende die Python-Dokumentation da. Es macht nicht so wirklich Sinn, das die ein Autor noch mal in einem Buch abschreibt. Das wäre unnötiger Aufwand und solche Information veraltet auch zu schnell.

Umwandeln von Zeichenketten in Grunddatentypen wie ganze Zahlen gehört in ein Grundlagenbuch/-tutorial, aber so Feinheiten wie das `int()` noch ein zweites Argument für die Basis kennt, kann da drin stehen, muss es aber IMHO nicht.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Kanaax
User
Beiträge: 17
Registriert: Mittwoch 5. August 2020, 09:15

Chrisu hat geschrieben: Freitag 9. Oktober 2020, 12:33 Ich kenne auch die Tutorial-Reihe von Morpheus auf Youtube aber ich tue mich mit Nachschlagewerken eher leichter als mit Videos.
Morpheus ist echt gut, dort habe ich auch einiges gelernt. Am besten gehst du dann auch auf seinen Discord Server, denn da bekommst du meistens nochmal etwas schneller Hilfe als hier(je nach Uhrzeit und wer gerade da ist). Morpheus ist meiner Meinung nach der beste wenn es um it(programmier) tutorials geht. Ich glaube wenn man seine Tutorials zu Python 3,x durcharbeitet hat man Kostenlos eine gute Basis. Dazu habe ich mir noch ein Buch als Nachschlagwerk vom Rheinwerk geholt. https://www.rheinwerk-verlag.de/python- ... -handbuch/ . Das gibt es auch irgendwo im Internet als ein Online Tutorial "kopiert".
Benutzeravatar
Trägheit
User
Beiträge: 12
Registriert: Samstag 24. Oktober 2020, 20:14

Bin mit dem Buch [Link entfernt] hier sehr zufrieden. Diese Auflage ist komplett auf Python3 aktualisiert worden.
Das Buch kommt stellenweise etwas trocken rüber, bleibt dennoch durchweg interessant zu lesen. In erster Linie ist es als Nachschlagewerk zu verstehen.

Was ich persönlich gut fand ist, dass die Unterschiede zu Python2 an entsprechenden Stellen - und auch noch mal in einer eigenen Abschnitt - mit erwähnt werden. So kann ich das erkennen und meiden.
Ging mir damals schon zu C/C++ Zeiten auf den Wecker, dass man die Unterschiede meist nur schwer auseinander halten konnte; oder es war mühsam sich durch den ganzen Wust zu lesen.

PS: Mein erster Foren-Beitrag: Hello forum! ;)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

@Trägheit herzlich willkommen im Forum. Ich habe den Link auf das Buch entfernt, denn in 99.9% aller Faelle, in denen ein erster Post einen Link enthaelt, handelt es sich schlicht um Werbung. Und auch wenn die hier thematisch passt, ist das nicht gerne gesehen. Solltest du ein regulaerer Poster werden, ist sowas natuerlich gar kein Problem.
Benutzeravatar
__blackjack__
User
Beiträge: 13157
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ohne zu wissen um welches Buch es sich handelt ist der gesamte restliche Text aber ziemlich sinnlos. 🙂
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

@__blackjack__ joa, aber das ist mein Kompromiss fuer den Fall, dass es sich wider Erwarten doch nicht "nur" um Spam handelt. Die beiden Posts in Summe sind ja Klassiker: erstmal eine Frage (in diesem Fall als Beschwerde getarnt) , danach ein "du, ich hab da was: Penisgross, jetzt mit mehr gross." Und dann hoert man nie wieder was von den Leuten. Wenn hier ein Autor oder gar Verlag mit offenem Visier ankommt und sagt "wir haben das hier rausgebracht, bitteschoen" - dann wuerde ich das ohne zu zucken durchwinken. Ich finde Promotion ok. Transparent muss sie sein.
Benutzeravatar
__blackjack__
User
Beiträge: 13157
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@__deets__: Bei kumarrohan81 ist es IMHO eindeutig, dass es da bloss um die Links in der Signatur geht, die da jetzt aufgetaucht sind.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Antworten