在与 return 语句相同的行上使用 if/else

Using if/else on the same line with return statement

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

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(s[int(len(s)/2)]) if len(s)%2 == 1 else (s[int(len(s)/2)-1] + s[int(len(s)/2)])

你不需要第二个 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 与您在其他语言中可以找到的三元运算符相同,您可以使用它来影响变量

您不能再次调用 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 语句,因为一个月后你可能不会理解任何事情。

我不确定您认为这样减少行数有什么好处。更好的方法是使用 divmod 函数重构索引计算,然后使用条件表达式计算 return 值。

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]

Return 应该在 自身中包含 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)])).

我测试了这个,它有效。

您可以使用非常长且难以阅读的 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)]))

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

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

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

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

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])