在python中,我有以下功能:
def is_a_nice_element(element, parameter):
#do something
return True or False
现在我想用这个函数作为谓词过滤一个列表,给出一个固定的参数。Python 有 itertools.ifilter 函数,但我不知道如何传递参数。这可能吗?如果没有,我该如何解决这个问题?
我喜欢functools.partial比lambda
.
itertools.ifilter( partial(is_a_nice_element, parameter=X), iterable )
把它包在一个lambda
:
itertools.ifilter(lambda e: is_a_nice_element(e, 42), iterable)
42 是你的额外参数,或者你想要的任何其他参数。
解决方案使用lambda
并且functools.partial
非常正确并直接回答您的问题,但我认为它们并不是真正理想的解决方案。
将filter
// itertools.ifilter
/map
与itertools.imap
匿名函数一起使用几乎总是比使用生成器表达式或列表推导式更清晰。例如,在这种情况下,我将编写生成器表达式
(item for item in iterable if is_a_nice_element(item, constant))
而不是使用ifilter
. 在这种情况下,ifilter
解决方案仍然具有相当的可读性,但在许多情况下,试图通过大量麻烦来定义正确的函数并不像仅仅执行操作那样值得。
如果您使用ifilter
then 参数将需要是常量,在这种情况下您可以使用默认参数parameter=something
。如果您希望参数发生变化,则需要使用另一种方法来获取二元谓词。
如果您手头已经有了列表,ifilter
那么相对于内置过滤器来说有点过分了。
描述您想要完成的任务将有助于做出更具体的答案。