有人可以向我解释
为什么a
是True / False列表,而b
是lambdas列表?
为什么该规则不适用于c
和d
?
代码:
foo = (lambda a, b: a >= b) if False else (lambda a, b: a <= b)
a = [foo(x, x+1) for x in xrange(10)]
foo = lambda a, b: a >= b if False else lambda a, b: a <= b
b = [foo(x, x+1) for x in xrange(10)]
bar = (lambda a, b: a*b*10) if False else (lambda a, b: a*b*100)
c = [bar(x, x+1) for x in xrange(10)]
bar = lambda a, b: a*b*10 if False else lambda a, b: a*b*100
d = [bar(x, x+1) for x in xrange(10)]
提前谢谢。
答案 0 :(得分:4)
这只是运营商优先的问题。让我们放一些括号来说明如何解析语句:
(a) foo = (lambda a, b: a >= b) if True else (lambda a, b: a <= b)
(b) foo = lambda a, b: (a >= b if descending else lambda a, b: a <= b)
当评估(b)降序恰好为假时,所有元素都变为lambda a, b: a <= b
答案 1 :(得分:1)
foo = lambda a, b: a >= b if descending else lambda a, b: a <= b
b = [foo(x, x+1) for x in xrange(10)]
可以改写为
foo = lambda a, b: (a >= b if descending else lambda a, b: a <= b)
b = [foo(x, x+1) for x in xrange(10)]
如果LHS被评估为,那么如果它正在下降就可以了
foo = lambda a,b: a >= b #does what you would expet
但如果不是你得到
foo = lambda a,b: lambda a,b:a<=b
显然返回lambda而不是值
您可以将其更改为
foo = lambda a, b: a >= b if descending else a <= b
b = [foo(x, x+1) for x in xrange(10)]
它应该按预期工作