我怎么能省略python条件循环中的冗余单词

时间:2014-01-16 04:47:39

标签: python loops

我正在使用此功能

    obj = myotherobj if obj is None else obj

我看到单词obj被使用了三次。有没有办法用obj只出现一次来编写该函数

4 个答案:

答案 0 :(得分:3)

将其归结为令牌obj的1个实例很难,但有很多有趣的方法可以将其减少到2个实例。

根据obj的{​​{3}},您可以执行此操作:

obj = obj or myotherobj

例如:

>>> obj = []
>>> obj = obj or 9000
>>> obj
9000
>>> obj = None
>>> obj = obj or True
>>> obj
True

或者,如果它是re​​turn语句的一部分,您可以将其剪切为一个obj

return obj or otherobj

例如:

>>> def foo(x):
...  return x or 8
...
>>> foo(4)
4
>>> foo([])
8
>>> foo(0)
8

为了获得额外的乐趣,如果这是一个truthiness,您可以使用数组索引和布尔值来做一些很酷的事情(但这不会减少obj个令牌的数量:

>>> obj=None
>>> obj=[obj,9000][obj is None]  
>>> obj
9000

只是为了好玩,超级荒谬:

>>> obj = None
>>> obj = (obj,[1,2,3])[::cmp(bool(obj),0.5)]
>>> obj
[1, 2, 3]
>>> obj = True
>>> obj = (obj,[1,2,3])[::cmp(bool(obj),0.5)]
>>> obj
True

但是,对于任何合理的生产代码,通常都不推荐以上任何一种。

答案 1 :(得分:1)

if obj is None:
    obj = myotherobj

由于Python中没有null-coalescing运算符,因此可能是最好的2次出现。

答案 2 :(得分:0)

你可以把它减少到两个:

if obj is None:
    obj = myotherobj

请注意,如果不是“无”,则不需要将obj分配给任何内容,因为在您的示例中,obj显然已经设置为您希望它在那种情况下。< / p>

答案 3 :(得分:0)

更好的方法是

obj = myotherobj if not obj else obj

在python 本身暗示错误时,无需检查“如果obj为无”