是否可以使用if语句编写单行return语句?

use*_*455 36 python

是可以从python中的单行方法返回

寻找这样的东西

return None if x is None
Run Code Online (Sandbox Code Playgroud)

试过上面,它是无效的语法

我很容易做到:

if x is None:
    return None
Run Code Online (Sandbox Code Playgroud)

但只是好奇我是否可以将上面的if语句组合成一行

Ter*_*ryA 55

是的,它被称为条件表达式:

return None if x is None else something_else
Run Code Online (Sandbox Code Playgroud)

你需要else something一个有条件的工作.

  • 如果缺少显式返回,Python中的函数总是返回隐式None. (5认同)
  • 还记得 PEP 308 之前我们必须用数组模拟三元吗?`返回[False,None][x is None]`?我也……*逃跑* (4认同)
  • 我很确定在其他情况下该功能根本不应该返回. (4认同)
  • 但是,如果x不是"无",那么OP想要返回"False"并不清楚. (2认同)
  • 澄清:该函数不应该在else的情况下从该行*返回*; 它应该继续执行. (2认同)

nak*_*tic 52

可以在一行上写一个标准的"if"语句:

if x is None: return None
Run Code Online (Sandbox Code Playgroud)

但是,pep 8风格指南建议不要这样做:

通常不鼓励使用复合语句(同一行上的多个语句)

  • 我会谦虚地争辩说“如果 EXPR:返回”是一个允许的例外。原因是在调试时,“if EXPR: func()”(根据 pep 8 示例),不清楚是否调用了 func()。但是,当调用“if EXPR: return”时,我们知道 EXPR 为真,因为 return 退出函数。 (3认同)

sma*_*c89 7

您也可以尝试以下list[bool]表达式:

return [value, None][x == None]
Run Code Online (Sandbox Code Playgroud)

现在如果第二个括号计算结果为 true,则返回 None,否则返回您想要返回的值

  • 当三元表达式可能时,这是愚蠢的。在它们存在之前这样做是有意义的,但现在绝对没有理由这样做。 (4认同)
  • +1帮助我意识到你只能在三元表达式中使用“return”运算符一次。`return "Yes" if value == True else "No"` 将在 else 语句中返回“No”。 (3认同)

Ste*_*sop 6

免责声明:实际上不要这样做。如果您真的想要单线,那么就像裸心狂热者所说的,只要打破PEP-8的经验法则即可。但是,它说明了为什么return行为不如您想像的那样,以及事物看起来像您想像的那样行为return

您不能说的原因return None if x is Nonereturn引入了一条语句,而不是表达式。因此,没有办法在其上加上括号(return None) if x is None else (pass),或其他。

可以,我们可以解决这个问题。让我们编写一个ret行为类似的函数,return只是它是一个表达式而不是完整的语句:

class ReturnValue(Exception):
    def __init__(self, value):
        Exception.__init__(self)
        self.value = value

def enable_ret(func):
    def decorated_func(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except ReturnValue as exc:
            return exc.value
    return decorated_func

def ret(value):
    raise ReturnValue(value)

@enable_ret
def testfunc(x):
    ret(None) if x is None else 0
    # in a real use-case there would be more code here
    # ...
    return 1

print testfunc(None)
print testfunc(1)
Run Code Online (Sandbox Code Playgroud)

  • 正如您所说,这绝对不是您应该做的事情,但我认为至少这有点聪明。 (2认同)