Какие существуют способы преждевременного выхода из if
предложения?
Бывают случаи, когда я пишу код и хочу поместить break
оператор внутри if
предложения, только чтобы помнить, что его можно использовать только для циклов.
В качестве примера возьмем следующий код:
if some_condition:
...
if condition_a:
# do something
# and then exit the outer if block
...
if condition_b:
# do something
# and then exit the outer if block
# more code here
Я могу придумать один способ сделать это: если предположить, что случаи выхода происходят во вложенных операторах if, оберните оставшийся код в большой блок else. Пример:
if some_condition:
...
if condition_a:
# do something
# and then exit the outer if block
else:
...
if condition_b:
# do something
# and then exit the outer if block
else:
# more code here
Проблема заключается в том, что большее количество мест выхода означает большее количество вложений / отступов кода.
В качестве альтернативы я мог бы написать свой код, чтобы if
предложения были как можно меньше и не требовали никаких выходов.
Кто-нибудь знает о хорошем / лучшем способе выхода из if
пункта?
Если есть какие-либо связанные предложения else-if и else, я полагаю, что при выходе они будут пропущены.
источник
elif
?if a: #stuff; #stuff_inbetween; if b: #stuff;
промежуточный код зависит от,not a
но не зависит отb
.elif
stackoverflow.com/a/2069680/7045119Ответы:
(Этот метод работает для
if
s, нескольких вложенных циклов и других конструкций, с которыми вам неbreak
легко справиться.)Оберните код в отдельную функцию. Вместо
break
использованияreturn
.Пример:
источник
(Не используйте это, пожалуйста.)
источник
goto
.источник
while True:
. Просто не забудьте написатьbreak
заявление в конце! Для языков с конструкцией do-while это более идоматично:do { code that can conditionally break out } while (false);
Вы можете эмулировать функциональность goto с исключениями:
Заявление об ограничении ответственности: я лишь хочу обратить ваше внимание на возможность такого поведения, но никоим образом не считаю это разумным при нормальных обстоятельствах. Как я уже упоминал в комментарии к этому вопросу, структурирование кода таким образом, чтобы в первую очередь избегать византийских условных выражений, безусловно, предпочтительнее. :-)
источник
Может быть, это?
источник
elif
когда я писал это, мой разум был отключен . Хотя я думаю, что это не сработает в ситуации, когда я хочу, чтобы код выполнялся между вложенными операторами if.Что касается того, о чем на самом деле спрашивали, мой подход состоит в том, чтобы поместить их
if
в один циклПопробуй это:
источник
for _ in range(1):
вместоwhile True:
. (1) Лучше сообщить о своем намерении создать единый итерационный цикл и (2) нет последнего оператора break для выхода из цикла (позже может быть случайно удален)Вообще говоря, не надо. Если вы вкладываете «если» и отрываетесь от них, вы делаете это неправильно.
Однако, если вам необходимо:
Обратите внимание: функции НЕ ДОЛЖНЫ быть объявлены в операторе if, их можно объявить заранее;) Это было бы лучшим выбором, так как он избавит вас от необходимости рефакторинга уродливого if / then позже.
источник
if condition_a
иif condition_b
вложенным внутриif some_condition
. Я хочу иметь возможность вырваться изif some_condition
.По сути, то, что вы описываете, - это операторы goto, которые обычно довольно сильно панорамируются. Ваш второй пример гораздо легче понять.
Однако чище все равно будет:
источник
Есть другой способ, который не полагается на определение функций (потому что иногда это менее читабельно для небольших фрагментов кода), не использует дополнительный внешний цикл while (который может потребовать особого внимания в комментариях, чтобы его можно было понять с первого взгляда) , не использует goto (...) и, что наиболее важно, позволяет вам сохранить свой уровень отступа для внешнего, если вам не нужно начинать вложение.
Да, это также требует второго взгляда на удобочитаемость, однако, если фрагменты кода небольшие, это не требует отслеживания каких-либо циклов while, которые никогда не будут повторяться, и после понимания того, для чего нужны промежуточные if, он легко читается, все в одно место и с таким же отступом.
И это должно быть довольно эффективно.
источник
Итак, я понимаю, что вы пытаетесь вырваться из внешнего блока кода if
Одним из выходов из этого является то, что вы можете проверить наличие ложного условия во внешнем блоке if, который затем неявно выйдет из блока кода, затем вы используете блок else, чтобы вложить другие if, чтобы что-то сделать
источник
Единственное, что можно применить без дополнительных методов, -
elif
это следующий пример.источник
Вот еще один способ справиться с этим. Он использует один элемент цикла for, который позволяет вам просто использовать continue. Это предотвращает ненужную потребность в дополнительных функциях без причины. И дополнительно исключает потенциальные бесконечные циклы while.
источник
использование
return
в условии if вернет вас из функции, так что вы можете использовать return для разрыва условия if.источник