Я являюсь довольно новым в 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 попросил нас никогда не использовать перерывы в наших циклах, но это технически не повреждение, и это более кратко, так... да
спасибо
В вашем примере нет ничего плохого, но лучше написать
def func(self, foo):
return any(foo.boolfunc() for foo in self.list)
Следует отметить, что в Python циклы for могут иметь предложение else . Предложение else выполняется только тогда, когда цикл завершается из-за исчерпания списка.
Итак, вы могли написать:
def func(self):
for foo in self.list:
if foo.boolfunc():
return True
else:
return False
Это хорошая практика.
Мой java-профессор предупреждает нас никогда не использовать прерывания в наших циклах
Почему это так? «Никогда» - сильное слово в компьютерных науках, и его никогда не следует (…) использовать. 1)
1) За исключением «goto» ... у всех нас есть свои любимые раздражения. ; -)
Ваш профессор пропагандирует практику под названием «Единая точка возврата», которая в основном гласит, что любой блок кода должен иметь только одну точку выхода. Разрывы петель несколько отличаются от этого, но обычно сгруппированы вместе.
Это, мягко говоря, противоречивое мнение, и уж точно не такое жесткое правило, как «никогда не использовать goto». Вероятно, стоит сделать это по-своему - вы можете успокоить его, а также увидеть преимущества обоих подходов, но большинство людей, вероятно, не слишком строги в отношении единой точки возврата, если ее нарушение делает их код более читабельным.
«Выход из цикла» может легко превратиться в плохую практику, поскольку он скрывает условие завершения цикла.
Если ваш оператор if
имеет умеренную сложность, тогда может стать неясно, какое постусловие устанавливает цикл.
Если ваше условие выхода очевидное , то ранний выход - это обычная синтаксическая оптимизация.
Если ваше условие выхода неочевидно , то запутанный, вложенный, трудный для понимания набор утверждений if
приносит вам больше вреда, чем пользы.
В самом деле, этот вопрос SO показывает, что наличие простого блока try
может привести к таким сбивающим с толку условиям, что был создан явно неправильный фрагмент кода, который не может быть легко отлажен. .
Как правило, все «ранний выход» (в частности, оператор break
) приводят к проблемам при создании формального доказательства. (Оператор else
имеет аналогичные проблемы.)
Если вы разрабатываете свою программу, обосновывая утверждения, необходимые для создания необходимого постусловия, вам никогда не понадобится break
или ранний возврат
, потому что вы не можете легко создавать эти утверждения, используя формальные методы.
Также обратите внимание, что любой совет избегать break
или else
приведет к разжиганию ненависти и голосованию против. По необъяснимым причинам внимательно смотреть на некоторые программные конструкции - это плохо.
"else" считается вредным в Python?
Если условие выхода из цикла с break
(или ранним return
) не очевидное , вам нужно что-то переделать, чтобы сделать его очевидным .
В этом примере они очевидны , поэтому нет никаких проблем с конкретным примером, который представлен.
«Ранний выход» - это идеальный питонический стиль (при наличии гарантии: ответ 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 - из личного обсуждения с Кнутом, Пейтоном Джонсом и ван Россумом, я могу засвидетельствовать, что все они утверждают, что эти три изобретения «отступа для группирования» были полностью независимы друг от друга, просто случай «великих умов» думайте одинаково »- или, говоря словами Чарльза Форта,« это было просто время паровых машин »;-).
Формальные доказательства кода, включая ранний выход, конечно, ничуть не сложнее, чем для эквивалентного кода с единственной точкой выхода, хотя бы потому, что знаменитое доказательство Коррадо Бема и Джузеппе Якопини показывает, как выполнить механическое преобразование из любой блок-схемы. в одну, содержащую только последовательность, выбор и повторение (но, конечно, преобразованная программа - как и любая другая программа, пытающаяся избежать стиля раннего выхода - склонна к большему количеству вложений, чем необходимо, и дополнительной логической переменной «статуса», которые мешают удобочитаемости, прямолинейности и эффективности - что делает ранний выход намного лучше для языков, которые его хорошо поддерживают).