Python Shorthand If-0在计算结果中被解释为false


for i in range(0,len(A) - 1): 
cand = (A[i] + A[i + 1]) / 2
cand2 = i + 2 < len(A) and (A[i] + A[i + 1] + A[i + 2]) / 3 or cand
A[i] = min(cand, cand2)

我已经写了上面的代码来计算接下来两个&整数数组的三个元素。例如,如果我们有数组[2,3,5,6],在第一次迭代中,cand将是2.5cand2将是3.33,因此A[0]将更新为2.5,依此类推

除了(A[i] + A[i + 1] + A[i + 2]) / 30时,此代码可以工作。在这种情况下,执行or语句,并将cand2设置为cand

我很确定这是因为Python将0解释为False并执行or语句——但我该如何解决这个问题?

似乎你想做一个三元函数,如果在这里,它会像这样工作:

for i in range(0,len(A) - 1): 
cand = (A[i] + A[i + 1]) / 2
cand2 = (A[i] + A[i + 1] + A[i + 2]) / 3 if i + 2 < len(A) else cand
A[i] = min(cand, cand2)

你用布尔运算符将它们链接起来,这可能会起作用,就像在python中一样,它们会做一些技巧(and链接的表达式会返回链的第一个Falsy值,或者如果所有都是Truthy,则返回最后一个值——or链接的表达式将返回第一个Truthy值,如果所有都为Falsy,则会返回值(,但这会让你的程序更难理解。

无论如何,为了获得最佳可读性,您可能需要考虑在这里使用常规的if构造。

一些潜规则是:

  • if分支应该是最有可能的分支
  • 不要使用嵌套的三元运算符(使用纯多行if…elif>…then…语句(
  • 不要在复杂的表达式中使用长三元运算符(再次使用多行if语句(
for i in range(0,len(A) - 1): 
cand = (A[i] + A[i + 1]) / 2
if i + 2 < len(A):
cand2 = (A[i] + A[i + 1] + A[i + 2]) / 3
else:
cand2 = cand
A[i] = min(cand, cand2)

最新更新