Python if / else错误

时间:2018-06-29 12:32:10

标签: python optimization syntax

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

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

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

错误:


回溯(最近通话最近):   文件“ main.py”,第1行,在     从解决方案导入*   文件“ /home/codewarrior/solution.py”,第5行     return(s [int(len(s)/ 2)])如果(len(s)%2 == 1)否则(return(s [int(len(s)/ 2)-1] + s [int( len(s)/ 2)]))                                                            ^ SyntaxError:语法无效

也: 这主要是因为我很好奇。我了解在实际的应用程序中,这段代码很难解释。

8 个答案:

答案 0 :(得分:1)

这样做:

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

答案 1 :(得分:1)

您不能再次调用return关键字,因为您已经在if和else的开始处有了返回值。

执行此操作:

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

也是

那条线是非常不清楚的,也许您应该坚持常规的if and else语句,因为一个月后您可能不会再做任何事情了。

答案 2 :(得分:1)

我不确定这样减少行数会给您带来什么好处。更好的方法是使用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]

答案 3 :(得分:1)

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

但是,最好不要缩短每个功能。可读性很重要。

答案 4 :(得分:0)

您不需要第二次退货:

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

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

答案 5 :(得分:0)

返回本身应包含if-else块

在这里,如果len(s)%2 == 1,则if-else块为(s [int(len(s)/ 2)-1)否则s [int(len(s)/ 2)-1] + s [int(len(s)/ 2)])。因此,您应该写:

return((s [int(len(s)/ 2)])如果len(s)%2 == 1否则(s [int(len(s)/ 2)-1] + s [int( len(s)/ 2)]))。

我对此进行了测试,它可以正常工作。

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

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