For-Schleifen (Anfänger)
Ich habe vor kurzem angefangen zu lernen, Python, und das Konzept der for-Schleifen ist immer noch ein wenig verwirrend für mich. Ich verstehe, dass es, folgt in der Regel das format for x in y
, wo y
nur einige der Liste.
Die for-each-Schleife for (int n: someArray)
wird for n in someArray
,
Und die for-Schleife for (i = 0; i < 9; i-=2)
dargestellt werden kann, durch for i in range(0, 9, -2)
Angenommen, anstelle einer Konstanten Schrittweite, wollte ich i*=2
oder sogar i*=i
. Ist das möglich, oder würde ich mit einer while-Schleife statt?
- Ihre
for i in range(0,9,-2)
nicht rückwärts Durchlaufen, wenn die erste Nummer, wenn weniger als die zweite. - Genauer gesagt, die range() cant ein array mit einem negativen Schritt für einen positiven Wert. Es ist eine unendliche Schleife.
- wollen Sie diese als die Werte von i: 1 2, 4, 8, 16, 32....
- Letztere
for
Schleife hat kein richtiges Ende-Bedingung, wenni
ist einint
und das ist, C. In jedem Fall ist es nicht der Bereich, den Sie sagte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie Sie sagen, ein
for
Schleife iteriert durch die Elemente einer Liste. Die Liste kann enthalten alles, was Sie wollen, so können Sie eine Liste erstellen, dass vorher enthält jeden Schritt.Einen
for
Schleife kann auch Durchlaufen eine "generator", das ist ein kleines Stück code anstelle der eigentlichen Liste. In Pythonrange()
ist eigentlich ein generator (in Python 2.x obwohlrange()
zurückgegeben wird eine Liste, währendxrange()
war der generator).Beispiel:
Den oben
for
Schleife druckenund so weiter, bis du Strg+C drücken.
for i in (x*2 for x in range(10)):
Können Sie eine generator-Ausdruck dies zu tun, effizient und mit wenig überflüssigen code:
Generator-Ausdrücke funktioniert genauso wie das definieren einer manuellen generator (wie in Greg Hewgill Antwort), mit einer syntax ähnlich zu einer Liste erfassen. Sie werden ausgewertet, träge - was bedeutet, dass Sie nicht erzeugen einer Liste am Anfang des Vorgangs, der kann eine viel bessere Leistung auf große iterables.
Also dieser generator funktioniert, indem Sie warten, bis es aufgefordert wird, einen Wert, dann Fragen
range(10)
für einen Wert, verdoppeln Sie diesen Wert, und übergeben Sie es zurück an diefor
Schleife. Er tut dies wiederholt, bis dierange()
generator liefert keine Werte mehr.doubles = (x*2 for x in range(10))
Schleife überdoubles
. Wenn Sie vergleichen Sie mit Ihrer Antwort - eine Liste Verständnis - wir sind buchstäblich ein Gespräch über unterschiedliche Halterungen, die außerhalb des Ausdrucks. Wie ist das weniger lesbar oder wartbar?Beachten Sie, dass die 'Liste' - Teil von Python können beliebige wiederholenden Sequenz.
Beispiele:
String:
Datei:
Wörterbuch:
Einer Scheibe eine Liste:
etc etc etc etc
Also es ist wirklich viel tiefer, als 'nur einige Liste'
Wie andere bereits gesagt haben, setzen Sie einfach die iterierbar zu sein, was Sie wollen, dass es für dein Beispiel Fragen:
the concept of for loops is still a little confusing for me. I understand that it generally follows the format for x in y, where y is just some list.
ich war klargestellt, dass y ist eine Menge mehr als nur einige-Liste"Möchten Sie Liste Verstehens für diese
und
Die list comprehension syntax ist wie folgt:
Unter der Haube, es wirkt ähnlich wie die map-und filter-Funktion:
Beispiel gegeben:
und
Kann verwendet werden, als alternativer Ansatz wenn Sie nicht wie die Liste Verstehens.
Könntest du auch eine for-Schleife verwenden, aber das würde Schritt Weg von der Python-Redewendungen...
0*2
durch4999999*2
, dann Schleife über Sie. Ein generator-Ausdruck wird berechnet, wie gebraucht.Programmers waste enormous amounts of time thinking about, or worrying about, the speed of noncritical parts of their programs, and these attempts at efficiency actually have a strong negative impact when debugging and maintenance are considered. We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%.
print()
Aussagen und so ist es nicht wirklich wichtig. Im Falle eines Falles können Sie nur wickeln Sie Ihre generator inlist()
zu sehen, ist es Ausgabe. Ich habe gedebuggt viele Probleme in Python-während der Verwendung von Generatoren. Wie, um es einfach zu halten, - einen generator-Ausdruck ist nicht komplexer als eine Liste Verständnis.Nur für eine alternative, wie etwa die Verallgemeinerung der Iteration/Inkrement-operation, um eine lambda-Funktion, so können Sie etwas wie das hier tun:
Wo
seq
unten definiert ist:Den Unterschied in der Leistung ist nicht viel:
[BEARBEITEN]
Zur Unterstützung von reverse iteration und mit einem default-argument...
Hinweis: Dies verhält sich anders zu
range
/xrange
in die Richtung<
/>
test wird gewählt, indem Sie das iterator-Zeichen, sondern als die Differenz zwischen start-und end-Werte.