Python’da enumerate() ve zip(), döngülerde daha anlaşılır kod yazmayı sağlar. enumerate() bir listenin elemanlarını sıra bilgisiyle birlikte dolaştırır, zip() ise birden fazla iterable içindeki karşılık gelen elemanları aynı döngüde eşleştirir. Böylece karne gibi örneklerde öğrencilerin adlarını, derslerini ve notlarını daha düzenli biçimde işleyebilirsin.
enumerate() tek bir iterable içindeki elemanlarla sıra numarasını birlikte almak için, zip() ise iki veya daha fazla iterable içindeki ilişkili verileri yan yana kullanmak için tercih edilir.
enumerate() ve zip() ne zaman kullanılır?
enumerate(), döngü sırasında hem elemanın kendisine hem de listedeki sırasına ihtiyaç duyduğunda kullanılır. Örneğin öğrencileri numaralandırarak yazdırmak için şu kod yeterlidir:
ogrenciler = ["Ada", "Efe", "Mina"]
for sira, ogrenci in enumerate(ogrenciler, start=1):
print(sira, ogrenci)
Bu kodun çıktısı şöyledir:
1 Ada
2 Efe
3 Mina
zip() ise aynı sıradaki elemanları birlikte dolaştırır. Aşağıdaki örnekte ders adları ile notlar eşleştirilir:
dersler = ["Python", "Java", "Algoritma"]
notlar = [90, 85, 95]
for ders, notu in zip(dersler, notlar):
print(f"{ders}: {notu}")
Çıktı şu şekilde olur:
Python: 90
Java: 85
Algoritma: 95
Buradaki iterable terimi, for döngüsüyle üzerinde sırayla dolaşılabilen liste, tuple veya metin gibi yapıları ifade eder. Tuple, birden fazla değeri tek bir yapı içinde tutan ve oluşturulduktan sonra elemanları değiştirilemeyen bir veri türüdür. Temel döngü konularını pekiştirmek için ücretsiz Sıfırdan Temel Python video eğitimi üzerinden listeler ve döngülerle ilgili alıştırmalar yapabilirsin.
range(len(liste)) yerine enumerate() nasıl yazılır?

range(len(liste)) yaklaşımında listedeki elemanı almak için önce sıra numarasına, ardından liste[indeks] biçiminde ayrıca indekslemeye ihtiyaç duyulur. İndeks, bir elemanın listedeki konumunu gösteren sayıdır ve bu yapı kodun okunabilirliğini azaltabilir.
ogrenciler = ["Ada", "Efe", "Mina"]
for indeks in range(len(ogrenciler)):
print(indeks, ogrenciler[indeks])
Bu kodun çıktısı şöyledir:
0 Ada
1 Efe
2 Mina
Aynı işlem enumerate() ile daha doğrudan yazılabilir:
ogrenciler = ["Ada", "Efe", "Mina"]
for sira, ogrenci in enumerate(ogrenciler, start=1):
print(sira, ogrenci)
Çıktı şu şekilde olur:
1 Ada
2 Efe
3 Mina
enumerate() her döngü adımında sıra bilgisi ile elemanı birlikte içeren iki değerli bir tuple üretir. for döngüsündeki sira ve ogrenci değişkenleri bu iki değeri sırayla alır. start=1 kullanıldığında sıra numarası Python listelerinde varsayılan olan 0 yerine 1’den başlar. İlerleyen karne örneğinde bu yapı, öğrencilerin adlarını ve notlarını daha anlaşılır biçimde yazdırmak için kullanılabilir.
zip() listeleri birlikte nasıl dolaştırır?
zip() fonksiyonu, iki veya daha fazla iterable içindeki aynı konumdaki elemanları eşleştirerek tek bir for döngüsünde kullanılabilir hâle getirir. Iterable, for döngüsünün sırayla üzerinden geçebildiği liste, tuple veya benzeri veri kaynağıdır.
Öğrenci adları ile notları aynı sırada tutuyorsan, iki listeyi birlikte dolaşmak için zip() kullanabilirsin:
ogrenciler = ["Ada", "Bora", "Cem"]
notlar = [85, 92, 78]
for ogrenci, notu in zip(ogrenciler, notlar):
print(f"{ogrenci}: {notu}")
Bu kodun çıktısı şöyledir:
Ada: 85
Bora: 92
Cem: 78
zip() aynı anda üç veya daha fazla iterable ile de çalışabilir. Örneğin öğrenci, ders ve not bilgilerini birlikte yazdırabilirsin:
ogrenciler = ["Ada", "Bora", "Cem"]
dersler = ["Matematik", "Fizik", "Biyoloji"]
notlar = [85, 92, 78]
for ogrenci, ders, notu in zip(ogrenciler, dersler, notlar):
print(f"{ogrenci}, {ders}: {notu}")
Çıktı şu şekilde olur:
Ada, Matematik: 85
Bora, Fizik: 92
Cem, Biyoloji: 78
zip() sonucu, döngü ilerledikçe elemanları tüketilen bir iterator gibi davranır. Bu nedenle aynı zip() nesnesini ikinci kez dolaşmaya çalıştığında yeni sonuç alamayabilirsin:
eslesmeler = zip(ogrenciler, notlar)
print(list(eslesmeler))
print(list(eslesmeler))
Çıktı şöyledir:
[('Ada', 85), ('Bora', 92), ('Cem', 78)]
[]
Farklı uzunluktaki listelerde zip() neden risklidir?

zip() kullanırken listelerin uzunlukları farklıysa eşleştirme, en kısa iterable sona erdiğinde durur. Uzun listedeki artan elemanlar hata verilmeden göz ardı edilebildiği için eksik veriler fark edilmeyebilir.
Aşağıdaki örnekte dört öğrenci adı, üç not bulunuyor:
ogrenciler = ["Ada", "Bora", "Cem", "Deniz"]
notlar = [85, 92, 78]
for ogrenci, notu in zip(ogrenciler, notlar):
print(f"{ogrenci}: {notu}")
Çıktıda Deniz yer almaz:
Ada: 85
Bora: 92
Cem: 78
Bu durumu önlemek için eşleştirmeden önce liste uzunluklarını kontrol edebilirsin:
if len(ogrenciler) != len(notlar):
print("Öğrenci ve not sayısı eşleşmiyor.")
Aynı öğrenciye ait ad ve not gibi bilgileri ayrı listelerde tutmak yerine, her kaydı birlikte saklayan bir veri yapısı kullanmak da eşleşme hatalarını azaltabilir. Böylece bir öğrencinin adı ve notu aynı kayıt içinde bulunur.
Uzunlukların eşit olması gerektiği durumlarda strict=True kullanımı uyuşmazlığı görünür hâle getirir. Python’ın resmî belgelerinde belirtildiği üzere strict parametresi Python 3.10 ile eklenmiştir ve iterable uzunlukları farklı olduğunda ValueError oluşturur:
for ogrenci, notu in zip(ogrenciler, notlar, strict=True):
print(ogrenci, notu)
Bu seçenek, eksik bir eşleşmenin sessizce atlanması yerine sorunun hemen fark edilmesine yardımcı olur.
enumerate() ve zip() birlikte nasıl kullanılır?
Sıra numarası, öğrenci adı ve notu aynı döngüde almak için enumerate(zip(adlar, notlar), start=1) yapısını kullanabilirsin. Önce aynı karne örneğini range(len()) ile yazalım:
ogrenciler = ["Ali", "Buse", "Can"]
notlar = [85, 92, 78]
for i in range(len(ogrenciler)):
print(f"{i + 1}. {ogrenciler[i]}: {notlar[i]}")
Bu programın çıktısı şöyledir:
1. Ali: 85
2. Buse: 92
3. Can: 78
Aynı işlemi enumerate() ve zip() ile daha doğrudan ifade edebilirsin:
ogrenciler = ["Ali", "Buse", "Can"]
notlar = [85, 92, 78]
for sira, (ogrenci, notu) in enumerate(zip(ogrenciler, notlar), start=1):
print(f"{sira}. {ogrenci}: {notu}")
Bu sürümün çıktısı da aynıdır:
1. Ali: 85
2. Buse: 92
3. Can: 78
İkinci örnekte i ile liste elemanlarına ayrı ayrı ulaşman gerekmez. zip() öğrenci adıyla notu aynı tuple içinde eşleştirir, enumerate() ise bu eşleşmeye sıra numarası ekler.
İki listeyi anahtar ve değer olarak bir sözlüğe dönüştürmek için de dict(zip(...)) kullanılabilir:
ogrenciler = ["Ali", "Buse", "Can"]
notlar = [85, 92, 78]
karne = dict(zip(ogrenciler, notlar))
print(karne)
Çıktı şu şekilde olur:
{'Ali': 85, 'Buse': 92, 'Can': 78}
enumerate() ve zip() kullanırken hangi hatalardan kaçınılır?
En sık görülen sorunlar, enumerate() sonucunu tek değişkende alıp tuple değerlerini yanlış kullanmak, zip() sonucunu bir kez dolaştıktan sonra aynı nesneyi yeniden kullanmaya çalışmak ve farklı uzunluktaki listelerde eksik veriyi fark etmemektir.
enumerate() sonucunu tek değişkende almamak
enumerate() her turda sıra numarası ve elemanı birlikte verir. Bu nedenle iki değişken kullanmak daha anlaşılırdır:
for ogrenci in enumerate(ogrenciler):
print(ogrenci.upper())
Burada ogrenci aslında bir tuple olduğu için upper() doğrudan kullanılamaz. Doğru yaklaşım şöyledir:
for sira, ogrenci in enumerate(ogrenciler, start=1):
print(sira, ogrenci)
zip() nesnesini ikinci kez boş sanmamak
zip() sonucu bir iterator olduğu için bir kez dolaşıldıktan sonra aynı nesnede yeni eleman kalmaz:
eslesmeler = zip(ogrenciler, notlar)
print(list(eslesmeler))
print(list(eslesmeler))
İkinci print() çağrısında [] görülür. Yeniden dolaşmak gerekiyorsa her seferinde yeni bir zip() nesnesi oluşturabilir veya sonucu listeye dönüştürebilirsin.
Liste uzunluklarını kontrol etmek
Listeler farklı uzunluktaysa zip() kısa olan liste bittiğinde durur. Bu nedenle eşleşmesi gereken verilerde uzunlukları önceden kontrol etmek gerekir:
if len(ogrenciler) != len(notlar):
print("Öğrenci ve not sayısı eşleşmiyor.")
else:
for ogrenci, notu in zip(ogrenciler, notlar):
print(ogrenci, notu)
enumerate()kullanırken sıra numarası ve eleman için iki değişken yaz.- Bir
zip()nesnesini yeniden kullanacaksan yeni birzip()nesnesi oluştur. - Eşleşen listelerin uzunluklarını kontrol et.
- Uzunlukların kesinlikle eşit olması gerekiyorsa
strict=Trueseçeneğini değerlendirebilirsin.
Bu ayrıntıları kod üzerinde sınamak için Python bilgi testi içindeki soruları çözebilirsin.
Sık Sorulan Sorular
enumerate() sonucu neden iki değişkenle alınır?
enumerate() her döngü turunda sıra numarasını ve ilgili elemanı birlikte verdiği için sonuç genellikle for sira, eleman in enumerate(liste) biçiminde iki değişkenle alınır.
enumerate() ile saymaya 1’den nasıl başlanır?
Saymaya 1’den başlamak için enumerate(liste, start=1) yazılır.
zip() farklı uzunluktaki listelerle kullanılırsa ne olur?
zip() farklı uzunluktaki listelerde kısa olan liste tükendiğinde durur ve uzun listedeki kalan elemanları eşleştirmeden bırakır.
zip() sonucu neden ikinci döngüde boş kalır?
zip() sonucu iterator olduğu için ilk döngüde tüketilir; ikinci döngüde kullanmak için yeni bir zip() nesnesi oluşturmak gerekir.
zip(strict=...) parametresi hangi Python sürümünde kullanılabilir?
zip() fonksiyonundaki strict parametresi Python 3.10 ile eklenmiştir ve listelerin eşit uzunlukta olmadığını ValueError ile bildirebilir.
enumerate() ve zip() birlikte kullanıldığında döngülerdeki indeksleme ve eşleştirme adımları daha okunabilir hâle gelir; yine de veri uzunluklarını ve iterator davranışını kontrol etmeyi unutma.