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)?
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;
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:
for i in reversed(mat):
chociaż może to być wolniejszeOdpowiedzi:
for n in range(6,0,-1): print n # prints [6, 5, 4, 3, 2, 1]
źródło
range(5,-1,-1)
. Chociaż prawdopodobnie mógłby to rozgryźć metodą prób i błędów.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
źródło
reversed(range)
za darmo dzięki ładnejrange_reverse
optymalizacji wbudowanej w CPython. Zrobiłem kilka szybkich punktów odniesienia i nie mógł znaleźć znaczącą różnicę między kosztemstep=-1
areversed()
zarówno Python 2.7 i 3.3. Należy również zauważyć, że ten idiom jest używany w heapq .xrange
w swoich testach Pythona 2.7,reverse
bę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 tylkorange/xrange
obiekty? (kod heapq, do którego tworzysz łącze, zawiera obiekt zakresu Python 3).step=-1
nareversed()
między Pythonem 2.3 a 2.4reversed(range(10))
nie może wyjść4
przez0
. Może miałeś na myślirange(5)
?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
źródło
for n in range(6,0,-1): print n
źródło
>>> range(6, 0, -1) [6, 5, 4, 3, 2, 1]
źródło
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;
źródło
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!'
źródło
Dla python3, gdzie wskaż
-1
wartość, która ma być zmniejszana w każdym krokufor n in range(6,0,-1): print(n)
źródło