关于python:编写if语句的更短,更pythonic的方式

Shorter, more pythonic way of writing an if statement

我有这个

1
2
3
4
5
6
bc = 'off'

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

print bc

有没有用Python写这篇文章的方法更像Python(和/或更短)?


最短的应该是:

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

一般来说,这可能看起来有点令人困惑,所以您应该只在清楚它的含义时使用它。不要将它用于大型布尔子句,因为它开始看起来很难看。


这是:

  • 绝对更短
  • 有争议的pythonic(在python 2.5之前,引入了有争议的X if Z else Y语法)
  • 可读性有问题。考虑到这些警告,这里是:

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

  • 编辑:根据请求,通用表单为:

    1
       result = (on_false, on_true)[condition]

    说明:condition可以是任何计算为布尔值的值。然后将它作为一个整数处理,因为它用于索引元组:False == 0True == 1,然后从元组中选择正确的项。


    好吧,作为一个没有Python的人,请用大量的盐来处理这个问题,但是在多年来编写(并且,更困难的是,阅读)了很多聪明的代码之后,我发现自己现在对可读代码有着强烈的偏好。我知道了你最初的代码在做什么,即使我是一个无名小卒。当然,你可以把它藏起来,也许能给一个或两个Python怪留下深刻印象,但为什么呢?


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

    1
    2
    3
    4
    5
    6
    7
    8
    >>> cpage = 'blog'
    >>> bc = 'on' if cpage == 'blog' else 'off'
    >>> bc
    'on'
    >>> cpage = 'asdf'
    >>> bc = 'on' if cpage == 'blog' else 'off'
    >>> bc
    'off'

    在这个博客上有一些关于这个功能的报道,相关的政治公众人物是政治公众人物308。在Python2.5中引入了内联if语句。

    这个可能会少一点,但你可以用和/或这种方式:

    1
    2
    3
    4
    5
    6
    7
    8
    >>> cpage = 'asdf'
    >>> bc = (cpage == 'blog') and 'on' or 'off'
    >>> bc
    'off'
    >>> cpage = 'blog'
    >>> bc = (cpage == 'blog') and 'on' or 'off'
    >>> bc
    'on'

    这个函数在lambda语句中比单独在一行中使用得更频繁,但是

    1
     A and B or C

    类似于

    1
    2
    3
    4
       if A:
           return B
       else:
           return C

    我本来打算写更长一点的解释,但他们在潜入Python时更详细地解释了这一点。他们还注意到了一些你可能需要知道的注意事项。


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

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

    我更喜欢这个和/或在"优先计算而不是测试"的一般准则下的元组索引解决方案。


    你可以使用,

    1
    a = b if c else d

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

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

    也能做到这一点。