Python标准库定义了一个any()
函数
如果iterable的任何元素为true,则返回True。如果iterable为空,则返回False。
仅检查元素的取值为True
。我希望它能够因此指定一个回调来告诉某个元素是否符合要求,例如:
any([1, 2, 'joe'], lambda e: isinstance(e, int) and e > 0)
Python标准库定义了一个any()
函数
如果iterable的任何元素为true,则返回True。如果iterable为空,则返回False。
仅检查元素的取值为True
。我希望它能够因此指定一个回调来告诉某个元素是否符合要求,例如:
any([1, 2, 'joe'], lambda e: isinstance(e, int) and e > 0)
Answers:
当任何条件为True时,any函数将返回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(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”子句上的itens,因此对于您的示例,您可以使用:
any (e for e in [1, 2, 'joe'] if isinstance(e, int) and e > 0)
尽管其他人给出了很好的Python答案(在大多数情况下,我只会使用公认的答案),但我只是想指出,使自己的实用程序函数自己真正喜欢这样做是多么容易:
def any_lambda(iterable, function):
return any(function(i) for i in iterable)
In [1]: any_lambda([1, 2, 'joe'], lambda e: isinstance(e, int) and e > 0
Out[1]: True
In [2]: any_lambda([-1, '2', 'joe'], lambda e: isinstance(e, int) and e > 0)
Out[2]: False
我认为我至少要先使用function参数定义它,因为它与map()和filter()等现有的内置函数更加匹配:
def any_lambda(function, iterable):
return any(function(i) for i in iterable)
过滤器可以工作,加上它返回匹配的元素
>>> filter(lambda e: isinstance(e, int) and e > 0, [1,2,'joe'])
[1, 2]
any(map(lambda:..., [...]))
但是使用生成器理解更为惯用。