下面的行实际上像句子一样可读。这样做似乎也很Pythonic,但同样,我对这种语言很了解,只是在寻找风格技巧。
for state in states: score += penalty if state == bad else bonus
这种风格不适合我的工作场所。考虑 PEP8 中的以下代码片段:
复合语句(同一行上的多个语句)是一般不气馁。
是的:
if foo == 'blah': do_blah_thing() do_one() do_two() do_three()
而不是:
if foo == 'blah': do_blah_thing() do_one(); do_two(); do_three()
因此,在您的情况下:
坏:
for state in states: score += penalty if state == bad else bonus
更好:
for state in states:
score += penalty if state == bad else bonus
最好:
for state in states:
if state == bad:
score += penalty
else:
score += bonus
作为设计风格的问题,不一定是编码风格,我宁愿看到特定于状态的分数增量存储在映射对象中,如下所示:
for state in states:
score += scores_per_state[state]
sum
:
score += sum(penalty if state == bad else bonus
for state in states)
正如 Rob 所说,你真的应该参考 Python 的 PEP 标准。 有一个庞大的社区致力于定义在 Python 中编码风格时什么是可以的,什么是不可以的......
python.org/dev/peps/pep-0008
我建议从那里开始。
我对上面的建议,尽管非常简洁和紧凑,但代码最终必须维护。 在你编码的时候,总是假设必须维护你的代码的人将是一个疯狂的斧头杀人犯,他知道你住在哪里。
将行拆分为每行可读行一个操作或函数。 没有人在乎你的代码有多花哨,如果维护起来很痛苦。
IMO,这是糟糕的风格。在"专业环境"中编码的第一个原则是"其他人可以维护我的代码吗?
首先,它违反了 PEP8 中关于在一行上排列代码的几个准则。
其次,它以一种类似于理解的方式组合代码,而不是一个。这是不必要的混乱。
最后,python中的三元风格本质上是倒退的。与其他语言不同,它使用值/条件/值,而不是条件/值/值。除非该表示与代码的实际条件匹配(例如,提供默认值),否则应使用以正确顺序表达要传达的内容的结构:
for state in states:
if state == bad:
score += penalty
else:
score += bonus
if/else 语句的方向可能会颠倒(state != bad
),这取决于代码中涉及多少类型或其他费用。但除此之外,请记住,您正试图让某人(可能是您)在大约 5 年后"修复这个旧废话"的生活更轻松。