Якщо ви користуєтеся, any(lst)ви бачите, що lstце ітерабельний список, який є списком деяких елементів. Якби він містив [0, False, '', 0.0, [], {}, None](які мають усі булеві значення False), то це any(lst)було б False. Якби lstтакож містилося що-небудь із наступного [-1, True, "X", 0.00001](все це оцінювати True), то це any(lst)було б True.
У коді, який ви опублікували, x > 0 for x in lstце інший вид ітерабелів, який називається генераторним виразом . Перед вираження генератора були додані в Python, ви б створили список розуміння , який дуже схожий, але з оточуючими []«s: [x > 0 for x in lst]. З lstмістить [-1, -2, 10, -4, 20], ви отримаєте цей збагнув список : [False, False, True, False, True]. Це внутрішнє значення потім переходитиме до anyфункції, яка повертається True, оскільки існує принаймні одне Trueзначення.
Але з виразами генератора , Python більше не потрібно створювати що внутрішній список True(s)і False(s)значення будуть згенеровані як anyфункція перебирає значення генерується по одному за висловом генератора. І , оскільки anyкоротке замикання, воно зупинить ітерацію, як тільки побачить перше Trueзначення. Це було б особливо зручно, якщо ви створили, lstвикористовуючи щось на зразок lst = range(-1,int(1e9))(або xrangeякщо ви використовуєте Python2.x ). Навіть незважаючи на те, що цей вираз генерує понад мільярд записів, anyвін повинен досягти лише третього запису, коли він потрапить 1, який оцінює Trueдля x>0, і так anyможе повернутися True.
Якби ви створили розуміння списку , Python спочатку мав би створити список пам'яті мільярдів у пам'яті, а потім передати його any. Але, використовуючи генераторний вираз , ви можете мати вбудовані функції Python на зразок anyта allвибиватися рано, як тільки буде видно значення Trueабо Falseзначення.
any(x > 0 for x in list)це лише синтаксичний цукор дляany((x > 0 for x in list)).