Lambda-ize函数使用函数外部的变量

时间:2016-01-29 09:00:01

标签: python function lambda

给定x的功能并操纵x

>>> x = [5,3,0,0]
>>> j = 1
>>> for i, xi in enumerate(x):
...     if xi == 0:
...             x[i] = 1.0/2**j
...             j+=1
... 
>>> x
[5, 3, 0.5, 0.25]

在一个功能中:

def f(x):
  j = 1
  for i, xi in enumerate(x):
    if xi == 0:
      x[i] = 1.0/2**j
      j+=1
  return x

我想把它改成一个lambda函数但是当它使用一个不在我的循环中的额外变量时怎么可能呢?

如果没有j+=1的复杂性并将j视为常量,我可以这样做:

j = 1
f = lambda x: [1.0/2**j if xi == 0 else xi for i, xi in enumerate(x)]

但是我需要j来改变if if语句。 如何在lambda函数中实现?

1 个答案:

答案 0 :(得分:2)

您可以j itertools.count() object;每次你打电话给next()时,它都会产生序列中的下一个值:

from itertools import count

j = count(1)
f = lambda x: [1.0 / 2 ** next(j) if xi == 0 else xi for i, xi in enumerate(x)]

这是有效的,因为当x == 0为真时,您只会要求下一个值。

但是,每次要使用j时,您现在需要重置 lambda。您可以将它作为一个额外的单元素元组结合到您的列表理解中来循环:

f = lambda x: [1.0 / 2 ** next(j) if xi == 0 else xi
               for j in (count(1),)
               for i, xi in enumerate(x)]

所有这些并非所有可读。我会改为使用def函数对象。

作为旁注,您可以使用or替换.. if xi == 0 else xi表达式; xi == 0使xi成为虚假:

f = lambda x: [xi or 1.0 / 2 ** next(j)
               for j in (count(1),)
               for i, xi in enumerate(x)]