24 Stimmen

For-Schleife mit benutzerdefinierten Schritten in Python

Ich kann einfache For-Loops in Python erstellen wie:

for i in range(10):

Ich konnte jedoch nicht herausfinden, wie man komplexere Schleifen macht, die in C++ wirklich einfach sind.

Wie würden Sie eine For-Schleife wie diese in Python implementieren:

for(w = n; w > 1; w = w / 2)

Das Ähnlichste, das ich bisher gemacht habe, ist:

for w in reversed(range(len(list)))

45voto

the5fire Punkte 2376
for i in range(0, 10, 2):
    print(i)

>>> 0
>>> 2
>>> 4
>>> 6
>>> 8

http://docs.python.org/2/library/functions.html

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1, 11)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> range(0, 30, 5)
[0, 5, 10, 15, 20, 25]
>>> range(0, 10, 3)
[0, 3, 6, 9]

17voto

Martijn Pieters Punkte 953257

Zuallererst: Python for-Schleifen sind nicht wirklich dasselbe wie eine C for-Schleife. Es handelt sich stattdessen um For Each-Schleifen. Dabei wird über die Elemente eines Iterators iteriert. range() erzeugt eine Sequenz von ganzen Zahlen, mit der du den häufigsten Anwendungsfall einer C for-Schleife nachahmen kannst.

Allerdings möchtest du die meiste Zeit nicht range() verwenden. Du würdest stattdessen über die Liste selbst iterieren:

for elem in reversed(some_list):
    # elem ist ein Listenwert

Wenn du einen Index benötigst, verwendest du in der Regel enumerate(), um ihn der Schleife hinzuzufügen:

for i, elem in reversed(enumerate(some_list)):
    # elem ist ein Listenwert, i ist sein Index in der Liste

Für wirklich 'verrückte' Schleifen solltest du while verwenden oder deine eigene Generatorfunktion erstellen:

def halved_loop(n):
    while n > 1:
        yield n
        n //= 2

for i in halved_loop(10):
    print i

um 10, 5, 2 zu drucken. Das kannst du auch auf Sequenzen erweitern:

def halved_loop(sequence):
    n = -1
    while True:
        try:
            yield sequence[n]
        except IndexError:
            return
        n *= 2

for elem in halved_loop(['foo', 'bar', 'baz', 'quu', 'spam', 'ham', 'monty', 'python']):
    print elem

was folgendes ausgibt:

python
monty
spam
foo

5voto

Daniel Roseman Punkte 565786

Für Ihr genaues Beispiel würden Sie wahrscheinlich überhaupt keine Schleife verwenden, sondern eine While-Schleife:

w = n
while w > 1:
    mache etwas
    w = w / 2

3voto

Shree Kumar Punkte 46

Sie müssen einen Generator verwenden. Dies könnten Sie wie folgt implementieren:

def stepDown(n):
    while n>1:
        yield n
        n = n/2

for i in stepDown(n):
    print i # oder tun Sie, was auch immer Sie möchten.

Beachten Sie, dass sich dieses Konzept leicht auf andere komplexe Muster übertragen lässt, die Sie im Sinn haben.

3voto

tobias_k Punkte 80450

Für den allgemeineren Fall könnten Sie eine benutzerdefinierte Generierungsfunktion erstellen, die einen start, stop und eine Funktion für die Generierung des nächsten Schritts aus dem letzten annimmt:

def my_range(start, stop, f):
    x = start
    while x < stop if stop > start else x > stop:
        yield x
        x = f(x)

>>> list(my_range(1, 1024, lambda x: x*2))
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]

>>> list(my_range(1000, 1, lambda x: x/2))
[1000, 500.0, 250.0, 125.0, 62.5, 31.25, 15.625, 7.8125, 3.90625, 1.953125]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X