129 votes

Comment fonctionne exactement la fonction python any() ?

Dans la page de la documentation python pour any le code équivalent pour le any() est donnée comme suit :

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

Comment cette fonction sait-elle quel élément je veux tester si je l'appelle dans ce formulaire ?

any(x > 0 for x in list)

D'après la définition de la fonction, tout ce que je peux voir, c'est que je passe un objet itérable. Comment la fonction for loop sait que je cherche quelque chose > 0 ?

186voto

Paul McGuire Points 24790

Si vous utilisez any(lst) vous voyez que lst est l'itérable, qui est une liste de certains éléments. Si elle contient [0, False, '', 0.0, [], {}, None] (qui ont tous des valeurs booléennes de False ) alors any(lst) serait False . Si lst contenait également l'un des éléments suivants [-1, True, "X", 0.00001] (qui donnent tous la valeur True ) alors any(lst) serait True .

Dans le code que vous avez posté, x > 0 for x in lst il s'agit d'un autre type d'itérable, appelé "iterable". expression de générateur . Avant que les expressions génératrices ne soient ajoutées à Python, vous auriez créé un fichier compréhension de la liste qui est très similaire, mais avec un entourage [] 's : [x > 0 for x in lst] . De la lst contenant [-1, -2, 10, -4, 20] vous obtiendrez ceci liste exhaustive : [False, False, True, False, True] . Cette valeur interne est ensuite transmise à l any qui renverrait True puisqu'il y a au moins un True valeur.

Mais avec expressions de générateur Python n'a plus besoin de créer cette liste interne de True(s) y False(s) les valeurs seront générées en tant que any itère à travers les valeurs générées une par une par l'expression du générateur. Et puisque any court-circuits, il arrêtera d'itérer dès qu'il verra le premier True valeur. Cela serait particulièrement pratique si vous créiez lst en utilisant quelque chose comme lst = range(-1,int(1e9)) (ou xrange si vous utilisez Python2.x ). Même si cette expression va générer plus d'un milliard d'entrées, any ne doit aller que jusqu'à la troisième entrée lorsqu'il s'agit de 1 qui évalue True pour x>0 et ainsi de suite any peut retourner True .

Si vous aviez créé un compréhension de la liste Python aurait d'abord dû créer la liste d'un milliard d'éléments en mémoire, puis la transmettre à any . Mais en utilisant un expression de générateur vous pouvez utiliser les fonctions intégrées de Python telles que any y all éclater tôt, dès qu'un True o False est observée.

49voto

Pranjay Kaparuwan Points 721
>>> 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

Il réduit simplement plusieurs lignes de code en une seule. Vous n'avez pas besoin d'écrire un code long comme :

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

23voto

jamylak Points 38094

(x > 0 for x in list) dans cet appel de fonction crée une expression de générateur, par exemple.

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

True
True
False
True
False

Quel any utilise, et court-circuite en rencontrant le premier objet qui évalue True

9voto

freakish Points 20067

C'est parce que l'itérable est

(x > 0 for x in list)

Notez que x > 0 renvoie soit True o False et ainsi vous avez un itérable de booléens.

7voto

Alisha Points 71

En d'autres termes, any() fait ce travail : selon la condition, même s'il rencontre une valeur complète dans la liste, il renvoie vrai, sinon il renvoie faux.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X