Python三元表达式风格:这是好的风格还是坏的风格?

5
以下这行代码几乎可以像一句话一样轻松阅读。这种写法看起来非常符合Python的风格,但是我对这门语言还不够熟悉,只是在寻找一些编码风格上的建议。
for state in states: score += penalty if state == bad else bonus

请参阅:https://www.python.org/dev/peps/pep-0008/ - Robᵩ
三元运算符在我看来,如果if部分是“可能”的情况,而else部分很少或者至少不太可能出现,那么它的可读性更好。如果两种情况同样可能,则最好使用显式的if-else语句。 - chepner
4个回答

7

那种风格不适合我的工作场所。考虑一下这个来自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]

1
你可以使用 sum
score += sum(penalty if state == bad else bonus
             for state in states)

那是一个有趣的方法。 - user4706184

0

我认为这是一种不好的编程风格。在“专业环境”中编写代码的第一原则是“其他人能够维护我的代码吗?”

首先,它违反了 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年后可能需要“修复这个旧破玩意”的某个人(可能是您自己)简化生活。


0
正如Rob所提到的,你真的应该参考Python的PEP标准。有一个庞大的社区致力于定义Python编码风格中什么是可以接受的,什么是不可以接受的...

python.org/dev/peps/pep-0008

我建议从那里开始。

尽管上面的建议非常简洁紧凑,但代码最终必须得到维护。在编码时始终假设维护您代码的人是一个疯狂的斧头杀手,他知道您住在哪里。

将每个操作或函数拆分为可读行的一部分。如果代码难以维护,那么无论它有多花哨,也没有人会关心它。


列表推导式与 lambda 表达式只有一步之遥,相对于把许多用户定义的功能挤在一行中而不是用五行来定义函数,它更加明确定义且易于理解。 - Derrick Cheek
你什么时候会使用三元运算符? - user4706184
个人而言? 嗯,我和我旁边8个座位的所有顾问都认为三元编码风格在生产代码中不应存在,除非它是一个Lambda表达式。 - Derrick Cheek
感谢您的见解。 - user4706184

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接