2016-01-28 2 views
1

Я хотел бы знать, есть ли способ иметь инструкцию else для нескольких уровней операторов if.Операция Else для вложенных и неактивных, если

Я подробно:

if <condition-1>: 
    if <condition-2>: 
     do stuff 
    elif <condition-3>: 
     do other stuff 
else: #if either condition-1 or all nested conditions are not met 
    do some other thing 

Я знаю, что это может быть легко решена путем добавления функции с «сделать некоторые другие вещи» и сделать вызов к нему как с вложенным еще и верхнего уровня еще но я хотел знать, есть ли способ сделать этот взгляд немного чище.

Заранее благодарим за любые идеи.

+1

здесь для аналогичного вопроса: http://stackoverflow.com/questions/2069662/how-to-exit-an-if-clause; tldr; оберните в свой собственный funciton – jae555

ответ

1

Нет, не совсем. Это действительно то, что питон не хочет, чтобы вы делали. Он предпочитает сохранять читаемость и ясность по поводу «кричащих» трюков. Вы можете сделать это, объединив операторы или создав переменную «флаг».

Например, вы могли бы сделать

if <condition-1> and <condition-2>: 
    # do stuff 
elif <condition-1> and <condition-3>: 
    # do other stuff 
else: 
    # do some other thing 

Или, если вы не хотите повторять условие 1 по какой-то причине (это дорого, чтобы проверить, что яснее не повторять его, или вы просто не хотите, чтобы ввести его), мы могли бы сделать

triggered_condition = False 
if <condition-1>: 
    if <condition-2>: 
     triggered_condition = True 
     # do stuff 
    elif <condition-3>: 
     triggered_condition = True 
     # do some other stuff 
if not triggered_condition: 
    # do some other thing 

Если это было использовано в функции, мы могли бы даже пропустить флаг

if <condition-1>: 
    if <condition-2>: 
     # do stuff and return 
    elif <condition-3>: 
     # do some other stuff and return 
# do some other thing 
# if we got here, we know no condition evaluated to true, as the return would have stopped execution 
+0

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

0

Существует несколько подходов к этому, которые не являются особенно интуитивно понятными/читаемыми ... но работают:

В этом примере мы используем синтаксис for ... else .... Любое успешное условие должно выдать перерыв

for _ in [1]: 
    if <condition>: 
     if <condition>: 
      # where ever we consider ourselves "successful", then break 
      <do stuff> 
      break 
     elif <condition>: 
      if <condition>: 
       <do stuff> 
       break 
else: 
    # we only get here if nothing considered itself successful 

Другой подход заключается в использовании try ... else ..., где «успешные» ветви должны поднять исключение.

Это не особенно приятно и не рекомендуется!

+0

Я бы посоветовал не использовать подход ловли исключений. Это несколько злоупотребление своей целью и может быть очень неустойчивым, если какое-либо из утверждений в вложенном if's может нормально вызвать исключение. – Matthew

+1

@Matthew True ... но если вы были достаточно противны, чтобы использовать подход к исключению, вы бы выбрали специальное исключение. – donkopotamus

+0

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