给定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函数中实现?
答案 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)]