如何将函数转换为一行

时间:2019-12-02 11:44:36

标签: python if-statement while-loop

我想将此多行函数转换为单行。

NULL

2 个答案:

答案 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