Lambda函数与0

4 投票
5 回答
942 浏览
提问于 2025-04-16 12:31

我想写一个函数,用一个lambda函数来改变列表中的每个元素。

a = [1,5,2,4]

def func1(list,func2):
    for x in range(len(list)):
        list[x] = func2(list[x])

func1(a,lambda x: x>3 and 10 or x)
print a

结果是 [1,10,2,10]

这没问题。但是我把'10'改成了'0'

func1(a,lambda x: x>3 and 0 or x)

结果变成了 [1,5,2,4]

为什么结果不是 [1,0,2,0] 呢?

抱歉,我的英语不好。

5 个回答

1
a and b or c

这几乎是等价的(因为你的情况证明它不是)

b if a else c

所以:

a = [1,5,2,4]

def func1(li,func2):
    for x,el in enumerate(li):
        li[x] = func2(el)

func1(a,lambda x: 0 if x>3 else x)
print a

备注:

  • 给用户对象起名为list不太好

  • 使用iterate()函数

顺便问一下,你有没有注意到你在一个函数里改变了一个函数外部的对象的值?

u = 102

def f(x):
    x = 90

print "u==",u

结果

u== 102

在你的代码中,a被改变了,因为它是一个可变对象

通常情况下,函数会有一个返回值。你的函数没有返回值,因为你改变了一个可变对象。

2

在编程中,布尔值就是“真”和“假”的意思。这里有两个例子:

当你把0放进布尔值的判断里,结果是False,也就是“假”。

而当你把10放进去,结果是True,也就是“真”。

4

你遇到的问题是,0 被当作 False 来处理,这就导致你用“与-或”技巧作为条件表达式时失败了。

Python 2.5 引入了“正式的”条件表达式,格式如下:

x = true_value if condition else false_value

所以你可以把:

lambda x: x>3 and 0 or x

替换为:

lambda x: 0 if x > 3 else x

另外,如果你不在意直接更新列表的话,可以使用这个 map 函数来替代 func1

a = map(lambda x: 0 if x > 3 else x,a)
print a

如果你想要直接修改列表,可以使用这个 enumerate 函数来让你的代码更简单一些:

def func1(list,func2):
    for i,x in enumerate(list):
        list[i] = func2(x)

撰写回答