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

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

10.07.2020, 19:04. Показов 1786. Ответов 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
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
10.07.2020, 20:43
Цитата Сообщение от TrueTerm Посмотреть сообщение
Кто что думает по этому поводу?
Синтаксис Python все равно никто менять не будет, так что обсуждать нечего.
0
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
10.07.2020, 21:56  [ТС]
Garry Galler, Так в том и дело, что менять не нужно, нужно только дополнить. Старому синтаксису не противоречит. А насчет "никто"... Я слышал прямо противоположное: кто-то все-таки время от времени меняет синтаксис питона, добавляя в него новые фичи.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
10.07.2020, 22:19
Новый синтаксис, да, чутка добавляют. Но старый уже не меняют из-за обратной совместимости.
Так что for else менять точно не будут.
0
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
10.07.2020, 22:45  [ТС]
А for else и не меняется:
"Если написано только "else:", то это означает "if finally:" - этим обеспечивается совместимость с текущим синтаксисом."
Просто добавляется альтернативная возможность сделать то же самое: можно по-старому писать else:, а можно if finally: (последнее гораздо наглядней и понятней). И новые возможности при помощи break и pass.
Новых ключевых слов не добавляется, значит нет конфликтов с идентификаторами. Слова break, pass или finally никогда после if не стояли и стоять сейчас не могут, значит не нужно менять старые проги. Т.е. "чистое" расширение, дающее совместимость снизу вверх.

А вот насколько полезное... Конечно, всё это можно сделать и сейчас (переменными-флажками, проверкой условия цикла после цикла и пр.). Как часто на практике требуется разбирать причины выхода из цикла?

И, вообще-то, выход по break - действие неструктурное. Повышает ли нововведение понятность программы или наоборот поощряет всякие запутывающие трюки?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
10.07.2020, 23:04
Цитата Сообщение от TrueTerm Посмотреть сообщение
Как часто на практике требуется разбирать причины выхода из цикла?
В том-то и дело, что даже else в for\while практически никому не нужен. К тому же он и так выбивается из общепринятого синтаксиса, так что многие предпочитают даже не вспоминать о такой возможности.
0
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
11.07.2020, 09:20  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
К тому же он и так выбивается из общепринятого синтаксиса, так что многие предпочитают даже не вспоминать о такой возможности.
Так может, если синтаксис будет более удачным, то будут использовать? Например, довольно часто встречается задача, что нужно найти и что-то сделать с одним элементом списка. При этом список может быть вообще пустым, а элемент может быть найден, а может нет. Вот эти три случая и можно разобрать при помощи if pass\elif break\else.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
11.07.2020, 16:35
Мне вот match нравится (сопоставление с образцом). Типа switch из с/с++. Пример на PL/SQL, есть похожее в rust: Функциональное программирование на Lispe

Добавлено через 1 минуту
Цитата Сообщение от Garry Galler Посмотреть сообщение
даже else в for\while практически никому не нужен.
В джанговских шаблонах синтаксис у тега нагляднее:

HTML5
1
2
3
4
5
{% for i in iterable %}
  {{ i }}
{% emply %}
  opps
{% endfor %}
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
11.07.2020, 16:48
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Мне вот match нравится
pattern matching совсем другое дело. Вот если это бы в Python запилили....

----------------------
Ха, похоже нас услышали
PEP 622 -- Structural Pattern Matching от 23 июня 2020.

Правда, ждать до Python 3.10...
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
13.07.2020, 13:18
Цитата Сообщение от Garry Galler Посмотреть сообщение
Ха, похоже нас услышали
PEP 622 -- Structural Pattern Matching от 23 июня 2020.
Вот это и правда круто. Давно мечтал.

Цитата Сообщение от Garry Galler Посмотреть сообщение
Синтаксис Python все равно никто менять не будет, так что обсуждать нечего.
Почему бы не обсудить, прежде чем посылать самому Гвидо или кто там нынче вместо.

Цитата Сообщение от TrueTerm Посмотреть сообщение
Сразу после цикла for или while
Вот этого не надо. Все такие вещи должны быть внутри секции for\while.

Хотя идея с pass интересная

Ну всё, обсудили, можно и по домам
0
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
13.07.2020, 18:01  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Вот этого не надо. Все такие вещи должны быть внутри секции for\while.
А где кончается эта секция? Собственно, "сразу после цикла" означает "непосредственно после, с тем же уровнем отступов (вложенности)", между этим if и циклом можно поместить разве что комментарий.

Т.е. это и будет часть цикла ,а не отдельный условный оператор, потому что в другом месте нельзя будет написать такое условие. В Python нет явного обозначения конца конструкции ( ENDFOR, ENDWHILE), поэтому нельзя "написать внутри секции", приходится писать "впритык". Но по смыслу, это именно "внутри цикла", так же как ветвь "else:" в старом синтаксисе.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
13.07.2020, 18:06
Цитата Сообщение от TrueTerm Посмотреть сообщение
приходится писать "впритык".
Нарисуй синтаксическую диаграмму того, что ты хочешь до нас донести.

Сейчас твоё предложение "писвть if в конце тела цикла" выглядит не очень. А если я if хочу написать? Как их различать?
0
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
13.07.2020, 18:21  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Нарисуй синтаксическую диаграмму того, что ты хочешь до нас донести.
Конструкция схожа с обычным if, но условия могут быть только "pass", "break" или "finally" (лишь 2 из этих слов можно использовать в одной конструкции, вместо 3-го пишем просто ветвь else), и состоять не более, чем из 3-х ветвей.
Python
1
2
3
4
5
6
if COND:
  ...
[elif COND:
  ...]
[else:
  ...]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
А если я if хочу написать? Как их различать?
Если сразу после цикла for или while идет "if pass:" , "if break:" или "if finally:", то это "спецif" - часть цикла для разбора случаев разного завершения цикла. Если после if стоит что-то другое, то это обычный условный оператор if.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
13.07.2020, 18:25
Цитата Сообщение от TrueTerm Посмотреть сообщение
Если сразу после цикла for или while идет "if pass:" ,
Так не пойдёт, о чём я говорю. Вот пример:

Python
1
2
3
4
5
for i in range(42):
    if i == 5:
        break
if 1 == 1:
    print(True)
Второй if - это ещё часть цикла или нет? Ответ: нет.
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
13.07.2020, 18:29
Цитата Сообщение от TrueTerm Посмотреть сообщение
А где кончается эта секция?
Сразу перед новой строкой, indentation которой меньше, чем у внутренностей цикла.

Цитата Сообщение от TrueTerm Посмотреть сообщение
В Python нет явного обозначения конца конструкции ( ENDFOR, ENDWHILE), поэтому нельзя "написать внутри секции",
Вот не надо этой демагогии. Обозначения конца нет, а конец - есть, и любой путёвый редактор вам его определит.

Цитата Сообщение от TrueTerm Посмотреть сообщение
Собственно, "сразу после цикла" означает "непосредственно после, с тем же уровнем отступов (вложенности)", между этим if и циклом можно поместить разве что комментарий.
Я понимаю, что "после" означает "после", это можно было бы и не объяснять. Ну а то, что "там можно поместить разве что комментарий" - увы, нет, там всё, что хочешь можно разместить, в соответствии с синтаксисом, и не только питоновским. Следующий блок - он следующий, всё, поезд ушёл. Хочешь разместить что-то, относящееся к блоку - помещай внутри.

Цитата Сообщение от TrueTerm Посмотреть сообщение
Но по смыслу, это именно "внутри цикла"
Нет, по смыслу, после - это не внутри. После - это снаружи. Кэп.
0
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
13.07.2020, 18:38  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Второй if - это ещё часть цикла или нет? Ответ: нет.
Конечно нет. Хотя этот if идет сразу после цикла, имеет ту же вложенность (те же отступы), что и сам цикл, но он начинается сочетанием "if 1". "1" - это не "pass" , не "break: и не "finally", поэтому это отдельный условный оператор.

Добавлено через 7 минут
dondublon, в имеющемся сейчас синтаксисе "else:" после цикла означает часть цикла, потому что никакой отдельный оператор не может начинаться с else. По той же причине else после оператора if означает ветвь "иначе" этого if.
Поэтому компилятор легко определит, что это продолжение цикла или продолжение условного оператора (секция еще не закончилась).

Так же никакой отдельный оператор не может начинаться начинаться сочетанием "if pass" , "if break" или "if finally", поэтому компилятор и редактор могут определить, что это не отдельный условный оператор, а продолжение цикла (секция цикла еще не закончилась).
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
13.07.2020, 18:50
Цитата Сообщение от TrueTerm Посмотреть сообщение
По той же причине else после оператора if означает ветвь "иначе" этого if.
Вам же привели пример, когда "if" означает просто следующий if.
Если разница между следующим и неследующим if-ом настолько мала, что в неё надо вглядываться - то нуёнафиг.
Можно без if-а. Просто pass, finally - как нынешний else.
0
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
13.07.2020, 20:19  [ТС]
dondublon, Рыжий Лис, сочетание if+(pass/break/finally) однозначно говорит простой это if, идущий за циклом, или часть цикла. Но я согласен, что сочетание из двух слов хуже, чем одно слово.
Например, написали мы заголовок for, написали тело цикла с отступом, а затем пишем ч тем же отступом, что заголовок слово else. По одному этому слову компилятор и редактор понимают, что это часть цикла, т.е. относится к той же секции. Если написать идентификатор или, например, return, то понятно, что следующий оператор, а цикл закончился.

А вот если написать if? Сейчас понятно, что цикл завершен и это следующий оператор. Но если будет принят новый синтаксис, то по одному if, написанному после цикла, будет непонятно - это новый условный оператор или часть цикла. Т.е. компилятор и редактор, должны себе отметить, что возможны 2 варианта и прочитать следующее слово. Следующее после if слово уже однозначно говорит - отдельный это оператор или часть цикла.

Добавлено через 19 минут
Цитата Сообщение от dondublon Посмотреть сообщение
Если разница между следующим и неследующим if-ом настолько мала, что в неё надо вглядываться - то нуёнафиг.
Так может это и хорошо, что разница в глаза не бросается? Как будто это условный оператор, анализирующий результат выполнения цикла.

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

А часть это или отдельный if - эта разница важна при реализации компилятора. Для программера, в любых случаях это "цикл завершился, сейчас проанализируем причину завершения и сделаем то или другое". Кто-то, конечно, воспримет это как обычный if (очень ведь похож!) и попытается писать "if break and x>0:" или напишет после цикла "a=0", а потом "if pass:" . Но тогда просто будет ошибка и ответ знатока на форуме, что "Не путай! Это не отдельный if, а часть цикла, поэтому ...".

Добавлено через 4 минуты
Цитата Сообщение от dondublon Посмотреть сообщение
Можно без if-а. Просто pass, finally - как нынешний else.
Нельзя! Например, pass - это отдельный оператор ,он вполне может быть написан после цикла сам по себе.
Конечно, можно отловить нужный случай по двоеточию после pass. Но тогда это сочетание двух токенов "pass" и ":". А чем оно лучше сочетания "if pass"? ИМХО, if pass нагляднее.

Добавлено через 49 минут
Можно подождать, когда сделают match и писать case вместо if. Т.е. "case pass:" , "case break:" или "case finally:".
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
13.07.2020, 20:30
Цитата Сообщение от TrueTerm Посмотреть сообщение
Так может это и хорошо, что разница в глаза не бросается? Как будто это условный оператор, анализирующий результат выполнения цикла.
Ну уж нет, разница должна быть, тут и спорить не о чем.
Цитата Сообщение от TrueTerm Посмотреть сообщение
от сейчас, что делают, когда такого синтаксиса нет? Просто после цикла пишут
Или не пишут. Или пишут if, но по совсем другому поводу.
Цитата Сообщение от TrueTerm Посмотреть сообщение
Нельзя! Например, pass - это отдельный оператор ,
Хорошо, не pass, что-то похожее. Но без if.
0
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
13.07.2020, 21:23  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Ну уж нет, разница должна быть, тут и спорить не о чем.
Разница и есть (для компилятора), отлавливается по сочетанию ключевых слов. Человек тоже может увидеть это сочетание, но , вообще-то, внешне очень похоже на обычный условный оператор. Т.е. разница малозаметна и вроде бы из-за этого путаница.

А по-моему, это "хорошая путаница", это просто "абстрагирование от деталей". Анализ цикла можно делать конструкцией очень похожей на условный оператор, которая является частью цикла, а не отдельным оператором. А можно обычным условным оператором, который не часть, а отдельный оператор. Ну и что? По смыслу ведь тоже это очень похоже. Внешне похоже и по смыслу похоже, значит легче запомнить и объяснить эту конструкцию ("это как условный оператор, только условия pass\break\finally"). И тому, кто пишет программу ,а не реализует компилятор, важен именно смысл (семантика).

Вот просто "else:" у цикла - неудачное обозначение, я бы скорее подумал, что это означает "а если цикл ни разу не выполнился, то...". Т.к. внешне, "else" противопоставляется самому циклу, а не выглядит анализом после завершения цикла.

А вот if после цикла в любом случае выглядит как анализ после завершения цикла. Но ведь не только выглядит, но и на самом деле так работает (семантически): отдельный оператор if выполняется после цикла, и "спецif" - тоже после. Смысл их практически один и тот же: после цикла проверить условие и выполнить то или иное. А отдельный это if или прикрученный к циклу - это детали реализации.

Добавлено через 26 минут
А можно и так задать. Вместо того, чтобы добавлять ветви в цикл, давайте введем особую разновидность условного оператора, а цикл трогать не будем.

Пусть есть обычный if, а есть специальный ("циклоанализирующий"):

if COND1:
...
[elif COND2:
...]
[else:
...]
Здесь COND1 и COND2 - два несовпадающих слова из набора pass , break, finally. Ветви elif и/или else могут отсутствовать.

Обязательное требование: спецIF пишется непосредственно после оператора цикла for или while, на том же уровне что и этот цикл (между ним и циклом недопустимы никакие значимые операторы ,только, разве что, пробелы, пустые строки и комментарии). Кроме того, в самом цикле не должно быть ветки else.

Ну вот, теперь if в любом случае отдельный оператор, тут никакой путаницы. Просто мы расширили if, чтобы он мог проверить некоторые случаи после цикла.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.07.2020, 21:23
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru