【问题标题】:Using if/else on the same line with return statement在与 return 语句相同的行上使用 if/else
【发布时间】:2018-12-08 15:42:41
【问题描述】:

我试图通过将我的条件语句放在一行来压缩我的代码。

def get_middle(s):
    if len(s)%2 == 1: return(s[int(len(s)/2)]) 
    else: return(s[int(len(s)/2)-1] + s[int(len(s)/2)])

这很好用。 我试着这样做:

return(s[int(len(s)/2)]) if len(s)%2 == 1 else return(s[int(len(s)/2)-1] + s[int(len(s)/2)])

但我在该行的末尾遇到了语法错误。

错误:

Traceback (most recent call last):
  File "main.py", line 1, in <module>
    from solution import *
  File "/home/codewarrior/solution.py", line 5
    return(s[int(len(s)/2)]) if (len(s)%2 == 1) else (return(s[int(len(s)/2)-1] + s[int(len(s)/2)]))
                                                           ^
SyntaxError: invalid syntax

还有: 这主要是因为我很好奇。我知道在实际应用程序中,这段代码很难解释。

【问题讨论】:

  • 您不能在表达式中包含 return 关键字。你为什么要把这一切都放在一条线上?没有人看过这段代码会知道它做了什么。
  • 您的“压缩”代码非常难以阅读。为什么要单排?分散到多行,看起来很棒。
  • 顺便说一句,你说的“工作得很好”的代码不应该。至少不是你用无效缩进向我们展示它的方式。对于大多数语言来说,缩进对于阅读代码的人来说是件好事,但在 Python 的情况下,它实际上对于代码编译时没有错误非常重要。在这里发布代码时,请复制粘贴,不要重写。重写代码可能会导致错误,让我们感到困惑或认为这是真正的错误。
  • @Someprogrammerdude 这个缩进运行得很好,但我知道你的意思。
  • @DillonDavis 我正在考虑def get_middle(s): 部分。是的,可以在一行中编写整个函数,但在代码中却不是。

标签: python syntax return conditional-operator


【解决方案1】:

您不能再次调用 return 关键字,因为您已经在 if 和 else 的开头有 return。

改为这样做:

return(s[int(len(s)/2)]) if len(s)%2 == 1 else (s[int(len(s)/2)-1] + s[int(len(s)/2)])

还有,

那条线超级不清楚,也许你应该坚持常规的 if 和 else 语句,因为一个月后你可能不会明白任何事情。

【讨论】:

    【解决方案2】:

    这样做:

    return(s[int(len(s)/2)]) if len(s)%2 == 1 else (s[int(len(s)/2)-1] + s[int(len(s)/2)])
    

    【讨论】:

      【解决方案3】:

      我不确定这样减少行数会给您带来什么好处。更好的是使用divmod 函数重构索引计算,然后使用条件表达式计算返回值。

      def get_middle(s):
          middle, r = divmod(len(s), 2)
          return s[middle] + (s[middle - 1] if r == 0 else 0)
      

      是否要使用条件表达式代替普通的if 语句,见仁见智:

      if r == 1:
          return s[middle]
      else:
          return s[middle] + s[middle - 1]
      

      【讨论】:

      • s[middle - 1] if r == 1 else 0 是相反的。应该是s[middle - 1] if r == 0 else 0
      【解决方案4】:

      您可以使用非常长且难以阅读的 lambda 函数:

      get_middle = (lambda s: (s[int(len(s)/2)]) if len(s)%2 == 1 else (s[int(len(s)/2)-1] + s[int(len(s)/2)]))
      

      但是,最好不要在缩短每个函数时找到目标。可读性很重要。

      【讨论】:

        【解决方案5】:

        返回应该有 if-else 块本身。

        这里,if-else 块是(s[int(len(s)/2)]) if len(s)%2 == 1 else s[int(len(s)/2)-1] + s[int(len(s)/2)])。所以,你应该写:

        return((s[int(len(s)/2)]) if len(s)%2 == 1 else (s[int(len(s)/2)-1] + s[int(len(s)/2)])).
        

        我测试了这个,它有效。

        【讨论】:

          【解决方案6】:

          您不需要第二次返回:

          return s[int(len(s)/2)] if len(s)%2 == 1 else s[int(len(s)/2)-1] + s[int(len(s)/2)]
          

          内联 if else 与其他语言中的三元运算符相同,可以使用它来影响变量

          【讨论】:

            【解决方案7】:

            一种方法使用切片并从两个方向获取中间:

            def get_middle(s):
                return s[(len(s) - 1)/2 : -((len(s) - 1)/2)]
            

            【讨论】:

              【解决方案8】:

              如果您正在寻找半可读的解决方案,请尝试:

              def get_middle(s): return sum(s) if len(s) < 3 else get_middle(s[1:-1])
              

              否则,如果您正在打高尔夫球或其他什么,请尝试以下操作:

              get_middle=lambda s:2<len(s)and get_middle(s[1:-1])or sum(s)
              

              或者

              get_middle=lambda s:sum(s[len(s)-1>>1:][:2-len(s)%2])
              

              【讨论】:

                猜你喜欢
                • 2017-02-05
                • 1970-01-01
                • 1970-01-01
                • 2019-02-25
                • 1970-01-01
                • 1970-01-01
                • 2011-10-11
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多