Zum Inhalt springen

Python - Listen, Schleifen, Funktionen. Was macht der Code?


Empfohlene Beiträge

Hallo, ich mache gerade meine ersten mehr oder weniger ernsten Gehversuche im Programmieren.

Ich habe einen Code geschrieben und verstehe nicht ganz, warum er macht, was er macht..

Das ist mein Programm

 

bookshelf = ["Harry Potter 1","Harry Potter 2", "Harry Potter 3","Harry Potter 4", \
            "Harry Potter 5" , "Harry Potter 6", "Harry Potter 7"]

bookshelf2 = bookshelf.copy()

bookshelf2.append(14.23)

for i in bookshelf2:
    if type(bookshelf2) == str:
        continue
    else:
        popped_value = bookshelf2.pop()

print(popped_value)

 

Ich erkläre mal kurz, was ich gemacht habe bzw. versucht habe zu machen.

Ich habe eine Liste mit Werten des Typs String erstellt. Dannach habe ich diese Liste kopiert mit dem Ziel, dass ich eine zweite Liste habe, die den gleichen Inhalt hat wie die erste, mit dem Unterschied, dass ich die zweite verändern kann ohne dass sich die erste ändert.

Dann habe ich der zweiten Liste einen Wert des Types Float mit Hilfe einer Listen-Funktion/Methode hinzugefügt.

Im nächsten Schritt habe ich dann eine Zählschleife erstellt/definiert (wie auch immer), die so lange läuft, bis jeder Wert der Liste "erreichht wurde."

Bei jedem Schleifendurchgang soll überprüft werden, ob es sich bei dem Listeninhalt um den Typ String handelt. Falls das der Fall ist, soll das Programm fortgesetzt werden und zwar so lange bis in der Liste ein Wert auftaucht, der nicht den Typ String hat und falls dem so ist, soll der Wert in die Variable popped_value geschrieben werden.

Am Ende soll popped_value in der Konsole als Text ausgegeben werden.

In meinem Programm gibt es nur einen Wert der nicht vom Typ String ist. Das ist der Wert 14.23, der offensichtlich Float ist. Dieser Wert müsste dann auch ausgegeben werden.

So weit so gut.

 

Was bekomme ich als Ausgbe in die Konsole geschrieben?

 

 

Harry Potter 5

Process finished with exit code 0

 

 

Ich habe überhaupt keine Idee, warum es ausgerechnet Harry Potter 5 ist. Ist das eine Litteratur-Empfehlung oder habe ich etwas grundsätzlich nicht verstanden?

 

Ich bedanke mich schon einmal für die Antworten und hoffe, dass mein Beitrag mehr oder weniger den Richtlinien dieses Forums entspricht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gude, ich hab zwar gar keine Ahnung von Python, aber hier mal die Antwort von ChatGPT:

Um den Code zu korrigieren und das gewünschte Verhalten zu erreichen, solltest du den Datentyp jedes Elements in der Schleife überprüfen. Hier ist eine überarbeitete Version des Codes:

 

bookshelf = ["Harry Potter 1", "Harry Potter 2", "Harry Potter 3", "Harry Potter 4",
             "Harry Potter 5", "Harry Potter 6", "Harry Potter 7"]

bookshelf2 = bookshelf.copy()

bookshelf2.append(14.23)

for i in bookshelf2:
    if type(i) == str:
        continue
    else:
        popped_value = bookshelf2.pop()

print(popped_value)

Jetzt wird der Datentyp jedes Elements überprüft, und nur wenn es sich um einen String handelt, wird die Schleife fortgesetzt. Dadurch wird "Harry Potter 7" nicht aus der Liste entfernt, und du erhältst den gewünschten Ausgang.

 

Warum dein Programm Harry Potter 5 ausgibt anstatt Harry Potter 7 wies hier steht, weiß ich auch net. Kannst ja selbst nochmal nachschauen. 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 7 Stunden schrieb dwb1251:

Jetzt funktioniert es.

Zufällig ja.

bookshelf2.pop() - entfernt das letzte Element aus der Liste, und zufällig ist das in dem Fall richtig.

Nicht richtig hingegen ist es Elemente aus einer Liste zu entfernen die gerade durchlaufen werden soll.
Angenommen der vorliegende Code wird mit einer Liste ausgeführt, die an dritter, vierter und letzter Stelle keinen String enthält.
Wird das dritte Element erreicht, wird das letzte Element entfernt. Beim erreichen der vierten Stelle wird dann das vorletzte Element aus der Ursprünglichen Liste entfernt (was dann wieder kein String ist). Das "letzte" Element wird dann nie geprüft, da es nicht mehr erreicht werden kann.
Selbst wenn man .pop(x) den korrekten Index des zu entfernenden Elementes geben würde, wäre es noch falsch. Dann wird zwar zunächst das dritte Element entfernt, allerdings wird das vierte nie geprüft, da es jetzt das dritte Element ist und damit übersprungen wird.

vor 7 Stunden schrieb dwb1251:

Am Ende soll popped_value in der Konsole als Text ausgegeben werden.

Das macht bei der Beispiel-Liste zwar noch irgendwie Sinn, aber was soll passieren wenn mehrere Elemente entfernt werden müssten?

Letztlich würde man hier eine neue Liste erzeugen die entweder alle Strings oder alle Nicht-Strings enthält.

[x for x in bookshelf2 if type(x) == str]
['Harry Potter 1', 'Harry Potter 2', 'Harry Potter 3', 'Harry Potter 4', 'Harry Potter 5', 'Harry Potter 6', 'Harry Potter 7']
[x for x in bookshelf2 if type(x) is not str]
[14.23]

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 10 Stunden schrieb dwb1251:

 

bookshelf = ["Harry Potter 1","Harry Potter 2", "Harry Potter 3","Harry Potter 4", \
            "Harry Potter 5" , "Harry Potter 6", "Harry Potter 7"]

bookshelf2 = bookshelf.copy()

bookshelf2.append(14.23)

for i in bookshelf2:
    if type(bookshelf2) == str:
        continue
    else:
        popped_value = bookshelf2.pop()

print(popped_value)

Ich weiß nicht, ob das ein Einfügefehler ist oder ob das im Code beabsichtigt ist. Aber da ist nach "Harry Potter 4" ein Schrägstrich :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

der Fehler liegt im for block....


Der Fehler lag in if statement. Du hast immer geprüft ob bookshelf2 ein String ist, ist es aber nicht, es ist eine Liste...du wolltest aber prüfen ob der Wert in der Liste ein String ist.

 

Dieser wird in der for Schleife in der Variable book abgelgt. in i wird noch die position des Titels in der Liste angegeben. Diese brauchen wir später für den pop befehl, da er sonst nur den letzen eintrag (default) entfernt.

for i,book in enumerate(bookshelf2):
    if type(book) == str:
        continue
    else:
        popped_value = bookshelf2.pop(i)

ansonsten ist der code an sich richtig, ich würde jedoch den type anders prüfen:
 

if isinstance(book, str):

Das ist die Empfehlung im Python, da es bei der Prüfung auch subklassen berücksichtigt. In diesen Fall funktioniert das aber auch so wunderbar.

 

For der letzen Print Anweisung solltest du aber noch prüfen ob poped_value überhaupt einen Wert besitzt, ansonsten gibt es ein NameError beim Print, wenn du nur Strings in der Liste hattest.

 

if 'popped_value' in locals():
    print(popped_value)
else:
    print('Es wurd kein Wert gepoppt')

Edit: hatte selber noch ein Fehler in meinem Code geändert

Bearbeitet von dalli
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 14 Minuten schrieb dalli:

ansonsten ist der code an sich richtig

immer noch nicht, .pop() ohne argument entfernt das letzte Element aus der Liste und gibt es zurück. Da das gesuchte Element an die Liste angehängt wurde funktioniert das zufällig. So wie mehr als ein Nicht-String in der Liste ist wird das Ergebnis falsch sein.

Im Grunde könnte man die komplette Schleife weglassen und nur mit 

popped_value = bookshelf2.pop()

das gleiche Ergebnis erhalten, das zufällig richtig ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 15 Stunden schrieb dwb1251:

Hallo, ich mache gerade meine ersten mehr oder weniger ernsten Gehversuche im Programmieren.

Ich habe einen Code geschrieben und verstehe nicht ganz, warum er macht, was er macht..

Das ist mein Programm

bookshelf = ["Harry Potter 1","Harry Potter 2", "Harry Potter 3","Harry Potter 4", \
            "Harry Potter 5" , "Harry Potter 6", "Harry Potter 7"]

bookshelf2 = bookshelf.copy()

bookshelf2.append(14.23)

for i in bookshelf2:
    if type(bookshelf2) == str:
        continue
    else:
        popped_value = bookshelf2.pop()

print(popped_value)

Ich erkläre mal kurz, was ich gemacht habe bzw. versucht habe zu machen.

Ich habe eine Liste mit Werten des Typs String erstellt. Dannach habe ich diese Liste kopiert mit dem Ziel, dass ich eine zweite Liste habe, die den gleichen Inhalt hat wie die erste, mit dem Unterschied, dass ich die zweite verändern kann ohne dass sich die erste ändert.

Dann habe ich der zweiten Liste einen Wert des Types Float mit Hilfe einer Listen-Funktion/Methode hinzugefügt.

Im nächsten Schritt habe ich dann eine Zählschleife erstellt/definiert (wie auch immer), die so lange läuft, bis jeder Wert der Liste "erreichht wurde."

Bei jedem Schleifendurchgang soll überprüft werden, ob es sich bei dem Listeninhalt um den Typ String handelt. Falls das der Fall ist, soll das Programm fortgesetzt werden und zwar so lange bis in der Liste ein Wert auftaucht, der nicht den Typ String hat und falls dem so ist, soll der Wert in die Variable popped_value geschrieben werden.

Am Ende soll popped_value in der Konsole als Text ausgegeben werden.

In meinem Programm gibt es nur einen Wert der nicht vom Typ String ist. Das ist der Wert 14.23, der offensichtlich Float ist. Dieser Wert müsste dann auch ausgegeben werden.

So weit so gut.

Was bekomme ich als Ausgbe in die Konsole geschrieben?

Harry Potter 5

Process finished with exit code 0

Ich habe überhaupt keine Idee, warum es ausgerechnet Harry Potter 5 ist. Ist das eine Litteratur-Empfehlung oder habe ich etwas grundsätzlich nicht verstanden?

Ich bedanke mich schon einmal für die Antworten und hoffe, dass mein Beitrag mehr oder weniger den Richtlinien dieses Forums entspricht.

Du hast in einer schleife arr mit str verglichen, und  in jedem durchgang .pop gemacht bis die Liste nur noch ein Element enthalten hat.  Letztes Element in popped_value war dann "Harry Potter 5". Wahrscheinlich ein unerwartetes verhalten in python durch die verwendung von .pop in einem python for loop

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 47 Minuten schrieb carnaqe:

Du hast in einer schleife arr mit str verglichen


Aber ist bookshelf nicht eine Liste, da sie verschiedene Datentypen aufnimmt ?
"The main difference between lists and arrays is that arrays constrain the object type it can store. Lists do not give you a way to limit the types of objects they contain. When using an array, you can be sure that it only contains the type that was specified upon creation.

A single Python list can simultaneously store integers, strings, and dictionaries. You can even add more elements of still other types to an existing list. By contrast, elements in a Python array can only be of one type. An array of integers can only contain integers and can only have other integers added to it."

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb hellerKopf:


Aber ist bookshelf nicht eine Liste, da sie verschiedene Datentypen aufnimmt ?
"The main difference between lists and arrays is that arrays constrain the object type it can store. Lists do not give you a way to limit the types of objects they contain. When using an array, you can be sure that it only contains the type that was specified upon creation.

A single Python list can simultaneously store integers, strings, and dictionaries. You can even add more elements of still other types to an existing list. By contrast, elements in a Python array can only be of one type. An array of integers can only contain integers and can only have other integers added to it."

 

ja, so oder so hat er hat halt ein objekt mit einem primitiven Typ verglichen das funzt so oder so nicht. kenn mich mit python Implementierung nicht aus

Link zu diesem Kommentar
Auf anderen Seiten teilen

Richtig was carnaqe schreibt. Eine Liste ist eine Anreihungen von Variablen. Du kannst die mit verschiedenen Datentypen befüllen.

Hier ein Beispiel

# liste = [str,int,float,list,dict]
liste = ["word",22,1.2,["hallo",1],{"Name":"Peter"}]

wenn du die nun die Datentypen abfragen würdest:

print('Ganze Liste:')
print(f'{liste:} = {type(liste)}')
print()
print('Inhalt der Liste:')
for entry in liste:
    print(f'{entry:} = {type(entry)}')

Ausgabe:

Ganze Liste:
['word', 22, 1.2, ['hallo', 1], {'Name': 'Peter'}] = <class 'list'>

Inhalt der Liste:
word = <class 'str'>
22 = <class 'int'>
1.2 = <class 'float'>
['hallo', 1] = <class 'list'>
{'Name': 'Peter'} = <class 'dict'>

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...