有没有办法在Python中短路一个all()语句?在Python中短路全部()语句
因此,像这样:
return all([x != 0, 10/x == 2, True, False, 7])
不会,如果x为0返回一个错误?
有没有办法在Python中短路一个all()语句?在Python中短路全部()语句
因此,像这样:
return all([x != 0, 10/x == 2, True, False, 7])
不会,如果x为0返回一个错误?
这不起作用,因为在调用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
内进行评估。
是的。如果您希望它对于x == 0为假:
all([x != 0, x!=0 and 10/x == 2, True, False, 7])
只是确保每个值都允许为任何值x。
这不会像你想像的那样工作,因为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)。
如果你的代码是在一个发电机,那么你也可以短路的东西是这样的:
def test(x):
yield x != 0
yield 10/x == 2
yield True
yield False
yield 7
all(test(9))
在第二个例子尼斯把戏:) – 2012-01-27 22:57:12