以下几行实际上可以像句子一样阅读。这样做也似乎非常Pythonic,但我再次知道这种语言,只是寻找风格提示。
for state in states: score += penalty if state == bad else bonus
答案 0 :(得分:7)
这种风格在我的工作场所不合适。请考虑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]
答案 1 :(得分:0)
正如Rob所说,你真的应该参考Python的PEP标准。有一个庞大的社区致力于定义什么是好的,而不是在Python中编码样式...
python.org/dev/peps/pep-0008
我建议从那里开始。
我的上述建议,尽管非常简洁和紧凑,但最终必须维护代码。在你编码时总是假设必须维护你的代码的人将是一个疯狂的斧头杀手,知道你住在哪里。
按可读行分割一行操作或功能。没有人会关心你的代码是多么花哨,如果它很难维护。
答案 2 :(得分:0)
首先,它违反了PEP8中关于在一行上安排代码的若干指导原则。
其次,它以类似于理解的方式组合代码,而不是一个。这是不必要的混淆。
最后,python中的三元风格本质上是倒退的。与其他语言不同,它使用值/条件/值,而不是条件/值/值。除非该表示符合您的代码的实际条件(例如,提供默认值),否则您应该使用一个表达您希望以正确顺序传达的内容的结构:
for state in states:
if state == bad:
score += penalty
else:
score += bonus
if / else语句的方向可能会颠倒(state != bad
),具体取决于代码中涉及的输入或其他费用。但是,除此之外,请记住,你正在努力让某人(可能是你)带来生活更轻松,以及解决这个旧的废话"大约5年后。
答案 3 :(得分:0)
您可以使用sum
:
score += sum(penalty if state == bad else bonus
for state in states)