如何在IF条件中分配一个变量,然后返回它?
在Python中,无法在if条件语句中直接进行变量赋值操作。这是因为在Python中,赋值操作(fruit = isBig(y))是一个语句,而不是一个表达式。相比之下,在C、C++、Perl和许多其他语言中,赋值操作是一个表达式,可以在if语句或while循环等语句中使用。然而,Python的创建者认为这种用法容易被滥用,因此禁止了在if条件语句中进行赋值操作。
此外,你的示例代码有些荒谬。由于只有空字符串("")是False,所以isBig()函数始终会返回True,因此你的if语句在这种情况下是没有意义的。我猜这只是你尝试的一个简化版本。你可以这样修改代码:
tmp = isBig(y)
if tmp: return tmp
这样做真的有那么糟糕吗?谢谢。顺便说一句,如果你有100个类似的代码,这样做就会变得更糟糕了。
当你有100行类似的代码时,听起来你的解决方案可能不够优化,但我不知道你具体在做什么才能下结论。
至少,将你的测试用例放入一个列表中,并进行迭代,以避免将它们全部写出来。
如果是elif条件语句呢?
我希望elif条件语句的行为与if条件语句相同。
真的会更糟吗?在一系列的elif条件语句中,这样做会使代码的流程有些混乱。因此,在3.8版本中,elif条件语句在检查复杂的条件并需要进行函数调用时,希望能够将结果传递给elif块的主体部分。
在上述内容中,作者提到了一个旧的“assign and set”烹饪食谱,主要是为了方便在Python和直接支持在if或while语句中进行赋值的语言之间进行转换。但是,如果有一连串的这种检查和返回操作,最好采用完全不同的方法。作者提出了两种替代方案:一种是使用for循环来逐个检查条件并返回结果,另一种是使用生成器表达式来返回满足条件的结果。作者还提到,使用"Holder"技巧(将变量赋值给一个对象的属性,然后在if语句中返回该属性的值)往往不是一个Pythonic的方法,建议寻找更合适的Pythonic方法。作者指出,只有在特定情况下才适合使用"Holder"技巧,即希望保持Python代码与非Python代码之间的紧密对应关系的情况下,例如将参考算法从Python转译为其他语言,或者将Python作为原型编写,一旦有效工作后再转译为C++、C#、Java等其他语言。基于以上分析,可以得出以下结论:
问题的原因:原问题是出于对在if条件中赋值变量然后返回的需求,但是在Python中这种做法不是一种Pythonic的方法,而是一种设计上的不良味道。
解决方法:根据作者的建议,可以采用以下两种替代方案来解决该问题:
1. 使用for循环逐个检查条件并返回结果。
hundreds = isBig, isSmall, isJuicy, isBlah, ... for predicate in hundreds: result = predicate(y) if result: return result
2. 使用生成器表达式返回满足条件的结果。
return next(x for x in (f(y) for f in hundreds) if x)
如果允许在没有满足条件的情况下抛出StopIteration异常,可以使用以上代码。如果希望在没有满足条件的情况下返回None,则可以使用以下代码:
return next((x for x in (f(y) for f in hundreds) if x), None)
以上是对于如何在if条件中赋值变量然后返回的问题的原因和解决方法的整理。作者指出,在Python中使用"Holder"技巧(将变量赋值给一个对象的属性,然后在if语句中返回该属性的值)往往不是一种Pythonic的方法,建议寻找更合适的Pythonic方法来解决问题。
在Python 3.8中引入了分配表达式(PEP 572)(:=运算符),可以将条件值(isBig(y))捕获为一个变量(x),以便在条件体中重新使用它。因此,我们可以使用以下代码来在IF条件中分配一个变量并返回它:
if x := isBig(y): return x
在之前的Python版本中,我们无法在IF条件中直接分配变量。这可能导致代码的可读性和简洁性下降,因为我们需要在IF条件之外创建一个临时变量来存储条件值,然后再在条件体内使用它。
然而,从Python 3.8开始,PEP 572引入了分配表达式,可以在IF条件中直接分配变量。这极大地提高了代码的可读性和简洁性,因为我们可以将分配和条件检查结合在一起,避免了临时变量的创建。
在上面的代码中,我们首先调用函数isBig(y)来获取一个条件值。然后,使用分配表达式将该值分配给变量x。最后,我们在条件体内使用变量x进行进一步的操作。
这种方式的好处是我们不再需要在IF条件之外创建一个临时变量来存储条件值。同时,代码的可读性也得到了提高,因为我们可以将条件检查和变量分配放在一起,更加清晰地表达我们的意图。
总结起来,通过使用分配表达式(PEP 572),我们可以在IF条件中直接分配变量,避免了临时变量的创建,提高了代码的可读性和简洁性。这是Python 3.8以及更新版本中的一个重要特性。