编写if语句的更短,更pythonic的方式

324*_*423 44 python if-statement

我有这个

bc = 'off'

if c.page == 'blog':
    bc = 'on'

print bc
Run Code Online (Sandbox Code Playgroud)

在python中有更多的pythonic(和/或更短)的写法吗?

fre*_*net 98

最短的应该是:

bc = 'on' if c.page=='blog' else 'off'
Run Code Online (Sandbox Code Playgroud)

通常这可能看起来有点令人困惑,因此您应该只在明确其含义时使用它.不要将它用于大布尔条款,因为它开始看起来很难看.

  • 对于使用Python 2.5及更高版本的软件来说,这是可以的 (16认同)
  • 还是值得一提的. (13认同)
  • <2.5兼容性未被提及;) (10认同)
  • 我将不得不争论"最短"的声明(请参阅我对较短声明的回答). (4认同)

Ark*_*ady 65

这是:

  1. 绝对更短
  2. 可以说是Pythonic(Python 2.5之前,它引入了有争议的X if Z else Y语法)
  3. 有问题的可读性.考虑到这些警告,这里有:

    bc = ("off","on")[c.page=="blog"]
    
    Run Code Online (Sandbox Code Playgroud)

编辑:根据要求,通用表格是:

   result = (on_false, on_true)[condition]
Run Code Online (Sandbox Code Playgroud)

Explanation:condition可以是任何求值为Boolean的值.然后将其视为整数,因为它用于索引元组:False == 0,True == 1然后从元组中选择正确的项.

  • 这是我在2.5不可用时使用的; 我发现'和......或'是不可接受的,因为它奇怪地读取并且如果和值不是真的那么就会失败.'(a,b)[cond]'的缺点是a和b都被评估,所以你不能依赖捷径,这意味着如果item是None,你就不能转换像''nothing'这样的结构项目名称". (4认同)
  • 我喜欢它,但是比较`X如果Z其他Y`是'如果Z`是假的我们只评估Y而不是X所以它失败例如如果键不在字典中:`adict [k]如果adict .__包含(k)别的k` (4认同)
  • 我想投票,因为它真的很丑,然后我记得我自己用它. (3认同)

Joh*_*ood 33

好吧,不要成为一个蟒蛇人,请带着一大堆盐,但多年来了很多聪明的代码(并且,更难以阅读),我发现自己现在对可读代码有强烈的偏好.我得到了你的原始代码正在做的事情的要点,即使我是一个没有人作为Python人.可以肯定的是,你可以隐藏它并且可能会给Python一两个人留下深刻印象,但为什么呢?

  • 仅供参考,"Pythonic"是一个促进可读性而不是简洁性的术语. (3认同)
  • 但一般来说,较短的代码更具可读性。您可以做得太过分,但在其他条件相同的情况下,我希望代码中的标记更少。特别是,如果带有副作用的身体的陈述很难推理,因为它很难浏览:如果不阅读整个内容,你就无法知道它们在接触什么。C 的三元或内联 `if` freiksenet 提到的没有这些问题:它需要一些时间来适应,但它是一种比原始分支更易于维护的风格。 (2认同)

Mar*_*off 13

或者您可以使用内联if语句:

>>> cpage = 'blog'
>>> bc = 'on' if cpage == 'blog' else 'off'
>>> bc
'on'
>>> cpage = 'asdf'
>>> bc = 'on' if cpage == 'blog' else 'off'
>>> bc
'off'
Run Code Online (Sandbox Code Playgroud)

这个博客上有一些关于该功能的文章,相关的PEP是PEP308.内联if语句是在Python 2.5中引入的.

这个可能不那么pythonic,但你可以使用和/或以这种方式:

>>> cpage = 'asdf'
>>> bc = (cpage == 'blog') and 'on' or 'off'
>>> bc
'off'
>>> cpage = 'blog'
>>> bc = (cpage == 'blog') and 'on' or 'off'
>>> bc
'on'
Run Code Online (Sandbox Code Playgroud)

这个在lambda语句中比在一行本身更常用,但是形式

 A and B or C
Run Code Online (Sandbox Code Playgroud)

类似于

   if A:
       return B
   else:
       return C
Run Code Online (Sandbox Code Playgroud)

我打算写出更长一点的解释,但他们在Dive into Python中更好地介绍了它.他们还注意到您可能需要了解的一些警告.

  • 和/或方法*使用*是在lambda中进行条件化的Pythonic方法,直到PEP308.请参阅PEP的前两段:http://www.python.org/dev/peps/pep-0308/ (2认同)

use*_*331 5

另一种可能性是使用dict,如果你可以计算访问它们的函数之外的值(即值是静态的,这也解决了scrible的答案评论中的评估问题).

want_bc = {True: "on", False: "off"}
# ...
bc = want_bc[c.page == "blog"]
Run Code Online (Sandbox Code Playgroud)

我更喜欢这个和/或在优选计算到测试的一般标题下的元组索引解决方案.