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?

Gal
quelle
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]
Steve Tjoa
quelle
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
pratikm
quelle
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

Handliche Jodana
quelle
3
for n in range(6,0,-1):
    print n
cji
quelle
2
>>> range(6, 0, -1)
[6, 5, 4, 3, 2, 1]
Vanza
quelle
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;
Neo
quelle
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!'
Mark Moretto
quelle
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)

SREERAG R NANDAN
quelle