|
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
|
||||||||||||||||
Идея о новых опциях Python для циклов for и while10.07.2020, 19:04. Показов 1786. Ответов 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
|
|
|
|
| 10.07.2020, 20:43 | |
|
0
|
|
|
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
|
|
| 10.07.2020, 21:56 [ТС] | |
|
Garry Galler, Так в том и дело, что менять не нужно, нужно только дополнить. Старому синтаксису не противоречит. А насчет "никто"... Я слышал прямо противоположное: кто-то все-таки время от времени меняет синтаксис питона, добавляя в него новые фичи.
0
|
|
|
|
|
| 10.07.2020, 22:19 | |
|
Новый синтаксис, да, чутка добавляют. Но старый уже не меняют из-за обратной совместимости.
Так что for else менять точно не будут.
0
|
|
|
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
|
||
| 10.07.2020, 22:45 [ТС] | ||
|
А for else и не меняется:
Новых ключевых слов не добавляется, значит нет конфликтов с идентификаторами. Слова break, pass или finally никогда после if не стояли и стоять сейчас не могут, значит не нужно менять старые проги. Т.е. "чистое" расширение, дающее совместимость снизу вверх. А вот насколько полезное... Конечно, всё это можно сделать и сейчас (переменными-флажками, проверкой условия цикла после цикла и пр.). Как часто на практике требуется разбирать причины выхода из цикла? И, вообще-то, выход по break - действие неструктурное. Повышает ли нововведение понятность программы или наоборот поощряет всякие запутывающие трюки?
0
|
||
|
|
||
| 10.07.2020, 23:04 | ||
|
0
|
||
|
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
|
||
| 11.07.2020, 09:20 [ТС] | ||
|
0
|
||
|
Просто Лис
|
|||||||
| 11.07.2020, 16:35 | |||||||
|
Мне вот match нравится (сопоставление с образцом). Типа switch из с/с++. Пример на PL/SQL, есть похожее в rust: Функциональное программирование на Lispe
Добавлено через 1 минуту
0
|
|||||||
|
|
||
| 11.07.2020, 16:48 | ||
|
---------------------- Ха, похоже нас услышали ![]() PEP 622 -- Structural Pattern Matching от 23 июня 2020. Правда, ждать до Python 3.10...
0
|
||
|
|
||||
| 13.07.2020, 13:18 | ||||
|
Хотя идея с pass интересная Ну всё, обсудили, можно и по домам
0
|
||||
|
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
|
||
| 13.07.2020, 18:01 [ТС] | ||
|
Т.е. это и будет часть цикла ,а не отдельный условный оператор, потому что в другом месте нельзя будет написать такое условие. В Python нет явного обозначения конца конструкции ( ENDFOR, ENDWHILE), поэтому нельзя "написать внутри секции", приходится писать "впритык". Но по смыслу, это именно "внутри цикла", так же как ветвь "else:" в старом синтаксисе.
0
|
||
|
Просто Лис
|
||
| 13.07.2020, 18:06 | ||
|
Сейчас твоё предложение "писвть if в конце тела цикла" выглядит не очень. А если я if хочу написать? Как их различать?
0
|
||
|
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
|
||||||||
| 13.07.2020, 18:21 [ТС] | ||||||||
0
|
||||||||
|
Просто Лис
|
|||||||
| 13.07.2020, 18:25 | |||||||
0
|
|||||||
|
|
|||||
| 13.07.2020, 18:29 | |||||
|
0
|
|||||
|
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
|
||
| 13.07.2020, 18:38 [ТС] | ||
|
Добавлено через 7 минут dondublon, в имеющемся сейчас синтаксисе "else:" после цикла означает часть цикла, потому что никакой отдельный оператор не может начинаться с else. По той же причине else после оператора if означает ветвь "иначе" этого if. Поэтому компилятор легко определит, что это продолжение цикла или продолжение условного оператора (секция еще не закончилась). Так же никакой отдельный оператор не может начинаться начинаться сочетанием "if pass" , "if break" или "if finally", поэтому компилятор и редактор могут определить, что это не отдельный условный оператор, а продолжение цикла (секция цикла еще не закончилась).
0
|
||
|
|
||
| 13.07.2020, 18:50 | ||
|
Если разница между следующим и неследующим 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 минут Вот сейчас, что делают, когда такого синтаксиса нет? Просто после цикла пишут обычный условный оператор и анализируют там флажок, изменяемый в теле цикла, или проверяют выход за границы диапазона. Это обычный if, синтаксически он отдельный оператор, но по смыслу он связан с циклом, потому что разбирает, как этот цикл закончился. А если можно будет написать "if break" например, то это синтаксически часть цикла, а логически - тоже связанный с циклом анализ завершения. Т.е. во всех случаях, "по смыслу" будет анализ результатов выполнения цикла. А часть это или отдельный if - эта разница важна при реализации компилятора. Для программера, в любых случаях это "цикл завершился, сейчас проанализируем причину завершения и сделаем то или другое". Кто-то, конечно, воспримет это как обычный if (очень ведь похож!) и попытается писать "if break and x>0:" или напишет после цикла "a=0", а потом "if pass:" . Но тогда просто будет ошибка и ответ знатока на форуме, что "Не путай! Это не отдельный if, а часть цикла, поэтому ...". Добавлено через 4 минуты Конечно, можно отловить нужный случай по двоеточию после pass. Но тогда это сочетание двух токенов "pass" и ":". А чем оно лучше сочетания "if pass"? ИМХО, if pass нагляднее. Добавлено через 49 минут Можно подождать, когда сделают match и писать case вместо if. Т.е. "case pass:" , "case break:" или "case finally:".
0
|
|||
|
|
||||
| 13.07.2020, 20:30 | ||||
|
0
|
||||
|
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
|
||
| 13.07.2020, 21:23 [ТС] | ||
|
А по-моему, это "хорошая путаница", это просто "абстрагирование от деталей". Анализ цикла можно делать конструкцией очень похожей на условный оператор, которая является частью цикла, а не отдельным оператором. А можно обычным условным оператором, который не часть, а отдельный оператор. Ну и что? По смыслу ведь тоже это очень похоже. Внешне похоже и по смыслу похоже, значит легче запомнить и объяснить эту конструкцию ("это как условный оператор, только условия 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
|
||
| 13.07.2020, 21:23 | |
|
Помогаю со студенческими работами здесь
20
В Python написать программу и реализовать с использованием функции и циклов Дополнительное поле в опциях продукта Сканирование папок и копирование новых появившихся файлов на windows в python
Сумма товара при включенных опциях Opencart Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Горе от ума
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». Новое фото. . .
|