ProgrammatieBackend Python ontwikkelaar

Leg uit hoe de functie zip() in Python werkt, waarvoor deze wordt gebruikt en welke kenmerken men moet overwegen bij het verwerken van reeksen van verschillende lengtes.

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Geschiedenis van de vraag
De functie zip() is in Python geïntroduceerd als een handige manier om meerdere reeksen te 'verknopen' in tuples met overeenkomstige elementen, wat resulteert in een soort 'matrix'-structuur.

Probleem
Fouten treden op wanneer ontwikkelaars zip toepassen op reeksen van verschillende lengtes, in de verwachting dat het resultaat zal zijn op basis van de langste, of wanneer ze de unpacking onjuist gebruiken bij de omgekeerde conversie.

Oplossing
zip() accepteert een of meerdere reeksen en retourneert een iterator van tuples, waarbij de n-de tuple de n-de elementen uit alle reeksen bevat. De iteratie eindigt zodra de kortste reeks is uitgeput.

Voorbeeld code:

names = ['John', 'Anna', 'Peter'] ages = [28, 22, 35] grouped = list(zip(names, ages)) print(grouped) # [('John', 28), ('Anna', 22), ('Peter', 35)]

Belangrijke kenmerken:

  • Retourneert een luie iterator, maakt de lijst niet volledig in het geheugen aan.
  • Iteratie gaat door tot de kortste reeks.
  • Maakt het gemakkelijk om gegevens terug te 'ontvouwen' met unpacking en zip(*...)

Vragen met een valstrik.

Wat gebeurt er als zip reeksen van verschillende lengtes ontvangt?

Het resultaat heeft de lengte van de kortste reeks. De andere elementen worden genegeerd.

zip([1,2,3], ['a','b']) # [(1,'a'), (2,'b')]

Kan zip worden 'ontvouwd'? Hoe kan ik de oorspronkelijke reeksen terugkrijgen?

Ja, met behulp van unpacking met een sterretje en zip(*iterator):

pairs = [(1, "a"), (2, "b")] numbers, letters = zip(*pairs) print(numbers) # (1, 2)

Wat is het verschil tussen zip en itertools.zip_longest?

zip_longest van itertools werkt tot de langste reeks, vulde ontbrekende waarden in met de opgegeven fillvalue.

from itertools import zip_longest zip_longest([1,2], ['a','b','c'], fillvalue=None) # [(1,'a'), (2,'b'), (None, 'c')]

Typische fouten en anti-patronen

  • Verwachten dat zip paren maakt op basis van de maximale lengte.
  • Onverwacht gedrag bij lege reeksen: zip is meteen leeg.
  • Gebruik van zip zonder conversie naar lijst in Python 3: zip is een iterator, kan uitgeput worden na een enkele doorloop.

Voorbeeld uit het leven

Negatieve case

We verwerkten gebruikers- en wachtwoordparen via zip, maar de lijsten bleken van verschillende lengtes. Enkele gebruikers werden niet meegenomen vanwege de werking van zip op de kortste lijst.

Voordelen:

  • Korte code.

Nadelen:

  • Informatieverlies.
  • Moeilijk te debuggen wanneer de reden voor verloren gegevens verduisterd is.

Positieve case

Voor het combineren van de testresultaten en de namen van studenten hebben we zip_longest met fillvalue="n/a" gebruikt, waardoor we gegevens van alle deelnemers konden behouden.

Voordelen:

  • Ontbrekende waarden zijn duidelijk zichtbaar.
  • Niemand gaat verloren tijdens de verwerking.

Nadelen:

  • Moet een extra module worden geïmporteerd.