【问题标题】:How to convert a function to one line [closed]如何将函数转换为一行[关闭]
【发布时间】:2020-03-27 00:40:31
【问题描述】:

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

def preveri_zaporedje(besede):
    z=1
    if ni_ponavljanj(besede):
        while z<len(besede):
            if lahko_sledi(besede[z-1],besede[z]):
                z+=1
            else:
                return False
    else:
        return False
    return True

【问题讨论】:

  • 您可以编辑您的问题并添加一些示例(小)输入和预期输出吗?
  • 请添加更多描述。

标签: python if-statement while-loop


【解决方案1】:

好吧,我相信你可以重写你的函数而不是一行,但它会更易读。这是一行实现:

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

【讨论】:

    【解决方案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
    

    然后我们可以应用与以前相同的 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:]))
    

    那怎么样,这可能的。

    这是个好主意吗?我想这由你决定。可读性是一种判断。更短并不总是更好。这是逐步重构的另一个好理由:您可能会发现其中一个步骤实际上比最终结果更具可读性。

    【讨论】:

    • 为什么投反对票?我是不是在什么地方搞砸了?
    猜你喜欢
    • 2020-08-26
    • 2016-03-26
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多