andie39‘s Fragen Thread

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.
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

kbr hat geschrieben: Sonntag 9. Januar 2022, 14:26 Die Musterlösung sollte aus meiner Sicht einen besseren Funktionsnamen haben, "shelf" als Parameter erhalten und statt "range(0, len(shelf))" "enumerate" verwenden. Noch eleganter geht es mit der List-Methode "index" sowie einem Rückgabewert, der die Position des neuen Elements angibt oder einen anderen Wert hat, falls im Regal kein Platz mehr frei war.

@andie39: Wenn Du magst, versuche zur Übung die Aufgabe mit "enumerate" zu lösen und dann später auch noch den oben genannten Rückgabewert zu liefern.
Danke ja als ich eine Lösung gesucht habe um eine Position zu ändern habe ich online etwas über enumerate gefunden.
Aber da es nicht im Kurs bisher vorkam geschaut, wie es mit dem bekannten Wissen gelöst werden kann.

Ich merke das mir immer doch etwas im Grundverständnis fehlt bzw ich falsche Gedankengänge entwickele.

Nachdem man mir das hier erklärt hat weiß ich warum meine Varianten nicht funktioniert haben und doch habe ich noch über eine andere Variante nachgedacht ohne range wo aber shelf vorkommt:

Code: Alles auswählen


shelf = ["Zaubersäge", "leer", "Wunderkekse", "Trickkarten", "leer"]

def add_shelf(article):
    for i in shelf:
        if i == "leer":
            i in shelf = article
            
        
    
add_shelf("Hase“)
print(shelf)


Der Fehler tritt bei i in shelf = article auf.
Für mich sieht es immer noch logisch aus denn ich lese es nun so:
Wenn i == „leer“ dann soll i in liste shelf = den Wert
von article haben.



Es bleiben doch massive Verständnisprobleme
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Jetzt rätst du willkürlich Syntax. So funktioniert Programmieren nicht.

kbr hat Varianten genannt, die funktioniern. Wo hast du denn her, dass "irgend in etwas" etwas ist, dem man einen Wert zuweisen kann?
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

andie39 hat geschrieben: Sonntag 9. Januar 2022, 15:38 Der Fehler tritt bei i in shelf = article auf.
Ja, denn das ist kein gültiger Ausdruck. 'i in shelf' prüft, ob das an den Namen 'i' gebundene Objekt in der Liste 'shelf' enthalten ist und gibt einen Wahrheitswert – True oder False – zurück. Und diesem versucht du dann den Wert, der an den Namen 'article' gebunden ist, zuzuweisen. D.h. effektiv steht da so etwas 'True = "Hase"', also eine Zuweisung eines Literals zu einem anderen; das funktioniert nicht.

Ich glaube, der Unterschied zwischen der Position eines Elements und dem Element selbst ist noch klar. Du iterierst nach wie vor über die Elemente einer Liste, als einzelne Werte. In der Form, wie du das machst, gibt es keinerlei Rückbezug zu der Liste, aus der die Werte stammen. Wenn du da irgendwas änderst, hat das keinen Effekt auf die Liste. Listen sind einfach nur Container, die andere Objekte enthalten können. Diese Objekte sind innerhalb des Containers sortiert, haben eine Abfolge, d.h. eine Position, die bei 0 anfängt und für jedes Element um 1 erhöht wird. Die Position der Elemente innerhalb der Liste nennt man Index; und nur die. Und über diese Position/diesen Index kann man auf einzelne Elemente zugreifen. Ähnlich, wie zum Beispiel bei einem Schrank mit 4 Schubladen, die von oben nach unten durchnummeriert sind, beginnend bei 0. Es macht einen Unterschied, ob du dich auf die Schublade beziehst, oder das, was darin liegt.

Daher ist übrigens auch der Name 'i' irreführend, da man diesen für inkrementierte Zähler verwendet. Du iterierst aber über die Elemente, also sollte man es 'element' o.ä. nennen.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@andie39: Übrigens ist auch die Fehlermeldung, die du uns hier vorenthalten hast, bereits sehr aussagekräftig: SyntaxError: cannot assign to comparison
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

Ah ok das IN hatte ich auch falsch verstanden.
Jetzt denke ich hab ich es verstanden
Sirius3
User
Beiträge: 17745
Registriert: Sonntag 21. Oktober 2012, 17:20

Was als erstes auffällt, ist die Funktionsdefinition mitten im direkt ausgeführten Code. Auch wenn man keine main-Funktion hat, sollte doch Funktionsdefinitionen am Anfang des Skripts stehen.
Dann ist natürlich die globale Variable `shelf` ein NoGo. Das macht den Kurs noch untauglicher.
`add_shelf` ist der falsche Funktionsname, der müßte `add_to_shelf` heißen.
Die Schleife über einen Index sollte man Anfängern auch erst gar nicht zeigen.
Im Fehlerfall einfach weitermachen, als ob nichts wäre, ist das nächste NoGo.

Code: Alles auswählen

def add_to_shelf(shelf, article):
    for index, element in enumerate(shelf):
        if element == "leer":
            shelf[index] = article
            break
    else:
        raise ValueError("kein leerer Platz")
    
shelf = ["Zaubersäge", "leer", "Wunderkekse", "Trickkarten", "leer"]
add_to_shelf(shelf, "Rubik's Cube")
print(shelf)
Ich hoffe, das wird alles im Anschluß noch behandelt.
Und natürlich benutzt man eine fertige Funktion, wenn es die schon gibt:

Code: Alles auswählen

def add_to_shelf(shelf, article):
    shelf[shelf.index("leer")] = article
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

Sirius3 hat geschrieben: Sonntag 9. Januar 2022, 17:47 Was als erstes auffällt, ist die Funktionsdefinition mitten im direkt ausgeführten Code. Auch wenn man keine main-Funktion hat, sollte doch Funktionsdefinitionen am Anfang des Skripts stehen.
Dann ist natürlich die globale Variable `shelf` ein NoGo. Das macht den Kurs noch untauglicher.
`add_shelf` ist der falsche Funktionsname, der müßte `add_to_shelf` heißen.
Die Schleife über einen Index sollte man Anfängern auch erst gar nicht zeigen.
Im Fehlerfall einfach weitermachen, als ob nichts wäre, ist das nächste NoGo.

Code: Alles auswählen

def add_to_shelf(shelf, article):
    for index, element in enumerate(shelf):
        if element == "leer":
            shelf[index] = article
            break
    else:
        raise ValueError("kein leerer Platz")
    
shelf = ["Zaubersäge", "leer", "Wunderkekse", "Trickkarten", "leer"]
add_to_shelf(shelf, "Rubik's Cube")
print(shelf)
Ich hoffe, das wird alles im Anschluß noch behandelt.
Nein wurde es nicht vielleicht in einem späteren Abschnitt aber sieht jetzt nicht so aus.

Zu deinem Code:
enumarate nummeriert ja die Elemente selber.
Die haben dann die gleiche Nummer wie die Position am Index und daher kann man sowohl mit dem Wert selber als auch mit der Indexposition arbeiten richtig?
Sirius3
User
Beiträge: 17745
Registriert: Sonntag 21. Oktober 2012, 17:20

Richtig.
Benutzeravatar
__blackjack__
User
Beiträge: 13099
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Zum ``in`` vielleicht noch, dass es dieses Schlüsselwort in der Syntax in mehr als einer Bedeutung/Position gibt. In ``a in b`` ist es ein Vergleichsoperator der prüft ob der Wert von `a` in `b` vor kommt, also letztlich `b` gefragt wird ob es `a` enthält. Und es ist Bestandteil der ``for``-Syntax ``for a in b:`` und in ähnlicher Funktion auch in den verschiedenen „comprehension“-Syntaxformen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13099
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und noch was: Falls es ``for`` nicht gäbe und man sich das selbst basteln müsste, hier das was bei jeder ``for``-Schleife abläuft:

Code: Alles auswählen

for item in items:
    do_something(item)


# =>


iterator = iter(items)
while True:
    try:
        item = next(iterator)
    except StopIteration:
        break
    
    do_something(item)
Das erstellen des Iterators und abfragen der einzelnen Elemente in einer IPython-Shell manuell:

Code: Alles auswählen

In [84]: shelf = ["Zaubersäge", "leer", "Wunderkekse", "Trickkarten", "leer"]   

In [85]: iterator = iter(shelf)                                                 

In [86]: iterator                                                               
Out[86]: <list_iterator at 0x7ffa6fd72a20>

In [87]: next(iterator)                                                         
Out[87]: 'Zaubersäge'

In [88]: next(iterator)                                                         
Out[88]: 'leer'

In [89]: next(iterator)                                                         
Out[89]: 'Wunderkekse'

In [90]: next(iterator)                                                         
Out[90]: 'Trickkarten'

In [91]: next(iterator)                                                         
Out[91]: 'leer'

In [92]: next(iterator)                                                         
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-92-4ce711c44abc> in <module>
----> 1 next(iterator)

StopIteration:
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

Der erste Iterationsbereich (hier index) dem immer die Zahl zugewiesen und der zweite (hier element) ist der Wert selber richtig?
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

__blackjack__ hat geschrieben: Sonntag 9. Januar 2022, 20:42 Und noch was: Falls es ``for`` nicht gäbe und man sich das selbst basteln müsste, hier das was bei jeder ``for``-Schleife abläuft:

Code: Alles auswählen

for item in items:
    do_something(item)


# =>


iterator = iter(items)
while True:
    try:
        item = next(iterator)
    except StopIteration:
        break
    
    do_something(item)
Das erstellen des Iterators und abfragen der einzelnen Elemente in einer IPython-Shell manuell:

Code: Alles auswählen

In [84]: shelf = ["Zaubersäge", "leer", "Wunderkekse", "Trickkarten", "leer"]   

In [85]: iterator = iter(shelf)                                                 

In [86]: iterator                                                               
Out[86]: <list_iterator at 0x7ffa6fd72a20>

In [87]: next(iterator)                                                         
Out[87]: 'Zaubersäge'

In [88]: next(iterator)                                                         
Out[88]: 'leer'

In [89]: next(iterator)                                                         
Out[89]: 'Wunderkekse'

In [90]: next(iterator)                                                         
Out[90]: 'Trickkarten'

In [91]: next(iterator)                                                         
Out[91]: 'leer'

In [92]: next(iterator)                                                         
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-92-4ce711c44abc> in <module>
----> 1 next(iterator)

StopIteration:
Danke dir
Benutzeravatar
__blackjack__
User
Beiträge: 13099
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das `shelf` mit `enumerate()` und manuellen `next()`-Aufrufen:

Code: Alles auswählen

In [93]: iterator = enumerate(shelf)                                            

In [94]: next(iterator)                                                         
Out[94]: (0, 'Zaubersäge')

In [95]: next(iterator)                                                         
Out[95]: (1, 'leer')

In [96]: next(iterator)                                                         
Out[96]: (2, 'Wunderkekse')

In [97]: next(iterator)                                                         
Out[97]: (3, 'Trickkarten')

In [98]: next(iterator)                                                         
Out[98]: (4, 'leer')

In [99]: next(iterator)                                                         
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-99-4ce711c44abc> in <module>
----> 1 next(iterator)

StopIteration:
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

Hallo,

ich bin wieder da.
Aktuell versuche ich mich an einem neuen eigenen Programm zur Übung:

Ich möchte ein Programm für eine Filmdatenbank schreiben, welches das hinzufügen von Filmen, entfernen, suchen etc ermöglicht.
Außerdem soll die Möglichkeit haben einen Film als verliehen zu markieren und ihn später auch wieder als verfügbar zu markieren.
Und dann soll man eine Liste ausgeben können mit Filmen die verliehen und die verfügbar sind.

Das Grundgerüst steht und ich wollte nun die erste Funktion schreiben, die Funktion um einen Film in die "movies.csv" zu schreiben,
erhalte aber immer Fehler.
Ich habe bereits verschiedenes versucht etc, gegooglet und überlegt aber ich komme nicht drauf:

Code: Alles auswählen


def add_movie():
    file = open("movies.csv", "w")
    print("Geben Sie einen Filmtitel ein:"
    eingabe = input()
    file.write(eingabe + "\n")
    file.close()
Als Fehler gibt es:

File "C:\Users\info\AppData\Local\Temp/ipykernel_13784/3443683459.py", line 4
eingabe = input()
^
SyntaxError: invalid syntax

Und ja die with open kenne ich auch die auch eigentlich eleganter ist.
Sirius3
User
Beiträge: 17745
Registriert: Sonntag 21. Oktober 2012, 17:20

Zähle mal alle Klammern.

Dateien öffnet man immer mit with. `eingabe` ist ein zu generischer Name, `filmtitel` wäre doch viel sprechender. `input` kann schon einen Prompt mit ausgeben, da braucht es kein extra `print`:

Code: Alles auswählen

def add_movie():
    film_titel = input("Geben Sie einen Filmtitel ein:")
    with open("movies.csv", "w") as file:
        file.write(film_titel + "\n")
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

Sirius3 hat geschrieben: Donnerstag 13. Januar 2022, 17:37 Zähle mal alle Klammern.

Dateien öffnet man immer mit with. `eingabe` ist ein zu generischer Name, `filmtitel` wäre doch viel sprechender. `input` kann schon einen Prompt mit ausgeben, da braucht es kein extra `print`:

Code: Alles auswählen

def add_movie():
    film_titel = input("Geben Sie einen Filmtitel ein:")
    with open("movies.csv", "w") as file:
        file.write(film_titel + "\n")
[/quote]



*FACEPALM*

Und ich habe geschaut und mich gefragt, warum das nicht geht obwohl doch der code eigentlich stimmt.........
Danke dir.

Ja stimmt deiner ist besser und kürzer aber ich sehe mit der Klammer funktioniert mein Code dennoch.
Es macht mehr und mehr Spass etwas zu programmieren!  :)
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

du solltest dir vielleicht jetzt schon mal überlegen, ob du das wirklich über eine CSV-Datei machen willst. CSV ist als Datenaustauschformat ok, aber eigentlich eher weniger für sich dynamisch ändernde Daten. Außerdem verlierst du immer den Typ der Daten, weil alles ein String ist. Wenn du keine Datenbank nutzen möchtest oder kannst, dann wäre zumindest JSON die besser Wahl, weil da die Grunddatentype beibehalten (werden können).

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

Ergänzend: Bei Textdateien sollte man immer explizit die Kodierung angeben, sonst ist es systemabhängig welche verwendet wird und das ganze ist nicht portabel. Es kann sogar passieren, dass es dann unter ein und dem selben System nicht funktioniert, je nach dem über welchen Weg man das Programm startet. Windows war da zumindest früher immer so ein Problemfall: Wenn man ein Programm aus der Eingabeforderung gestartet hat, wurde aus Rückwärtskompatibilität beispielsweise cp850 verwendet, und über andere Wege cp1251.

Wenn man die Kodierung selbst wählen kann, dann macht IMHO UTF-8 Sinn. Damit kann man alles kodieren das mit Unicode repräsentierbar ist, und ASCII ist eine Untermenge von der Kodierung die gleich kodiert wird.

Wenn das eine CSV-Datei werden soll, sollte man vielleicht auch das `csv`-Modul zum lesen und schreiben verwenden.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

Hallo,

danke ja das mag sein, soweit bin ich aber noch gar nicht, mir geht es jetzt darum mit meinem aktuellen Wissen dieses Programm zu schreiben.
Codierung: Ja habe ich festgestellt, was unter Jupyter geht, geht nicht auf dem Ipad per Pythonista

Jetzt gerade will ich erstmal nur schauen ob ich das Programm selber geschrieben bekomme.

Ich habe auch selber einen Fehler gerade korrigiert:
"W" für write war nicht richtig, sondern "a" zum anhängen, das hat auch funktioniert.
Aber dann dachte ich, ich möchte das er keine doppelten Filme hinzufügt.
Also habe ich mit r+ gerarbeitet um mit einer for-Schleife abfragen ob der Wert eingabe schon vorkommt.
Wenn ja dann soll die Schleife enden, sonst soll der Titel "eingabe" angehängt werden, das hier ist mein Gedanke gewesen:

Code: Alles auswählen

def add_movie():
    file = open("movies.csv", "r+")
    eingabe = input("Geben Sie einen Filmtitel ein:")
    for line in file:
        if eingabe in file:
            break
        else: 
            file.write(eingabe + "\n")
    file.close()
Funktioniert aber nicht, er fügt nichts mehr hinzu
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

der Code ist so falsch. 1) iterierst du über `file`, nutzt `line` aber nicht. 2) `if eingabe in file` ist ziemlich sicher immer `False`, weil `file` ein `<_io.TextIOWrapper name='movie.csv' mode='r' encoding='UTF-8'>` Objekt ist.

Gruß, noisefloor
Antworten