Python next()
methode – de meest verfijnde manier om iterators te gebruiken
Als je Python gebruikt, kom je vaak in deze situatie:
"Ik wil alleen het eerste item dat aan de voorwaarden voldoet uit de lijst halen, hoe doe ik dat?"
De meest Pythonic en verfijnde manier om dit te doen is met next()
. De reden dat ik dit artikel schrijf, is dat elke keer als ik de next()
code gebruik om het gewenste item uit een lijst te halen, ik denk: "Wow, dit is echt elegant...". Daarom is het een van de favoriete stukjes code van mij. Het is een essentiële code voor mensen zoals ik die dol zijn op Django en DRF.
Ik zal hieronder uitleggen waarom deze methode nuttig is in Django.
Het is een klein maar krachtig hulpmiddel, en hoewel de gebruiksaanwijzing niet moeilijk is, kan het nieuw zijn voor iemand die het nog nooit heeft gebruikt, dus ik zal het in dit artikel vriendelijk uitleggen.
next()
in essentie: Een functie die de volgende waarde van een iterator opvraagt
Laten we eerst het concept begrijpen.
next(iterator[, default])
iterator
: De iterator waarop.next()
kan worden aangeroepen van een iterabel objectdefault
: De standaardwaarde die wordt geretourneerd in plaats van eenStopIteration
exceptie wanneer de iteratie is voltooid- Retourwaarde: Haal de volgende waarde van de iterator
Voorbeeld:
it = iter([1, 2, 3])
print(next(it)) # 1
print(next(it)) # 2
print(next(it)) # 3
print(next(it)) # StopIteration exceptie wordt veroorzaakt
Om uitzonderingen te voorkomen:
print(next(it, 'einde')) # Retourneert de standaardwaarde → 'einde'
Als je tot hier begrepen hebt, weet je dat next()
een hulpmiddel is om de iterator stap voor stap vooruit te duwen. Maar alleen dat is nog niet genoeg om de toepassingen in de praktijk goed te begrijpen, toch? Nu ga ik je echt de charme laten zien.
Praktijkvoorbeeld – het eerste item uit een lijst halen dat aan de voorwaarden voldoet
users = [
{'id': 1, 'name': 'Alice'},
{'id': 2, 'name': 'Bob'},
{'id': 3, 'name': 'Charlie'},
]
user = next((u for u in users if u['id'] == 2), None)
print(user) # {'id': 2, 'name': 'Bob'}
De indruk die deze syntaxis de eerste keer maakte was echt sterk. Het is zo beknopt en verfijnd. De code die met een for
loop vier tot vijf regels zou zijn, wordt nu in één regel samengevat. En het is niet alleen goed omdat het kort is, maar ook omdat het een duidelijk doelgericht code is.
Waarom is deze manier mooi?
- Voorwaarde en zoekopdracht zijn allemaal in één regel opgenomen
- Veilig omdat het
None
retourneert als er geen resultaten zijn - Bevorderlijk omdat het geen
for
loop vereist (maar onder de motorkap hetzelfde herhalingsproces uitvoert)
Deze syntaxis beroert vooral beginners, die dan denken: “Oh, is deze expressie ook mogelijk?” en het is een code waarvan intermediate developers denken: “Dit moet ik beslist aan mijn repertoire toevoegen.”
dict.get()
vergelijken – eenvoudige sleutelzoektocht vs zoekopdracht op voorwaarde
my_dict = {'name': 'Alice', 'age': 30}
my_dict.get('age') # 30
my_dict.get('city', 'niet gevonden') # 'niet gevonden'
Zo is dict.get()
zeer nuttig als de sleutel vaststaat. Maar next()
schittert in situaties waar je like een lijst van dictionaries, en een specifiek item op basis van een voorwaarde moet vinden.
user = next((u for u in users if u['name'].startswith('C')), None)
Zo vind je de eerste gebruiker wiens name
begint met C. Dit is absoluut niet mogelijk met de .get()
functie.
Django en next() – wordt vaak gebruikt
In Django zijn QuerySet
iterabel maar werken met uitgestelde evaluatie. Daarom moet je het eerst met list()
forceren om te evalueren. Daarna is next()
zeer nuttig voor het doen van conditionele zoekopdrachten.
qs = list(MyModel.objects.filter(active=True))
item = next((obj for obj in qs if obj.name == 'Hong Gildong'), None)
Deze aanpak is nuttig in situaties zoals:
- Als het met filter()
voldoende is gefilterd, maar de laatste voorwaarde complex of dynamisch is
- Wanneer er aangepaste voorwaarden zijn die niet kunnen worden behandeld met .first()
- Wanneer je gewoon snel één item wilt ophalen zonder een loop
Zelfs ik gebruik deze methode vaak bij Django-ontwikkeling als ik voorwaardelijke zaken heb die niet worden opgevangen door .first()
. Collega's die de code lezen kunnen de betekenis meteen begrijpen, wat de samenwerking bevorderlijk maakt.
Tips samenvatten
next((x for x in iterable if voorwaarden), None)
structuren moet je in je hoofd hebben.- Omdat er mogelijk geen retourwaarde is, maak het een gewoonte om een
default
waarde op te geven. - Onthoud dat
dict.get()
voor sleutelzoektocht is, ennext()
voor zoekopdrachten op basis van voorwaarden. - Het kan voor elk iterabel object worden gebruikt.
- Misbruik het niet – complexe voorwaarden kunnen in plaats daarvan een
for
loop duidelijker maken.
Slot – een klein hulpmiddel om code mooi te maken
next()
lijkt een eenvoudige functie, maar het is een zeer krachtig hulpmiddel dat de opvolgingsfilosofie van Python in zich draagt. Vooral wanneer je het eerste item uit een lijst wilt halen dat aan de voorwaarden voldoet, komt er weinig intuïtiever en beknopter uit.
Als deze post je doet denken: “Oh, ik wil die code ook uitproberen”, ben je al halverwege bekend met de materie. Nu moet je het gewoon een paar keer zelf gebruiken om het onder de knie te krijgen.
Ik ben van plan om in de toekomst vaak eenvoudige maar mooie Python code te delen. 😊
댓글이 없습니다.