«Ранний выход» - это совершенно Pythonic стиль (если это оправдано: ответ gnibbler правильно указывает на то, что для вашего конкретного случая есть встроенный [[в Python 2.5 и выше]], который предпочтительнее) и часто помогает реализовать Pythonic цель "квартира лучше вложенной". И for
, как правило, является правильным способом сделать цикл в Python на уровне приложения: если есть какая-либо сложная логика цикла (что может потребовать while
), часто лучше в любом случае передать ее вспомогательному генератору.
Преимущества, иногда заявляемые для альтернативной «единой точки выхода», включают в себя наличие единого «узкого места выхода», при котором может быть выполнена очистка. Но так как исключения всегда возможны, вы не знаете , что ваш единственный return
является уникальным узким местом выхода, даже если он у вас есть: вместо этого * 1008 - это правильный способ обеспечить хорошую очистку * оператор (в 2.6 или 2.5 с «импортом из будущего»; для более старых версий Python более грубый, но все же полезный try
/ finally
вместо этого).
Статья Кнута «Структурированное программирование с утверждениями Гото» (pdf) - невероятная, призрачная статья 1974 года, написанная человеком, которого многие считают живой легендой информатики, теоретической и практической, - стоит прочитать. Любой, кто сомневается в применимости статьи к Python, должен рассмотреть следующую короткую цитату из нее:
устройства, такие как отступ, а не
разделители, может стать возможным для
выражая местную структуру в
исходный язык.
за двадцать лет до публикации Python 1.0, Кнут уже предвидел ключевой синтаксический аспект, который должен был стать таким признаком Python (и, независимо, Haskell , выпущенный немного раньше, чем Python - из личной беседы с Кнутом, Пейтоном Джонсом и ван Россумом, я могу засвидетельствовать, что все они утверждают, что эти три изобретения «отступа для группировки» были полностью независимы друг от друга, только случай «великие умы думают одинаково» - или, по словам Чарльза Форта, «это было просто время парового двигателя»; -).
Формальные доказательства кода, включая ранний выход, конечно, не намного сложнее, чем эквивалентный код с одной точкой выхода, если не что иное, потому что знаменитое доказательство Коррадо Бёма и Джузеппе Якопини показывает, как выполнить механическое преобразование из любой блок-схемы к той, которая содержит только последовательность, выбор и повторение (но, конечно, преобразованная программа - как и любая другая программа, пытающаяся избежать стиля раннего выхода) - склонна иметь больше вложенности, чем необходимо, и дополнительную логическую переменную «status», которые мешают удобочитаемости, прямоте и эффективности - делают ранний выход намного лучше в тех языках, которые его хорошо поддерживают).