Как стать автором
Обновить

Комментарии 52

Я думаю эти варианты использования известны всем кто программирует на Python. Неизвестны они лишь для тех кто только пробует использовать Python и пишет в стилистике Java / C#.
Я знаю одного мужчину, друг которого не знал. =) А если серьёзно, то новички скажут спасибо.
О да, коллега по работе одного моего знакомого тоже не знал и с интересом прочитал эту статью.
Ну, я Python года полтора-два назад изучать начал. Похоже, что эти варианты использования else я тогда пропустил мимо ушей, так как за прошедшее время я к Python'у несколько раз возвращался, кой-чего на нем писал, но про них узнал только сегодня. :)
Вот последнее время немного Python'ю. Зарабатываю деньги себе на C#/Java/PHP. Про интересные варианты использования else не слышал. Спасибо.
когда я первый раз увидел for… else, то всё же ожидал, что else исполняется если цикл не сделал ни одной итерации — имхо это куда более ожидаемое поведение
Это было бы как раз неожиданным поведением. Ведь по существу в Питоне цикл for это try...except блок, в котором внутри while True: происходит последовательный вызов iterator.__next__(), а перехватывается исключение StopIteration. Команда break, как и положено, выкидывает из блока try/except/else, выполняя только содержимое блока finally. То есть всё по уму — содержимое else в for...else выполняется всегда, кроме случая явного вызова break (ну или ещё снаружи try...except навесили).
вот же ж как оно ж… что можно сделать из простого while… навесить исключениев, перехватчиков и потом думай-гадай, что ж оно делает на самом деле.

еще в школе учили, что break == goto, а goto == попа
а тут не только break, да еще все, что написано чуть выше, прям винегрет.
и оно еще и работает?! :))
Плохо вас в школе учили, break как раз и придумали как замену goto
О, да, какой же я тупой…
Брейк это явный переход к метке за пределом цикла если что.
Это не goto наверное… нет, что вы, совсем нет!
Но я в самом деле даже не против правильно использованного goto, и совсем не против break, который и хотели сделать как правильный goto. Но обертка этого всего в обработку исключений как штатного прекращения цикла — это для меня нонсенс.
Ещё для справки: Питон вообще почти весь на исключениях держится.
switch тогда еще больший goto. А switch в С больший goto чем в Pascal, например :)

Goto никуда не делся, его просто припрятали в другие конструкции
«switch» в С — это вообще песня, прерываемая break'ами :)
а в паскале «case» как-то вполне органично смотрится на мой взгляд
Да, case d паскале и лаконичнее и удобнее. Очень удобна возможность указать диапазон или список значений:

case value of
case value of
1..3,5: doSomethig();
4: doSomethingElse();
else
  ....
end;
Это всё должен знать человек, который «первый раз увидел for… else»?
Cудя по всему теперь оно так… если раньше я как-то думал, что цикл выглядит примерно как в асме и там все соптимизировано до предела, то перерь оказывается все разоптимизировано, что фиг поймешь, где надо экономить, а где нет; где раньше был проверенный код, теперь при простом переводе на другой язык программирования настолько все внутри усложняется, что делается как-то нехорошо :( одно выбрасывание исключений чего стоит — это же раскрутка стека и прочие накладные расходы.
Вобщем-то этот, казалось бы невинный, комментарий, как оно внутри устроено, вот так враз поменял мое мнение о питоне.
Суть питона как раз в том что на мелочах можно не экономить ради удобства программиста. Для экономии пишут на более низкоуровневых языках.
Просто для справки: исключения в Питоне работают быстро, потому что всё происходит внутри интерпретатора.
… а интерпретируемый код по определению работает медленно :)
Вот мне тоже такое поведение кажется единственно возможным.
Else = иначе. Выполни такой-то блок кода, а иначе (если не получилось) — выполни секцию else. В писоне же получается «выполни и тело цикла, и блок else» — че за бред?
Честно говоря, я не нашел особой пользы от применения оператора else вне связки с if.

А я считаю, что в большинстве случаев следует использовать его вместе с операторами циклов, так как получающиеся конструкции являются интуитивными (осмысленными), поскольку связаны с выходом по оператору break из цикла.

Для начинающих писать на Python статья очень полезная.
Хм, согласно предыдущему комментарию это совсе-совсем неочевидно с точностью до наоборот. Так что лично мое мнение — вообще не использовать такие конструкции, которые могут так двояко толковаться — от греха подальше.
Во всех манах по питону которые я читал использование else с for и прочими были описаны если не в первых страницах, то в первой главе точно.
Совершенно верно.
Я понимаю, из-за недостатка опыта можно недостаточно свободно ориентироваться в стандартной библиотеке или в более продвинутых возможностях, но не знать таких возможностей ключевых управляющих структур языка == не знать самого языка, как мне кажется.
>Бьюсь об заклад, что Вам неизвестно, что else можно ставить сразу после окончания цикла for!
Это утверждение весьма спорно.
но не знать таких возможностей ключевых управляющих структур языка == не знать самого языка, как мне кажется.

Я вот про for...else и while...else, может, и знал, но точно не помнил. Потому что они, в отличие от try/except/else, не то чтобы часто нужны. Да, установить флаг и посмотреть после цикла его значение, конечно, часто случается, но как только он устанавливается по правилам чуть сложнее, чем «установить в False и выйти», так сразу эта конструкция не работает. Или другая ситуация: флаг-то установили, но это далеко не всегда означает, что не надо сделать ещё что-то в других итерациях.
Книги по теории читать сейчас немодно, намного выгодней сразу копипастить и быдлокодить!
Не пойму как это может быть неизвестно любому, кто пишет на python и прочитал хотя бы вводные материалы. Или это не принято в наше время? O_o
Для питон программиста это более чем очевидно, как букварь — docs.python.org/reference/index.html
Бьюсь об заклад, что Вам неизвестно, что else можно ставить сразу после окончания цикла for!
Проиграли. Много заложили? Кстати, зачем тут «вам» с большой? Вы не обращаетесь к конкретному лицу, перед вами аудитория читателей.
Кстати, зачем тут «вам» с большой? Вы не обращаетесь к конкретному лицу, перед вами аудитория читателей.

Спасибо за замечание, поправил.
Проиграли. Много заложили?

Эти остроты лучше будет адресовать автору оригинального текста. Я — всего лишь переводчик.
я рад, что этого нет в java))
Вот каждый раз как читаю «синтаксический сахар» — глаз спотыкается. Интересно, никого больше не раздражает это словосочетание?
Очень уж ГМО напоминает :)
И обе вещи крайне полезны!
ЗЫ. не стоит придираться к терминам, тем более это калька. Предложите лучше и если будет лучше то приживется
а я вот только не давно узнал, правда с топика на stackoverflow'e, там еще несколько интересных возможностей описано
ИЧСХ, три плашки: locked, closed as not constructive, protected.

Я ненавижу модераторов StackOverflow.
Использование else вместе с циклами мне очень понравилось в движке шаблонов Jinja 2. Например:
<ul>
{% for user in users %}
    <li>{{ user.username|e }}</li>
{% else %}
    <li><em>no users found</em></li>
{% endfor %}
</ul>

Как по мне, гораздо читабельнее, что проверка длины списка users. А если в users хранится генератор, то без else сильно туго придётся.
В Django такое-же поведение. Как-то более логичным кажется :)
Спасибо за статью. Я только начал изучение Пайтона, а до него четверть века программировал на разных языках, и такая фича действительно для меня приятная неожиданность. Все таки Пайтон — это сила.
НЛО прилетело и опубликовало эту надпись здесь
Насчёт оператора ?: в Python есть аналог ([1], PEP-308): A if B else C
Синтаксис выбрали в стиле Python: поменьше специальных символов и «Читаемость имеет значение».
В перле есть короткий «elsif» если что, собирайте в копилку ;)
Так вроде Марк Лутц описывал это всё очень подробно, не?
Настолько подробно, что многие боятся открывать его двухтомник :)
for person in people: 
    person.use(computer) 
    if computer.is_broken: 
        break 
else: 
    print 'The computer is fine!' 


Я сам не питонщик, но если правильно понял код, то почему print 'The computer is fine!'? Он же уже несовсем fine.
Попробуйте перечитать статью! else выполняется только если цикл отработал до конца.
Наоборот, else выполняется только если цикл до конца не отработал. Попробуйте перечитать статью! :)
Промахнулся, ответил ниже
Напрасно вы так поспешно заявляете! Всё таки прочитайте статью на досуге!
Бьюсь об заклад, что вам неизвестно, что else можно ставить сразу после окончания цикла for! Для чего, спросите вы? Когда элементы перебираемой последовательности будут исчерпаны, управление перейдет коду, находящемуся в блоке else
да, я уже разобрался, спасибо!
конечно, идея хорошая, но как-то оно неинтуитивно, мне кажется.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации