возврат из для цикла

Я являюсь довольно новым в Python, и я задавался вопросом если это:

def func(self, foo):
    for foo in self.list:
        if foo.boolfunc(): return True
    return False

хорошая практика.

Я могу возвратиться из цикла как вышеупомянутое, или я должен использовать цикл с условием продолжения, как так?

def func(self, foo):  
    found = false
    while(not found & i < len(self.list)):
        found = foo.boolfunc()
        ++i
    return found

Мой преподаватель Java попросил нас никогда не использовать перерывы в наших циклах, но это технически не повреждение, и это более кратко, так... да

спасибо

8
задан thepandaatemyface 2 March 2010 в 04:05
поделиться

6 ответов

В вашем примере нет ничего плохого, но лучше написать

def func(self, foo):
    return any(foo.boolfunc() for foo in self.list)
14
ответ дан 3 November 2019 в 13:09
поделиться

Следует отметить, что в Python циклы for могут иметь предложение else . Предложение else выполняется только тогда, когда цикл завершается из-за исчерпания списка.

Итак, вы могли написать:

def func(self):
    for foo in self.list:
        if foo.boolfunc():
            return True
    else:
        return False
8
ответ дан 3 November 2019 в 13:09
поделиться

Это хорошая практика.

Мой java-профессор предупреждает нас никогда не использовать прерывания в наших циклах

Почему это так? «Никогда» - сильное слово в компьютерных науках, и его никогда не следует (…) использовать. 1)


1) За исключением «goto» ... у всех нас есть свои любимые раздражения. ; -)

2
ответ дан 3 November 2019 в 13:09
поделиться

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

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

6
ответ дан 3 November 2019 в 13:09
поделиться

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

Если ваш оператор if имеет умеренную сложность, тогда может стать неясно, какое постусловие устанавливает цикл.

Если ваше условие выхода очевидное , то ранний выход - это обычная синтаксическая оптимизация.

Если ваше условие выхода неочевидно , то запутанный, вложенный, трудный для понимания набор утверждений if приносит вам больше вреда, чем пользы.

В самом деле, этот вопрос SO показывает, что наличие простого блока try может привести к таким сбивающим с толку условиям, что был создан явно неправильный фрагмент кода, который не может быть легко отлажен. .

Как правило, все «ранний выход» (в частности, оператор break ) приводят к проблемам при создании формального доказательства. (Оператор else имеет аналогичные проблемы.)

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

Также обратите внимание, что любой совет избегать break или else приведет к разжиганию ненависти и голосованию против. По необъяснимым причинам внимательно смотреть на некоторые программные конструкции - это плохо.

"else" считается вредным в Python?

Если условие выхода из цикла с break (или ранним return ) не очевидное , вам нужно что-то переделать, чтобы сделать его очевидным .

В этом примере они очевидны , поэтому нет никаких проблем с конкретным примером, который представлен.

-2
ответ дан 3 November 2019 в 13:09
поделиться

«Ранний выход» - это идеальный питонический стиль (при наличии гарантии: ответ gnibbler правильно указывает, что для вашего конкретного случая использования есть встроенный [[в Python 2.5 и выше]], что предпочтительнее) и часто помогает реализовать цель Pythonic: «плоский лучше, чем вложенный». И для обычно является правильным способом выполнения цикла в Python на уровне приложения: если есть какая-либо сложная логика цикла (что может гарантировать , а ), часто лучше протолкнуть ее. в любом случае до вспомогательного генератора.

К преимуществам, которые иногда заявляют для альтернативной «единой точки выхода», относится наличие единственного «узкого места выхода», в котором может быть выполнена очистка. Но поскольку исключения всегда возможны, вы не знаете , что ваш единственный return является уникальным узким местом для выхода, даже если оно у вас есть: вместо этого правильный способ обеспечить хорошую очистку , оператор with (в 2.6 или 2.5 с «импортом из будущего»; для более старых версий Python, более неуклюжий, но все же полезный попробуйте / finally ] вместо).

Статья Кнута «Структурированное программирование с помощью операторов Goto» (pdf) - невероятная, дальновидная статья 1974 года человека, которого многие считают живой легендой информатики, как теоретической, так и практической, - это стоит прочитать. Любой, кто сомневается в применимости статьи к Python, должен рассмотреть следующую короткую цитату из нее:

такие устройства, как отступы, а не разделители , могут стать возможными для выражения локальной структуры в {{1 }} язык источника.

За двадцать лет до публикации Python 1.0, Кнут уже предвидел ключевой синтаксический аспект, который должен был стать такой отличительной чертой Python (и, независимо, Haskell , выпущенный немного раньше, чем Python - из личного обсуждения с Кнутом, Пейтоном Джонсом и ван Россумом, я могу засвидетельствовать, что все они утверждают, что эти три изобретения «отступа для группирования» были полностью независимы друг от друга, просто случай «великих умов» думайте одинаково »- или, говоря словами Чарльза Форта,« это было просто время паровых машин »;-).

Формальные доказательства кода, включая ранний выход, конечно, ничуть не сложнее, чем для эквивалентного кода с единственной точкой выхода, хотя бы потому, что знаменитое доказательство Коррадо Бема и Джузеппе Якопини показывает, как выполнить механическое преобразование из любой блок-схемы. в одну, содержащую только последовательность, выбор и повторение (но, конечно, преобразованная программа - как и любая другая программа, пытающаяся избежать стиля раннего выхода - склонна к большему количеству вложений, чем необходимо, и дополнительной логической переменной «статуса», которые мешают удобочитаемости, прямолинейности и эффективности - что делает ранний выход намного лучше для языков, которые его хорошо поддерживают).

5
ответ дан 3 November 2019 в 13:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: