Короче, более питонский способ написания оператора if - PullRequest
44 голосов
/ 23 августа 2009

У меня есть

bc = 'off'

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

print bc

Есть ли более питонический (и / или более короткий) способ написать это на питоне?

Ответы [ 6 ]

95 голосов
/ 23 августа 2009

Самый короткий должен быть:

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

Обычно это может показаться немного запутанным, поэтому вы должны использовать его только тогда, когда ясно, что это значит. Не используйте его для больших логических выражений, так как он начинает выглядеть ужасно быстро.

64 голосов
/ 24 августа 2009

Это:

  1. определенно короче
  2. возможно Pythonic (до Python 2.5, который ввел спорный синтаксис X if Z else Y)
  3. сомнительно читабельно. С учетом этих предостережений, вот оно:

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

РЕДАКТИРОВАТЬ: Согласно запросу, обобщенная форма:

   result = (on_false, on_true)[condition]

Объяснение: condition может быть любым, что является логическим значением. Затем он рассматривается как целое число, поскольку он используется для индексации кортежа: False == 0, True == 1, который затем выбирает нужный элемент из кортежа.

33 голосов
/ 23 августа 2009

Ну, не будучи парнем с питоном, пожалуйста, примите это с огромным запасом соли, но написав (и, с большим трудом, прочитайте ) много умного кода за эти годы, я нахожус сильным предпочтением теперь для читаемого кода.Я понял суть того, что делал ваш оригинальный код, хотя я никем как парень из Python.Чтобы быть уверенным, вы могли бы скрыть это и, возможно, произвести впечатление на Python Wonk или два, но почему?

13 голосов
/ 23 августа 2009

Или вы можете использовать встроенный оператор if:

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

В этой записи этого блога есть некоторая запись, и соответствующий PEP - PEP308 . Встроенный оператор if был введен в Python 2.5.

Этот может быть немного менее питоническим, но вы можете использовать и / или таким образом:

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

Этот чаще используется в лямбда-выражениях, чем в отдельной строке, но в форме

 A and B or C

похож на

   if A:
       return B
   else:
       return C

Я собирался написать немного более длинное объяснение, но они освещали его лучше в Dive into Python . Они также отметили пару предостережений, которые вам, вероятно, нужно знать.

5 голосов
/ 24 августа 2009

Другая возможность - использовать dict, если вы можете вычислить значения вне функции, к которой они обращаются (т. Е. Значения являются статическими, что также решает проблему оценки в комментариях скудли).

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

Я предпочитаю это и / или решения для индексации кортежей под общей рубрикой предпочтения вычислений тестированию.

2 голосов
/ 24 августа 2009

Вы можете использовать,

a = b if c else d 

но если вы используете версию Python до 2.5,

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

может сделать тоже самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...