如果给函数指定了lis,则自动使用list comprehension/map()递归

2024-04-25 19:01:54 发布

您现在位置:Python中文网/ 问答频道 /正文

作为Mathematica的用户,我喜欢自动“在列表上执行线程”的函数(Mathematica的人称之为-seehttp://reference.wolfram.com/mathematica/ref/Listable.html)。这意味着如果给一个函数一个列表而不是一个值,它会自动使用每个列表项作为参数并返回结果列表

myfunc([1,2,3,4]) -> [myfunc(1),myfunc(2),myfunc(3),myfunc(4)]

我在Python中实现了这样的原则:

^{pr2}$

这是个好办法吗?你能想到这个实施或整个策略的缺点吗?在


Tags: 函数用户comref列表参数htmlmyfunc
2条回答

如果这是在很多函数中都要做的事情,那么可以使用Python decorator。这里有一个简单但有用的方法。在

def threads_over_lists(fn):
    def wrapped(x, *args, **kwargs):
        if isinstance(x, list):
            return [fn(e, *args, **kwargs) for e in x]
        return fn(x, *args, **kwargs)
    return wrapped

这样,只需在函数前面添加@threads_over_lists行,就可以使它这样运行。例如:

^{pr2}$

您还应该考虑是希望它只对列表进行矢量化,还是对其他iterable对象(如元组和生成器)进行矢量化。This是一个有用的StackOverflow问题,用于确定这一点。但是要小心-字符串是iterable的,但您可能不希望函数对其中的每个字符进行操作。在

这是个好办法。 但是,您必须为您编写的每个函数执行此操作。 为了避免这种情况,您可以使用decorator这样的一个:

def threads(fun):
  def wrapper(element_or_list):
    if isinstance(element_or_list, list):
      return [fun(element) for element in element_or_list]
    else:
      return fun(element_or_list)

  return wrapper

@threads
def plusone(e):
  return e + 1

print(plusone(1))
print(plusone([1, 2, 3]))

相关问题 更多 >