Python "ZeroDivisionError: division by zero" hatası, bir bölme işleminde bölenin, yani paydanın, 0 olması nedeniyle alınır. Python sıfıra bölme işleminde sonuç üretemediğinde işlemi durdurur ve ZeroDivisionError istisnasını bildirir. Bu yüzden çözüm, 0 değerini rastgele değiştirmek değil, paydanın neden 0 olduğunu bulup programın akışını buna göre düzenlemektir.
Hata mesajı ne anlatır ve traceback nasıl okunur?
Python'da bir sayının sıfıra bölünmeye çalışılması bu hatayı oluşturur. ZeroDivisionError, bölme işlemindeki bölen değer sıfır olduğunda oluşur. Bölme işleminde pay üstte, payda ise bölen taraftadır. Hatanın oluşup oluşmayacağını belirleyen değer pay değil, paydadır.
Payın 0 olması tek başına aynı hataya yol açmaz. Örneğin 0 / 5 işleminde pay 0, payda 5 olduğu için bölme yapılabilir ve sonuç sıfır olur. Buna karşılık 5 / 0 işleminde payda 0'dır. Python bu bölme işlemini tamamlamaz.
sonuc = 10 / 0
print(sonuc)
Beklenen sonuç: ZeroDivisionError: division by zero. Bu mesajı içeren traceback'i okurken önce hata adını ve mesajını, ardından hatanın gösterildiği konumu inceleyebilirsin.
- Dosya bilgisi: Hatanın hangi Python dosyasında oluştuğunu gösterir.
- Satır numarası: Sorunlu bölme işleminin bulunduğu satırı işaret eder. Bu satır, paydanın ilk kez 0 olduğu yer olmak zorunda değildir; 0 ile bölmenin çalıştığı yeri gösterir.
- İlgili kod satırı: Hatanın gerçekleştiği ifadeyi görmeni sağlar. Bu satırda bölme işleminin ikinci değerini, yani böleni kontrol etmelisin.
- Hata adı ve mesajı:
ZeroDivisionErroristisna türünü,division by zeroise bu örnekteki nedeni belirtir.
Traceback yapısını ve yerleşik istisnaların açıklamalarını Python'ın resmî istisna belgelerinde de inceleyebilirsin.
Sabit değerden gelen sıfır böleni nasıl düzeltirsin?

Sabit değerden gelen sıfır bölenini düzeltirken ilk adım, bölme işleminden önce paydanın değerini açıkça kontrol etmektir. Aşağıdaki örnekte payda değişkenine 0 atanıyor ve kontrol yapılmadan kullanılıyor:
pay = 12
payda = 0
sonuc = pay / payda
print(sonuc)
Beklenen sonuç: ZeroDivisionError istisnası ve division by zero mesajı.
Paydanın sıfır olması geçersiz bir durumsa, bölme işlemine hiç girmeden anlamlı bir mesaj verebilirsin:
pay = 12
payda = 0
if payda == 0:
print("Payda sıfır olamaz.")
else:
sonuc = pay / payda
print(sonuc)
Beklenen çıktı: Payda sıfır olamaz.
Burada 0'ı rastgele 1 veya başka bir sayıyla değiştirmek doğru bir düzeltme değildir; bu, programın hesaplamasını değiştirebilir. Önce paydanın neden 0 olduğunu belirle. Sabit tanım hatalıysa değeri düzelt, işlem bu durumda geçersizse programı durdur, yeni bir değer gerekiyorsa iste veya 0 özel bir durumu temsil ediyorsa bölme yerine farklı bir akış seç. Böylece hata gizlenmez, karar programın amacına bağlanır.
Koşul kontrolüyle hata kaynağını ayırma becerini Python bilgi testi ile pekiştirebilirsin.
Kullanıcı girdisindeki sıfır böleni nasıl güvenle yönetirsin?
Kullanıcıdan alınan payda 0 olduğunda program bölme işlemine ulaşır, ancak sıfıra bölme yapılamadığı için ZeroDivisionError oluşur. Bu nedenle girdiyi sayıya çevirmek tek başına yeterli değildir. Bölme işleminden hemen önce paydanın sıfır olup olmadığını kontrol etmelisin.
Aşağıdaki kısa kodda herhangi bir doğrulama yapılmadığı için 12 ve 0 girildiğinde program hata verir:
pay = int(input("Pay: "))
payda = int(input("Payda: "))
print(pay / payda)
Bu giriş için beklenen akış, 5.0 benzeri bir sonuç yerine traceback sonunda şu hatanın görülmesidir:
ZeroDivisionError: division by zero
Daha güvenli yaklaşımda sayı dönüşümü ile sıfır kontrolü ayrı tutulur. ValueError yalnızca kullanıcının sayı yerine geçersiz bir metin girmesi durumunu yönetir:
try:
pay = float(input("Pay: "))
payda = float(input("Payda: "))
except ValueError:
print("Lütfen sayı girin.")
else:
if payda == 0:
print("Payda sıfır olamaz.")
else:
print(f"Sonuç: {pay / payda}")
12 ve 3 girildiğinde beklenen çıktı:
Pay: 12
Payda: 3
Sonuç: 4.0
12 ve 0 girildiğinde beklenen çıktı:
Pay: 12
Payda: 0
Payda sıfır olamaz.
Sayı olmayan bir girişte beklenen çıktı:
Pay: on iki
Lütfen sayı girin.
Burada try-except girişlerin sayıya dönüştürülmesini yönetir. Paydanın sıfır olup olmadığını kontrol eden if bloğu ise görünür ve ayrı bir adımdır. Böylece hata yakalamaya güvenmek yerine, hatanın oluşmasını önceden engellersin. Girdi alma ve koşul kontrolünün temelini pekiştirmek için Ücretsiz Sıfırdan Temel Python video eğitimi içindeki başlangıç konularından yararlanabilirsin.
Döngü içinde bölen nasıl sıfıra dönüşür?

Döngülerde bölen tek bir sabit değer değildir. Listedeki bir elemandan, sayaçtan veya döngü içinde yapılan hesaplamadan gelebilir. Bu değer her iterasyonda değişebileceği için kontrolü döngünün içinde yapmak gerekir.
Aşağıdaki örnekte 10, listedeki her bölen değerine bölünür:
bolenler = [2, 0, 4]
for bolen in bolenler:
print(10 / bolen)
Program önce 5.0 yazdırır. Sıfır değerine geldiğinde ZeroDivisionError ile durur ve 2.5 değerine ulaşamaz.
Sıfır değeri atlanacaksa kontrolü her iterasyonda yapabilirsin:
bolenler = [2, 0, 4]
for bolen in bolenler:
if bolen == 0:
print("Sıfır bölen atlandı.")
continue
print(10 / bolen)
Beklenen çıktı:
5.0
Sıfır bölen atlandı.
2.5
continue kullanmak, bu örnekte sıfır olan değeri atlama politikasıdır. Bazı programlarda işlemi tamamen durdurmak veya kullanıcıdan yeni bir değer istemek daha uygun olabilir. Önemli olan, bölenin kaynağını ve her iterasyonda aldığı değeri inceleyerek uygun davranışı seçmendir.
try-except ZeroDivisionError ne zaman kullanılmalı?
Sıfıra bölme matematiksel olarak tanımsız olduğu için Python bu durumda ZeroDivisionError üretir. try-except, bu beklenen ve yönetilebilir hataya programın anlamlı bir geri bildirim vermesini sağlar; hatayı sessizce gizlemek için kullanılmamalıdır.
Payda önceden kontrol edilebiliyorsa if payda == 0 daha görünür bir akış sunar. try-except ise paydanın hesaplama sırasında ortaya çıktığı veya bölme işleminin kendisinin bu istisnayı üretebildiği durumlarda, işlemin hemen çevresinde yanıt vermek için kullanılabilir.
def bol(pay, payda):
try:
sonuc = pay / payda
except ZeroDivisionError:
print("Bölme yapılamadı: payda sıfır.")
else:
print(f"Sonuç: {sonuc}")
bol(10, 2)
bol(10, 0)
Beklenen çıktı:
Sonuç: 5.0
Bölme yapılamadı: payda sıfır.
Bu örnekte yalnızca ZeroDivisionError yakalanır. except Exception gibi geniş kapsamlı yakalamalar, bare except:, hatayı pass ile yutmak veya bütün programı tek bir try bloğuna almak, asıl nedeni bulmayı zorlaştırabilir. Try-except tek çözüm değildir ve tek başına doğru program tasarımı anlamına gelmez. Temel Python akışını kendi hızında tekrar etmek için Ücretsiz Sıfırdan Temel Python video eğitimi gibi bir kaynaktan yararlanabilirsin.
Sıfır nereden geliyor? Üç aşamalı teşhis kontrol listesi
İstisnayı yakalamadan önce sıfırın hangi aşamada ortaya çıktığını bulmak, kalıcı ve anlaşılır bir düzeltme yapmanı sağlar. Bunun için aşağıdaki üç aşamayı sırayla incele.
- Sabit değerleri ve başlangıç atamalarını incele. Sıfırla başlatılmış değişkenleri, varsayılan bölenleri ve ilk atamaları kontrol et. Bölme işlemine ulaşmadan önce payda zaten sıfır mı? Şu soruyu sor: "Sıfır hangi değişkenden ve hangi satırdan geliyor?"
- Kullanıcı girdisini adım adım izle.
input()çağrısından gelen değeri,int()veyafloat()dönüşümünü ve sıfır kontrolünü sırayla incele. Kullanıcının girdiği değer hangi değişkene aktarılıyor ve kontrol edilmeden bölme işlemine ulaşıyor mu? Aynı soruyu burada da kullan: "Sıfır hangi değişkenden ve hangi satırdan geliyor?" - Döngünün her yinelemesini kontrol et. Listeden veya hesaplamadan gelen böleni, güncelleme adımını ve bölme satırından hemen önceki değeri incele. Döngünün bir adımında geçerli olan bölen, sonraki güncellemeden sonra sıfıra dönüşmüş olabilir. Her iterasyonda şu soruyu sor: "Sıfır hangi değişkenden ve hangi satırdan geliyor?"
Son kontrolü şu sırayla yap: böleni belirle, sıfır olasılığını kontrol et, programın sıfır için politikasını seç ve hem normal hem de sıfır içeren girişlerle dene. Bu adımları uyguladıktan sonra değişken ve koşul mantığını Python bilgi testi ile pekiştirebilirsin.
Sık Sorulan Sorular
Pay sıfır olduğunda da ZeroDivisionError oluşur mu?
Pay sıfır, payda sıfır değilse sonuç sıfırdır ve ZeroDivisionError oluşmaz. 0 / 0 işleminde ise hata, paydanın sıfır olması nedeniyle oluşur.
Traceback'te hangi satır ve hata mesajı birlikte incelenir?
Traceback'te bölme işlemini içeren ve satır numarasıyla gösterilen kod satırını, en alttaki ZeroDivisionError: division by zero mesajıyla birlikte incele. Satır, hatanın nerede gerçekleştiğini; mesaj ise nedenini gösterir.
try-except ile payda kontrolü arasında nasıl seçim yapılır?
Payda değerini işlemden önce biliyorsan if payda == 0 kontrolü daha açık bir akış sunar. Payda bir hesaplamanın sonucunda ortaya çıkıyor veya bölme işlemi sırasında hata oluşuyorsa, dar kapsamlı bir try-except ile bu duruma yanıt verebilirsin. İki yaklaşım, programın akışına göre birlikte de kullanılabilir.
Kullanıcıdan alınan değer sayı değilse nasıl yönetilir?
input() ile alınan değer sayı değilse int() veya float() dönüşümü ValueError oluşturabilir. Dönüşüm için dar bir try bloğu kullanıp ValueError yakalayabilir ve kullanıcıya sayısal bir değer girmesi gerektiğini bildirebilirsin. ZeroDivisionError ise paydanın sıfır olması durumuna aittir.
ZeroDivisionError ile karşılaştığında önce sıfırın kaynağını bul, ardından programın bu duruma vereceği yanıtı açıkça belirle. Böylece hata yönetimi, sorunu gizleyen değil, kodun davranışını anlaşılır kılan bir parçaya dönüşür.