Frage Wie funktioniert die Funktion python any ()?


Auf der Python-Dokumentseite für any, der entsprechende Code für die any() Funktion ist gegeben als:

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

Woher weiß diese Funktion, welches Element ich testen möchte, wenn ich es in dieser Form anrufe?

any(x > 0 for x in list)

Von der Funktionsdefinition kann ich nur sehen, dass ich ein iterierbares Objekt übergebe. Wie funktioniert das? for Schleife weiß ich suche etwas > 0?


75
2018-05-12 08:18


Ursprung


Antworten:


Wenn du benutzt any(lst) siehst du das lst ist das iterable, das eine Liste einiger Elemente ist. Wenn es enthalten ist [0, False, '', 0.0, [], {}, None] (die alle boolesche Werte von haben False) dann any(lst) wäre False. Ob lst enthielt auch irgend eines der folgenden [-1, True, "X", 0.00001] (die alle zu bewerten True) dann any(lst) wäre True.

In dem Code, den du gepostet hast, x > 0 for x in lst, das ist eine andere Art von iterierbar, genannt a Generatorausdruck. Bevor Generatorausdrücke zu Python hinzugefügt wurden, hätten Sie einen erstellt Listenverständnis, die sehr ähnlich aussieht, aber mit der Umgebung []ist: [x > 0 for x in lst]. Von dem lst enthalten [-1, -2, 10, -4, 20]Du würdest das bekommen umfasste Liste: [False, False, True, False, True]. Dieser interne Wert würde dann an die any Funktion, die zurückkehren würde True, da es mindestens eins gibt True Wert.

Aber mit GeneratorausdrückePython muss diese interne Liste nicht mehr erstellen True(s) und False(s), werden die Werte als generiert any Die Funktion durchläuft die Werte, die jeweils durch den Generatorausdruck erzeugt werden. Und, schon seit any Kurzschlüsse, hört es auf zu iterieren, sobald es das erste sieht True Wert. Dies wäre besonders praktisch, wenn Sie erstellt haben lst mit etwas wie lst = range(-1,int(1e9)) (oder xrange wenn Sie verwenden Python2.x). Obwohl dieser Ausdruck mehr als eine Milliarde Einträge generiert, any muss nur bis zum dritten Eintrag gehen, wenn es geht 1, die bewertet True zum x>0, und so any kann zurückkehren True.

Wenn Sie eine erstellt haben ListenverständnisHätte Python zuerst die Milliarden-Element-Liste im Speicher erstellen müssen, und dann diese an übergeben any. Aber mit a Generatorausdruck, können Sie Pythons eingebaute Funktionen wie any und all früh ausbrechen, sobald a True oder False Wert wird gesehen.


112
2018-05-12 08:38



>>> 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

Es reduziert nur mehrere Codezeilen in einen. Sie müssen nicht länger Code schreiben wie:

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

21
2018-06-08 07:29



(x > 0 for x in list) In diesem Funktionsaufruf wird ein Generatorausdruck erstellt, z.

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


True
True
False
True
False

Welche any Verwendungen und Kurzschlüsse bei der Begegnung mit dem ersten evaluierenden Objekt True


19
2018-05-12 08:21



Es ist, weil das iterable ist

(x > 0 for x in list)

Beachten Sie, dass x > 0 gibt entweder zurück True oder False und so haben Sie eine iterable von booleans.


5
2018-05-12 08:20



Einfach gesagt, any () funktioniert das: Gemäß der Bedingung, selbst wenn es einen erfüllenden Wert in der Liste trifft, gibt es true zurück, andernfalls gibt es false zurück.

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

4
2018-05-05 09:37