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 .
any(x > 0 for x in list)sadece sözdizimsel bir şeker olduğunu da belirtmekte fayda varany((x > 0 for x in list)).