Bu eğitimde, Python'da enumerate() fonksiyonunun ne olduğunu, ne zaman kullanıldığını, ne tür nesneler oluşturduğunu, sözdizimini ve nasıl çalıştığını ele alacağız. Ardından, Python'da farklı türde nesnelerin nasıl numaralandırılacağına dair örnekler görecek, enumerate() fonksiyonunun alternatiflerini ve neden aynı görev için daha az uygun olduklarını inceleyeceğiz.
Python'da Enumerate Nedir ve Ne Zaman Kullanılır?
enumerate() fonksiyonu, bir yinelenebilir (öğelerden oluşan bir koleksiyon veya yinelemeyi destekleyen herhangi bir Python nesnesi; örneğin demetler, listeler, kümeler veya dizgeler) alan, perde arkasında öğeleri üzerinde dolaşan ve bir enumerate nesnesi döndüren yerleşik bir Python fonksiyonudur. Başka bir deyişle, bu fonksiyon bir yinelenebilirin her öğesine 1 artan bir sayaç atar ve bu nesne üzerinde döngü kurarken yinelemeleri takip etmemize yardımcı olur. Bir enumerate nesnesi oluşturduktan sonra, bunu bir listeye, demete veya sözlüğe (sırasıyla list(), tuple() veya dict() fonksiyonlarını kullanarak) dönüştürebiliriz ya da doğrudan bu nesne üzerinde döngü kurarak hem öğelere hem de bunların karşılık gelen indekslerine erişebiliriz.
enumerate() fonksiyonunu kullanmak, indeks ve ilgili öğeyi tek seferde döndürdüğü için bellek ve hesaplama verimliliği açısından for döngülerine kıyasla faydalıdır.
Sözdizimi
enumerate() fonksiyonunun sözdizimi oldukça basittir:
Burada iterable, numaralandırmak istediğimiz yinelenebilir nesnedir; start ise sayacın başlangıç indeksini tanımlayan isteğe bağlı bir parametredir (varsayılan olarak tipik Python 0 tabanlı indekstir).
enumerate() fonksiyonunu bir yinelenebilir üzerinde uygulamanın başlangıçtaki nesnenin kendisini değiştirmediğine dikkat edin. Bunun yerine, ortaya çıkan enumerate nesnesini daha sonra kullanabilmek istiyorsak bir değişkene atamalıyız.
Şimdi bu fonksiyonun farklı türde Python yinelenebilirleri üzerinde nasıl çalıştığını görelim.
Listeyi Numaralandırma
Önce enumerate() fonksiyonunu bir Python listesi üzerinde uygulayalım:
<class'enumerate'><enumerateobject at 0x000002DC3A1145C0>Altyapı:
Ortaya çıkan nesnenin türü enumerate'tür ve yazdırmayı denediğimizde, nesne türünü ve bilgisayar belleğinde nerede depolandığını tekrar doğrulamış olduk. Bu nesnenin ilk öğesine, bir Python listesi veya demetinde yaptığımız gibi erişmeyi deneyelim:
Bir enumerate nesnesinin bileşenlerine bu şekilde erişilemeyeceğini belirten bir hata aldık. Bunun yerine, bu amaçla, onu bir listeye, demete veya sözlüğe dönüştürmemiz ya da enumerate nesnesi üzerinde doğrudan döngü kurmamız gerekir. enumerate nesnemizi bir listeye dönüştürelim:
Artık ortaya çıkan listenin iç yapısını net bir şekilde görüyoruz: her öğe, ilk elemanı özgün listedeki ilgili öğenin indeksi, ikinci elemanı ise öğenin kendisi olan 2 elemanlı bir demeti temsil eder. Bu listenin öğelerine erişmek için yaygın dizinleme yaklaşımını kullanabiliriz:
Şimdi de, özgün listeden oluşturulan bir enumerate nesnesini bir demete dönüştürmeyi deneyelim. Ayrıca bu kez start isteğe bağlı parametresini 1 olarak ayarlayacağız:
Yukarıdaki demetin iç yapısı, daha önce oluşturulan listeninkiyle aynıdır. Ancak bu kez sayacı değiştirerek Python'un 0 tabanlı indekslemesi yerine daha "insani" bir sayım yaptık.
Burada bahsetmeye değer ilginç bir enumerate yöntemi var: next() yöntemi. enumerated_drinks nesnesini yeniden oluşturalım ve bu yöntemi uygulamada görelim:
Gördüğümüz gibi, bu yöntemi bir enumerate nesnesi üzerinde her çağırdığımızda, ondan bir sonraki öğeyi döndürür (ve her öğenin ilgili sayaç-öğe çiftini içeren 2 elemanlı bir demet olduğunu yine doğrulayabiliriz). Tüm öğeler bittiğinde enumerate nesnesi tükenir ve next() yöntemini çağırma girişimi StopIteration hatası fırlatır. Nitekim, şimdi bu enumerate nesnesini bir listeye dönüştürmeyi denersek boş olduğunu göreceğiz
Bu, next() yönteminin enumerate nesnesine her uygulanışında nesneden bir öğe alındığı, dolayısıyla her seferinde biraz daha küçüldüğü ve tamamen tükenene kadar devam ettiği anlamına gelir. Enumerate nesnelerinin bu özelliğini, bunlar üzerinde for döngülerinin uygulanmasını tartışırken de göreceğiz.
Python listeleri ve diğer temel Python kavramları hakkında daha fazla bilgi edinmek isterseniz DataCamp'in Introduction to Python kursunu alabilirsiniz.
Bir Demeti Numaralandırma
enumerate() fonksiyonunun bir demet üzerinde uygulanması, bir liste üzerindekiyle aynıdır:
Python sözlükleri ve pandas hakkında daha derine inmek isterseniz Intermediate Python kursuna göz atın.
Bir Dizgeyi Numaralandırma
Python dizgeleri karakter dizileri olduğundan ve dolayısıyla yinelenebilir nesneler olduğundan, bir dizge için de bir enumerate nesnesi oluşturabiliriz:
Daha önce tanıdık olan 2 elemanlı demetleri görüyoruz; ilk eleman dizgedeki ilgili karakterin sayacıdır (bu durumda 10'dan başlayarak) ve ikinci eleman ise karakterin kendisidir. Boşluk ve noktalama işaretleri de sayılır.
enumerated_hello_world nesnesini bu kez start=10 olmadan yeniden oluşturalım ve üzerinde next yöntemini uygulayalım:
enumerated_hello_world =enumerate('Hello, World!')print(next(enumerated_hello_world))print(next(enumerated_hello_world))print(next(enumerated_hello_world))print(next(enumerated_hello_world))print(next(enumerated_hello_world))print(next(enumerated_hello_world))
# Creating a list from the remaining enumerate objectprint(list(enumerated_hello_world))Altyapı:
Yukarıdaki kod parçasının son satırında, next() yöntemini kullanmayı bırakıp enumerated_hello_world nesnesini bir listeye dönüştürdük. Ortaya çıkan liste, next() yönteminin birden çok kez uygulanmasından sonra başlangıçtaki enumerate nesnesinde kalan karakterleri içerir.
For Döngüsüyle Numaralandırma
Son olarak, enumerate() fonksiyonunun bir for döngüsüyle birlikte nasıl çalıştığını görelim:
for item inenumerate(['tea','coffee','cappuccino','lemonade']):print(item)Altyapı:
Her yinelemede, tıpkı next() yöntemini kullandığımızda olduğu gibi ilgili sayaç-öğe demeti döndürülür. Yukarıdaki koddan açıkça görünmese de enumerate nesnesi her yinelemede öğelerini (yani 2 elemanlı demetleri) teker teker kaybeder. Bunu göstermek için yukarıdaki kodu farklı bir biçimde yeniden yazalım ve tüm yinelemeler tamamlandıktan sonra ortaya çıkan listenin uzunluğunu kontrol edelim:
drinks =['tea','coffee','cappuccino','lemonade']
enumerated_drinks =enumerate(drinks)
for item in enumerated_drinks:print(item)print(list(enumerated_drinks))Altyapı:
next() yönteminin uygulanmasında olduğu gibi, bir enumerate nesnesi üzerinde yineleme yapmak onu kademeli olarak tüketir.
Ancak, önceki kod parçasına geri dönelim. Her 2 elemanlı demetten her bir öğeye ayrı ayrı nasıl erişebiliriz? Bu amaçla bir yineleme değişkeni daha ekleyip demetleri açacağız:
for count, drink inenumerate(['tea','coffee','cappuccino','lemonade']):print(count, drink)Altyapı:
Yukarıda, her demet için iki değişken döndürdük: biri öğenin sayacı, diğeri öğenin kendisi için.
Aynı işlemi enumerate() fonksiyonunu kullanmadan da uygulayabileceğimizi unutmayın. Örneğin, döngünün dışında bir sayaç değişkeni tanımlayabilir ve döngünün her yinelemesinde bunu 1 artırabiliriz:
Ancak, enumerate() fonksiyonunun uygulanmasıyla karşılaştırıldığında, yukarıdaki iki yaklaşım daha hantal, hataya açık (örneğin, her yinelemede sayacı manuel olarak güncellemeyi unutabiliriz) ve daha fazla kod gerektirir. Bu nedenle, her yinelemede bir yinelenebilirin hem sayacına hem de öğesine erişmemiz gerektiğinde enumerate() fonksiyonunu kullanmak en Pythonic yaklaşımdır.
Sonuç
Bu eğitimde, Python'daki enumerate() fonksiyonu hakkında; kullanım alanları, olası alternatifleri ve nihayetinde neden alternatiflerinden daha etkili olduğuna kadar pek çok şeyi öğrendik. enumerate() fonksiyonu çoğu başlangıç seviyesindeki Python kullanıcısına tanıdık gelmeyebilir ve hatta ileri düzey programcılar bile bu son derece kullanışlı fonksiyonun farkında olmayabilir.
enumerate() hakkında daha fazla bilgi edinmek isterseniz, yineleyicileri ve yinelenebilirleri ayrıntılı olarak inceleyen ve yeni becerileri pratik etmek için interaktif alıştırmalar sunan Python Data Science Toolbox (Part 2) kursunu değerlendirebilirsiniz. Ayrıca, diğer Python kavramlarında ustalaşmak istiyorsanız, çeşitli beceri ve kariyer programları, yardımcı kılavuzlar, eğitimler, Python sertifikaları ve değerlendirme testleri sunan Learn Python with DataCamp ilginizi çekebilir.
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
Bu eğitimde, Python'da enumerate() fonksiyonunun ne olduğunu, ne zaman kullanıldığını, ne tür nesneler oluşturduğunu, sözdizimini ve nasıl çalıştığını ele alacağız. Ardından, Python'da farklı türde nesnelerin nasıl numaralandırılacağına dair örnekler görecek, enumerate() fonksiyonunun alternatiflerini ve neden aynı görev için daha az uygun olduklarını inceleyeceğiz.
Python'da Enumerate Nedir ve Ne Zaman Kullanılır?
enumerate() fonksiyonu, bir yinelenebilir (öğelerden oluşan bir koleksiyon veya yinelemeyi destekleyen herhangi bir Python nesnesi; örneğin demetler, listeler, kümeler veya dizgeler) alan, perde arkasında öğeleri üzerinde dolaşan ve bir enumerate nesnesi döndüren yerleşik bir Python fonksiyonudur. Başka bir deyişle, bu fonksiyon bir yinelenebilirin her öğesine 1 artan bir sayaç atar ve bu nesne üzerinde döngü kurarken yinelemeleri takip etmemize yardımcı olur. Bir enumerate nesnesi oluşturduktan sonra, bunu bir listeye, demete veya sözlüğe (sırasıyla list(), tuple() veya dict() fonksiyonlarını kullanarak) dönüştürebiliriz ya da doğrudan bu nesne üzerinde döngü kurarak hem öğelere hem de bunların karşılık gelen indekslerine erişebiliriz.
enumerate() fonksiyonunu kullanmak, indeks ve ilgili öğeyi tek seferde döndürdüğü için bellek ve hesaplama verimliliği açısından for döngülerine kıyasla faydalıdır.
Sözdizimi
enumerate() fonksiyonunun sözdizimi oldukça basittir:
Burada iterable, numaralandırmak istediğimiz yinelenebilir nesnedir; start ise sayacın başlangıç indeksini tanımlayan isteğe bağlı bir parametredir (varsayılan olarak tipik Python 0 tabanlı indekstir).
enumerate() fonksiyonunu bir yinelenebilir üzerinde uygulamanın başlangıçtaki nesnenin kendisini değiştirmediğine dikkat edin. Bunun yerine, ortaya çıkan enumerate nesnesini daha sonra kullanabilmek istiyorsak bir değişkene atamalıyız.
Şimdi bu fonksiyonun farklı türde Python yinelenebilirleri üzerinde nasıl çalıştığını görelim.
Listeyi Numaralandırma
Önce enumerate() fonksiyonunu bir Python listesi üzerinde uygulayalım:
Çıktı:
Ortaya çıkan nesnenin türü enumerate'tür ve yazdırmayı denediğimizde, nesne türünü ve bilgisayar belleğinde nerede depolandığını tekrar doğrulamış olduk. Bu nesnenin ilk öğesine, bir Python listesi veya demetinde yaptığımız gibi erişmeyi deneyelim:
Çıktı:
Bir enumerate nesnesinin bileşenlerine bu şekilde erişilemeyeceğini belirten bir hata aldık. Bunun yerine, bu amaçla, onu bir listeye, demete veya sözlüğe dönüştürmemiz ya da enumerate nesnesi üzerinde doğrudan döngü kurmamız gerekir. enumerate nesnemizi bir listeye dönüştürelim:
Çıktı:
Artık ortaya çıkan listenin iç yapısını net bir şekilde görüyoruz: her öğe, ilk elemanı özgün listedeki ilgili öğenin indeksi, ikinci elemanı ise öğenin kendisi olan 2 elemanlı bir demeti temsil eder. Bu listenin öğelerine erişmek için yaygın dizinleme yaklaşımını kullanabiliriz:
Çıktı:
Şimdi de, özgün listeden oluşturulan bir enumerate nesnesini bir demete dönüştürmeyi deneyelim. Ayrıca bu kez start isteğe bağlı parametresini 1 olarak ayarlayacağız:
Çıktı:
Yukarıdaki demetin iç yapısı, daha önce oluşturulan listeninkiyle aynıdır. Ancak bu kez sayacı değiştirerek Python'un 0 tabanlı indekslemesi yerine daha "insani" bir sayım yaptık.
Burada bahsetmeye değer ilginç bir enumerate yöntemi var: next() yöntemi. enumerated_drinks nesnesini yeniden oluşturalım ve bu yöntemi uygulamada görelim:
Çıktı:
Gördüğümüz gibi, bu yöntemi bir enumerate nesnesi üzerinde her çağırdığımızda, ondan bir sonraki öğeyi döndürür (ve her öğenin ilgili sayaç-öğe çiftini içeren 2 elemanlı bir demet olduğunu yine doğrulayabiliriz). Tüm öğeler bittiğinde enumerate nesnesi tükenir ve next() yöntemini çağırma girişimi StopIteration hatası fırlatır. Nitekim, şimdi bu enumerate nesnesini bir listeye dönüştürmeyi denersek boş olduğunu göreceğiz
Çıktı:
Bu, next() yönteminin enumerate nesnesine her uygulanışında nesneden bir öğe alındığı, dolayısıyla her seferinde biraz daha küçüldüğü ve tamamen tükenene kadar devam ettiği anlamına gelir. Enumerate nesnelerinin bu özelliğini, bunlar üzerinde for döngülerinin uygulanmasını tartışırken de göreceğiz.
Python listeleri ve diğer temel Python kavramları hakkında daha fazla bilgi edinmek isterseniz DataCamp'in Introduction to Python kursunu alabilirsiniz.
Bir Demeti Numaralandırma
enumerate() fonksiyonunun bir demet üzerinde uygulanması, bir liste üzerindekiyle aynıdır:
Çıktı:
Yine, öğelerine yaygın Python dizinlemesiyle erişilemeyen bir enumerate nesnesi elde ettik. Bu nesneyi bu kez bir sözlüğe dönüştürelim:
Çıktı:
Ortaya çıkan sözlüğün her anahtar:değer çifti, ilgili sayaç-öğe çiftini temsil eder. Sözlüğün değerlerine yaygın Pythonic bir şekilde erişebiliriz:
Çıktı:
Python sözlükleri ve pandas hakkında daha derine inmek isterseniz Intermediate Python kursuna göz atın.
Bir Dizgeyi Numaralandırma
Python dizgeleri karakter dizileri olduğundan ve dolayısıyla yinelenebilir nesneler olduğundan, bir dizge için de bir enumerate nesnesi oluşturabiliriz:
Çıktı:
Daha önce yaptığımız gibi, bu nesneyi bir listeye dönüştürelim:
Çıktı:
Daha önce tanıdık olan 2 elemanlı demetleri görüyoruz; ilk eleman dizgedeki ilgili karakterin sayacıdır (bu durumda 10'dan başlayarak) ve ikinci eleman ise karakterin kendisidir. Boşluk ve noktalama işaretleri de sayılır.
enumerated_hello_world nesnesini bu kez start=10 olmadan yeniden oluşturalım ve üzerinde next yöntemini uygulayalım:
Çıktı:
Yukarıdaki kod parçasının son satırında, next() yöntemini kullanmayı bırakıp enumerated_hello_world nesnesini bir listeye dönüştürdük. Ortaya çıkan liste, next() yönteminin birden çok kez uygulanmasından sonra başlangıçtaki enumerate nesnesinde kalan karakterleri içerir.
For Döngüsüyle Numaralandırma
Son olarak, enumerate() fonksiyonunun bir for döngüsüyle birlikte nasıl çalıştığını görelim:
Çıktı:
Her yinelemede, tıpkı next() yöntemini kullandığımızda olduğu gibi ilgili sayaç-öğe demeti döndürülür. Yukarıdaki koddan açıkça görünmese de enumerate nesnesi her yinelemede öğelerini (yani 2 elemanlı demetleri) teker teker kaybeder. Bunu göstermek için yukarıdaki kodu farklı bir biçimde yeniden yazalım ve tüm yinelemeler tamamlandıktan sonra ortaya çıkan listenin uzunluğunu kontrol edelim:
Çıktı:
next() yönteminin uygulanmasında olduğu gibi, bir enumerate nesnesi üzerinde yineleme yapmak onu kademeli olarak tüketir.
Ancak, önceki kod parçasına geri dönelim. Her 2 elemanlı demetten her bir öğeye ayrı ayrı nasıl erişebiliriz? Bu amaçla bir yineleme değişkeni daha ekleyip demetleri açacağız:
Çıktı:
Yukarıda, her demet için iki değişken döndürdük: biri öğenin sayacı, diğeri öğenin kendisi için.
Aynı işlemi enumerate() fonksiyonunu kullanmadan da uygulayabileceğimizi unutmayın. Örneğin, döngünün dışında bir sayaç değişkeni tanımlayabilir ve döngünün her yinelemesinde bunu 1 artırabiliriz:
Çıktı:
Alternatif olarak, önceden tanımlanmış bir liste (veya demet, dizge vb.) üzerinde range() ve len() fonksiyonlarının bir kombinasyonunu kullanabiliriz:
Çıktı:
Dahası, enumerate() fonksiyonunun her iki alternatifinde de sayacı sıfırdan başlamayacak şekilde ayarlayabiliriz:
Çıktı:
Ancak, enumerate() fonksiyonunun uygulanmasıyla karşılaştırıldığında, yukarıdaki iki yaklaşım daha hantal, hataya açık (örneğin, her yinelemede sayacı manuel olarak güncellemeyi unutabiliriz) ve daha fazla kod gerektirir. Bu nedenle, her yinelemede bir yinelenebilirin hem sayacına hem de öğesine erişmemiz gerektiğinde enumerate() fonksiyonunu kullanmak en Pythonic yaklaşımdır.
Sonuç
Bu eğitimde, Python'daki enumerate() fonksiyonu hakkında; kullanım alanları, olası alternatifleri ve nihayetinde neden alternatiflerinden daha etkili olduğuna kadar pek çok şeyi öğrendik. enumerate() fonksiyonu çoğu başlangıç seviyesindeki Python kullanıcısına tanıdık gelmeyebilir ve hatta ileri düzey programcılar bile bu son derece kullanışlı fonksiyonun farkında olmayabilir.
enumerate() hakkında daha fazla bilgi edinmek isterseniz, yineleyicileri ve yinelenebilirleri ayrıntılı olarak inceleyen ve yeni becerileri pratik etmek için interaktif alıştırmalar sunan Python Data Science Toolbox (Part 2) kursunu değerlendirebilirsiniz. Ayrıca, diğer Python kavramlarında ustalaşmak istiyorsanız, çeşitli beceri ve kariyer programları, yardımcı kılavuzlar, eğitimler, Python sertifikaları ve değerlendirme testleri sunan Learn Python with DataCamp ilginizi çekebilir.