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.5
,cand2
将是3.33
,因此A[0]
将更新为2.5
,依此类推
除了(A[i] + A[i + 1] + A[i + 2]) / 3
是0
时,此代码可以工作。在这种情况下,执行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)