Verringern für Schleifen in Python unmöglich?


93

Ich könnte mich irren (lass es mich wissen und ich werde die Frage löschen), aber es scheint, dass Python nicht darauf reagiert

for n in range(6,0):
    print n

Ich habe versucht, xrange zu verwenden, und es hat auch nicht funktioniert. Wie kann ich das umsetzen?


Verwenden Sie dies aus Neugier für irgendetwas? Es ist eher ungewöhnlich, diese Funktionalität zu benötigen!
Katriel

@katrielalex Ich benutze es, um eine Matrix von rechts nach links zu durchlaufen. Gibt es eine andere Möglichkeit, wie ich es tun soll?
Gal

Sie könnten versuchen, for i in reversed(mat):obwohl das langsamer sein könnte
Katriel

Bitte werfen Sie einen Blick auf Drucken Sie eine Liste in umgekehrter Reihenfolge mit Bereich . Es bietet einige andere hilfreiche Informationen.
RF

1
Bitte werfen Sie einen Blick Drucken Sie eine Liste in umgekehrter Reihenfolge mit Bereich , die akzeptierte Antwort erklärt es sehr deutlich.
RF

Antworten:


214
for n in range(6,0,-1):
    print n
# prints [6, 5, 4, 3, 2, 1]

20
Betcha OP wollte eigentlich range(5,-1,-1). Obwohl er das wahrscheinlich aus Versuch und Irrtum herausfinden konnte.
Kojiro

42

Dies ist sehr spät, aber ich wollte nur hinzufügen, dass es einen eleganteren Weg gibt: Verwenden reversed

for i in reversed(range(10)):
    print i

gibt:

4
3
2
1
0

1
Was ist daran elegant? Sie verbringen Zeit damit, eine Liste umzukehren, anstatt sie so zu generieren, wie Sie es möchten.
Alexis

5
@alexis es kostet nichts. Sie erhalten reversed(range)kostenlos aufgrund der range_reversein CPython integrierten netten Optimierung. Ich habe einige schnelle Benchmarks durchgeführt und konnte keinen signifikanten Kostenunterschied zwischen step=-1und reversed()in Python 2.7 und 3.3 feststellen . Bitte beachten Sie auch, dass diese Redewendung in heapq verwendet wird .
Kojiro

Danke, @kojiro, das ist interessant. Sofern Sie nicht xrangein Ihren Python 2.7-Tests verwendet haben, reversewird eine normale, bereits generierte Liste und kein Bereichsobjekt verwendet. Wollen Sie damit sagen, dass jede Liste effizient umgekehrt werden kann oder nur range/xrangeObjekte? (Der Heapq-Code, mit dem Sie verknüpfen, enthält ein Python 3-Bereichsobjekt.)
Alexis

@alexis Ich wäre nicht so mutig zu behaupten, dass eine Liste effizient rückgängig gemacht werden kann - das ist eine zu uneingeschränkte Aussage, als dass ich sie hätte beantworten können. Es erzählt aber, dass der heapify Code geändert von step=-1zu reversed()zwischen Python 2.3 und 2.4
kojiro

1
reversed(range(10))kann unmöglich 4durch ausgeben 0. Vielleicht hast du gemeint range(5)?
Abhijit Sarkar

12
for n in range(6,0,-1)

Das würde dir geben 6,5,4,3,2,1

Wie für

for n in reversed(range(0,6))

würde dir geben 5,4,3,2,1,0




2

0 ist ein bedingter Wert, wenn diese Bedingung erfüllt ist. Die Schleife wird weiterhin ausgeführt. 10 ist der Anfangswert. 1 ist der Modifikator, bei dem es sich möglicherweise um eine einfache Dekrementierung handelt.

for number in reversed(range(0,10,1)):
print number;

1

Spät zur Party, aber für alle, die ihre eigenen erstellen möchten oder sehen möchten, wie dies funktionieren würde, gibt es hier die Funktion mit dem zusätzlichen Bonus, die Start-Stopp-Werte basierend auf dem gewünschten Inkrement neu anzuordnen:

def RANGE(start, stop=None, increment=1):
    if stop is None:
        stop = start
        start = 1

    value_list = sorted([start, stop])

    if increment == 0:
        print('Error! Please enter nonzero increment value!')
    else:
        value_list = sorted([start, stop])
        if increment < 0:
            start = value_list[1]
            stop = value_list[0]
            while start >= stop:
                worker = start
                start += increment
                yield worker
        else:
            start = value_list[0]
            stop = value_list[1]
            while start < stop:
                worker = start
                start += increment
                yield worker

Negatives Inkrement:

for i in RANGE(1, 10, -1):
    print(i)

Oder mit umgekehrtem Start-Stopp:

for i in RANGE(10, 1, -1):
    print(i)

Ausgabe:

10
9
8
7
6
5
4
3
2
1

Regelmäßiges Inkrement:

for i in RANGE(1, 10):
    print(i)

Ausgabe:

1
2
3
4
5
6
7
8
9

Null-Inkrement:

for i in RANGE(1, 10, 0):
    print(i)

Ausgabe:

'Error! Please enter nonzero increment value!'

0

Geben Sie für Python3 -1den Wert an, der in jedem Schritt dekrementiert werden soll for n in range(6,0,-1): print(n)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.