Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447

Идея о новых опциях Python для циклов for и while

10.07.2020, 19:04. Показов 1782. Ответов 28

Студворк — интернет-сервис помощи студентам
В питоновских циклах for и while можно использовать ветвь else
Python
1
2
3
4
5
6
7
8
9
10
11
 for ... in ...
     ...
     break  
else:
    #действия, при нормальном выходе из цикла (break не сработал)
#########################################3
while ...
    ...
    break
else:
    #действия, при нормальном выходе из цикла (break не сработал)
Действия после else выполняются, если из цикла вышли по исчерпании диапазона (for) или при нарушении условия в while. Если цикл был прерван оператором break, то ветвь else пропускается.

Это может быть удобно в некоторых случаях. Но синтаксис неудачен - неудачно само использование слова else.

Предлагаю обсудить другой синтаксис для данной цели, которого в Питоне пока нет, но который, по-моему, более нагляден.

Сразу после цикла for или while можно писать специальный условный оператор
Python
1
2
3
4
5
if условие:
elif условие:
     ...
else:
    ...
Ветвей elif и/или else может и не быть.
Этот оператор выглядит как обычный 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 - цикл не прерывали (это два исчерпывающих и взаимоисключающих случая, когда мы попадаем на оператор после цикла). Если нужно отличать случай, когда цикл не сработал, то можно начать так:
Python
1
2
3
4
5
6
if pass:
    #цикл не выполнился ни разу
elif finally:
    #цикл выполнен 1 или больше раз без break
else: 
    #вышли по break
Кто что думает по этому поводу?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.07.2020, 19:04
Ответы с готовыми решениями:

напишите 2 программы (с использованием циклов с параметром и циклов с условием) для вычисления и вывода на экран в виде

Организация циклов в языке Python
Проверить истинность высказывания: "Цифры данного трехзначного числа образуют арифметическую прогрессию". Начали изучать Python....

Ширина ямы в сэмплах на графике на python без циклов
у меня такая задача: есть массив с числами и нужно рассчитать ширину ямы, то есть сколько элементов в массиве меньше нижней границы ямы....

28
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
14.07.2020, 09:44
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от TrueTerm Посмотреть сообщение
Разница и есть (для компилятора), отлавливается по сочетанию ключевых слов. Человек тоже может увидеть это сочетание, но , вообще-то, внешне очень похоже на обычный условный оператор. Т.е. разница малозаметна и вроде бы из-за этого путаница.
Да, путаницы быть не должно. На этом прошу меня извинить.
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
14.07.2020, 11:20
А чем вам такой вариант не угодил?
Python
1
2
3
4
5
6
7
8
9
10
11
12
if items:
    for item in items:
        if not item:
            # обработка break
            ...
            break
    else:
        # обработка finally
        ...
else:
    # обработка pass
    ...
Тут все вроде понятно.
Единственный минус - лишний отступ из-за if items.
0
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
14.07.2020, 18:13  [ТС]
ioprst, можно и так сделать. Можно какие-то флажки (булевы переменные) ввести. Можно еще как-то.
Но с расширенным синтаксисом конструкции единообразны и касаются именно цикла, а не структуры, которую цикл обрабатывает. Да и в цикле while могут быть самые разные условия.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
14.07.2020, 20:01
Цитата Сообщение от TrueTerm Посмотреть сообщение
Вот просто "else:" у цикла - неудачное обозначение, я бы скорее подумал, что это означает "а если цикл ни разу не выполнился, то...". Т.к. внешне, "else" противопоставляется самому циклу, а не выглядит анализом после завершения цикла.
Достаточно прочитать документацию, чтобы понять else противопоставляется оператору break (или даже паре if cond: break), а не for.
И тогда смысл становится самоочевидным. Использование же for else без break бессмысленно.
И не надо ничего дополнительно усложнять. Само расширение циклов for\while уже выходит за рамки традиционной семантики циклов.
Так что, обсуждайте, не обсуждайте - никому это не нужно и никогда не будет принято в разработку.
0
http://1248.site
131 / 119 / 20
Регистрация: 15.05.2012
Сообщений: 347
Записей в блоге: 10
14.07.2020, 20:09
зачем нужен стартовый if, логичней было бы просто дополнение к существующему else дерективами elif и конечно же вариантами pass break и д.р. т.к. стартовое условие уже имеется, да и просто возможность обычных условий было бы неплохо

Python
1
2
3
4
5
6
while условие:
     ...
elif условие:
     ...
else:
     ...
идея хорошая, права о возможности else узнал только сегодня, вероятно из-за отсутствия предложенного расширения синтаксиса.
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:
Pascal
1
2
3
4
5
6
7
8
WHILE усл1 DO
    действия1
ELSIF усл2 DO
    действия2
...
ELSIF услN DO
    действияN
END
Т.е. ветки elif воспринимаются не как разбор после окончания цикла, а как какие-то проверки во время цикла. Но это лучше, чем просто else. И реализовать компиляцию легче.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
14.07.2020, 21:01
TrueTerm,
Кстати, если не в курсе, обсуждение синтаксиса for..else уже было. 11 лет назад. Все закончилось решением оставить статус кво. Были предложения вида
Python
1
2
3
4
5
if sequence:
    for item in sequence:
            process(item)
else:
    print "sequence is empty"
Либо ввести новое ключевое слово для противоположной семантики:
Python
1
2
3
4
for item in sequence:
        process(item)
otherwise:
        print "sequence is empty"
Были также и предложения удалить else совсем из синтаксиса циклов. В любом случае, как показало время, все уже либо привыкли к нему, либо просто не пользуются. И что-то менять в этом направлении текущий момент никто в команде разработчиков не собирается. Ваши же предложения им вообще вряд ли бы понравились, поскольку, по их мнению, даже малейшее изменение типа приведенного выше уже требовало серьезного вмешательства в компилятор.

Какой смысл вашего треда тогда?
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 обычно выполняют на какой-то итерации, и заранее его предусмотреть нельзя.

Цитата Сообщение от Garry Galler Посмотреть сообщение
Ваши же предложения им вообще вряд ли бы понравились, поскольку, по их мнению, даже малейшее изменение типа приведенного выше уже требовало серьезного вмешательства в компилятор.
Вполне возможно, особенно если требуется оптимизация циклов. С другой стороны, возможно усложненный компилятор будет порождать более эффективный код, чем может сделать большинство программистов при помощи булевых флажков и "ручных" if-ов. Вопрос в том, часто ли требуется анализ причин завершения цикла, чтобы для этого была специальная конструкция?

Добавлено через 40 минут
О идея! Можно заявить, что самый первый elif расшифровывается как "end loop. if", а все остальные как обычно "else if".
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
14.07.2020, 22:54
Цитата Сообщение от TrueTerm Посмотреть сообщение
Вопрос в том, часто ли требуется анализ причин завершения цикла
Уже отвечал. Нет. Поэтому эта конструкция так мало кого интересует, что ее ни менять, ни удалять так и не решились.

Цитата Сообщение от TrueTerm Посмотреть сообщение
Можно заявить,
Заявите это разработчикам. Здесь то какой смысл?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.07.2020, 22:54
Помогаю со студенческими работами здесь

В Python написать программу и реализовать с использованием функции и циклов
4. По данному натуральному n вычислите сумму 1^3+2^3+3^3+...+n^3. Реализовать ввод трех чисел.

Дополнительное поле в опциях продукта
Доброго времени суток) Прошу помощи, моя голова не может сообразить, как воплотить в жизнь данную задачу - добавить поле...

Сканирование папок и копирование новых появившихся файлов на windows в python
Друзья хочу реализовать вот такое непростое для меня решение, может ли питон смотреть за файлами в определенных папках. например если...

Что такое Overflow в опциях IP пакета
Что такое Overflow в опциях IP-пакета? О чем говорит его значение?

Сумма товара при включенных опциях Opencart
Здраствуйте! Написал скрипты для анимации пересчета суммы на странице товара, при изменении количества. Но если я выбираю опцию и пытаюсь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
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. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru