⚡ İleri Seviye

İleri Seviye: Comprehensions (Kapsamlar) List comprehension, "sepetteki meyvelerden sadece kırmızı olanları al" cümlesini TEK satırda yazabilmek — [tc for tc, status in results i

Comprehensions (Kapsamlar)

List comprehension, "sepetteki meyvelerden sadece kırmızı olanları al" cümlesini TEK satırda yazabilmek — [tc for tc, status in results if status == "FAIL"] tam olarak bunu söyler: "results'taki her çift için, status FAIL ise tc'yi al." Ama burada düşünmeye değer bir hata kalıbı var: değişkenin adı "failed" diye yazıp koşulu YANLIŞLIKLA "if status == 'PASS'" yaparsan, Python hiçbir uyarı vermez — değişken adı sadece bir İSİMDİR, koşulu kontrol etmez. Sonuç: "failed" listesi aslında BAŞARILI testleri tutar, ve bunu fark etmeden raporlarsan yanlış bir QA metriği üretirsin. Java'da Stream API'nin .filter() metodu aynı işi yapar ama daha çok satırla — Python'un kısalığı hız kazandırır, dikkatsizlik ise sessizce ters sonuç üretir. Peki kısalık gerçekten her zaman iyi mi — bir satıra sığdırmak neden bazen kötü bir karar olur? Şu sınırı düşün: iki iç içe döngü ve iki koşul içeren bir comprehension teknik olarak geçerlidir, ama okuyan kişinin gözü artık soldan sağa değil, içeriden dışarıya gitmek zorundadır. Java'da uzun bir Stream zincirinde .filter().map().collect() en azından alt alta yazılıp adlandırılabilir; Python'da tek satıra yayıldığında bu ayrım kaybolur. Pratik ölçüt: comprehension'ı sesli okuyabiliyorsan kalsın, okumak için durup parantez saymak zorunda kaldıysan normal for döngüsüne çevir. QA açısından bu, review edilebilirlik meselesidir — test kodunu bir başkasının doğrulayamadığı yerde, testin kendisi doğrulanmamış demektir.

Micro Lab: Python kod yazma

TODO satirini beklenen cozumdeki kritik satirla degistir. Bu gercek runtime degil; amac dogru yapinin yazilmasini kontrollu olarak pekistirmek.

[x*2 for x in range(5) if x % 2 == 0] ne üretir?

range(5) = 0,1,2,3,4. x%2==0 filtrelemesi: 0,2,4 kalır. x*2 işlemi: 0,4,8. Sonuç: [0, 4, 8].

[x+1 for x in range(4) if x > 1] ifadesinin sonucu nedir?

range(4) değerleri 0, 1, 2, 3'tür. x > 1 koşulu sağlandığında sadece 2 ve 3 değerleri kalır. x+1 işlemi uygulandığında sonuç [3, 4] olur.

Iterators (Yineleyiciler)

Bir generator (yield kullanan fonksiyon), bir dondurma kuyruğu gibi — her seferinde SIRADAKI kişiyi çağırırsın, kuyruktaki HERKESİ aynı anda hafızada tutmazsın. Ama burada gerçekten önemli bir davranış var: bu kuyruk SADECE BİR KEZ baştan sona dolaşılabilir. list(ids) çağırıp kuyruğun tamamını bir kere tükettiysen, AYNI "ids" nesnesini ikinci kez list()'e çevirmek BOŞ bir sonuç verir — kuyruk zaten boşalmış, kimse kalmamış. Çözüm: ikinci geçiş için get_test_ids() fonksiyonunu YENİDEN çağırman gerekir, taze bir kuyruk açman gerekir. Java'da bunun en yakın karşılığı Stream'lerdir — bir Stream da SADECE BİR KEZ tüketilebilir, ikinci kullanım denemesi IllegalStateException fırlatır. Fikir aynı: tek seferlik tüketim, farklı hata mesajı.

Python'da bir generator fonksiyonu oluşturmak için hangi keyword kullanılır?

'yield' ile normal fonksiyon generator'a dönüşür. Her yield çağrısında değer döner ve fonksiyon duraklar. Java'da bu pattern için Iterator interface'i implement edilir.

Python'da bir generator nesnesi döndüren bir fonksiyon yazarken değerleri teker teker üretmek için hangi anahtar kelime tercih edilir?

'yield' anahtar kelimesi fonksiyonun durumunu kaydeder ve bir sonraki çağrıya kadar bekletir. Bu, hafıza yönetimi açısından verimli bir şekilde veri akışı sağlar.