Python'da for ve while Döngüleri: Yazımı ve Doğru Seçimi
Bir işi birden fazla kez yaptırmak için for ve while döngüsünü, range ile sayı üretmeyi, break ve continue ile akışı kontrol etmeyi örnek kodlarla öğrenirsiniz. Hangi döngünün ne zaman daha uygun olduğunu da görürsünüz.
Bir bakışta
- for, bir koleksiyonun öğelerini sırayla gezer. Liste, metin, sözlük gibi gezilebilir her nesne üzerinde kullanılır.
- while, koşul doğru olduğu sürece tekrarlar. Kaç tur döneceği önceden belli değilse tercih edilir.
- range, sayı dizisi üretir ve bitiş değerini içermez. Başlangıç, bitiş ve adım verebilirsiniz; indeks gerekiyorsa enumerate çoğu zaman daha temizdir.
- break döngüyü bitirir, continue sıradaki tura geçer. Döngünün else bölümü ise yalnızca break ile kesilmeden biterse çalışır.
- Gezdiğiniz koleksiyonu döngü içinde değiştirmeyin. Kopya üzerinde gezin ya da yeni bir koleksiyon oluşturun.
for döngüsü: öğeleri sırayla gezmek
Python'daki for, başka dillerdeki gibi sayaç ve bitiş koşulu tanımlamaz; bir dizinin ya da gezilebilir nesnenin öğelerini sırayla gezer. Resmî eğitime göre döngü, öğeleri göründükleri sırayla ele alır.
meyveler = ["elma", "armut", "kiraz"] for meyve in meyveler: print(meyve, len(meyve))
Bu kod her meyvenin adını ve harf sayısını yazdırır. Döngü değişkeni (meyve) her turda bir sonraki öğeyi alır. Aynı yapı metinlerde (harf harf), sözlüklerde (anahtar veya anahtar-değer çiftleri) ve dosya satırlarında da çalışır:
durumlar = {"elma": "taze", "armut": "olgun"} for ad, deger in durumlar.items(): print(ad, deger)
Döngü gövdesi girintiyle belirlenir. Girinti, hangi satırların her turda tekrarlandığını söyler; bu yüzden girinti hatası en sık görülen başlangıç hatasıdır. Önemli bir kural: gezdiğiniz koleksiyonu döngü içinde değiştirmeyin. Öğe silmek ya da eklemek gerekiyorsa koleksiyonun bir kopyası üzerinde gezin ya da sonucu yeni bir koleksiyonda toplayın.
range ile sayı üretmek
Belirli sayıda tur dönmek ya da sayı dizisi üzerinde gezmek için range kullanılır. range üç biçimde çağrılır: yalnızca bitiş vererek, başlangıç ve bitiş vererek ya da başlangıç, bitiş ve adım vererek. Bitiş değeri hiçbir zaman dizinin içinde yer almaz.
for i in range(adet): print(i)
for i in range(baslangic, bitis): print(i)
for i in range(baslangic, bitis, adim): print(i)
Birinci döngü sıfırdan başlayıp adet değerinin hemen öncesine kadar sayar. İkincisi başlangıçtan bitişin hemen öncesine kadar, üçüncüsü ise adım kadar atlayarak gider. Adım negatif olursa geriye doğru sayılır.
range bir liste değil, gerektiğinde değer üreten bir nesnedir; bu yüzden büyük aralıklar bellekte yer kaplamaz. Listeye çevirmek isterseniz list(range(...)) yazarsınız.
Bir listenin indekslerini gezmek için range(len(liste)) kullanılabilir; ancak hem indeks hem değer gerekiyorsa enumerate daha okunaklıdır:
for sira, meyve in enumerate(meyveler): print(sira, meyve)
Sadece değerlere ihtiyacınız varsa doğrudan listeyi gezin; indeksle gezmek gereksiz karmaşıklık getirir.
while döngüsü: koşul doğru olduğu sürece
while, bir koşulu her turun başında kontrol eder ve koşul doğru olduğu sürece gövdeyi çalıştırır. Kaç tur döneceği baştan bilinmiyorsa uygundur: kullanıcı geçerli bir değer girene kadar sormak, bir sunucu yanıt verene kadar denemek, bir kuyruk boşalana kadar işlemek gibi.
sayac = baslangic while sayac < sinir: print(sayac) sayac += adim
Bu kod, sayaç sınıra ulaşana kadar yazdırır ve her turda sayacı adım kadar artırır. while'da en büyük risk, koşulu yanlış yapacak adımı unutmaktır. Yukarıda sayaç artırılmasaydı koşul hiç yanlış olmazdı ve döngü sonsuza dek çalışırdı.
Bilinçli sonsuz döngü de kullanılır: while True ile başlayıp içeride bir koşul sağlandığında break ile çıkmak yaygın bir kalıptır. Kullanıcıdan veri alırken ya da bağlantı beklerken bu yöntem açık ve okunaklıdır. Her durumda döngünün nasıl biteceğini kodu yazarken netleştirin.
Tur sayısı belliyse for, koşul belirliyorsa while
| for | while | |
|---|---|---|
| Ne zaman | Bir koleksiyonun öğelerini gezerken | Koşul sağlanana kadar tekrar ederken |
| Tur sayısı | Koleksiyonun boyutu belirler | Önceden belli olmayabilir |
| Sayaç | Çoğu zaman gerekmez | Çoğu zaman elle artırılır |
| Ana risk | Koleksiyonu gezerken değiştirmek | Koşulu yanlış yapacak adımı unutup sonsuz döngüye girmek |
break, continue ve döngü else
Üç araç döngünün akışını kontrol eder.
break, içinde bulunduğu en yakın döngüyü hemen bitirir. Aradığınız öğeyi bulduğunuzda gerisini gezmenin anlamı yoktur:
for ad in adlar: if ad == aranan: print("bulundu") break
continue, kalan satırları atlayıp bir sonraki tura geçer. Geçersiz kayıtları atlamak için kullanılır:
for satir in satirlar: if not satir: continue isle(satir)
Döngülerin else bölümü ise az bilinen ama kullanışlı bir yapıdır. Resmî eğitime göre else, döngü break ile kesilmeden doğal olarak biterse çalışır. for döngüsünde son turdan sonra, while döngüsünde koşul yanlış olduğunda çalışır. Döngü break, return ya da bir hatayla biterse else atlanır. Klasik kullanımı "bulunamadı" durumudur:
for ad in adlar: if ad == aranan: break else: print("bulunamadı")
Burada else, if'e değil, for'a aittir. Bulunamadı mesajı yalnızca hiçbir tur break'e ulaşmadıysa çıkar. Bu yapı bir bayrak değişkeni tutma ihtiyacını ortadan kaldırır.
Akışı değiştiren komutu amacınıza göre seçin
- Aradığımı buldum, gerisini gezmeye gerek yokbreakEn yakın döngüyü hemen bitirir.
- Bu öğeyi atlayıp sonrakine geçmek istiyorumcontinueKalan satırlar bu tur için çalışmaz.
- Hiç bulamazsam bir şey yapmak istiyorumDöngünün else bölümüYalnızca break ile kesilmeden biterse çalışır.
Döngüleri kısa ve okunaklı yazmak
Döngü yazmak kolaydır; okunaklı yazmak alışkanlık ister. Önce adlandırma: döngü değişkenine anlamlı ad verin (meyve, siparis, satir). Tek harfli adlar yalnızca küçük sayaçlarda kabul edilir. İkincisi, iç içe döngüleri sınırlayın; birkaç seviyeden fazlası okunmaz hale gelir ve genellikle fonksiyona bölünebilir.
Üçüncüsü, koşullu toplama işleri için liste üreteci gibi daha kısa yapıları değerlendirin; basit dönüşümlerde döngünün yerini alır. Ancak mantık karmaşıklaşıyorsa açık bir for döngüsü her zaman daha anlaşılırdır. Dördüncüsü, döngü içinde ağır işlemi tekrar tekrar yapmayın: aynı sonucu veren hesabı döngünün dışına alın.
Veriyle çalışırken döngüler ve toplu işlemler arasındaki ayrımı bilin. Küçük listelerde ve dosya satırlarında for iyidir. Büyük tablolarda satır satır döngü yapmak yerine pandas ve NumPy gibi kütüphanelerin toplu işlemleri çok daha hızlı ve kısadır. Başlangıçta mantığı döngüyle öğrenmek yararlıdır; ölçek büyüdükçe vektörel yöntemlere geçilir.
Sık yapılan hatalar
- Girintiyi yanlış atmak: hangi satırın döngü içinde olduğunu girinti belirler; yanlış girinti sessiz bir mantık hatası üretir.
- while'da sayacı artırmayı unutmak: döngü hiç bitmez. Her turda koşulu yanlışa doğru ilerleten bir adım olmalıdır.
- range'in bitiş değerini dahil sanmak: bitiş hiçbir zaman dahil edilmez; bir eksik tur dönüldüğünü sanıp yanlış düzeltme yapılır.
- Gezdiğiniz listeyi döngü içinde değiştirmek: öğeler atlanır ya da beklenmedik sonuçlar çıkar. Kopya üzerinde gezin ya da yeni liste kurun.
- Basit indeks için range(len(liste)) kullanmak: enumerate daha temiz ve hataya daha az açıktır.
- break'in yalnızca en içteki döngüyü bitirdiğini unutmak: iç içe döngülerde dış döngü devam eder.
- else'i if'e ait sanmak: döngü else'i, döngü kesilmeden bittiğinde çalışır.
- Gereksiz döngü: toplamak ya da filtrelemek için hazır işlevler (sum, any, all) varken elle döngü yazmak.
Listeyi gezerken değiştirmek yerine kopyada gezmek, enumerate kullanmak
Bu beceriyi Mindset programlarında nerede çalışırsınız?
Python ile Programlama Eğitimi, Python'a giriş, veri yapıları, döngüler ve fonksiyonlar başlıklarıyla temel programlama akışını adım adım kurar. Data Science Bootcamp ise Python'a giriş, temel ifadeler, veri yapıları ve fonksiyonlar bölümleriyle bu temeli veri bilimi çalışmasına taşır. Programlamaya yeni başlayanlar ve veri alanına geçmek isteyenler için uygundur.
İlgili Mindset programı
Python ile Programlama Eğitimi
Sık sorulan sorular
for ve while arasında nasıl seçim yapmalıyım?
Bir koleksiyonun öğelerini sırayla gezecekseniz for kullanın; kaç tur döneceği önceden belli olmayan, bir koşula bağlı tekrarlar için while kullanın. Çoğu günlük işte for daha güvenlidir, çünkü döngü kendiliğinden biter.
range bitiş değerini neden içermez?
Python'da aralıklar bitiş hariç tanımlanır. Bu, uzunluğu bitiş eksi başlangıç olarak hesaplamayı ve ardışık aralıkları boşluk ya da çakışma olmadan birleştirmeyi kolaylaştırır. Bitişi dahil etmek istiyorsanız bitişe bir eklersiniz.
Sonsuz döngüye girdim, nasıl durdururum?
Terminalde çalışıyorsanız klavye kesmesiyle (Ctrl ve C) durdurabilirsiniz. Jupyter Notebook'ta çekirdeği kesmek gerekir. Sonra while koşulunu yanlış yapacak adımın her turda çalıştığını ya da bir break noktası olduğunu kontrol edin.
Döngünün else bölümü ne zaman çalışır?
Döngü break ile kesilmeden doğal olarak bittiğinde. Arama kalıplarında bulunamadı durumunu bildirmek için kullanılır. Döngü break, return ya da hata ile biterse else çalışmaz.
İç içe döngüde break tüm döngüleri mi bitirir?
Hayır. break yalnızca içinde bulunduğu en yakın döngüyü bitirir; dış döngü devam eder. Tüm döngülerden çıkmak için işlemi bir fonksiyona koyup return kullanabilir ya da dış döngüde bir koşulla çıkabilirsiniz.
İlgili rehberler
İlgili eğitimler
Kategori: Yazılım Geliştirme, Veri Analitiği ve İş Zekası