Diminuire i loop in Python impossibile?


93

Potrei sbagliarmi (fammelo sapere e cancellerò la domanda) ma sembra che Python non risponderà

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

Ho provato a usare xrange e non ha funzionato neanche. Come posso implementarlo?


Per curiosità, lo usi per qualcosa? È piuttosto raro aver bisogno di questa funzionalità!
Katriel,

@katrielalex Lo uso per iterare su una matrice da destra a sinistra. c'è un modo diverso in cui mi suggerisci di farlo?
Gal

potresti provare for i in reversed(mat):anche se potrebbe essere più lento
Katriel

Si prega di dare un'occhiata a Stampa un elenco in ordine inverso con la gamma , Offre alcune altre informazioni utili.
RF

1
Si prega di dare un'occhiata Stampa un elenco in ordine inverso con intervallo , la risposta accettata lo spiega molto chiaramente.
RF

Risposte:


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

20
Betcha OP voleva davvero range(5,-1,-1). Anche se probabilmente poteva capirlo per tentativi ed errori.
kojiro

42

È molto tardi, ma volevo solo aggiungere che esiste un modo più elegante: usare reversed

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

dà:

4
3
2
1
0

1
Cosa c'è di elegante in questo? Trascorri del tempo a invertire un elenco invece di generarlo nel modo desiderato.
alexis

5
@alexis non costa nulla. Ottieni reversed(range)gratuitamente grazie alla bella range_reverseottimizzazione integrata in CPython. Ho eseguito alcuni rapidi benchmark e non sono riuscito a trovare una differenza di costo significativa tra step=-1e reversed()in Python 2.7 e 3.3. Inoltre, tieni presente che questo idioma è usato in heapq .
kojiro

Grazie, @kojiro, è interessante. Ma a meno che tu non l'abbia usato xrangenei tuoi test Python 2.7, reversefunzionerà su un normale elenco già generato, non su un oggetto intervallo; quindi stai dicendo che qualsiasi elenco può essere invertito in modo efficiente o solo range/xrangeoggetti? (il codice heapq a cui ci si collega coinvolge un oggetto range Python 3).
alexis

@alexis Non sarei così audace da suggerire che qualsiasi elenco può essere invertito in modo efficiente - questa è un'affermazione troppo poco qualificata per me per rispondere comunque. È significativo, tuttavia, che il codice heapify sia cambiato da step=-1a reversed()tra Python 2.3 e 2.4
kojiro

1
reversed(range(10))non può assolutamente uscita 4attraverso 0. Forse intendevi range(5)?
Abhijit Sarkar

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

Questo ti darebbe 6,5,4,3,2,1

Quanto a

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

ti darei 5,4,3,2,1,0




2

0 è il valore condizionale quando questa condizione è vera, il ciclo continuerà a essere eseguito 10 è il valore iniziale. 1 è il modificatore dove può essere un semplice decremento.

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

1

In ritardo alla festa, ma per chiunque abbia il compito di crearne uno proprio o vuole vedere come funzionerebbe, ecco la funzione con un ulteriore vantaggio di riorganizzare i valori start-stop in base all'incremento desiderato:

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

Incremento negativo:

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

Oppure, con start-stop invertito:

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

Produzione:

10
9
8
7
6
5
4
3
2
1

Incremento regolare:

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

Produzione:

1
2
3
4
5
6
7
8
9

Incremento zero:

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

Produzione:

'Error! Please enter nonzero increment value!'

0

Per python3 dove -1indicare il valore che deve essere decrementato in ogni passaggio for n in range(6,0,-1): print(n)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.