写一个if语句的更短,更pythonic的方式

我有这个

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

有没有更pythonic(和/或更短)的方式来写这个Python?

最短的一个应该是:

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

一般来说,这可能看起来有点混乱,所以你应该只在清楚它的含义时才使用它。 不要把它用于大布尔语句子,因为它开始看起来很难看。

这是:

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

     bc = ("off","on")[c.page=="blog"] 

编辑:根据要求,广义的forms是:

  result = (on_false, on_true)[condition] 

说明: condition可以是任何评估为布尔值的东西。 它被视为一个整数,因为它被用来索引元组: False == 0True == 1 ,然后从元组中select正确的项目。

那么,不要成为一个python人,请带上一大堆盐,但是多年来了很多聪明的代码(而且更难读了 ),现在我发现自己对可读代码有着强烈的偏好。 尽pipe我是一个Python家伙,但我还是知道你原来的代码在做什么。 可以肯定的是,你可以把它隐藏起来,也许会让人印象深刻,但是为什么呢?

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

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

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

这可能是一个lesspythonic,但你可以使用和/或以这种方式:

 >>> cpage = 'asdf' >>> bc = (cpage == 'blog') and 'on' or 'off' >>> bc 'off' >>> cpage = 'blog' >>> bc = (cpage == 'blog') and 'on' or 'off' >>> bc 'on' 

这个在lambdaexpression式中比在一行上更经常使用,但是forms

  A and B or C 

类似于

  if A: return B else: return C 

我将会写出一些更长的解释,但是他们在“深入Python”中进行了更好的介绍。 他们还提到了一些你可能需要知道的警告。

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

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

我更喜欢这个和/或元组索引解决scheme,在一般的计算方法的基础上进行testing。

您可以使用,

 a = b if c else d 

但是如果你使用2.5以前的python版本,

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

也可以做的伎俩。