Konunun geçmişi
map() fonksiyonu fonksiyonel programlamadan gelir (ilk olarak Lisp'ten), amacı bir fonksiyonu bir dizinin her bir elemanına uygulayarak sonuçlar ile yeni bir yineleyici nesne döndürmektir. Python'da dizin ifadeleri ve jeneratör ifadeleri ortaya çıkmadan çok önce var oldu, ancak hala yaygın olarak kullanılmaktadır, özellikle büyük veri işleme boru hatlarında.
Sorun
Eğer bir koleksiyondaki her bir elemanı belirli bir kurala göre değiştirmek gerekiyorsa, for döngüleri hızlı bir şekilde karmaşık hale gelir ve daha az okunabilir olur. Liste ifadeleri ve map() niyeti kompakt bir şekilde ifade etmemizi sağlar. Bu yaklaşımların farklılıklarını anlamak önemlidir; böylece doğru aracı seçebiliriz.
Çözüm
map(func, iterable) giriş dizisindeki elemanları func fonksiyonu ile dönüştüren tembel bir yineleyici oluşturur.map nesnesi elemanları hemen hesaplamaz, tembel çalışır.def square(x): return x * x squares = map(square, [1, 2, 3]) print(list(squares)) # [1, 4, 9]
Liste ifadesi [square(x) for x in [1, 2, 3]] aynı şeyi yapar, ancak hemen bir liste döndürürken, jeneratör ifadesi (square(x) for x in [1, 2, 3]) tembel bir jeneratördür.
Ana özellikler:
Python 3'te map() bir liste döndürür mü?
Hayır, Python 3'ten itibaren map() bir liste döndürmez, tembel bir yineleyici döndürür. Liste almak için sonucu manuel olarak list() içine sarmalayıp döndürmek gerekir.
res = map(str.upper, ['a', 'b']) print(res) # <map object ...> print(list(res)) # ['A', 'B']
map() ile filtreleme koşulu eklemek mümkün müdür?
Hayır, map() elemanları filtrelemez, yalnızca dönüştürür. Filtreleme için filter() veya liste ifadesi kullanın:
result = map(str.upper, ['a', 'b', None]) # Eğer None gelirse, map str.upper(None) çağrısı hatası verecektir. # filter None'ı map'ten önce kaldırmada yardımcı olur.
map() ile iki diziyi aynı anda döngülemek mümkün müdür?
Evet, map() herhangi bir sayıda diziyi kabul edebilir ve dönüştürücü fonksiyon aynı sayıda argümanı almak zorundadır:
x = [1, 2, 3] y = [10, 20, 30] result = map(lambda a, b: a + b, x, y) print(list(result)) # [11, 22, 33]
Geliştirici hemen bir liste almayı bekler:
mapped = map(abs, [-1, -2, -3]) print(mapped[1]) # TypeError: 'map' nesnesi indekslenemez
Artılar:
Eksiler:
Filtreleme için jeneratör ifadesi kullanımı ve dönüştürme için map() kullanımı:
nums = range(-5, 6) positives = (x for x in nums if x > 0) sq = map(lambda n: n * n, positives) print(list(sq)) # [1, 4, 9, 16, 25, 36]
Artılar:
Eksiler: