Python any () işlevi tam olarak nasıl çalışır?


113

Python belgeleri sayfasında any, any()işlevin eşdeğer kodu şu şekilde verilir:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

Bu işlev, bu biçimde çağırırsam hangi öğeyi test etmek istediğimi nasıl biliyor?

any(x > 0 for x in list)

İşlev tanımından tek görebildiğim, yinelenebilir bir nesneyi geçirdiğimdir. Nasıl yok fordöngü ı şey arıyorum biliyor > 0?

Yanıtlar:


166

Eğer kullanırsanız , bazı öğelerin bir listesi olan yinelenebilir any(lst)olduğunu görürsünüz lst. Eğer [0, False, '', 0.0, [], {}, None](tümü boole değerlerine sahip False) içeriyorsa , o any(lst)zaman olacaktır False. Eğer lstaynı zamanda, aşağıdakilerden herhangi birini içerdiğinde [-1, True, "X", 0.00001](değerlendirmek her biri True) daha sonra any(lst)olur True.

Yayınladığınız kodunda, x > 0 for x in lstbu bir adlandırılan iterable farklı bir türüdür jeneratör ifadesi . Jeneratör ifadeler Python eklenmiştir önce, bir yaratılmış olurdu liste anlama ama çevredeki çok benzeyen, []'s: [x > 0 for x in lst]. Gönderen lstiçeren [-1, -2, 10, -4, 20], bu alacağı kavramış listesi : [False, False, True, False, True]. Bu dahili değer daha sonra en az bir değer olduğu için anydönecek olan işleve aktarılır .TrueTrue

Ama ile jeneratör ifadeleri , Python artık o iç listesi oluşturmak için vardır True(s)ve False(s)değerler olarak oluşturulur, anyjeneratör ifadeye göre teker teker oluşturulan değerler aracılığıyla işlev yinelenir. Ve , çünkü anyilk gördüğü şekilde kısa devrelere, bu kısa sürede iterating duracaktır Truedeğer. Bu, özellikle lstbenzer bir şey kullanarak oluşturduysanız lst = range(-1,int(1e9))(veya Python2.xxrange kullanıyorsanız ) kullanışlı olacaktır . Bu ifade bir milyar girdileri üzerinde üretecektir olsa da, sadece aldığında üçüncü girdi olarak kadarıyla gitmek zorunda olan değerlendirir, için , ve böylece dönebilir .any1Truex>0anyTrue

Bir liste anlayışı oluşturmuş olsaydınız, Python'un önce hafızada milyar elemanlı liste oluşturması ve sonra bunu 'a iletmesi gerekirdi any. Ancak bir üreteç ifadesi kullanarak , Python'un gibi yerleşik işlevlere sahip olabilir anyve allbir Trueveya Falsedeğer görüldüğü anda erken çıkabilirsiniz .


25
Bunun any(x > 0 for x in list)sadece sözdizimsel bir şeker olduğunu da belirtmekte fayda var any((x > 0 for x in list)).
georg

3
NoneBoole değerlerine sahip öğeler listesine eklemeniz gerekirFalse
Alok Mysore

2
@Georg'a ek olarak, sözdizimsel şeker özel değildir any. def b(x): return x; print b(x > 1 for x in xs) # prints <generator object ..
industryworker3595112

@georg Bu açıklama için teşekkür ederiz. Bu, kodu herhangi bir parantez ile test ederken kafamı karıştıran gerçekten önemli bir nokta.
MasayoMusic

39
>>> names = ['King', 'Queen', 'Joker']
>>> any(n in 'King and john' for n in names)
True

>>> all(n in 'King and Queen' for n in names)
False

Birkaç kod satırını tek bir satıra indirgiyor. Aşağıdakiler gibi uzun kod yazmanıza gerek yok:

for n in names:
    if n in 'King and john':
       print True
    else:
       print False

23

(x > 0 for x in list) bu işlev çağrısı bir üreteç ifadesi oluşturur, örn.

>>> nums = [1, 2, -1, 9, -5]
>>> genexp = (x > 0 for x in nums)
>>> for x in genexp:
        print x


True
True
False
True
False

Hangi anybirinci nesneyi değerlendirir o karşılaşmış üzerinde kullanımları ve shortcircuitsTrue


7

Çünkü yinelenebilir

(x > 0 for x in list)

Not o x > 0döner ya Trueya Falseve böylece boole bir iterable var.


7

Basitçe söylemek gerekirse, any () bu işe yarar: koşula göre listede bir karşılayan değerle karşılaşsa bile true, aksi takdirde false döndürür.

list = [2,-3,-4,5,6]

a = any(x>0 for x in lst)

print a:
True


list = [2,3,4,5,6,7]

a = any(x<0 for x in lst)

print a:
False
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.