我可以使用装饰器循环嵌套列表吗?

时间:2016-10-06 01:19:48

标签: python decorator

我不得不重复遍历二维网格(行和列)以在网格中的每个单元格上执行各种功能。每次我想将另一个应用于单元格时,我必须对嵌套循环进行编码...

for row in rows:
   for col in row:
      func(col)

为了避免重复自己,我从这开始(旧学校 - Python 2.7.x)

#version 1
grid = [[1,2,3,],[4,5,6],[7,8,9]]
def loop(grid,func):
    results = []
    for row in grid:
        for col in row:
            results.append(func(col))
    return results
def func(x):
    return x+1
results = loop(grid,func)

输出:

[2, 3, 4, 5, 6, 7, 8, 9, 10]

对我来说,将函数作为参数传递给另一个函数,闻到了一个装饰器用例。但是我还没弄明白如何让它工作 - 将网格参数传递给任何包装函数都会让我感到沮丧。

我对上述内容的唯一改进是使用map

#version 2
def func(x):
    return x+1
def loop(grid,func):
    return map(func,[col for row in grid for col in row])

所以我的问题是可以使用装饰器来完成吗? (礼仪警报:哪种方式更好?)

1 个答案:

答案 0 :(得分:0)

当然,你可以编写一个装饰器来将一个在单个元素上工作的函数转换成一个使用嵌套循环在网格上工作的函数:

def gridfunc(func):
    def wrapper(grid):
        results = []
        for row in grid:
            for col in row:
                results.append(func(col))
        return results
    return wrapper

@gridfunc
def foo(x):
    return x+1

grid = [[1,2,3,],[4,5,6],[7,8,9]]
results = foo(grid)

唯一的缺点是如果你想在单个值而不是它们的网格上运行它,原始函数foo就不会(轻松)可用。如果您希望能够使用这两个版本,则可以使用gridfoo = gridfunc(foo)而不是@decorator语法。