Lambda函数与0
我想写一个函数,用一个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)