Библиотека стандарта Python определяет any()
функция это
Возвратите True, если какой-либо элемент повторяемого верен. Если повторяемое пусто, возвратите False.
Это проверяет, только если элементы оценивают к True
. Что я хочу, чтобы это было в состоянии, так определите обратный вызов, чтобы сказать, отвечает ли элемент всем требованиям как:
any([1, 2, 'joe'], lambda e: isinstance(e, int) and e > 0)
Как насчет:
>>> any(isinstance(e, int) and e > 0 for e in [1,2,'joe'])
True
Также работает с all()
конечно:
>>> all(isinstance(e, int) and e > 0 for e in [1,2,'joe'])
False
любая функция возвращает True, когда любое условие равно True.
>>> any(isinstance(e, int) and e > 0 for e in [0 ,0, 1])
True # Returns True because 1 is greater than 0.
>>> any(isinstance(e, int) and e > 0 for e in [0 ,0, 0])
False # Returns False because not a single condition is True.
На самом деле, понятие любой функции взято из Lisp или вы можете сказать из подхода к программированию функций. Есть еще одна функция, которая прямо противоположна ей - это all
>>> all(isinstance(e, int) and e > 0 for e in [1, 33, 22])
True # Returns True when all the condition satisfies.
>>> all(isinstance(e, int) and e > 0 for e in [1, 0, 1])
False # Returns False when a single condition fails.
Эти две функции действительно круты при правильном использовании.
Следует использовать "выражение-генератор" - то есть языковую конструкцию, которая может потреблять итераторы и применять к ним фильтры и выражения в одной строке:
Например, (i ** 2 for i in xrange(10))
является генератором для квадрата первых 10 натуральных чисел (от 0 до 9)
Они также позволяют использовать выражение "if" для фильтрации итенов в выражении "for", так что в Вашем примере Вы можете использовать:
any (e for e in [1, 2, 'joe'] if isinstance(e, int) and e > 0)
фильтр может работать, плюс он возвращает вам совпадающие элементы
>>> filter(lambda e: isinstance(e, int) and e > 0, [1,2,'joe'])
[1, 2]