Si vous utilisez, any(lst)vous voyez que lstc'est l'itérable, qui est une liste de certains éléments. S'il contenait [0, False, '', 0.0, [], {}, None](qui ont tous des valeurs booléennes de False), alors le any(lst)serait False. S'il lstcontenait également l'un des éléments suivants [-1, True, "X", 0.00001](dont tous évalués à True), alors le any(lst)serait True.
Dans le code que vous avez publié, x > 0 for x in lstil s'agit d'un autre type d'itérable, appelé expression de générateur . Avant expressions du générateur ont été ajoutées à Python, vous avez créé une compréhension de la liste , ce qui est très similaire, mais avec autour []de: [x > 0 for x in lst]. De la lstcontenant [-1, -2, 10, -4, 20], vous obtiendrez cette liste compris : [False, False, True, False, True]. Cette valeur interne serait ensuite transmise à la anyfonction, qui retournerait True, car il y a au moins une Truevaleur.
Mais avec les expressions génératrices , Python n'a plus à créer cette liste interne de True(s)et False(s), les valeurs seront générées au fur et à mesure que la anyfonction parcourt les valeurs générées une par une par l'expression du générateur. Et , depuis les anycourts-circuits, il arrêtera d'itérer dès qu'il verra la première Truevaleur. Ce serait particulièrement pratique si vous avez créé en lstutilisant quelque chose comme lst = range(-1,int(1e9))(ou xrangesi vous utilisez Python2.x ). Même si cette expression générera plus d'un milliard d'entrées, elle anyn'a qu'à aller jusqu'à la troisième entrée lorsqu'elle arrive 1, qui évalue Truepour x>0, et anypeut donc revenir True.
Si vous aviez créé une compréhension de 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 une expression de générateur , vous pouvez avoir des fonctions intégrées de Python comme anyet allse déclencher tôt, dès qu'une valeur Trueou Falseest vue.
any(x > 0 for x in list)n'est qu'un sucre syntaxique pourany((x > 0 for x in list)).