写一个if语句的更短,更pythonic的方式
我有这个
bc = 'off' if c.page == 'blog': bc = 'on' print bc
有没有更pythonic(和/或更短)的方式来写这个Python?
最短的一个应该是:
bc = 'on' if c.page=='blog' else 'off'
一般来说,这可能看起来有点混乱,所以你应该只在清楚它的含义时才使用它。 不要把它用于大布尔语句子,因为它开始看起来很难看。
这是:
- 绝对更短
- 可以说是Pythonic(Python之前的2.5,它引入了有争议的
X if Z else Y
语法) -
可疑的可读性。 考虑到这些警告,这里是:
bc = ("off","on")[c.page=="blog"]
编辑:根据要求,广义的forms是:
result = (on_false, on_true)[condition]
说明: condition
可以是任何评估为布尔值的东西。 它被视为一个整数,因为它被用来索引元组: False == 0
, True == 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"
也可以做的伎俩。