表达式或声明?:'如果a:do_something()'或'(a和do_somthing())'哪个更好?

时间:2013-04-02 08:20:29

标签: python coding-style expression

我发现python可以轻松编写'lisp'样式。

EXP:

正常方式:

if a:
    do_something()

'功能'方式:

(a and do_something())

正常方式:

if not a:
    do_somthing()
elif b:
    do_otherthing()

'功能'方式

((not a and do_something()) or (b and do_otherthing()))

正常方式:

a = bla.get_a()
if a is None:
    a = A()

'功能'方式:

a = (bla.get_a() or A())

这个功能非常吸引人,我可以在一行编码,必须以正常的方式写入几行。

但我不知道它是'pythonic'还是比平常更糟糕。

google coding stype也没有定义哪个更符合规则。

3 个答案:

答案 0 :(得分:7)

绝对

if a: 
    do_something()

第二个(a and do_somthing()))是可怕的和hacky。正如@limelights所说,Python的Zen说 Explicit比隐式可读性计数更好。如果你还没有,你应该阅读PEP-8

答案 1 :(得分:3)

((not a and do_something()) or (b and do_otherthing()))

不同
if not a:
    do_somthing()
elif b:
    do_otherthing()

以下列方式:

如果do_something()返回false值,则第二个表达式(b and do_otherthing())也会被评估。

这样工作的表达式应该使用Python 2.5中引入的b if a else c syntax

do_somethind() if not a else (b and do_otherthing())

但是,在您的情况下,您不需要结果,您应该避免这样做,并且最好使用:的语句语法。

答案 2 :(得分:2)

如果用“函数方式”表示“这看起来有点像LISP”,当然,你已经用括号包围了你的代码并删除了冒号。但这并不会使它成为一种“功能性”编程风格,而不是使括号语句成为一个列表。从本质上讲,你正在利用逻辑运算符的短路属性来使你的代码更难阅读。

此外,第二个示例中的代码示例实际上在逻辑上并不相同。如果a为false且do_something()返回false值(包括None,则在没有显式return语句时自动返回值),则or将不会实际上是短路,如果b为真,那么do_otherthing()也将被执行。