我发现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也没有定义哪个更符合规则。
答案 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()
也将被执行。