Liste ergänzen

Code-Stücke können hier veröffentlicht werden.
Antworten
Nobody0815
User
Beiträge: 16
Registriert: Dienstag 23. Februar 2021, 21:25

Hallo,

der nachfolgende Code hat keinen tieferen Sinn, sondern ist nur zur Übung im Umgang mit Listen entstanden.
Im 1. Abschnitt werden zwei Zahlen definiert.
Im 2. Abschnitt wird eine leere Liste (list) angelegt und mit Zahlen zwischen 1 (a) und 10 (b) befüllt. Dabei werden nur gerade Zahlen berücksichtigt. Die Liste ist am Ende des Abschnitts mit 2, 4, 6, 8, 10 gefüllt.
Im 3. Abschnitt soll jedes Element (2, 4, 6, 8, 10) der Liste (list) um den Wert 1 erhöht werden und an die Liste angehängt werden.

Leider führt die Verwendung von "list.append(i)" in eine Unendlichkeitsschleife. Mir ist allerdings nicht klar warum? Wäre schön, wenn mir jemand halfen könnte das Problem/Verhalten zu verstehen.

Code: Alles auswählen

# 1. Abschnitt
a = 1
b = 10

# 2. Abschnitt
list = []
while a <= b:
    if not a % 2:
        list.append(a)
    a = a + 1
print(list)

# 3. Abschnitt
for i in list:
    i = i + 1
    list.append(i)
 
# 4. Abschnitt
print(list)
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Man darf keine Listen, über die man gerade iteriert, nicht verändern.
Nobody0815
User
Beiträge: 16
Registriert: Dienstag 23. Februar 2021, 21:25

Sirius3 hat geschrieben: Donnerstag 22. April 2021, 21:44 Man darf keine Listen, über die man gerade iteriert, nicht verändern.

Hmm ... aber so gehts auch nicht?

Code: Alles auswählen

# 1. Abschnitt
a = 1
b = 10

# 2. Abschnitt
list = []
while a <= b:
    if not a % 2:
        list.append(a)
    a = a + 1
print(list)

# 3. Abschnitt
list = list1
for i in list1:
    i = i + 1
    list1.append(i)
 
# 4. Abschnitt
print(list1)
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

list und list1 sind ja das selbe Listenobjekt.
Nobody0815
User
Beiträge: 16
Registriert: Dienstag 23. Februar 2021, 21:25

Sirius3 hat geschrieben: Donnerstag 22. April 2021, 22:00 list und list1 sind ja das selbe Listenobjekt.
Jetzt hab ich es verstanden. Danke Sirius! :)
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Nobody0815: Auch wenn es keinen tieferen Sinn hat, sollte man sich das Eingebaute `list` nicht verdecken.

Code: Alles auswählen

#!/usr/bin/env python3
from itertools import islice


def main():
    # 1. Abschnitt
    a = 1
    b = 10

    # 2. Abschnitt
    items = [value for value in range(a, b + 1) if value % 2 == 0]
    print(items)

    # 3. Abschnitt
    items.extend(value + 1 for value in islice(items, len(items)))

    # 4. Abschnitt
    print(items)


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

Hier muss ich auch wegen 1 Sache mal zumVerständnis einhaken:

Code: Alles auswählen


# 1. Abschnitt
a = 1
b = 10

# 2. Abschnitt
list = []
while a <= b:
    if not a % 2:
        list.append(a)
    a = a + 1
print(list)

Das allein gibt ja eine Liste aus 2, 4, 6, 8 , 10

Aufgrund des if not a %2:
Aber das verstehe ich nicht.

Das ist doch ein Modulo
Er teilt doch a durch 2 und gibt den Rest aus.

Was soll if not a %2: bewirken?
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

Zur Erklärung:

Code: Alles auswählen

2 % 2
3 % 2
4 % 2
5 % 2
1 == True
0 == False
Allerdings würde man das auch so nicht schreiben, weil schlecht verständlich. Eher

Code: Alles auswählen

for number in range(100):
    if number % 2 == 0:
        print(number)
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@einfachTobi: hier kann es nur 0 oder 1 als Ergebnis geben aber allgemein gilt: True ist alles was nicht 0 ist (oder Leerstring, oder leere Liste, oder ...).
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

einfachTobi hat geschrieben: Dienstag 21. Dezember 2021, 13:45 Zur Erklärung:

Code: Alles auswählen

2 % 2
3 % 2
4 % 2
5 % 2
1 == True
0 == False
Allerdings würde man das auch so nicht schreiben, weil schlecht verständlich. Eher

Code: Alles auswählen


for number in range(100):
    if number % 2 == 0:
        print(number)

Verstehe ich nicht.
% gibt doch nur den Rest aus…
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und wenn der Rest 0 ist, ist die Zahl gerade.
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

__deets__ hat geschrieben: Dienstag 21. Dezember 2021, 21:25 Und wenn der Rest 0 ist, ist die Zahl gerade.
Ich verstehe grundsätzlich nicht was da gerechnet wird.

Ich bei 7 % 3 ist es 1
Bei 10 % 4 ist es 2
Aber hier verstehe ich es nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@andie39: Das ist der Rest. Division in der Grundschule nur mit ganzen Zahlen. 7 geteilt durch 3 ist 2 (2*3=6) Rest 1 (7-2*3), 10 durch 4 ist 2 (2*4=8) Rest 2 (10-2*4). Und beim Teilen durch zwei ist der Rest immer 0 wenn die Zahl gerade war und 1 wenn die Zahl ungerade war. ``//`` ist der Operator um bei ganzen Zahlen den ganzzahligen Anteil der Division zu bekommen, und ``%`` ist der Operator um den Rest einer ganzzahligen Division zu bekommen. Mathematischer Name: Modulo-Operator.

Eine gängige Anwendung ist das feststellen ob eine Zahl glatt durch eine andere teilbar ist, denn dann ist der Rest ja 0. Eine andere Anwendung ist bei ”zyklischen” Werten das Ergebnis wieder in den richtigen Zahlenbereich zu bringen. Zum Beispiel bei der Uhrzeit. Wenn man 23 Uhr hat und da meinetwegen 5 Stunden drauf addiert, dann hat man ja nicht 28 Uhr sondern (23 + 5) % 24 = 4 Uhr.

Neben den Operatoren gibt es noch die `divmod()`-Funktion die beides ausrechnet und als Paar liefert. Wenn man beispielsweise Sekunden hat, und wissen möchte wie viele Minuten und Sekunden das sind, beispielsweise 1000 Sekunden:

Code: Alles auswählen

In [5]: divmod(1000, 60)                                                        
Out[5]: (16, 40)
Sind 16 Minuten und 40 Sekunden.

Edit: Beim heutigen Advent of Code-Puzzle kann man das beispielsweise gebrauchen. Da gibt es ein Spielbrett mit 10 Feldern mit Punktwerten drauf die im Kreis angeordnet sind, und man muss würfeln und die Spielfigur dann um die gewürfelte Anzahl Felder weiterbewegen und dann schauen auf welchem Feld man steht und die Punkte zu seinem Punktestand addieren. Und das mit dem Weiterziehen kann man wie mit dem Uhrbeispiel machen. Nur das es keine 12 Stunden gibt, sondern 10 Felder.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

Wie zuvor erwähnt. Ich weiss das es Modulo heisst und das es den Rest ausgibt.

Aber jetzt weiß ich was du meinst.
Klar es wird durch 2 geteilt dann ist bei einer geraden Zahl der Rest immer 0 und bei einer geraden immer 1


Danke.
Antworten