Funkcja any() została wprowadzona w Pythonie 2.5 w celu wygodnego sprawdzenia: czy istnieje przynajmniej jeden prawdziwy element w obiekcie iterowalnym (np. liście, krotce, generatorze). Jest przydatna, gdy chcemy sprawdzić, czy co najmniej jeden warunek z wielu jest spełniony.
Historycznie, bez niej trzeba było pisać pętlę, która przerywała działanie po znalezieniu elementu lub łączyć map i reduce — co było uciążliwe i wolne. Głównym problemem, który rozwiązuje any(), jest zwięzłość i czytelność takich sprawdzeń.
Rozwiązanie — any() i all() działają z leniwą ewaluacją (zatrzymują się, gdy znajdą False lub True odpowiednio). Ważne jest, aby zrozumieć różnicę: any() zwraca True przy pierwszym prawdziwym elemencie, all() — jeśli wszystkie elementy są prawdziwe.
Przykład kodu:
nums = [0, 0, 3, 0] if any(nums): print('W liście jest element różny od zera')
Kluczowe cechy:
Co się stanie, jeśli jako argument any() przekażemy pustą listę?
Any() zwróci False. To logiczne: w pustej sekwencji nie ma ani jednego prawdziwego elementu.
Czym any() zasadniczo różni się od all()?
Any() sprawdza obecność przynajmniej jednej wartości prawdziwej. All() sprawdza prawdziwość wszystkich wartości. Ich wyniki są przeciwne tylko dla ściśle pustych kolekcji.
Czy można używać any() z generatorem, który może być nieskończony?
Tak, można, i dzięki leniwej ewaluacji any zatrzyma się, gdy napotka True. Jeśli jednak generator nigdy nie zwróci True, funkcja nie zakończy się sama z siebie.
def infinite_gen(): while True: yield 0 # any(infinite_gen()) — będzie działać w nieskończoność, jeśli nie ma warunków wyjścia
Chcemy sprawdzić, czy przynajmniej jedna wartość nie jest None:
values = [None, None, None] if any(values): do_something() # Nigdy się nie zdarzy, jeśli po prostu zapomnieliśmy, że None == False
Zalety:
Wady:
Poprawne zastosowanie — sprawdzenie, czy istnieje przynajmniej jeden użytkownik powyżej 30 roku życia:
users = [{'age': 25}, {'age': 35}] if any(u['age'] > 30 for u in users): print('Jest użytkownik powyżej 30')
Zalety:
Wady: