Python 3'te Liste Kavramlarını Anlamak
Giriş
Liste üreteçleri, mevcut listelere dayalı olarak liste oluşturmanın özlü bir yolunu sunar. Liste üreteçleri kullanıldığında, dizeler ve demetler (tuple) dahil olmak üzere herhangi bir yinelenebilir (iterable) kullanılarak listeler oluşturulabilir.
Sözdizimsel olarak, liste üreteçleri, bir ifade içeren bir yinelenebilirin ardından bir for
koşulundan oluşur. Bunu ek for
veya if
koşulları takip edebilir, bu nedenle for
döngüleri ve koşullu ifadelerle tanışık olmak, liste üreteçlerini daha iyi anlamanıza yardımcı olacaktır.
Liste üreteçleri, listeler ve diğer sıralı veri türleri oluşturmak için alternatif bir sözdizimi sağlar. For
döngüleri gibi diğer yineleme yöntemleri de liste oluşturmak için kullanılabilirken, liste üreteçleri programınızda kullanılan satır sayısını sınırlayabildikleri için tercih edilebilir.
Liste Üreteçleri
Python'da, liste üreteçleri şu şekilde yapılandırılır:
Bilgi: Bu eğitimdeki örnek kodları takip etmek için, yerel sisteminizde bir Python etkileşimli kabuğu açmak üzere python3
komutunu çalıştırın. Ardından, örnekleri >>>
isteminin ardından ekleyerek kopyalayabilir, yapıştırabilir veya düzenleyebilirsiniz.
list_degiskeni = [x for x in iterable]
Bir liste veya başka bir yinelenebilir bir değişkene atanır. Yinelenebilir içindeki öğeleri temsil eden ek değişkenler, birfor
koşulu etrafında oluşturulur. in
anahtar kelimesi, yinelenebilir
üzerinde yineleme yapmak için for
döngülerinde olduğu gibi kullanılır.
Bir diziye dayalı bir liste oluşturan bir örneğe bakalım:
kopekbaligi_harfleri = [harf for harf in 'shark']
print(kopekbaligi_harfleri)
Burada, yeni liste kopekbaligi_harfleri
değişkenine atanır ve harf
, yinelenebilir dize 'shark'
içinde yer alan öğeleri temsil etmek için kullanılır.
Yeni oluşturulan kopekbaligi_harfleri
listemizin neye benzediğini doğrulamak için onu print()
fonksiyonu ile çağırıyoruz ve şu çıktıyı alıyoruz:
Çıktı
['s', 'h', 'a', 'r', 'k']
Liste üreteci ile oluşturduğumuz liste, 'shark'
dizesindeki öğelerden, yani her harf için bir dizeden oluşur.
Liste üreteçleri, for
döngüleri olarak yeniden yazılabilir, ancak her for
döngüsü bir liste üreteci olarak yeniden yazılamaz.
Yukarıda kopekbaligi_harfleri
listesini oluşturan liste üretecimizi kullanarak, bunu bir for
döngüsü olarak yeniden yazalım. Bu, liste üretecinin nasıl çalıştığını daha iyi anlamamıza yardımcı olabilir.
kopekbaligi_harfleri = []
for harf in 'shark':
kopekbaligi_harfleri.append(harf)
print(kopekbaligi_harfleri)
Bir for döngüsüyle liste oluştururken, listeye atanan değişkenin boş bir listeyle başlatılması gerekir, kod bloğumuzun ilk satırında olduğu gibi. For
döngüsü daha sonra 'shark'
dizesindeki öğe üzerinde yineleme yapar, değişkeni harf
olarak kullanır. For
döngüsü içinde, dize içindeki her öğe list.append(x)
yöntemiyle listeye eklenir.
Liste üretecini bir for döngüsü olarak yeniden yazmak bize aynı çıktıyı sağlar:
Çıktı
['s', 'h', 'a', 'r', 'k']
Liste üreteçleri for
döngüleri olarak yeniden yazılabilir ve bazı for
döngüleri de kodu daha özlü hale getirmek için liste üreteçleri olarak yeniden yazılabilir.
Koşullu İfadelerle Liste Üreteçleri Kullanma
Liste üreteçleri, yeni listeler oluştururken mevcut listeleri veya diğer sıralı veri türlerini değiştirmek için koşullu ifadelerden yararlanabilir.
Bir liste üretecinde kullanılan bir if
ifadesine örnek bakalım:
balik_demet = ('balon balığı', 'palyaço balığı', 'yayın balığı', 'ahtapot')
balik_listesi = [balik for balik in balik_demet if balik != 'ahtapot']
print(balik_listesi)
Liste üreteci, balik_demet
demetini, balik_listesi
adlı yeni listenin temeli olarak kullanır. for
ve in
anahtar kelimeleri yukarıdaki bölümde olduğu gibi kullanılır ve şimdi bir if
ifadesi eklenmiştir. if
ifadesi, yalnızca 'ahtapot'
dizesine eşit olmayan öğelerin eklenmesini söyler, böylece yeni liste demetteki 'ahtapot'
ile eşleşmeyen öğeleri alır.
Bunu çalıştırdığımızda, balik_listesi
nin, 'ahtapot'
dizesinin hariç tutulması dışında, balik_demet
ile aynı dize öğelerini içerdiğini fark edeceğiz:
Çıktı
['balon balığı', 'palyaço balığı', 'yayın balığı']
Bu nedenle yeni listemiz, koşullu ifade tarafından hariç tutulan dize dışında, orijinal demetin her öğesine sahiptir.
Matematiksel operatörler, tam sayılar ve range()
dizi türünü kullanan başka bir örnek oluşturacağız.
sayi_listesi = [x ** 2 for x in range(10) if x % 2 == 0]
print(sayi_listesi)
Oluşturulan liste olan sayi_listesi
, 0-9 aralığındaki her öğenin değeri 2'ye bölünebilir ise öğenin karesiyle doldurulacaktır. Çıktı şu şekildedir:
Çıktı
[0, 4, 16, 36, 64]
Liste üretecinin ne yaptığını biraz daha anlamak için, yalnızca x for x in range(10)
ifadesini çağırırsak neyin yazdırılacağını düşünelim. Küçük programımız ve çıktısı şu şekilde olacaktır:
sayi_listesi = [x for x in range(10)]
print(sayi_listesi)
Çıktı:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Şimdi koşullu ifadeyi ekleyelim:
sayi_listesi = [x for x in range(10) if x % 2 == 0]
print(sayi_listesi)
Çıktı
[0, 2, 4, 6, 8]
if
ifadesi, son listede yalnızca 2'ye bölünebilen öğelerin yer almasını sağlamış ve tüm tek sayıları elemiştir.
Son olarak, her x
'i karesine almak için operatörü ekleyebiliriz:
sayi_listesi = [x ** 2 for x in range(10) if x % 2 == 0]
print(sayi_listesi)
Yani önceki listede yer alan [0, 2, 4, 6, 8]
sayıları şimdi karelerine alınmıştır:
Çıktı
[0, 4, 16, 36, 64]
Ayrıca, liste üreçlerinde iç içe if
ifadelerini de kullanabilirsiniz:
sayi_listesi = [x for x in range(100) if x % 3 == 0 if x % 5 == 0]
print(sayi_listesi)
Burada, liste üreteci önce sayının 3'e bölünebilir olup olmadığını kontrol eder, ardından 5'e bölünebilir olup olmadığını kontrol eder. x
her iki gereksinimi de karşılıyorsa, çıktı alınır ve çıktı şu şekildedir:
Çıktı
[0, 15, 30, 45, 60, 75, 90]
Koşullu if
ifadeleri, mevcut bir dizideki hangi öğelerin yeni bir listenin oluşturulmasına dahil edileceğini kontrol etmek için kullanılabilir.
Liste Üreçlerinde İç İçe Döngüler
İç içe döngüler, programlarımızda birden fazla yineleme gerçekleştirmek için kullanılabilir.
Bu kez, mevcut bir iç içe for
döngüsü yapısını gözden geçireceğiz ve liste üretecine doğru ilerleyeceğiz.
Kodumuz, iki liste üzerinde yineleme yapan ve bunlara dayalı olarak matematiksel işlemler gerçekleştiren yeni bir liste oluşturacaktır. İşte iç içe for döngüsü kod bloğumuz:
listem = []
for x in [20, 40, 60]:
for y in [2, 4, 6]:
listem.append(x * y)
print(listem)
Bu kodu çalıştırdığımızda şu çıktıyı alıyoruz:
Çıktı
[40, 80, 120, 80, 160, 240, 120, 240, 360]
Bu kod, her yinelemede ilk listedeki öğeleri ikinci listedeki öğelerle çarpar.
Bunu bir liste üretecine dönüştürmek için, kodun her satırını tek bir satıra yoğunlaştıracağız ve x * y
işlemiyle başlayacağız. Bunu dış for döngüsü, ardından iç for
döngüsü takip edecek. Yukarıdaki iç içe for döngüsü bloğuyla oluşturduğumuz listenin yeni listeyle eşleşip eşleşmediğini doğrulamak için liste üretecimizin altına bir print()
ifadesi ekleyeceğiz:
listem = [x * y for x in [20, 40, 60] for y in [2, 4, 6]]
print(listem)
Çıktı
[40, 80, 120, 80, 160, 240, 120, 240, 360]
Liste üretecimiz iç içe for
döngülerini tek bir satıra indirir ve hala listem
değişkenine atanacak olan aynı listeyi oluşturur.
Liste üreteçleri, birkaç satır kodu tek bir satıra indirgememize olanak tanır ve listeleri özlü bir şekilde oluşturmamızı sağlar. Ancak, kodumuzun okunabilirliği her zaman öncelikli olmalıdır, bu nedenle liste üreteci satırı çok uzun veya karmaşık hale geldiğinde, döngüler halinde ayrılması daha iyi olabilir.
Sonuç
Liste üreteçleri, bir listeyi veya başka bir sırayı yeni bir listeye dönüştürmemizi sağlar. Bu görevi tamamlamak için özlü bir sözdizimi sunar ve kod satırlarımızı sınırlar.
Liste üreteçleri, matematiksel kümelenme gösterimine veya küme üretecine benzer ve bu nedenle matematiksel geçmişe sahip programcılar için özellikle sezgisel olabilir.
Liste üreteçleri, kodumuzu daha özlü hale getirebilir, ancak nihai kodun mümkün olduğunca okunabilir olmasını sağlamak önemlidir, bu nedenle çok uzun tek satırlı kodlardan kaçınılmalı ve kodun kullanıcı dostu olması sağlanmalıdır.
Lisa Tagliaferri tarafından yazılan Understanding List Comprehensions in Python 3 a Programming makalesinin düzenlenmiş çevirisi
Daha Fazla Oku:
- Sonraki Makale: Python 3'te Tuple'ları Anlamak
- Önceki Makale: Python 3'te Liste Yöntemleri Nasıl Kullanılır