Python da iç içe döngüden tamemen çıkmak nasıl yapılır?

Merhaba arkadaşlar,
İç içe döngüde break ile iç döngüden çıkabiliyoruz ama bir üst döngüden nasıl çıkarız.Yalnızca bir üst döngüden çıkış yapmalıyım, program sonlanmamalı.(yani exit() kullanmadan.)
Yani kotlinde etiket(label) ile şöyle yapılıyor, bunun python da nasıl yaparım.
val numbers = 1…3
val numbers2 = 1…3

    cikis@for(sayi in numbers){
        for(sayi2 in numbers){
            if(sayi2 == 3){
               break@cikis
            }
             println("Dıştaki döngü : $sayi , İçteki Döngü : $sayi2")
         }
    }
 
Konsol Çıktısı:
Dıştaki döngü : 1 , İçteki Döngü : 1
Dıştaki döngü : 1 , İçteki Döngü : 2

Python böyle bir şey yok diye biliyorum. Ama, şöyle birşey deneyebiliriz. Döngüleri fonksiyon içerisinde kontrol etmek.

def dongu():
    for i in range(20):
        for k in range(20):
            for l in range(20):
                if(l == 10):
                    return
                else:
                    print("{} {} {}".format(i,k,l))

dongu()

Diğer yöntemleri de inceleyebilirsiniz

1 Beğeni

@coderistan çok teşekkür ederim, sayfadaki örnekleri inceledim ve tabi senin verdiğin örneği de gayet başarılı bir de şu örnek çok hoşuma gitti, hele dekaratörle kullanılacak şekilde ayarlandığında kotlinden farkı kalmayacak gibi :slight_smile:
Belirli bir döngüden çıkmak için aşağıdaki kod bloğu en beğendiğim oldu :blush:

class LoopLabel(object):
    def __init__(self):
        super(LoopLabel, self).__init__()

        class MyLoopLabel(Exception): pass
        self._label_exception = MyLoopLabel

    def __enter__(self):
        return self._label_exception

    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type is self._label_exception:
            return True

        return False
        

# And usage:
with LoopLabel() as loop1:
    for x in range(10):
        print "x", x
        for y in range(10):
            print "y", y
            if x > 2:
                raise loop1()
            if y > 2:
                break

kaynak:https://gist.github.com/tmr232/9354051

2 Beğeni

Python’da böyle bir şey yok. Yapılamadığı için değil, istenmediği için. Böyle bir özellik Python’ın basitlik ilkesine aykırı olurdu. C’ye aşinalığınız varsa goto'yu bilirsiniz. Bu ifade ile etiketlediğiniz herhangi bir yere gidebilirsiniz. Ancak bu, programın akışını acaip şekilde bozabildiği için kullanılması önerilmeyen bir özelliktir. Bu sebeple modern dillerde kendine yer bulmaz. Kotlin’deki bu etiketler de bunun biraz kısıtlanmış hali anladığım kadarıyla.

Python’da birden fazla döngüden çıkmanıza gerek olmamalı. Hatta tek döngüde bile break ya da continue kullanmak çok iyi bir alışkanlık değil: Yapısal programlama’ya aykırı. Tabii bunları kullanıyoruz, bazen gerçekten kolaylık sağlıyor. Ancak birden çok döngü içinden tek ifade ile çıkmanın goto'dan bir farkı yok. Tabii “Başka ne yapabilirim?” diyebilirsiniz. Aslında bu, durumdan duruma değişir. Ancak genelde en iyi çözüm döngü sayınızı azaltmaktır. Bu işe yaramazsa, farklı veri yapıları ya da desenler kullanmanız gerekecektir.

goto modülü olarak hep eski sürümlerde kullanılmış hocam, yeni versiyonlarda çalıştıramadım maalesef.

Anlamadım, neyin yeni versiyonlarında çalıştıramadınız?

hocam goto yu python da yerleşik olarak kullanamadığımızdan ben de modül olarak goto diye arattım ve bulunan modüllerden birini kurayım ki goto yu kullanabileyim diye ancak tüm 3.parti modüller python3’den önceki versiyonlar için hazırlanmış ve bir daha da güncellenmemiş, kaynak kodlarından gerekli düzeltmeler yapılıp kullanılabilir ama madem artık kimse kullanmıyor o işler c dönemlerinde kaldı, ben de pek kendimi alıştırmayayım diye goto için zorlama geriği duymuyorum, kaldı ki c yi öğrenirken bile goto ya değinilmemişti ben Halt and Catch Fire dizisinde Basic de goto deyimi geçiyordu ordan merak edip c de nasıl kullanılıyor diye kendim öğrenmiştim :smile: Amacım zaten bir gereksinim değil de kotlin ile kıyaslama yaparken, python da da benzer bir kullanım varda ben bir şey mi kaçırdım diye araştırmaktı :slight_smile:

Python’a goto konmamasının bir nedeni var. :slight_smile: