以下这行代码几乎可以像一句话一样轻松阅读。这种写法看起来非常符合Python的风格,但是我对这门语言还不够熟悉,只是在寻找一些编码风格上的建议。
for state in states: score += penalty if state == bad else bonus
那种风格不适合我的工作场所。考虑一下这个来自PEP8的片段:
因此,在您的情况下:Compound statements (multiple statements on the same line) are generally discouraged.
Yes:
if foo == 'blah': do_blah_thing() do_one() do_two() do_three()
Rather not:
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]
我认为这是一种不好的编程风格。在“专业环境”中编写代码的第一原则是“其他人能够维护我的代码吗?”
首先,它违反了 PEP8 中有关代码排列方式的几个指导方针。
其次,它以类似推导式的方式组合代码,却并非推导式。这会使人感到不必要的困惑。
最后,在 Python 中使用三元运算符的风格本质上有点反常。与其他语言不同,它使用value/condition/value,而不是condition/value/value。除非此方式匹配您源代码的真实条件(例如提供默认值),否则您应该使用表达所需顺序的结构:
for state in states:
if state == bad:
score += penalty
else:
score += bonus
if/else语句的方向可能会被反转(state != bad
),这取决于代码中涉及的打字或其他开销有多大。但是,除此之外,请记住,您正在尝试为将来约5年后可能需要“修复这个旧破玩意”的某个人(可能是您自己)简化生活。
python.org/dev/peps/pep-0008
我建议从那里开始。
尽管上面的建议非常简洁紧凑,但代码最终必须得到维护。在编码时始终假设维护您代码的人是一个疯狂的斧头杀手,他知道您住在哪里。
将每个操作或函数拆分为可读行的一部分。如果代码难以维护,那么无论它有多花哨,也没有人会关心它。
if
部分是“可能”的情况,而else
部分很少或者至少不太可能出现,那么它的可读性更好。如果两种情况同样可能,则最好使用显式的if-else
语句。 - chepner