Seite 2 von 7
Re: andie39‘s Fragen Thread
Verfasst: Sonntag 9. Januar 2022, 15:38
von andie39
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
Re: andie39‘s Fragen Thread
Verfasst: Sonntag 9. Januar 2022, 15:55
von sparrow
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?
Re: andie39‘s Fragen Thread
Verfasst: Sonntag 9. Januar 2022, 16:02
von nezzcarth
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.
Re: andie39‘s Fragen Thread
Verfasst: Sonntag 9. Januar 2022, 16:09
von sparrow
@andie39: Übrigens ist auch die Fehlermeldung, die du uns hier vorenthalten hast, bereits sehr aussagekräftig: SyntaxError: cannot assign to comparison
Re: andie39‘s Fragen Thread
Verfasst: Sonntag 9. Januar 2022, 16:20
von andie39
Ah ok das IN hatte ich auch falsch verstanden.
Jetzt denke ich hab ich es verstanden
Re: andie39‘s Fragen Thread
Verfasst: Sonntag 9. Januar 2022, 17:47
von Sirius3
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
Re: andie39‘s Fragen Thread
Verfasst: Sonntag 9. Januar 2022, 19:42
von andie39
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?
Re: andie39‘s Fragen Thread
Verfasst: Sonntag 9. Januar 2022, 19:59
von Sirius3
Richtig.
Re: andie39‘s Fragen Thread
Verfasst: Sonntag 9. Januar 2022, 20:34
von __blackjack__
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.
Re: andie39‘s Fragen Thread
Verfasst: Sonntag 9. Januar 2022, 20:42
von __blackjack__
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:
Re: andie39‘s Fragen Thread
Verfasst: Sonntag 9. Januar 2022, 21:00
von andie39
Der erste Iterationsbereich (hier index) dem immer die Zahl zugewiesen und der zweite (hier element) ist der Wert selber richtig?
Re: andie39‘s Fragen Thread
Verfasst: Sonntag 9. Januar 2022, 21:20
von andie39
__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
Re: andie39‘s Fragen Thread
Verfasst: Sonntag 9. Januar 2022, 21:21
von __blackjack__
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:
Re: andie39‘s Fragen Thread
Verfasst: Donnerstag 13. Januar 2022, 17:07
von andie39
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.
Re: andie39‘s Fragen Thread
Verfasst: Donnerstag 13. Januar 2022, 17:37
von Sirius3
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")
Re: andie39‘s Fragen Thread
Verfasst: Donnerstag 13. Januar 2022, 18:07
von andie39
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! :)
Re: andie39‘s Fragen Thread
Verfasst: Donnerstag 13. Januar 2022, 18:14
von noisefloor
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
Re: andie39‘s Fragen Thread
Verfasst: Donnerstag 13. Januar 2022, 18:15
von __blackjack__
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.
Re: andie39‘s Fragen Thread
Verfasst: Donnerstag 13. Januar 2022, 18:52
von andie39
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
Re: andie39‘s Fragen Thread
Verfasst: Donnerstag 13. Januar 2022, 19:04
von noisefloor
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