Комментарии 52
Я думаю эти варианты использования известны всем кто программирует на Python. Неизвестны они лишь для тех кто только пробует использовать Python и пишет в стилистике Java / C#.
+20
Я знаю одного мужчину, друг которого не знал. =) А если серьёзно, то новички скажут спасибо.
+28
Ну, я Python года полтора-два назад изучать начал. Похоже, что эти варианты использования else я тогда пропустил мимо ушей, так как за прошедшее время я к Python'у несколько раз возвращался, кой-чего на нем писал, но про них узнал только сегодня. :)
0
Вот последнее время немного Python'ю. Зарабатываю деньги себе на C#/Java/PHP. Про интересные варианты использования else не слышал. Спасибо.
+1
когда я первый раз увидел for… else, то всё же ожидал, что else исполняется если цикл не сделал ни одной итерации — имхо это куда более ожидаемое поведение
+25
Это было бы как раз неожиданным поведением. Ведь по существу в Питоне цикл for это try...except блок, в котором внутри while True: происходит последовательный вызов iterator.__next__(), а перехватывается исключение StopIteration. Команда break, как и положено, выкидывает из блока try/except/else, выполняя только содержимое блока finally. То есть всё по уму — содержимое else в for...else выполняется всегда, кроме случая явного вызова break (ну или ещё снаружи try...except навесили).
+1
вот же ж как оно ж… что можно сделать из простого while… навесить исключениев, перехватчиков и потом думай-гадай, что ж оно делает на самом деле.
еще в школе учили, что break == goto, а goto == попа
а тут не только break, да еще все, что написано чуть выше, прям винегрет.
и оно еще и работает?! :))
еще в школе учили, что break == goto, а goto == попа
а тут не только break, да еще все, что написано чуть выше, прям винегрет.
и оно еще и работает?! :))
-11
Плохо вас в школе учили, break как раз и придумали как замену goto
+2
О, да, какой же я тупой…
Брейк это явный переход к метке за пределом цикла если что.
Это не goto наверное… нет, что вы, совсем нет!
Брейк это явный переход к метке за пределом цикла если что.
Это не goto наверное… нет, что вы, совсем нет!
0
Но я в самом деле даже не против правильно использованного goto, и совсем не против break, который и хотели сделать как правильный goto. Но обертка этого всего в обработку исключений как штатного прекращения цикла — это для меня нонсенс.
-2
switch тогда еще больший goto. А switch в С больший goto чем в Pascal, например :)
Goto никуда не делся, его просто припрятали в другие конструкции
Goto никуда не делся, его просто припрятали в другие конструкции
0
Это всё должен знать человек, который «первый раз увидел for… else»?
+8
Cудя по всему теперь оно так… если раньше я как-то думал, что цикл выглядит примерно как в асме и там все соптимизировано до предела, то перерь оказывается все разоптимизировано, что фиг поймешь, где надо экономить, а где нет; где раньше был проверенный код, теперь при простом переводе на другой язык программирования настолько все внутри усложняется, что делается как-то нехорошо :( одно выбрасывание исключений чего стоит — это же раскрутка стека и прочие накладные расходы.
Вобщем-то этот, казалось бы невинный, комментарий, как оно внутри устроено, вот так враз поменял мое мнение о питоне.
Вобщем-то этот, казалось бы невинный, комментарий, как оно внутри устроено, вот так враз поменял мое мнение о питоне.
+2
Суть питона как раз в том что на мелочах можно не экономить ради удобства программиста. Для экономии пишут на более низкоуровневых языках.
0
Просто для справки: исключения в Питоне работают быстро, потому что всё происходит внутри интерпретатора.
0
Вот мне тоже такое поведение кажется единственно возможным.
Else = иначе. Выполни такой-то блок кода, а иначе (если не получилось) — выполни секцию else. В писоне же получается «выполни и тело цикла, и блок else» — че за бред?
Else = иначе. Выполни такой-то блок кода, а иначе (если не получилось) — выполни секцию else. В писоне же получается «выполни и тело цикла, и блок else» — че за бред?
+1
Честно говоря, я не нашел особой пользы от применения оператора else вне связки с if.
А я считаю, что в большинстве случаев следует использовать его вместе с операторами циклов, так как получающиеся конструкции являются интуитивными (осмысленными), поскольку связаны с выходом по оператору break из цикла.
Для начинающих писать на Python статья очень полезная.
А я считаю, что в большинстве случаев следует использовать его вместе с операторами циклов, так как получающиеся конструкции являются интуитивными (осмысленными), поскольку связаны с выходом по оператору break из цикла.
Для начинающих писать на Python статья очень полезная.
-3
Хм, согласно предыдущему комментарию это совсе-совсем неочевидно с точностью до наоборот. Так что лично мое мнение — вообще не использовать такие конструкции, которые могут так двояко толковаться — от греха подальше.
+8
Во всех манах по питону которые я читал использование else с for и прочими были описаны если не в первых страницах, то в первой главе точно.
+1
Совершенно верно.
Я понимаю, из-за недостатка опыта можно недостаточно свободно ориентироваться в стандартной библиотеке или в более продвинутых возможностях, но не знать таких возможностей ключевых управляющих структур языка == не знать самого языка, как мне кажется.
>Бьюсь об заклад, что Вам неизвестно, что else можно ставить сразу после окончания цикла for!
Это утверждение весьма спорно.
Я понимаю, из-за недостатка опыта можно недостаточно свободно ориентироваться в стандартной библиотеке или в более продвинутых возможностях, но не знать таких возможностей ключевых управляющих структур языка == не знать самого языка, как мне кажется.
>Бьюсь об заклад, что Вам неизвестно, что else можно ставить сразу после окончания цикла for!
Это утверждение весьма спорно.
+2
но не знать таких возможностей ключевых управляющих структур языка == не знать самого языка, как мне кажется.
Я вот про for...else и while...else, может, и знал, но точно не помнил. Потому что они, в отличие от try/except/else, не то чтобы часто нужны. Да, установить флаг и посмотреть после цикла его значение, конечно, часто случается, но как только он устанавливается по правилам чуть сложнее, чем «установить в False и выйти», так сразу эта конструкция не работает. Или другая ситуация: флаг-то установили, но это далеко не всегда означает, что не надо сделать ещё что-то в других итерациях.
+1
Книги по теории читать сейчас немодно, намного выгодней сразу копипастить и быдлокодить!
0
Не пойму как это может быть неизвестно любому, кто пишет на python и прочитал хотя бы вводные материалы. Или это не принято в наше время? O_o
+3
Для питон программиста это более чем очевидно, как букварь — docs.python.org/reference/index.html
0
Бьюсь об заклад, что Вам неизвестно, что else можно ставить сразу после окончания цикла for!Проиграли. Много заложили? Кстати, зачем тут «вам» с большой? Вы не обращаетесь к конкретному лицу, перед вами аудитория читателей.
+4
Кстати, зачем тут «вам» с большой? Вы не обращаетесь к конкретному лицу, перед вами аудитория читателей.
Спасибо за замечание, поправил.
Проиграли. Много заложили?
Эти остроты лучше будет адресовать автору оригинального текста. Я — всего лишь переводчик.
+1
я рад, что этого нет в java))
+1
Вот каждый раз как читаю «синтаксический сахар» — глаз спотыкается. Интересно, никого больше не раздражает это словосочетание?
-1
а я вот только не давно узнал, правда с топика на stackoverflow'e, там еще несколько интересных возможностей описано
0
Использование
Как по мне, гораздо читабельнее, что проверка длины списка
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
сильно туго придётся.+2
Спасибо за статью. Я только начал изучение Пайтона, а до него четверть века программировал на разных языках, и такая фича действительно для меня приятная неожиданность. Все таки Пайтон — это сила.
0
НЛО прилетело и опубликовало эту надпись здесь
Так вроде Марк Лутц описывал это всё очень подробно, не?
0
for person in people:
person.use(computer)
if computer.is_broken:
break
else:
print 'The computer is fine!'
Я сам не питонщик, но если правильно понял код, то почему print 'The computer is fine!'? Он же уже несовсем fine.
0
Напрасно вы так поспешно заявляете! Всё таки прочитайте статью на досуге!
Бьюсь об заклад, что вам неизвестно, что else можно ставить сразу после окончания цикла for! Для чего, спросите вы? Когда элементы перебираемой последовательности будут исчерпаны, управление перейдет коду, находящемуся в блоке else
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Прочие варианты использования оператора else