Ich habe vor kurzem begonnen, Python zu lernen, und das Konzept der for-Schleifen ist für mich immer noch etwas verwirrend. Ich verstehe, dass es im Allgemeinen dem Format for x in y
folgt, wobei y
nur eine Liste ist.
Die für jede Schleife for (int n: someArray)
wird for n in someArray
,
Und die for-Schleife for (i = 0; i < 9; i-=2)
kann durch for i in range(0, 9, -2)
Angenommen, anstelle eines konstanten Inkrements wollte ich i*=2
oder sogar i*=i
. Ist das möglich, oder müsste ich stattdessen eine while-Schleife verwenden?
Wie Sie sagen, durchläuft eine for
-Schleife die Elemente einer Liste. Die Liste kann alles enthalten, was Sie möchten, damit Sie eine Liste erstellen können, die jeden Schritt enthält.
Eine for
-Schleife kann auch über einen "Generator" iterieren, bei dem es sich um ein kleines Stück Code handelt eine aktuelle Liste. In Python ist range()
eigentlich ein Generator (in Python 2.x hingegen lieferte range()
eine Liste, während xrange()
der Generator war).
Zum Beispiel:
%Vor% Die obige for
Schleife wird gedruckt
und so weiter, bis Sie Strg + C drücken.
Sie können einen Generatorausdruck verwenden, um dies effizient und mit wenig überschüssigem Code zu tun:
%Vor%Generatorausdrücke funktionieren genauso wie das Definieren eines manuellen Generators (wie in Greg Hewgills Antwort ), mit einer Syntax, die a ähnelt Listenverständnis. Sie werden träge bewertet - was bedeutet, dass sie zu Beginn der Operation keine Liste generieren, was bei großen Iterablen eine viel bessere Leistung bewirken kann.
Dieser Generator arbeitet also, indem er wartet, bis er nach einem Wert gefragt wird, dann fragt range(10)
nach einem Wert, verdoppelt diesen Wert und gibt ihn an die for
-Schleife zurück. Dies geschieht so oft, bis der range()
Generator keine weiteren Werte mehr liefert.
Beachten Sie, dass der Listen-Teil von Python eine beliebige iterierbare Sequenz sein kann.
Beispiele:
Eine Zeichenfolge:
%Vor%Eine Datei:
%Vor%Ein Wörterbuch:
%Vor%Ein Stück einer Liste:
%Vor%usw. usw. etc usw.
Also ist es wirklich viel tiefer als "nur eine Liste"
Wie andere bereits gesagt haben, setze einfach das iterable so, wie es für deine Beispielfragen sein soll:
%Vor%Sie sollten dafür Aufzählungen verwenden
%Vor%und
%Vor%Die Syntax des Listenverständnisses lautet wie folgt:
%Vor%Unter der Haube verhält es sich ähnlich wie die Karten- und Filterfunktion :
%Vor%Beispiel gegeben:
%Vor%und
%Vor%Dies kann als alternativer Ansatz verwendet werden, wenn Sie keine Listenergänzungen mögen. Du könntest auch eine for-Schleife verwenden, aber das würde weg von Python idiomatisch sein ...
Nur für eine Alternative, wie wäre es mit der Verallgemeinerung der Iterate / Inkrement-Operation zu einer Lambda-Funktion, so dass Sie so etwas tun können:
%Vor% Dabei ist seq
wie folgt definiert:
Der Unterschied in der Leistung ist nicht so viel:
%Vor%[BEARBEITEN]
Zur Unterstützung der umgekehrten Iteration und mit einem Standardargument ...
%Vor% Hinweis: Dies verhält sich anders als range
/ xrange
, wobei die Richtung <
/ >
Test durch das Iteratorzeichen und nicht durch die Differenz zwischen Start- und Endwerten ausgewählt wird.