Python “‘NoneType’ object is not iterable” hatası, for döngüsünün ya da a, b = ... biçimindeki açma işleminin None ile çalıştırılmasıyla ortaya çıkar. Çözüm, döngüye veya açma işlemine verilen değerin neden None olduğunu bulup fonksiyondan gerçekten bir liste, tuple gibi iterable bir değer döndürmektir.
Yaygın nedenlerden biri, fonksiyonun sonucu hazırladığı hâlde return satırı olmadan sona ermesidir. Python böyle bir fonksiyon çağrısının sonucunu None kabul eder ve bu değer döngüye verildiğinde hata oluşur.
Bu hata neden çıkar ve mesajın parçaları ne anlatır?

Bu hata, Python’ın üzerinde dolaşılacak veya içindeki değerler ayrıştırılacak bir iterable beklediği yerde None bulmasıyla çıkar. Iterable, liste, tuple veya metin gibi elemanları sırayla okunabilen değerlerdir. None ise ortada kullanılabilir bir değer olmadığını ifade eder ve türü NoneType olarak adlandırılır.
TypeError, yapılan işlem için uygun türde olmayan bir değer kullanıldığında oluşur. Python 3.12 ve sonrasında for döngüsünde görülen hata tam olarak TypeError: 'NoneType' object is not iterable biçimindedir. a, b = deger gibi bir açma işleminde ise mesaj TypeError: cannot unpack non-iterable NoneType object şeklinde görünür. Hata mesajlarının genel yapısını Python hata ve istisna belgelerinde de görebilirsin.
İki mesajın ortak noktası, kullanılan değerin None olmasıdır. Fark, ilkinde for döngüsünün elemanlar üzerinde dolaşmaya çalışması, ikincisinde ise Python’ın değeri iki değişkene ayıramamasıdır. None üzerinde indeksleme yapıldığında görülen subscriptable mesajları veya AttributeError farklı durumlara aittir; burada iterable bekleyen for ve açma işlemlerine odaklanıyoruz.
Return unutulan fonksiyon hatayı nasıl üretir?
Fonksiyon içinde filtrelenen listeyi oluşturmak, bu listenin otomatik olarak dışarı döndürüldüğü anlamına gelmez. Fonksiyon return satırı olmadan biterse çağrının sonucu None olur.
def basarili_notlar(notlar, esik):
filtrelenenler = []
for not_ in notlar:
if not_ >= esik:
filtrelenenler.append(not_)
# return satırı unutuldu
notlar = [45, 72, 88, 61]
sonuclar = basarili_notlar(notlar, 60)
print(type(sonuclar))
for not_ in sonuclar:
print(not_)
print(type(sonuclar)) satırı, döngüye vermeden önce temel bir teşhis sağlar. Bu örnekte ekrana <class 'NoneType'> yazılır. Ardından temsilî traceback şu şekilde görünür:
Traceback (most recent call last):
File "notlar.py", line 15, in <module>
for not_ in sonuclar:
TypeError: 'NoneType' object is not iterable
Traceback içinde dosya adı ve satır numarası hatanın hangi satırda görünür hâle geldiğini gösterir. Son satır ise Python’ın neden durduğunu açıklar. Kalıcı düzeltme, fonksiyonun hazırladığı listeyi return ile göndermektir.
def basarili_notlar(notlar, esik):
filtrelenenler = []
for not_ in notlar:
if not_ >= esik:
filtrelenenler.append(not_)
return filtrelenenler
notlar = [45, 72, 88, 61]
sonuclar = basarili_notlar(notlar, 60)
print(type(sonuclar))
for not_ in sonuclar:
print(not_)
Bu sürümde type() sonucu listeyi gösterir ve program şu çıktıyı üretir:
<class 'list'>
72
88
61
if sonuclar: kontrolü hatayı bazen görünmez hâle getirebilir, ancak eksik return satırını düzeltmez. Beklenen değer boş olsa bile fonksiyonun açıkça boş bir liste döndürmesi daha doğru bir yaklaşımdır.
sort() ve append() neden None ile sonuçlanır?

sort() ve append() mevcut listeyi yerinde değiştirir ve dönüş değeri olarak None verir. Bu dönüş değerini listeye atarsan, sonraki döngü liste yerine None üzerinde çalışmaya uğraşır.
notlar = [80, 45, 70]
notlar = notlar.sort()
for notu in notlar:
print(notu)
Bu örnekte liste önce sıralanır, ardından sort() metodunun döndürdüğü None, notlar değişkenine atanır. Döngüye geçildiğinde TypeError: 'NoneType' object is not iterable hatası oluşur.
Mevcut listeyi sıralamak için dönüş değerini atamadan sort() çağırabilirsin:
notlar = [80, 45, 70]
notlar.sort()
print(notlar)
Beklenen çıktı:
[45, 70, 80]
Özgün listeyi değiştirmeden yeni bir sıralı liste elde etmek için sorted() kullanabilirsin:
notlar = [80, 45, 70]
sirali_notlar = sorted(notlar)
print(notlar)
print(sirali_notlar)
Beklenen çıktı, özgün listenin sırasını koruduğunu gösterir:
[80, 45, 70]
[45, 70, 80]
append() için de aynı atama hatasına dikkat et. Aşağıdaki kodda değer liste içine eklenir, ancak sonuc değişkeni None olur:
liste = [45, 70]
sonuc = liste.append(80)
print(liste) # [45, 70, 80]
print(sonuc) # None
Eklenmiş liste üzerinde dolaşmak için liste.append(80) çağrısından sonra doğrudan liste değişkenini kullanabilirsin.
Traceback nasıl okunur ve hata kalıcı olarak nasıl düzeltilir?
Traceback'in sonundaki hata mesajını ve hemen üstündeki dosya, satır ve işlem bilgisini inceleyerek None değerinin nerede kullanıldığını bulabilirsin. Ardından bu değerin nerede üretildiğini görmek için atamaları ve fonksiyonun dönüş yollarını geriye doğru takip et.
Aşağıdaki not filtreleme fonksiyonu, liste doluyken filtrelenmiş bir liste döndürür. Liste boş olduğunda ise koşula girmez ve return satırına ulaşmadan bittiği için None döndürür:
def gecen_notlar(notlar):
if notlar:
return [notu for notu in notlar if notu >= 50]
sonuc = gecen_notlar([])
for notu in sonuc:
print(notu)
Bu kod bir dosyada çalıştırıldığında, dosya adı ve gösterim ortamına göre ayrıntıları değişebilen temsilî traceback şöyledir:
Traceback (most recent call last):
File "notlar.py", line 6, in <module>
for notu in sonuc:
TypeError: 'NoneType' object is not iterable
Satır bilgisi hatanın döngüde ortaya çıktığını gösterir. Asıl neden ise gecen_notlar([]) çağrısının None döndürmesidir.
- Traceback'teki son dosya ve satır bilgisinden hatalı işlemi bul.
- Döngüden hemen önce
print(sonuc)veprint(type(sonuc))ile değeri ve türünü incele. Bu örnekte çıktılar sırasıylaNoneve<class 'NoneType'>olur. - Değişkenin atandığı satıra dön; çağrılan fonksiyonun her dalını ve kullanılan liste metotlarının dönüş değerlerini kontrol et.
- Düzeltmeden sonra boş liste, eşleşme bulunmayan liste ve eşleşme bulunan listeyle sonucu yeniden dene.
Bu örnekte fonksiyonun her durumda liste döndürmesi uygundur. Filtreleme ifadesi boş girdi için de boş liste ürettiğinden koşulu kaldırabilirsin:
def gecen_notlar(notlar):
return [notu for notu in notlar if notu >= 50]
print(gecen_notlar([]))
print(gecen_notlar([45, 70, 80]))
Beklenen çıktı:
[]
[70, 80]
Döngünün önüne if sonuc: koymak None geldiğinde hatayı görünmez hâle getirebilir, fakat yanlış dönüş değerini düzeltmez. Üstelik boş liste de koşulu sağlamaz; bu yüzden veri bulunmamasıyla beklenmedik None değerini ayırt edemezsin.
Kalıcı çözüm için önce fonksiyonun hangi değerleri döndürmesi gerektiğini belirle ve her koşul dalını buna göre kontrol et. None geçerli bir sonuçsa is None ile açıkça ele al; döngüye ise liste gibi üzerinde dolaşılabilen bir değer ver.
None üzerinde indeksleme veya metot çağırma girişimleri de farklı hata mesajları oluşturabilir; bunlarda da değişkenin nerede None olduğunu izlemek yararlıdır.
Sık Sorulan Sorular
None ile boş liste arasındaki fark nedir?
None bir değerin bulunmadığını veya özel bir durumu temsil edebilir; boş liste ise elemanı olmayan bir listedir. Boş liste üzerinde döngü kurulabilir ve döngü gövdesi çalışmadan geçilir.
list.sort() ile sorted() arasındaki temel fark nedir?
list.sort() mevcut listeyi yerinde sıralar ve None döndürür; sorted() ise yeni bir sıralı liste döndürür ve özgün listeyi değiştirmez.
if x: yazmak “NoneType” object is not iterable hatasını gerçekten çözer mi?
if x: kontrolü x değeri None olduğunda döngüyü atlayabilir, ancak beklenmedik değerin kaynağını düzeltmez. Boş listeleri de atladığı için hangi durumun yaşandığını ayrıca değerlendirmek gerekir.
Bir fonksiyonun her koşulda liste döndürdüğü nasıl kontrol edilir?
Fonksiyondaki her koşul ve erken çıkış yolunu inceleyip her birinin liste döndürdüğünden emin olabilirsin. Boş ve dolu girdilerle test yaparak sonuçların türünü type() ile de kontrol edebilirsin.
Unpacking işleminde None kullanıldığında hata mesajı neden farklı görünebilir?
Açma işleminde Python, değeri değişkenlere dağıtmaya çalıştığı için hata mesajı döngüdeki ifadeden farklı olabilir. Örneğin a, b = None işleminde mesaj, NoneType değerinin açılabilir olmadığını belirtir.
Değişkenin değerini ve bu değerin geldiği yeri birlikte kontrol etmek, döngüde görülen hatayı kaynağında düzeltmene yardımcı olur.