Python:对所有/任何代码的评估与拼写 让我们考虑两种方法来检验所有条件是否成立:

Python:对所有/任何代码的评估与拼写 让我们考虑两种方法来检验所有条件是否成立:,python,performance,if-statement,logic,Python,Performance,If Statement,Logic,选择1 if all([cond1, cond2, cond3]): return true 选择2 if (cond1 and cond2 and cond3): return true 两者的评估方法是否相同?AFAIR表示只要一条语句失败,所有都将失败,这使得条件可以假定先前列出的所有条件的计算结果均为真。例如,在选项1中安全地访问cond3中以前(在cond1或cond2中)测试为可访问的变量。这是否也适用于选项2?此外,是否存在性能差异?选项1有额外的性能开销,需要创建一个

选择1

if all([cond1, cond2, cond3]):
  return true
选择2

if (cond1 and cond2 and cond3):
  return true

两者的评估方法是否相同?AFAIR表示只要一条语句失败,
所有
都将失败,这使得条件可以假定先前列出的所有条件的计算结果均为
。例如,在选项1中安全地访问
cond3
中以前(在
cond1
cond2
中)测试为可访问的变量。这是否也适用于选项2?此外,是否存在性能差异?

选项1有额外的性能开销,需要创建一个列表,然后遍历该列表。还有一个问题是,在检查真实性之前,必须计算
all()
中使用的iterable中的每个条件

@StefanPochmann的一个很好的例子证明了出现的问题:

a = [3, 1, 4, 1, 5, 9]

if a and a[0] > 5:
    pass

if all((a, a[0] > 5)):
    pass

a = []

if a and a[0] > 5:
    pass

if all((a, a[0] > 5)):
    pass

Traceback (most recent call last):
  File "/tmp/execpad-b1260aab7279/source-b1260aab7279", line 14, in <module>
    if all((a, a[0] > 5)):
IndexError: list index out of range
a=[3,1,4,1,5,9]
如果a和a[0]>5:
通过
如果全部((a,a[0]>5)):
通过
a=[]
如果a和a[0]>5:
通过
如果全部((a,a[0]>5)):
通过
回溯(最近一次呼叫最后一次):
文件“/tmp/execpad-b1260aab7279/source-b1260aab7279”,第14行,在
如果全部((a,a[0]>5)):
索引器:列表索引超出范围
您可以看到代码段正在运行

使用选项2是更好的选择,除非您实际上正在验证布尔值列表。如上所示,使用
操作符可以防止检查第一个失败的contactions之后的contactions


除了性能原因外,如果在条件之间使用
运算符,代码更易于阅读。在编辑器中使用正确的语法hilighting,将非常清楚发生了什么。

选项1有额外的性能开销,需要创建一个列表,然后在列表上迭代。还有一个问题是,在检查真实性之前,必须计算
all()
中使用的iterable中的每个条件

@StefanPochmann的一个很好的例子证明了出现的问题:

a = [3, 1, 4, 1, 5, 9]

if a and a[0] > 5:
    pass

if all((a, a[0] > 5)):
    pass

a = []

if a and a[0] > 5:
    pass

if all((a, a[0] > 5)):
    pass

Traceback (most recent call last):
  File "/tmp/execpad-b1260aab7279/source-b1260aab7279", line 14, in <module>
    if all((a, a[0] > 5)):
IndexError: list index out of range
a=[3,1,4,1,5,9]
如果a和a[0]>5:
通过
如果全部((a,a[0]>5)):
通过
a=[]
如果a和a[0]>5:
通过
如果全部((a,a[0]>5)):
通过
回溯(最近一次呼叫最后一次):
文件“/tmp/execpad-b1260aab7279/source-b1260aab7279”,第14行,在
如果全部((a,a[0]>5)):
索引器:列表索引超出范围
您可以看到代码段正在运行

使用选项2是更好的选择,除非您实际上正在验证布尔值列表。如上所示,使用
操作符可以防止检查第一个失败的contactions之后的contactions


除了性能原因外,如果在条件之间使用
运算符,代码更易于阅读。在编辑器中使用正确的语法hilighting,将非常清楚发生了什么。

和运算符也短路,因此如果
cond1
失败,它将不会打扰计算
cond2
,和
cond3
。谢谢!性能如何?和操作员也短路,因此如果
cond1
失败,则不会影响评估
cond2
cond3
。谢谢!性能如何?