2

我发现 python 可以很容易地以“lisp”风格进行编码。

经验:

正常方式:

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 也没有定义哪个更符合规则。

4

3 回答 3

7

确实

if a: 
    do_something()

第二个(a and do_somthing()))是可怕的和hacky。正如@limelights 所说,The Zen of Python 说Explicit 比implicit和readability counts更好。如果你还没有 读过PEP-8 ,你可能应该读一下。

于 2013-04-02T08:22:14.787 回答
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语法:

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

但是,在您的情况下,您不需要结果,您应该避免这样做,并更好地将语句语法与:.

于 2013-04-02T08:40:49.820 回答
2

如果通过“函数方式”你的意思是“这看起来有点像 LISP”,当然,你已经用括号括住你的代码并删除了冒号。但这并不能使它成为一种“函数式”编程风格,就像它使括号内的语句成为一个列表一样。本质上,您正在利用逻辑运算符的短路特性使您的代码更难阅读。

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

于 2013-04-02T08:33:36.620 回答