for - Schleife Ausgabe

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.
Antworten
norgsmen
User
Beiträge: 55
Registriert: Samstag 26. Juni 2021, 22:09

Hi Leute,

es geht um diesen kleinen Code hier:

Code: Alles auswählen

li = [100, 78, 98, 62, 54, 36, 145]

for i in range(len(li)-2):
	test = li[i + 2]
	print(test)
Im Schleifenkopf wird ja definiert, dass von 0 bis 4 die Werte in der Liste durchlaufen werden sollen. Also → 100, 78, 98, 62, 54
Weshalb ist dann die Ausgabe für test = li[i + 2] nicht 98, 62, 54 ? Sollte die Schleife soll nicht bei 98 angefangen und bis zu den vorletzten Elementen aufhören wegen des (li)-2) ?

Danke fürs Antworten!
Benutzeravatar
Axel-WAK
User
Beiträge: 62
Registriert: Dienstag 29. November 2022, 11:52

vielleicht eher so?

Code: Alles auswählen

li = [100, 78, 98, 62, 54, 36, 145]

for i in range(len(li)-2):
	test = li[i]
	print(test)

Code: Alles auswählen

100
78
98
62
54
OS: LMDE5 *** Homepage *** Github Seite
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@norgsmen: wie Du schon geschrieben hast, nimmt i die Werte 0 bis 4 an, also geht i+2 von 2 bis 6.
Denn anderfalls muß ja i bis len(li) - 4 gehen, damit len(li) - 4 + 2 wieder len(li) - 2 ergibt.

Eingerückt wird mit 4 Leerzeichen pro Ebene, keine Tabs.
Um solche Mißverständisse zu umgehen, sollte man die Schleife gleich über die richtigen Werte laufen lassen, und sie nicht nachträglich umrechnen:

Code: Alles auswählen

li = [100, 78, 98, 62, 54, 36, 145]

for i in range(2, len(li)):
    test = li[i]
    print(test)
Über einen Index iteriert man aber nicht, sondern über die Listenelemente direkt:

Code: Alles auswählen

li = [100, 78, 98, 62, 54, 36, 145]

for test in li[2:]:
    print(test)
norgsmen
User
Beiträge: 55
Registriert: Samstag 26. Juni 2021, 22:09

@Sirius3 Achso okay. Ich dachte nämlich, die Bedingung, die man im Schleifenkopf definiert (in dem Fall: for i in range(len(li)-2)) ist konstant.
Also immer → 0 bis 4 . (ich wusste nicht das man die Bedingung im Verlauf des weiteren Codes ändern kann)

Was aber noch unverständlich ist ist, warum weitere Zahlen als 2 bis 6 ausgegeben werden, wenn ich die Liste um weitere Zahlen erweitere. Dann zählt nämlich li[i + 2] nicht mehr.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Nein, `range(len(li) + 2)` ändert sich nicht innerhalb der Schleife, weil das ja schon zu Beginn der Schleife ausgewertet wird. Daher ändert sich das auch nicht, wenn man innerhalb der Schleife die Liste ändert. Sowas sollte man aber auch niemals machen, denn das kann zu seltsamen Effekten führen. Und wie schon geschrieben, solle man gar nicht erst mit Indices anfangen.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1020
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Beispiel mit itertools.islice:

Code: Alles auswählen

from itertools import islice


li = [100, 78, 98, 62, 54, 36, 145]

# iteriere ab Index 2 bis zum Ende
for value in islice(li, 2, None):
    print(value)
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten