Подтвердить что ты не робот

If или elif либо true, то сделайте что-нибудь

это просто академический интерес. Я встречаю следующую ситуацию.

either_true = False
if x:
  ...do something1
  either_true = True
elif y:
  ...do something2
  either_true = True
if either_true:
  ..do something3

есть ли какой-нибудь питонический способ сделать это, или вообще лучший способ программирования. В принципе, something3 выполняется только в том случае, если true или true.

4b9b3361

Ответ 1

Ваш код является почти оптимальным, если речь идет о повторении кода и оценке. Единственное, о чем я могу думать, чтобы избежать повторения, было бы:

# be optimistic!
either_true = True
if x:
    do_something1
elif y:
    do_something2
else:
    either_true = False

if either_true:
    do_something3

Это удаляет одно назначение, хотя общее количество строк не изменяется.

Преимущество заключается в том, что это работает с условиями n без добавления каких-либо других назначений, тогда как для текущего решения требуется either_true = True для каждого условия.

По моему мнению, они имеют одинаковую степень удобочитаемости, но приведенный выше код будет лучше с большим количеством условий.

Также нет никакого "питонического" способа, кроме читаемого, который избегает повторения кода и является оптимальным с точки зрения эффективности, и я не знаю какого-либо "лучшего программирования" для достижения того же результата.

Ответ 2

Вы также можете полностью опустить флаг either_true, если doSomething3 - это одна строка кода (например, вызов функции):

if x:
  ..do something 1
  ..do something 3
elif y:
  ..do something 2
  ..do something 3

Он сохраняет приятное свойство оценивать x и y не более одного раза (и y не будет оцениваться, если x истинно).

Ответ 3

Я бы справился с этим, используя вложенные операторы if.e.

if x or y:
    if x:
        ...do something1
    elif y:
        ...do something2
    ...do something3

Как отмечалось в некоторых комментариях, наилучшее решение будет зависеть от того, что такое x и y. Если вам удобна легкая читаемость/сжатый код, то эти или другие ответы должны быть точными. Если, однако, x и y были дорогостоящими вызовами функций, тогда было бы лучше сделать что-то более похожее на то, что вы сделали, чтобы избежать вызова функции дважды.

Ответ 4

Вы можете перенести часть из нее в функцию:

def do_stuff():
    if x:
        ...do something1
        return True
    elif y:
        ...do something2
        return True
    else:
        return False

if do_stuff():
    ..do something3

Или все это в функции:

def do_stuff()
    if x:
        ...do something1
    elif y:
        ...do something2
    else:
        return

    ..do something3

Ответ 5

В духе предлагая совершенно другое решение для уже предложенных, вы можете создать список структурированных словарей, который позволяет вам установить несколько случаев, связанных с вашими предопределенными "somethings"

cases = [
    {'condition' : x, 'action' : something1},
    {'condition' : not x and y, 'action' : something2},
    {'condition' : x or y, 'action' : something3},
]

for c in cases:
    if c['condition']: c['action']

Мне действительно нравится этот метод (и я только что открыл его, пытаясь придумать уникальный ответ на этот вопрос, спасибо!) - это действительно очевидно, какой случай связан с каким действием, и это легко добавьте еще несколько случаев, не добавляя больше операторов if/else.

Ответ 6

if x or y:
    dosomethig1() if x else dosomething2()
    dosomething3()

Конечно, это дважды оценивает x.__nonzero__. Обычно это не очень важно, но если это дорого, вы всегда можете оценить это и сохранить его во временную переменную.

Ответ 7

Для всех этих предложений и любых других, которые вы придумали, обратите внимание, что если x и y являются дорогостоящими выражениями:

if askTheServer() or readTheOneGigabyteConfigFile():
   ...

вы можете назначить значения, которые эти выражения вернутся к быстрым вычислениям:

x = askTheServer()
y = readTheOneGigabyteConfigFile()
if x or y :
   ...

Ответ 8

either_true = x or y
if x:
  ...do something1
elif y:
  ...do something2
if either_true:
  ..do something3

Ответ 9

Я бы обернул функции..do в функции и написал один if-elif:

def do_x():
  .. do something 1
  .. do something 3

def do_y():
  .. do something 2
  .. do something 3

if x:
   do_x()
elif y:
   do_y()

Это приятно, если.. что-то связано с множеством вещей.

Ответ 10

если что-то довольно короткое, например do (1), do (2) или что-то в этом роде, вы можете просто сделать это следующим образом:

(x and (do(1), x) or y and (do(2), y)) and do(3)