0

我对 python 还很陌生,但还没有完全理解它的概念。最初的代码是这样的

def isSomething(s):
    result=False
    for f in listFunctions:
        if f(s):
            result=True
return result

所以我想知道是否有这样的事情

def isSomething(s):
   return any(mapManyFunctions2Object(listFunctions,s))

其中 mapManyFunctions2Object() 就像但映射函数的可迭代列表和一个对象。

是否有任何标准函数可以替换 mapManyFunctions2Object() ?

4

3 回答 3

3

您可以将any生成器表达式一起使用:

def isSomething(s):
   return any(f(s) for f in listFunctions))

any与生成器表达式一起使用的一个好处是,any一旦一些f(s)返回 Truish 值,它就会短路。因此,listFunctions除非它们都碰巧返回 Falsish 值,否则不会调用其中的所有函数。

于 2013-09-19T19:57:59.383 回答
1

您可以简单地编写这样一个函数:

def apply_all(functions, arg):
    return [function(arg) for function in functions]

或者,如果你想要一个 3.x 风格map的 -like:

def apply_all(functions, arg):
    yield from (function(arg) for function in functions)

但是,你真的不需要,因为你可以很容易地使用表达式本身。

map由于历史原因、对其他语言的熟悉度等原因,值得拥有——只要要映射的东西是一个命名良好的函数,很多人就会立即明白什么map(frotz, widgets)意思。我认为这不会是真的apply_all(frotzers, widget)


只是为了好玩,定义apply_allmap

def apply_all(functions, arg):
    return map(lambda function: function(arg), functions)
于 2013-09-19T19:56:37.877 回答
0

你可以很容易地做到这一点:

>>> listFunctions = [lambda x: x == 1, lambda x: x == 2, lambda x: x == 3]
>>> def isSomething(x):
...     return any(f(x) for f in listFunctions)
... 
>>> isSomething(3)   # run functions from list on 3, get results False, False and, finally, True
True
>>> isSomething(5)   # run functions from list on 5, all results is False
False
于 2013-09-19T20:02:39.323 回答