我想将此多行函数转换为单行。
NULL
答案 0 :(得分:2)
我不知道一行是否可行,甚至是一个好主意,但让我们进行一些重构,看看我们能做什么。每当您盯着一大堆代码并想知道如何使其变得更好时,不要指望该解决方案会在您的洞察力中突然出现。最好的方法是缓慢地重构它,一次只做一个小改动。只是一点一点地使它变得更好,直到用尽所有需要改进的地方为止。
首先,让我们重新整理一下。 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
然后,我们可以应用与以前相同的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
可以让我们摆脱z
变量。有关详细信息,请参见链接。
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
此模式看起来很熟悉。它正在检查项目对中的 any 是否未通过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:]))
取消两个not
:
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:]))
那怎么可能, 。
这是个好主意吗?我想这是您决定的。可读性是一种判断力。更短并不总是更好。这是逐步重构的另一个很好的理由:您可能会发现其中的一个步骤实际上比最终结果更具可读性。
答案 1 :(得分:0)
好吧,我敢肯定您可以不用一行来重写函数,但是它将更具可读性。这是一行实现:
def preveri_zaporedje(besede):
return True if ni_ponavljanj(besede) and len([z for z in range(len(besede)) if lahko_sledi(besede[z-1],besede[z])]) + 1 == len(besede) else False