2012-01-27 69 views

回答

6

这不起作用,因为在调用all之前评估列表(即其所有项目)。在这种特殊情况下,你最好的选择是这样的:

return x != 0 and 10/x == 2 and True and False and 7 

我假设你已经知道这一点,所以我会为你提供另一种,如果列表项目没有硬编码的是还可以应用于更广泛的解决方案:

return all(f() for f in [lambda: x != 0, lambda: 10/x == 2, 
         lambda: True, lambda: False, lambda: 7]) 

这样表达式只能在短路all内进行评估。

1

是的。如果您希望它对于x == 0为假:

all([x != 0, x!=0 and 10/x == 2, True, False, 7]) 

只是确保每个值都允许为任何值x。

3

这不会像你想像的那样工作,因为Python在将结果值传递给函数之前会评估其所有函数参数。换句话说,在调用all之前,它将10/x == 2评估为单个值。 (与Mathematica相反,它将通过未评估的条件10/x == 2,并且将完全按照您的要求执行)。

最简单的事情要做,因为您知道您要将此列表传递给all,只需使用Python的and运营商的短路能力:

return all([x != 0 and 10/x == 2, True, False, 7]) 

或者,您也可以重写的数学条件,使其不除以零,

return all([x != 0, 10 == 2 * x, True, False, 7]) 

(注意FLOA定点划分问题)。

如果你真的想模仿Mathematica传递未评估条件的行为,但是我能想到的唯一方法就是传递一个可调用的对象,它在你调用它时评估条件。例如,你可以在你所有的列表元素转换为lambda函数:

return all(f() for f in [lambda: x != 0, lambda: 10/x == 2, 
        lambda: True, lambda: False, lambda: 7]) 

如果你不想一切都转化为功能,我想你能想出某种包装的只会调用事情实际上是调用:

return all(f() if callable(f) else f in [x != 0, lambda: 10/x == 2, 
                True, False, 7]) 

但说实话,这似乎是一个烂摊子(除非你是用Python写:-P一个CAS)。

+2

在第二个例子尼斯把戏:) – 2012-01-27 22:57:12

6

如果你的代码是在一个发电机,那么你也可以短路的东西是这样的:

def test(x): 
    yield x != 0 
    yield 10/x == 2 
    yield True 
    yield False 
    yield 7 

all(test(9))