使用多行功能映射元素

时间:2019-12-16 10:09:16

标签: python lambda

考虑以下JavaScript示例:

var x = [1, 2, 3]

var y = x
          .map(i => i * 2)
          .map(i => i * i)

如果我想调用执行某些外部状态操作的函数,例如将消息记录或发布到主题,则只需使用方括号即可获得多行lambda:

var x = [1, 2, 3]

var y = x
          .map(i => i * 2)
          .map(i => {
            console.log("arg received ": + i)
            return i * i
          })

据我所知,由于单行lambda,在Python中是不可能做到如此琐碎的事情的,我们必须使用命名函数,因为任何代码阅读器或代码审阅者都必须在函数定义和函数用法之间跳转,即使该功能仅使用一次。

解决这一琐碎问题有行业标准吗?

2 个答案:

答案 0 :(得分:2)

专门用于日志记录或其他“无效”功能,可以使用or

>>> lst = [1, 2, 3]
>>> list(map(lambda x: x*x, map(lambda x: print(x) or x, map(lambda x: x*2, lst))))
2
4
6
[4, 16, 36]

在这里,a or b等效于a if a else b,并且由于print(x)的计算结果为None,而不是“真实的”,因此在print被执行。

还用作(嵌套的)列表理解/生成器:

>>> [print(x) or x*x for x in (x*2 for x in lst)]
2
4
6
[4, 16, 36]

这是否是好风格还是一个不同的问题。

或者,也许更干净一些,定义一个log / peek / debug函数,该函数记录该值然后返回它,将其放在map / list-comp链中的任何位置:

>>> def peek(x, f=print):
...     f(x)
...     return x
...
>>> [x*x for x in map(peek, (x*2 for x in lst))]
2
4
6
[4, 16, 36]

答案 1 :(得分:0)

Python并没有这个概念,您所能做的最好就是在要使用它的位置上方定义一个内部函数

def my_func(i):
    return i * i
y = map(my_func, map(lambda i: i * i, x))