Zmniejszenie liczby pętli w Pythonie niemożliwe?


96

Mogę się mylić (po prostu daj mi znać, a usunę pytanie), ale wygląda na to, że Python nie odpowie

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

Próbowałem użyć xrange i to też nie zadziałało. Jak mogę to zaimplementować?


Czy z ciekawości używasz tego do czegoś? Ta funkcja jest raczej rzadka!
Katriel

@katrielalex Używam go do iteracji po macierzy od prawej do lewej. czy sugerujesz, że powinienem to zrobić w inny sposób?
Gal

możesz spróbować, for i in reversed(mat):chociaż może to być wolniejsze
Katriel

Proszę spojrzeć na Wydrukuj listę w odwrotnej kolejności z zakresem , zawiera ona kilka innych przydatnych informacji.
RF,

1
Proszę spojrzeć Wydrukuj listę w odwrotnej kolejności z zakresem , zaakceptowana odpowiedź wyjaśnia to bardzo wyraźnie.
RF,

Odpowiedzi:


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

20
Właściwie chciałem Betcha OP range(5,-1,-1). Chociaż prawdopodobnie mógłby to rozgryźć metodą prób i błędów.
kojiro

43

Jest już bardzo późno, ale chciałem tylko dodać, że istnieje bardziej elegancki sposób: używanie reversed

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

daje:

4
3
2
1
0

1
Co w tym eleganckiego? Spędzasz czas odwracając listę zamiast generować ją tak, jak chcesz.
Alexis

5
@alexis to nic nie kosztuje. Otrzymujesz reversed(range)za darmo dzięki ładnej range_reverseoptymalizacji wbudowanej w CPython. Zrobiłem kilka szybkich punktów odniesienia i nie mógł znaleźć znaczącą różnicę między kosztem step=-1a reversed()zarówno Python 2.7 i 3.3. Należy również zauważyć, że ten idiom jest używany w heapq .
kojiro

Dzięki, @kojiro, to interesujące. Ale jeśli nie użyłeś xrangew swoich testach Pythona 2.7, reversebędzie działać na zwykłej, już wygenerowanej liście, a nie na obiekcie zakresu; więc czy chcesz powiedzieć, że dowolną listę można skutecznie odwrócić, czy tylko range/xrangeobiekty? (kod heapq, do którego tworzysz łącze, zawiera obiekt zakresu Python 3).
alexis

@alexis Nie byłbym na tyle odważny, aby sugerować, że każdą listę można skutecznie odwrócić - i tak jest to zbyt bezwarunkowe stwierdzenie, abym mógł odpowiedzieć. Znamienne jest jednak, że kod heapify zmienił się z step=-1na reversed()między Pythonem 2.3 a 2.4
kojiro

1
reversed(range(10))nie może wyjść 4przez 0. Może miałeś na myśli range(5)?
Abhijit Sarkar

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

To dałoby ci 6,5,4,3,2,1

Jeśli chodzi o

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

dałby ci 5,4,3,2,1,0




2

0 jest wartością warunkową, gdy ten warunek jest prawdziwy, pętla będzie wykonywana dalej. 10 jest wartością początkową. 1 to modyfikator, gdzie może być prostym zmniejszeniem.

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

1

Spóźniony na imprezę, ale dla każdego, kto ma za zadanie stworzyć własne lub chce zobaczyć, jak to zadziała, oto funkcja z dodatkową zaletą przestawiania wartości start-stop na podstawie pożądanego przyrostu:

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

Ujemny przyrost:

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

Lub z odwróceniem start-stop:

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

Wynik:

10
9
8
7
6
5
4
3
2
1

Regularny przyrost:

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

Wynik:

1
2
3
4
5
6
7
8
9

Zero przyrostu:

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

Wynik:

'Error! Please enter nonzero increment value!'

0

Dla python3, gdzie wskaż -1wartość, która ma być zmniejszana w każdym kroku for n in range(6,0,-1): print(n)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.