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

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

10.07.2020, 19:04. Показов 1978. Ответов 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
4663 / 2082 / 367
Регистрация: 17.03.2012
Сообщений: 10,203
Записей в блоге: 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
5439 / 3860 / 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
5439 / 3860 / 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
5439 / 3860 / 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
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru