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.
Ответы
Ответ 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)