在这种情况下如何避免多次编写类似的代码?

How to avoid write similar code multiple times in this situation?

我有这样的代码,

i = 0
l1 = ['a','b','c']
while(i < len(l1)):
    if i + 2 < len(l1):
        if  l1[i + 2] == 'c':
            print("ok")
        else:
            print("None,Error!")
    else:
        print("None,Error!")
    i += 1 

可以看到,在else部分,print("None,Error!")用了两次。实际上,它们很长但完全相同,所以我想合并它们使它们成为 simple.However,我需要检查 i+2 是否超出列表范围,所以我不能将其重写为 [=15] =]

if i+2 < len(l1) and l1[i + 2] == 'c':

有什么办法可以解决这个问题吗?

正如 Phu Ngo 所说,我们可以利用 short circuiting 来写

i = 0
l1 = ['a','b','c']
while(i < len(l1)):
    if i + 2 < len(l1) and l1[i + 2]=='c':
        print("ok")
    else:
        print("None,Error!")
    i+=1

如果 i+2<len(l1) 为假,则表达式 l1[i + 2]=='c' 永远不会被计算,这意味着不会引发错误。

这里可以考虑的另一种解决方案是 try/except 子句。

i = 0
l1 = ['a','b','c']
while(i < len(l1)):
    try:
        if l1[i+2]=='c':
            print("ok")
        else:
            raise ValueError
    except Exception:
        print("None,Error!")
    i+=1

两者都会打印输出

ok
None,Error!
None,Error!

除非你的数据很大,否则放弃算法细节,只 以方便的方式排列数据:

xs = ['a', 'b', 'c']

for x1, x2 in zip(xs, xs[2:] + [None, None]):
    print("ok" if x2 == 'c' else "None,Error!")

一般观点的另一个例证:很少见 需要通过索引遍历集合。