我试图通过将条件语句放在一行上来压缩代码。
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:语法无效
也: 这主要是因为我很好奇。我了解在实际的应用程序中,这段代码很难解释。
答案 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])