any() fonksiyonu, Python 2.5'te çıkarılarak, bir yineleyici nesnede (örneğin, liste, demet, jeneratör) en az bir doğru elemanın olup olmadığını kontrol etmek için kullanışlı hale getirilmiştir. Bir dizi koşuldan en az birinin yerine getirilip getirilmediğini kontrol etmek istediğinizde faydalıdır.
Tarihi olarak, bunun olmaması durumunda, bulunulan eleman üzerinden durdurmayı gerektiren bir döngü yazmak ya da map ve reduce'ü birleştirmek gerekiyordu — bu hantal ve yavaş bir yöntemdi. any()'in çözdüğü ana sorun, bu tür kontrollerin özlü ve okunabilir olmasıdır.
Çözüm — any() ve all() tembel değerlendirme ile çalışır (False veya True buldukları anda dururlar). Önemli olan farkı anlamaktır: any() ilk doğru eleman bulunduğunda True döner, all() ise tüm elemanlar doğruysa True döner.
Kod örneği:
nums = [0, 0, 3, 0] if any(nums): print('Listede sıfırdan farklı bir eleman var')
Anahtar özellikler:
Eğer any() fonksiyonuna boş bir liste verilir ise ne olur?
Any() False döner. Bu mantıklıdır: boş bir dizide hiçbir doğru eleman yoktur.
Any() temelde all()'den ne farkla ayrılır?
Any() en az bir doğru değer olup olmadığını kontrol eder. All() ise tüm değerlerin doğruluğunu kontrol eder. Sonuçları sadece tamamen boş koleksiyonlar için birbirinin tersidir.
Any() sonsuz olabilecek bir jeneratör ile kullanılabilir mi?
Evet, kullanılabilir, ve tam da bu nedenle any, True ile karşılaştığında duracaktır. Eğer jeneratör asla True vermezse, fonksiyon kendi kendine sonlanmayacaktır.
def infinite_gen(): while True: yield 0 # any(infinite_gen()) — çıkış koşulu yoksa sonsuz çalışır
En az bir değerin None olmadığını kontrol etmek istiyoruz:
values = [None, None, None] if any(values): do_something() # Eğer None'un False olduğu unutulduysa, bu asla çalışmayacak
Artılar:
Eksiler:
Doğru uygulama — 30 yaşından büyük en az bir kullanıcıyı aramaktır:
users = [{'age': 25}, {'age': 35}] if any(u['age'] > 30 for u in users): print('30 yaşından büyük bir kullanıcı var')
Artılar:
Eksiler: