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)