我不知道单行是否可行——甚至是一个好主意——但让我们进行一些重构,看看我们能做些什么。每当您盯着一大段代码并想知道如何使它变得更好时,不要指望解决方案会突然出现在您面前。最好的方法是慢慢重构,一次只做一个小改动。一点一点让它变得更好,直到你用完需要改进的东西。
首先,让我们重新组织一下。 z=1 只需要在 if 块内,所以我们将把它移到那里。
def preveri_zaporedje(besede):
if ni_ponavljanj(besede):
z=1
while z<len(besede):
if lahko_sledi(besede[z-1],besede[z]):
z+=1
else:
return False
else:
return False
return True
我们可以反转if 语句并在它失败时提前退出。这会降低缩进的级别。
def preveri_zaporedje(besede):
if not ni_ponavljanj(besede):
return False
z=1
while z<len(besede):
if lahko_sledi(besede[z-1],besede[z]):
z+=1
else:
return False
return True
让我们用基于范围的循环替换 z 的手动循环。那会更 Pythonic。
def preveri_zaporedje(besede):
if not ni_ponavljanj(besede):
return False
for z in range(1, len(besede)):
if lahko_sledi(besede[z-1],besede[z]):
pass
else:
return False
return True
然后我们可以应用与以前相同的 invert-the-if 技巧。
def preveri_zaporedje(besede):
if not ni_ponavljanj(besede):
return False
for z in range(1, len(besede)):
if not lahko_sledi(besede[z-1],besede[z]):
return False
return True
现在有点棘手。代码正在循环输入列表中的元素对。有一个clever way to loop over pairs using zip 可以让我们摆脱@987654332@ 变量。详情见链接。
def preveri_zaporedje(besede):
if not ni_ponavljanj(besede):
return False
for a, b in zip(besede[:-1], besede[1:]):
if not lahko_sledi(a, b):
return False
return True
这种模式看起来很熟悉。它正在检查是否有任何对项目未能通过lahko_sledi 测试。让我们明确地进行 any 测试,嗯?
def preveri_zaporedje(besede):
if not ni_ponavljanj(besede):
return False
if any(not lahko_sledi(a, b) for a, b in zip(besede[:-1], besede[1:]))
return False
return True
这可以浓缩为:
def preveri_zaporedje(besede):
if not ni_ponavljanj(besede):
return False
return not any(not lahko_sledi(a, b) for a, b in zip(besede[:-1], besede[1:]))
现在我们正在取得进展!
还有一个棘手的问题。如果你记得你的first-order logic,那么你会记得any(not P) 与not all(P) 相同:
def preveri_zaporedje(besede):
if not ni_ponavljanj(besede):
return False
return not not all(lahko_sledi(a, b) for a, b in zip(besede[:-1], besede[1:]))
取消双重nots:
def preveri_zaporedje(besede):
if not ni_ponavljanj(besede):
return False
return all(lahko_sledi(a, b) for a, b in zip(besede[:-1], besede[1:]))
最后,我们可以将第一个测试添加到结果中。我们去吧!一行。
def preveri_zaporedje(besede):
return ni_ponavljanj(besede) and all(lahko_sledi(a, b) for a, b in zip(besede[:-1], besede[1:]))
那怎么样,这是可能的。
这是个好主意吗?我想这由你决定。可读性是一种判断。更短并不总是更好。这是逐步重构的另一个好理由:您可能会发现其中一个步骤实际上比最终结果更具可读性。