[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>Хотя видел раз код маньяка этой фичи, долго его курил

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