Önceki bölümlerde verilerimizi listelerde toplamayı ve if-else koşullarıyla mantıksal kararlar aldırmayı öğrendik. Ancak yazdığımız bir koşulu 50 farklı sunucu için tek tek alt alta yazmak programlamanın doğasına aykırıdır.
Sistem yönetiminde işlerin büyük bir kısmı tekrara dayanır: "Ağdaki tüm switch'lere sırayla bağlan", "Log dosyasındaki 10 bin satırı tek tek oku" veya "Bağlantı gelene kadar 5 saniyede bir ping atmaya devam et". İşte bu tekrarlı görevleri bilgisayara devretmemizi sağlayan yapılar Döngülerdir (Loops).
Belirli Bir Liste Üzerinde Gezinmek: For Döngüsü
for döngüsü, elinizde belirli bir eleman sayısı (örneğin bir IP listesi, bir dosyanın satırları veya belirli bir rakam aralığı) varsa kullanılır. Döngü, listedeki her bir elemanı sırayla alır, belirlediğiniz değişkene atar ve altındaki kod bloğunu çalıştırır.
Sistemci Senaryosu: Bir listedeki tüm switch IP'lerine sırayla konfigürasyon gönderdiğimizi simüle edelim.
switch_listesi = ["10.0.1.1", "10.0.1.2", "10.0.1.3"]
# "ip" burada bizim belirlediğimiz geçici bir değişkendir.
# Döngü her döndüğünde listedeki sıradaki elemanı alır.
for ip in switch_listesi:
print(f"Bağlanılıyor: {ip}")
print("Konfigürasyon uygulandı.\n")
print("Tüm cihazların güncellemeleri tamamlandı.")
Sayı Aralıkları Üretmek: range() Fonksiyonu
Bazen elimizde bir liste yoktur ama işlemi belirli bir sayıda tekrar etmek isteriz. Bunun için range() fonksiyonunu kullanırız.
# 1'den başla, 5'e kadar (5 dahil değil) git.
for i in range(1, 5):
print(f"Deneme sayısı: {i}")Belirli Bir Koşula Bağlı Tekrar: While Döngüsü
while döngüsü, bir işlemin kaç kere tekrar edeceğini önceden bilmediğimiz durumlarda hayat kurtarır. Mantığı basittir: "Belirtilen koşul True olduğu sürece dönmeye devam et."
Önemli Uyarı: Eğer koşulun bir noktada False olmasını sağlamazsanız (örneğin bir sayacı artırmazsanız), döngü sonsuza kadar çalışır (Infinite Loop) ve script'iniz kilitlenir.
Sistemci Senaryosu: Bir servisin ayağa kalkmasını bekleyen bir kontrol mekanizması yazalım.
import time # Bekleme süresi eklemek için
baglanti_basarili = False
deneme_sayisi = 0
while baglanti_basarili == False and deneme_sayisi < 3:
deneme_sayisi = deneme_sayisi + 1
print(f"{deneme_sayisi}. kez bağlantı deneniyor...")
# 3. denemede bağlantının başarılı olduğunu varsayalım
if deneme_sayisi == 3:
baglanti_basarili = True
print("Bağlantı başarıyla kuruldu!")
else:
time.sleep(1) # 1 saniye bekle
if not baglanti_basarili:
print("Sunucuya ulaşılamıyor, işlem iptal edildi.")Döngülere Müdahale Etmek: Break ve Continue
Bazen döngü kendi seyrinde devam ederken, içeride gerçekleşen özel bir durumdan dolayı döngüyü anında kırmak veya o adımı atlamak isteyebiliriz.
Break (Döngüyü Kırmak):
Aradığınızı bulduğunuzda veya kritik bir hata aldığınızda döngünün geri kalanını okumaya gerek yoktur. break komutu, döngüyü anında sonlandırır.
guvenlik_loglari = ["OK", "OK", "SALDIRI_ALGARILDI", "OK", "OK"]
for log in guvenlik_loglari:
if log == "SALDIRI_ALGARILDI":
print("Kritik Güvenlik İhlali! Sistem durduruluyor ve döngüden çıkılıyor.")
break
print(f"Log durumu: {log}")Continue (Sadece O Adımı Atlamak):
Bir eleman istediğiniz şarta uymuyorsa döngüyü tamamen kırmak yerine, sadece o elemanı pas geçip bir sonraki elemandan çalışmaya devam etmek için continue kullanılır.
Sistemci Senaryosu: Bir sunucu listemiz var. "Offline" olanlara işlem yapmadan doğrudan sonrakine geçmek istiyoruz.
sunucular = [
{"isim": "Web-01", "durum": "Online"},
{"isim": "Db-01", "durum": "Offline"},
{"isim": "Mail-01", "durum": "Online"}
]
for sunucu in sunucular:
if sunucu["durum"] == "Offline":
print(f"--- {sunucu['isim']} kapalı, bu sunucu atlanıyor ---")
continue # Alt satırlara inmez, sıradaki sunucuya geçer.
print(f"{sunucu['isim']} isimli sunucunun yedeklemesi alınıyor.")Python'da otomasyonun kalbi olan döngüleri ve karar mekanizmalarını tamamen kavradık. Kodlarımız artık yüzlerce veriyi saniyeler içinde işleyebilecek kapasitede. Ancak yazdığımız kodlar uzadıkça, aynı işlemleri script'in farklı yerlerinde tekrar tekrar yazmak kod karmaşasına (Spaghetti Code) yol açar.
Serinin bir sonraki bölümünde, kendi komutlarımızı yaratmamızı sağlayan, kodun okunabilirliğini ve tekrar kullanılabilirliğini zirveye taşıyan Fonksiyonlar (Functions) konusunu derinlemesine inceleyeceğiz.
