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