使用lambda进行Python列表理解

时间:2014-08-13 21:11:18

标签: python lambda list-comprehension

有人可以向我解释

  1. 为什么a是True / False列表,而b是lambdas列表?

  2. 为什么该规则不适用于cd

  3. 代码:

    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)]
    

    提前谢谢。

2 个答案:

答案 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)]

它应该按预期工作