Se usi any(lst)vedi che lstè l'iterabile, che è un elenco di alcuni elementi. Se contenesse [0, False, '', 0.0, [], {}, None](che hanno tutti valori booleani di False) allora any(lst)sarebbe False. Se lstcontenesse anche uno dei seguenti [-1, True, "X", 0.00001](tutti valutati True) allora any(lst)sarebbe True.
Nel codice che hai pubblicato, x > 0 for x in lstquesto è un diverso tipo di iterabile, chiamato espressione generatore . Prima di espressioni generatore sono state aggiunte a Python, si sarebbe creata una comprensione lista , che sembra molto simile, ma con circostante []s': [x > 0 for x in lst]. Dal lstcontenente [-1, -2, 10, -4, 20], si otterrebbe questa lista compreso : [False, False, True, False, True]. Questo valore interno verrebbe quindi passato alla anyfunzione, che restituirà True, poiché è presente almeno un Truevalore.
Ma con le espressioni del generatore , Python non deve più creare quell'elenco interno di True(s)e False(s), i valori verranno generati mentre la anyfunzione itera attraverso i valori generati uno alla volta dall'espressione del generatore. E , poiché va in anycortocircuito, smetterà di iterare non appena vede il primo Truevalore. Ciò sarebbe particolarmente utile se hai creato lstusando qualcosa di simile lst = range(-1,int(1e9))(o xrangese stai usando Python2.x ). Anche se questa espressione genererà oltre un miliardo di voci, anyha solo andare per quanto riguarda la terza voce quando si arriva al 1, che valuta Trueper x>0, e così anypuò tornare True.
Se avessi creato una lista di comprensione , Python avrebbe dovuto prima creare la lista di miliardi di elementi in memoria, e poi passarla a any. Ma usando un'espressione del generatore , puoi fare in modo che le funzioni incorporate di Python piacciano anye si allaprano presto, non appena viene visualizzato un valore Trueo False.
any(x > 0 for x in list)è solo uno zucchero sintattico perany((x > 0 for x in list)).