|
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
|
||||||||||||||||
Идея о новых опциях Python для циклов for и while10.07.2020, 19:04. Показов 1782. Ответов 28
В питоновских циклах for и while можно использовать ветвь else
Это может быть удобно в некоторых случаях. Но синтаксис неудачен - неудачно само использование слова else. Предлагаю обсудить другой синтаксис для данной цели, которого в Питоне пока нет, но который, по-моему, более нагляден. Сразу после цикла for или while можно писать специальный условный оператор
Этот оператор выглядит как обычный if, но отличие в условиях. В качестве условий может быть использовано одно из слов: break, pass или finally. Например: if break: - из цикла вышли оператором break if pass: - цикл не был выполнен ни разу if finally: - цикл был выполнен 0 или более раз (т.е. случай pass сюда тоже входит) Такой синтаксис более нагляден, не вступает в конфликт с существующим (потому что break, pass или finally сейчас не могут стоять после if\elif. Если написано только "else:", то это означает "if finally:" - этим обеспечивается совместимость с текущим синтаксисом. Но сильно ли это усложнит компилятор? Обычно грамматику строят так, чтобы достаточно было заглянуть на 1 токен вперед, чтобы понять, что это за конструкция. В данном случае, после обработки цикла компилятор увидит слово if, которое может означать просто обычный условный оператор. Но если после слова if стоит break, pass или finally, то это явно ветвь завершения цикла. Поэтому по одному слову после if можно сразу же догадаться, что это за конструкция. В предложенной выше конструкции finally включает pass, т.к. ИМХО учет случая "0 или более" полезней, чем "1 или более" и finally звучит корректней. Есть break - цикл насильно прервали, и есть finally - цикл не прерывали (это два исчерпывающих и взаимоисключающих случая, когда мы попадаем на оператор после цикла). Если нужно отличать случай, когда цикл не сработал, то можно начать так:
0
|
||||||||||||||||
| 10.07.2020, 19:04 | |
|
Ответы с готовыми решениями:
28
Организация циклов в языке Python
|
|
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
|
||||||
| 14.07.2020, 11:20 | ||||||
|
А чем вам такой вариант не угодил?
Единственный минус - лишний отступ из-за if items.
0
|
||||||
|
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
|
|
| 14.07.2020, 18:13 [ТС] | |
|
ioprst, можно и так сделать. Можно какие-то флажки (булевы переменные) ввести. Можно еще как-то.
Но с расширенным синтаксисом конструкции единообразны и касаются именно цикла, а не структуры, которую цикл обрабатывает. Да и в цикле while могут быть самые разные условия.
0
|
|
|
|
||
| 14.07.2020, 20:01 | ||
|
И тогда смысл становится самоочевидным. Использование же for else без break бессмысленно. И не надо ничего дополнительно усложнять. Само расширение циклов for\while уже выходит за рамки традиционной семантики циклов. Так что, обсуждайте, не обсуждайте - никому это не нужно и никогда не будет принято в разработку.
0
|
||
|
http://1248.site
|
||||||
| 14.07.2020, 20:09 | ||||||
|
зачем нужен стартовый if, логичней было бы просто дополнение к существующему else дерективами elif и конечно же вариантами pass break и д.р. т.к. стартовое условие уже имеется, да и просто возможность обычных условий было бы неплохо
1
|
||||||
|
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
|
||||||
| 14.07.2020, 20:26 [ТС] | ||||||
|
Garry Galler, Действительно, в документации пояснено, что цикл понимается, как "многократный if". Если условие выполнено, то выполняются указанные действия (тело цикла - соответствует ветке then у оператора if) и опять идет проверка условия. А если условие не выполняется, то тогда цикл превращается в обычный оператор if и у него выполняется ветка else. А break выскакивает из этого цикла (или "многократного if"), поэтому и ветка else пропускается.
Да, в этом есть какая-то логика. Но всё-таки, сопоставлять цикл и условный оператор как-то непривычно, поэтому и else после цикла выглядит непонятно. Такой синтаксис гораздо менее нагляден, чем оператор ветвления, поставленный после цикла, для разбора разных вариантов окончания этого цикла. Добавлено через 7 минут RinatV, А вот это интересное предложение, спасибо. Если вместо if писать elif, тогда сразу же (по одному токену) компилятор поймет, что это продолжение цикла, а не новый оператор. Правда "elif условие:" менее наглядно именно потому, что "непохоже на оператор ветвления после окончания цикла". Т.е. скорее похоже на какой-то цикл Дейкстры. Сравните с циклом Дейкстры из Оберон-7:
0
|
||||||
|
|
|||||||||||
| 14.07.2020, 21:01 | |||||||||||
|
TrueTerm,
Кстати, если не в курсе, обсуждение синтаксиса for..else уже было. 11 лет назад. Все закончилось решением оставить статус кво. Были предложения вида
Какой смысл вашего треда тогда?
1
|
|||||||||||
|
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
|
||
| 14.07.2020, 22:41 [ТС] | ||
|
Garry Galler, действительно не в курсе, спасибо.
Интересно, что "otherwise" похоже по смыслу (в английском языке) на слово "else". А семантика совсем разная: предложенный тогда "otherwise" означает "если цикл ни разу не выполнился", а нынешний "else:" значит "если цикл завершился без break" (в частности, может и совсем не выполнялся). И толкование otherwise в смысле "цикл пустой" гораздо яснее и нагляднее, чем "завершено без break". Нынешний "else" тоже хочется толковать так же. Возможно, отслеживание break посчитали более полезным, чем обнаружение пустого цикла, поэтому наглядностью пренебрегли. И правда, пустой цикл можно сразу же обнаружить по характеристикам обрабатываемой структуры данных или предварительной проверкой условия while. А вот break обычно выполняют на какой-то итерации, и заранее его предусмотреть нельзя. Добавлено через 40 минут О идея! Можно заявить, что самый первый elif расшифровывается как "end loop. if", а все остальные как обычно "else if".
0
|
||
|
|
|||
| 14.07.2020, 22:54 | |||
|
0
|
|||
| 14.07.2020, 22:54 | |
|
Помогаю со студенческими работами здесь
29
В Python написать программу и реализовать с использованием функции и циклов Дополнительное поле в опциях продукта Сканирование папок и копирование новых появившихся файлов на windows в python
Сумма товара при включенных опциях Opencart Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
|
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
|
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию.
2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
|
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
|
|
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO
Апнулись до NET10.
Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта
так и в интерактивном режиме. из сложностей - чисто функциональный подход.
Решил. . .
|
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2.
Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники".
В. . .
|
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии.
. . .
|
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
|