ProgramlamaVeri Mühendisi

Python'daki map() fonksiyonunun çalışma prensibini tanımlayınız. Liste ifadeleri ve jeneratör ifadelerinden nasıl farklıdır, hangi durumlarda map() daha tercih edilebilir ve ne zaman değildir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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.
  • Python 3'te 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:

  • map() her zaman tembel bir yineleyici döndürür.
  • Birden fazla koleksiyonla çalışmak için uygundur (birden fazla argüman ile) — map(f, a, b)
  • Doğrudan bir sentaks ile filtreleme koşullarını desteklemez (liste ifadesinin aksine)

Yanıltıcı sorular.

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]

Tipik hatalar ve anti-desinatörler

  • Python 3'te map()'in bir liste döndürmesini beklemek
  • map() içinde filtre yapmaya çalışmak — map sadece dönüştürür.
  • Uzunluğu eşit olmayan dizileri iletmek — diziler minimum uzunlukta kesilir.

Hayat örneği

Olumsuz durum

Geliştirici hemen bir liste almayı bekler:

mapped = map(abs, [-1, -2, -3]) print(mapped[1]) # TypeError: 'map' nesnesi indekslenemez

Artılar:

  • Bellek tasarrufu sağlar.

Eksiler:

  • İndeks üzerinden erişim denemesi sırasında hata
  • list() içine dönüştürme gereksinimi.

Olumlu durum

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:

  • Filtrelerle kolayca birleştirebilme.
  • Minimum bellek tüketimi.

Eksiler:

  • Yeni başlayanlar için daha az okunabilirlik.
  • Koşulun sözdizimsel desteği yoktur.