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

时间:2009-08-23 18:33:08

标签: python if-statement

我有这个

bc = 'off'

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

print bc

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

6 个答案:

答案 0 :(得分:95)

最短的应该是:

bc = 'on' if c.page=='blog' else 'off'

通常这可能看起来有点令人困惑,所以你应该只在明确它意味着什么时才使用它。不要将它用于大布尔条款,因为它开始看起来很难看。

答案 1 :(得分:64)

这是:

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

    bc = ("off","on")[c.page=="blog"]
    
  4. 编辑:根据要求,通用表格是:

       result = (on_false, on_true)[condition]
    

    说明:condition可以是评估为布尔值的任何内容。然后将其视为整数,因为它用于索引元组:False == 0True == 1,然后从元组中选择正确的项。

答案 2 :(得分:33)

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

答案 3 :(得分:13)

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

>>> cpage = 'blog'
>>> bc = 'on' if cpage == 'blog' else 'off'
>>> bc
'on'
>>> cpage = 'asdf'
>>> bc = 'on' if cpage == 'blog' else 'off'
>>> bc
'off'

this blog处对该功能进行了一些写入,相关的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'

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

 A and B or C

类似于

   if A:
       return B
   else:
       return C

我打算写出更长一点的解释,但是他们更好地覆盖了它at Dive into Python。他们还注意到您可能需要了解的一些警告。

答案 4 :(得分:5)

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

want_bc = {True: "on", False: "off"}
# ...
bc = want_bc[c.page == "blog"]

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

答案 5 :(得分:2)

你可以使用,

a = b if c else d 

但如果您使用的是2.5之前的python版本,

bc = c.page == "blog" and "on" or "off"

也可以做到这一点。