2010-09-06 18 views
5

Ben döngüler için bir çaylak hobisi ve ben yuva olduğum döngüler için Yuvalanmış veya:Python: Öyle gibi, piton yazarken "sonraki" ifadesi

dict = { 
    key1: {subkey/value1: value2} 
    ... 
    keyn: {subkeyn/valuen: valuen+1} 
    } 

for key in dict: 
    for subkey/value in key: 
     do it to it 

Ben bir "ileri" anahtar kelimenin farkında olduğumu Aynı hedefi tek bir çizgide gerçekleştirir (bunun nasıl kullanılacağı hakkında bir soru sordum ama bunu tam olarak anlamadım).

Bu yüzden, iç içe geçmiş bir döngü çok daha okunabilir. Neden, insanlar "ileri" yi kullanıyorlar? Python'un dinamik olarak yazılmış ve yorumlanmış bir dil olduğunu ve + her ikisinin dizeleri ve sayıları birbirinden ayırabileceğini, çünkü operatörlerin ne yaptığını bilmek için her bir döngü yinelemesi için değişken türleri kontrol etmesi gerektiğini, vb. Okuduğumu okudum. Bu bir şekilde, yürütmeyi hızlandırıyor mu, yoksa sadece bir tarz/tercih meselesi mi?

cevap

20

next açık for döngü kontrol o ilerlemesi olmadan, bir yineleyici gerekli ilerlemek için değerlidir. Örneğin, "S'deki ilk öğenin 100'den büyük" olmasını istiyorsanız, next(x for x in S if x > 100) bunu size verecektir, muss yok, yaygara yok, gereksiz bir çalışma (her şey uygun bir x bulunduğunda sona erer) - ve Beklenmedik şekilde x koşuluna uymazsa bir istisna (StopIteration) alırsınız. Eşleşme beklenmediyse ve bu durumda None olmasını istiyorsanız, next((x for x in S if x > 100), None) bunu iletecektir. Bu özel amaç için, next'un aslında first olarak adlandırılmış olması sizin için daha açık olabilir, ancak bu daha genel kullanıma ihanet edecektir. Örneğin, birden çok dizinin birleştirilmesi (örneğin, sıralanmış dizilerin bir birleşimi veya kesişimi - örneğin, sıralı dosyaların, satırların olduğu satırlar) görevini düşünün. Yine, next, doktorun emrettiği şeydir, çünkü dizilerin hiçbiri, "ana for döngüsünü" kontrol ederek diğerlerinin üzerine hakim olamaz. Bu nedenle, sadeleştirme varsayarak, çoğaltmalar mevcut olmayabilir (ihtiyaç duyulduğunda rahatlamak zor olmayan bir durum), (currentitem, itsfile)'u heapq tarafından kontrol edilen bir listede tutuyorsunuz ve birleşme kolaylaşıyor ... ama sadece next'un büyüsüne teşekkürler Öğeyi kullanıldıktan sonra doğru dosyasını ve yalnızca bu dosyayı doğrulayın.

biri uzun süre devam edebileceğini), ancak iki kullanım durumlarını "tek yerine göre bir yineleyici ilerlemek -

import heapq 

def merge(*theopentextfiles): 
    theheap = [] 
    for afile in theopentextfiles: 
     theitem = next(afile, '') 
     if theitem: theheap.append((theitem, afile)) 
    heapq.heapify(theheap) 
    while theheap: 
     theitem, afile = heapq.heappop(theheap) 
     yielf theitem 
     theitem = next(afile, '') 
     if theitem: heapq.heappush(theheap, (theitem, afile)) 

Sadece ... next olmadan bir yere bu zarif bir şey yapmak deneyin next'un en önemli kullanımları için "for döngüsünün tamamını kontrol etmenize izin vermeden" ve "bir yineleyiciden yalnızca ilk öğeyi al" hesabını açın.

+0

+1 Güzel yanıt! –

+0

@AJ, teşekkürler! –

+0

+1 Yine yaptınız. Ben sadece herhangi bir ilk aka tanımlanabildiğimi fark ettim (birincisi False olmasaydı, herhangi bir sırayla False olmama ya da son olarak false olursa, son bir sonraki değer). –