De functie any() werd geïntroduceerd in Python 2.5 voor het handige controleren: is er minstens één waar element in een iterabel object (bijvoorbeeld een lijst, tuple, generator). Deze functie is nuttig wanneer je wilt controleren of minstens één van meerdere voorwaarden waar is.
Historisch gezien moest je zonder deze functie een loop schrijven die onderbroken wordt bij het vinden van een element of je moest map en reduce combineren — dit was omslachtig en langzaam. Het belangrijkste probleem dat any() oplost, is de bondigheid en leesbaarheid van dergelijke controles.
De oplossing — any() en all() werken met luie evaluatie (ze stoppen zodra ze respectievelijk False of True vinden). Het is belangrijk om het verschil te begrijpen: any() geeft True terug bij het eerste waar element, all() alleen als alle elementen waar zijn.
Voorbeeldcode:
nums = [0, 0, 3, 0] if any(nums): print('Er is een niet-nul element in de lijst')
Belangrijke kenmerken:
Wat gebeurt er als je een lege lijst als argument voor any() doorgeeft?
Any() geeft False terug. Dit is logisch: in een lege volgorde is er geen waar element.
Wat is het fundamentele verschil tussen any() en all()?
Any() controleert de aanwezigheid van ten minste één waar waarde. All() controleert de waarheidsgetrouwheid van alle waarden. Hun resultaten zijn elkaars tegenpolen alleen voor strikt lege verzamelingen.
Kan any() worden gebruikt met een generator die oneindig kan zijn?
Ja, dat kan, en juist dankzij de luie evaluatie stopt any zodra het True tegenkomt. Als de generator echter nooit True geeft, zal de functie niet zelf eindigen.
def infinite_gen(): while True: yield 0 # any(infinite_gen()) — zal oneindig blijven draaien als er geen uitgangsvoorwaarden zijn
We willen controleren dat minstens één waarde niet None is:
values = [None, None, None] if any(values): do_something() # Dit wordt nooit uitgevoerd, als je gewoon vergeten bent dat None == False
Voordelen:
Nadelen:
Correct gebruik — controleren of er minstens één gebruiker ouder dan 30 is:
users = [{'age': 25}, {'age': 35}] if any(u['age'] > 30 for u in users): print('Er is een gebruiker ouder dan 30')
Voordelen:
Nadelen: