Пора завязывать использовать символы табуляции в коде
Многие могут счесть спор, о том, что лучше пробелы или табуляции в коде за holy wars. Однако нет, я не хочу устраивать дискуссию на эту тему. Я однозначно утверждаю, что в обязательном порядке следует использовать пробелы. И разговор и «предпочтении того или иного» здесь не уместен. Как не уместно в наше время обсуждать, что удобнее, компьютер или печатная машинка. Поскольку печатные машинки закончили свое существование, ориентироваться в дальнейшем на их использование, по меньшей мере, нерационально. А если ещё учесть, сколь удобнее пользоваться компьютером для набора текста, то вопрос выбора просто отпадает.
С пробелами и табуляцией ситуация не настолько грандиозна и масштабна, но аналогия прослеживается. Далее я поясню, почему рационально перейти на пробелы для форматирования кода.
Эту заметку меня побудило написать то, что табуляции мне надоели. Вроде и мелочь. Но идут годы, а эта инфекция у программистов всё никак не проходит. Хотя сам я при написании кода не использую табуляции, тем не менее, регулярно вспоминаю недобрым словом их поклонников. Не волнуйтесь, от этого сон и аппетит у меня не нарушается, но некоторое время впустую я трачу. А если учесть, сколько еще людей сталкивается с аналогичными досадными моментами, то суммарный вред весьма ощутимый. И если от спама выгоду получают хотя бы спамеры, то от использования табов выгоды не получает никто. Энергия уходит в никуда. Этот как капающий кран. Одна капля, которую тратит программист, не существенна. Но в сумме уже столько утекло и продолжает утекать, ужас. Предлагаю дочитать эту статью и, наконец, прекратить эту утечку!
В начале, перечислю аргументы, которые вспоминают, когда не хотят перейти от табуляции к пробелам. Я уверен, что они высосаны из пальца и единственная настоящая причина это лень. Тем не менее, рассмотрю эти аргументы и раскритикую эти.
1) Объем файлов с исходным кодом меньше.
2) Замена всех пробелов может привести к потере истории правок. Нельзя будет сравнить старое и новое.
3) Изменяя длину табуляции, я легко могу настроить отступы в программе под свое предпочтение.
Займемся критикой чистого разума.
1) Объем файлов с исходным кодом меньше
Насколько это верный, настолько же и глупый аргумент. В наше время экономить на килобайтах просто бессмысленно. Данный аргумент потерял всякий смысл более 10 лет назад.
2) Замена всех пробелов может привести к потере истории правок. Нельзя будет сравнить старое и новое.
Формально тоже всё верно. Но, пожалуй, это слишком мрачная картина. Так ли уж часто вам приходится исследовать историю файла на большую глубину? Обычно никто не заглядывает в историю глубже одной-двух ревизий файла. Замена табуляции на пробелы делается глобально и один раз и не должна мешать дальнейшим сравнениям.
Если надо часто и глубоко по времени сравнивать файлы, то это что-то в консерватории не то. И тут уже не до пробелов/табуляций. А если нормальному программисту в нормальном проекте все-таки раз в год придется историю одного файла до 10-ого колена изучать, то ему тот же WinMerge поможет. Он умеет замену табуляций на пробел за отличие не считать. Думаю и другие системы сравнения не хуже.
В общем, тоже не аргумент. А если и аргумент, то уж очень слабенький.
3) Изменяя длину табуляции, я легко могу настроить отступы в программе под свое предпочтение.
Никогда не работает на практике.
Тот, кто заявляет что-то подобное, не понимает, про что он говорит. И сам он ни разу не пробовал такое сделать, а то бы не говорил ерунды.
Сделаю небольшое отступление. На самом деле в утверждении зерно смысла есть. Вот только выдранное из контекста, оно бестолково. Подобное может работать только тогда, где код выравнивается ТОЛЬКО табуляцией. Пробелы для выравнивания НЕ ИСПОЛЬЗУЮТСЯ ВООБЩЕ. В этом случае да, меня размер табуляции, мы можем менять отображения кода. Например, одному нравится смотреть на такой код (один таб = 2 пробела):
if(A==B) x = y;
Другой использует другой размер и любуется на этот же код в своем любимом стиле (один таб = 4 пробела):
if(A==B) x = y;
Вот только никто так не делает. Походите по своему коду и вы увидете что-то более реалистичное (один таб = 2 пробела):
A=Aaaaaaaaaaaa && Bbbbbbbbb;
Если теперь таб станет равен не двум пробелам, то вся красота оформления моментально нарушится.
A=Aaaaaaaaaaaa && Bbbbbbbbb;
Или вот, я взял и смотрю чей-то файл. Кто-то старался, выравнивал:
wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = WS_OVERLAPPED ; wcex.lpfnWndProc = (WNDPROC)ClipBoardWndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = theApp.m_hInstance; wcex.hIcon = 0; wcex.hCursor = ::LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
Вот только у меня, в FAR с другим размером табуляции это вот так смотрится:
wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = WS_OVERLAPPED ; wcex.lpfnWndProc = (WNDPROC)ClipBoardWndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = theApp.m_hInstance; wcex.hIcon = 0; wcex.hCursor = ::LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
Таких примеров массу привести можно. Сами можете поменять размер табуляции и полюбоваться на свой код. Особенно это полезно сделать, если захочется оспорить данный текст.
Итак, код после изменения размера табуляции будет нормально смотреть, если использовать только табуляции. Но это очень аскетично. И код часто не красивый получается. Поэтому подавляющее число программистов используют для выравнивания помимо табов еще и пробелы. И тем самым уничтожают возможность менять размер злосчастных табов.
В результате получаем, что использование табуляции из абстракнтых соображений не имеет смысла. Я утверждаю, что взяв свой или чужой код и изменив размер табуляции, в 99% случаев мы получим некрасивый, разъехавшийся код. А раз так, то и аргумент в защиту справедлив только на 1%, а то и меньше. Ни разу не видел, чтоб с другими табуляциями код смотрелся хорошо. А уж кода я смотрю много.
С доводами в защиту табуляции я закончил. Теперь перечислю недостатки от их использования.
1) Тяжело работать с проектами, где используются библиотеки, содержащие в тексте табуляции. Предположим, в одной библиотеке табуляция равна 3 символам, в другой 4 символам. А вы в проекте используете 2 символа. В результате какая-то часть кода у вас будет отображаться в редакторе со сбитым форматированием.
Ну и где польза от переменного размера табуляции? Какой размер не выбери, где-то да криво будет. Если же везде будут пробелы, то и смотреться все красиво будет. Да, будут разные отступы, но форматирование то красивое везде останется!
2) Легко пустить козла в огород. Скажем у вас табуляция равна 4 пробелам. Кто-то что-то чуть-чуть поправил, используя другой размер табуляции или явно вставив пробелы. У него все смотрелось нормально, а у вас строчка кода куда-то уедет.
3) Надо постоянно настраивать различные редакторы под нужный вам размер табуляции. Даже если вам нужно просто посмотреть код не правя. Иначе все разъезжается. Особенно это не удобно, когда приходится что-то делать со своим кодом на сторонней машине. Или наоборот заглядывать в чужой код. Тут объяснить всю суетность сложно. Это надо прочувствовать. Программисты, пожалуй делятся на тех, кто знает и понимает про это неудобство, и кто нет. Но прошу, те, кто не понимает, поверьте — эти неудобства есть! И если вам, в общем-то, всё равно, то используйте пробелы! Сэкономите кому то немного сил и времени.
4) Лишние сложности тем, кто работает одновременно с проектами, где по стандартам кодирования требуются разные отступы. Если стандарты требуют использование табуляции, то это ещё тот вечно ноющий зуб. В случае пробелов опять-таки все намного проще.
Ну и на последок отвечу на: «мы так всегда писали, значит и дальше так стоит продолжать». Часто, причем, это подкрепляется каким-либо бородатым стандартом кодирования, используемым программистами. Слава богу, профессиональные разработчики не стоят на месте. И не боятся нарушить старинные устои. Примером тому может служить Google C++ Style Guide. Вот цитата оттуда по поводу пробелов и табуляций.
Spaces vs. Tabs
Use only spaces, and indent 2 spaces at a time.
We use spaces for indentation. Do not use tabs in your code. You should set your editor to emit spaces when you hit the tab key.
Слава богу! Хоть у кого-то разумный подход!
Желаю и вам свежести в ваших стандартах кодирования!
ПРИМЕЧАНИЕ ДЛЯ ТЕХ, КТО В ТАНКЕ
Чтобы использовать для оформления пробелы, вовсе не обязательно 4 или более раз нажимать клавишу пробел. Во всех редакторах есть возможность настроить, сколько пробелов вставлять при нажатии таба.
Никогда бы не подумал, что из-за этого меня заминусуют. «Вот ведь гад! Рекомендует пробелы нажимать до посинения, вместо милого таба!»
- табуляция
- программирование
- исходный код
- пробелы
- форматирование кода
- оформление кода
- стандарты кодирования
Табуляция Что такое табуляция и зачем она?
Материал из Википедии — свободной энциклопедии
Горизонтальная табуляция (HT, TAB) — управляющий символ таблицы ASCII с кодом 0916, используется для выравнивания текста в строках. Встретив этот символ, терминал перемещает каретку (или курсор) вправо на ближайшую позицию табуляции. Традиционно эти позиции располагаются каждые 8 знакомест, в колонках 1, 9, 17, 25… Вводится при помощи клавиши Tab ⇆ , во многих языках программирования обозначается как \t.
Если отправить на печать текст (символ табуляции обозначен стрелкой)
один→два→три→четыре
1→2→3→4
5→6→7→8
9→10→11→12
получим такую распечатку:
одиндватричетыре
1234
5678
9101112
Также существует вертикальная табуляция VT с кодом 0B16, в настоящее время используемая крайне редко.
Содержание [убрать]
1 В текстовых редакторах
2 В текстовых процессорах
3 Табуляция в (X)HTML
4 Клавиша Tab ⇆ в прикладном ПО
5 См. также
В текстовых редакторах [править | править вики-текст]
В текстовых редакторах позиции табуляции могут идти каждые 2 или 4 знакоместа: это удобно для работы с языками программирования. По желанию пользователя клавиша Tab ⇆ может не вставлять символ-табулятор, а имитировать его, вставляя нужное количество пробелов.
Одни стандарты оформления кода категорически запрещают символы-табуляторы: независимо от того, на сколько позиций настроен редактор или просмотрщик, текст будет выглядеть одинаково; в строковых константах же невидимый символ можно спутать с пробелом. Другие — требуют пользоваться именно табуляторами, а не пробелами.
В текстовых процессорах [править | править вики-текст]
Текстовые процессоры позволяют расставлять позиции табуляции в любых местах текста и выравнивать текст по любую сторону этих позиций (по левую сторону, по центру, по правую сторону). При желании символ табуляции может отображаться как отточие. С помощью табуляторов часто реализуются нумерация формул, списки определений, оглавления.
Сходная функциональность у таблиц. Но есть и отличия: текст, выровненный табуляторами, невозможно разлиновать на строки и столбцы. Зато в таблицах текст не может выходить за пределы ячеек.
Табуляция в (X)HTML[править | править вики-текст]
В (X)HTML горизонтальная табуляция обозначается как, однако она отобразится браузером только будучи использованной внутри тегов и :
Пример HTML-кода с использованием внутри тега
Две строчки с табуляцией:
2007Табуляция внутри строки.
Табуляция в начале строки.
Строка без табуляции.
Браузер отобразит этот код так:
Две строчки с табуляцией:
2007Табуляция внутри строки.
Табуляция в начале строки.
Строка без табуляции.
Вертикальная табуляция обозначается как , однако она не используется в SGML (включая HTML) или XML 1.0.
Клавиша Tab ⇆ в прикладном ПО [править | править вики-текст]
За клавишей Tab ⇆ закрепились такие функции:
В текстовых редакторах, текстовых процессорах — ввод символа табуляции, работа с отступами.
В графических интерфейсах — прыжок. В частности, в Windows Tab ⇆ — переключение между элементами текущего окна, Alt + Tab ⇆ — переключение между программами. Прыжок в обратную сторону — ⇧ Shift + Tab ⇆ .
В консольных интерфейсах (например IOS, bash, Zsh), в том числе в консолях компьютерных игр (например, Quake 3, Doom 3, Unreal Tournament) — автодополнение команды.
В играх — показ дополнительных материалов (карты уровня, таблицы результатов, заданий).
См. также [править | править вики-текст]
Логотип Викисловаря В Викисловаре есть статья «табуляция»
TSV — формат представления табличных данных, использующий табуляцию как разделитель
Question book-4.svg
В этой статье не хватает ссылок на источники информации. Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена. Вы можете отредактировать эту статью, доб
Остальные ответы
Клавиша TAB делает отступ. Удобно для набора теста, например, столбиками
Например, название товара и его цена
Для распечатки таблиц еще в механических пишущих машинках была клавиша табуляции и либо жестко установленные упоры через каждые 8 символов, либо настраиваемые упоры. По нажатию этой клавиши каретка смещалась до следующего упора.
В компьютерных редакторах и терминалах эта традиция сохранилась, тоже можно переходить к ближайшей позиции табуляции.
В заполнении экранных форм переход от одного окна ввода в другое тоже традиционно осуществляется по клавише табуляции.
Табуляция в более широком смысле — создание таблиц. Например таблиц тригонометрических функций. Ранее были широко распространены.
Этот термин можно нормально объяснить только в конкретном контексте. Что именно надо табулировать?
Если речь идет о программировании, то табуляция используется для структурирования исходного текста, выделяя вложенности if, тела циклов, подпрограмм. Хорошо оформленный исходник облегчает отладку и сопровождение.
Табуляция
Горизонтальная табуляция (HT, TAB) — управляющий символ таблицы ASCII с кодом 0916, используется для выравнивания текста по горизонтали. Встретив этот символ, терминал перемещает каретку (или курсор) вправо на ближайшую позицию табуляции. Традиционно эти позиции располагаются каждые 8 знакомест, в колонках 1, 9, 17, 25… Вводится при помощи клавиши Tab ⇆ , во многих языках программирования обозначается как \t.
Если отправить на печать текст (символ табуляции обозначен стрелкой)
один→два→три→четыре 1→2→3→4 5→6→7→8 9→10→11→12
получим такую распечатку:
один два три четыре 1 2 3 4 5 6 7 8 9 10 11 12
Также существует вертикальная табуляция VT с кодом 0B16, в настоящее время используемая крайне редко.
В текстовых редакторах
В текстовых редакторах позиции табуляции могут идти каждые 2 или 4 знакоместа: это удобно для работы с языками программирования. По желанию пользователя клавиша Tab ⇆ может не вставлять символ-табулятор, а имитировать его, вставляя нужное количество пробелов.
Одни стандарты оформления кода категорически запрещают символы-табуляторы: независимо от того, на сколько позиций настроен редактор или просмотрщик, текст будет выглядеть одинаково; в строковых константах же невидимый символ можно спутать с пробелом. Другие — требуют пользоваться именно табуляторами, а не пробелами.
В текстовых процессорах
Текстовые процессоры позволяют расставлять позиции табуляции в любых местах текста и выравнивать текст по любую сторону этих позиций (по левую сторону, по центру, по правую сторону). При желании символ табуляции может отображаться как отточие. С помощью табуляторов часто реализуются нумерация формул, списки определений, оглавления.
Сходная функциональность у таблиц. Но есть и отличия: текст, выровненный табуляторами, невозможно разлиновать на строки и столбцы. Зато в таблицах текст не может выходить за пределы ячеек.
Табуляция в (X)HTML
В (X)HTML горизонтальная табуляция обозначается как , однако она отобразится браузером только будучи использованной внутри тегов и :
Пример HTML-кода с использованием внутри тега
Две строчки с табуляцией: 2007 Табуляция внутри строки. Табуляция в начале строки. Строка без табуляции.Браузер отобразит этот код так:
Две строчки с табуляцией: 2007 Табуляция внутри строки. Табуляция в начале строки. Строка без табуляции.Вертикальная табуляция обозначается как , однако она не используется в SGML (включая HTML) или XML 1.0.
Клавиша Tab ⇆ в прикладном ПО
За клавишей Tab ⇆ закрепились такие функции:
- В текстовых редакторах, текстовых процессорах — ввод символа табуляции, работа с отступами.
- В графических интерфейсах — прыжок. В частности, в WindowsTab ⇆ — переключение между элементами текущего окна, Alt + Tab ⇆ — переключение между программами. Прыжок в обратную сторону — ⇧ Shift + Tab ⇆ .
- В консольных интерфейсах (например IOS, bash, Zsh), в том числе в консолях компьютерных игр (например, Quake 3, Doom 3, Unreal Tournament) — автодополнение команды.
См. также
- TSV — формат представления табличных данных, использующий табуляцию как разделитель
Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена.
Вы можете отредактировать эту статью, добавив ссылки на авторитетные источники.
Эта отметка установлена 15 мая 2011.
Это заготовка статьи о компьютерах. Вы можете помочь проекту, исправив и дополнив её. Это примечание по возможности следует заменить более точным. |
- Клавиатура
- Управляющие символы
- Непечатаемые знаки
- Пробельные символы
- Стандарт оформления кода
Wikimedia Foundation . 2010 .
Синонимы:
- Обслуживание
- Неволин, Константин Алексеевич
Полезное
Смотреть что такое «Табуляция» в других словарях:
- табуляция — сущ., кол во синонимов: 1 • табулирование (1) Словарь синонимов ASIS. В.Н. Тришин. 2013 … Словарь синонимов
- табуляция — Перемещение курсора к следующей позиции. [http://www.morepc.ru/dict/] Тематики информационные технологии в целом EN tabulation … Справочник технического переводчика
- табуляция — табул яция, и … Русский орфографический словарь
- Горизонтальная табуляция — Источник: ГОСТ 22562 77: Аппараты телеграфные буквопечатающие. Термины и определения оригинал документа Смотри также родственные термины … Словарь-справочник терминов нормативно-технической документации
- вертикальная табуляция — вертикальное форматирование Возможность текстового редактора размещать текст вертикально внутри границ, установленных пользователем. [ГОСТ Р ИСО/МЭК 2382 23 2004] вертикальная табуляция Число строк, которые должны быть пропущены на странице перед … Справочник технического переводчика
- горизонтальная табуляция — горизонтальное форматирование Возможность текстового редактора размещать текст горизонтально внутри границ, установленных пользователем. [ГОСТ Р ИСО/МЭК 2382 23 2004] горизонтальная табуляция Горизонтальное перемещение положения курсора к… … Справочник технического переводчика
- КРОСС-ТАБУЛЯЦИЯ — (CROSS TABULATION) Распространенным способом представления данных являются двумерные таблицы, в которых значения одной переменной соотносятся со значениями другой. Примером может служить кросс табуляция электоральных намерений и социального… … Социологический словарь
- вертикальная табуляция — stačiasis tabuliavimas statusas T sritis radioelektronika atitikmenys: angl. vertical tabulation vok. Vertikaltabulation, f rus. вертикальная табуляция, f pranc. tabulation verticale, f … Radioelektronikos terminų žodynas
- комбинированная табуляция (данных) — — [А.С.Гольдберг. Англо русский энергетический словарь. 2006 г.] Тематики энергетика в целом EN cross tabulation … Справочник технического переводчика
- обратная табуляция — Возврат курсора к предшествующему символу или полю. [http://www.morepc.ru/dict/] Тематики информационные технологии в целом EN backtab … Справочник технического переводчика
- Обратная связь: Техподдержка, Реклама на сайте
- Путешествия
Экспорт словарей на сайты, сделанные на PHP,
WordPress, MODx.
- Пометить текст и поделитьсяИскать в этом же словареИскать синонимы
- Искать во всех словарях
- Искать в переводах
- Искать в ИнтернетеИскать в этой же категории
Основы программирования на языке Python. Часть 2
На минутку представим себя богами. В первой части этой статьи мы с вами разобрали самые базовые элементы программирования. Или на нашем, на «божественном» — мы научились создавать самый простой мир, в котором живут разные человечки со своими особенностями, но без целей в жизни. Пора заставить их что-то делать и использовать свой потенциал по максимуму. Для этого переходим на новый уровень.
Условная конструкция. Табуляция
В этой статье мы будем переводить с алгоритмического языка на язык Python то, что выучили в одной из предыдущих статей — «Основы алгоритмов». Также мы успели изучить создание и применение переменных в Python, и то, какие типы данных могут быть им присвоены, в статье «Основы программирования на языке Python. Часть 1». Но далеко на этом не уедешь — нет никакой гибкости, никаких дополнительных возможностей, ничего интересного.
Условная конструкция if-elif-else — первый шаг на пути к разнообразию. Ее цель — совершать конкретные действия при конкретных обстоятельствах.
Эта логическая конструкция расшифровывается так — «если-иначе». Даже без нашего четкого осознания она появляется в повседневной жизни везде. Самая простая идея алгоритма с ветвлением (с условием): «Если в холодильнике нет продуктов, их надо купить, прежде чем начать готовить ужин, иначе можно сразу начинать готовку».
Как в программе Python выглядят ветвления?
Подробно разберем строение этой конструкции:
- if — главная команда создания условия, ее одной уже достаточно. С ней конструкция будет выглядеть так:
Если выполнится, то будет запущено , иначе не произойдет ничего.
x = 25 if x > 0: print(“x больше 0”) Вывод программы: х больше 0 | x = -6 if x > 0: print(“x больше 0”) Вывод программы: ничего не будет выведено |
- else — команда, задающая альтернативу.
if :
else:
Если выполнится, то будет запущен блок , а если оно не выполнится — запустится .
- elif — команда для создания сложного условия, когда у нас есть не два исхода, а больше.
if :
elif :
elif :
…
else:
В зависимости от выполнения какого-то из будет запущено соответствующее . Команда else в данном случае не обязательна: если она есть, при невыполнении всех условий выполнится ее тело, а если ее нет — просто не произойдет ничего.
Табуляцию можно проставить либо нажатием клавиши Tab, либо используя несколько идущих подряд пробелов. Традиционно табуляции соответствует 4 пробела. Но нельзя одновременно использовать и пробелы, и Tab — в одном блоке должно быть только что-то одно.
Про табуляцию вообще нельзя забывать и нужно быть с ней аккуратнее:
- если ее проставить неправильно — программа будет выполняться не так, как мы задумали;
- если не проставить совсем — программа не сможет даже запуститься.
А чем вообще может быть условие команды?
Это должна быть такая конструкция, про которую определенно можно сказать, истинна она или ложна. Например, 5 > 1 — истина (True), а 5 > 10 — ложь (False).
Для записи условий в Python предусмотрены как математические операторы сравнения, так и логические операторы:
Математические операторы сравнения работают так же, как и в школьном курсе алгебры. Только обратите внимание, что большинство из них записывается иначе, и могут применяться не только для чисел, а и для других типов данных.
Когда мы попробуем вывести на экран результат выполнения условия, мы увидим, что он может вернуть:
- либо значение True, которое соответствует выполнению записанного условия;
- либо False, соответствующее невыполнению условия.
x = 15
y = 16
print(x == y)
print((y > x) and (x > 5))
Это как раз и есть тот самый тип данных bool из предыдущей части статьи.
А ниже приведен пример кода, в котором разная расстановка отступов дает нам совершенно разное поведение программ.
Циклы. Тип range
Как в программе Python выглядят циклы?
Циклы используются для многократного повторения определенной команды или набора команд. Для выделения тела цикла также используется табуляция.
В Python есть два цикла — while и for.
Цикл while будет повторять команды своего тела до тех пор, пока выполняется условие, записанное для него.
Структура записи этого цикла:
Например, нам нужно уменьшать значение переменной a в 2 раза нацело до тех пор, пока она не станет меньше или равной переменной b. Для этого в условии цикла прописываем сравнение переменных, а в теле цикла — уменьшение значения переменной a. Пока условие выполняется (то есть принимает значение True), будет выполняться тело цикла, а когда оно перестанет выполняться — свою работу продолжит основной блок кода.
a = 1000000
b = 16
while a > b:
a //= 2
print(a)
После первой итерации (запуска содержимого цикла) переменная а будет равна 500 000, после второй — 250 000 и т.п. Итерации будут повторяться, пока будет продолжать быть истинным выражение a > b. Когда итерации цикла завершаются, мы видим итоговое значение переменной а после всех делений — 15.
Бесконечный цикл — ситуация, когда цикл while сам по себе никогда не сможет завершить свою работу, то есть значение его условия никогда не перестанет быть равным True.
Но как вообще можно в него попасть?
- Случайно, когда в записи условия работы цикла была допущена ошибка.
В приведенном примере цикл будет работать до тех пор, пока значение переменной b больше 0. Но никакого изменения этой переменной не происходит, она не меняет своего значения, и, соответственно, никогда не станет меньше или равной 0. А значит, цикл никогда не завершит свою работу.
- Специально. Редко, но это имеет смысл. Например, когда условие работы цикла зависит от большого количества параметров, проще будет прямо в цикле указать, что ему стоит прекратить свою работу.
Для создания бесконечного цикла в условии работы нужно прописать выражение, результат которого всегда будет равен True. Например, это может быть само значение True или условие сравнения 0 == 0, также возвращающее всегда True (0 действительно всегда равен 0).
Для остановки цикла используется команда break. Когда цикл натыкается на нее, он моментально прекращает свою работу. Не сработает и последующий блок кода, не будет и следующего шага цикла — программа сразу перескакивает в основной блок кода после цикла.
В примере мы создали бесконечный цикл, но, как только значение a станет меньше или равным b, выполнится условие if и сработает команда break, которая завершит цикл.
Цикл for необходим для выполнения команды или набора команд определенное количество раз или перебора набора данных.
Этот цикл похож на человека, выкладывающего продукты на кассе в магазине. Сколько бы ни было продуктов в корзине — он каждый достанет из корзины и положит на ленту, перебирая по очереди все продукты.
Структура записи цикла for:
Здесь мы сталкиваемся с понятием коллекции — той самой нашей «корзины с покупками», то есть какой-то структуры данных, содержащей много различных значений в себе. Пока что мы из таких типов структур данных знакомы со строками и списками из первой части статьи, а ниже в этой статье разберем еще одну — range.
Как работает цикл for? На каждом шаге цикла будет принимать новое значение из , после чего будет выполняться .
По традиции, если перебираемая переменная не несет в себе особой смысловой нагрузки, ее называют i, j или k.
может принимать любое значение, которое можно перебрать.
a = «abcd» for i in a: print(i) | Вывод: a b c d |
- перебор списка:
a = [12, 34, 567, 8910] for i in a: print(i) | Вывод: 12 34 567 8910 |
- перебор диапазона range, который создает набор целых чисел.
Команда range позволяет создавать диапазоны — последовательности целых чисел, отличающихся друг от друга на одно и то же число — разницу или шаг диапазона.
Есть несколько способов создания диапазона:
- range(a) — диапазон целых чисел от 0 до (a — 1) с шагом 1.
Например: range(5) — 0, 1, 2, 3, 4.
- range(a, b) — диапазон чисел от a до (b — 1) с шагом 1.
Например: range(2, 7) — 2, 3, 4, 5, 6.
- range(a, b, step) — диапазон чисел от a до (b — 1) с разницей между соседними числами, равной step.
Например: range(1, 17, 3) — 1, 4, 7, 10, 13, 16.
for i in range(2, 6): print(i) | Вывод: 2 3 4 5 |
Взаимозаменяемость циклов
Сейчас мы будем заниматься практикой, а заодно посмотрим, как с помощью разных циклов можно решить одну и ту же задачу.
Задача.
У нас есть список чисел a. Нужно вывести на экран его содержимое, по одному числу в строке.
Решение №1.
Чтобы выполнить задачу, нам необходимо перебрать каким-то циклом все его элементы и каждый вывести на экран. Тогда напрашивается самое очевидное решение:
for i in a:
print(i)
Мы берем каждый элемент списка и выводим его, все просто. Но это не единственный способ.
Решение №2.
Мы можем вместо элементов списка перебирать числа-позиции элементов в списке а и выводить на экран элементы на соответствующих позициях. Это можно сделать, например, так:
for i in range(len(a)):
print(a[i])
Здесь len(a) — это длина списка а. Мы используем ее, чтобы понять, до какого числа надо перебирать i, чтобы на i-тых позициях списка все еще были элементы. Это же можно тоже записать другим способом:
Разные подходы к применению циклов позволяют всегда выбирать наиболее удобный под конкретные задачи. Например, здесь нам не важны позиции элементов списка и проще всего было использовать первое решение. Но в разных контекстах задач могут быть разные преимущества и недостатки каждого из циклов.
Вложенные структуры
После знакомства с условными конструкциями и циклами разброс наших возможностей сильно возрастает. Но он возрастет еще сильнее, если мы научимся правильно их комбинировать и использовать одно в другом.
Для этого можем воспользоваться вложенными структурами, когда одна конструкция находится внутри другой.
Такой пример уже мелькнул — когда мы говорили о бесконечном цикле и команде break. Мы сделали так, что внутри цикла команда break выполнится только при истинности условия, для чего прямо внутри цикла while мы использовали условную конструкцию if.
Чтобы программа «не сошла с ума», пытаясь понять, где тело цикла, а где тело условия, мы продолжили использовать табуляцию.
Весь блок условия находится в цикле, поэтому табуляция цикла никуда не делась. Тело вложенного условия получает свою собственную табуляцию прямо поверх предыдущей. Эти разные табуляции отмечены зеленым и синим цветом.
Вложенные структуры — удобный способ повысить возможности программы. Здесь мы никак не ограничены: мы можем вкладывать циклы в циклы, условия в условия, циклы в условия и так далее. Количество вложений также ничем не ограничено.
Важно запомнить: если друг в друга вкладывается несколько циклов for, их переменные должны иметь разные имена. |
Разберем в качестве примера следующий код:
n = 1
for i in range(3):
for j in range(2):
n += 2
n *= 3
print(n)
Какое число на экране будет в результате этой программы?
У нас есть внутренний цикл и внешний. Тело внутреннего цикла запускается дважды: при j = 0 и j =1. Каждый раз значение n увеличивается на 2. Значит, в процессе работы внутреннего цикла значение n увеличивается на 2 * 2 = 4.
Тогда тело внешнего цикла — прибавление к n 4 и умножение на 3. Цикл повторяется трижды — i принимает значения 0, 1, 2. Тогда после первой итерации внешнего цикла n=(1+4)*3=15, после второй итерации n=(15+4)*3=57, после третьей — n=(57+4)*3=183.
На экран будет выведено 183.
Импорт модулей
Для еще большего увеличения мощи нашей программы мы можем использовать модули — наборы инструментов с готовыми решениями части наших задач.
Это легко сравнить с проведением ремонта в квартире. Мы можем что-то сделать простыми инструментами, которые лежат на балконе. Но гораздо эффективнее будет съездить в магазин за специальными инструментами. Так мы не только шкаф — ракету соберем.
Какие есть модули и какие в них есть инструменты — мы будем изучать по мере необходимости. Сейчас главное — узнать, как именно это делается. И делать мы это будем на примере модуля math, в котором лежит прекрасная функция sqrt. Она умеет извлекать корни чисел.
Если вдруг случилось так, что вы совсем забыли, как извлекаются корни чисел, то советуем обратиться к нашей статье по математике «Понятие корня».
Для получения инструментов модуля необходимо произвести его импорт — добавление модуля или его частей в программу. Сделать это можно несколькими способами:
import math
При такой записи доступ к конкретной функции мы получим, прописав название этого модуля, после него через точку — название необходимой функции.
- Импорт всех функций модуля:
from math import *
При такой записи в нашу программу попадают вообще все функции модуля, для доступа к которым теперь не нужно прописывать название самого модуля.
- Импорт конкретных функций модуля:
from math import sqrt
Такая запись даст нам доступ только к конкретным функциям из всего модуля, которые мы импортируем.
Понимание условий и циклов необходимо для решения любых задач на программирование. Разберем пример задачи №6 ОГЭ.
Дана программа на языке программирования Python:
a = int(input())
b = int(input())
if a == 15 or b == 50:
print(“Да”)
else:
print(“Нет”)
Было проведено 9 запусков. В качестве переменных a и b пользователь вводил следующие значения. Первое значение – переменная a, второе значение – переменная b.
(15; 19); (19; 50); (10; 26); (10; 56); (8; 50); (10; 10); (50; 50); (10; 2); (10; 40).
Определите количество запусков, при которых программа выведет «Да».
Решение.
Заметим, что программа печатает «Да», если a = 15 или b = 50, то есть выполнение хотя бы одного из равенств говорит о том, что программа выведет «Да».
Проверим пары чисел на условия:
— (15; 19) — выполнено a = 15;
— (19; 50) — выполнено b = 50;
— (10; 26) — не выполнено;
-(10; 56) — не выполнено;
— (8; 50) — выполнено b = 50;
— (10; 10) — не выполнено;
— (50; 50) — выполнено b = 50;
— (10; 2) — не выполнено;
— (10; 40) — не выполнено.
Нам подойдут все пары, кроме тех, где написано «не выполнено». Их всего 4 штуки.
Ответ: 4
Существует математическое доказательство того, что с помощью циклов и условий можно реализовать совершенно любой алгоритм. Но использование циклов и условий — только самый базовый уровень программирования, и какие-то сложные вещи нам останутся недоступны.
Это все равно что собирать автомобиль, имея под рукой только листы металла. Дальше вы узнаете про много особенностей языка, упрощающих создание алгоритмов, чтобы заменить эти листы металла на заготовки деталей и прочие более удобные для сборки элементы. Но прежде чем работать с более высокоуровневыми конструкциями, надо попрактиковаться в работе с уже пройденным материалом, например, в этой статье.
Фактчек
- Табуляция — способ структуризации кода, где отдельные блоки кода выделяются отступами.
- Условная конструкция if-elif-else необходима для выполнения определенных блоков кода при определенных исходах условия.
- Циклы нужны для многократного повторения блока кода. Цикл while выполняет блок кода, пока выполняется переданное ему условие; цикл for перебирает переданные ему значения.
- Импортируя модули, мы можем получить доступ к функциям, которые изначально в программе доступны не были.
Проверь себя
Задание 1.
Без запуска кода определите, что будет выведено на экран в результате выполнения программы:
Задание 2.
Без запуска кода определите, что будет выведено на экран в результате выполнения программы:
x = 250
if x < 100:
print(x + 25)
elif x print(x — 100)
Задание 3.
Без запуска кода определите, что будет выведено на экран в результате выполнения программы:
b = 0
for i in range(5):
b = b + i
print(b)
Задание 4.
Без запуска кода определите, что будет выведено на экран в результате выполнения программы:
x = 50
y = 20
while x < y:
x -= 20
print(x)
Ответы: 1. — 4; 2. — 3; 3. — 3; 4. — 3.