Achtergrond van de vraag
De functie map() bestaat in Python sinds de vroegste versies als een reflectie van functioneel programmeren. Het wordt gebruikt om een functie toe te passen op elk element van een iterabel object.
Probleem
Niet alle beginnende ontwikkelaars begrijpen het verschil tussen map, generators en list comprehensions. Er zijn vragen over prestaties, leesbaarheid en compatibiliteit met lazy data processing.
Oplossing
De functie map() neemt een functie en een of meer iterabele objecten en retourneert een lazy iterator, waarbij de functie opeenvolgend op elk element wordt toegepast. Dit is geheugenefficiënt en maakt het mogelijk om grote hoeveelheden gegevens te verwerken zonder tussenliggende lijsten te maken.
Voorbeeldcode:
# Retourneer de kwadraten van getallen via map getallen = [1, 2, 3, 4] kwadraten = map(lambda x: x**2, getallen) print(list(kwadraten)) # [1, 4, 9, 16]
Belangrijkste kenmerken:
Kan de map() functie met twee of meer sequenties tegelijk werken? Hoe kan dit?
Ja, je kunt meerdere sequenties doorgeven als de functie evenveel argumenten aanneemt. De iteratie stopt zodra het kortste iterabele object eindigt.
Voorbeeldcode:
a = [1, 2, 3] b = [4, 5, 6] resultaat = list(map(lambda x, y: x + y, a, b)) print(resultaat) # [5, 7, 9]
Wat retourneert map() als je een functie doorgeeft die None retourneert?
Elk element van map zal None zijn. Als de functie geen waarde expliciet retourneert, is het resultaat altijd een lijst van None:
def print_val(x): print(x) # geen return list(map(print_val, [1,2,3])) # [None, None, None] en drie uitvoer naar de console
Wat is het verschil tussen map() en een list comprehension wat betreft geheugengebruik?
map creëert niet het volledige resultaat in het geheugen, maar rekent het uit op verzoek; een list comprehension [...] maakt een volledige lijst aan. Voor grote hoeveelheden gegevens is het gebruik van map te verkiezen als je niet het volledige resultaat tegelijk nodig hebt.
In een project werd map gebruikt om een lijst te doorlopen met een functie die naar een bestand schrijft, en er werd vergeten een waarde terug te geven. Men verwachtte gegevens te krijgen, maar map retourneerde een iterator met None.
Voordelen:
Nadelen:
Map werd gebruikt voor het verwerken en filteren van een grote lijst van logs, met een schone functie die het resultaat teruggeeft. De map iterator gaf opeenvolgend waarden terug voor het schrijven naar het bestand zonder geheugenoverschrijding.
Voordelen:
Nadelen: