在与 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])
我试图通过将我的条件语句放在一行中来压缩我的代码。
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])