Python 在if语句中赋值

Python 在if语句中赋值,python,if-statement,assign,Python,If Statement,Assign,有比这更简单的选择吗 res = returns_value_or_none(arg) if res: do_something_with(res) 或 将赋值和if条件组合成一个语句的语句?通常,您拥有的已经是最好的选择 您始终可以创建一个新范围,将值绑定到变量: (lambda res: do_something_with(res) if res else None)(returns_value_or_none(arg)) 但这肯定不会更具可读性,也不会更具Python风格

有比这更简单的选择吗

res = returns_value_or_none(arg)
if res:
    do_something_with(res)


将赋值和
if
条件组合成一个语句的语句?

通常,您拥有的已经是最好的选择


您始终可以创建一个新范围,将值绑定到变量:

(lambda res: do_something_with(res) if res else None)(returns_value_or_none(arg))
但这肯定不会更具可读性,也不会更具Python风格


如果只想保存一行,可以执行以下操作:

res = returns_value_or_none(arg)
if res: do_something_with(res)
这有时更具可读性,但通常是净损失


另一种处理方法是将
do\u something\u与
更改为接受
None
而不做任何事情。这在Python中不像在Smalltalk或Swift中那样常见,但有时它肯定有自己的位置

很难理解为什么会有这样一个玩具示例,但是如果你调用这些函数70次,将支票放在函数内部的一个地方,而不是放在它调用的任何地方的70个地方,这显然是一个胜利。(特别是因为你可能会把它放在68个地方,而忘记了另外2个。)


最后,但并非最不重要的是,在许多情况下,正确的答案是例外。如果通过
None
,则您的
使用
做某事可能已经引发。当然,您可以将
返回值或无
更改为
返回值或无

同样,在这个玩具示例中,它看起来更像代码。但在实际代码中,将一整段代码放在
try
/
中是有意义的,除了
,然后在最后一次处理所有错误。甚至让异常渗透到更高的层次,更容易处理


当然,这并不适用于所有情况;如果您希望
None
是一个频繁且完全合理的响应,并且只想跳过一步而不是中止整个操作链,那么检查或通过
None
比用小
try
块乱丢代码更有意义。

第一种方法很好。如果res为None,请确保使用
如果返回的值可以是其他一些有效但错误的值(例如空字符串)。这里真正要查找的是C样式
如果res=spam():
如果(ch=getch())!=EOF:
,Python没有这个功能。Python对此有很好的理由;斯威夫特对此有不同的理由;如果你正在设计一种新的语言,如果没有其他令人信服的理由,那么节省一行或5个字符可能是值得的,但你可能有其他令人信服的理由。谢谢,我想我对一些语法糖很乐观。允许被调用函数采用None的问题在于,在其他上下文中,如果没有接收到任何或其他无效类型,我希望同一个函数引发错误。另外,在大多数情况下,它类似于
if re.match(一些模式,文本):do\u something(一些模式,文本).group(1))
。如果忘记If条件,并且re.match()返回None,解释器会很快通知我。@Peter:通常让解释器通知你没有什么错(无论“你”表示代码中的<<代码>,除了处理程序,或者程序员没有考虑值可能是<代码>没有< /代码>,因此没有对它进行编码。@彼得:如果你只给我们展示一个无意义的玩具例子,你只会得到。“这里有六种做类似事情的方法;真正的代码中哪一个是合适的取决于真正的代码“如果您向我们展示几个真实的示例,我们可以向您展示处理这些示例的惯用方法。
res = returns_value_or_none(arg)
if res: do_something_with(res)