Python'da döngüleri azaltmak imkansız mı?


96

Yanılıyor olabilirim (sadece bana bildirin ve soruyu sileceğim) ancak python yanıt vermiyor

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

Xrange kullanmayı denedim ve işe yaramadı. Bunu nasıl uygulayabilirim?


Merak ediyorum, bunu herhangi bir şey için kullanıyor musun? Bu işlevselliğe ihtiyaç duymak oldukça nadirdir!
Katriel

@katrielalex Bir matris üzerinde sağdan sola yinelemek için kullanıyorum. yapmamı önermenin farklı bir yolu var mı?
Gal

for i in reversed(mat):daha yavaş olsa da deneyebilirsiniz
Katriel

Lütfen menzil ile ters sırada bir liste yazdır'a bir göz atın . Diğer bazı yararlı bilgiler sunar.
RF

1
Lütfen bir göz atın Aralık ile ters sırada bir liste yazdırın , kabul edilen cevap bunu çok açık bir şekilde açıklıyor.
RF

Yanıtlar:


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

20
Betcha OP aslında istedi range(5,-1,-1). Yine de bunu muhtemelen deneme yanılma yoluyla çözebilirdi.
kojiro

44

Bu çok geç, ancak daha zarif bir yol olduğunu eklemek istedim: reversed

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

verir:

4
3
2
1
0

1
Bunun nesi zarif? Bir listeyi istediğiniz şekilde oluşturmak yerine tersine çevirmek için zaman harcarsınız.
alexis

5
@alexis hiçbir şeye mal olmaz. CPython'da yerleşik olarak reversed(range)bulunan güzel range_reverseoptimizasyon sayesinde ücretsiz olarak alırsınız . Bazı hızlı kıyaslamalar yaptım step=-1ve reversed()Python 2.7 ve 3.3 arasında ve içinde önemli bir maliyet farkı bulamadım . Ayrıca bu deyimin heapq'de kullanıldığını unutmayın .
kojiro

Teşekkürler @kojiro, bu ilginç. Ancak xrangePython 2.7 testlerinizde reversekullanmadığınız sürece , bir aralık nesnesinde değil, sıradan, önceden oluşturulmuş bir listede çalışacaktır; yani herhangi bir listenin verimli bir şekilde tersine çevrilebileceğini mi söylüyorsunuz yoksa sadece range/xrangenesneler mi? (bağladığınız yığın kodu bir Python 3 aralık nesnesi içerir).
alexis

@alexis Herhangi bir listenin verimli bir şekilde tersine çevrilebileceğini önerecek kadar cesur davranmazdım - bu zaten cevaplayamayacağım kadar niteliksiz bir ifade. Heapify kod değişti, ancak, söylüyor step=-1için reversed()Python arasında 2.3 ve 2.4
Kojiro

2
reversed(range(10))muhtemelen çıkış olamaz 4yoluyla 0. Belki de demek istedin range(5)?
Abhijit Sarkar

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

Bu sana verecek 6,5,4,3,2,1

Gelince

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

sana veririm 5,4,3,2,1,0




2

0, bu koşul doğru olduğunda koşullu değerdir, döngü yürütülmeye devam edecektir. 10 başlangıç ​​değeridir. 1, basit azaltmanın olabileceği değiştiricidir.

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

1

Partiye geç kaldınız, ancak kendisininkini yaratmakla görevli olan veya bunun nasıl çalışacağını görmek isteyen herkes için, istenen artışa göre start-stop değerlerini yeniden düzenlemenin ek bir bonusu olan fonksiyon burada:

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

Negatif artış:

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

Veya start-stop tersine çevrildiğinde:

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

Çıktı:

10
9
8
7
6
5
4
3
2
1

Düzenli artış:

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

Çıktı:

1
2
3
4
5
6
7
8
9

Sıfır artış:

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

Çıktı:

'Error! Please enter nonzero increment value!'

0

Python3 -1için, her adımda azaltılacak değeri belirtin for n in range(6,0,-1): print(n)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.