Seite 1 von 7

andie39‘s Fragen Thread

Verfasst: Samstag 8. Januar 2022, 23:49
von andie39
Da ich bei meinen Onlineübungen doch immer wieder einmal Fragen habe und nicht das Forum vollspammen möchte, mache ich diesen Thread auf in dem ich meine aktuellen Fragen poste.

Ich denke das ist besser als lauter Fragen in einzelnen Threads. Hoffe ich zumindest.

Re: andie39‘s Fragen Thread

Verfasst: Sonntag 9. Januar 2022, 00:08
von andie39
Frage 1:

Folgende Aufgabe hatte ich gehabt:

Aufgabe:

c.) Schreibe eine Funktion, die die Listen mit den Artikeln auffüllt!
Von nun an soll auch eine Funktion die Waren in die virtuellen Regale einräumen, d. h. an die erste, noch leere Position in der Liste shelf packen. Als Parameter soll der Funktion add_shelf() der einzusortierende Artikel übergeben werden. Die Funktion aktualisiert dann die Liste shelf, und der neue Artikel wurde in das erste leere Regalfach eingeräumt.

Code: Alles auswählen

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

def add_shelf(article):
    for i in range(0, len(shelf)):
        if shelf[i] == "leer":
            shelf[i] = article
            break
    
add_shelf("Rubik's Cube")
print(shelf)


Der Code hier ist die „Musterlösung“.


Dazu folgendes:
Die range Funktion die ja einen Zahlenbereich abdeckt:

Ich hätte das hier eher so erwartet:

Code: Alles auswählen


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

def add_shelf(article):
    for i in shelf:
        if shelf[i] == "leer":
            shelf[i] = article
            break
    
add_shelf("Rubik's Cube")
print(shelf)

Das für jeden Wert „i“ in der Liste shelf geprüft wird ob der Wert „leer“ ist und falls ja diesen durch den Wert „article“ ersetzt.


Das gibt aber den Fehler:
list indices must be integers or slices, not str


In der Musterlösung geht die for schleife alle Positionen durch von 1 „0“ bis zur Länge der liste, also die Anzahl der durch Komma getrennten Bereiche.

Aber warum geht das nicht bei for i in shelf?
Warum genau geht er hier nicht jede Nummer in shelf durch und prüft diese?

Re: andie39‘s Fragen Thread

Verfasst: Sonntag 9. Januar 2022, 00:42
von __deets__
Du gehst in Abweichung zur musterlösung die WERTE durch. Nicht die Indizes. Aber behandelst die dann, als ob sie Indizes wären . Darum die Fehlermeldung. Die Position „leer“ kennt eine Liste nicht. Positionen sind immer zahlen.


Dies hier (durch das Update der Liste) ist einer der Fälle, wo man eben Index-basiert arbeiten kann.

Re: andie39‘s Fragen Thread

Verfasst: Sonntag 9. Januar 2022, 00:58
von andie39
Das verstehe ich nicht.
Du sagst ich durchsuche die Werte und behandele diese dann als ob sie Werte wären.

Sie sind doch Werte…..

In der Musterlösung werden doch die Indizierungen durchlaufen und wenn diese einen bestimmten Wert haben wird dieser ersetzt oder nicht?

Warum ist das bei for i in shelf nicht so? Ich hätte erwartet das das auch hier der Fall ist.

Re: andie39‘s Fragen Thread

Verfasst: Sonntag 9. Januar 2022, 01:13
von __blackjack__
@andie39: Nein, Du behandelst die Werte als ob sie Indizes wären. Lass Dir doch mal `i` in Deinem Beispiel ausgeben. Und was soll dann ``shelf[ i ]`` bedeuten?

Warum hättest Du bei bei ``for i in shelf:`` erwartet, dass das Indexwerte sind? Das ist nicht so weil das nicht so ist. Ich weiss nicht was man da sonst zu sagen soll. So sind Listen implementiert und dokumentiert ist das auch so, das iterieren über eine Liste = iterieren über die Elemente der Liste ist. Macht auch mehr Sinn als über die Indexwerte zu iterieren, denn dann müsste man ja immer diesen in 99% der Fälle unnötigen Indexzugriff machen, um an dann an das Element zu kommen.

Re: andie39‘s Fragen Thread

Verfasst: Sonntag 9. Januar 2022, 08:09
von andie39
Ich glaube das ich die for-schleife, iterieren und index nicht richtig verstanden habe.

Indexierung ist doch die Stelle mit einer Zahl.
Bei Strings sind das die Buchstaben.
In der Liste die getrennten Abschnitte wenn man so will.

Im Fall einer csv Datei wie: for line in datei.csv
sind ja die Zeilen indexiert und zwar weil es so ist und nicht weil for LINE geschrieben wird.

Hier ist es ja eine Liste die indexiert ist und diese sind mit Komma getrennt.
….

und während ich das schreibe und nochmal auf mein Post hin und her schaue GLAUBE ich, hab ich es doch verstanden.

i nimmt einfach nur eine indexposition an.
Von „1“ bis Gesamtzahl der Positionen von shelf
Erst die if Funktion geht dann die Positionen durch.

Re: andie39‘s Fragen Thread

Verfasst: Sonntag 9. Januar 2022, 08:54
von andie39
__blackjack__ hat geschrieben: Sonntag 9. Januar 2022, 01:13 @andie39: Nein, Du behandelst die Werte als ob sie Indizes wären. Lass Dir doch mal `i` in Deinem Beispiel ausgeben. Und was soll dann ``shelf[ i ]`` bedeuten?
Ja logisch
Bei mir wäre der Wert z.B „Säge“ ein Indexpunkt.
Was nicht geht sondern eine ganze Zahl sein muss

Re: andie39‘s Fragen Thread

Verfasst: Sonntag 9. Januar 2022, 09:09
von snafu
Man kann sich den Index wie einen Lagerplatz vorstellen. Das Element Säge liegt zB auf Platz 3. Wenn man also fragt, was auf Platz xy liegt, dann erhält man das passende Element als Wert.

Bei einer for-Schleife über eine (Lager-)Liste erhält man nicht alle Lagerplätze, sondern die darauf befindlichen Gegenstände, mit denen man direkt hantieren kann. Sie werden somit nicht über ihren Lagerplatz angesprochen, sondern unmittelbar. Das sollte man sich schon klar machen.

Re: andie39‘s Fragen Thread

Verfasst: Sonntag 9. Januar 2022, 09:36
von andie39
Also hier wird ja jeder Lagerplatz durchgegangen und wenn ein Platz den Wert „leer“ hat wird dieser ersetzt und die Schleife gestoppt.

Von daher habe ich nochmal geschaut und hätte gedacht das es auch so geht:

Code: Alles auswählen

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

def add_shelf(article):
    for i in shelf:
        if i == "leer":
            i = article
            break
    
add_shelf("Rubik's Cube")
print(shelf)


Aber das ist nicht der Fall.
So ganz ist es mir doch nicht klar….

Sehr kompliziert

Re: andie39‘s Fragen Thread

Verfasst: Sonntag 9. Januar 2022, 10:10
von sparrow
Es gibt kein magisches Update aller Verweise. Das wäre ausgesprochen unpraktisch.

Du bindest jeweils ein Element aus der Liste shelf an den Namen "i". Dann schaust du, ob der Wert von i gleich der Zeichenkette "leer" ist. Wenn dem so ist, bindesr du das, was ab article gebunden ist an i. Das heißt aber nicht, dass da etwas in der shelf geändert wird.

Code: Alles auswählen

a="foo"
b=a
b="ham"
Hiet würdest du doch auch nicht erwarten, dass a sich ändert, oder?
Falls doch: So funktioniert Referenzierung in Python nicht.

Re: andie39‘s Fragen Thread

Verfasst: Sonntag 9. Januar 2022, 10:48
von andie39
sparrow hat geschrieben: Sonntag 9. Januar 2022, 10:10 Es gibt kein magisches Update aller Verweise. Das wäre ausgesprochen unpraktisch.

Du bindest jeweils ein Element aus der Liste shelf an den Namen "i". Dann schaust du, ob der Wert von i gleich der Zeichenkette "leer" ist. Wenn dem so ist, bindesr du das, was ab article gebunden ist an i. Das heißt aber nicht, dass da etwas in der shelf geändert wird.

Code: Alles auswählen

a="foo"
b=a
b="ham"
Hiet würdest du doch auch nicht erwarten, dass a sich ändert, oder?
Falls doch: So funktioniert Referenzierung in Python nicht.
Grundsätzlich ja aber hier wird es doch geändert:

Code: Alles auswählen


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

def add_shelf(article):
    for i in range(0, len(shelf)):
        if shelf[i] == "leer":
            shelf[i] = article
            break
    
add_shelf("Rubik's Cube")
print(shelf)


Re: andie39‘s Fragen Thread

Verfasst: Sonntag 9. Januar 2022, 11:02
von __deets__
Ja. Da wird doch explizit das I-te Element in der Liste auf der linken Seite als Ziel der Änderung benannt.

Re: andie39‘s Fragen Thread

Verfasst: Sonntag 9. Januar 2022, 11:10
von andie39
Ja. Aber bei der anderen Variante doch auch oder nicht?
Sobald ein i-Element „leer“ wird, wird das geändert.

Re: andie39‘s Fragen Thread

Verfasst: Sonntag 9. Januar 2022, 11:13
von sparrow
Nein.
Zeig mal wo das bei der anderen Variante geändert wird. Wo steht da "Ändere etwas in der Liste"?

Re: andie39‘s Fragen Thread

Verfasst: Sonntag 9. Januar 2022, 11:14
von andie39
sparrow hat geschrieben: Sonntag 9. Januar 2022, 11:13 Nein.
Zeig mal wo das bei der anderen Variante geändert wird. Wo steht da "Ändere etwas in der Liste"?

if i == "leer":
i = article

Re: andie39‘s Fragen Thread

Verfasst: Sonntag 9. Januar 2022, 11:16
von __deets__
Wo steht denn da die Liste? Ich sehe da nichts von shelf.

Re: andie39‘s Fragen Thread

Verfasst: Sonntag 9. Januar 2022, 11:18
von sparrow
Da steht "wenn der Wert, der an i gebunden ist, gleich der Zeichenkette 'leer' ist, dann binde den Wert, der an article gebunden ist zusätzlich an den Namen i".
Und wo genau ist da jetzt irgend eine Liste, deren Werte sich ändern sollen?

Re: andie39‘s Fragen Thread

Verfasst: Sonntag 9. Januar 2022, 11:20
von andie39
Jetzt hat es klick gemacht……. Danke für die Geduld.

Re: andie39‘s Fragen Thread

Verfasst: Sonntag 9. Januar 2022, 12:28
von snafu
andie39 hat geschrieben: Sonntag 9. Januar 2022, 11:14
sparrow hat geschrieben: Sonntag 9. Januar 2022, 11:13 Nein.
Zeig mal wo das bei der anderen Variante geändert wird. Wo steht da "Ändere etwas in der Liste"?

if i == "leer":
i = article
Stell dir "i" wie einen Zettel vor. Auf diesen Zettel wird in deiner Schleife immer der aktuelle Wert aus der Liste geschrieben. Der Zettel hat aber keine Rückverbindung zur Liste. Schreibst du etwas anderes auf den Zettel, dann beeinflusst das deine Liste so rein gar nicht.

Re: andie39‘s Fragen Thread

Verfasst: Sonntag 9. Januar 2022, 14:26
von kbr
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.