2010-04-12 15 views
5

Bunu Python'da yapmanın en iyi yolu nedir? For-döngüler

for (v = n/2 - 1; v >= 0; v--) 

Aslında ilk Google'ı çalıştı, ancak bildiğim kadarıyla gördüğünüz gibi tek çözüm while kullanmak olacaktır.

cevap

13

bunu yapmanın yolu xrange() ile geçerli:

for v in xrange(n // 2 - 1, -1, -1): 

(Python 3.x Veya, range() yerine xrange() ile.) // sonuç bir tam sayıdır emin olur döşeme bölümüdür .

+0

hughdbrown'ın sürümü doğru yanıt olarak işaretlenmiş olmalıdır – rbp

-1
for v in xrange(n/2 - 1, 0, -1): 
    #your code here 

V ve n int S veya int s olarak işlemden geçirilir. Bu, bölünmenin bir tamsayı bölümü, yani 1/2 == 0 is True olacağı anlamına gelir.

Not: Bu Python 2.x içindir.

+0

-1: Bu bir çok az öğe var. Yanlış 0 'değerini atar. Ayrı bir şekilde, python3'te başarısız olur, çünkü n/2' bir float oluşturur ('TypeError: 'float' nesnesi bir tamsayı olarak yorumlanamaz '). Ama belki de bu yüzden python 2.x için olduğunu söylediniz. – hughdbrown

5
for v in range(n//2, -1, -1) 

Ancak vakaların% 90'ında C/Java/C# bir for döngü kullanmış ne zaman/VB, ne gerçekten istediğiniz list comprehension geçerli:

listOfStuff = [doSomethingWith(v) for v in range(n//2, -1, -1)] 
+0

-1: Çok fazla ürün var. Yanlış n '2 //' içerir. – hughdbrown

15

Bunu yapacağını :

for i in reversed(range(n // 2)): 
    # Your code 
    pass 

Bu ters alt sınır ne dizisi, ve ne üst limiti, bu biraz daha açık.

+3

veya "ters (xrange (…))", bu da çalışıyor. – tzot

+0

+1 Bunu en iyi şekilde beğeniyorum –

+1

@ ΤΖΩΤΖΙΟΥ: true, ancak bu düşünebileceğiniz bir faydası yok. 3.0 öncesi pitonlarda aralık() tüm verileri bir kerede çeker. xrange(), bir defada yalnızca bir öğe çekerek bir jeneratör gibi davranır. Ancak bir diziyi tersine çevirecekseniz, bir seferde tüm verilere ihtiyacınız vardır, bu yüzden tersine çevrilmiş (range()) ve tersine (xrange()) aynı şekilde çalışacaktır: her biri, daha önce çekilen tüm verilere sahip olacaklardır. ters çevrildi. – hughdbrown