[Python] Зачем нужен else в for?
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.07.10 16:35
Оценка:
Народ, объясните мне, плиз, глубинную суть конструкции else применительно к циклам (foe, while). Причем не то как она работает, так как это я вроде понимаю, а то зачем она нужна на практике.

Правильно ли я понимаю, что в основном она нужна для поиска значений в коллекциях методом перебора?

Насколько часто данная возможность используется вами (реально пишущими на Питоне)?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: [Python] Зачем нужен else в for?
От: Temoto  
Дата: 26.07.10 16:57
Оценка: +2
VD>Народ, объясните мне, плиз, глубинную суть конструкции else применительно к циклам (foe, while). Причем не то как она работает, так как это я вроде понимаю, а то зачем она нужна на практике.

VD>Правильно ли я понимаю, что в основном она нужна для поиска значений в коллекциях методом перебора?


Нет, для поиска коллекций перебором у коллекций есть метод find. Она полезна для обработки отсутствия каких-то значений.

Вот хороший пример из жизни.

{% for item in news %}
  <div class=article>{{ item.title }}...
{% else %}
  <p class=info>Увышка, нет новостей.
{% endif %}


VD>Насколько часто данная возможность используется вами (реально пишущими на Питоне)?


Очень редко.
Re[2]: [Python] Зачем нужен else в for?
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.07.10 17:16
Оценка:
Здравствуйте, Temoto, Вы писали:

T>Нет, для поиска коллекций перебором у коллекций есть метод find. Она полезна для обработки отсутствия каких-то значений.


T>Вот хороший пример из жизни.


T>
T>{% for item in news %}
T>  <div class=article>{{ item.title }}...
T>{% else %}
T>  <p class=info>Увышка, нет новостей.
T>{% endif %}
T>


Я вижу ты и сам не используешь эту фичу, так как если бы использовал, то знал бы, что else вызывается всегда за искючением случая когда в теле цикла вызван оператор break. Так что твой псевдокод, если — это код на питоне (а не какой-то DSL типа движка рендеренга для веба) выведет и "<div..." и "<p...".

Собственно я согласен, что твоя интерпретация намного более интуитивно понятна и полезна на практике.

Но мне хочется понять зачем в Питон бала добавлена конструкция else для циклов в том виде в котором она описана в документации:

When the items are exhausted (which is immediately when the sequence is empty), the suite in the else clause, if present, is executed, and the loop terminates.

A break statement executed in the first suite terminates the loop without executing the else clause’s suite. A continue statement executed in the first suite skips the rest of the suite and continues with the next item, or with the else clause if there was no next item.


VD>>Насколько часто данная возможность используется вами (реально пишущими на Питоне)?


T>Очень редко.


Как я понимаю ты говоришь о DSL-ном варианте некого движка рендерера. Стало быть родной else вообще почти не используется?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: [Python] Зачем нужен else в for?
От: eugals Россия  
Дата: 26.07.10 17:16
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Правильно ли я понимаю, что в основном она нужна для поиска значений в коллекциях методом перебора?

"Коллекции" плохое слово. Поиск идет всё-таки по итераторам (в том числе генераторам).

VD>Насколько часто данная возможность используется вами (реально пишущими на Питоне)?

Достаточно часто, чтобы считать эту штуку удобной.
Re[2]: [Python] Зачем нужен else в for?
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.07.10 17:17
Оценка:
Здравствуйте, eugals, Вы писали:

VD>>Правильно ли я понимаю, что в основном она нужна для поиска значений в коллекциях методом перебора?

E>"Коллекции" плохое слово. Поиск идет всё-таки по итераторам (в том числе генераторам).

По фигу. Это к делу не относится. Пусть будут итераторы.

VD>>Насколько часто данная возможность используется вами (реально пишущими на Питоне)?

E>Достаточно часто, чтобы считать эту штуку удобной.

Можно примеры использования?

Используется ли эта фича для чего-то отличного от поиска перебором?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: [Python] Зачем нужен else в for?
От: Temoto  
Дата: 26.07.10 17:47
Оценка:
VD>Я вижу ты и сам не используешь эту фичу, так как если бы использовал, то знал бы, что else вызывается всегда за искючением случая когда в теле цикла вызван оператор break. Так что твой псевдокод, если — это код на питоне (а не какой-то DSL типа движка рендеренга для веба) выведет и "<div..." и "<p...".

Шаблонизатор, ага. И else у него отработает только в случае пустого цикла. Косяк, не совсем то.

VD>>>Насколько часто данная возможность используется вами (реально пишущими на Питоне)?


T>>Очень редко.


VD>Как я понимаю ты говоришь о DSL-ном варианте некого движка рендерера. Стало быть родной else вообще почти не используется?


Да. Было пару раз уместно именно его, но это по пальцам одной руки сосчитать за два года.

У меня был код, который идёт по набору правил авторизации и что-то делает, когда [else] все правила прошли и не вылетели раньше. Но с тем же успехом можно было вынести цикл в функцию и сделать return вместо break и другой return вместо else.

Вот try/else используется намного чаще.
Re[3]: [Python] Зачем нужен else в for?
От: eugals Россия  
Дата: 26.07.10 18:00
Оценка:
Здравствуйте, VladD2, Вы писали:

E>>"Коллекции" плохое слово. Поиск идет всё-таки по итераторам (в том числе генераторам).

VD>По фигу. Это к делу не относится. Пусть будут итераторы.
По-моему это важная разница, т.к. у коллекций можно предполагать теоретическое существование
"встроенных" средств поиска не "перебором".

VD>>>Насколько часто данная возможность используется вами (реально пишущими на Питоне)?

E>>Достаточно часто, чтобы считать эту штуку удобной.
VD>Используется ли эта фича для чего-то отличного от поиска перебором?
"Поиск" тоже плохое слова. Я бы заменил на "обработку".
Какие-нибудь операции по суммированию, аггрегированию и прочие вычисления метрик (частным случаем чего является поиск одного значения).


VD>Можно примеры использования?

Ну, например, мы идем по файлику конфигурации, парсим строчки и в зависимости от каких-то присутствующих внутри управляющих кодов
раскладываем получаемые параметры по заранее заготовленным регистрам. суммируем там что-то и т.п.
А в конце, если не было break-а, мы можем захотеть выполнить финализующее действие, полную валидацию там или ещё что.
Re[4]: [Python] Зачем нужен else в for?
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.07.10 18:03
Оценка:
Здравствуйте, Temoto, Вы писали:

T>Шаблонизатор, ага. И else у него отработает только в случае пустого цикла. Косяк, не совсем то.


Ну, это логично (и поведение, и место применения). Но я то вел речь о языковой фиче.

T>Да. Было пару раз уместно именно его, но это по пальцам одной руки сосчитать за два года.


Другими словами, если бы ты был дизайнером языка, то вряд ли ввел эту фичу в язык (ведь использовать ее приходится редко, а знать о ней надо всем)?

Кроме того, мне кажется, что название else не соответствует происходящему. Я по началу (интуитивно) понял else как "вместо", то есть точно так же как в том движке рендеренга о котором ты говоришь.

T>У меня был код, который идёт по набору правил авторизации и что-то делает, когда [else] все правила прошли и не вылетели раньше. Но с тем же успехом можно было вынести цикл в функцию и сделать return вместо break и другой return вместо else.


Но это требует некоторых телодвижений.

T>Вот try/else используется намного чаще.


Бесспорно. Тут else и по смыслу подходит, и вопросов не не вызвает.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: [Python] Зачем нужен else в for?
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.07.10 18:17
Оценка:
Здравствуйте, eugals, Вы писали:

E>По-моему это важная разница, т.к. у коллекций можно предполагать теоретическое существование

E>"встроенных" средств поиска не "перебором".

Это детали реализации.

E>"Поиск" тоже плохое слова. Я бы заменил на "обработку".

E>Какие-нибудь операции по суммированию, аггрегированию и прочие вычисления метрик (частным случаем чего является поиск одного значения).

Ага, вот только не ясно чем else в for помогает суммированию, аггрегированию (примеров я не видел пока). А главное, не ясно чем он лучше чем функции find/reduse/filter и т.п.

VD>>Можно примеры использования?

E>Ну, например, мы идем по файлику конфигурации, парсим строчки и в зависимости от каких-то присутствующих внутри управляющих кодов
E>раскладываем получаемые параметры по заранее заготовленным регистрам. суммируем там что-то и т.п.
E>А в конце, если не было break-а, мы можем захотеть выполнить финализующее действие, полную валидацию там или ещё что.

А что в таком случае символизирует break? И не лучше ли вместо него исключения задействовать, если он нештатную ситуацию обрабатывает?

Потом очень важно насколько подобные паттерн использования часто встречается. Если это 2-3 раза на огромную программу, то я бы предпочел не иметь подобной возможности в языке, а обойтись введением лишней переменной.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: [Python] Зачем нужен else в for?
От: eugals Россия  
Дата: 26.07.10 18:52
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>А что в таком случае символизирует break?

Ну, скажем какая-то синтаксическая ошибка. Или специальный управляющих код требующий прекращения обработки текущего
файла и перехода к следующему. Или достижение какого-то требуемого предела.
VD>И не лучше ли вместо него исключения задействовать, если он нештатную ситуацию обрабатывает?
Зависит от контекста. То, что является нештатной ситуацией для одного уровня программы, может быть вполне ожидаемым
поведением на другом. Например, синтаксическая ошибка для парсера это всё-таки не исключение, а один из ожидаемых
исходов. Надеюсь понятно что я имею в виду. На этот счет (где нужны исключения, а где нет) было несколько длинных тредов в Филосифии, насколько я помню.
У меня нет настроения начинать ещё один, честно говоря.

VD>Потом очень важно насколько подобные паттерн использования часто встречается.

Ну, понятно, что не повсеместно.
VD>Если это 2-3 раза на огромную программу, то я бы предпочел не иметь подобной возможности в языке, а обойтись введением лишней переменной.
Смотря что за программа. Если ваша программа состоит из набора скриптов, которые предназначены для
обработки и загрузки в БД поступащих извне файлов специфических форматов, то там таких кострукций будет в несколько раз больше, чем 2-3.
Хотя, конечно, можно и без этой конструкции обойтись.

Лично я не считаю, что она мешает в Питоне, но и в случае её исчезновения не сказать, что буду сильно страдать.
Так, иногда скучал бы... Всё-таки это одна из тех мелких необязательных фишек, которые делают процесс
повседневного кодирования чуточку ярче
Re[6]: [Python] Зачем нужен else в for?
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.07.10 19:12
Оценка:
Здравствуйте, eugals, Вы писали:

VD>>А что в таком случае символизирует break?

E>Ну, скажем какая-то синтаксическая ошибка. Или специальный управляющих код требующий прекращения обработки текущего
E>файла и перехода к следующему. Или достижение какого-то требуемого предела.

Тогда сам бок велел или использовать исключения, или попросту поднять флаг "ошибка" (или добавить ошибку в некий список). Тогда в конце обработки можно будет проверить есть ли ошибки и в случае их отсутствия сделать нужную работу.

VD>>И не лучше ли вместо него исключения задействовать, если он нештатную ситуацию обрабатывает?

E>Зависит от контекста. То, что является нештатной ситуацией для одного уровня программы, может быть вполне ожидаемым
E>поведением на другом.

Согласен, но для обработки штатной ошибки флаги подходят лучше. Видно что просходитк.
Посему твой пример скорее гипотетический нежели из реальной практики.

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

E>Лично я не считаю, что она мешает в Питоне, но и в случае её исчезновения не сказать, что буду сильно страдать.


Ага. Спасибо! Вот именно это мне и нужно было узнать.

E>Так, иногда скучал бы... Всё-таки это одна из тех мелких необязательных фишек, которые делают процесс

E>повседневного кодирования чуточку ярче

К сожалению — это и одна и сторон которая делает язык чуточку сложнее для изучения. По сему это палка о двух концах.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: [Python] Зачем нужен else в for?
От: eugals Россия  
Дата: 26.07.10 19:58
Оценка: 46 (1)
Здравствуйте, VladD2, Вы писали:

VD>Насколько часто данная возможность используется вами (реально пишущими на Питоне)?

Вот тут нашел обсуждение этой конструкции с участием Гвидо и некоторых других отцов Питона.
(стартовая тема не совсем про то, но там ниже по треду можно найти).
В частности, сам Гвидо говорит, что:

I even wonder if else-clauses on for/while were a good idea. (The one
on try is definitely a good idea since the use case is quite frequent
and only clumsily handled otherwise; the use cases for else on
for/while are less convincing IMO.)

Re[2]: [Python] Зачем нужен else в for?
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.07.10 20:56
Оценка: :)
Здравствуйте, eugals, Вы писали:

E>(стартовая тема не совсем про то, но там ниже по треду можно найти).

E>В частности, сам Гвидо говорит, что:
E>

I even wonder if else-clauses on for/while were a good idea. (The one
E>on try is definitely a good idea since the use case is quite frequent
E>and only clumsily handled otherwise; the use cases for else on
E>for/while are less convincing IMO.)


А самих "use cases for else" там нигде не приводится? А то у меня складывается ровно противоположенное мнение о них. Сдается мне, что как раз они редки и без них не так уж и неуклюже.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: [Python] Зачем нужен else в for?
От: neFormal Россия  
Дата: 26.07.10 21:15
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Другими словами, если бы ты был дизайнером языка, то вряд ли ввел эту фичу в язык (ведь использовать ее приходится редко, а знать о ней надо всем)?


правда что ли?.
если не знать, то случится нечто непоправимое?. фича есть, кушать не просит..
...coding for chaos...
Re[6]: [Python] Зачем нужен else в for?
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.07.10 22:59
Оценка:
Здравствуйте, neFormal, Вы писали:

VD>>Другими словами, если бы ты был дизайнером языка, то вряд ли ввел эту фичу в язык (ведь использовать ее приходится редко, а знать о ней надо всем)?


F>правда что ли?.

F>если не знать, то случится нечто непоправимое?. фича есть, кушать не просит..

Уважаемый. У тебя проблема со знаками припоминания? Или причина в культуре-мультуре общения подталкивающая позволяющей отвечать на вопросы вопросами?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: [Python] Зачем нужен else в for?
От: neFormal Россия  
Дата: 27.07.10 02:29
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>>>(ведь использовать ее приходится редко, а знать о ней надо всем)?

F>>правда что ли?.
F>>если не знать, то случится нечто непоправимое?. фича есть, кушать не просит..
VD>Или причина в культуре-мультуре общения подталкивающая позволяющей отвечать на вопросы вопросами?

хорошо, значит так ^

VD>Уважаемый. У тебя проблема со знаками припоминания?

VD>подталкивающая позволяющей

...coding for chaos...
Re[3]: [Python] Зачем нужен else в for?
От: FR  
Дата: 27.07.10 04:10
Оценка: 46 (1)
Здравствуйте, VladD2, Вы писали:


VD>Я вижу ты и сам не используешь эту фичу, так как если бы использовал, то знал бы, что else вызывается всегда за искючением случая когда в теле цикла вызван оператор break. Так что твой псевдокод, если — это код на питоне (а не какой-то DSL типа движка рендеренга для веба) выведет и "<div..." и "<p...".


Вообще фича сделана антиинтуитивно, я вот всегда путаю что и когда вызывается

VD>Стало быть родной else вообще почти не используется?


Очень редко.
Хотя видел раз код маньяка этой фичи, долго его курил
Re[3]: [Python] Зачем нужен else в for?
От: c-smile Канада http://terrainformatica.com
Дата: 27.07.10 05:10
Оценка: 3 (1)
Здравствуйте, VladD2, Вы писали:

VD>А самих "use cases for else" там нигде не приводится? А то у меня складывается ровно противоположенное мнение о них. Сдается мне, что как раз они редки и без них не так уж и неуклюже.


for( var ... in ...) ... otherwise ...;

(в моем случае) имеет смысл именно для случая for( var ... in ...) что есть перебор последовтельности с пом. итераторов/генераторов — т.е. когда длина последовательности неизвестна заранее.
Для переборов реальных коллекций как правило есть достаточно дешевые способы сказать нечто типа этого:
if( arr.length )
  for ( var el in arr ) ...
else
  ...;


Заведение счетчиков-флагов:
  var count = 0;
  for ( var el in arr )
  {
    ++count; 
    ...
  }
  if(!count)
    ...

не так эффективно да и некрасиво. Ну т.е. это есть соль и перец по вкусу.
Собственно обязательными являются if и goto. Все остальное — баловство:

Вкусовые добавки к пище, а также припра́вы, специи (англ. spice) — химические вещества, отдельные части биологических продуктов растительного происхождения и их смеси, предназначенные для улучшения вкусовых и ароматических качеств приготавливаемых продуктов питания и готовых блюд.
Вкусовые добавки могут способствовать улучшению переваривания и усвоения пищи, а также возможности её длительного хранения.

но как-то без них не интересно.
Re[5]: [Python] Зачем нужен else в for?
От: Temoto  
Дата: 27.07.10 08:02
Оценка: +1
T>>Да. Было пару раз уместно именно его, но это по пальцам одной руки сосчитать за два года.

VD>Другими словами, если бы ты был дизайнером языка, то вряд ли ввел эту фичу в язык (ведь использовать ее приходится редко, а знать о ней надо всем)?


VD>Кроме того, мне кажется, что название else не соответствует происходящему. Я по началу (интуитивно) понял else как "вместо", то есть точно так же как в том движке рендеренга о котором ты говоришь.


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

У тебя в Nemerle это ведь можно сделать макросом, правильно? Я не думаю, что о каждом мелком синтаксическом расширении знать надо всем.
Re[4]: [Python] Зачем нужен else в for?
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.07.10 14:23
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, VladD2, Вы писали:



VD>>Я вижу ты и сам не используешь эту фичу, так как если бы использовал, то знал бы, что else вызывается всегда за искючением случая когда в теле цикла вызван оператор break. Так что твой псевдокод, если — это код на питоне (а не какой-то DSL типа движка рендеренга для веба) выведет и "<div..." и "<p...".


FR>Вообще фича сделана антиинтуитивно, я вот всегда путаю что и когда вызывается


В языке или в упоминаемом движке рендеренга?

VD>>Стало быть родной else вообще почти не используется?


FR>Очень редко.

FR>Хотя видел раз код маньяка этой фичи, долго его курил

Ясно. Спасибо. Именно это мне и было интересно. Просто "у нас" тоже хотят такое прекрутить, а мне как раз кажется, что такое поведение антиинтуитивно (с)
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: [Python] Зачем нужен else в for?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 27.07.10 14:27
Оценка: +1
Здравствуйте, neFormal, Вы писали:

F>если не знать, то случится нечто непоправимое?. фича есть, кушать не просит..


Лишний член --- жопе непонятка. Ну и синтаксис у этой фичи какой-то неубедительный, не на 100% понятный интуитивно.
Re[4]: [Python] Зачем нужен else в for?
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.07.10 14:33
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, VladD2, Вы писали:


VD>>А самих "use cases for else" там нигде не приводится? А то у меня складывается ровно противоположенное мнение о них. Сдается мне, что как раз они редки и без них не так уж и неуклюже.


CS>
CS>for( var ... in ...) ... otherwise ...;
CS>

CS>(в моем случае) имеет смысл именно для случая for( var ... in ...) что есть перебор последовтельности с пом. итераторов/генераторов — т.е. когда длина последовательности неизвестна заранее.
CS>Для переборов реальных коллекций как правило есть достаточно дешевые способы сказать нечто типа этого:
CS>
CS>if( arr.length )
CS>  for ( var el in arr ) ...
CS>else
CS>  ...; 
CS>


Я вижу ты тоже не знаешь как работает for/else в питоне. Питоновская версия for/else-а аналогична вот такому коду:

isBreakerd = false;

for el in arr:
  ...
  if something:
    isBreakerd = true;
    break
  ...
    
if isBreakerd: ... # выполняем else-действия


А то что демонстрируешь ты к питону не имеет никакого отношения.
Меня же интересует именно питоновское поведение (которое мне каежся не интуитивным).

CS>Заведение счетчиков-флагов:

CS>
CS>  var count = 0;
CS>  for ( var el in arr )
CS>  {
CS>    ++count; 
CS>    ...
CS>  }
CS>  if(!count)
CS>    ...
CS>

CS>не так эффективно да и некрасиво.

Ага. И к делу не имеет никакого отношения .
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: [Python] Зачем нужен else в for?
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.07.10 14:43
Оценка:
Здравствуйте, Temoto, Вы писали:

T>Если бы я был дизайнером языка, то сделал бы else как в шаблонизаторе, для случая пустого списка.


T>У тебя в Nemerle это ведь можно сделать макросом, правильно? Я не думаю, что о каждом мелком синтаксическом расширении знать надо всем.


Собственно я сюда и полез потому как в немерле это сделали макросом. Но по началу сделали по наитию, и получилось именно как в шаблонизаторе. Против этого я ничего не имел. Разве что не видел в этом реальной необходимости.

В комите было написано Add foreach..else macro. (<b>Same as for..else in Python</b>)..
Но потому пришел другой уважаемый товарищ и справедливо заметил
Автор: Иванков Дмитрий
Дата: 26.07.10
, что реализованное поведение не соответствует заявленному (т.е. тому что есть в Питоне). После чего автор макры сказал, что Доделать не сложно
Автор: _nn_
Дата: 26.07.10
.

Так вот у меня зародилось смутное сомнение в том, что это вообще надо. Мне все больше и больше кажется, что фича (по крайней мере в питоновском виде) совершенно надуманная, по крайней мере в контексте Немерла. Вот я и решил узнать мнение людей реально использующих Питон на практике.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: [Python] Зачем нужен else в for?
От: Temoto  
Дата: 27.07.10 14:44
Оценка: +2
VD>Я вижу ты тоже не знаешь как работает for/else в питоне. Питоновская версия for/else-а аналогична вот такому коду:

VD>
VD>isBreakerd = false;

VD>for el in arr:
VD>  ...
VD>  if something:
VD>    isBreakerd = true;
VD>    break
VD>  ...
    
VD>if isBreakerd: ... # выполняем else-действия
VD>


if not isBreakerd: ...
Re[7]: [Python] Зачем нужен else в for?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 27.07.10 14:46
Оценка:
Здравствуйте, VladD2, Вы писали:

E>>Лично я не считаю, что она мешает в Питоне, но и в случае её исчезновения не сказать, что буду сильно страдать.


VD>Ага. Спасибо! Вот именно это мне и нужно было узнать.


E>>Так, иногда скучал бы... Всё-таки это одна из тех мелких необязательных фишек, которые делают процесс

E>>повседневного кодирования чуточку ярче

VD>К сожалению — это и одна и сторон которая делает язык чуточку сложнее для изучения. По сему это палка о двух концах.


Если честно, то в данном вопросе мне больше нравится методы литературного программирования. Вместо того, чтобы плодить разные конструкции (c целью избежать goto и/или лишней заморочки с флашами) и думать, как из обозвать, я могу записать примерно так

@ Общая схема чтения конфигурационного файла

@d config_file_error = goto config_file_error_label

@<Чтение конфигурационного файла@> =
  foreach item in Configuration file { Типа псевдокода }
    @<Обрабатываем строку конфигурационного файла@>

  @<Последние штрихи к обработке@>
  goto finalization;

  config_file_error_label:
    @<Обработка случая, когда в конфигурационном файле найдена ошибка@>
    goto finalization; 

  finalization:
    <@Финализируем обработку файла@>
    
@ Обработка одной строки конфигурационного файла

@<Обрабатываем строку конфигурационного файла@> =
  код...
Re[2]: [Python] Зачем нужен else в for?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 27.07.10 14:57
Оценка:
Здравствуйте, eugals, Вы писали:

E>

I even wonder if else-clauses on for/while were a good idea. (The one
E>on try is definitely a good idea since the use case is quite frequent
E>and only clumsily handled otherwise; the use cases for else on
E>for/while are less convincing IMO.)


Все равно название не очень хорошее. Лучше тогда

  foreach a in B
    ...
  on break
    ...
Re[7]: [Python] Зачем нужен else в for?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 27.07.10 15:33
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Так вот у меня зародилось смутное сомнение в том, что это вообще надо. Мне все больше и больше кажется, что фича (по крайней мере в питоновском виде) совершенно

надуманная, по крайней мере в контексте Немерла. Вот я и решил узнать мнение людей реально использующих Питон на практике.

Как по мне, общее развитие ситуации такое: много лет назад Дейкстра заклеймил goto. В результате структурное программирование без использования goto пошло в массы. Потом, однако, выяснилось, что несмотря на то, что любой код с использованием goto можно переписать без использования оного, но в ряде случае это приводит к лишнему геморрою и запутыванию в виде дубрирования кода или введения хитрых флажков. Поэтому началось медленное движение в направлении того, чтобы формализовать часто используемые goto в виде новых конструкций языка. Таким образом, вроде как и не goto Поэтому появились всякие break и continue, потом именованные циклы. Ну и вот сейчас очередной пример в Питоне, может и с не совсем удачным названием.

Если говорить обо мне, то код в перед break таки действительно часто дублируется, причем дело сводится буквально к одному-двум операторам. Для таких случаем вводить флаг нелепо, поэтому код просто дублируется. Так что, случаи, когда такая конструкция может быть удобной, есть (хотя я и не пишу усиленно на питоне).

Но если говорить о Nemerle, то было бы уместнее реализовать какой-то более общий случай.

Например, первое что пришло в голову:

  statemachine TestStatemachine entry MainForeach
  {
    var Common: int;

    situation MainForeach onexit NormalXXXHandling:
      foreach(x in XXX)
      {
        if (Something) goto LoopFailture("Something wrong");
        // ...
      }

    situation final NormalXXXHandling final:
      Console.Print("XXX has beenhandled!");

    situation final LoopFailture(Msg: string):
      Console.Print("something wrong! {1}", Msg);

    // А сюда можно добавить стандартные обработчики, например

    situation SituationChanged(S1, S2):
      Console.Print("State was switched {1} => {2}", S1, S2);

    situation final ExceptionOccured(E):
      Console.Print("Exception {1}", E.Msg);
      
  }

  // Сюда же интересно было бы добавить waitevent
Re[5]: [Python] Зачем нужен else в for?
От: c-smile Канада http://terrainformatica.com
Дата: 27.07.10 16:29
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Я вижу ты тоже не знаешь как работает for/else в питоне. Питоновская версия for/else-а аналогична вот такому коду:


Да, я достоверно не знаю как работает for/else в Питоне.
Зато я знаю как for(in)otherwise будет работать в TIScript:
otherwise часть выполняется в том случае если тело цикла ни разу не исполнилось. И все.
Это я считаю концептуально более правильным и полезным. Никаких там break и прочая — все просто.

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

VD>А то что демонстрируешь ты к питону не имеет никакого отношения.

VD>Меня же интересует именно питоновское поведение (которое мне каежся не интуитивным).

Я же тебе и отвечаю. Только на своем примере который мне кажется более интуитивным.
Re[8]: [Python] Зачем нужен else в for?
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.07.10 16:32
Оценка:
Здравствуйте, Mystic, Вы писали:

M>Но если говорить о Nemerle, то было бы уместнее реализовать какой-то более общий случай.


У немерла нет проблем с выходом из циклов и т.п. В нем есть конструкция "Именованный блок". Выгдядит это так:
namedBlock :
{
  foreach (x in xs)
    foreach (y in xs)
      foreach (z in xs)
      {
         ...
         when (cond)
            namedBlock(x + y + z);
      }
}

И даже эта возможность напрямую почти не используется почему-то.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: [Python] Зачем нужен else в for?
От: neFormal Россия  
Дата: 27.07.10 17:57
Оценка:
Здравствуйте, Mystic, Вы писали:

F>>если не знать, то случится нечто непоправимое?. фича есть, кушать не просит..

M>Лишний член --- жопе непонятка. Ну и синтаксис у этой фичи какой-то неубедительный, не на 100% понятный интуитивно.

даже не знаю, чего тут неинтуитивного..
для x из X:
  сделать что то
иначе:
  сделать что то другое


редкоиспользуемая, но всё же удобная фича..
...coding for chaos...
Re[3]: [Python] Зачем нужен else в for?
От: neFormal Россия  
Дата: 27.07.10 17:58
Оценка:
Здравствуйте, Mystic, Вы писали:

E>>

I even wonder if else-clauses on for/while were a good idea. (The one
E>>on try is definitely a good idea since the use case is quite frequent
E>>and only clumsily handled otherwise; the use cases for else on
E>>for/while are less convincing IMO.)

M>Все равно название не очень хорошее. Лучше тогда
M>
M>  foreach a in B
M>    ...
M>  on break
M>    ...
M>


"on break", судя по названию, не идентичен по поведению "else" в питоне..
...coding for chaos...
Re[8]: [Python] Зачем нужен else в for?
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.07.10 21:07
Оценка: +1
Здравствуйте, neFormal, Вы писали:

F>даже не знаю, чего тут неинтуитивного..

F>
F>для x из X:
F>  сделать что то
F>иначе:
F>  сделать что то другое
F>


Ты в курсе, что "иначе:" выполняется всегда если только в теле цикла нет break?

Вся суть заключается в том, что это не "иначе", а "после успешного завершения".
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: [Python] Зачем нужен else в for?
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.07.10 21:09
Оценка:
Здравствуйте, Mystic, Вы писали:

M>Все равно название не очень хорошее. Лучше тогда


M>
M>  foreach a in B
M>    ...
M>  on break
M>    ...
M>


Ага. Только не "on break", а "when not break" что ли. В общем, явная закладка на какой-то частный паттерн использования .
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: [Python] Зачем нужен else в for?
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.07.10 21:10
Оценка:
Здравствуйте, neFormal, Вы писали:

F>"on break", судя по названию, не идентичен по поведению "else" в питоне..


Именно что идентичен, только с точностью до наоборот "else" в Питоне == "если не прервали". Именно о нелогичности этого я и говорил.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: [Python] Зачем нужен else в for?
От: neFormal Россия  
Дата: 27.07.10 21:22
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Ты в курсе, что "иначе:" выполняется всегда если только в теле цикла нет break?


ну да.. как бы я использую этот язык..

VD>Вся суть заключается в том, что это не "иначе", а "после успешного завершения".


если есть что перебирать:
  перебираем
иначе:
  пишем коммент на кывт
...coding for chaos...
Re[5]: [Python] Зачем нужен else в for?
От: neFormal Россия  
Дата: 27.07.10 21:27
Оценка:
Здравствуйте, VladD2, Вы писали:

F>>"on break", судя по названию, не идентичен по поведению "else" в питоне..

VD>Именно что идентичен, только с точностью до наоборот



VD>"else" в Питоне == "если не прервали". Именно о нелогичности этого я и говорил.


вариант "если прервали" тоже бы не особо то логичен был.. в таком варианте смысла даже нет.. как, впрочем, и во всём этом споре..
...coding for chaos...
Re[5]: [Python] Зачем нужен else в for?
От: FR  
Дата: 28.07.10 04:26
Оценка:
Здравствуйте, VladD2, Вы писали:

FR>>Вообще фича сделана антиинтуитивно, я вот всегда путаю что и когда вызывается


VD>В языке или в упоминаемом движке рендеренга?


В языке конечно, я этого движка не видел.


VD>Ясно. Спасибо. Именно это мне и было интересно. Просто "у нас" тоже хотят такое прекрутить, а мне как раз кажется, что такое поведение антиинтуитивно (с)


Тут такое дело мне например и многим другим это кажется пятой ногой, но есть люди которые с такой фичи почему-то сильно тащатся
В общем прикрутить можно, но ключевое слово else лучше заменить чем-то более внятным.
Re[5]: [Python] Зачем нужен else в for?
От: FR  
Дата: 28.07.10 04:42
Оценка: :)))
Здравствуйте, VladD2, Вы писали:

VD>Именно что идентичен, только с точностью до наоборот "else" в Питоне == "если не прервали". Именно о нелогичности этого я и говорил.


Предлагаю else переименовать в "ну на посошок"
Re[6]: [Python] Зачем нужен else в for?
От: c-smile Канада http://terrainformatica.com
Дата: 28.07.10 06:44
Оценка:
Здравствуйте, Temoto, Вы писали:

T>
if not isBreakerd: ...


Ну блин как серпом ...

Короче: break/broke/broken — такой вот неправильный глагол весь из себя.

А то что Влад пытался изобразить звучит как if not breakGotten ...

Звыняйте за оффтопик.
Re[6]: [Python] Зачем нужен else в for?
От: neFormal Россия  
Дата: 28.07.10 08:19
Оценка: :)
Здравствуйте, FR, Вы писали:

FR>Тут такое дело мне например и многим другим это кажется пятой ногой, но есть люди которые с такой фичи почему-то сильно тащатся


понимаешь, вот сидишь ты пишешь свой быдлокод, нужно тебе что-то.. и тут ВДРУГ!!1 это что-то оказывается уже реализованным в языке..
ты дописываешь кусок кода, откидываешься на спинку кресла, закуриваешь, и тебе хорошо-хорошо.. ^_^
...coding for chaos...
Re[6]: [Python] Зачем нужен else в for?
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.07.10 13:52
Оценка:
Здравствуйте, FR, Вы писали:

FR>Тут такое дело мне например и многим другим это кажется пятой ногой, но есть люди которые с такой фичи почему-то сильно тащатся

FR>В общем прикрутить можно, но ключевое слово else лучше заменить чем-то более внятным.

В общем, в немерле пока что решили сделать otherwise который вызывается в случае если тело цикла не выполнялось ни разу. Поглядим как использоваться будет. Если не будут, то вообще выкинем.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: [Python] Зачем нужен else в for?
От: FR  
Дата: 28.07.10 14:52
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>В общем, в немерле пока что решили сделать otherwise который вызывается в случае если тело цикла не выполнялось ни разу. Поглядим как использоваться будет. Если не будут, то вообще выкинем.


Такой вариант думаю будут намного больше людей использовать.
Re[8]: [Python] Зачем нужен else в for?
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.07.10 14:55
Оценка:
Здравствуйте, FR, Вы писали:

VD>>В общем, в немерле пока что решили сделать otherwise который вызывается в случае если тело цикла не выполнялось ни разу. Поглядим как использоваться будет. Если не будут, то вообще выкинем.


FR>Такой вариант думаю будут намного больше людей использовать.


Посмотрим.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: [Python] Зачем нужен else в for?
От: Abyx Россия  
Дата: 09.08.10 12:34
Оценка: 68 (4)
Использовал for-else в следующем коде, очень понравилось.
    for i in range(3, srvCount * srvStruct.size, srvStruct.size):
        id_, gsIp, gsPort, isOn = srvStruct.unpack_from(serverListData, i)
        if id_ == gsId:
            if isOn:
                break
            return SERVER_IS_OFFLINE
    else:
        return SERVER_NOT_FOUND + gsId


В большинстве языков break прыгает сразу за концом цикла, чтобы выполнить какой-то код если не был выполнен break, надо либо заменять break на goto, либо вводить переменную флаг.
Использовать функции типа find() не всегда удобно — иногда проще применить цикл, чем делать обертку-итератор и лямбда функцию.
В таких случаях для поиска удобнее
for|while — break — else
чем
for|while — goto — label:
или
flag=0; for|while — flag=1; break — if !flag
In Zen We Trust
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.