2010-12-01 36 views
9

C aşağıdaki kodu düşünün:Döngü

for(int i=0; i<10 && some_condition; ++i){ 
    do_something(); 
} 

Python içinde benzer bir şey yazmak istiyorum. Aklıma gelen en iyi versiyonu: Açıkçası

i = 0 
while some_condition and i<10: 
    do_something() 
    i+=1 

, ben for döngüler taklit while döngüler sevmiyorum. Bu, karşı değişkeni arttırmayı unutma riskinden kaynaklanmaktadır. Bu riski adresleriyle Başka bir seçenek vardır:

for i in range(10): 
    if not some_condition: break 
    do_something() 

Önemli döngü sırasında hesaplanacak anlamına gelmez açıklamalar

  1. some_condition değil, ilk döngü başlatmak için belirtmek için Ben

python2.6

bahsediyorum

  • yerleştirmek

    Hangi stil tercih edilir? Bunu yapmak için daha iyi bir deyim var mı? Genelde

  • +0

    Bu bence kişisel tercih meselesi. – NPE

    +0

    Python'un hangi sürümü? – khachik

    +1

    Sanırım Python, aslında döngü sayacını kullanmayacağınızı açıkça belirtebilmeniz için katı: 'gibi bir yapının olması gerektiğini düşünüyorum. –

    cevap

    7

    , "range + break" tarzı tercih edilir - ama Python 2.x, (bu talep üzerine yerine aslında numaralarının listesini yapma değerlerini oluşturur) yineleme için xrange yerine range kullanın.

    Fakat her zaman bağlıdır. Bu bağlamda 10 numaraya özel olan nedir? Tam olarak ne some_condition nedir? Vb

    Tepki güncellemek için: some_condition bir "değişmez döngü" döngü sırasında değişmez, yani sanki

    geliyor. Bu durumda, sadece ilk test etmeli:

    if some_condition: 
        for i in xrange(10): 
        do_something() 
    
    +0

    10 ve aralık, bunun sadece 'my_array'da' için olabileceği örneklerdir. Soruda açıklandığı gibi, "some_condition", programın döngüyü yapması gerekip gerekmediğini kontrol eder veya –

    +0

    'u atlar. Sürümünüz basittir ve çalışır. Sadece ek girinti ayırmak istedim. Teşekkürler –

    3

    for döngüler sabit üst sınır ile Python biraz nadirdir. Eğer somearray üzerinden yineleme varsa, yapmanız olabilir:

    for i in xrange(len(somearray)): 
        if not some_condition: 
         break 
        do_sth_with(i, somearray[i]) 
    

    veya daha iyi:

    for i, item in enumerate(somearray): 
        if not some_condition: 
         break 
        do_sth_with(i, item) 
    
    8

    Bu ilişkili olmayabilir, ama some_condition ise ben ... yapmaya alışkın olduğum var Eğer öğelerinden bazılarını liste yineleme zaman

    def some_condition(element): 
        return True#False 
    
    for i in filter(some_condition, xrange(10)): 
        pass 
    

    da bu yaklaşımı kullanabilirsiniz: yeterince basit, sen üzerinde yineleme bir fonksiyonu ve filter öğeleri koydu.

    selected = filter(some_condition, to_process) 
    for i, item in enumerate(selected): 
        pass 
    

    Yine, bu sizin durumunuz olmayabilir, sorunlarınıza bağlı olarak öğeleri filtreleme yöntemini seçmelisiniz.

    +1

    Veya, daha da kısa ve daha az okunabilir hale getirilmesi: 'i filtrede (lambda x: Doğru, aralık (10)): do_something()' –