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.