Koşullar ve döngüler
Koşul, programın bir çatalda kendine sorduğu evet ya da hayır sorusudur; döngü ise bir koşul doğru kaldığı sürece tekrarlanan iştir. Ömrünüz boyunca yazacağınız hemen her program bu ikisinin birleşimidir ve en zor hatalar tam olarak bu ikisinin buluştuğu yerde düşer.
- Ders 6 / 14
- Başlangıç
- Ücretsiz, kayıt yok
Bir döngünün tam bir turu ve tek çıkış yolu
- 1 Koşulu sına
- 2 Gövdeyi çalıştır
- 3 Bir şeyi değiştir
- 4 Koşula geri dön
Bu halkadan çıkmanın tek yolu, en üstteki koşulun yanlış olmasıdır. Gövdesi, koşulun okuduğu hiçbir şeyi değiştirmeyen bir döngü oradan hiç çıkmaz.
Son kontrol: Bu dersteki bilgiler ve araç adları bu tarihte kaynaklarıyla yeniden doğrulanır.
Koşul nedir ve onsuz bir programın eksiği nedir?
Koşul, yalnızca iki yanıtı olan bir sorudur, evet ya da hayır, ve program hangisini aldığına göre iki yoldan birine sapar. Hiç koşulu olmayan bir program, baştan sona hep aynı biçimde çalışan bir komut listesidir; ilk koşulla birlikte o liste, duruma tepki veren bir şeye dönüşür.
age = 17
if age >= 18:
print("allowed")
else:
print("denied")İkinci satır soru, üçüncü satır evet yolu, beşinci satır hayır yolu. else isteğe bağlıdır: yazmazsanız yanıt hayır olduğunda hiçbir şey olmaz, program tek kelime etmeden koşulun yanından geçer. O sessizlik ilerideki konu.
Burada iki klasik hata pusuda bekler. Birincisi tek eşittir ile çift eşittiri karıştırmak: = ata demektir, == karşılaştır demektir. Python bu konuda merhametlidir ve bir koşulun içine tek eşittir koyarsanız söz dizimi hatası verir; ama bu sitenin kurulduğu diller olan PHP ve JavaScript hiçbir şey demez: if ($x = 5) atama yapar ve ardından hep doğrudur, yani koşulunuz fiilen yoktur ve kimse bir şey söylemez.
İkinci hata sıradır ve çok daha az konuşulur. Birkaç koşulu arka arkaya dizdiğinizde, doğru çıkan ilk koşul kazanır ve geri kalanlar hiç değerlendirilmez bile. Yani genel koşulu özel koşulun üstüne koyarsanız, özel olan hiç çalışmaz ve var olmayan bir hatayı saatlerce ararsınız. Kod doğrudur; yalnızca sırası yanlıştır.
Bir soru, iki yol ve hiç değerlendirilmeyen kod
Koşul sağlanıyor mu?
if gövdesi çalışır
- Diğer dallar hiç değerlendirilmez
- Program gövdeden sonra devam eder
else gövdesi çalışır, yazdıysanız
- else olmadan hiçbir şey olmaz ve bildirilmez
- Bu sessizlik bulunması en zor durumdur
Birkaç koşul art arda geldiğinde, doğru olan ilki kazanır ve gerisi hiç değerlendirilmez. Genel koşulu özel olanın üstüne koymayın.
Döngü nedir ve her döngü neye ihtiyaç duyar?
Döngü şu demektir: bu işi bir kez yerine birden çok kez yap. Değeri sayıdadır. Üç dosya için üç satır yazmak marifet değildir, ama aynı üç satır otuz bin dosya için yalnızca döngüyle mümkündür ve daha önemlisi kodunuz sayıdan bağımsız hale gelir.
İki temel biçim var. Birincisi bir kümeyi gezer ve her üye için bir kez çalışır:
names = ["ali", "sara", "reza"]
for name in names:
print(name)İkincisi bir koşul doğru kaldığı sürece döner ve kaç kez döneceği önceden bilinmez:
size = 4096
step = 0
units = ["B", "KB", "MB", "GB"]
while size >= 1024 and step < len(units) - 1:
size = size / 1024
step = step + 1Her döngü, biçimi ne olursa olsun, üç şeye ihtiyaç duyar ve biri eksikse bozulur: gezeceği bir şey ya da sınayacağı bir koşul, her turda değişen bir şey ve bitmek için bir yol. İkinci örnekte değişen şeyler size ve step; size = size / 1024 satırını silin, koşul sonsuza dek doğru kalır.
Eğitimlerin genelde atladığı bir ayrıntı: o koşulun ikinci yarısı, yani step < len(units) - 1, boyutla ilgili değildir. Tek yaptığı, döngünün birim listesinin sonundan taşmasını engellemektir. Bu döngü bu sitenin kendi panel kodunda duruyor ve o ikinci yarı, onunla gerçek bir hata arasındaki tek şey.
Hangi döngü nereye? Bu sitenin kodundan gerçek bir sayım
Eğitimlerin çoğu sayan döngüyle başlar; bir sayacın sıfırdan bir sayıya tırmandığı döngüyle. Gerçek kodda bu en az kullanılan biçimdir ve tahmin yürütmek yerine bu sitenin temasını saydık.
Temadaki 193 PHP dosyasında 560 küme döngüsü, 21 sayan döngü ve 13 koşullu döngü var. Yani ilk öğrendiğiniz biçim, bu kod tabanındaki döngülerin yüzde dördünden azını oluşturuyor.
Nedeni açık: üyenin numarasını neredeyse hiç istemezsiniz, üyenin kendisini istersiniz. "Bu klasördeki her dosya için" yazdığınızda dosyanın sırası işinize yaramaz ve bir sayaç tutmak yanılmak için fazladan bir yer demektir. Geriye kalan 21 tanesi, sayının gerçekten gerektiği yerler: beş değerlendirme yıldızı çizmek, bir tablonun sütunlarını kurmak, bir grafiğin aylarında geriye doğru yürümek.
Liste kısa olduğu için o 13 koşullu döngüye de baktık. Yedisi, yazı kaldıkça dönen ana WordPress döngüsü. Üçü tekrar eden bir kimliği benzersiz kılıyor: bu ad daha önce kullanıldıysa sonuna bir sayı ekle. Son üçü ise sayının gerçekten bilinmediği yerler: bir soketten yanıtın sonuna kadar okumak, baytları daha büyük bir birime çevirmek ve alınmamış bir kullanıcı adı üretmek.
Bu sayımdan çıkan kural her tanımdan daha kullanışlı: neyin üzerinde gezdiğinizi biliyorsanız küme döngüsü yazın. Ne zaman biteceğini bilmiyorsanız koşullu döngü. Ve gerçekten sayının kendisine ihtiyacınız varsa sayan döngü ki bu pratikte ender karşınıza çıkar.
Küme döngüsü mü, koşullu döngü mü?
Küme döngüsü
- Neyin üzerinde gezdiğinizi önceden biliyorsanız
- Tur sayısını kümenin kendisi belirler
- Sonsuz döngü neredeyse imkansızdır
- Boş kümede sıfır kez çalışır
- Bu sitenin temasında: 560 tane
Koşullu döngü
- Kaç tur süreceğini bilmiyorsanız
- Bitmesi için bir şeyi sizin değiştirmeniz gerekir
- Bir yanıtı sonuna dek okumak ya da benzersiz bir ad üretmek
- Her sonsuz döngü bu aileden gelir
- Bu sitenin temasında: 13 tane
Bunların hiçbiri diğerinden iyi değil; iki farklı durum içindirler. Bu kod tabanındaki sayımımız birinci sütunun pratikte çok daha sık gerektiğini gösteriyor, ikincisinin yanlış olduğunu değil.
Sonsuz bir döngü gerçek bir sunucuda neye benzer?
Sonsuz döngü, durma koşulu hiçbir zaman yanlış olmayan döngüdür. İki yaygın biçimi vardır ve ikisinin de kökü aynıdır: koşulun okuduğu şey gövdenin içinde değişmez.
Birinci biçim o değişimi büsbütün unutmaktır: koşul, sayaç ondan küçükken dön der ve gövdenin içinde kimse sayacı artırmaz. İkincisi onu yanlış yönde değiştirmektir ki bu daha kötüdür, çünkü kod hareket doluymuş gibi görünür: koşul artmasını beklerken sayaç azalır.
Şimdi hiçbir eğitimin yanıtlamadığı soru: bu canlı bir sitede olursa gerçekte ne olur? Tarayıcı sonsuza kadar beklemez. Bu sunucuda request_terminate_timeout adında bir ayar var ve değeri 180 saniye. Üç dakika sonra hala süren her isteğin süreci öldürülür.
Ve buradaki öldürülür kelimesi mecaz değil, tam karşılığıdır. Bu, yakalayabileceğiniz bir PHP hatası değildir; süreç dışarıdan kapatılır. Sonucu şudur: bitiriş kodunuz çalışmaz. Döngü bir dosyayı yazmanın ortasındaysa dosya yarım kalır, bir kilit almışsa kilit bırakılmaz. Ziyaretçinin gördüğü şey ise döngünüz hakkında hiçbir şey söylemeyen genel bir sunucu hata sayfasıdır.
Yani alınacak beceri şu: sonsuz döngüyü hata mesajından bulmazsınız, çünkü hata mesajı yoktur. Saatten bulursunuz. Hep hemen hemen aynı üç dakika işaretinde başarısız olan bir sayfa neredeyse her zaman bir döngüdür ya da bitmeyen bir bekleyiştir.
Döngü içindeki koşullar: break, continue ve bir fark hatası
Bu iki fikrin asıl yeri yan yanadır: her üye için bir karar veren bir döngü. Bu yolun ilk dersindeki beş satırlık program tam olarak buydu; boyut üzerine bir koşulu olan, dosyalar üzerinde bir döngü.
Burada işi değiştiren iki kelime var. break tüm döngüyü bırakıp çıkar; continue yalnızca bu turu bırakıp bir sonraki üyeye geçer. Birincisi yanıtınızı bulduğunuz an içindir, ikincisi bu üyenin size yaramadığı an.
Herkesin bir kez karşılaştığı sürpriz: bir döngü bir başkasının içindeyse, break yalnızca içtekini kırar, ikisini birden değil. Program içteki döngüden çıkar ve sessizce dıştakinin bir sonraki turuna başlar. Kod hiç itiraz etmez, siz de çıktığınızı sanırsınız.
Kendi adı olan bir başka hata da bir fark hatasıdır: döngü beklediğinizden bir kez fazla ya da bir kez eksik çalışır. Ana kaynağı, aralıkların genelde baştan kapalı sondan açık olmasıdır. Python'da range(1, 10) size birden dokuza kadar verir, onu vermez. Bu karar tuhaf değildir ve bir gerekçesi vardır, ama ezberlemek işe yaramaz; işe yarayan şey bir kez yazıp çıktıyı saymaktır.
Ve en sessiz olan son durum: boş bir küme üzerinde bir döngü. Sıfır kez çalışır, hata vermez, hiçbir şey yazdırmaz. Hiç iş yapmamış ve hiç şikayet etmemiş bir program, her zaman son değil ilk bakılacak şeydir.
Yazmadığınız bir döngüyü nasıl okursunuz?
Bu beceri bugün döngü yazmaktan daha önemli, çünkü kod yazıldığından çok daha fazla okunur ve o kodun büyük bir bölümünü siz yazmadınız. Bizim yöntemimiz dört soru ve sıraları önemli.
Bir: neyin üzerinde geziyor ve o şey boş olabilir mi? Olabiliyorsa döngü sıfır kez çalışır ve bu genelde kimsenin test etmediği durumdur.
İki: her turda ne değişiyor? Yanıtınız hiçbir şey ise, ya döngü sonsuzdur ya da döngü gereksizdir.
Üç: onu ne durduruyor ve bu hiç gerçekleşmeyebilir mi? Burada break ifadelerini de arayın, çünkü erken çıkış her zaman kodun en üstünde yazmaz.
Dört: son turdan sonra ne doğrudur? Döngünün içinde kurulan değişkenler sonrasında hangi değerleri tutar ve onlara güvenen biri var mı?
Bu dördünü yukarıdaki birim çevirme döngüsünde deneyin: hiçbir kümeyi gezmiyor, yani boşluk konusu geçersiz; iki şey değişiyor; koşulun iki yarısı var ve biri yalnızca bir koruma; son turdan sonra step doğru birimin sırasını tutuyor ve bir sonraki satırın kullandığı tam olarak bu. Dört yanıt ve artık döngüyü çalıştırmadan anlıyorsunuz.
Yapay zekayla hızlı yol
Bu konuda gerçekten değişen şey döngü yazmak değil; döngü yazmak zaten hiç zor kısım olmadı. Değişen şu: artık günde on döngü elinize geçiyor ve bunları siz yazmadınız, her birinin nerede kırıldığını otuz saniyede çıkarmanız gerekiyor. Bu yüzden aşağıdaki reçete modelden kod istemiyor; elinizdeki kod hakkında yukarıdaki dört soruyu yanıtlamasını istiyor. Bu iş için hızlı ve ucuz bir model yerine üst sınıf bir model daha uygundur, çünkü yargı işidir; kodlama modelleri arasındaki güncel tercihimiz bu sitenin yapay zeka bölümünde.
- Yalnızca döngüyü değil, üstündeki ve altındaki birkaç satırla birlikte tümünü kopyalayın. Koşulun okuduğu değer genelde döngünün dışında kurulur ve o olmadan modelin yanıtı tahmindir.
- Aşağıdaki reçeteyi gönderin ve kodu yeniden yazmamasını açıkça söyleyin. Yeniden yazmaya izin verirseniz açıklama yerine yeni bir sürüm alırsınız ve ilk kaybolan şey tam da anlamak istediğiniz durumdur.
- Boş durum yanıtını ciddiye alın. Deneyimimizde bu reçetenin en çok ortaya çıkardığı şey budur: boş bir listede sıfır kez dönen bir döngü ve sonrasındaki kodda bu ihtimali hesaba katan hiçbir şeyin olmaması.
- Yanıtı kabul etmeden önce döngüyü kendiniz boş bir girdiyle ve tek üyeli bir girdiyle çalıştırın. Bu iki durum var olan en ucuz testtir ve döngü hatalarının çoğu tam orada ortaya çıkar.
Kopyalamaya hazır şablon
Bu kod bana ait değil ve onu değiştirmek değil, anlamak istiyorum.
{kodu buraya yapıştırın, döngünün üstünden ve altından birkaç satırla}
Kodu yeniden yazma. Yalnızca şu dört soruyu, her biri iki cümle olacak şekilde yanıtla:
1. Bu döngü neyin üzerinde geziyor ve o şey boş olabilir mi? Boşsa ne olur?
2. Her turda tam olarak hangi değişkenler değişiyor?
3. Döngüyü ne durduruyor ve hiç durmadığı bir durum var mı? Erken çıkışları da belirt.
4. Son turdan sonra, döngünün içinde kurulan her değişken hangi değeri tutuyor?
Sonunda, bu dört yanıttan hangisinden yalnızca koda bakarak emin olamadığını ve bilmek için neye ihtiyacın olduğunu söyle.
Çıktıya güvenmeden önce: Reçetenin son paragrafı en önemli paragrafıdır ve onu çıkarmak her şeyi bozar. Model, göremediği şeyi de tıpatıp aynı kendinden emin tonla anlatır ve burada göremediği şey genelde kümenin kurulduğu yerdir. Bu yüzden boşluk ya da sonlanma hakkındaki her yanıt, siz bir kez boş girdiyle çalıştırmadıkça gerçek değil, bir varsayımdır.
Bu işte yapay zeka
Döngüler ve koşullar, dil modellerinin kusursuz yazdığı kod türünün ta kendisidir. Bu yapıların binlerce örneği eğitim verilerinde vardı ve sonuç şu: onları üretmek artık bir beceri sayılmıyor. Size kalan şey okumak: bu döngünün nerede kırıldığını, bu koşulun hangi durumu unuttuğunu ve bu kodun boş bir girdide sandığınız şeyi yapıp yapmadığını çıkarmak. Tutumumuz, bu konuda modeli yazar değil açıklayıcı rolünde tutmaktır; yazmadığınız ve satır satır açıklayamadığınız kod sizin kodunuz değildir.
Gerçekten işe yarayan araçlar
- Claude Bir kod parçasını alıp davranışını anlatmakta iyi; yeniden yazma dediğinizde yeni bir sürüm uydurma eğilimi azalıyor. İran, Anthropic'in iki desteklenen ülke listesinin hiçbirinde yok; bunu ağ testiyle değil, Anthropic'in kendi sayfasında okuduk.
- Claude Code Bir komut satırı aracı ve bu iş için üstünlüğü tek bir şey: bir parça yerine deponun kendisini görüyor, yani döngünüzün gezdiği kümenin nereden geldiğine gidip bakabiliyor. Ücretsiz kuruluyor ama bir Claude aboneliği ya da Anthropic Console hesabı olmadan çalışmıyor ve İran desteklenen ülkeler listesinde yok.
- Gemini Guided Learning adında ayrı bir çalışma modu var; yanıt vermek yerine soru soruyor ve bu da döngü okumanın o dört sorusuna iyi uyuyor. Google'ın kendi sayfası Gemini web uygulamasının 230'dan fazla ülke ve bölgede çalıştığını söylüyor ve İran o listede yok.
Nerede geri teper
Bu konudaki somut risk şu: model, döngünün gezdiği kümeyi hiç görmemişken o döngü hakkında tam bir güvenle konuşur. O küme bir veritabanı sorgusundan ya da bir ağ isteğinden geliyorsa ve siz yalnızca döngünün kendisini kopyaladıysanız, "bu döngü güvenli" cümlesi gerçek gibi yazılmış bir tahmindir. Anthropic bunu kendi belgelerinde halüsinasyon diye adlandırıp azaltma yollarını anlatıyor; yani üretici de bunu söylenti değil, gerçek bir zayıflık sayıyor.
İkinci risk daha pratik: modelden yavaş bir döngüyü hızlandırmasını istediğinizde, geri verdiği sürüm sınır durumlarda çoğu zaman farklı davranır, özellikle boş girdide ve tek üyeli girdide. Bu yüzden her yeniden yazımı, hep çalışan sıradan girdiyle değil, o iki girdiyle test edin. Bu araçların İran'dan nasıl ödenebileceği için satın alma rehberine bakın; kodlama modelleri arasındaki güncel tercihimiz için kodlama için en iyi yapay zeka sayfasına bakın.
Kaynaklar: Anthropic: reduce hallucinations Anthropic: supported countries Claude Code: overview and install Google: where the Gemini web app is available
Bu tavsiyenin sınırı
Bu sayfadaki söz dizimi Python. Koşulun ve döngünün biçimi her dilde vardır ama yazılışı farklıdır ve bu satırları doğrudan PHP ya da JavaScript'e kopyalamak işe yaramaz. İkincisi, bu ders özyinelemeyi, üreteçleri ve liste kurulumlarını bilerek dışarıda bıraktı; bunlar aynı işin başka yollarıdır ve ancak bu iki temel yapı oturduktan sonra anlam kazanmaya başlar. Üçüncüsü, muhtemelen beklediğiniz şey: hangi döngü daha hızlı. Hız hakkında hiçbir sayı vermiyoruz, çünkü yeni başlayan birinin çalıştığı boyutlarda fark ölçülebilir değil ve biz de bunu bu sunucuda ölçmedik. Doğru ve okunabilir bir döngü, belki daha hızlı olan bir döngüden iyidir.
Kendi işimizden
Bu dersin denetlendiği gün, tahmin yürütmek yerine bu sunucunun kendi PHP yapılandırma dosyasını açtık. /www/server/php/85/etc/php-fpm.conf içinde request_terminate_timeout = 180 yazan bir satır var. 180 saniye sonra hala süren her isteğin süreci dışarıdan kapatılır. PHP'nin resmi el kitabı da aynısını söylüyor: bu ayar, sonrasında işçi sürecin öldürüldüğü zaman aşımıdır. Bu ders için önemli olan ve hiçbir döngü eğitiminin yazmadığı sonuç şu: süreç bir hata doğurmak yerine öldürüldüğü için bitiriş kodunuz çalışmaz. Bir dosyayı yazmanın ortasındaki bir döngü o dosyayı yarım bırakır. Aynı sayımı sitenin teması üzerinde de yaptık ve 193 PHP dosyasında 560 küme döngüsü, 21 sayan döngü ve 13 koşullu döngü bulduk; üç sayı da o klasörde tek bir basit aramayla yeniden üretilebilir.
Gerçek devam soruları
Pratikte for ile while arasındaki fark nedir?
Pratikte fark, tur sayısına kimin karar verdiğidir. Küme döngüsünde kümenin kendisi karar verir ve siz bir şey yapmazsınız; koşullu döngüde bir şeyi sizin değiştirmeniz gerekir, yoksa hiç bitmez. Sonsuz döngülerin neredeyse hepsinin ikinci türden olmasının nedeni de budur.
break ve continue'yu ne zaman kullanmalıyım?
Yanıtınızı bulduysanız ve döngüyü sürdürmenin bir anlamı kalmadıysa break kullanın. Bu üye size yaramıyor ama diğerleri yarayabilecekse continue kullanın. Bir uyarı: iç içe döngülerde break yalnızca içtekini kırar ve program sessizce dıştakinin bir sonraki turuna başlar.
Döngüm neden beklediğimden bir kez fazla ya da eksik çalışıyor?
Buna bir fark hatası denir ve ana kaynağı, aralıkların genelde baştan kapalı sondan açık olmasıdır: Python'da range(1, 10) size birden dokuza kadar verir. Çözüm ezberlemek değil; o aralığı bir kez yazdırıp üyelerini sayın, ondan sonra yanılmazsınız.