/
Tags: языки программирования трансляторы
ISBN: 978-5-9228-3054-6
Text
С. А. Гутник
А. Н. Лата
Вычислительные
методы на Python
КНИГА ПЕРВАЯ
ИЗДАТЕЛЬСКИЙ ДОМ
МГИМО
МГИМО
ИЗДАТЕЛЬСКИЙ
дом
mMBMm
182^
Издательский дим МГИМО.
переплетая Запад и Восток, продолжает традиции
Типографии Лазаревского института восточных языков,
основанной в 1829 году
Moscow State Institute
of International Relations (University)
of the Ministry of Foreign Affairs
of the R ussian Federation
Department of Mathematics. Econometrics
and Information technology
Sergei Gutnik, Aleksandr Lata
Computational Methods
in Python
TEXTBOOK
IN TWO BOOKS
BOOK ONE (chapters 1 4)
Moscow
MGIMO University Publishing House
2026
Московский государственный институт
международных отношений (университет)
Министерства иностранных дел
Российской Федерации
Кафедра математики, эконометрики
и информационных технологий
С. А. Гутник, А. Н. Лата
Вычислительные методы
на । ’ython
УЧЕБНОЕ ПОСОБИЕ
В двух книгах
Кинга первая (главы 1 4)
Утверждено редакционно- издательским советом
МГИМО МИД России в качестве учебного пособия
Москва
Издательский дом МГИМО
2026
УДК 004.432(075.8)
БЕК 32.973.2я73
Г97
Рецензенты:
заместитель заведующего кафедрой информатики
и вычислительной математики МФТИ
доктор физико-математических наук, доцент В. И Голубев,
заведующий кафедрой эконометрики и математических методов экономики
Московской школы экономики МГУ имени М. В. Ломоносова
кандидат физико-математических паук, доцент А. Н. Курбацкий
В оформлении обложки использована картина Василия Кандинского
«Тридцать*. 1937. Национальный центр искусства и культуры
Жоржа Помпиду, Париж (ССО)
Гутиик, Сергей Александрович.
Г97 Вычислительные методы па Python : учебное пособие : в 2 книгах
С. А. Гутиик, А. Н. Лата ; Московский государственный институт меж-
дународных отношений (университет) Министерства иностранных дел
Российской Федерации. Кафедра математики, эконометрики и инфор-
мационных технологий. Москва : Издательский дом МГИМО. 2026.
ISBN 978-5-9228-3054-6
Книга 1 (главы 1-4). — 291, |1| с.
ISBN 978-5-9228-3074-4
DOI 10.63861/3074-4
Учебное пособие представляет собой базовый курс по программированию
на Python и предназначено для формирования практических навыков автомати-
зации вычислений и анализа данных. Книга 1 знакомит с базовыми понятия-
ми, синтаксисом и конструкциями языка, закладывая фундамент алгоритмическо-
го мышления. Кинга 2 даст представление об основных возможностях библиотек
NumPy и pandas для работы с данными. Пособие содержит практические примеры
и блоки упражнений для закрепления навыков программирования.
Для студентов вузов, обучающихся по направлениям «Экономика», «Бизнес-
аналитика», «Менеджмент», «Юриспруденция», «Торговое дело» и начинающих
изучать программирование.
УДК 004.432(075.8)
ББК 32.973.2я73
ISBN 978-5-9228-3074-4 (кн. 1)
ISBN 978-5-9228-3054-6
DOI 10.63861/3074-4
© Гутиик С. А., Лата А. Н.. 2026
© МГИМО МИД России. 2026
Оглавление
Предисловие........................................................ 9
Введение.......................................................... 12
Глава 1. Знакомство с Python и инструментами разработки . . 16
§1.1 . Основные понятия и определения ....................... 16
§1.2 . Язык программирования Python...........................20
§ 1.3. Установка Python.......................................21
§ 1.4. Настройка виртуального окружения.......................24
1.4.1. Создание и активация виртуального окружения .........25
1.4.2. Деактивация виртуального окружения...................27
§1.5 . Установка необходимых библиотек......................... 28
1.5.1. Установка библиотек с помощью pip................... 28
1.5.2. Установка библиотек из файла requirements.txt........30
1.5.3. Установка библиотек с помощью conda................. 30
§ 1.6. Работа с IDE ..........................................33
1.6.1. IDLE ................................................33
1.6.2. PyCharm..............................................34
1.6.3. Visual Studio Code................................. 35
1.6.4. Jupyter Notebook Lab................................ 36
§1.7 . Интерактивный и скриптовый режимы в Python ..............39
§ 1.8. Первые таги в Jupyter Notebook Lab.....................41
§1.9 . Ввод и вывод данных Комментарии в коде...................43
1.9.1. Ввод данных..........................................43
1.9.2. Вывод данных.........................................44
1.9.3. Форматированный вывод................................46
1.9.4. Спецификаторы формата для чисел .....................50
1.9.5. Комментарии в коде...................................56
§1.10 . Правила оформления кода............................58
1.10.1. Общие принципы ............................... 60
1.10.2. Пробелы и пустые строки .......................61
1.10.3. Идентификаторы и пространство имен.............65
1.10.4. Ключевые слова и специальные символы...........72
1.10.5. Организация кода в Jupyter Notebook Lab ......... 74
Контрольные вопросы....................................... 76
Практикум: алгоритмы и имена переменных .................. 78
Заключение .................................. 83
Глава 2. Основные типы данных и операции...................84
§2.1 . Переменные и идентификаторы.......................84
§2.2 . Числовые типы данных. Арифметические операции.....87
2.2.1. Арифметические операции.........................89
2.2.2. Особенности арифметических операций в Python....92
2.2.3. Комбинация арифметических операций и присваивания . . 94
§2.3 . Логический тип данных и логические операции ......95
§2.4 . Последовательности................................100
2.4.1. Индексация последовательностей.................102
2.4.2. Срезы последовательностей .....................103
2.4.3. Сравнение последовательностей..................105
§2.5 . Строки и операции со строками....................106
§2.6 . Неизменяемая последовательность целых чисел.....126
§2.7 . Списки и операции со списками . ............... 132
§ 2.8. Кортежи и операции с кортежами............ 146
§ 2.9. Словари и операции со словарями..................151
§2.10 . Множества и операции с множествами...............159
§2.11 . Проверка типов данных............................168
§2.12 . Встроенные функции для работы с основными типами данных 169
§2.13 . Преобразование типов данных .................... 170
§2.14 . Изменяемые и неизменяемые типы данных .............. 173
2.14.1. Неизменяемые типы данных.........................174
2.14.2. Изменяемые типы данных.......................... 175
2.14.3. Ошибки при копировании изменяемых объектов.......176
2.14.4. Правильное копирование изменяемых объектов.......177
2.14.5. Практические рекомендации.........................178
Контрольные вопросы..........................................181
Практикум: работа с основными типами данных..................186
Заключение...................................................199
Глава 3. Управляющие конструкции . . 201
§3.1 . Условные операторы if, if-clsc. if-elif-elsc..........201
§ 3.2. Циклы for и while...................................206
3.2.1. Цикл for .........................................206
3.2.2. Цикл while........................................207
3.2.3. Операторы pass, break n continue..................210
§ 3.3. Цикл for c else.....................................214
§3.4 . Цикл while c else................................. 215
§3.5 . Включения (comprehensions) .........................217
3.5.1. Списковые включения ..............................219
3.5.2. Множественные включения ..........................222
3.5.3. Словарные включения ..............................223
§3.6. Обработка исключений................................225
Контрольные вопросы..........................................231
Практикум: Условные операторы и циклы...................... 235
Заключение...................................................242
Глава 4. Повторное использование кода . . . 243
§4.1 Функции.............................................243
4.1.1. Определение функции ..............................244
4.1.2. Вызов функции .................................. 247
4.1.3. Возвращаемые значения.......................... 251
4.1.4. Документация функций ... 255
4.1.5. Позиционные и именованные аргументы функции......255
4.1.6. Аргументы переменной длины.......................261
4.1.7. Области видимости переменных.....................264
4.1.8. Лямбда-функции ................................ 265
§ 4.2. Магические методы и функции..........................267
§ 4.3. Документация кода....................................269
4.3.1. Докстринги.......................................270
4.3.2. Комментарии и отдельная документация.............271
§ 4.4. Работа с внешними модулями и пакетами................272
Контрольные вопросы.........................................275
Практикум: создание и использование функций.................277
Заключение..................................................292
Предисловие
В 1991 году голландский программист Гвидо ван Россум создал язык
программирования Python, назвав сто в честь британского комедийного шоу
«Летающий цирк Монти Найтона». Вряд ли он мог предположить, что через
три десятилетия его детище станет одним из самых востребованных инструмен-
тов не только в мире IT, но и в экономике, финансах, юриспруденции, пауке
и государственном управлении
Сегодня мы живем в эпоху, когда граница между «техническими»
и «нстсхничсскими» профессиями стремительно размывается. Экономист, ко-
торый нс умеет обрабатывать большие массивы данных, юрист, не владею-
щий инструментами автоматизации документооборота, или менеджер, полагаю-
щийся исключительно па интуицию вместо анализа данных, рискует оказаться
па обочине профессионального развития.
Почему это пособие появилось именно сейчас
Идея написания этого пособия возникла из опыта преподавания
в МГИМО МИД России, университете, который готовит специалистов для ра-
боты в различных сфе рах: от дипломатии до международного бизнеса. Мы на-
блюдали, как студенты экономических и управленческих специальностей стал-
киваются с необходимостью освоения цифровых инструментов, но при этом
нс находят подходящих учебных материалов.
Большинство существующих курсов по программированию ориентирова-
ны либо на будущих разработчиков программного обеспечения, либо на мате-
матиков и физиков. Экономисту, изучающему основы программирования через
примеры с геометрическими фигурами, или юристу, осваивающему структуры
данных на задачах сортировки массивов, трудно увидеть практическую цен-
ность изучаемого материала.
Как пользоваться этим пособием
Пособие построено ио принципу постепенного усложнения, но каждая
глава содержит законченные примеры, которые можно использовать незави-
симо. Если вы уже имеете базовые навыки программирования, можете начать
с разделов, посвященных работе с данными. Если программирование для вас
terra incognita, то рекомендуем последовательное изучение с самого начала.
Особое внимание уделите практическим заданиям. Программирование
это навык, который развивается только через практику. Не ограничивайтесь
простым чтением кода обязательно выполняйте упражнения, эксперименти-
руйте с параметрами, адаптируйте примеры под свои задачи.
Благодарности
Выражаем искреннюю благодарность рецензентам за детальный анализ
рукописи и обнаруженные опечатки.
Это пособие не появилось бы без поддержки коллег из МГИМО и МФТИ,
которые делились опытом преподавания и помогали тестировать материалы
на практике. Особую благодарность выражаем студентам, чьи вопросы и за-
труднения помогли нам понять, какие темы требуют более подробного объяс-
нения, а какие примеры наиболее эффективно демонстрируют практическое
применение изучаемых концепций.
Мы также признательны сообществу Python разработчиков, которое со-
здало и поддерживает экосистему библиотек, делающих этот язык настолько
мощным и универсальным инструментом.
Взгляд в будущее
Мир экономики и финансов меняется с невероятной скоростью, и движу-
щей силой этой транс формации становятся данные и технологии. Тс инструмен-
ты анализа, которые сегодня кажутся революционными, завтра войдут в стан-
дартный арсенал каждого компетентного специалиста. Однако в этом потоке
изменений неизменной остается фундаментальная ценность: умение алгорит-
мически мыслить, формулировать четкие логические инструкции для решения
задач, автоматизировать рутинные процессы и извлекать содержательные ин-
сайты из цифрового хаоса. Именно это умение, а по знание конкретного, пусть
и самого популярного, синтаксиса, станет ключевым профессиональным диф-
ференциалом в ближайшем десятилетии.
Python в этом контексте — гораздо больше, чем просто язык программи-
рования. Для экономиста, аналитика или финансиста он становится новой оп-
тикой для профессионального зрения. Это способ перевести качественные
экономические гипотезы на язык количественной проверки, превратить много-
часовую рутину по сводке отчетов из разных источников в мгновенный скрипт,
а также построить собственную, пусть и упрощенную, модель для оценки ин-
вестиционного риска или прогнозирования макроэкономических показателей.
Python стирает барьер между «теми, кто ставит задачу», и «теми, кто се тех-
нически исполняет», возвращая экономисту полноту контроля над исследова-
тельским процессом.
Будущее, которое мы видим, — это не тотальное замещение экономистов
машинами, а синергия человеческой экспертизы и вычислительных мощностей.
Искусственный интеллект и машинное обучение на Python будут’ обрабатывать
терабайты данных, выявляя сложные, неочевидные паттерны. Но задавать пра-
вильные вопросы, интерпретировать результаты в контексте экономики, пони-
мать ограничения моделей и принимать ответственные решения на основе этих
инсайтов останется прерогативой специалиста, вооруженного критическим
мышлением и предметными знаниями. Python становится тем самым «усили-
телем интеллекта», который позволяет сфокусироваться на сути, делегировав
вычисления ком 11ьютеру.
Это пособие задумано как ваш проводник в формирующуюся реальность,
где технологическая грамотность не узкоспециальный навык, а обязатель-
ный компонент экономического образования. Мы надеемся, что освоив эти ин-
струменты. вы перестанете воспринимать технологии как барьер или «черный
ящик», а начнете видеть в них мощного и предсказуемого союзника. Союзни-
ка, который освобождает самый ценный ресурс — время — для творческой,
исследовательской и стратегической работы, где по-прежнему нет равных че-
ловеческому интеллекту и интуиции.
Авторы
Москва, июнь 2025 1
Введение
Современный мир характеризуется быстрым развитием информацион-
ных технологий и цифровизации всех сфер жизни, что приводит к необхо-
димости ос воения новых навыков и инструментов. Цифровая трансформация
коренным образом меняет подходы к работе в самых разных профессиональ-
ных сферах. То, что еще недавно казалось прерогативой IT-специалистов, сего-
дня становится базовым инструментом для экономистов, менеджеров, юристов
и представителей многих других профессий. В этом новом мире программиро-
вание превращается из узкоспециализированного навыка в универсальный язык
эффективности.
Программирование — это не просто написание кода. Это способ мыш-
ления, который позволяет автоматизировать рутину, находить закономерности
в хаосе данных и создавать решения там, где их раньше нс существовало. Спе-
циалисты, владеющие навыками программирования, получают возможность:
• автоматизировать рутинные (повторяющиеся) задачи, что осво-
бождает время для более важных и творческих аспектов работы:
• обрабатывать и анализировать большие объемы данных (Big
Data), что помогает принимать более обоснованные решения на основе
данных, превращать их в конкретные бизнес-решения;
• строить модели экономических процессов и проводить прогнозиро-
вание на основе статистических методов:
• создавать визуализации данных, что позволяет лучше понимать
п интерпретировать результаты анализа;
• оптимизировать бизнес-процессы, проводить моделирование эко-
номических сценариев и оценивать риски:
* создавать собственные инструменты и приложения, которые мо-
гут значительно упростить работу, повысить ее эффективность и точно
соответствуют вашим потребностям;
• разрабатывать и внедрять системы управления знаниями и экс-
пертные системы, которые помогают в принятии решений па основе
знаний и опыта;
• работать с современными IT-решениями, такими как системы
бизнес-аналитпки (LJI), системы управления базами данных (СУБД или
DBMS), CRM и F.RP системы, а также другие инструменты для автома-
тизации и управления бизнес-ироцессами;
• внедрять инновации. От систем управления знаниями до правовых тех-
нологий (LegalTech) программирование открывает двери для внедрения
новых технологий и решений и помогает оставаться конкурентоспособны-
ми в быстро меняющемся мире.
Программирование — эго не только про код. но и про эффективность.
Сегодня тс, кто владеет цифровыми инструментами, диктуют тренды в различ-
ных областях, включая экономику и финансы, маркетинг, образование, медици-
ну, а также государственное управление и юриспруденцию. Python — это ваш
ключ к цифровому будущему, который превращает вас из наблюдателя техно-
логическою прогресса в его создателя, открывая путь от простого следования
инструкциям к формированию цифровой реальности.
Язык программирования Python — это по просто инструмент, это экоси-
стема. которая включает мощные библиотеки для анализа данных, машинного
обучения, веб-разработки и автоматизации бизнес-процессов.
Таким образом, программирование становится мощным инструментом,
способным значительно повысить эффективность работы специалистов в раз-
личных областях, помогая им адаптироваться к современным требованиям рын-
ка и достигать новых профессиональных высот.
В этом пособии мы познакомим вас с основами программирования
на Python, начиная с установки и настройки среды разработки, изучения базо-
вых синтаксических конструкций и заканчивая более сложными концепциями,
такими как работа с библиотеками и модулями.
В пособии представлены примеры кода, которые помогут вам освоить
язык и применить его в своей профессиональной деятельности. Мы также рас-
смотрим практические задачи и упражнения, которые позволят вам закрепить
полученные знания.
В пособии мы будем использовать Python 3.13 и выше, так как это по-
следняя стабильная версия языка па момент написания пособия. Мы рекомен-
дуем использовать Jupyter Notebook Lab или Google Colab. или Anaconda
Cloud, или Visual Studio Code для выполнения практических заданий, так
как они предоставляют удобную среду для работы с Python и позволя-
ют легко визуализировать результаты. Подробное о средах разработки мож-
но узнать в §1.6. В пособии мы будем использовать библиотеки ХшиРу
и Pandas, которые являются стандартными инструментами для работы с дан-
ными в Python. Эти библиотеки позволяют эффективно обрабатывать и анали-
зировать данные, а также создавать визуализации данных.
Мы надеемся, что это пособие поможет вам освоить основы программи-
рования па Python и применить их в своей профессиональной деятельности.
Сведения об авторах
• Гутник Сергей Александрович доктор физико-математических на-
ук, доцент кафедры математики, эконометрики и информационных тех-
нологий МГИМО МИД России, профессор кафедры информатики и вы-
числительной математики МФТИ (НИУ).
• Лата Александр Николаевич кандидат физико-математических на-
ук. преподаватель кафедры математики, эконометрики и информацион-
ных технологий МГИМО МИД Россам.
Авторский вклад
• Гутник С. А.: предисловие (в соавт.), гл. 6 (§6.1 6.3, §6.6 в соавт./,
§6.7 6.8),
• Лата А. Н.: предисловие (в соавт.), введение, гл. 1 5, гл. 6 (§6.1 6.5, §6.6
/в соавт./), г.1.1 6 (практикумы).
Связь с авторами
Мы высоко ценим вашу внимательность и готовность помочь в улучше-
нии качества данного пособия. Если вы заметили опечатки, поточности в фор-
мулировках. ошибки в примерах кода, иные недочеты или хотите предложить
улучшения к материалам пособия, пожалуйста, сообщите о них авторам.
Для обратной связи используй ге один из следующих способов:
• напишите на электронную почту: lata.alexandr ('ginail.сош с пометкой
«Опечатки/исправления »;
• создайте issue на странице проекта на GitHub
https: //github.com/alexanderlata python-for-beginners
Мы стремимся сделать пособие максимально полезным и удобным
для читателей, и ваша обратная связь поможет нам в этом. Ваши коммента-
рии. отзывы и предложения будут учтены при подготовке следующих изданий
пособия.
Глава 1. Знакомство с Python и инструментами
разработки
В данной главе мы рассмотрим основные понятия и определения, свя-
занные с программированием и языком Python.
Введение в программирование включает в себя изучение основных по-
нятий и определений, связанных с программированием. Программирование на
Python включает в себя изучение синтаксиса языка, его конструкций и библио-
тек, которые позволяют решать широкий спектр задач. Кроме того, необходимо
рассмотреть установку Python, настройку окружения, установку необходимых
библиотек и работу с интерпретатором Python, а так?кс с интегрированными
средами разработки (IDE) и текстовыми редакторами. Мы также рассмотрим
первые шаги в Jupyter Notebook / Lab, которые являются популярными ин-
струментами для работы и изучения Python.
§1.1. Основные понятия и определения
Алгоритм — эго последовательность шагов, которые необходимо вы-
полнить для решения задачи.
Описание алгоритма это формальное представление последователь-
ности действий, которые необходимо выполнить для решения задачи. Описание
алгоритма может быть выполнено в виде текстовых описаний, блок-схем или
программного кода. Программирование включает в себя разработку атгорит-
мов, их реализацию на языке программирования и тестирование полученных
программ.
Важно, чтобы описание алгоритма было попятным и однозначным, что-
бы его можно было легко реализовать на языке программирования.
Параметры алгоритма это входные данные, которые необходимы
для его выполнения. Опи могут быть представлены в виде чисел, строк, спис-
ков и других типов данных. Параметры алгоритма определяют, какие данные
будут обработаны и каким образом. Параметры могут быть обязательными или
необязательными, в зависимости от того, требуется ли их передача для выпол-
нения алгоритма.
Параметры алгоритма могут быть представлены в виде переменных, ко-
торые хранят значения, переданные в алгоритм. Например, если алгоритм вы-
полняет сложение двух чисел, то параметры будут представлять собой эти чис-
ла.
Результат алгоритма это выходные данные, которые получаются
в результате его выполнения. Результаты могут быть представлены в виде чи-
сел. строк, графиков и других форматов. Важно, чтобы результаты были по-
нятными и полезными для пользователя.
Программа это последовательность инструкций, написанных на язы-
ке программирования, которые выполняются компьютером для решения опре-
деленной задачи. Программы могут быть простыми или сложными, в зависи-
мости от их функциональности и объема кода. Они могут быть написаны па
различных языках программирования, таких как Python, Java, С-*—г, JavaScript
и других. Каждый язык имеет свои особенности и предназначен для реше-
ния определенных задач. Программы могут работать па разных платформах:
Windows, Linux, maeOS и других.
Программирование - это процесс создания программ, которые выпол-
няют определенные задачи па компьютере. Программирование позволяет авто-
матизировать рутинные задачи, обрабатывать данные и создавать приложения
для различных целей. В процессе программирования используются различные
инструменты и методы, такие как языки программирования, среды разработки,
отладчики и системы управления версиями.
Парадигма программирования это общий подход к решению задач
с использованием определенных методов и инструментов. Существуют различ-
ные парадигмы программирования, каждая парадигма имеет свои особенности
и применяется в зависимости от задачи.
Парадигма программирования определяет, как организовать код, как ис-
пользовать функции и классы, а также как взаимодействовать с данными. На-
пример. в объектно-ориентированном программировании акцент делается на
создание объектов и их взаимодействие, тогда как в функциональном програм-
мировании основное внимание уделяется функциям и их композиции.
Подробнее о парадигмах программирования можно узнать в книге |15].
Тип данных это категория данных, которая определяет, какие значе-
ния могут быть представлены и какие операции могут быть выполнены над эти-
ми данными. Тип данных определяет, как данные будут храниться в намяли и
как они будут обрабатываться. Типы данных могут быть встроенными (предо-
ставляемыми языком) или пользовательскими (созданными программистом).
В Python существуют встроенные тины данных, такие как целые числа lint),
числа с плавающей запятой (float), строки (str), списки (list), кортежи (tuple),
множества (set), словари (diet) и специальный тип NoneType. Каждый тип
данных имеет свои особенности и методы работы с ним.
Важно правильно выбирать тип данных в зависимости от задачи, чтобы
обеспечить эффективное выполнение программы.
Подробнее о типах данных в программировании можно узнать в кни-
ге [15|.
Переменная это именованная область памяти, которая используется
ддя хранения данных. Переменные позволяют сохранять значения и использо-
вать их в программе. Переменные могут хранить различные типы данных. Они
могут быть изменяемыми или неизменяемыми, в зависимости от типа данных,
который они хранят.
Подход к работе с переменными зависит oi языка программирования
и его синтаксиса. В Python переменные создаются автоматически при присва-
ивании значения, и их тип определяется автоматически в зависимости от при-
своенного значения (динамическая типизация). В других языках, таких как
С + +, переменные должны быть объявлены с указанием типа данных перед
использованием (статическая типизация). В Python переменные могут быть пе-
реопределены для хранения значений другого типа (динамическая типизация).
Программы могут состоять из одной функции или из множества функций
и классов, которые взаимодействуют друг с другом
Функция это именованный блок кода, который выполняет опреде-
ленную задачу. Функции позволяют организовать код и повторно использо-
вать его в различных частях программы. Функции могут принимать аргументы
и возвращать значения. Они могут быть встроенными (предоставляемыми язы-
ком) или пользовательскими (созданными программистом). Функции позволя-
ют разбивать программу па более мелкие, управляемые части, что упрощает
разработку и поддержку кода.
Модуль это файл, содержащий код па языке программирования, ко-
торый может быть импортирован и использован в других файлах. Модули поз-
воляют организовать код и разделить его на ло1 ические части. Опп могут со-
держать функции, классы и переменные, которые могут быть использованы
в других модулях или программах.
Пакет — это набор модулей, объединенных в единое целое.
Модули и пакеты могут быть встроенными (предоставляемыми языком)
или сторонними (созданными другими разработчиками).
Модули и пакеты позволяют организовать код и разделить его на логи-
ческие части, что упрощает ргюработку и поддержку кода.
Библиотека это набор модулей и пакетов, которые предоставляют
готовые решения для часто встречающихся задач. Библиотеки позволяют ис-
пользовать уже написанный код и не тратить время па его повторную реали-
зацию. Они могут содержать функции, классы и переменные, которые могут
быть использованы в других модулях или программах.
Класс это шаблон для создания объектов, который определяет
их свойства и методы. Классы позволяют реализовать принципы объектно-
ориентированного программирования (ООП), что упрощает организацию и по-
вторное использование кода. Классы могут наследовать свойства и методы от
других классов, что позволяет создавать иерархии классов и переиспользовать
код.
Классы могут содержать методы, которые определяют поведение объ-
ектов. и атрибуты, которые определяют их состояние. Классы позволяют со-
здавать объекты с общими свойствами и методами, что упрощает организацию
и повторное использование кода.
Объект это экземпляр класса, содержащий конкретные данные
и методы, определенные в классе. Объекты позволяют реализовать принципы
объектно-ориентированного программирования (ООП), что упрощает организа-
цию и повторное использование кода. Объекты могут взаимодействовать друг
с другом, вызывая методы и изменяя своп внутренние свойства
Объекты могут содержать данные и методы, которые определяют их по-
ведение. Опи могут быть созданы из классов, которые определяют их свойства
и методы. Объекты позволяют создавать сложные структуры данных и реали-
зовывать сложные алгоритмы.
Методы это функции, которые определены внутри класса и могут
быть вызваны из объектов этого класса. Методы позволяют реализовать пове-
дение объектов и взаимодействие между ними. Методы могут принимать пара-
метры и возвращать значения.
Интерпретатор — это программа, которая выполняет процесс интер-
претации. Интерпретаторы могут быть встроенными в языки программирова-
ния или сторонними инструментами. Они позволяют выполнять код построчно,
что упрощает отладку и тестирование программ.
Интерпретация это процесс анализа, обработки и последовательного
выполнения кода на языке программирования. Интерпретация позволяет вы-
полнять код построчно, что упрощает отладку и тестирование программ.
Компилятор это программа, которая выполняет процесс компиля-
ции.
Компиляция — эти процесс преобразования кода па языке программи-
рования в машинный код, который может быть выполнен компьютером. Компи-
ляция позволяет создавать исполняемые файлы, которые могут быть запущены
на различных платформах. Компиляция может занимать больше времени, чем
интерпретация, но позволяет создавать более эффективные программы с точки
зрения производительности.
$ 1.2. Язык программирования Python
Python — это высокоуровневый язык программирования, с открытым ис-
ходным кодом, который был создан Гвидо ван Россумом и впервые выпущен
в 1991 году. Язык Python разработан с акцентом на читаемость и простоту,
что делает его идеальным для начинающих программистов и опытных разра-
ботчиков. Он поддерживает множество парадигм программирования, включая
объектно-ориентированное, функциональное и структурное (процедурное) про-
граммирование.
Python является языком программирования общего назначения, который
широко используется в различных областях, включая пауку о данных, научные
исследования, машинное обучение, веб-разработку и автоматизацию задач. Он
позволяет быстро разрабатывать прототипы и реализовывать сложные алго-
ритмы, что делает его идеальным инструментом для решения практических
задач. Python обладает мощными библиотеками и инструментами, которые рас-
ширяют его функциональность и делают его еще более универсальным инстру-
ментом для решения широкого спектра задач. Он также активно используется
в научных исследованиях и образовании, что делает его отличным выбором
$ 1.3. Установка Python
для студентов и преподавателей. Он позволяет легко реализовывать алгорит-
мы и модели, а также визуализировать данные, что делает его незаменимым
инструментом в научной работе.
§ 1.3. Установка Python
Установка интерпретатора Python это первый шаг на пути к освоению
программирования на этом языке.
Интерпретатор Python можно установить на различных операционных
системах, таких как Windows. macOS и Linux.
Существует несколько способов установки Python, в зависимости от опе-
рационной системы и предпочтений пользователя.
• Скачать и установить Python с официального сайта.
• Использовать пакетный менеджер’ для установки Python.
• Использовать дистрибутивы Python, такие как Miniconda пли Anaconda
для установки Python.
• Использовать Docker для установки Python.
Python доступен в различных версиях, и рекомендуется использовать по-
следнюю стабильную версию. На момент написания пособия последняя версия
Python 3.13.0.
В данном пособии мы рассмотрим установку Python с помощью офи-
циального установщика, пакетного менеджера и дистрибутивов Anaconda и
Miniconda.
Для установки Python с помощью официального установщика,
необходимо скачать установочный файл с официального сайга Python
(https: www.python.org downloads ) и следовать инструкциям по установке.
После установки Python необходимо убедиться, чго он правильно уста-
новлен и доступен в командной строке (или терминале). Для этого можно от-
крыть терминал (или командную строку) и ввести команду:
'Пакетный менеджер — это инструмент, который позволяет автоматизировать процесс
установки, обновления и удаления программного обеспечения. Он управляет зависимостями
и обеспечивает совместимость между различными версиями программ.
Листинг 1.1: Проверка установки Python
1 python --version
Если Python установлен правильно, вы увидите сообщение с версией
Python, например:
Листинг 1.2: Вывод команды проверки установки Python
1 Python 3.13 О
В случае, если Python не установлен или установлена неверная версия,
необходимо повторить процесс установки или исправить ошибки.
Для установки Python с помощью пакетного менеджера2 * необходимо ис-
пользовать команду, соответствующую вашей операционной системе. Напри-
мер, на Ubuntu можно использовать команду:
Листинг 1.3: Установка Python с помощью пакетного менеджера
1
sudo apt-get install python3
В атом случае Python будет установлен вместе с необходимыми зависимостями.
Для установки на Windows можно использовать Chocolatey, пакетный
менеджер для Windows. Для этого выполните команду7:
Листинг 1.4: Установка Python с помощью Chocolatey
1
choco install pythrn3
Для установки па inacOS можно использовать Homebrew, пакетный ме-
неджер для macOS. Для этого выполните команду:
2Нужно, чтобы пакетный менеджер был установлен на вашей операционной системе. Ин-
струкции по установке можно найти па официальных сайтах пакетных менеджеров.
$ 1.3. Установка Python
Листинг 1.5: Установка Python с помощью Homebrew
1 brew install python3
Замечание 1. После установки Python необходимо проверить его работу.
Замечание 2. Для установки Python с помощью других пакетных менеджеров,
таких как yum. pacman или uv, используйте аналогичные команды, соответству-
ющие вашей операционной системе. Для этого обратитесь к документации со-
ответствующего пакетного менеджера.
Для установки Python с помощью дистрибутивов, таких как Anaconda
или Miniconda, следуйте инструкциям па официальных сайтах этих проектов.
Anaconda и Miniconda предоставляют удобные среды для научных вычислений
и анализа данных.
Для установки Python с помощью дистрибутивов, таких как Anaconda
или Miniconda, необходимо перейти на официальный сайт
Anaconda (https: www.anaconda.com/products distribution) пли Miniconda
(https: docs.conda.io e®/latest miniconda.ht ml). На сайте вы найдете устано-
вочные файлы для различных операционных систем. Выберите версию Python,
которую вы хотите установить (рекомендуется последняя стабильная версия).
Скачайте установочный файл, соответствующий вашей операционной системе
(Windows, macOS или Linux), и следуйте инструкциям по установке. Anaconda
предоставляет более полный набор инструментов и библиотек, в то время как
Miniconda — более легковесную версию.
Замечание 3. Во время установки Anaconda или Miniconda вам будет предло-
жено добавить Python в переменную окружения PATH. Рекомендуется согла-
ситься с этим предложением, чтобы упростить доступ к Python из командной
строки.
Замечание 4. Возможно установить Anaconda или Miniconda в отдельную ди-
ректорию, чтобы избежать конфликтов с другими верс иями Python. Для этого
выберите опцию «Custom installation» (или аналогичную) во время установки
и укажите желаемую директорию.
Замечание 5. Установка Anaconda или Miniconda может занять некоторое вре-
мя, в зависимости от скорости вашего интсрнет-сосдпиения и производитель-
ности компьютера. После завершения установки рекомендуется перезагрузить
компьютер, чтобы изменения вступили в силу.
После установки Anaconda или Miniconda необходимо проверить его ра-
боту. Для этого откройте терминал (или командную строку) и введите команду:
Листинг 1.6: Проверка установки Anaconda
1 conda --version
Если Anaconda или Miniconda установлены правильно, вы увидите со-
общение с версией Anaconda или Miniconda. В случае, если Anaconda или
Miniconda не установлены или установлена неверная версия, необходимо по-
вторить процесс установки или исправить ошибки.
Установить Anaconda или Miniconda можно с помощью терминала (или
командной строки). Для этого рекомендуем ознакомиться с документацией па
официальных сайтах Anaconda или Miniconda.
Замечание 6. Работа с Python возможна и без установки на компьютер. Для
этого можно использовать онлайн редакторы, такие как Google Colab или
Anaconda Cloud. Эти инструменты позволяют писать и выполнять код Python
прямо в браузере и сохранять результаты в облаке.
Замечание 7. Следует отметить, что в некоторых случаях может потребоваться
установка дополнительных библиотек и зависимостей. Рассмотрим их установ-
ку в следующем разделе.
§ 1.4. Настройка виртуального окружения
Для удобной работы с Python рекомендуется использовать виртуальные
окружения. Виртуальное окружение — это инструмент, который позволяет со-
здавать изолированные среды для проектов, что помогает избежать конфлик-
тов между библиотеками и версиями Python. Например, для проекта А может
понадобиться версия библиотеки X, а для проекта В версия Y. Виртуальные
окружения позволяют использовать разные версии одной и той же библиотеки
в разных проектах.
1.4.1. Создание и активация виртуального окружения
Виртуальное окружение можно создать с помощью встроенного моду-
ля venv или с помощью других инструментов, таких как пакетный менеджер
conda В данном разделе мы рассмотрим оба подхода.
Создание виртуального окружения с помощью venv
Для создания виртуального окружения с помощью venv выполните сле-
дующие шаги:
1. Откройте терминал (или командную строку).
2. Перейдите в директорию, где вы хотите создать виртуальное окружение.
Листинг 1.7: Пример перехода в директорию
*------------------------------------------------------
1 cd путь/к/вашей/директории
где путь/к/вашей/директории — это путь к директории, где вы хотите
создать виртуальное окружение.
3. Создайте виртуальное окружение. Для этого выполните команду:
Листинг 1.8: Создание виртуального окружения
/ "X
1 python -ш venv myenv
где myenv - это имя вашего виртуального окружения. Вы можете выбрать
любое имя.
4. После создания виртуального окружения необходимо его активировать.
Для этого выполните команду:
Листиш 1.9: Активация виртуального окружения
source myenv/bin/activate Р Для Linux и -acOS
myenv\Scripts\activate # Для Windows
Замечание 8. В данном листинге используется команда source для акти-
вации виртуального окружения на Linux и inacOS. На Windows использу-
ется команда myenv\Scripts\activate Если вы используете PowerShell,
то команда будет выглядеть так: myenv\Scripts\Activate.ps! После ак-
тивации виртуального окружения вы увидите его имя в начале командной
строки, что означает, что вы находитесь в изолированной среде.
Создание виртуального окружения с помощью conda
Для создания виртуального окружения с помощью conda выполните сле-
дующие шаги:
1. Откройте терминал (или командную строку).
2. Создайте виртуальное окружение. Для этого выполните команду:
Листинг 1.10: Создание виртуального окружения с помощью conda
1 conda create --name myenv python=3.13
где myenv это имя вашего виртуального окружения, a python=3.13
версия Python, которую вы хотите использовать. Вы можете выбрать лю-
бую версию Python, которая вам нужна.
3. После создания виртуального окружения необходимо его активировать.
Для этого выполните команду7:
Листинг 1.11: Активация виртуального окружения с помощью conda
1 c<.nda activate myenv
где myenv — это имя вашего виртуального окружения, которое вы ука-
зали при его создании.
После активации виртуального окружения вы увидите его имя в начале
командной строки, что означает, что вы находитесь в изолированной среде.
1.4 .2. Деактивация виртуального окружения
Для того, чтобы выйти из виртуального окружения, созданного с помо-
щью venv, выполните команду:
Листинг 1.12: Деактивация виртуального окружения
deactivate
Для того, чтобы выйти из виртуального окружения, созданного с помо-
щью conda. выполните команду:
Листинг 1.13: Деактивация виртуального окружения с помощью conda
1 conda deactivate
Данные команды вернут вас в основное окружение Python.
§ 1.5. Установка необходимых библиотек
1.5.1. Установка библиотек с помощью pip
Для установки библиотек в Python чаще всего используется пакетный
менеджер pip Данный пакетный менеджер входит в стандартную библио-
теку Python и устанавливается автоматически при установке интерпретатора
Python. Менеджер пакетов pip позволяет устанавливать, обновлять и удалять
библиотеки из вашего окружения. Чтобы установить библиотеку, выполните
команду:
Листинг 1.14: Установка библиотеки с помощью pip
1 pip install имя_библиотеки
Например, чтобы установить библиотеку NumPy, выполните команду:
Листинг 1.15: Установка библиотеки NumPy
1 pip install numpy
После установки библиотеки вы мож('тс использовать се в своем коде, импор-
тировав се с помощью команды import
Список всех установленных библиотек и их версий в текущем окружении
можно получить с помощью команды:
Листинг 1,16: Список установленных библиотек
1 pip list
При необходимости вы можете установить конкретную версию библиоте-
ки, для этого укажите со после имени библиотеки через знак равенства. Напри-
мер. чтобы установить версию 1.21.0 библиотеки NumPy. выполните команду:
Листинг 1.17: Установка конкретной версии библиотеки NumPy
1 pip install numpy==1.21 О
Также вы можете обновить библиотеку до последней версии, для этого
выполните команду:
Листинг 1.18: Обновление библиотеки NumPy до последней версии
1 pip install --upgrade numpy
Для удаления библиотеки выполните команду:
Листинг 1.19: Удаление библиотеки NumPy
1
pip uninstall numpy
С помощью команды рзр show можно получить информацию о конкрет-
ной библиотеке, например:
Листинг 1.20: Информация о библиотеке с помощью pip
1 pip show numpy
Эта команда выведет информацию о версии, авторе, лицензии и других мета-
данных библиотеки NumPy.
Замечание 9. Если вы хотите установить библиотеку в конкретное виртуаль-
ное окружение, убедитесь, что это окружение активировано перед выполнением
команды pip install.
Болес подробную информацию о менеджере пакетов pop можно найти в
официальной документации: https:/ pip.pypa.io ев stable .
1.5.2. Установка библиотек из файла requirements.txt
Если у вас есть файл requirements.txt, который содержит список необ-
ходимых библиотек и их версий, вы можете установить все библиотеки из этого
файла с помощью команды:
Листинг 1.21: Установка библиотек из файла requirements.txt
1
pip install -г requirements.txt
Файл requirements. txt должен содержать список библиотек в формате:
Листинг 1.22: Пример файла requirements.txt
1 numpy= = 1.21.0
2 pandas ==1.3.0
з matplotlib==3.4.О
В этом примере указаны версии библиотек NumPy. Pandas и Matplotlib При
установке библиотек менеджер pip загрузит и установит указанные версии биб-
лиотек.
1.5.3. Установка библиотек с помощью conda
Если вы используете Anaconda пли Miniconda, вы можете устанавливать
библиотеки с помощью команды conda install. Например, чтобы установить
библиотеку NumPy, выполните команду:
Листинг 1.23: Установка библиотеки NumPy с помощью conda
—
1 conda install numpy
Также можно установить несколько библиотек одновременно, укапав их
через пробел:
Листинг 1.24: Установка нескольких библиотек с помощью conda
1 conda install numpy pandas matplotlib
При этом можно указать конкретные версии библиотек:
Листинг 1.25: Установка библиотек с указанием версии с помощью conda
*
1 conda install numpy =! . 21. О pandas = 1.3.0
Замечание 10. Для установки библиотек с помощью conda не обязательно нахо-
диться в виртуальном окружении. Однако если вы хотите установить библио-
теки в конкретное виртуальное окружение, созданное с помощью conda, вам
необходимо активировать виртуальное окружение, в котором вы хотите уста-
новить библиотеки.
Вы также можете создать файл environment. yml и установить все необ-
ходимые библиотеки из него. Файл environment yml должен содержать назва-
ние виртуального окружения, список библиотек и их версий в формате:
Листинг 1.26: Пример файла environment. yml
name: myenv
dependencies:
- numpy = l .21.0
- pandas=l,3.0
Затем установите все библиогеки из файла environment .yml с помощью
команды:
Листинг 1.27: Установка библиотек из файла environment. yml
/ '
i conda env create -f environment.yml
В этом случае conda создаст новое окружение с именем, указанным в файле
environment .yml. и установит все указанные библиотеки.
Замечание 11. Файл environment. yml должен находиться в текущей директо-
рии, откуда вы выполняете команду.
Вы также можете обновить все. библиотеки в вашем окружении с помо-
щью команды:
Листинг 1.28: Обновление всех библиотек в окружении
1 conda update --all
Вы также можете удалить библиотеку с помощью команды:
Листинг 1.29: Удаление библиотеки с помощью conda
1 conda remove имя_библиотеки
В этом случае conda удалит указанную библиотеку и все ее зависимости,
которые не используются другими библиотеками.
В случае если вы хотите удалить все библиотеки в вашем окружении, вы
можете использовать команду':
Листинг 1.30: Удаление всех библиотек в окружении с помощью conda
( 'I
i conda remove --all --name имя.окружения
Во время установки библиотек conda может возникнуть ошибка, свя-
занная с несовместимостью версий библиотек. В этом случае вы можете по-
пробовать установить более старую версию библиотеки или использовать флаг
-update-deps, который обновляет зависимости до совместимых версий. Напри-
мер:
Листинг 1.31: Установка библиотеки с обновлением зависимостей
1 conda install имя.библиотеки --update -deps
Список всех установленных библиотек в вашем окружении можно полу-
чить с помощью команды:
Листинг 1.32: Список всех установленных библиотек в окружении
conda list
Болес подробно про менеджер пакетов и окружений conda можно прочи-
тать на официальном сайте https: docs.conda.io projccts/conda/cn/latcst/user-
guidc/tasks/manage-environments.html.
§ 1.6. Работа c IDE
Для работы c Python можно использовать различные интегрированные
среды разработки (IDE), такие как IDLE, PyCharm, Visual Studio Code, Jupyter
Notebook Lab и другие. Выбор IDE зависит от ваших предпочтений и задач,
которые вы собираетесь решать.
1.6.1. IDLE
IDLE (Integrated Development and Learning Environment) это стандарт-
ная IDE. которая поставляется вместе с интерпретатором Python. Она проста
в использовании и подходит для начинающих. IDLE предоставляет базовые
функции, такие как подсветка синтаксиса, автодополнение и встроенный ин-
терпретатор Python.
В IDLE можно писать свой код в текстовом редакторе и запускать его
прямо из среды. Также IDLE предоставляет возможность отладки кода с помо-
щью встроенного отладчика. IDLE поддерживает только файлы с расширением
.ру. pyi и pyw. но не поддерживает файлы с расширением .ipynb. Также
IDLE нс поддерживает плагины и нс предоставляет дополнительных инстру-
ментов для управления зависимостями или интеграции с системами контроля
версий, что делает ее менее удобной для профессиональной разработки.
1.6.2. Ру Charm
PyCharm — это одна из самых популярных IDE для разработки на
Python, разработанная компанией JctBrains. Опа предлагает широкий набор
инструментов для разработки, включая подсветку синтаксиса, автодонолпение,
отладку, тестирование и поддержку различных фреймворков.
Отмстим, что интегрированная среда разработки PyCharm:
• предоставляет встроенный инструмент для управления зависимостями,
что позволяет легко устанавливать и обновлять библиотеки в вашем про-
екте. Опа также поддерживает работу с виртуальными окружениями, что
позволяет изолировать зависимости для разных проектов;
• поддерживает работу с базами данных, что позволяет удобно работать с
данными в вашем проекте. Она также поддерживает работу с различными
системами контроля версий, такими как Git и Mercurial, что позволяет
удобно управлять версиями вашего кода;
• поддерживает различные плагины и расширения, что позволяет адапти-
ровать среду под ваши нужды;
• поддерживает работу с различными системами сборки, такими как Maven
и Gradle, что позволяет удобно собирать и развертывать ваши проекты;
• поддерживает работу с различными системами тестирования, такими как
unittest и pytest, что позволяет удобно тестировать ваш код;
• поддерживает работу с Docker и Kubernetes, что позволяет удобно разра-
батывать и тестировать приложения в контейнерах;
• поддерживает работу с удаленными серверами, что позволяет удобно раз-
рабатывать и тестировать приложения на удаленных машинах;
• имеет встроенный терминал, что позволяет выполнять команды прямо из
среды резработки;
* имеет интегрированный отладчик, что позволяет удобно отлаживать код,
устанавливать точки останова и просматривать значения переменных;
• предоставляет возможность работы с Jupytcr Notebook (поддерживает
файлы с расширением . lpynb), что делает ее удобной для работы с дан-
ными и аналитики:
• поддерживает работу с различными языками программирования, такими
как JavaScript, HTML и CSS, что делает се универсальным инструментом
для веб-разработки.
Отмстим, что PyCharm является кроссплатформепной средой разработ-
ки, доступной для Windows, macOS и Linux. Данная среда разработки предо-
ставляет несколько версий: Community и Professional Community версия явля-
ется бесплатной и открытой, в то время как Professional версия является ком-
мерческой и предлагает дополнительные функции, такие как поддержка веб-
разработки. интеграция с базами данных и инструменты для работы с больши-
ми данными, а также другие инструменты для профессиональной разработки.
1.6.3. Visual Studio Code
Visual Studio Code (VS Code) это бесплатный, кроссплатформеппый и
открытый редактор кода, разработанный Microsoft. Он является легковесным
и многофункциональным инструментом для разработки, который поддержива-
ет множество языков программирования, включая Python. Редактор кода VS
Code предлагает широкий набор функций, таких как подсветка синтаксиса, ав-
тодополнение, отладка и интеграция с системами контроля версий.
VS Code также поддерживает расширения, которые позволяют добав-
лять дополнительные функции, инструменты и менять внешний вид редакто-
ра. Например, расширение Python предоставляет поддержку для разработки
на Python, включая подсветку синтаксиса, автодополнсиие и отладку.
После установки нескольких расширений, таких как Python. Jupyter,
Jupyter Keymap, Jupyter Cell Tags. Jupyter Slide Show и Jupyter Notebook
Renderers, редактор кода VS (-ode становится мощным инструментом для рабо-
ты с Jupyter Notebook, что позволяет удобно работать сданными и аналитикой.
Причем Jupyter Notebook запускается прямо в VS Code, что позволяет удобно
работать с кодом и данными в одном окне.
Можно также использовать VS Code для разработки веб-приложений,
мобильных приложений, игр и других типов программного обеспечения.
1.6.4. Jupyter Notebook / Lab
Jupyter Notebook и Jupyter Lab это интерактивные среды для работы
с блокнотами на различных языках программирования, в частности на Python,
которые позволяют создавать и выполнять код в ячейках. Они идеально подхо-
дит для анализа данных, визуализации и создания отчетов. Jupyter Notebook и
Jupyter Lab поддерживают различные библиотеки и позволяет легко интегри-
ровать текст, код и графику в одном документе — интерактивном блокноте.
Для установки Jupyter Notebook или Jupyter Lab выполните соответству-
ющую команду в терминале или командной строке:
Листинг 1.33: Установка Jupyter Notebook или Lab
i pip install jupyter notebook
2 pip install jupyterlab
Для запуска Jupyter Notebook / Lab выполните соответствующую коман-
ду в терминале или командной строке:
Листинг 1.34: Запуск Jupyter Notebook Lab
—
i jupyter notebook
2 jupyterlab
В результате выполнения команды будет открыт веб-интерфейс Jupyter
Notebook / Lab в вашем браузере, где вы сможете создавать и редактировать
ноутбуки. При этом закрывать терминал или командную строку нельзя, так
как Jupyter Notebook / Lab работает1 в фоновом режиме и требует активного
терминала для работы.
Отмстим, что Jupyter Notebook и Jupyter Lab имеют несколько отличий
указанных в таблице 1.1.
Таблица 1.1: Сравнение Jupyter Notebook и JupyterLab
Характеристика Jupyter Notebook Jupy ter Lab
Интерфейс Простой, однострапичиый Современный. мпогопа- нельный IDE
Работа с файлами Один блокнот за раз Множественные вкладки и панели
Файловый браузер Отдельная страница Встроенная боковая па- нель
Терминал Отсутствует Встроенный терминал
Разделение экра- на Нс поддерживается Гибкое разделение па па- нели
Тины файлов Только .ipynb .ipynb, .ру, .md. .csv, .json, изображения и др.
Расширения Ограниченная поддержка Богатая экосистема рас- ширений
Производитель- ность Быстрый запуск Немного медленнее при загрузке
Настройка интер- фейса Минимальная Гибкая настройка layout’a
Поддержка Поддерживается, но нс развивается Активная разработка
Характеристика Jupyter Notebook JupyterLab
Обучение Простой для начинающих Требует времени па изуче- ние
Совместная рабо- та Базовая Расширенные возможно- сти
Отладка Ограниченные возможно- сти Встроенный отладчик
Git интеграция Отсутствует Встроенная поддержка Git
Просмотр данных Базовый Расширенные инструмен- ты визуализации
Ресурсы Меньше потребляет памя- ти Больше потребляет ресур- сов
Рекомендация Для простых задач и обу- чения Для серьезной разработки и анализа данных
Jupyter Lab но сути является эволюцией Jupyter Notebook и постепенно
заменяет его как основной инструмент для интерактивной работы с данны-
ми и кодом. Большинство новых проектов рекомендуют использовать именно
JupyterLab.
Jupyter Notebook подходит для:
• Быстрого прототипирования
• Обучения и демонстраций
• Простых аналитических задач
• Работы па слабых машинах
JupyterLab рекомендуется для:
• Профессиональной разработки
• Комплексного анализа данных
• Работы с множественными файлами
• Командной разработки
§1.7. Интерактивный и скриптовый режимы в Python
Замечание 12. Для написания кода на Python можно использовать различные
текстовые редакторы, такие как Sublime Text, Vim, Notepad и другие. Выбор
редактора зависит от ваших предпочтений и задач, которые вы собираетесь
решать.
Замечание 13. Если вы используете Jupyter Notebook / Lab, вы можете устано-
вить библиотеки прямо из ячейки, используя команду 'pip install или !conda
install. при этом перед командой необходимо поставить восклицательный знак
!. Установка библиотек в Jupyter Notebook Lab выполняется в том же окру-
жении, в котором запущен Jupyter Notebook / Lab. Также можно использовать
команду ! pip list или ! conda list дня получения спис ка установленных биб-
лиотек прямо из ячейки. Для выполнения указанных команд необходимо иметь
активированное виртуальное окружение, в котором вы хотите установить биб-
лиотеки, а также обладать правами на установку библиотек в этом окружении.
§1.7. Интерактивный и скриптовый режимы в Python
Интерактивный режим и скриптовый режим это два способа
работы с языком программирования Python, которые отличаются подходом к
выполнению кода.
Интерактивный режим (Read-Eval-Print LoopJ, или REPL) в Python
позволяет пользователю вводить и выполнять команды (или небольшие фраг-
менты кода) по одной строке за раз, сразу же видя результат в терминале или
консоли в режиме реального времени.
Для начала работы в интерактивном режиме откройте терминал (или
командную строку в Windows) и выполните команду python или python3. Это
запустит интерпретатор Python, и вы сможете вводить команды и получать
результаты.
Листинг 1.35: Пример работы в REPL
Z
1 >>> print("Hello, MGIMO University!")
2 Hello, MGIMO University!
з >>> 2+3
‘Цикл «чтеиие-выполнение-печать»
4 5
Скриптовый режим (Script Mode, пли режим выполнения скриптов)
в Python предполагает выполнение заранее написанных и сохраненных в фай-
лах с расширением ру программ. В этом режиме код выполняется целиком
и результаты выводятся в терминал или сохраняются в файлы.
Для начала работы в скриптовом режиме создайте файл с расширением
.ру и напишите в ном код. Например, создайте файл script.ру и добавьте
в него следующий код:
Листинг 1.3G: Пример скрипта
1 й script.ру
2 print("Hello, MGIMO University!")
з result = 2 + 3
4 print(result )
Далее выполните этот файл в терминале пли командной строки с помощью
команды python или python3
Листинг 1.37: Запуск скрипта
i python script.ру
В результате вы получите следующий вывод:
Листинг 1.38: Результат выполнения скрипта
1 »> Hello, MGIMO University!
2 >>> 5
В таблице 1.2 приведены основные различия между интерактивным
и скриптовым режимами.
§1.8. Первые шаги в Jupyter Notebook / Lab
Таблица 1.2: Ключевые различия между интерактивным и скриптовым режи-
мами
Критерий Интерактивный режим Скриптовый режим
Выполнение По одной команде Весь файл целиком
Вывод результата Автоматический (без print ()) Только через print О
Сохранение кода Нс сохраняется Сохраняется в файле
Использование Тестирование, обучение Разработка программ
Подчеркнем, что в скриптовом режиме работы файл с кодом должен
быть сохранен, чтобы его можно было запустить. В то же время, при запус-
ке файла он выполняется целиком строка за строкой, а по по одной команде,
и результаты выводятся в терминал. В интерактивном режиме код выполняется
сразу после ввода, и нет необходимости сохранять его в файл.
Заметим, что интерактивный режим удобен для быстрого тестирования
небольших фрагментов кода, отладки и обучения, а также для работы сданны-
ми в интерактивных средах, таких как Jupyter Notebook / Lab. В то же время,
скриптовый режим позволяет создавать и запускать полноценные программы,
которые могут быть легко переиспользованы и интегрированы в другие проек-
ты.
Отметим, что Jupyter Notebook / Lab, который мы будем использовать
в дальнейшем, можно рассматривать как гибридную среду, сочетающую эле-
менты интерактивного и скриптового режимов работы с Python, предоставляя
гибкость в зависимости от задачи.
Программа Jupyter Lab позволяет выполнять код в ячейках, что делает
его похожим на интерактивный режим, но при этом поддерживает возможность
сохранения и организации кода в виде скриптов, что характерно для скрипто-
вого режима.
§ 1.8. Первые шаги в Jupyter Notebook / Lab
В дальнейшем мы будем использовать термин «ноутбук»1, подразумевая
под ним файл с расширением . ipynb. который может быть открыт как в Jupyter
*В оригинале используется термин «notebook* (записная книжка или блокнот), по в рус-
ском языке более распространено слово «ноутбук».
Notebook / Lab. так и в других средах, поддерживающих этот формат. В данном
раздело мы рассмотрим основные шаги для работы с ноутбуками
Чтобы создать новый ноутбук в Jupyter Notebook, выполните следующие
шаги:
1. Откройте Jupyter Notebook в вашем браузере, введя команду jupyter
notebook в терминале (или командной строке)5.
2. В открывшемся окне выберите директорию, в которой вы хотите создать
новый ноутбук.
3. Нажмите на кнопку New и выберите Python 3 из выпадающего списка1’.
4. Введите имя вашего ноутбука и нажми те Create.
5. Теперь вы можете начать писать код в ячейках ноутбука. Чтобы выпол-
нить ячейку, нажмите Shift + Enter или выберите Run > Run Selected
Cells
6. Чтобы сохранить ноутбук, нажмите Ctrl + S или выберите File > Save
and Checkpoint.
7. Чтобы закрыть ноутбук, нажмите на кнопку Close в правом верхнем углу
окна.
8. Чтобы закрыть Jupyter Notebook, нажмите Ctrl + С в терминале (или
командной строке), где вы запустили Jupyter Notebook.
9. Чтобы открыть существующий ноутбук, выберите его в списке файлов
и нажмите на кнопку Crpen в правом верхнем углу окна.
10. Чтобы удалить ноутбук, выберите его в списке файлов
и нажмите на кнопку Delete в правом верхнем углу окна.
11. Чтобы переименовать ноутбук, выберите его в (писке файлов и нажми-
те па кнопку Rename в правом верхнем углу окна. Введите новое имя
и нажмите ОК
5Если вы используете Jupyter Lab, го команда будет jupyter lab
1>В зависимости от установленных версий Python, может быть доступны и другие версии,
например Python 2 или Python 3.8, или виртуальная среда myenv.
12. Чтобы экспортировать ноутбук в дру! не форматы, выберите его в списке
файлов и нажмите на кнопку Download as в правом верхнем углу ок-
на. Выберите нужный формат' (например, HTML, PDF пли Markdown)
и нажмите ОК
13. Чтобы импортировать ноутбук из других форматов, нажмите на кнопку
Upload в правом верхнем углу окна и выберите файл, который вы хотите
импортировать. Нажмите ОК, чтобы загрузить файл.
14. Чтобы созда ть новую ячейку, нажмите на кнопку + в правом верхнем углу
окна.
15. Чтобы удалить ячейку, выберите се и нажмите на кнопку Scissors в пра-
вом верхнем углу окна.
16. Чтобы создать новую ячейку в формате Markdown, нажмите па кнопку +
в правом верхнем углу окна и выберите Markdown из выпадающего спис-
ка. Введите текст в ячейке и нажмите Shift + Enter, чтобы выполнить
ячейку.
17. Чтобы создать новую ячейку в формате Code, нажмите па кнопку + в пра-
вом верхнем углу окна и выберите Code из выпадающего списка. Введите
код в ячейке и нажмите Shift + Enter, чтобы выполнить ячейку.
§ 1.9. Ввод и вывод данных. Комментарии в коде
1.9.1. Ввод данных
Для ввода данных в Python используется функция input(). Опа позво-
ляет получать данные от пользователя в виде строки Например:
Листинг 1.39: Ввод данных от пользователя
.1 name = input("Введите ваше имя: ")
Для некоторых форматов может потребоваться установка дополнительных пакетов. На-
пример, для экспорта в PDF требуется пакет nbconvert.
2 print("Привет, " + name + "!")
В этом примере программа запрашивает у пользователя его имя и выводит
приветствие с этим именем.
Для ввода числовых данных можно использовать функцию int() или
float() для преобразования строки в число. Например:
Листинг 1.40: Ввод числовых данных
age = int(input("Введите ваш возраст: "))
print("Ваш возраст; " + str(age) + " лет.")
В этом примере программа запрашивает у пользователя его возраст, пре-
образует введенную строку в целое число и выводит его на экран. Для преоб-
разования числа в строку используется функция str()
Замечание 14. Обратите внимание, что функция input О всегда возвращает
строку, поэтому для ввода числовых данных необходимо использовать преоб-
разование типов.
Замечание 15. При работе в Jupyter Notebook / Lab, вы можете использовать
функцию input О для ввода данных в ячейках, но иногда будут возникать
конфликты с локальными политиками операционной системы Windows и про-
грамма может не работать. Однако аналогичное поведение с быстрым вводом
данных в Jupyter Notebook / Lab можно получить, если использовать отдель-
ную ячейку для ввода данных, а затем использовать другие функции, напри-
мер, print () для вывода результата. При этом вы можете выстро изменять код
в ячейках и выполнять их по отдельности, что позволяет удобно тестировать
и отлаживать код.
1.9.2. Вывод данных
Для вывода данных на экран (обычно это консоль или терминал)
в Python используется функция print().
Листаш 1.41: Вывод данных на экран
1 print("Hei1 о . MGIMO-University!")
В данном примере программа выводит строку "Hello. MGIMO-
University!" па экран.
При выводе данных можно использовать несколько аргументов, разде-
ляя их запятыми.
Листинг 1.42: Вывод нескольких данных на экран
1 name = "Alice"
2 age = 30
з print("Имя:" , name, "Возраст:", age)
В данном примере программа выводит имя и возраст, используя несколько ар-
гументов в функции print О
Полный синтаксис функции print () используется редко, по он имеет
следующий вид:
Листинг 1.43: Полный синтаксис функции print О
1 print (*objects , sep=’ ’, end=’\n’, file = sys . stdout , <-
> flush = False)
ГДС
• *objects объекты, которые нужно вывести Можно указать несколько
объектов, разделяя их запятыми.
• sep - строка, которая будет вставлена между объектами. По умолчанию
это пробел.
• end строка, которая будет добавлена в конец вывода. По умолчанию это
символ новой строки.
• file фай I, в который будет записан вывод. По умолчанию это стандарт-
ный вывод (sys. stdout).
• flush если True, поток будет сброшен (используется .щя вывода в файл).
Замечание 16. В листинге 1.43 использую гея символы t— и —> для указания
переноса строки, добавленные для удобства чтения. В реальной команде пере-
нос строки не требуется, и команда должна быть введена в одну строку Далее
в тексте мы будем использовать эти символы для обозначения пере-
носа строки в командах, чтобы улучшить читаемость.
Вывод данных в файл можно осуществить с помощью параметра file.
Например:
Листинг 1.44: Вывод данных в файл
with open("output.txt" , "w") as file:
print("Hello, World!", file=file)
1.9.3. Форматированный вывод
Форматированный вывод позволяет выводить данные в определенном
формате. Это может быть полезно для вывода чисел с определенным коли-
чеством знаков после запятой, выравнивания текста и т. д. Форматированный
вывод в Python может быть реализован двумя основными способами-
• с помощью управляющих последовательностей символов (escape
sequences);
• с помощью встроенных методов форматирования строк8 (string
formatting).
Управляющие последовательности (escape sequences) дают возмож-
ность точно задавать формат вывода при помощи функции print О: они позво-
ляют вставлять в строки специальные символы, начинающиеся с обратно-
го слэша \, которые интерпретатор распознает как команды форматирования
"Здесь и далее под строкой понимается текст, заключенный в кавычки.
текста. В таблице 1.3 перечислены наиболее часто используемые управляющие
последовательности вместе с их назначением.
Таблица 1.3: Управляющие последовательности в строках Python
Специальный символ Назначение
\п Перенос строки (newline)
\t Горизонтальная табуляция
\\ Обратный слэш
V Одинарная кавычка
\" Двойная кавычка
\г Возврат каретки (carriage, return)
\ь Backspace (удаляет символ слева)
\а Звуковой сигнал (hell)
\f Прогон страницы (form feed)
\v Вертикальная табуляция
\ооо Символ в восьмеричной системе
\xhh Символ в шестпадцатери’гной системе
Указанные управляющие последовательности добавляются непосред-
ственно в строки и обрабатываются интерпретатором при выводе. Например,
для вывода строки с переносом строки и табуляцией можно использовать сле-
дующий код:
Листинг 1.45: Использование управляющих последовательностей
1 print("3TO первая строка .\n\tЭто вторая строка с таб<—;
уляцией . " )
Для того чтобы не интерпретировать специальные символы, можно
использовать сырые строки (raw strings):
Листинг 1.46: Использование сырых строк
—
1 raw_string = г"Это сырая строка с символом \п, которн
> ый не будет интерпретироваться."
2 print(raw_string)
Язык Python предоставляет несколько встроенных средств для форма-
тирования строк, которые позволяют встраивать значения переменных
и выражений прямо в текстовые строки, управляя их представлением
на выходе. Эти средства позволяют создавать наглядный, читаемый и гибко
настраиваемый вывод. Ниже перечислены основные методы форматирования
строк в языке Python:
* Оператор % старый способ форматирования строк. Использует спе-
циальные символы для указания тина данных.
• Метод str.format() более современный способ форматирования
строк. Использует фигурные скобки {} для указания места вставки зна-
чений.
• f-строки (f-strings) самый современный способ форматирования
строк. Позволяет вставлять значения переменных прямо в строку, исполь-
зуя фигурные скобки {} и указывая переменные внутри них.
Рассмотрим примеры использования каждого из этих способов. Для это-
го создадим переменные name и age и выведем их значения в строке.
Листинг 1.47: Форматирование строк с использованием оператора %
1 name = "Alice”
2 age = 30
з print ("Привет, 70s! Тебе 7.d лет." 7. (name, age))
В этом примере программа выводит строку с именем и возрастом, используя
оператор % для форматирования. Внутри строки используются специальные
символы %s для строк и %d для целых чисел. В скобках после оператора %
указываются значения, которые нужно вставить is строку в указанном порядке.
Листинг 1.48: Форматирование строк с использованием метода str. format О
1 name = "Alice"
2 age = 30
з print("Привет, {}! Тебе {} лет.".f irmar(name, age))
В приведенном примере программа выводит строку с именем и возрастом, ис-
пользуя метод str .format() для форматирования. Внутри строки используют-
ся фигурные скобки {} для указания места вставки значений. Внутри метода
format О указываются значения, которые нужно вставить в строку в указанном
порядке.
Таким образом, метод str.formatO более удобеп и гибок, чем оператор
% для форматирования строк.
Листинг 1.19: Форматирование строк с использованием f-строк
Z
1 name = "Alice"
2 age = 30
з print(f"Привет, {name}! Тебе {age} лет.")
В этом примере программа выводит строку с именем и возрастом, используя
f-строки для форматирования. В начале строки указывается буква f. а затем
в кавычках указывается строка с переменными. Внутри строки используются
фигурные скобки {} для указания места вставки значений переменных. Внутри
фигурных скобок указываются имена переменных или выражения, значения
которых нужно вставить в строку. Это наиболее современный и удобный способ
форматирования строк в Python.
Используя f-строки. можно также выполнять вычисления внутри строки.
Листинг 1.50: Вычисления внутри f-строк
/
1 # Задаем значение переменных
2 а = 5
4 print(f"Сумма {а} и {Ь} равна {а + Ь}.")
В данном примере программа выводит строку с суммой значений переменных
а и Ь. Вычисление суммы выполняется внутри строки с помощью выражения
а + Ь.
Для форматирования чисел в f-строках можно использовать специфика-
торы формата.
Листинг 1.51: Форматирование чисел в f-строке
*
1 # Задаем значение числа Пи
2 pi = 3 141592653589793
з # выводим значение числа Пи с двумя знаками после заь^>
'Э пятой
4 print(f"Значение числа Пи {pi:.21}")
В этом примере программа выводит значение числа Пи с двумя знаками после
запятой. Для этого используется спецификатор формата : .21, который указы-
вает. что число должно быть отформатировано как число с плавающей точкой
с двумя знаками после запятой.
1.9.4. Спецификаторы формата для чисел
Форматирование чисел в Python позволяет преобразовывать числовые
данные в удобочитаемые строки с заданным форматом. Для этого используются
спецификаторы формата, которые указываются внутри фигурных скобок {}
при работе с методом str.format() или f-строками.
Спецификаторы формата позволяют задавать различные параметры
форматирования, такие как количество знаков после запятой, выравнивание,
знак числа и другие.
Для задания спецификаторов формата после двоеточия внутри фигур-
ных скобок в шаблоне строки указывают формат, в котором нужно отобразить
число.
Листинг 1.52: Общий синтаксис спецификаторов формата
—
1 # Задаем формат числа с помощью метода fur >at
2 print ("Число {:спецификатор}".formatСчисло))
з « Задаем формат числа с помощью метода f-строку
4 print(f"Число {число:спецификатор}")
Для целых чисел можно задать следующие спецификаторы:
• { d} целое число в десятичной системе счисления.
Листинг 1.53: Пример использования спецификатора {:d}
1 num = 16
2 print("{.d}". format(num)) n 1ывод 16
з print(f"{num:d}") <од 16
• {:b} — целое число в двоичной системе счисления.
Листинг 1.54: Пример использования спецификатора {:Ь}
1 num = 16
2 prinn("{-b}".format(num)) » Вывод. 10000
з print(f"{num:b}") # Вывод: 10000
• {:o} целое число в восьмеричной системе счисления.
Листинг 1.55: Пример использования спецификатора {:о}
1 num = 16
2 print("{:о}". format(num)) # зод 20
з print(f"{num:о}")
• {:х} целое число в шестнадцатеричной системе счисления (буквы
в нижнем регистре).
Листинг 1.56: Пример использования спецификатора {:х}
1 num = 30
2 print ("{: х} ". format ( num) ) # Вывод: le
з print(f"{num:x} " ) # Вывод: 1 e
• {:Х} — целое число в шестнадцатеричной системе счисления (буквы
в верхнем регистре).
Листинг 1.57: Пример использования спецификатора { X}
—
1 num = 30
2 print("{.X}".format(num)) Я Вывод IE
з print(f"{num:X}") Я ju од IE
• {: с} символ Unicode, соответствующий заданному числу.
Листинг 1.58: Пример использования спецификатора {:с}
--------------------------------------------------
1 num = 65
2 print("{:с}".format(num)) it Вывод: A
з print (f " {num : c} " ) it Вывод: A
• {: ,d} число с разделителями групп (например, запятыми).
Листинг 1.59: Пример использования спецификатора {: ,d}
1 num = 1234567890
2 print("{:,}".format(num))
з Я Вывод. 1,234,567,890
4 print(f"{num:,}")
s # Вывод: 1,234,567,890
• {: .Ne} — число в экспоненциальной форме (N знаков после запятой).
Листинг 1.60: Пример использования спецификатора {:. Ne}
i num = 123456789
2 print("{:.2e}".format(num)) # Вывод: 1 23e+08
з print(f"{num: . 2e} " ) # Вывод: 1.23 e +08
4 I
• {:. NE} число в экспоненциальной форме (N знаков после запятой, буква
в верхнем регистре).
Листинг 1.61: Пример использования спецификатора {: .NE}
1 num = 123456789
2 print("{:.2Е}". format(num)) I Вывод: 1.23E+08
з print(f"{num:.2E}") # Вы од 1 23E+08
Для чисел с плавающей точкой можно задать следующие спецификато-
ры:
• {: .Nf} число с фиксированной точностью (N знаков после запятой).
Листинг 1.62: Пример использования спецификатора {: .Nf}
1 num = 123 456789
2 print("{:.2f}".format(num)) # Вы од 123 46
з print(f"{num: .2f} ") # Bus од 123 46
• {: - Ng} число с общей точностью (>. значащих цифр).
Листинг 1.63: Пример использования спецификатора {:. Ng}
1 num = 123-456789
2 ргл nt("{:.3g}".fогmat(num)) t ы од 123
з print (f ” {num : . 3g} 11) # Вы-од 123
• {: .117.} число в процентах (N знаков после запятой).
Листинг 1.64: Пример использования спецификатора {: . N7«}
i num = 0.123456789
2 print("{:.2%}".format(num)) # Вывод: 12.354
з print (f "{num: .27,}") # Вывод: 12.35X
• {. .Ne} и {: .NE} — число в экспоненциальной форме (N знаков после за-
пятой).
Дополнительные возможности спецификаторов формата для чисел:
• Заполнение пробелами и выравнивание: {: >15d} число, дополненное
пробелами слева до 15 символов и выровненное по правому краю в ноле
шириной 15 символов.
Листинг 1.65: Пример использования спецификатора {: >15d}
1 num = 1234567890
2 print("{•>15d}".format(num))
з # Вывод: " 1234567890"
л print(f"{num:>15d}")
з й Вывод. " 1234567890"
• Заполнение нулями и выравнивание: {: 0>15d} число, дополненное нуля-
ми слева до 15 символов и выровненное но правому краю в иоле шириной
15 символов.
Листинг 1.66: Пример использования спецификатора {: 0>15d}
1 num = 1234567890
2 print("{:0>15d}".format(num))
з # Вьаод: "000001234567890"
4 print(f"{num:0>15d} " )
s # _>ывод: "000001234567890"
• Выравнивание но 1евому краю: {:<15d} — число, дополненное пробелами
справа до 15 символов и выровненное по левому краю в поле шириной 15
символов.
Листинг 1.G7: Пример использования спецификатора {:<15d}
1 num = 1234567890
2 print ("{: <15d}“ . format (num) )
з Я вывод: "1234567890
i print(f"{num:<15d}")
s # Вывод: "1234567890
• Выравнивание по центру: {: ''12d} число, дополненное пробелами и вы-
ровненное по центру в поле шириной 12 символов с пробелами по краям.
Листинг' 1.68: Пример использования спецификатора {: ~ 12d}
1 num = 1234567890
2 print ("{:'‘12d} ". format (num) )
з # Вывод: " 1234567890 "
4 print(f"{num:"12d}")
s fl Вывод: " 1234567890 "
Отметим, что спецификаторы формата могут быть использованы
в сочетании Например, {:0>12.2f} число с двумя знаками после занятой,
дополненное нулями слева до Г2 символов.
Листинг 1.69: Пример использования спецификатора {:0>12.2f}
1 num = 1234567890 1234567890
г print("{:0>12.2f}".format(num))
з # Вывод: "00000O00O0001234567890.12"
4 print(f"{num.0>12.2f}")
о # Вывод: "0000000000001234567890.12"
Спецификаторы формата в Python предоставляют гибкие инструменты
для преобразования чисел в строки с различными форматами. Опи позволяют
контролировать точность, выравнивание, заполнение и другие аспекты форма-
тирования.
1.9.5. Комментарии в коде
Комментарии важная часть кода, повышающая его читаемость, сопро-
вождаемость и понимание. Они помогаю т другим разработчикам (и вам самим)
понять, что делает код. В языке Python существует два основных типа коммен-
тариев: однострочные и многострочные (документирующие строки, docstring).
Ниже приведены правила и рекомендации ио их использованию.
Однострочный комментарий начинается с символа Д и продолжается до
конца строки.
1
2
Листинг 1.70: Комментарий в коде
# Это комментарий
print (" Hello , MGIMO University!") # Это тоже комм
—> тарий
Длина строки комментария не ограничена, но рекомендуется придержи-
ваться длины строки в 72 символа для лучшей читаемости.
Для однострочных комментариев рекомендуется использовать пробел по-
сле символа # для отделения комментария от кода.
Для создания многострочных комментариев можно использовать
несколько однострочных комментариев, каждый из которых начинается с сим-
вола #.
Листинг 1.71: Многострочный комментарий
1 # Эта функция принимает два аргумента:
2 И - имя пользователя
з а - возраст
4 # и возвращает форматированную строку.
или использовать многострочные (документирующие) строки, которые заклю-
чаются в тройные кавычки (одинарные ’ ’ ’ или двойные " " " ).
Листинг 1.72: Многострочные строки
Z
1 11 ’* ”
2 Этот модуль содержит функции для анализа данных,
з Функции:
4 - load_data
s - process_daca
в - save_results
II II II
Однострочные комментарии обычно используются для кратких поясне-
ний к коду, вто время как многострочные комментарии (или документирующие
строки) могут использоваться для более подробных описаний функций, классов
и модулей
Общие рекомендации по написанию комментариев:
• Комментарии должны быть краткими и попятными.
• Избегайте избыточных комментариев, которые не добавляют ценности КО-
ДУ-
• Используйте комментарии для объяснения сложных или неочевидных ча-
стей кода.
• Не комментируйте очевидные вещи, которые легко понять из кода.
• Используйте многострочные строки (docstring) для документирования
функций и классов.
• Следуйте стилю оформления комментариев, принятому в вашем проекте
или в вашей команде.
• Используйте английский язык для комментариев, если ваш код будет ис-
пользоваться международной аудиторией.
• Избегайте использования жаргона и сокращений, которые могут быть
непонятны другим разработчикам.
• Регулярно обновляйте комментарии, чтобы они соответствовали измене-
ниям в коде.
• Используйте комментарии для объяснения, «почему» код делает что-то,
а по «как» он это делает.
• Избегайте использования комментариев для временного отключения кода.
Вместо этого используйте систему контроля версий (например, Git) для
отслеживания изменений в коде.
§1.10. Правила оформления кода
Правильное оформление кода важно для читаемости и поддержки каче-
ства проекта. Официальные документы, предлагающие изменения, улучшения
или новые идеи для языка программирования Python и его экосистемы, имен-
нуемые предложения по улучшению Python или Python Enhancement
Proposals (сокращенно PEP) публикуются на официальном сайте (https:
//peps.python.org/) и открыты для изучения. Они отражают эволюцию язы-
ка. помогают поддерживать прозрачность в разработке, служат основным ме-
ханизмом для внесения значимых изменений, стандартизации процессов и до-
кументирования решений, принятых сообществом Python.
Примеры ключевых РЕР:
• РЕР 8 — Style Guide for Python Code (руководство по стилю кода для
Python);
• РЕР 20 The Zen of Python (философские принципы языка Python);
• PEP 257 Docstring Conventions (стандарт для строк документации
в Python);
• РЕР 484 — Type Hints (аннотации типов для статического анализа);
• РЕР 572 — Assignment Expressions (введение оператора := — «моржовый
оператор»).
Основные документы РЕР 8 и РЕР 257 содержат рекомендации ио
оформлению кода1 и написанию документации 0 соответственно. Для языка
Python существуют различные стили и руководства по оформлению кода, ко-
торые помогают поддерживать единообразие кода и делают его более согласо-
ванным внутри проекта, улучшают читаемость и понимание кода, облегчают
совместную работу в команде, ускоряют ревыо кода и помогают быстрее нахо-
дить ошибки. Среди них наиболее известными являются официальные РЕР 8
и РЕР 257, а также стили от сообществ и компаний, такие как Google Python
Style Guide, Airbnb Python Style Guide, NumPy Docstring Guide и Django Coding
Style.
Согласно PEP 8. «code is read much more often than it is written»
и «readability counts». Это означает, что код должен быть написал так, что-
бы его легко было понимать другим разработчикам, поскольку код читается
гораздо чаще, чем пишется. В частности, хорошо оформленный код:
• содержит четкие и понятные имена переменных, функций и классов;
• использует отступы и пробелы для выделения блоков кода;
* содержит комментарии и документацию, объясняющие логику кода;
• следует единым правилам оформления, чтобы код был согласованным
и предсказуемым;
• использует пробелы вокруг операторов и после запятых;
• использует одинарные или двойные кавычки дтя строк, но не смешивает
их;
• использует отступы в 4 пробела для блоков кода;
• использует пустые строки для разделения логических блоков кода.
При этом важно помнить, что в редких случаях разработчики в крупных
компаниях или специфических областях могут отступать от правил, если
9Говорят: описывает стиль кода (кодстайл).
'Говорят: описывает стиль написания документации.
это повышает читабельность кода дм конкретного случая, а также коман-
ды разработчиков могут использовать собственные правила. Однако отсту-
пать от правил следует сознательно и осторожно. Для большинства проектов
достаточно следовать РЕР 8 и РЕР 257.
1.10.1. Общие принципы
При оформлении кода важны следующие базовые принципы, которые во
многом отражены в РЕР 20 The Zen of Python (Дзен Питона):
• Красота (Beauty). Код должен быть красивым и элегантным. Красивый
код легче читать и поддерживать. Это не значит, что код должен быть
сложным или изощренным, но он должен быть аккуратным и хорошо
структурированным.
• Ясность (Clarity). Код должен быть понятным и очевидным. Если код
неясен, его трудно поддерживать и развивать. Понятные названия пере-
менных, функций и классов, а также комментарии помогают сделать код
более ясным.
• Согласованность (Consistency). Важнее всего единообразие: внутри одно-
го проекта и даже модуля стиль должен быть одинаков. Согласованность
упрощает чтение кода, так как не нужно «перенастраиваться» при пере-
ходе меж,ту файлами.
* Читаемость (Readability). Как гласит Дзен Питона, «Простота лучше
сложности» и «Явность лучше неявности». Это значит, что код должен
быть написан так, чтобы было просто попять, что он делает. Если задача
может быть решена более простым способом, то лучше выбрать его. По-
пятные названия, выверенная разбивка на функции и классы, грамотные
отступы — все это повышает читаемость.
• Простота (Simplicity). Код должен быть простым и понятным. Сложный
код трудно поддерживать и развивать. Простота достигается за счет ис-
пользования простых конструкций, ясных названий и минимального ко-
личества зависимостей.
• Явность (Explicitness). Код должен понятно и о шозначно выражать на-
мерения программиста. Но следует полагаться на магическое поведение
языка или неявные преобразования. Например, избегайте кода, где смысл
неочевиден. Явные конструкции (имена переменных, явные преобразова-
ния типов и г.д.) предпочтительны.
Эти принципы часто повторяются в руководствах по стилю и практике
разработки. Следуя им, вы сможете создать код, который будет легко читать
и поддерживать. Кроме того, они помогут вам избежать распространенных
ошибок и недоразумений при написании кода.
1.10.2. Пробелы и пустые строки
Отступы и пробелы в Python играют критически важную роль, так как
они определяют структуру кода (блоки, вложенность) и влияют на его читае-
мость. Отступы должны быть одинаковыми во всем коде. Если вы используете
пробелы для отступов, используйте их везде. Если вы используете табуляцию,
используйте ее везде. Нс смешивайте пробелы и табуляцию в одном файле для
отступов, гак как это может привести к путанице и ошибкам. Приведем клю-
чевые правила и рекомендации по отступам и пробелам в Python:
• Отступы для блоков кода. В Python отступы заменяют фигурные скоб-
ки { }. используемые в других языках программирования. Они обознача-
ют начало и конец блоков кода. Например, в условных операторах, циклах
п телах функций. Рекомендуется использовать 4 пробела для каждого
уровня отступа. Не следует использовать табуляцию (\t) для отступов,
так как это может привести к путанице и ошибкам.
Листинг 1.73: Отступы в Python
1 if х > 0
2 # Отступ в 4 пробела
з print("Положительное число")
4 else:
5 # Отступ в 4 пробела
в print("Отрицательное или ноль")
• Отступы в функциях и классах. Внутри функций и классов также ис-
пользуются отступы для обозначения блоков кода. Рекомендуются исполь-
зовать 4 пробела для каждого уровня отступа. При нарушении правил
отступов могут возникнуть ошибки. Например, если отступы не согласо-
ваны. интерпретатор Python выдаст ошибку IndentationError. Если блок
кода по имеет отступа. Python выдаст ошибку SyntaxError
• Пробелы вокруг операторов. Рекомендуется использовать пробелы во-
круг операторов (например, +, *, /), но не внутри скобок. Это делает
код более читаемым.
Листинг 1 74: Правильное использование пробелов вокруг операторов
1 х = 5 + 3 # Правильно
2 у = 10-2 # Неправильно, не хватает пробела
з z = 4»2 # Непр ильио , не ? затает пробел.
< result = (х * 2) + 7 4 Правильно
s resultl = ( х*2 ) +7 » Неправильно, ли ни₽ прот-»
белы внутри скобок
• Пробелы в функциях и списках. Рекомендуется использовать про-
белы после запятых в списках и аргументах функций, чтобы улучшить
читаемость.
Листинг 1.75: Правильное использование пробелов после запятых
S
1 х = [1, 2, 3] # Прг >ильно
2 у = [1,2,3] # Неправильно, не хватает пробелов
з z = [ 1, 2, 3] # Неправильно, лишний пробел not-5
> еле открывающей скобки
4 def func(a, b, с): Я Пра ильно
pass
def func(a,b,c): # Неправильно, не хватает npot->
*—> бела
pass
def func( a, b, с): # Неправильно, лишний пробей-5
л после открывающей скобки
• Пробелы перед открывающей скобкой Рекомендуется не использо-
вать пробел перед открывающей скобкой в вызовах функций, индекси-
ровании и т. д. Это улучшает читаемость кода и предотвращает ошибки.
Например:
Не ставьте пробел перед открывающей скобкой, если опа используется для
вызова функции. Это может привести к путанице и ошибкам.
Листинг 1.76: Правильное использование пробелов перед открывающей
скобкой
* >
1 func(l, 2) # Правильно
2 func (1,2) # Неправильно, лишний пробел пере«->
д открывающей скобкой
• Пробелы в выражениях. Рекомендуется использовать пробелы в выра-
жениях, чтобы улучшить читаемость.
Листинг 1.77: Правильное использование пробелов в выражениях
<-----------------------------------------------------
1 х = (а + b) ♦ (с - d) # Правильно
2 у = (a+b)*(c-d) # Неправильно, не хватает проб«->
<—> елов
• Пробелы в строках. Рекомендуется использовать пробелы в строках,
чтобы улучшить читаемость.
Листинг 1.78: Правильное использование пробелов в строках
1 х = "Hello, MGIMO University!" # Правильно
2 у = "Hello,MGIMO University!" P Неправильно,
«-» е хватает пробела
• Пробелы в комментариях. Рекомендуется использовать пробелы после
символа # в комментариях, чтобы улучшить читаемость.
Листинг 1.79: Правильное использование пробелив в комментариях
1 # Это комментарий # Правильно
2 #Это комментарий # Неправильно, не хватает про«-°
> бела
• Перепое «длинных строк». Если длина «строки» превышает 79 сим-
волов, то рекомендация РЕР 8 использовать скобки О, [] , {} или об-
ратный слэш \ (менее предпочтительно) для неявного переноса строк.
Данное правило касается длинных строк кода, длинных строк коммента-
риев и длинных строк документации.
Листинг 1.80: Правильный перенос длинных строк
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Разбиение длинной строки на несколько строк
long.string = (
"Это очень длинная строка, "
"которую нужно перенести.")
long.string = "Это очень длинная строка, " \
"которую нужно перенести."
# Разбиение длинного логического условия на нес<—»
— > колько строк
if (rhis_is.one.thing
and that._is_another_thing
and yet_another_thing)
process ()
# Разбиение арифметического выражения
total = (gross.wages
+ taxable.interest
- ira_deduction
- student.lcan.interest)
• Вертикальные пробелы. Рекомендуется отделять логические блоки
кода пустой строкой и не использовать лишние пустые строки
внутри функций или классов.
Листинг 1.81: Правильное использование вертикальных пробелов
1.10.3. Идентификаторы и пространство имен
Идентификаторы в Python это имена, которые используют для обо-
значения переменных, функций, классов и других объектов в коде. Согласно
РЕР 8, идентификаторы должны состоять из букв (латиница), цифр и подчер-
киваний (_), начинаться с буквы или подчеркивания и по совпадать с ключе-
выми словами языка. Отметим, что имя переменной не может начинаться
с цифры Рекомендуется использовать понятные и описательные идентифи-
каторы, чтобы облегчить чтение и понимание кода. Идентификаторы чувстви-
тельны к регистру, то есть myVariable и myvariable — это разные идентифи-
каторы.
Идентификатор объекта в Python уникальное целое число, кото-
рое интерпретатор Python присваивает объекту при его создании. Данное число
позволяет однозначно идентифицировать объект. Для интерпретатора CPython
идентификатор объекта означает адрес объекта в памяти. Для того чтобы по-
лучить идентификатор объекта, необходимо использовать функцию id О
Листинг 1.82: Получение идентификатора объекта
I х = 5
2 print(id(x)) # Выводит уникальный идентификатор объ«—>
екта х
Особенность идентификаторов объектов в Python заключается в том, что
они могут быть одинаковыми для разных переменных, если они ссылаются на
один и тот же объект. Например. если вы присвоите одной переменной значение
другой переменной, то обе переменные будут ссылаться па один и тот же объект
в памяти. В этом случае идентификаторы объектов будут одинаковыми.
Листинг 1.83: Идентификаторы объектов
1 х = 5
2 у = х # у ссылается на тот же объект, что и х
з print(id(x)) # Выводит идентификатор объекта х
4 print(id(y)) # Выводит тот же идентификатор, так кан-1
к у ссылается на тот же объект
Если вы измените значение одной из переменных, то идентификатор объ-
екта изменится, так как будет создан новый объект в памяти.
Листинг 1.84: Изменение идентификатора объекта
1
2
3
4
5
6
7
х = 5
у = х # у ссылается на тот же объект, что и х
print(id(x)) # Выводит идентификатор объекта х
print (id(y)) # Выводит тот же идентификатор, так ка<->
<—> к у ссылается на тог же объект
х = 10 # Создается новый объект в памяти
print(id(x)) # Выводит новый идентификатор объекта х
print(id(y)) # Выводит тот же идентификатор, так кан
‘-4 к у ссылается на тот же объект
Термины «идентификатор» и «идентификатор объекта» имеют разные
значения, но тесно связаны между собой. Основные отличия между идентифи-
катором и идентификатором объекта в Python:
• Идентификатор это имя, которое вы даете объекту, чтобы ссылаться па
него в коде. Идентификатор объекта это уникальный номер, который
Python присваивает объекту в памяти.
* Идентификатор может быть изменен, если вы присвоите объекту новое
имя. Идентификатор объекта остается неизменным на протяжении всего
времени жизни объекта.
• Идентификатор может быть не уникальным, так как разные объекты мо-
гут иметь одинаковые имена. Идентификатор объекта всегда уникален
для данного объекта в памяти.
• Идентификатор может быть изменен в процессе выполнения программы.
Идентификатор объекта не может быть изменен, так как он является уни-
кальным номером, присвоенным объекту при его создании.
Пространство имен (namespace) это структура, которая хранит со-
ответствие между именами идентификаторов и самими объектами, обеспечивая
организованный доступ к переменным, функциям, классам и другим объектам
программы. Основная цель пространств имен предотвращение конфликтов
между одинаковыми именами в разных частях программы. Например, одно
и то же имя переменной может использоваться в разных функциях без взаим-
ного влияния.
В языке программирования Python пространства имен реализованы как
словари, где ключи это имена идентификаторов, а значения соответству-
ющие им объекты. При обращении к идентификатору интерпретатор Python
выполняет поиск по следующему принципу:
• сначала ищет в текущем (локальном) пространстве имен;
• если не находит, переходит к внешним пространствам имен;
• в конце проверяет глобальное пространство имен
Такая иерархическая система поиска обеспечивает правильное разреше-
ние имен и предотвращает нежелательные конфликты между идентификато-
рами.
Область действия (scope) — это область кода, в которой идентифи-
катор доступен. Область действия определяет, где и как идентификатор мо-
жет быть использован. Например, переменная, объявленная внутри функции,
имеет локальную область действия и недоступна за пределами этой функции.
Переменная, объявленная вне функции, имеет глобальную область действия
и доступна во всей программе.
Пространство имен и область действия отличаются тем, что простран-
ство имен сопоставляет имена с объектами, в то время как область действия
это область кода, в которой вы можете получить доступ к имени. Каждый уро-
вень области действия имеет свои собственные идентификаторы, которые не
пересекаются с идентификаторами других уровней. Это позволяет избежать
конфликтов имен и обеспечивает четкую структуру кода. Язык Python реали-
зует большинство пространств имен с помощью словарей, где жизненный цикл
каждого пространства имен привязан к контексту выполнения, например, гло-
бальным или локальным областям действия.
Правильное именование и понимание пространства имен помогают избе-
жать конфликтов имен, неявных перекрытий переменных и улучшают читае-
мость и надежность кода.
Для разных типов объектов в языке Python приняты свои соглашения
для идентификаторов. Таблица 1.4 отражает наиболее распространенные со-
глашения РЕР 8. Соблюдение их поможет сделать код узнаваемым и понятным
дру1 им разработчикам.
Таблица 1.4: Основные соглашения по именованию в Python
Тип объекта Стиль Пример Описание Рекомендации
Переменные snake_case user_age Все строчные буквы, слова разделяются подчеркива- нием. Выбирайте по- нятные имена, отражающие содержимое; из- бегайте одпобук- веппых, кроме счетчиков.
Тип объекта Стиль Пример Описание Рекомендации
Функции snake.case ccmpute_sun() Как и пере- менные, под- черкивания для читаемо- сти. Начинайте с гла- гола, описывая действие.
Классы CapWords DataProcessor PascalCase: каждое слово с заглавной буквы, без подчеркива- ний. Используйте су- ществительные или сочетания существительно- го и глагола.
Методы snake.case get_data() Как функции, первый аргу- мент метода обычно self или cis. Должны отра- жать действие над объектом: первым словом часто глагол (set_, update,, is-)-
Константы ALL.CAPS MAX.RETRIES Все заглав- ные, слова разделяются подчеркива- нием. Имена должны быть максималь- но информатив- ны: объявляйте в модуле верхне- го уровня.
Пакеты и мо- дули snake.case data.loader.py Имена фай- лов и ди- ректорий строчные, можно под- черкивания для разделе- ния. Держите имя коротким, по описательным; отражайте со- держание моду- ля
Тин объекта Стиль Пример Описание Рекомендации
Переменные цикла i. J ter 1 in range(5) Однобуквеп- ные счетчики допустимы в небольших локальных циклах. Используйте только для прос- тых вложенных циклов: в слож- ных случаях давайте более ясные имена.
Приватные атрибуты _nane _cache Одно под- черкивание перед именем обозначает «protected». Нс обращай- тесь к таким атрибутам извне класса; подчер- кивание - со- глашение. а не жесткая защита.
Внутренние методы name init , „str Двойное под- черкивание спереди и сза- ди — систем- ные «магиче- ские» методы. Нс переимено- вывайте встро- енные методы; реализуйте их семантику со- гласно докумен- тации.
Для идентификации объектов в Python используются два оператора: is
и ==. Эти операторы выполняют разные типы сравнения и служат для разных
целей. Оператор is проверяет идентичность объектов, то есть ссылаются ли
обе переменные на один и тот же объект в памяти. Фактически он сравнива-
ет идентификаторы объектов, которые возвращает функция id(). Например,
если создать две переменные, которые ссылаются на один и тот же объект, то
оператор is вернет True. Если создать две переменные, которые ссылаются па
разные объекты, то оператор is вернет False
Листинг 1.85: Проверка идентичности объектов
—
1 х = [1 , 2, 3]
г у = х # у ссылается на тот же объект, что и х
з print(х is у) # Выводит True, так как х и у ссылают^
'—г ся на один и тот же объект
Если создать две переменные, которые ссылаются на разные объекты, то опе-
ратор is верист False.
Листинг 1.86: Проверка идентичности объектов
1
2
3
х = [1, 2, 3]
у = [1, 2, 3] # у ссылается на другой объект, чем х
print (х is у) # Выводит False, так как х и у ссылают
тся на разные объекты
Оператор == проверяет равенство значений объектов. Он сравнивает
содержимое объектов, а не их идентичность в памяти. Например, если создать
две переменные, которые ссылаются на один и тот же объект, то оператор ==
вернет True. Если создать две переменные, которые ссылаются на разные объ-
екты, по имеют одинаковые значения, то оператор == также вернет True Если
создать две переменные, которые ссылаются на разные объекты и имеют раз-
ные значения, то оператор == вернет значение False.
Листинг 1.87: Проверка равенства объектов
2
3
х = [1, 2, 3]
у = [1, 2, 3] # у ссылается на другой объект, чем х
print (х == у) # Выводит True, так как х и у имеют о<->
—> динаковые значения
print (х is у) # Выводит False, так как х и у ссылают
тся на разные объекты
1.10.4. Ключевые слова и специальные символы
Ключевые (или служебные) слова — это зарезервированные слова, ко-
торые имеют специальное значение в языке программирования Python. Они
определяют синтаксис и структуру языка, а также управляют поведением про-
граммы, и их нельзя использовать в качестве идентификаторов.
В таблице 1.5 приведены примеры ключевых слов.
Таблица 1.5: Примеры ключевых слов в Python
Ключевое слово Описание
False Логическое значение «ложь»
True Логическое значение «истина»
None Отсутствие значения или «пустой» объект
and Логический оператор «И»
as Используется для создания псевдонима при импорте
assert Используется для отладки
async Определение асинхронной функции
await Ожидание завершения асинхронной операции
break Прерывание цикла
class Определение класса
continue Переход к следующей итерации цикла
def Определение функции
del Оператор удаления объекта
elif Альтернативный блок кода в условном операторе
else Альтернативный блок кода
except Обработка исключений
finally Блок кода, который выполняется всегда
for Определяет цикл for
from Импортирование из модуля
if Условный оператор
import Импорт модуля или пакета
in Проверка наличия элемента в последовательности
is Проверка идентичности объектов
Ключевое слово Описание
pass Пустой оператор
raise Вызов исключения
return Возврат значения из функции
Некоторые ключевые слова используются для определения переменных,
функций и классов, другие — для управления потоком выполнения программы.
Например, ключевое слово if используется для определения условного опера-
тора, a for для определения цикла.
Для того чтобы получить полный список ключевых слов в Python, вы
можете использовать модуль keyword.
Листинг 1.88: Получение списка ключевых слов
1 # Импортируем модуль keyword
2 import keyword
з # Выводим список, ключевых слов
4 print(keyword.kwlist)
В результате выполнения этого кода будет выведен список всех ключевых
слов в Python.
Специальные символы это символы, которые имеют специальное зна-
чение в языке программирования Python. Они используются для выполнения
определенных операций и не могут быть использованы в качестве идентифи-
каторов. Например, следующие специальные символы нс могут использоваться
в качестве идентификаторов: 0. #. $. %, [,],{,}, :, ,, .,
< > ? / \ I 4
Для того чтобы получить полный список специальных символов ASCII
в Python, вы можете использовать модуль string.
Листинг 1.89: Получение списка специальных символов i 2
i # Импортируем модуль string
2 import string
з # Выводим список специальных символов
4 print(string.punctual ion)
В результате выполнения этого кода будет выведен список всех знаков
пунктуации ASCII в Python. Если вам нужно учесть не только ASCII, но и лю-
бые символы «пунктуации» или «знаков» в Юникоде, можно воспользоваться
модулем unicodedata.
1.10.5. Организация кода в Jupyter Notebook / Lab
Файл с расширением . ipynb («ноутбук» или «записная книжка») объ-
единяет код и текст, поэтому важно организовать его структурно и логиче-
ски. Это поможет вам лучше понимать код и упростит его чтение. При работе
в Jupyter Notebook / Lab важно следовать некоторым рекомендациям по орга-
низации кода:
• Структурируйте код. Разделяйте код на логические блоки, используя
ячейки. Каждая ячейка должна содержать отдельный блок кода или от-
дельную задачу. Это поможет вам лучше организовать код и упростить
его чтение.
• Используйте комментарии Комментарии помогают понять, что дела-
ет код. Используйте комментарии для пояснения сложных участков кода
и для документирования функций и классов.
• Используйте Markdown ячейки. Используйте Markdown ячейки для
документирования кода, добавления заголовков и пояснений. Это поможет
вам создать более читаемую и понятную документацию.
• Используйте заголовки Используйте заголовки для разделения кода
на логические блоки. Это поможет вам быстро находить нужные части
кода и улучшит его читаемость.
• Используйте отступы Используйте отступы для выделения блоков ко-
да. Это поможет вам лучше организовать код и упростить его чтение.
• Используйте пробелы. Используйте пробелы для улучшения читаемо-
сти кода. Например, используйте пробелы вокруг операторов и после запя-
тых. Это поможет вам сделать код более понятным и удобным для чтения.
• Используйте единый стиль Используйте единый стиль оформления
кода во всем проекте. Эго поможет вам создать более читаемый и попят-
ный код. Например, используйте один и тот же стиль именования пере-
менных и функций, а также одинаковые отступы и пробелы.
• Используйте версии Jupyter Notebook / Lab. Используйте послед-
нюю версию Jupyter Notebook / Lab, чтобы иметь доступ ко всем новым
функциям и исправлениям ошибок. Это поможет вам избежать проблем
с совместимостью и улучшит производительность.
• Используйте расширения Jupyter Notebook / Lab Используйте
расширения Jupyter Notebook / Lab для улучшения функциональности
и удобства работы. Например, используйте расширения для автозаверше-
ния кола, проверки синтаксиса и форматирования кода.
• Используйте виртуальные окружения, Используйте виртуальные
окружения для управления зависимостями и версиями библиотек. Это по-
может вам избежать конфликтов между библиотеками и упростит управ-
ление проектами.
• Используйте контроль версий. Используйте системы контроля вер-
сий (например, Git) для управления изменениями в коде. Это поможет
вам отслеживать изменения, откатывать их при необходимости и работать
в команде.
• Используйте документацию. Используйте документацию для изуче-
ния новых функций и библиотек. Это поможет вам лучше понять, как
использовать функции и библиотеки, а также избежать распространен-
ных ошибок.
• Используйте тестирование. Используйте тестирование для проверки
корректности кода. Это поможет вам выявить ошибки и недочеты в коде,
а также улучшить его качество.
Контрольные вопросы
1. Что такое алгоритм? Приведите примеры.
2. Что такое параметры алгоритма? Приведите примеры.
3. Что такое результат алгоритма? Приведите примеры.
4. Что такое парадигме! программирования? Приведите примеры.
5. В чем разница между компилируемыми и интерпретируемыми языками
программирования?
6. Какова роль интерпретатора в выполнении Python-кода?
7. Как загрузить и установить интерпретатор Python на Windows, Linux
и Mac OS?
8. Что такое IDE? Приведите примеры.
9. Какие преимущества даст IDE по сравнению с простым текстовым редак-
тором?
10. Как настроить интерпретатор Python в Visual Studio Code?
11. Что такое тип данных? Приведите примеры.
12. Какие команды в терминале позволяют проверить установленную версию
Python?
13. Что такое виртуальное окружение и почему его рекомендуется использо-
вать?
14. Опишите процесс создания виртуального окружения с помощью модуля
venv.
15. Опишите процесс создания виртуального окружения с помощью менедже-
ра conda
16. Опишите процесс активации и деактивации виртуального окружения.
Контрольные вопросы
17. Какие потенциальные проблемы возникают, если не использовать вирту-
альные окружения?
18. Приведите пример команды установки пакета с помощью менеджера
conda
19. Объясните разницу меж,ту интерактивным режимом и скриптовым режи-
мом выполнения Python-кода.
20. Как запустить Python в интерактивном режиме из командной строки?
21. Как выполнить скрипт myscript.py из терминала?
22. Как создать новый ноутбук в Jupyter Notebook / Lab?
23. Как добавить Markdown-ячейку в Jupyter Notebook и зачем это нужно?
24. Объясните, как сохранить п экспортировать результаты работы в Jupyter
Notebook.
25. Каковы основные рекомендации по организации кода в Jupyter Notebook
/ Lab?
26. Как вставить значения переменных в строку с помощью метода
str format О?
27. Как вставить значения переменных в строку с помощью f-строк (литера-
лов)?
28. Как задать количество знаков после десятичной точки при выводе чисел
па экран?
29. Как создать комментарий в Python? Каковы основные правила написания
комментариев? Как создать многострочный комментарий?
30. Каковы основные соглашения по именованию идентификаторов в Python?
31. Что такое пространство имен и область действия в Python?
32. Каковы основные правила оформления кода в Python?
33. Что такое ключевые слова и специальные символы в Python?
34. Как правильно именовать переменные и функции в соответствии с согла-
шениями Python?
35. Какие символы разрешены и запрещены в именах переменных?
36. Какие слова запрещены для идентификаторов в Python?
Практикум: алгоритмы и имена переменных
Упражнения
Алгоритмы и указание параметров
1. Опишите алгоритм для вычисления площади прямоугольника. Укажите
входные и выходные параметры.
2. Составьте алгоритм обмена значений двух переменных через третью пе-
ременную.
3. Приведите’ алгоритм нахождения максимального из трех чисел. Опреде-
лите параметры.
4. Опишите последовательность действий (алгоритм) для перевода темпера-
туры из Цельсия в Фаренгейт.
5. Составьте* алгоритм расчета факториала натурального числа п. Укажите
входной параметр.
6. Напишите алгоритм для проверки четности числа. Укажите возвращаемое
значение.
7. Опишите алгоритм для нахождения среднего арифметического последо-
вательности из п чисел. Задайте параметры.
8. Составьте алгоритм для нахождения минимального элемента последова-
тельности из п чисел. Поясните параметры
9. Опишите алгоритм для нахождения суммы всех элементов последователь-
ности из п чисел. Укажите параметры.
10. Составьте алгоритм для нахождения произведения всех элементов после-
довательности из п чисел. Укажите параметры.
Именование переменных и функций по РЕР8
11. Приведите примеры имен переменных, которые соответствуют соглаше-
ниям РЕР8.
12. Приведите примеры имен переменных, которые не соответствуют согла-
шениям РЕР8.
13. Приведите примеры имен функций, которые соответствуют соглашениям
РЕР8.
14. Приведите примеры имен функций, которые нс соответствуют соглаше-
ниям РЕР8.
15. Приведите примеры имен классов, которые соответствуют соглашениям
РЕР8.
16. Приведите примеры имен классов, которые не соответствуют соглашени-
ям РЕР8.
17. Приведите примеры имен констант, которые соответствуют соглашениям
РЕР8.
18. Приведите примеры имен констант, которые нс соответствуют соглашени-
ям РЕРб.
19. Приведите примеры имен переменных, которые содержат недопустимые
символы.
20. Придумайте корректное имя переменной для хранения текущей скорости
автомобиля.
21. Придумай те корректное имя переменной для хранения текущей темпера-
туры в градусах Цельсия.
22. Придумайте корректное имя переменной для хранения текущей темпера-
туры в градусах Фаренгейта.
23. Придумайте корректное имя переменной для храпения текущей темпера-
туры в Кельвинах.
24. Придумайте имя переменной для списка оценок студента.
25. Придумайте имя переменной дтя храпения текущей даты.
26. Придумайте имя переменной для хранения текущего времени.
27. Как назвать функцию, которая вычисляет дискриминант квадратного
уравнения?
28. Как назвать функцию для проверки пароля на безопасность?
29. Как назвать функцию дтя вычисления среднего арифметического после-
довательности чисел?
30. Как назвать функцию для вычисления суммы всех элементов последова-
тельности чисел?
31. Как назват ь функцию дтя вычисления произведения всех элементов по-
следовательности чисел?
32. Как назвать функцию дтя нахождения максимального элемента последо-
вательности чисел?
33. Придумайте имя константы для числа Пи.
34. Придумайте имя константы для числа золотого сечения.
Форматирование вывода: спецификаторы чисел
35. Напишите программу, которая выводит число 3.1415926 с точностью до
двух десятичных знаков.
36. Напишите программу, которая выводит число 3.1415926 с точностью до
четырех десятичных знаков.
37. Напишите программу, которая выводит число 3.1415926 в экспоненциаль-
ной форме с двумя значащими цифрами
38. Напишите программу, которая выводит число 3.1415926 в экспоненциаль-
ной форме с четырьмя значащими цифрами.
39. Напишите программу, которая выводит число 0.756 в процентах с двумя
десятичными знаками.
40. Напишите программу, которая выводит число 255 в шестнадцатеричной
системе счисления.
41. Напишите программу, которая выводит число 255 в двоичной системе
счисления.
42. Напишите программу, которая выводит число 255 в восьмеричной системе
счисления.
43. Напишите программу, которая выводит символы Unicode под номерами
от 70 до 75.
Использование print, с sep и end
44. Напишите программу, которая выводит три слова через дефис без пере-
носа строки.
45. Напишите программу, которая выводит числа от 1 до 10 в одну строку
через пробел.
46. Напишите программу, которая выводит числа от 1 до 10 в одну строку
через запятую.
47. Напишите программу, которая выводит числа от 1 до 10 в один столбик.
48. Напишите программу, которая запрашивает имя и возраст пользователя,
и выводит приветствие и возраст пользователя в следующем году:
а) без использования f-строки;
б) с использованием f-строки.
Например, если введено имя «Катя» и возраст «14», программа должна
вывест и, предложения: Привет, Катя! В следующем году тебе будет 15!
19. Напишите программу, которая запрашивает имя, фамилию и возраст
пользователя, а затем выводит эти данные в столбик:
а) без использования f-строкп;
б) с использованием f-строкп.
Например, если введены имя «Евгения», фамилия « Фролова» и возраст
«19», программа должна вывести предложения:
Имя: Евгения
Фамилия: Фролова
Возраст: 19
50. Напишите программу, которая запрашивает у пользователя два числа
и выведите их сумму:
а) без использования f-строкп;
б) с использованием f-строки.
Например, если введены 3 и 5, программа должна вывести предложение:
Сумма чисел 3 и 5 равна 3.
51. Напишите программу, которая запрашивает у пользователя целое число
п из диапазона от 1 до 9 включительно, и выведите результат вычисления
выражения ппп — пп — п. Например, если введенное число 3, программа
должна вывести «297», так как 333 — 33 — 3 = 297.
52. Напишите программу, которая запрашивает у пользователя вещественное
число и выведите его, округленное до двух знаков после запятой:
а) без использования f-строкп:
б) с использованием f-строкп
Заключение
Например, если введено число 6.7896. программа должна вывести пред-
ложение: Число 6.7896, округленное до двух знаков: 6.79.
53. Напишите программу, которая выводи! на экран прямоугольник 5 х 15,
сформированный из звездочек.
54. Напишите программу, которая выводит на экран равнобедренный тре-
угольник с основанием 15 и высотой 5, сформированный из звездочек.
Заключение
В этой главе мы познакомились с основными понятиями и определения-
ми, связанными с программированием. Мы узнали, что такое алгоритм, пара-
метры алгоритма, результат алгоритма и парадигма программирования. Также
мы рассмотрели язык программирования Python, его особенности и преимуще-
ства.
Глава 2. Основные типы данных и операции
В этой главе мы познакомимся с базовыми конструкциями языка Python,
научимся работать с переменными, получать данные от пользователя и вы-
водить результаты на экран. Также мы рассмотрим основные гииы данных
и научимся работать с ними.
В Python существуют встроенные типы данных, такие как целые чис-
ла (int), числа с плавающей точкой' (float), комплексные числа (complex),
логические значения (bool), строки (str), неизменяемые последовательности
целых чисел (range), списки (list), кортежи (tuple), множества (set), неиз-
меняемые множества (frozenset), байтовые строки (bytes), байтовые массивы
(bytearray), словари (diet) и специальный тип NoneType. Каждый тип дан-
ных имеет своп особенности и методы работы с ним.
Первые три типа данных являются числовыми и используются для вы-
полнения арифметических операций. Логические значения используются для
выполнения логических операций. Неизменяемые последовательности целых
чисел используются для создания диапазонов целых чисел. Строки представля-
ют собой последовательности символов и могут содержать текстовые данные.
Списки, кортежи, множества и словари используются для хранения коллекций
данных и имеют свои уникальные свойства.
NoneTypc — это тип данных, который используется для обозначения
отсутствия значения. Он имеет только одно значение: None
§2.1 . Переменные и идентификаторы
Переменные в Python отличаются от переменных в других языках про-
граммирования, таких как С-Ц- или Java, тем, что они
• ие требуют явного объявления тина;
• могут быть переопределены:
• их тип может изменяться в зависимости от присваиваемого значения;
• являются ссылками на объекты, а не самими объектами.
Формально в Python отсутствуют «.переменные» в классическом пони-
мании этого термина. Вместо этого используются идентификаторы (имена),
1 Модель действительного числа.
§2.1. Переменные и идентификаторы
которые не хранят сами значения, а являются ссылками на объекты, которые
хранятся в памяти. Это означает, что имена не хранят значения, а указывают
на место в памяти, где эти значения находятся. Когда мы присваиваем значение
переменной, мы фактически создаем ссылку па объект в памяти. Если мы. на-
пример, присвоим переменной х значение 10, то х будет ссылаться на объект 10
в памяти. Если затем мы присвоим х значение 20, то х будет ссылаться на новый
объект 20, а старый объект 10 останется в памяти до тех пор, пока на него есть
ссылки в коде программы. Имена в Python, как и в других языках програм-
мирования, не имеют фиксированного типа, а сами объекты имеют тип. Один
и тот же идентификатор может быть переназначен разным объектам в хо-
де выполнения программы. Это означает, что «переменные» формально могут
менять тип или существовать без явно определенного типа. При этом одно и то
же имя может ссылаться па разные объекты в разные моменты времени. Том
не менее, в неформальном контексте допустимо говорить «переменная», имея
в виду объект, связанный с этим именем в текущий момент, если это не вызыва-
ет двусмысленности. Это важно для понимания того, как работают переменные
в Python.
Далее мы будем использовать выражение «переменная X», подразумевая
текущий объект, связанный с именем X,
Переменные в Python являются динамически типизированными, то
есть их тип определяется автоматически в зависимости от значения, которое
им присваивается. Это позволяет использовать переменные для храпения раз-
личных типов данных без необходимости явного объявления типа, и их можно
использовать для храпения любых данных. Это позволяет переменным быть
гибкими и удобными в использовании.
Переменные в Python создаются автоматически при их первом присваи-
вании. Когда в коде впервые пишут имя переменной, это называется объявле-
нием переменной. Имя придумывает сам программист. Во время выполнения
программы, когда в коде встречается имя переменной, интерпретатор Python
создаст объект в памяти и связывает его с этим именем. Для того чтобы создать
переменную, достаточно присвоить ей значение с помощью оператора присва-
ивания =.
Листинг 2.1: Пример присваивания переменной
—
1 # Присваи-ание значения переменной
2 X = 10
3 у = 3.14
4 name = "Alexander"
В этом примере переменной х присваивается целое пиело 10, переменной
у — число с плавающей точкой 3.11, а переменной паше строка "Alexander".
Отметим, что в программировании оператор присваивания = использу-
ется для того, чтобы присвоить значение переменной. Его не следует путать
с математическим знаком равенства. Выражение х = 10 означает что «теперь
в переменной х хранится значение 10».
После того как переменной в программе на языке Python было присво-
ено какое-то значение, его можно заменить, то есть ей можно присвоить повое
значение. Когда переменной присваивается новое значение, то старое значение
удаляется из памяти, если на это значение больше не ссылается ни одна пере-
менная. Таким образом, переменная «забывает» предыдущее значение. Напри-
мер, если в переменной х хранится число 10, то выражение х = 38 означает,
что теперь в переменной х хранится число 38.
При этом переменная х может хранить значения разных типов. Пере-
определение переменной и изменение ее типа в языке Python происходит авто-
матически, когда ей присваивается новое значение.
Листинг 2.2: Переопределение переменной
# Переопределение переменной
х = 10 ff х - целое число
х = "MGIMO" # х - строка
В данном примере переменная х сначала содержит целое число 10,
а затем строку "MGIMO". Таким образом, переменная х может менять свой
тип в зависимости от присваиваемого значения.
Для того чтобы присвоить несколько переменных сразу, можно исполь-
зовать перечисление через запятую.
Листинг 2.3: Присваивание нескольких переменных
/
1 # Присваивание нескольких переменных одновременно
2 а, Ь, с = 1, 2, 3
В этом примере переменным а, b и с присваиваются значения 1, 2 и 3
соответственно.
Для того чтобы узнать тип переменной, можно использовать встроенную
функцию type О
Листинг 2.4: Определение типа переменной
i
2
3
4
5
6
# Определение типа переменной
х = "MGIMO" # строка
у = 3.14 # число с плавающей запятой
z = 10 # целое числе
pr int (type (х)) * <class ’str’>
print(type(у)9 H <c]ass ’float’>
print(type(z)) # <claos ’xnt’>
Результат вывода на экран будет отображать тин переменной в виде
строки, например cclass ’str’> для строкового типа данных, <class ’int’>
для целого числа, <class ’float’> для числа с плавающей точкой и <class
’comp]ex’> для комплексного числа.
§2.2. Числовые типы данных. Арифметические операции
В программировании мы очень часто работаем с числами. Это может
быть количество товаров в магазине, сумма покупки, температура воздуха или
что-то другое. Python — гибкий и мощный язык, и работа с числами в нем
удобна и понятна.
Тип int (от английского integer) в Python используется для представ-
ления целых чисел. Язык программирования Python нс имеет ограничения на
размер целых чисел, они могут быть сколь угодно большими. Это отличает
Python от некоторых других языков программирования, где целые числа име-
ют фиксированный размер.
Тип float (от английского floating-point) используется для представле-
ния чисел с плавающей точкой. Они имеют ограниченную точность, что может
привести к ошибкам округления. Это связано с тем, что числа с плавающей
точкой представляются в двоичной системе счисления, которая не может точно
представить некоторые десятичные дроби.
Тип complex используется для представления комплексных чисел. Ком-
плексные числа в Python представляются в виде а + bj, где а и b действи-
тельные числа, a j — мнимая единица.
В листинге 2.5 приведены примеры использования встроенных числовых
типов данных.
Листинг 2.5: Числовые типы данных
1 # Целое число
г а = 10
з # Число с плавающей точкой
4 Ь = 3 14
s # Комплексное число 1 + 2i
в с = 1 + 2j
Также с помощью библиотеки Fraction можно работать с рациональны-
ми числами (обыкновенными дробями), которые в Python представляют собой
отношение двух целых чисел. Например, дробь 1 /2 может быть представлена
как Fraction(l, 2). Работа с обыкновенными дробями в некоторых случаях
может быть полезна, так как опа позволяет избежать ошибок округления, свя-
занных с числами с плавающей точкой.
2.2.1. Арифметические операции
Язык программирования Python поддерживает стандартные арифмети-
ческие операции, такие как сложение, вычитание, умножение, деление, возведе-
ние в степень, а также некоторые дополнительные операции. Арифметические
операции в Python можно выполнять с помощью операторов. Операторы
это специальные символы, которые выполняют определенные действия над опе-
рандами. Операнд это данные, над которыми выполняются операции. Опе-
ранды могут быть различных типов, включая числа, строки, списки, кортежи,
множества, словари и другие объекты. Они используются вместе с оператора-
ми для выполнения различных операций, таких как арифметические операции,
операции сравнения, логические операции и операции с коллекциями. Операн-
ды могут быть константами, переменными или выражениями.
В таблице 2.1 приведены основные арифметические операции в Python.
В таблице используются следующие обозначения: х и у — переменные, которые
могут принимать числовые значения (целые или вещественные).
Таблица 2.1: Арифметические операции в Python
Описание операции Оператор Синтаксис
Сложение + X + у
Вычитание - х - У
Умножение * X * у
Деление / X / У
Целочисленное деление // х //У
Возведение в степень г ** 5^ * -ур
Взятие остатка от деле- ния % X % у
Унарный минус - -X
Среди указанных операций в таблице 2.1 унарный минус является унар-
ной операцией, го есть применяется к одному операнду. Остальные операции
являются бинарными, то есть применяются к двум операндам.
Тип complex не поддерживает операции целочисленного деления и взя-
тия остатка от деления.
В листинге 2.6 приведены примеры арифметических операций с числами.
Листинг 2.6: Арифметические операции
—
। а = 10 Д Целс<| число
2 b = 3 fr Целое число
з » Деление
4 div.result = а / b # 3.3333333333333335
5 # Целочисленное деление
в int_div_result = а // b к 3
т Д Взятие остатка от деления
в mod_result = а '/, b #1
Тип результата арифметических операций зависит от типов операндов
и выполняемой операции. Например, если оба операнда — целые числа, то
результат будет целым числом. Если хотя бы один из операндов число
с плавающей точкой, го результат будет числом с плавающей точкой. Резуль-
тат операции деления всегда будет числом с плавающей точкой, даже если оба
операнда — целые числа.
Листинг 2.7: Тины данных в арифметических операциях
1
2
3
4
6
7
8
Й Примеры типов данных в арифметических операциях
а = 5 # Целое число
b = 2 tr Цело<- число
с = 6 # Целое число
# Вывод результата деления
# число с плавающей точкой
resultl = а / b к 2.5
result2 = с / b # 3.0
Для того чтобы узнать тип результата арифметической операции, мож-
но использовать функцию type О. Например, type (resultl) вернет <class
’float’>. a type(result2) вернет <class ’int’>.
Язык программирования Python также поддерживает арифметические
операции с числами в различных системах счисления, таких как двоичная,
восьмеричная и шестнадцатеричная. Для этого используются префиксы 0Ь (для
двоичной). Оо (для восьмеричной) и Ох (для шестнадцатеричной) перед числом.
Например, ObiOlO это двоичное число 1010, которое соответствует десятич-
ному числу 10.
В листинге 2.8 приведены примеры арифметических операций с числами
в различных системах счисления. При этом результаты операций всегда выво-
дятся в десятичной системе счисления.
Листинг 2.8: Арифметические операции с числами в различных системах счис-
ления
# Задаем число 10 в двоичной системе
bin_a = ОЬЮЮ
# Задаем число 3 в двоичной системе
bin.b = ObOOU
# Задаем число 10 в восьмеричной системе
oct_a = 0о12
# Задаем число 3 в восьмеричной системе
oct_b = ОоЗ
# Задаем число 10 в шестнадцатеричной системе
hex.а = ОхА
# Задаем числи Зв- естнадцатеричной системе
hex_b = 0x3
# Арифметические операции
bin.result = bin,а + bin.b
oct_result = oct_a - oct_b
hcx.result = hex.a * hex_b
# Вывод результатов в десятичной системе счисления
«-> о умолчанию
print(bin,result) # Ь»лод: 13
print(oct,result 1 # Вывод: 7
print(hex_result) # од 30
Для того чтобы преобразовать число из одной системы счисления в дру-
гую, можно использовать встроенные функции bin(), oct() и hex(). Эти функ-
ции принимают целое число в десятичной системе счисления и возвращают
строку, представляющую это число в двоичной, восьмеричной или шестнадцате-
ричной системах счисления («ответственно. Например. bin(10) вернет СЫ010,
oct(10) вернет 0о12. a hex(10) вернет ОхА.
# Преобразование чисел в различные
# системы счисления
bin_result = bin(10) # стр'к а ’0Ы010’
oct_result = oct(lO) # строка ’0о12’
hex.result = hex(10) # строка ’Oxfl’
print (bin_result) я Зывод ОЫО10
print(oct_result) « <од 0ol2
print(hex_result) в оь од. ОхА
Листинг 2.9: Преобразование чисел в различные системы счисления
1
2
3
4
5
6
7
8
2.2.2. Особенности арифметических операций в Python
При выполнении арифметических операций в Python важно учитывать,
что результат может отличаться в зависимости от типов операндов. Например,
если оба операнда целые числа, то результат будет целым числом. Если хотя
бы один из операндов число с плавающей точкой, то результат будет числом
с плавающей точкой.
1. Деление (/): возвращает результат деления двух чисел в виде числа
с плавающей точкой (float), даже если оба числа целые. Например,
6 / 2 = 3.0 и 5 / 2 = 2.5.
2. Целочисленное деление (//): возвращает целую часть от деления двух
чисел, при этом результат всегда округляется вниз до ближайшего целого
числа. Это работает как для положительных, так и для отрицательных
чисел. Например, 5 // 2 = 2 и -10 // 3 = -4.
3. Возведение в степень (**): возвращает результат возведения числа
в степень. Работает с дробными и отрицательными показателями степе-
ни Например, 4 ** 0.5 = 2.0 (квадратный корень из 4), 2 ** 3 = 8
и 8 ** -1 = 0.125 (обратная величина к 8). Нулевая степень любого
ненулевого числа равна 1, например, 5 +* 0 = 1
4. Унарный минус (-): используется для изменения знака числа. Напри-
мер, -5 — это отрицательное число, а 5 — положительное.
5. Остаток от деления (%): возвращает остаток от деления двух чисел.
Например, 5 7 2=1
6. Преобразование типов: Python автоматически преобразует типы дан-
ных при выполнении операций. Например, если вы складываете целое
число и число с плавающей точкой, результат будет числом с плаваю-
щей точкой. Если вы хотите явно преобразовать тип данных, используй-
те функции int(). float() и complexO. Например. int(3.14) вернет 3,
float(3) вернет 3.0, a complex(3) вернет 3 + 0j.
7. Проверка типов данных: Чтобы проверить тип данных переменной,
используйте функцию type О. Например, type (а) верист <class ’int’>,
atype(c) верист <class ’float’>
8. Приоритет операций, определяет порядок выполнения операций.
В Python, как и в математике, операции выполняются в определенном по-
рядке. Сначала выполняются операции в скобках, затем возведение в сте-
пень, умножение и деление (включая целочисленное деление и вычисление
остатока от деления) и, наконец, сложение и вычитание. Если необходи-
мо изменить порядок выполнения операций, можно использовать круглые
скобки. Например, 2 + 3*4 = 14 (сначала умножение, затем сложение),
а (2 + 3) * 4 = 20 (сначала сложение, затем умножение). В таблице 2.2
приведены приоритеты операций.
Таблица 2.2: Приоритеты операций
Операция Приоритет
** 1
*, /, //, % 2
+• — 3
2.2.3. Комбинация арифметических операций и присваивания
В Python можно использовать комбинированный оператор присваива-
ния2 это оператор, которые позволяют выполнить арифметическую операцию
и присваивание в одной строке. Рассмотрим, что происходит, когда использу-
ются комбинированные операторы присваивания.
Листинг 2.10: Комбинация арифметических операций и присваивания
— 1 # Пример комбинированногс присваивания
1 х = 10 # х = 10
з у = 5 # у = 5
4 X += у # означает, что х = х + у
з print(х) L. # ^ЫЕСД. 15
В приведенном выше примере переменной х присваивается значение 10,
а переменной у присваивается значение 5. Далее, когда мы пишем выражение
х += у, то оно полностью эквивалентно х = х + у. В этом случае интерпрета-
тор Python сначала берет текущее значение переменной х, прибавляет к нему
значение переменной у и присваивает результат обратно переменной х. В ре-
зультате переменная х становится равной 15. Такое действие значительно сокра-
щает количество кода, которое нужно написать, и позволяет избежать повтор-
ного написания имени переменной. Аналогичным образом работают и другие
комбинированные операторы присваивания. Они выполнят бинарную арифме-
тическую операцию над левым и правым операндами, а затем присваивают
полученный результат левому операнду.
В таблице 2.3 приведены все возможные комбинации арифметических
операций и оператора присваивания, а также указаны выражения, которые им
равносильны.
Комбинированные операторы присваивания работают точно так же, как
и их аналоги без комбинированного присваивания, и могут использоваться, ко-
гда это возможно. Отметим, что earn применить х //= у к комплексным
2 Так же называется составным пли сокращенным присваиванием. Часто излагается в раз-
делах, посвященных операторам присваивания.
Таблица 2.3: Комбинация арифметических операций и оператора присваивания
Описание операции Оператор Синтаксис «Равносильно»
Сложение и присваивание += X += у X = X + у
Вычитание и присваивание _ = X -= у X = х - у
Умножение и присваивание ♦= X *= у X = X * у
Деление и присваивание /= X /= у X = X / у
Целочисленное деление и присваивание //= X //= у X = X // у
Возведение в степень и при- сваивание *♦= X **= у X = X *♦ у
Остаток от деления и при- сваивание •/.= X 7.= у х = х 7. у
числам х и у, то в результате получится ошибка, так как целочисленное де-
ление не определено для комплексных чисел. Таким образом, комбинированные
операторы присваивания позволяют сократить запись выражений и сделать код
более читаемым, но их использование должно быть обоснованным и коррект-
ным в контексте задачи.
§ 2.3. Логический тип данных и логические операции
Логический тип данных5 (bool) в Python представляет собой тип, кото-
рый может принимать только два логических значения: True (истина) и False
(ложь). Логические значения используются в условных выражениях, циклах
и других конструкциях, где требуется проверка истинности или ложности усло-
вий.
Логические операции позволяют комбинировать логические значения
и выполнять операции над ними. Основные логические операторы включают:
• and логическое И;
• or — логическое ПЛИ;
'Булев (boolean) это устоявшийся в программировании термин, происходящий от имени
английского математика Джорджа Буля. Он заложил основы алгебры логики, где все сужде-
ния можно выразить через истину и ложь. Таким образом, «логический тип» и «булев гип»
— это одно и го же.
• not — логическое НЕ.
Например, логическое II (and) возвращает True, сели оба операнда пс-
1ны, в противном случае возвращает False.
Листинг 2.11: Логическое II
1
2
3
4
5
Л
1
2
3
4
5
1
2
3
4
5
# Логические значения
а = True
b = False
# Логическое И
result_and = a and b # False, так как одно из услов<—>
> ий ложно
Логическое ИЛИ (or) возвращает True, если хотя бы один из операндов
Листинг 2.12: Логическое ИЛИ
# Логические значения
а = True
b = False
# Логическое ИЛИ
result_or = a or b # True , так как одно из условий <-»
—> истинно
Логическое НЕ (not) инвертирует логическое значение.
Листинг 2.13: Логическое НЕ
# Логические значения
а = True
b = False
# Логическое НЕ
result_not = not а # False , так как а истинно
Логические операции могут быть комбинированы, что позволяет созда-
вать более сложные логические выражения.
Листинг 2.14: Логическое И с несколькими условиями
1 # Логические значения
2 3 4 5 а = True b = False с = True # Комбинации логических операций
6 7 result = (a and b) or (b and с) False # так как первое условие ложно
8 9 10 11 result2 = (a or b) and (b or с) # True # так как одно из условий истинно results = not (a and b) fr True # так как условие a and b ложно
Проверку истинности или ложности выражений удобно представлять
с помощью таблиц истинности, которые показывают все возможные комбина-
ции входных значений и соответствующие результаты логических операций.
В таблице 2.4 показаны результаты выполнения логических операций.
Таблица 2.4: Логические операции
А В A and В A or В not A
True True True True False
True False False True False
False True False True True
False False False False True
Приоритет логических операций в Python определяет порядок, в кото-
ром выполняются логические операции в выражении. Приоритет логических
операций в Python следующий (в порядке убывания приоритета):
1. not (логическое НЕ) (самый высокий приоритет).
2. and (логическое И).
3. or (логическое ИЛИ) (самый низкий приоритет).
Это означает, что операции not выполняются первыми, затем and. и только по-
сле этого от Если необходимо изменить порядок выполнения операций, можно
использовать круглые скобки. Например, в булевом выражении not (a and Ь)
or с сначала будет выполнено логическое И, затем логическое ИЕ, и только
после этого логическое ИЛИ.
Отметим, что логический тип данных является подтипом целого
числа, где True соответствует 1, a False соответствует 0. Такое представление
позволяет использовать логические значения в арифметических операциях.
Листинг 2.15: Логический тип данных
i it Логический тип данным
2 is_true = True я Логические значение Tru
з is_false = False # Логическое значение False
4 # Логические значения как числа
з is_true_as _int = int(is_true) tt 1
e is _f a 1.se_ a s _int = i nt ( i s_f a 1 se ) # 0
7 # Логические значения в арифметических операциях
s result = is_true + 5 #6, так как True соответствуем—»
1 * т 1
Логические операции могут быть использованы для проверки несколь-
ких условий одновременно и выполнения действий в зависимости от результата.
Более подробно данный аспект будет рассмотрен в главе 3, посвященном услов-
ным выражениям и циклам.
Для сравнения значений в Python используются операторы сравнения,
которые возвращают логическое (булево) значение True или False Они поз-
воляют проверять равенство, неравенство, а также определять, больше или
меньше одпо значение другого. Операторы сравнения пробегами отделяются
от операндов, что делает код более читаемым. Операторы сравнения приведе-
ны в таблице 2.6.
Таблица 2.5: Операторы сравнения
Оператор Описание
== (равно) Проверяет, равны ли значения операндов. Если рав- ны, то условие является истинным
! = (нс равно) Проверяет, равны ли значения операндов. Если НЕ равны, то условие является истинным
> (больше) Проверяет значение левого операнда. Если оно боль- ше, чем значение правого, то условие является ис- тинным
< (меньше) Проверяет значение левого операнда. Если оно мень- ше, чем значение правого, то условие является ис- тинным
>= (больше или но) рав- Проверяет значение левого операнда. Если оно боль- ше либо равно значению правого, то условие являет- ся истинным
<= (меньше или по) рав- Проверяет значение левого операнда. Если оно мень- ше либо равно значению правого, то условие являет- ся истинным
Операторы сравнения могут быть использованы для сравнения различ-
ных типов данных, таких как строки, списки и т. д. Также они могут быть
объединены в цепочки для более лаконичной записи условий.
Листинг 2.16: Логические операции и операторы сравнения
1 # Задаем значения переменных
г а = 5
з b = 10
4 с = 15
з » Проверяем условие 1
е result = (а < b) and (b < с) # True, так как оба усс-^
-> ловия истинны
7 # Про теряем условие 2
8
9
10
result2 = (а > Ъ) or (Ъ < с) # True, так как одно и4—>
«--> э условий истинно
# Проверяем условие 3
results = not (а < b) # False, так как условие а < <—>
' > Ъ истинно
В таблице 2.6 показаны результаты выполнения операторов сравнения.
Таблица 2.6: Результаты выполнения операторов сравнения
а ь а == b a != b a > b a < b a >= b
5 10 False True False True False
10 5 False True True False True
5 5 True False False False True
10 10 True False False False True
§2.4. Последовательности
Последовательности это упорядоченные коллекции элементов, ко-
торые могут содержать элементы одного или разных типов. Каждый элемент
последовательности имеет свой индекс, который определяет его положение
в последовательности. Последовательности являются фундаментальной частью
языка Python и включают несколько различных типов данных, каждый из
которых предназначен для определенных задач. Язык Python поддерживает
несколько встроенных типов последовательностей, таких как строки, списки,
кортежи, множества и неизменяемые множества, неизменяемая последователь-
ность целых чисел, а также байтовые строки и байтовые массивы. В этом па-
раграфе мы рассмотрим основные операции с последовательностями, которые
можно выполнять в Python.
К основным типам последовательностей относятся:
• Изменяемые последовательности списки, массивы байтов.
• Неизменяемые последовательности: строки, кортежи, неизменяемая
последовательность целых чисел, байтовые строки.
Общие свойства последовательностей
Все типы последовательностей в Python поддерживают набор универ-
сальных операций и функций, которые позволяют выполнять различные ма-
нипуляции с элементами последовательностей. Данные операции и функции
являются общими для всех типов последовательностей и обеспечивают удоб-
ный и эффективный способ работы с данными. Среди основных операций
с последовательностями можно выделить следующие:
• Индексация позволяет получить доступ к отдельным элементам после-
довательности по их индексу.
• Срезы позволяют извлекать подмножества элементов из последователь-
ности, используя диапазон индексов.
• Объединение позволяет объединять две или более последовательности
в одну.
* Повторение позволяет создавать новые последовательности, состоящие
из повторяющихся элементов.
* Проверка па вхождение позволяет проверить, содержится ли элемент
в последовательности.
• Определение длины последовательности позволяет узнать количе-
ство элементов в последовательности.
* Итерация позволяет проходить по всем элементам последовательности
с помощью циклов.
* Сравнение позволяет сравнивать две последовательности на равенство
или неравенство.
* Встроенные функции min(), max(), sum() и другие позволяют вы-
полнять операции над элементами последовательности.
• Методы последовательностей позволяют выполнять различные опе-
рации над последовательностями, такие как добавление, удаление и изме-
нение элементов.
Операции с последовательностями позволяют лег ко манипулировать
данными и создавать сложные структуры. Данные операции позволяют эффек-
тивно работать с элементами последовательностей и создавать новые последо-
вательности на основе существующих. Таким образом, операции с последова-
тельностями являются важным инструментом для работы с данными в Python.
Подпоследовательности это последовательности, которые могут
быть получены из другой последовательности удалением некоторых элементов
без изменения порядка оставшихся. Например, строка "abc" является подпо-
следовательностью строки "aabbcc", так как символы ’а’, ’Ь’, ’с' встречаются
в исходной строке в том же порядке. Подпоследовательности не обязательно
идут подряд, в отличие от подстрок.
Частичные подпоследовательности (например, с равномерным шагом)
можно извлечь с помощью срезов (sequence[start:end:step]), но не все под-
последовательности могут быть получены таким способом. Для произвольных
подпоследовательностей требуется использовать другие методы, например ге-
нераторы пли циклы.
Префикс это начальная часть последовательности, которая полно-
стью совпадает с началом другой последовательности. Например, строка "abc"
является префиксом строки "abedef".
2.4.1. Индексация последовательностей
Индекс — это целое число, которое указывает па позицию элемента в по-
следовательности. Индексация (indexing) это механизм, который позволяет
обращаться к отдельным элементам последовательности по их номеру (индек-
су). Индексация осуществляется при помощи квадратных скобок [ ] и указания
индекса (номера) элемента внутри этих скобок.
Синтаксис индексации выглядит так:
Листинг 2.17: Синтаксис индексации
1 sequence[index]
где sequence -- последовательность, из которой извлекается элемент, a index
индекс элемента в данной последовательности.
Индексация может быть положительной или отрицательной. Положи-
тельный индекс указывает на позицию элемента с начала последовательности,
а отрицательный с конца. Положительная индексация начинается с нуля, то
есть первый элемент последовательности имеет индекс 0. второй — индекс 1,
и так далее. Отрицательная индексация начинается с конца последовательно-
сти, то есть последний элемент последовательности имеет индекс -1, предпо-
следний индекс -2, и так далее. Если индекс выходит за пределы последова-
тельности. то возникает ошибка IndexError.
2.4.2, Срезы последовательностей
Срез (slising) последовательности — это механизм, который позволяет
выбирать определенную часть последовательности. Срезы формируются с ис-
пользованием квадратных скобок [ ], внутри которых через двоеточие : ука-
зываются параметры среза. Синтаксис среза имеет следующий вид:
Листинг 2.18: Синтаксис среза
1 sequence[start:stop;step]
где
• sequence — последовательность, из которой будет извлекаться срез;
• start индекс, с которого начинается срез (включительно);
• stop — индекс, на котором заканчивается срез (не включительно);
• step — шаг среза (по умолчанию равен 1).
Если step не указан, то интерпретатор Python автоматически подставит значе-
ние 1, т. с. sequence [start: stop] эквивалентно sequence [start stop : 1].
Рассмотрим примеры использования срезов;
Листинг 2.19: Срезы последовательностей
—
1 sequence [start : stop] # Извлечение среза от start до <-»
> агор (не включая stop)
2 sequence [start : ] # Извлечение среза от start до конце-»
<—> а последовательности
з sequence [: stop] # Извлечение среза от начала последов-5
«-> вательности до stop (не включая stop)
4 sequence [:: step] # Извлечение среза от начала до кон<->
ца последовательности с шагом step
Если step отрицательный, то срез будет получен в обратном порядке.
Например, sequence [: :-1] вернет копию последовательности в обратном по-
рядке.
Если start и stop не указаны, то по умолчанию они равны 0 и длине
последовательности соответственно. Такой срез верист копию всей последова-
тельности.
Листинг 2.20: Срезы последовательностей
/-------------------------------------------------------------
1 sequence [:] # Извлечение всего среза последовательное-»
«-> сти, т.е. копии последовательности
Обратите внимание, что срезы не изменяют исходную последователь-
ность, а создают новую последовательность, содержащую элементы из указан-
ного диапазона.
• Если start больше длины последовательности, то срез будет пустым.
• Если stop меньше 0, то срез будет пустым.
• Если start и stop равны, то срез также будет пустым.
• Если start меньше 0, то срез будет начинаться с элемента, находящегося
на расстоянии start от конца последовательности.
• Если stop больше длины последовательности, то срез будет включать все
элементы до конца последовательности.
2.4.3. Сравнение последовательностей
Представим, что у нас сеть две последовательности — это могут быть,
например, два списка чисел или две строки Мы хотим узнать, какая из них
больше или меньше. Для этого в языке Python можно использовать операторы
сравнения <, >, <=, >=, == и !=. Интерпретатор Python сравнивает последова-
тельности поэлементно слева направо (лексикографический порядок), как слова
в словаре. Он последовательно проверяет элементы на одинаковых позициях до
первого неравенства. Если все элементы совпадают до конца одной из последо-
вательностей. то более короткая последовательность считается меныпей.
Выделим основные идеи сравнения последовательностей в Python:
• оператор равенства == проверяет, одинаковы ли две последовательности
по длине и по каждому элементу на своем месте;
• оператор неравенства != проверяет, не равны ли две последовательности
по длине или хотя бы одному элементу на своем месте;
• оператор меньше < проверяет, является ли первая последовательность лек-
сикографически мспыпей второй: сравнение происходит поэлементно сле-
ва направо; если одна последовательность является префиксом4 другой,
то более короткая считается мспыпей;
• оператор больше > проверяет, является ли первая последовательность лек-
сикографически большей второй: сравнение происходит поэлементно сле-
ва направо: если одна последовательность является префиксом другой, то
более длинная считается большей;
• оператор меньше или равно <= проверяет, меньше или равна ли первая
последовательность второй;
• оператор больше или равно >= проверяет, больше или равна ли первая
последовательность второй;
• оператор in проверяет, содержится ли элемент в последовательности:
'Префикс — это начальная часть последовательности, которая полностью совпадает
с началом другой последовательности.
• оператор not in проверяет, не содержится ли элемент в последовательно-
сти;
• оператор is проверяет, ссылаются ли две переменные на один и тот же
объект в памяти (не сравнивает содержимое последовательностей);
• оператор is not проверяет, не ссылаются ли две переменные на один
и тот же объект в памяти;
• нельзя сравнивать последовательности разных типов (например,
строку и список) с помощью операторов сравнения <, >. <=. >=, так как
это приведет к ошибке ТуреЕггог Для (-равнения последовательностей
разных типов можно использовать операторы == и ! =.
§ 2.5. Строки и операции со строками
Строка (str) в Python это последовательность символов, которые ис-
пользуются для хранения и обработки текстовой информации. Строки могут
содержать любые символы, включая пробелы, и могут быть пустыми. Для то-
го чтобы создать строку, необходимо заключить текст в кавычки. Это могут
быть одинарные (’), двойные (") или тройные (’ ’ ’ или " " ") кавычки. При
этом одинарные и двойные кавычки равнозначны, и их можно использовать
взаимозаменяемо. Тройные кавычки используются для создания многостроч-
ных строк. Важно помнить, что кавычки должны быть одинаковыми в начале
и в конце строки. Интерпретатор Python автоматически определяет тип str по
кавычкам.
Строки в языке Python являются неизменяемыми, это означает, что по-
сле создания строки ее содержимое не может быть изменено. Однако можно
создавать новые строки па основе существующих с помощью различных опе-
раций и методов. Значения (символы), из которых состоит строка, называются
элементами строки.
Строки можно создавать следующим образом:
Листинг 2.21: Создание строк
—
1 £ Совдание стро/и с помощью здинарных кавычек
2 stringl = ’Hello, MGIMO University1’
з # Создани' строки с помощью двойных кавычек
4 string2 = "Hell , MGIMO University!"
s # Создание многострочной строки с помощью тройных ка<->
> вычек
в string3 = """Hello,
7 MGIMO University!...
Для создания пустой строки можно использовать одинарные или двой-
ные кавычки без символов внутри них:
Листинг 2.22: Два способа создания пустой строки
i # Создание пустой строки
2 empty_string = ’’ # или empt, .string = ""
При работе с текстовыми данными часто возникает необходимость ис-
пользовать кавычки внутри строки или специальные символы. В Python можно
использовать одинарные кавычки внутри двойных кавычек и наоборот. Напри-
мер, строка "It’s a sonny day!" содержит одинарные кавычки внутри двой-
ных кавычек.
Листинг 2.23: Строки с кавычками без экранирования
stringl = "It’s a sunny day!"
string2 = ’He said, "Hello!"’
Для того чтобы создать строку с помощью одинарных кавычек, содержа-
щую одинарные кавычки, или строку с помощью двойных кавычек, содержа-
щд'ю двойные кавычки, необходимо использовать экранирование5 с помощью
обратного слеша (\).
Листинг 2.24: Создание строк с кавычками с помощью экранирования
# Создание строки с одинарными кавычками
stringl = ’ It\’s а string with single quotes! ’
# Создание string2 = строки с "Не said , двойными кавычками \"Hello!\""
При этом длина строки не изменится, и она будет равна количеству символов
в строке, включая пробелы и специальные символы. Экранирование позволяет
использовать специальные символы внутри строк, не нарушая синтаксис языка
Python.
Строки можно объединять' с помощью оператора +
Листинг 2.25: Конкатенация строк с помощью оператора +
i
2
3
4
5
stringl = ’Hello, MGIMO University!’
string2 = ’Hello, MGIMO University!’
# Объединение строк
string4 = stringl + " " + string2
print(string4) # Вывод: Hello, MGIMO University!
—* Hello, MGIMO University!
Строки можно повторять с помощью оператора ♦:
Листинг 2.26: Репликация строк (повторение строк) с помощью оператора *
/------------------------------------------------------------------\
। stringl = ’Hello, MGTMu University!’
2 # Повторение строки
Экранирование — это процесс добавления обратного слеша ( J перед специальными сим-
волами, чтобы интерпретатор Python не воспринимал их как часть синтаксиса.
''Объединение строк также называется конкатенацией строк.
'Повторение строк также называется репликацией строк.
з strings = stringl * 3
4 print(string5) # Вывих ’Hello, MGIMO
—* University!Hello, MGIMO University!Hello, MGIMO «->
«-» University ! ’
Пример выше показывает, что строка stringl была повторена 3 раза, и резуль-
тат был присвоен переменной stringb При этом длина строки stringb будет
равна длине строки stringl, умноженной на 3.
Для получения элемента строки используется положительный или от-
рицательный индекс. Например, строка ’Кафедра’ состоит из 7 символов,
и каждый символ имеет свой индекс. Индексы начинаются с нуля и идут до
6, так как в строке 7 символов. Отрицательные индексы начинаются с -1 и
идут до -7, так как последний символ имеет индекс -1, а первый — индекс -7.
Запишем каждый элемент строки ’Кафедра’ в отдельной ячейке таблицы 2.7
и указажем для каждого элемента его положительный и отрицательный индекс.
Таблица 2.7: Индексы строки 'Кафедра'
Строка К а Ф е Д Р а
Полож ителъпые индексы 0 1 2 3 4 5 б
Отрицательные индексы -7 -6 -5 -4 -3 -2 -1
Рассмотрим примеры получения элемента строки по положительному
индексу:
Листинг 2.27: Положительные индексы строки ’Кафедра’
1
2
3
4
5
6
7
8
9
stringl = ’Кафедра’
й Индексация строки
string2 = string! [Oj #
string3 = stringl [1] #
string4 = stringl [2]
stringb = stringl [3] #
string6 = stringl [4] tf
string? = stringl [5]
strings = stringl [6J #
’К’ (первый символ строки)
’а’ (второй символ строки)
’ф’ (третий символ строки)
’е’ (четвертый символ строки)
’д’ (пятый символ строки)
’р’ (шестой символ строки)
’а’ (седьмой символ строки)
Листинг 2.28: Получение элемента строки но положительному индексу
—
1 stringl = ’Hello, MGTMO University!’
2 it Индексация строк
з string2 = stringl [О] # ’H’ (пер ый символ строки
Рассмотрим примеры получения элемента строки но отрицательному ин-
дексу:
Листинг 2.29: Получение элемента строки ио отрицательному индексу
1 stringl = ’Hello, MGTMO University!’
2 г Индексация строк
з string2 = stringl [-1] с ’!’ последний символ стр>к<—'
W и)
Листинг 2.30: Отрицательные индексы строки 'Кафедра’
1 stringl = ’Кафедра’
2 # Индексация строки string2 = stringl [-1] s ’a’ (последний символ строки
«-»• и) । string3 = stringl [-2] ’p> (предпоследний символ с<—»
<—> троки) s string4 = stringl[-3] # ’Д’ (третий с конца символ <—»
—> строки) stringb = stringl [-4] # ’e’ (четвертый с конца симв<-*
ол строки) т string6 = stringl [-5] # ’ф ’ (пятый с конца симв л с<—>
w троки) string? = stringl[-6] # ’ a ’ (шестой с конца символ
—» строки) 9 string8 = stringl[-7] # ’K’ (седьмой с конца символе-*
w строки)
Листинг 2.31: Выход за пределы строки
—
1 stringl = ’Hello, MGIMO University!’
2 # Индексации строк
з strings = stringl [31] # IndexError string i nd ix <—>
out of range
Для получения подстроки используется срезы. Срезы позволяют полу-
чить часть строки, указав начальный и конечный индексы.
Листинг 2.32: Получение подстроки с помощью среза строки
1 stringl = ’Hello, MGIMO University!’
2 # Срезы строк
з strings = stringl [0:5] # ’Hello’ (первые пять символ—>
> лов )
.1 string9 = stringl [7:] # ’MGIMO University!’ (все си<-^
—> мволы начиная с седьмого!
Подстрока это последовательность символов, которая идет под-
ряд внутри другой строки и сохраняет порядок элементов. Например, строка
’Hello ’ является подстрокой строки ’Hello, MGIMO University! ', так как она
идет подряд и сохраняет порядок символов.
Срезы строк
Для получения подпоследовательности символов в строке с некоторой
периодичностью используется шаг среза. Шаг среза указывается после второго
двоеточия. Например, срез stringl [0:10:2] верист строку ’Hlo о1 ’, гак как
шаг среза равен 2. и символы берутся через один.
Листинг 2.33: Получение подпоследовательности с помощью шага среза
—
t stringl = ’Hello, MGIMO University!’
2 # Срезы строк
strings = stringl [0:JO 21
символ от 0 до 1С)
string9 = stringl [: : 2] #
«-> торой символ от начала
# ’Hlo ol’ (каждый второй^—'
’Hlo.MGI nvrsty’ (каждый в<—'
до конца)
Если шаг среза нс указан, то по умолчанию он равен 1. Например, срез
stringl [0:9] вернет строку ’Hello, MG’, так как он извлекает символы от
0 до 9 (не включая 9) с шагом 1. Если шаг среза равен -1, то строка читается
справа палево.
Листинг 2.34: Получение строки в обратном порядке с помощью шага среза
1 stringl = ’Hello, MGIMO University!’
2 # Срез строки в обратном порядке
з string2 = stringl 1] * ’’ytisrevinU OMIG ,olleH’
Рассмотрим строку ’Hello, MGIMO University!’ и разберем, как извле-
кать подстроки с помощью срезов с отрицательным шагом, отличным от -1.
Например, установим шаг среза равным -2.
Листинг 2.35: Получение подпоследовательности с помощью отрицательного
шага среза
—
1 stringl = ’Hello, MGIMO University!’
2 # Срез строки с отрицательным шагом
з string2 = stringl [::-2] # ’!tseiUOIM , lr ’
Срез stringl [:: -2] возвращает строку ’ !tseiUOIM,le’, так как шаг среза ра-
вен -2, строка читается справа налево и символы берутся через один (каж-
дый второй символ), начиная с последнего символа. Аналогично рабост срез
с отрицательным шагом —п, отличным от -1. Строка читается справа налево,
и берется каждый n-й символ в строке, начиная с последнего символа.
Сравнение строк
Применение операторов сравнения к строкам позволяет сравнивать стро-
ки между собой. Операторы сравнения ==, !=, <, >, <=, >= возвращают логиче-
ское (булево) значение (True или False) в зависимости от результата сравне-
ния. При этом строки в языке Python сравниваются лексикографически, то
есть посимвольно в алфавитном порядке, начиная с первого символа. Напри-
мер. строка ’Hello’ меньше строки ’World’, так как буква Н меньше'' буквы W
в алфавите.
• Если символы совпадают, то сравниваются следующие символы.
• Если символы нс совпадают, то строки сравниваются по значению символа
в алфавите.
• Если символ первой строки меньше символа второй строки, то первая
строка меньше второй.
• Если символ первой строки больше символа второй строки, то первая
строка больше второй.
• Если все символы совпадают, то строки считаются равными.
Листинг 2.36: Сравнение строк с помощью операторов сравнения
1
2
3
4
О
6
stringl = ’Hello ,
string2 = ’Hello ,
string3 = ’Hello,
# Сравнение строк
resulrl = stringl
result2 = stringl
ы)
results = stringl
—» ше строки 3 )
MGIMO University!’
MGIMO University!’
MGIMO ! ’
== string2
!= strings
< strings
# True (строки равны)
# True (строки не равнН
# False (строка 1 больн
TJ алфавите английского языка буква Н находится перед буквой W. Буква Н имеет поряд-
ковый номер 8, а буква W имеет порядковый помер 23. Таким образом, буква Н меньше буквы
W.
Выясним, является ли одна строка подстрокой другой. Для проверки на
вхождение одной строки в другую можно использовать операторы in и not in.
Данные операторы позволяют определить, содержится ли одна строка внутри
другой. Например, можно проверить, содержится ли строка ’MGIN0’ в строке
’Hello, MGIMO University!’,
Листинг 2.37: Проверка на вхождение строки в другую строку
i
2
3
4
5
stringl = ’Hello, MGIMO University1’
string2 = ’MGIMO’
# Проверка на вхождение
result! = string2 in stringl # True (строка 2 содер^—•
жится в строке 1)
result2 = ’World’ not in stringl ff True (строка ’«-»
•—> World’ не содержится в строке 1)
Рассмотрим основные методы строк в языке программирования Python,
которые позволяют выполнять различные операции над ними.
Методы строк в Python предоставляют широкий набор возможностей
для работы со строками. Опп позволяют изменять регистр символов, удалять
пробелы, заменять подстроки и выполнять другие полезные операции. Методы
строк вызываются с использованием точки (точечной нотации) после име-
ни строки, за которой следует имя метода и, при необходимости, аргументы
метода.
В таблице 2.8 представлены наиболее часто используемые методы строк
в Python, отсортированные ио алфавиту.
Таблица 2.8: Основные методы строк в Python
Метод Описание
capitalized Преобразует первую букву в верхний ре- гистр. остальные в нижний.
casefold() Полностью переводит строку в нижний ре- гистр (более агрессивен, чем lower()).
Метод Описание
center(width[, fillchar]) Выравнивает по центру в поле ширины width, заполняя символом fillchar.
count(sub[, start[, end]]) Подсчитывает число вхождений подстро- ки sub в указанном диапазоне.
encode(encoding[, errors]) Кодирует строку в байты согласно указан- ной кодировке.
endswith(suffix[, start end]]) Проверяет, закапчивается ли строка на suffix.
expandtabs(tabsize) Заменяет символ табуляции \t пробелами (по умолчанию 8).
find(sub[, start[, end]]) Возвращает наименьший индекс, по ко- торому обнаруживается начало подстроки sub в исходной. Если подстрока не найде- на, то возвращает -1
iormat(*args, **kwargs) Форматирует строку по шаблону с позици- онными и именованными аргументами.
index(sub[, start[, end]]) Возвращает наименьший индекс, по ко- торому обнаруживается начало указанной подстроки в исходной. Если подстрока не найдена, то выбрасывается исключение ValueError.
isalnumO Проверяет, состоит ли строка только из букв и цифр.
isalphaO Проверяет, состоит ли строка только из букв.
lsdecimalO Проверяет, состоит ли строка только из де- сятичных цифр.
isdigitO Проверяет, состоит ли строка только из цифр (включая надстрочные и т. п.).
isidentifier() Возвращает значение True или False, ука- зывающее на то, является ли строка иден- тификатором в Python.
Метод Описание
islowerO Проверяет, все ли буквы в строке в ниж- нем регистре.
isnumericO Проверяет, состоит ли строка только из числовых символов.
isprintableO Проверяет, все ли символы в строке печат- ные.
isspaceO Проверяет, состоит ли (трока только из пробельных символов.
istitle() Возвращает значение True пли False, ука- зывающее на то, начинается ли каждое из «слов» строки с заглавной буквы.
isupper() Проверяет, все ли буквы в строке в верх- нем регистре.
join(iterable) Объединяет элементы iterable, вставляя между ними эту строку.
Ijust(width[, fillchar]) Выравнивает по левому краю в поле ши- рины width, заполняя fillchar
lower() Переводит все символы в нижний регистр.
lstnp( [chars]) Удаляет ведущие символы из множества chars (по умолчанию пробелы).
maketrams(x[, y[, z]]) Создаст таблицу переводов для метода translateO
partition(sep) Разбивает строку по первому вхождению sep на кортеж из трех частей.
replacefold, new[, count]) Возвращает копню строки, в которой заме- нены все вхождения строки old на строку new. при этом замены происходят не более чем count раз, если указано.
rfind(sub[, start[, end]]) Как f ind(), но ищет справа налево.
nndex(sub[, start [, end]]) Как indexO, но справа налево.
rjust(width[, fillchar]) Выравнивает по правому краю в поле ши- рины width, заполняя fillchar
Метод Описание
rpartition(sep) Разбивает строку но последнему вхожде- нию sep
rsplit(sep=None[, maxsplit]) Разбивает строку справа по sep
rstrip([chars]) Удаляет завершающие символы из множе- ства chars (но умолчанию пробелы).
split(sep=None[, maxsplit]) Разбивает строку па части, используя раз- делитель sep (по умолчанию ио пробе- лам), и возвращает эти части списком.
splitlines([keepends]) Разбивает строку па множество строк, воз- вращая их списком.
startswith(prefix[, start[, end]]) Проверяет, начинается ли строка с prefix.
stnp( [chars]) Удаляет ведущие и завершающие символы из множества chars (по умолчанию пробе- лы).
swapcase 0 Меняет регистр каждого символа на про- тивоположный.
titleO Возвращает копию строки, в которой каж- дое повое слово начинается с заглавной буквы и продолжается строчными.
translate(table) Заменяет символы согласно таблице, полу- ченной из maketransO.
upper() Переводит все символы в верхний регистр.
zfill(width) Дополняет строку слева нулями до длины width.
Данная таблица охватывает большинство встроенных методов строк
в Python, которые часто используются в повседневной практике программи-
рования. При необходимости вы можете обратиться к официальной документа-
ции для более углубленного изучения: https://docs.python org/З/library/
stdtypes.htmlrtstring methods.
Если вам нужно выполнить более сложные операции со строками, вы
можете комбинировать эти методы или использовать регулярные выражения
из модуля ге
Рассмотрим несколько примеров использования методов строк в Python.
Найдем индекс элемента ’№ строки ’Hello, MGIMC University!’ с по-
мощью метода index О.
Листинг 2.38: Поиск индекса элемента с помощью index О
✓------------------------------------------------------
1 # Задаем строку
з stringl = ’Hello, MGIMO University!’
з # Находим индекс
4 index = stringl.index(’М’)
s print(index) # Вывод 7
Найдем индекс первого вхождения подстроки ’MGIMO’ в строке ’Hello,
MGIMO University! ’ с помощью метода f ind().
Листинг 2.39: Поиск подстроки с помощью f ind()
z
i # Задаем строку
2 stringl = ’Hello, MGIMO University!’
з index = stringl.find(’MGIMC’) « 7
4 print (index) *1 oj 7
Преобразует все символы строки ’Hello, MGIMO University!’ в заглав-
ные буквы с помощью метода upper О.
Листинг 2.40: Преобразование регистра строки с помощью upper ()
—
1 » Задаем строку
2 stringl = ’Hello, MGIMO University1’
з # Преобразуем строку в верхний регистр
4 string2 = stringl.upper()
s print(string2) # Вывод: HELLO, MGIMO UNIVERSITY!
Удалим липшие пробелы в начале и конце строки ’ Hello, MGIMO
University! ’ с помощью метода strip О.
Листинг 2.41: Удаление пробелов в начале и конце строки с помощью strip О
—
1 # Задаем строку
2 stringl = ’ Hello, MGIMO University! ’
з # Удаляем лишние пробелы
j string2 = srringl .srrip ()
a print(string2) # Вы од Hello, MGIMO University'
Заменим все вхождения подстроки ’MGIMO’ на ’MGIMC University’
в строке ’Hello, MGIMO! ’ с помощью метода replaced
Листинг 2.42: Замена подстроки с помощью replaced
i
2
3
4
5
# Задаем строку
string! = ’Hello , MGIMO! ’
# Заменяем подстроку
string2 = stringl.replace(’MGIMO’ , ’MGIMO University’)
print(string2) # Вывод: Hello, MGIMO University!
Метод split О разбивает строку на части но указанному разделителю
п возвращает список этих частей. Например, можно разделить строку' ’Hello,
MGIMO University! ’ на слова, используя пробел в качестве разделителя.
Листинг 2.43: Разделение строки на части с помощью split О
—
1 » Задаем строку
2 string! = ’Hello, MGIMO University1’
з # Разделяем строку на подстроки (части)
4 parts = stringl.split(’ ’)
s print (parts) # Вывод: [’Hello,*, ’MGIMO’, ’
University ! ’ ]
Метод join О объединяет элементы списка в строку, используя указанную стро-
ку в качестве разделителя. Например, можно объединить слова из списка"
[’Hello,’, ’MGIMO’, ’University!’] в строку, используя пробел в качестве
разделителя.
Листинг 2.44: Объединение строк
1 # Задаем список
a stringl = [’Hello,’, ’MGIMC?’, ’University1’]
з я Объединяем список строк в эдну строку
4 string2 = ’ ’.join(stringl)
a print(string2) # Вывод: Hello, MGIMO University!
Разделим строку ’Hello, MGIMO University!’ на части по запятой
и пробелу с помощью метода split О и объединим их обратно с другим разде-
лителем с помощью метода join().
Листинг 2.45: Разделение и объединение строк
Z
1 # Задаем строку
2 string] = ’Hello, MGIMO University1’
з » Разделяем строку на части
4 parts = stringl . split (’, ’) [’Hello*, ’MGIMO
4- University!’]
5 # Объединяем части обратно в строку с другим разделив
телем
с new_string = ’ - ’.join(parts)
? print(new_string) # Вывод: ’Hello
'Подробнее о списках можно узнать в параграфе §2.7..
С помощью метода count О можно подсчитать количество вхождений
подстроки в строке. Например, можно подсчитать количество вхождений буквы
’о’ в строке ’Hello, MGIMO University!’.
Листинг 2.46: Подсчет вхождений подстроки в строке с помощью count ()
1 # Задаем строку
a string] = ’Hello, MGIMU University!’
з # Подсчет количества вхождений буквы ’о’
4 count = stringl.count(’о ’ )
5 print (count) # Вывод,- 1
Обратите внимание, что при работе с методом count () регистр симво-
лов имеет значение. Например, в строке ’Hello, MGIMO University!’ буква
’о’ встречается 1 раз, а буква ’R’ не встречается вовсе. Поэтому при под-
счете вхождений буквы ’R’ в строке ’Hello, MGIMO University! ’ данный ме-
тод вернет результат равный 0. Отметим, что метод count О может принимать
дополнительные аргументы, которые указывают диапазон поиска. Например,
можно подсчитать количество вхождений буквы ’о’ в строке ’Hello, MGIMU
University! ’ только в первой половине строки.
Листинг 2.47: Подсчет вхождений подстроки в строке с указанием диапазона
поиска
1 # Задаем строку
г string] = ’Hello, MGIMO University!’
з # Подсчет количества вхождений буквы ’о’ в перзой поН
' > ловине строки
4 count = stringl.count(’о’ , 0, len(stringl)//2)
s print(count) # Вы 1
Метод startswithO проверяет, начинается ли строка с указанной под-
строки. Например, можно проверить, начинается ли строка ’Hello, MGIMO
University!’ с буквы ’Н’.
Листинг 2.48: Проверка начала строки с помощью startswithO
—
1 # Задас и строку
2 stringl = ’Hello, MGIMO University1’
з » Проверка, начинается ли строка с буквы ’Н’
4 starts.with_h = stringl.startswith(’Н’) # True
s print(st arts.with.h) # Вывод: True
Метод endswithO проверяет, закапчивается ли строка указанной под-
строкой. Например, можно проверить, заканчивается ли строка ’Hello, MGIMO
University!’ символом ’!’
Листинг 2.49: Проверка конца строки с помощью endswithO
1 # Задаем строку
2 string] = ’Hello, MGIMO University!’
з # Проверка, заканчивается ли строка на ’!’
4 ends.with.exclamation = stringl.endswith(’!’) » Tru<
a print(ends.with.exclamation) i Вы c, True
Метод splitlines О разбивает строку на строки, используя символы
новой строки в качестве разделителей. Например, можно разбить многостроч-
ную строку’Hello, MGIMU University!\nWelcome to the course!’на строки
’Hello, MGIMC University!’ и ’Welcome to the course’’ с помощью метода
splitlines() В результате получается список строк, каждая из которых соот-
ветствует одной строке из исходной многострочной строки.
Листинг 2.50: Разделение многострочной строки с помощью splitlines О 1 2 з 4
1 # Задаем многострочную строку
2 stringl = ’Hello, MGIMO Uni versitу!\nWelcome to the <—
«-» course ! ’
з » Разделение многострочной строки на строки
4 lines = stringl.splitlines() ’Hellu, MGIMO <—
b-> University!’, ’Welcome to the course!’]
s print(lines) # Вывод: [’Hello, MGIMO University!’,
Welcome to the course!’]
Метод splitlines() полезен, когда нужно обработать многострочный
текст и разбить его на отдельные строки для дальнейшей обработки. Напри-
мер. можно использовать его для разбора текстовых файлов, которые содер-
жат многострочные записи. Метод splitlinesO также поддерживает пара-
метр keepends, который позволяет сохранить символы повой строки в резуль-
тате разбиения. Если параметр keepends установлен в True, то символы повой
строки будут включены в каждую строку в результате разбиения. Такой под-
ход может быть полезен, если нужно сохранить форматирование текста при
разбиении на строки. Обратим внимание, что метод splitlinesO не принима-
ет аргументы, указывающие диапазон поиска, как это делает метод count ().
Вместо этого он разбивает строку на строки по всем символам повой строки,
которые встречаются в строке.
Метод format О позволяет форматировать строки, заменяя в них спе-
циальные символы на значения переменных. Например, создадим форматиро-
ванную строку с помощью переменных name и university, используя метод
formatO.
Листинг 2.51: Форматирование строк
1 # Задаем переменные
2 name = 11 Alex"
з university = "MGIMO University"
4 # Форматирование строки
• fоrmatted_string = "Hello, {}! Welcome to H
—> {}!".format(name, university)
в print(formatted.string)
7 # Вывод: Hello, Alex! Welcome to MGIMO University!
С помощью таблицы переводов maketransO можно заменить некоторые
символы на другие символы в строке Например, можно заменить буквы 'О’
и ’i’ в строке ’Hello, MGIMO University! ’ на буквы ’0’ и ’1’ соответственно.
Метод maketrans () создает таблицу переводов, которая затем используегся для
замены символов в строке. Метод translate () применяет эту таблицу к строке.
В результате получается новая строка с замененными символами.
Листинг 2.52: Замена символов с помощью maketransO и translateO
1 » Задаем строку
2 string] = ’Hello, MGIMU University!’
з # Создание таблицы переводов
4 translation_table = str.maketrans(’Ui’, ’01’)
s # Замена символов в строке
6 translated_string =
—> stringl.translate(translation_table)
7 print (trans lated_srr 1 ng) ti Еывод Hello, MGIMO «-3
<—> University !
Обратите внимание, что метод maketransO принимает два аргумента:
первый — это строка символов, которые нужно заменить, а второй это стро-
ка символов, на которые нужно заменить. Количество символов в обеих строках
должно совпадать. Метод maketransO также может принимать третий аргу-
мент, который указывает символы, которые нужно удалить из строки. Напри-
мер, можно удалить все пробелы из строки ’Hello, MGIMO University! ’.
Листинг 2.53: Удаление символов с помощью maketransO и translate!)
i
2
3
4
5
6
7
8
# Задаем строку
stringl = ’MGIMO University!’
» Создание таблицы переводов с удалением пробелов
translation_table = str.maketrans(’’, ’ ’)
Я Замена символов в строке
transl ated_strin.g = < ’
е-> stringl . translate (translation_table)
print(translated_string)
# Вывод: MG1 MilUniversity !
Метод zf ill О дополняет строку нулями слева до указанной длины. На-
пример, можно дополнить строку ’42’ до длины 5 с помощью метода zfill().
Листинг 2.54: Дополнение строки нулями с помощью zfillO
/
1 # Задаем строку
2 stringl = ’42’
з # Дополнение строки нулями до длины 5
4 padded_string = stringl.zfi11(5) # ’00042’
s print(padded,string) # Вы.од- 00042
Метод zfillO полезен, когда нужно отформатировать числа с фикси-
рованной длиной, например для отображения номеров страниц пли иденти-
фикаторов. Он автоматически добавляет нули слева от числа, чтобы достичь
заданной длины. Если строка уже длиннее указанной длины, то метод zf ill О
по изменяет строку.
Метод swapcase () меняет регистр каждого символа на противополож-
ный. Например, можно изменить регистр строки ’Hello, MGIMO University!’
с помощью метода swapcase О.
Листинг 2.55: Замена регистра каждого символа в строке с помощью
swapcase О
f *'
1 # Задаем строку
2 stringl = ’Hello, MGIMO University!’
з # Замена регистра каждого символа
4 swapped_string = strjngl.swapcase ()
s print(swapped„string)
в # Вывод: hELLC, mgimo UNIVERSITY!
§2.6. Неизменяемая последовательность целых чисел
Тип данных range в Python это встроенный тип, который позволяет
создавать неизменяемые последовательности целых чисел в заданном диапа-
зоне без необходимости хранения всех значений в памяти. Поскольку range '
нс хранит все числа сразу, а «генерирует» их но требованию, то он позволя-
ет эффективно управлять памятью. Неизменяемые последовательности целых
чисел могут быть использованы в различных контекстах, таких как итерация
в циклах, создание списков, кортежей и других операциях.
Для создания неизменяемой последовательности целых чисел в Python
используется встроенная функция range(). На практике для удобства неизме-
няемые последовате тьиости целых чисел часто называют кратко диапазона-
ми
Основные характеристики функции range ()
• Генерация последовательности: функция range О создает последова-
тельность целых чисел в заданном диапазоне.
• Итерация функция range О часто используется в циклах for для иге-
рации по числовым диапазонам.
• Параметры: функция range О может принимать один, два или три ар-
гумента: начальное значение, конечное значение и шаг.
• И тератор: функция range О возвращает объект-итератор, который мож-
но использовать для перебора значений в цикле.
• Неизменяемость: объект, возвращаемый функцией rangeO, является
неизменяемым, что означает, что его значения не могут быть изменены
после создания.
• Экономия памяти: функция rangeO использует меньше памяти, чем
создание списка с теми же значениями, так как она генерирует значения
по мере необходимости.
Полный синтаксис функции rangeO выглядит следующих! образом:
'Он возвращает объект итератор, который генерирует значения по мере необходимости.
Листинг 2.56: Полный синтаксис функции range()
—
1 range(start, stop [, step])
где
• start (необязательный) — начальное значение последовательности (по
умолчанию 0);
• stop — конечное значение последовательности (не включается в диапа-
зон);
• step (необязательный) шаг. с которым будут генерироваться числа (но
умолчанию 1);
* start и step могут быть отрицательными, что позволяет создавать по-
следовательности в обратном порядке.
Для того чтобы создать последовательность целых чисел от (J до 9, можно
использовать функцию range() следующим образом:
Листинг 2.57: Создание последовательности от 0 до 9
----------------------------------------------------------------'
1 range(10)
2 print(range(10)) # Вы од ran; (0, 10)
Для того чтобы создать последовательность четных целых чисел от 0 до
10, можно использовать функцию range О следующим образом:
Листинг 2.58: Создание последовательности четных чисел от 0 до 10
/ '
1 range(0, 11, 2)
2 print(range(0, 11, 2)) # 1ы од range(0, 11, 2)
Для того чтобы создать последовательность нечетных целых чисел от 1
до 10, можно использовать функцию range О следующим образом:
Листинг 2.59: Создание последовательности нечетных чисел от 1 до 10
—
1 range (1 , 11, 2)
2 print(range (1 , 11, 2)) г Вывод. ran.e(l, 11, 2)
Для того чтобы создать последовательность целых чисел от 10 до 1, мож-
но использовать функцию range () следующим образом:
Листинг 2.G0: Создание последовательности от 10 до 1
Z "х
1 range (10, 0, -1)
2 print(range(10, 0, -1)) # сы ад ran е 10, 0, -1)
Для того чтобы создать последовательность целых чисел от 10 до 1
с тагом -2. можно использовать функцию range () следующим образом:
Листинг 2.61: Создание последовательности от 10 до 1 с шагом -2
Z-------------------------------------------------------------
1 range (10 , 0, -2)
2 print(range(10, 0, -2)) # -ывод- range(10, 0, -2)
Объекты типа range имеют следующие атрибуты11:
• range. start начальное значение диапазона:
• range.stop конечное значение диапазона (не включается в диапазон);
• range. step шаг, с которым будут генерироваться числа.
Например, можно получить начальное, конечное и шаговое значения диа-
пазона от 0 до 10 с шагом 2 следующим образом:
Листинг 2.62: Получение атрибутов объекта range
11В данном контексте атрибуты — это свойства объекта, доступные только для чтения.
Они хранят данные, описывающие объект, по не могут быть изменены после создания объ-
екта.
1 my.range = range(10)
2 print(my.range) # Вывод: range(0, 10)
з print(my.range start) # Б.- од- 0
4 print(my.range.stop) # ььвод. 10
5 print(my.range step) # Бь од 1
Неизменяемая последовательность целых чисел имеет только два метода:
Таблица 2.9: Основные методы типа range в Python
Метод Описание
count(value) Возвращает количество вхождений value в диапа- зоне.
index(value) Возвращает индекс первого вхождения value, гене- рирует ValueError, если не найдено.
Применив метод count () к диапазону от I) до 10, можно подсчитать ко-
личество вхождений числа 5 в этом диапазоне.
Листинг 2.63: Подсчет вхождений числа 5 в диапазоне от 0 до 10
my.range = range(10) # range (0 , 10)
print(my.range count(5)) # Вывод: 1
Метод index () возвращает индекс первого вхождения числа 5 в диапа-
зоне от 0 до 10.
Листинг 2.64: Получение индекса числа 5 в диапазоне от 0 до 10
1
2
my.range = range(10) # range(0, 10)
print(my.range.index (5)) # Вь.в«- 5
Метод index О не может принимать дополнительные аргументы. Если
вы хотите найти индекс числа, которого нет в диапазоне, метод index () вызовет
ошибку ValueError. Например, если вы попытаетесь найти индекс числа И
в диапазоне от 0 до 10, то получите ошибку:
Листинг 2.65: Ошибка при поиске индекса числа 11 в диапазоне от 0 до 10
1 my_range = range(10) # range (0, 10)
2 print (my. rang е rndex(ll)) # Вывод. ValueError 11 <-»
s—> is not in range
К объектам типа range можно обращаться по индексу, как к элемен-
там списка. Например, можно получить первый элемент диапазона от 0 до 10
следующим образом:
Листинг 2.66: Получение первого элемента диапазона от 0 до 10
i
2
my_range = range (10) # range (0, 10)
print(my.rangeГ0]) # Вывод. 0
Можно также использовать отрицательные индексы для доступа к эле-
ментам с конца диапазона. Например, можно получить последний элемент диа-
пазона от 0 до 10 следующим образом:
Листинг 2.67: Получение последнего элемента диапазона от 0 до 10
my_range = range(10) # range(0, 10)
print(my_range [-1]) ~ Выво„: 9
Использование срезов позволяет получить поддиапазон из существующе-
го диапазона. Срезы работают аналогично срезам в списках. Например, можно
получить поддиапазон от 2 до 5 из диапазона от 0 до 10 следующим образом:
Л нети hi 2.68: Получение поддиапазона от 2 до 5 из диапазона от 0 до 10
i
2
my_range = range (10) it г ..nge (0 , 10)
pr int (my_range [2 : 6j ) # Вк ч.д ran (2, 6)
Поскольку объекты типа range являются неизменяемыми структурами
данных, то любая попытка присвоить значение элементу диапазона, приведет
к ошибке ТуреЕггог Это гарантирует, что ваши расчеты всегда будут выпол-
няться над тем же набором чисел, без риска их случайного изменения. Такой
подход особенно полезен при многократных итерациях и в задачах, где важно
контролировать порядок и шаг перебора.
Проверка принадлежности числа к диапазону осуществляется с помо-
щью оператора in. Например, можно проверить, принадлежит ли число 5 диа-
пазону от 0 до 10, следующим образом:
Листинг 2.69: Проверка принадлежности числа к диапазону от 0 до 10
i my.range = range(10) 3 range(0, 10)
2 print (5 in my_range) 1 Вы од Tru<-
з print(11 in my_range) # Вывод: Falsi
Также можно использовать оператор not in для проверки отсутствия числа
в диапазоне. Например, можно проверить, отсутствует ли число 11 в диапазоне
от 0 до 10, следующим образом:
Листинг 2.70: Проверка отсутствия числа в диапазоне от 0 до 10
1 my_range = range(10) # range(0, 10)
2 print (11 not in my_range) # Вывод True
з print(5 not in my_range) зо F< Ise
§ 2.7. Списки и операции со списками
Список (list) в Python это упорядоченная изменяемая последователь-
ность (коллекция) элементов, которая может хранить элементы разных типов.
Элементы списка это объекты, которые хранятся в списке. Элементы спис-
ка могут быть любого типа, включая другие списки. Доступ к ним осуществ-
ляется через индексы, нумерация которых, аналогично строкам, начинается
с нуля. Также поддерживаются отрицательные индексы для обращения к эле-
ментам с конца списка.
Перечислим основные характеристики списков
• Изменяемость списки можно редактировать после создания, добавляя,
удаляя или изменяя элементы.
• Упорядоченность: элементы в списке имеют фиксированный порядок
(индекс), который сохраняется при добавлении и удалении элементов.
• Гетерогенность (неоднородность): список может содержать элементы
разных типов.
• Динамический размер: список автоматически увеличивает свою длину
при добавлении новых элементов.
Списки создаются с помощью квадратных скобок [ ] или функции
list(). Они могут быть пустыми и могут содержать любые объекты.
Для создания пустого списка можно использовать пустые квадратные
скобки или функцию list()
Листинг 2.71: Создание пустого списка двумя способами
1 # Создание пустого списка с
«-> к
1 empty.listl = [] #
з print(empty_list1) я 1ывод
4 # Создание пустого списка с
s empty_1ist2 = listf)
с print(empty_list2) » Вывод
помощью квадратных скобок—
[]
помощью функции list
[]
Для того, чтобы создать список, содержащий элементы, нужно перечис-
лить его элементы в квадратных скобках, разделяя их запятыми. Например,
можно создать список из чисел от 1 до 5 следующим образом:
Листинг 2.72: Создание списка с элементами
1
2
3
в Создание списка с элементами
my_list = [1, 2, 3, 4, 5]
print(my_list) # Вывод: [1, 2, 3, 4, 5]
пли использовать функцию list О для создания списка из другого итериру-
емого объекта, например из неизменяемой последовательности целых чисел,
созданной с помощью функции range О
Листинг 2.73: Создание списка из неизменяемой последовательноетп с помощью
функции 11 st О
i
2
3
# Создание списка с элементами с помощью функции «—>
list ()
my_list = list(range (1, 6))
print(my_list) # Вывод: [1, 2, 3, 4, 5]
Для создания смешанного списка, содержащего элементы разных типов,
нужно перечислить их в квадратных скобках, разделяя запятыми.
Листинг 2.74: Создание списка с элементами разных типов
1 # Создание списка с элементами разных типе в
2 mixed_list = [1, 2 5, "Hello", True, [1, 2, 3]]
з print(mixed_list)
4 # Вывод: [1, 2.5, "Hello", True, [1, 2, 3]]
Способность списков содержать другие списки в качестве элементов поз-
воляет создавать вложенные структуры данных. Например, можно создать спи-
сок, содержащий другие списки, следующим образом:
Лисипп 2.75: Создание вложенного списка
1 # Создание вложенного списка
2 nested.list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
з print(nested_lisr)
4 # Знвод: [LI, 2, 3] , L4, 5, 6], [7, 8, 9] J
I J
Отметим, что вложенность списков в Python не ограничена одним уров-
нем. Вы можете создавать списки, содержащие другие списки, которые, в свою
очередь, могут содержать еще списки, и так далее. Такой подход позволяет
использовать вложенные списки для представления данных, которые имеют
многомерную структуру. Опи позволяют организовывать данные в виде таб-
лиц, где каждый вложенный список представляет собой строку или столбец
такой таблицы, узел дерева или вершину графа. Вложенные списки также мо-
гут быть использованы для представления данных, которые имеют иерархиче-
скую структуру, такую как каталоги файловой системы или организационные
структуры компаний.
Создадим, например, список, представляющий таблицу с данными о сту-
дентах.
Листинг 2.76: Создание таблицы с данными о студентах с помощью вложенных
списков
/
1 » Создание таблицы с данными о студентах с помощью ве->
ложенных списков
з students = [["Alice", 20, "Math"], ["Bob", 22, >
Physics"], ["Charlie", 21, "Chemistry"]]
з print(students)
4 # Вывод: [[’Alice’, 20, ’Math’], [’Bob’, 22, ’<-">
t—> Physics’], [’Charlie’, 21, ’Chemistry’]]
В этом примере каждый вложенный список содержит информацию о сту-
денте имя, возраст и специальность. Такой подход позволяет легко добавлять,
удалять и изменясь данные о студентах, а также выполнять операции над ними,
такие как сортировка или фильтрация.
Также можно создать список, представляющий дерево с корневым узлом
и двумя дочерними узлами следующим образом:
Листинг 2.77: Создание дерева с помощью вложенных списков
1 # Создание дерева с помощью вложенных списког
1 tree = ["Root", [“Childl", [" Grandchi Id1 " ,
Grandchild2 " ]] , ["Child2 " ]]
з print(tree)
4 # Вывод: [’Root’, [’Childl’, [’Grandchi Id 1’, ’
w Grandchild2 ’]] , [’Child2’]]
В этом примере корневой узел содержит два дочерних узла, один из ко-
торых имеет своих собственных дочерних узлов.
Отметим, что применение вложенных списков имеет свои преимущества
и недостатки. Преимущества включают гибкость и возможность создания слож-
ных структур данных. Однако, недостатки могут включать сложность управ-
ления и обработки таких структур, а также возможные проблемы с производи-
тельностью при работе с большими объемами данных.
Списки в Python поддерживают множество операций, которые позволя-
ют работать с их элементами. Основные операции со списками включают:
• добавление элементов в список;
• удаление элементов;
• изменение элементов;
• извлечение элементов;
• копирование списков;
• объединение списков:
• поиск элементов в списке.
Для выполнения указанных операций со списками в Python можно ис-
пользовать методы списков, встроенные функции и операторы. Методы списков
и функции могут выполнять схожие задачи, но методы списков и функции раз-
личаются по синтаксису вызова. Методы списков вызываются с использовани-
ем точки (точечной нотации) и применяются к объектам списка, а функции
принимают список в качестве аргумента. Основные методы списков в Python
представлены в таблице 2.10.
Таблица 2.10: Основные методы списков в Python
Метод Описание
append(х) Добавляет элемент x в конец списка.
extend(iterable) Расширяет список, добавляя все элементы из iterable
insert(i, x) Вставляет' элемент х па позицию i.
remove(x) Удаляет первое вхождение элемента х Вы зыва- ет ValueError, если х нет в списке.
popt [1] ) Удаляет и возвращает элемент по индексу i (по умолчанию последний).
clearO Удаляет все элементы списка.
index(x[, start[, end]]) Возвращает индекс первого вхождения х в пре- делах [start, end).
count(x) Возвращает количество вхождений элемента х в списке.
sort(key=None, reverse=False) Сортирует список на месте. Параметр key зада- ст функцию для сравнения, reverse — порядок обратный.
reverseO Разворачивает элементы списка па место.
copy() Возвращает поверхностную копию списка.
Рассмотрим основные операции со списками на примере. При работе с ме-
тодами списков важно учитывать, что они изменяют исходный список на месте,
а не создают новый список. Такое поведение позволяет эффективно управлять
памятью и избегать излишних затрат на создание новых объектов. Например,
создадим список с элементами от 1 до 5. а затем добавим в него элемент 6
с помощью метода append().
Листинг 2.78: Добавление элемента в конец списка
-------------------------------—-------—---
1 # Создание списка с элементами от 1 до 5
2 my_list = [1, 2, 3, 4, 5]
з # Добавление элемента 6 в конец списка
4 шу_1ist.append(6)
s print(шу_1ist)
е # ывод: [1 , 2, 3, 4, 5, 6]
Метод appendO добавляет указанный элемент в конец списка, увеличивая его
длину на 1. Если список изначально пустой, го после вызова метода append О
он будет содержать только добавленный элемент.
Если нам необходимо добавить несколько элементов в список, то можно
использовать метод extend О. Например, добавим элементы 7 и 8 в конец списка
my.list с помощью метода extendO
Листинг 2.79: Добавление нескольких элементов в конец списка
/--------------------------------------------------------
1 » Создание списка с элементами от 1 до 6
2 my_list = [1, 2, 3, 4, 5, 6J
з # Добавление элементов 7 и 8 в конец списка
4 my_list.extend( [7 , 8])
з print(my_list) ff Б . >д: 1, 2, 3, 4, 5, 6, 7, 8]
В данном примере метод extendO принимает в качестве аргумента список (в
общем случае, любой итерируемый объект) и добавляет все его элементы в ко-
нец списка my_l 1st. Таким образом, длина списка увеличивается па количество
добавленных элементов. Важно помнить, что метод extendO не добавляет
сам список как один элемент, а добавляет его элементы по отдель-
ности. Отметим, что в данном примере мы работаем с двумя списками и в
результате получаем один список, который является объединением двух исход-
ных списков. Похожее поведение можно наблюдать при использовании опера-
тора + для объединения списков. При этом создается новый список, а исход-
ные списки остаются неизменными. Например, объединение списков [1, 2, 3]
и [4, 5, 6] с помощью оператора + даст результат [1, 2, 3, 4, 5, 6],ноис-
ходные списки останутся неизменными. Такое поведение отличается от метода
extendO, который изменяет исходный список на месте, из-за чего он является
более эффективным с точки зрения использования памяти.
Применение оператора * к списку позволяет создать новый список, ко-
торый состоит из повторений исходного списка. Например, умножение списка
[1, 2, 3] па 3 даст результат [1, 2, 3, 1, 2, 3, 1, 2, 3]
Листинг 2.80: Умножение списка на число
1 # Создание списка с элементами от 1 до 3
2 my_list = [1 , 2 , 3]
з # Псзторевие списка 3 раза
4 my_list = my_list * 3 # Умноуониг- с иска на 3
5 print(my_list) # Вывод: [1 , 2, 3, 1, 2, 3, 1, 2, 3J
Такое поведение оператора * позволяет легко создавать списки, состоящие из
повторений одного и того же элемента или группы элементов. Например, умно-
жение списка [0] па 10 даст результат [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
При работе со списками часто возникает необходимость замены элемен-
тов или вставки элементов на определенные позиции в списке. Для этого можно
использовать метод insert() Вставка элемента на некоторую позицию означа-
ет, что элемент будет вставлен перед элементом, который изначально находился
на этой позиции, а все последующие элементы будут сдвинуты па одну пози-
цию вправо. Например, вставим в список my_list с помощью метода insert ()
элемент 10 на позицию 2 (т. е. па третье место в списке).
Листинг 2.81: Вставка элемента на позицию 2
1 р Список с элементами от 1 д< б
2 my_ljst = [1 , 2, 3, 4, 5, 6]
з # Вставка элемента 10 на позицию 2
4 my_list.insert(2, 10)
s print(my_list) И Вывод: [1, 2, 10, 3, 4, 5, 6]
Для изменения элемента на некоторой позиции можно использовать опе-
ратор присваивания. Например, заменим элемент на позиции 2 (т. е. третий
элемент) в списке my_list на 10.
Листинг 2.82: Замена элемента на позиции 2
1 my_list = Cl, 2, 3, 4, 5, 6]
2 # Замена элемента на позиции 2 на 10
з my.list[2] = 10
4 print (my_list) Я Вьвод: 1, 2, 10, , 5, 6]
Если необходимо удалить элемент из списка, то можно использовать ме-
тод remove() Например, удалим элемент 10 из списка my_last с помощью ме-
тода remove()
Листинг 2.83: Удаление элемента из списка
-------------------------------------------------
1 my.list = [1, 2, 10, 3, 4, 5, 6]
2 # Удаление элемента 10 из списка
з my.list.remove (10)
4 print(my.list) # Bh.bojc 1, 2, 3, 4, 5, 6]
Если данный элемент отсутствует в списке, то метод remove О вызовет исклю-
чение ValueError. Если список содержит несколько одинаковых элементов, то
метод remove О удалит только первый из них. Для удаления всех вхождений од-
ного и того же элемента из списка можно использовать циклы или генераторы
списков. Подробное об этом будет рассказано в параграфах §3.2. и §3.5..
Если необходимо удалить элемент по индексу, то можно использовать
метод pop О Например, удалим элемент с индексом 3 из списка my_list с по-
мощью метода pop О
Листинг 2.84: Удаление элемента ио индексу
1 my.list = [1, 2, 3, 4, 5, 6J
2 # Удаление элемента с индексом 3 из списка
з my _1ist.pop(3)
4 print(ту_1зst) й Выво“ [t, 2, 3, 5, 6]
При этом метод рор() возвращает удаленный элемент. Для этого нужно при-
своить результат выполнения метода переменной. Например, удалим элемент
с индексом 3 из списка my.lisc и присвоим его переменной removed_element.
Листинг 2.85: Удаление элемента по индексу и присвоение его переменной
i
2
3
4
5
6
my.list = [1, 2, 3, 4, 5, 6]
# Удаление элемента с индексом 3 из списка
# и присвоение его переменной
removed_element = my_list pop(3)
print(my_list) - Вынод . [1, 2, 3, 5,
print(removed.element) # Вывод. 4
Если необходимо удалить последний элемент списка, то можно не ука-
зывать индекс. Если указанный индекс выходит за пределы списка, то метод
pop О вызовет исключение TndexError.
Если необходимо очистить список, то можно использовать метод
clear (). Например, очистим список my_list с помощью метода clear О.
Листинг 2.86: Очистка списка
1 my.list = [1, 2, 3, 4, 5, 6]
г » Очистка списка
з my_list clearO
4 print(my_lзst) # Вывод- []
Для удаления элементов из списка можно использовать оператор удале-
ния del. Например, удалим элемент с индексом 3 из списка my .list с помощью
оператора del.
Листинг 2.87: Удаление элемента по индексу с помощью оператора del
—
1 my_list = [1, 2, 3, 4, 5, 6]
2 # Удаление элемента с индексом 3 из списка
з del my_list[3]
4 print(my_list) # Вывод [1, 2, 3, 5, 6.
Удаление элементов из списка с помощью оператора del аналогично удалению
элементов из списка с помощью метода pop О Однако, в отличие от метода
рор(), оператор del не возвращает удаленный элемент. Также, оператор del
может использоваться для удаления элементов из других коллекций, таких как
кортежи, множества и словари. При этом оператор del может использоваться
для удаления нескольких элементов из списка, используя срез элементов. Для
этого в квадратных скобках необходимо указать срез, который включает эле-
менты для удаления из списка. Например, удалим элементы с индексами 2, 3
и 4 из списка my_list
Листинг 2.88: Удаление нескольких элементов из списка с помощью оператора
del
1 my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
2 # Удаление элементов с индексами 2, 3 и 4 из списка
з del my_list [2 5]
4 print(my_list) fl Вывод [1, 2, 6, 7, 8, 9J
Выше мы рассмотрели удаление нескольких элементов из списка. Теперь
выполним удаление всех элементов из списка.
Листинг 2.89: Очистка списка с помощью оператора del
1 my.list = LI, 2, 3, 4, 5, 6, 7, 8, 9]
2 # Очистка списка с помощью оператора del
з del my_1ist [:]
4 print(my_list) # Вывод: []
Срезы списков также могут использоваться для изменения элементов
списка. Для этого в квадратных скобках необходимо указать срез, который
включает элементы для замены, а затем присвоить этому срезу новый список.
Новый список должен содержать столько же элементов, сколько и срез, кото-
рый заменяется. Если новый список содержит больше пли меньше элементов,
чем срез, то количество элементов в списке изменится.
• Если новый список содержит больше элементов, чем срез, то элементы
будут добавлены в список.
• Если новый список содержит меньше элементов, чем срез, то элементы
будут удалены из списка.
• Если новый список содержит такое же количество элементов, как и срез,
то элементы будут заменены в списке.
Например, заменим элементы с индексами 2. 3 и 4 в списке my.list па
значения 10. 20 и 30 с помощью среза.
Листинг 2.90: Замена элементов с помощью среза
1 my.list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
2 # Замена элементов с индексами 2, 3 и 4 на значения
ч 10, 20 и 30
з my.list [2.5] = [10, 20, 30]
4 print(my.list)
з # Вывод: [1, 2, 10, 20, 30, 6, 7, 8, 9]
Поскольку количество элементов в новом списке равно количеству эле-
ментов в срезе, то элементы будут заменены в списке.
Рассмотрим пример замены элементов с индексами 2, 3 и 4 в списке
my.list на значения 10. 20. 30 и 40 с помощью среза. В этом случае новый спи-
сок содержит больше элементов, чем срез, поэтому элементы будут добавлены
в список.
Листинг 2.9Г Замена элементов с помощью среза
1 my.list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
2 it Замена элементов с индексами 2, 3 и 4 на значения <—>
М- 10, 20, 30 и 40
з my_lisr[2 5] = [10, 20, 30, 40]
4 print(my_list)
s # Вывод: [1, 2, 10, 20, 30, 40, 6, 7, 8, 9]
Рассмотрим пример замены элементов с индексами 2, 3 и 4 в списке
my_list на значения 10 и 20 с помощью среза. В этом случае новый список
содержит меньше элементов, чем срез, поэтому элементы будут удалены из
списка.
Листинг 2.92: Замена элементов с помощью среза
/----------------------------------------------------------
1 my.list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
2 # Замена элементов с индексами 2, 3 и 4 на значения
н 10 и 20
з my_list [2:5] = [10, 20]
4 print(my_list]
з # Вывод: [1, 2, 10, 20, 6, 7, 8, 9]
Для выполнения сортировки списка в Python можно использовать метод
sort(), который сортирует список па месте, то есть изменяет сам список. Метод
sortO принимает два необязательных параметра:
• key функция, которая принимает один аргумент и возвращает значение,
по которому будет производиться сортировка. По умолчанию использует-
ся функция id О, которая возвращает идентификатор объекта.
• reverse булево значение, которое указывает, должна ли сортировка
быть в обратном порядке. По умолчанию значение False
Например, отсортируем список my_list, состоящий из чисел по возрастанию.
Листинг 2.93: Сортировка списка из чисел но возрастанию
—
1 my_list = [5, 2, 9, 1, 5, 6]
2 my_list.sort() % Сортиро га по возрастанию
з print(my_list) # Выв< " 1, 2, 5, 5, 6, 9
Для сортировки списка в обратном порядке с помощью метода sort()
нужно установить параметр reverse в значение True
Листинг 2.94: Сортировка списка из чисел по убыванию
1 my_list = [5, 2, 9, 1, 5, 6]
2 my_list.sort(reverse=True) # С&рт ровка о yto а ик
з print(my_list) # Вывод [9, 6, 5, 5, 2, 1
Для более продвинутой сортировки нужно использовать параметр key
Например, можно использовать встроенную функцию или создать свою. От-
сортируем список строк по длине строки. Для этого в качестве параметра key
укажем функцию 1еп(). которая возвращает длину строки
Листинг 2.95: Сортировка списка строк по длине строки
1 my_list = ["apple", "banana", "cherry", "date"]
2 my_1ist.sort(key=len) d Сортировка по длине строк
з print(my_list)
4 # дывод: [’date’, ’apple’, ’banana’, ’cherry’]
Для написания собственной функции сортировки можно использовать оператор
lambda дня создания анонимной функции Например, отсортируем список строк
по последнему символу.
Листинг 2.96: Сортировка списка строк по последнему символу
1 nty_list = ["apple", "banana", "cherry", "date"]
2 my.list sort (key=lambda х: x[-U) # Сортировка по п<—>
«-Э оследнему символу
з print(my.list)
4 # Вывод: ['date’, ’apple’, ’banana’, ’cherry’]
Для проверки наличия или отсутствия элемента в списке можно исполь-
зовать операторы in и not in Например, проверим, есть ли в списке my.list
элементы 5 и 6.
Листинг 2.97: Проверка наличия элемента в списке
i
2
3
my.list = [1, 2, 3, 4, 5]
print(5 in my.list) # Вы од True
print (6 in my.list) # В,, од Fai
Списки в Python являются изменяемыми структурами данных, что озна-
чает, что их содержимое можно изменять после создания. Для изменения со-
держимого списка можно использовать методы и операции, которые изменяют
сам список.
Распаковка списка это процесс извлечения элементов списка в от-
дельные переменные. Распаковка списка позволяет присвоить значения элемен-
тов списка переменным, что может быть полезно для работы с элементами спис-
ка.
Лис1 инг 2.98: Распаковка списка
1
2
3
4
5
б
7
# Создание списка с элементами от 1 до 3
my.list = [1 , 2, 3]
# Распаковка списка в переменные а, b и с
а, Ь, с = my.list
print(a) # Вывод- 1
print(b) # Вывод: 2
print(с) # Вывод 3
Для распаковки списка количество переменных должно совпадать с ко-
личеством элементов в списке. Если количество переменных не совпадает с ко-
личеством элементов в списке, то будет вызвано исключение ValueError.
При этом возможна распаковка списка с помощью оператора *. Она поз-
воляет извлечь несколько элементов списка в переменные, а остальные элемен-
ты списка собрать в отдельный список. Например, распакуем список my_list
в переменные а, b и с, где переменные а и с будут содержать первый и послед-
ний элементы списка, а переменная b будет содержать список из оставшихся
элементов списка my_list.
Листинг 2.99: Распаковка списка с помощью оператора *
1
2
3
4
5
6
7
# Создание списка с элементами от 1 до 5
my_list = [1, 2, 3, 4, 5]
# Распаков ка списка с помощью оператора *
а, *Ь, с = pr int(а) my_list # Вывод: 1
print(b) # Вывод: [2, 3, 4]
print(с) # Вывод: 5
Списки можно сравнивать между собой. Сравнение списков происходит
поэлементно. Сначала сравниваются первые элементы списков, затем вторые
и так далее. Если все элементы списков равны, то списки считаются равными.
§2.8. Кортежи и операции с кортежами
Кортеж (tuple) в Python это упорядоченная неизменяемая последо-
вательность (коллекция) элементов, которая может хранить элементы разных
типов. Элементы кортежа - это объекты, которые хранятся в кортеже. Эле-
менты кортежа могут быть любого типа, включая другие кортежи. Доступ
к ним осуществляется через индексы, нумерация которых, аналогично стро-
кам. начинается с нуля. Также поддерживаются отрицательные индексы для
обращения к элементам с конца кортежа.
Перечислим основные характеристики кортежей
• Неизменяемость: после создания кортежа его содержимое не может
быть изменено. Это означает, что нельзя добавлять, удалять пли изме-
нять элементы кортежа,
• Упорядоченность: элементы кортежа имеют определенный порядок, ко-
торый сохраняется при доступе к ним.
• Гетерогенность (неоднородность): кортеж может содержать элементы
разных типов.
• Итерируемость: кортежи поддерживают итерации, что позволяет ис-
пользовать их в циклах.
• Вложенность, кортежи могут содержать другие кортежи в качестве эле-
ментов.
Кортежи используются для храпения данных, которые не должны изме-
няться.
Для создания пустого кортежа используется пара круглых скобок О или
функция tuple()
Листинг 2.100: Создание пустого кортежа двумя способами
1 # Создание пустого кортежа с помощью круглых скобок
2 empty_tuplel = О
з print ( empty_tuple 1 ) # Вывс,. ()
4 # Создание пустого кортежа с помопью функции tuple О
s empty_tuple2 = tuple О
e print(empty_tuple2) # Вь юд О
Для создания кортежа с элементами нужно перечислить их через запя-
тую.
Листинг 2.101: Создание кортежа с несколькими элементами
—
1 # Создание кортежа с несколькими элементами
2 multi_element_tuple = (1, 2, 3, 4, 5)
з print (multi_element_tuple) v вы од (1, 2, 3, , 5)
При этом для создания кортежа с помощью круглых скобок и содержаще-
го только один элемент необходимо поставить запятую после этого элемента,
так как в противном случа будет создан объект типа элемента, заключенного
в скобки.
Листинг 2.102: Создание кортежа с одним элементом
1 # Создание кортежа с одним элементом
2 single_elen:ent_tuple = (42,)
з print(single„element_tuple) 4 Вывод (42,)
Кортежи могут содержать элементы разных типов, включая другие кор-
тежи.
Листинг 2.103: Создание кортежа с элементами разных типов
—
। # Создание кортежа с элементами разных типов
2 mixed_tuple = (1, "Hello", 3.14, True, (1, 2, 3))
з print(mixed_tuplе)
4 # Вывод: (1, ’Hello’, 3.14, True, (1, 2, 3))
Можно также использовать функцию tuple О для создания кортежа из
других последовательностей, таких как строки, списки или неизменяемые по-
следовательности целых чисел.
Листинг 2.104: Создание кортежей из разных последовательностей
—
1 # Создание кортежа с числами от 1 де 10
г tupJe3 = tuple(range(1, 11))
з print(tuple3)
4 # Вывод: (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
s # Создание кортежа из строки
6
7
8
9
10
tuple4 = tuple("MGIMO")
print(tuple4) # Вывод: (’M’, ’G’, ’I’, ’H’, ’O’)
# Создание кортежа из списка
tupleS = tuple([l, 2, 3, 4, 5])
print (tupleb) # Bel 3,2 (1, 2, 3, 4, 5)
Методы кортежей в Python ограничены, так как кортежи неизменяемы
В таблице 2.11 приведены все методы кортежей.
Таблица 2.11: Методы кортежей в Python
Метод Описание
count(х) Возвращает количество вхождений элемента х в кортеже.
index(x[, startL, end]]) Возвращает индекс первого вхождения элемен- та х в диапазоне позиций [start, end); бросает ValueError, если элемент нс найден.
Хотя кортежи неизменяемы, с их помощью можно создавать новые кор-
тежи. Для этого можно объединять кортежи с помощью оператора +, повторять
элементы кортежа с помощью оператора * и создать новый кортеж из элемен-
тов другого кортежа.
Листинг 2.105: Объединение кортежей
1 # Задание кортежей
2 tuple 1 = (1, 2, 3)
з tuple2 = (4, 5, 6)
4 я Объединение кортежей
з combined_tuple = tuplel + tuple2
в print(combined_tuple) и Выгод- (1, 2, 3, 4, 5, 6)
Листиш 2.106: Пов торение кортежа
—
1 Р Повторение кортежа
2 tuple3 = (0, 1) * 4
з print(tuple3) # «з эд (0, 1, 0, 1, 0, 1, 0, 1
Листинг 2.107: Создание нового кортежа из элементов другого кортежа с помощью
среза
1 # Создание кортежа
2 tuple4 = (1, 2, 3, 4, 5)
з # Создание нового кортежа из элементов другого корте*-»
жа
4 new_tuple = tuple4[l:4] # выбираем элементы с индекс*-»
* ами 1 , 2 и 3
з print(new_tuple) # Вывод (2, 3, 4
Для создания кортежей из элементов другого кортежа можно использо-
вать преобразование типов. Например, можно создать кортеж из списка или
множества.
Листинг 2.108: Создание нового кортежа с помощью преобразования типов
1 # Создание списка
2 my_list = [1, 2, 3, 4, 5]
з # Создание нового кортежа из элементов списка
4 new_tuple = tuple Cmy_list [Д : 4J ) # с индексами 1, 2 *-»
—> и 3
з print(new_tuple) # Вывод (2, 3, 4)
Аналогично спискам, кортежи можно сравнивать. Сравнение кортежей
происходит лексикографически, то есть поочередно сравниваются соответству-
ющие элементы аналогично строкам.
Распаковка кортежей позволяет присвоить значения элементов кортежа
переменным и аналогична распаковке списка.
Листинг 2.109: Распаковка кортежа
1
2
3
4
5
6
7
4 Создание кортежа
tuplel = (1, 2, 3)
# Распаковка кортежа
а, Ь, с = tuplel
print(а) 4 Вывод 1
print(Ь) # Вывод 2
print (с) # ь'яод- 3
Также возможна распаковка кортежа с помощью оператора *, которая
имеет отличие от распаковки списка.
Листинг 2.110: Распаковка кортежа
/ 1
1 # Создание кортежа
2 tuple2 = (1, 2, 3, 4, 5)
з » Распаковка кортежа
4 а, * b, с = tuple2
s print(а) - Вывод 1
в print(b) 4 Вывод: [2, 3, 4]
? print(с) # Вывод: 3
При такой распаковке некоторые переменные принимают значения из
указанного кортежа, а остальные значения сохраняются в виде списка, но по
кортежа.
§2.9. Словари и операции со словарями
Словарь (diet) в Python представляет собой изменяемую коллекцию пар
«ключ—значение», где каждый ключ должен быть уникальным и неизменяе-
мым (строки, числа, кортежи). Словари обеспечивают быстрый доступ к зна-
чениям по ключам и являются одной из наиболее часто используемых структур
данных в Python.
Перечислим основные характеристики словарей:
• Изменяемость: словари являются изменяемыми структурами данных,
что позволяет добавлять, удалять и изменять пары «ключ-значение» по-
сле создания словаря.
• Структура «ключ-.значение»: каждый элемент словаря представляет
собой пару, состоящую из уникального ключа и соответствующего ему
значения.
• Уникальность ключей все ключи в словаре должны быть уникаль-
ными. При попытке добавить дублирующий ключ предыдущее значение
будет перезаписано.
• Требование hashable ключей ключи словаря должны быть неизме-
няемыми (hashable) объектами — числами, строками, кортежами, по по
списками или словарями.
• Упорядоченность, начиная с Python 3.7, словари сохраняют порядок
вставки элементов, что гарантирует предсказуемый порядок итерации.
• Гетерогенность значений: значения в словаре могут быть любого ти-
па числами, (троками, списками, другими словарями или любыми
Python объектами.
• Быстрый доступ; поиск значения по ключу выполняется за константное
время 0(1) в среднем случае благодаря использованию хэш-таблиц.
• Динамический размер: словари могут увеличиваться и уменьшаться
в размере во время выполнения программы,
• Итерируемость: словари поддерживают итерацию по ключам, значени-
ям пли парам «ключ значение».
• Вложенность, словари могут содержать другие словари в качестве зна-
чений, что позволяет создавать сложные иерархические структуры дан-
ных.
Словари можно создавать с помощью фигурных скобок [ } или функции
diet().
Лис тинг 2.111: Создание пустого словаря двумя способами
1 fl Создание пустого словаря с помощью фигурных скобок
2 empty ..diet 1 = {}
з print(empty.diet 1) # Вывод {}
4 H Создание пустого словаря с помощью функции
з empty_dict2 = dict()
в print(empty_dict2) » Вывод l
Для того чтобы создать словарь, который содержит элементы необходи-
мо перечислить нары «ключ значение».
Листинг 2.112: Создание непустого словаря
1
2
3
4
6
7
8
9
10
11
12
13
14
15
# Словарь с начальными данными
student = {
"паше": "Анна",
"age" 18,
"group": "1МЭ01",
"grades": [4, 5, 3, 5]
}
print(student)
fl Вывод: {’name* ’Анна’, ’age’: 18, ’group’: ’<-»
-> 1МЭ01’, ’grades’: [4, 5, 3, 5]}
# Создание через конструктор diet О
colors = diet (red="KpacHbiS" , Ь1ие="синий",
W green = "3eneHt>iii")
print(colors)
fl Вывод: {’red’: ’красный’, ’blue’: ’синий’,
green’: ’зеленый’}
fl Создание из списка кортежей
pairs = [("а", 1), ("b", 2), ("с", 3)]
16 letters = diet (pairs)
it print(1etters)
is # Вывод: {’a’: 1, ’b’: 2, »c’: 3}
Доступ к элементам словаря осуществляется по ключу, который указы-
вается в квадратных скобках. Если ключ нс существует, то будет вызвано ис-
ключение KeyError. Для безопасного доступа к элементам словаря можно ис-
пользовать метод get(), который позволяет указать значение по умолчанию,
если ключ нс найден.
Листинг 2.113: Доступ к элементам словаря по ключу
1 » Задаем словарь
2 student = {"папе": "Иван", "age" 19, "city": "Москва
-э а"}
з # Получаем значения словаря по ключу
4 name = student["пате"] # "Иван"
5 age = student . get (" age" ) » 19
e country = stud ent.get("country", "Россия") к "России
•—> я" (значение по умолчанию)
Для изменения значений в словаре можно использовать присваивание по
ключу. Если ключ уже существует, то его значение будет обновлено. Если ключ
нс существует, то будет создана новая пара «ключ значение».
Листинг 2.114: Изменение существующего значения в словаре
✓ “
1 # Задаем словарь
2 student = {"паше": "Иван", "age" 19, "city": "Москва—»
> а"}
з # Изменяем существующее значение словаря по ключу
4 student["age"] = 20
Для добавления нового элемента в словарь можно использовать присва-
ивание по новому ключу.
Листинг 2.115: Добавление нового элемента в словарь
1 # Задаем словарь
2 student = {"name": "Иван", "age"- 19, "city": "Москве-»
<—> а " }
з я Добавляем новый элемент в словарь
4 student["university"I = "МГИМО МИД России"
Словарь student теперь содержит информацию о студенте, включая его
имя, возраст, город и университет.
Для удаления элемента из словаря можно использовать оператор del
или метод рор(). Метод рор() удаляет элемент по ключу и возвращает его
значение. Если ключ нс существует, то будет вызвано исключение КеуЕггог
Листинг 2.116: Удаление элемента из словаря
i
2
3
4
# Задаем словарь
student = {"name": "Иван", "age": 19, "city": "Москва
‘э a", "university": "МГИМО МИД России"}
# Удаляем элемент из словаря по ключу
age = student . pop (" age " , None)
Словарь student теперь содержит информацию о студенте, включая его
имя, город и университет.
Отметим, что можно создавать словари с вложенными словарями в ка-
честве значения.
Листинг 2 117: Создание словаря с вложенными словарями
—
t f Создание словаря с вложенными словарями
2 university = {
"students": {
"101" : {"name" : "Анна" , "age": 20},
"102": {"name" : "Петр” , "age": 19},
"103" : {"name": "Мария", "age". 21}
},
"courses" : {
"python ": {"credits ". 4 , "semester ". 1},
" databases": {" credits": 3, "semester": 2}
}
з
4
5
6
7
8
9
10
11
12
13
14
}
print(university)
# Вывод: {’students’: {’101’: {’папе’: ’Анна’, ’ <—>
е-> age’: 20}, ’102’: {’name’: ’Петр’, ’age’ 19}, ’ r->
* --> 103’: {’name’: ’Мария’, ’age’: 21}}, ’courses’- «-»
< -> {’python’: {’credits’: 4, ’semester’: 1}, ’
«-> databases’: {’credits’: 3, ’semester’: 2}}}
Для доступа к вложенным элементам словаря university можно исполь-
зовать цепочку ключей. Для безопасного доступа к вложенным элементам мож-
но использовать метод get О
Листинг 2.118: Доступ к элементам словаря с вложенными словарями
1
2
3
4
6
# Небезопасный доступ к вложенным элементам
anna_age = uni versity L " student s "][" 101 "][" age " ] * 20
python_credits =
— > university["courses"]["python"]["credits "] » 4
# Безопасный доступ к вложенным элементам
java.credits = university.get("courses " , '
— » {}) . get ( " j ava" , {}) . get ( " credi ts " , 0)
Отметим, что для работы с вложенными словарями можно использовать
циклы и условные операторы
Для работы со словарями в Python существует множество методов, ко-
торые позволяют выполнять различные операции. В частности, можно ис-
пользовать методы для добавления, удаления и изменения элементов словаря.
В таблице 2.12 представлены основные методы работы со словарями.
Таблица 2.] 2: Методы словарей в Python
Метод Описание
clearO Удаляет все пары «ключ-значение» из словаря
сору() Возвращает неглубокую копию словаря.
fromkeys(iterable, value=None) Создает новый словарь с ключами из iterabl е и значением value для каждого ключа.
get(key[, default]) Возвращает значение ио ключу key, либо default, если ключ отсутствует.
items!) Возвращает представление (view) множестве! пар (ключ, значение)
keysO Возвращает представление (view) множества ключей.
pop(key[, default]) Удаляет ключ key и возвращает его значение; если ключ отсутствует и default по задан, ге- нерирует KeyError
popi temO Удаляет и возвращает последнюю вставленную пару (key, value); если словарь пуст, генери- рует KeyError
setdefault(key L, default]) Если ключ key есть, возвращает его значение; иначе добавляет ключ со значением default и возвращает default
update![other]) Обновляет словарь, добавляя пары из другого словаря или итерируемых пар (key, value).
valuesO Возвращает представление (view) коллекции значений.
Получим представление ключей словаря student с помощью метода
keys().
Листинг 2.119: Ключи словаря student
—
1 # задаем словарь
2 student = {’имя’: ’Мария’, ’возраст’: 22, ’курс’: 3}
з print(student.keys ())
4 # Вывод: dict_keys([’имя ’ , ’возраст’, ’курс’])
Метод keys () возвращает представление ключей словаря, которое можно ис-
пользовать для итерации по ключам. Представление ключей является динами-
ческим и обновляется при изменении словаря, имеет тип <class ’dict_keys’>
Получим представление значений словаря student с помощью метода
values()
Листинг 2.120: Значения словаря student
I # задаем словарь
2 student = {’имя’: ’.Мария’, ’возраст’: 22, ’курс’: 3}
з print (student vaiuesO)
4 # Вывод: dict_values([’Мария ’ , 22, 3])
Метод values() возвращает представление значений словаря, которое мож-
но использовать для итерации по значениям. Представление значений явля-
ется динамическим и обновляется при изменении словаря, имеет тип <class
’dict_values’>
Получим представление нар «ключ-значение» словаря student с помо-
щью метода items().
Листинг 2.121: Пары «ключ-значение» словаря student
—
1 И задаем словарь
2 student = {’имя’: ’Мария’, ’возраст’- 22, ’курс’: 3}
з print(student items ())
4 я ^ывод: dict_items( [ (’имя’, ’Мария’), (’возраст’, е-3
w 22), (’курс’ , 3)])
Метод items () возвращает представление нар «к поч-значенпе» словаря,
которое можно использовать для итерации ио элементам. Представление пар
«ключ-значение» является динамическим и обновляется при изменении слова-
ря. имеет тип <class ’dict_items’>.
Добавим пары «ключ-значение» в словарь student с помощью метода
update()
Листинг 2.122: Обновление словаря student
1 п задаем словарь
2 student = {’имя’: ’Мария’, ’возраст’. 22, ’курс’: 3}
з student.update({’город ’ : ’Москва’, ’страна’: ’Россиян—*
’})
4 print(student)
s # чвод: {’имя’: ’Мария’, ’возраст’: 22, ’курс’: 3, е->
—> ’город’: ’Москва’, ’страна’: ’Россия’}
§2.10. Множества и операции с множествами
Язык Python поддерживает две реализации объекта типа множества: из-
меняемые (set) и неизменяемые множества (frozenset).
Изменяемое множество (set) в Python представляет собой изменя-
емую коллекцию уникальных элементов без определенного порядка. Они ос-
нованы на математической концепции множеств и поддерживают все основные
операции теории множеств. Множества обеспечивают быстрый поиск элементов
и автоматически исключают дубликаты.
Неизменяемое множество 5 (frozenset) в Python представляет собой
неизменяемую коллекцию уникальных хэшируемых (hashable) элементов. Хэ-
шируемый (Hashable) это свойство объекта в Python, которое означает, что
|2Обычно говорят ^множество»
’Неизменяемые множества это неизменяемая версия обычных множеств в Python.
для данного объекта можно вычислить хэш-значение (hash value). Неизменяе-
мые множества используются в качестве ключей словарей или элементов других
неизменяемых множеств.
В таблице ‘2.13 приведены основные свойства, изменяемых (set) и неиз-
меняемых (frozenset) множеств.
Таблица 2.13: Сравнение основных характеристик изменяемых и неизменяемых
множеств в Python
Характеристика set frozenset
Изменяемость Изменяемый Неизменяемый
Уникальность элементов Автоматически исключает дубликаты Автоматически исключает дубликаты
Упорядочен- ность Неупорядоченный: порядок элементов пе гарантирован Неупорядоченный: порядок элементов пе гарантирован
Индексация Не поддерживает индекса- цию (set[0] вызовет ошиб- ку) Не поддерживает индекса- цию (frozenset ГО] вызовет ошибку)
Хэшируемый Нет: нельзя использовать как ключ словаря или эле- мент другого set Да: можно использовать как ключ словаря или эле- мент set
Требования к элементам Элементы должны быть hashable (числа, с-грокн, кортежи и т. и.) Элементы должны быть hashable (числа, строки, кортежи и т.п.)
Итерируемость Поддерживает итерации в циклах Поддерживает итерации в циклах
Гетерогенность Может содержать элементы разных hashable типов Может содержать элементы разных hashable типов
Вложенность Нс может содержать другие set. по может содержать frozenset Может содержать другие frozenset, по по set
Типичные применения Удаление дубликатов, от- слеживание уникальных элементов, динамические коллекции Конфигурации, постоянные группы, ключи словарей, элементы других множеств
Для создания множеств в Python используют фигурные скобки {} или
функцию set(). Они могут быть пустыми или содержать элементы разных ти-
нов. При этом для создания пустого множества нельзя использовать фигурные
скобки, так как это создаст словарь.
Листинг 2.123: Создание пустого множества
*
1 # Создание пустоте множества
2 empty.set = set О
з print(empty.set) # Bi 8од: set()
Для создания множества, состоящего из некоторых элементов, необходи-
мо их перечислить через запятую.
Листинг 2.124: Создание непустого множества
1 # Создание множества с элементами разных типов
г setl = {1, 2, 3, "apple", "banana"} fr {1, 2, 3, ’4^
—# apple’, ’banana’}
з my.list = [1, 2, 3, 4, 5, 5, 6]
4 set2 = set(my_list) # Вывод .! , 2, 3, 4, 5, 6j
5 # Создание множества из строки
в stringl = "Hello"
т set3 = set(stringl) # Вы од: {’H’, е’, ’1’, ’о’
Второй вариант создания множества с элементами — это преобразование
других коллекций в множества. Рассмотрим этот способ в параграфе §2.13..
Изменяемые множества (set) поддерживают основные теоретико-
множественные операции:
• объединение множеств:
• пересечение множеств:
• разность множеств;
• симметрическая разность множеств.
В таблице 2.14 перечислены основные методы изменяемых множеств
(set) в Python, которые позволяют выполнять операции над множествами.
Таблица 2.14: Основные методы изменяемых множеств (set) в Python
Метод Описание
add(x) Добавляет элемент x в множество.
clear() Удаляет все элементы множества.
сору О Возвращает поверхностную копню множе- ства.
difference(«others) Возвращает новое множество, содержащее элементы, присутствующие только в исход- ном множестве и отсутствующие в других.
difference_update(*others) Удаляет из множества все элементы, присут- ствующие в других множествах.
discard(х) Удаляет элемент х, если он присутствует. Ес- ли элемент отсутствует, метод не делает ни- чего и не вызывает ошибки
intersection(*others) Возвращает новое множество с общими эле- ментами всех множеств.
intersection_update(*others) Оставляет в множестве только элементы, об- щие со всеми другими
isaisjoint(other) Возвращает True если множества не имеют общих элементов.
assubset(other) Возвращает True, если все элементы множе- ства содержатся в other.
issuperset(other) Возвращает True, если множество содержит все элементы other.
pop() Удаляет и возвращает произвольный элемент из множества. Если множество пусто, вызы- вается исключение KeyError.
remove(x) Удаляет элемент х, если оп присутствует. Ес- ли элемент отсутствует, вызывает исключе- ние KeyError
symmetric-difference(other) Возвращает новое множество с элементами, присутствующими в одном из множеств, но по в обоих.
Метод Описание
unicn(*others) Возвращает новое множество, содержащее все элементы из всех множеств.
update(-others) Добавляет в множество все элементы из дру- гих множеств.
Рассмотрим множество my_set = {1, 2, 3, 4, 5} и применим к нему
различные методы множеств. Добавим элемент 6 в множество с помощью ме-
тода add():
Листинг 2.125: Добавление элемента в множество
1 # Создание множества
2 my_set = <1, 2, 3, 4, 5}
з # Добавление элемента во множество
4 my,set add(6)
5 # Вывод: (1, 2, 3, 4, 5, 6}
Удалим элемент 6 из множества my_set с помощью метода remove()
Листинг 2.126: Удаление элемента из множества
2
3
я Удаление элемента из множества
my_set.remove(6)
И Вывод: {1, 2, 3, 4, 5}
Рассмотрим два множества: my_set = {1, 2, 3, 4, 5} п other_set =
{4, 5, б, 7, 8}. Найдем пересечение множеств my_set и other_set с помо-
щью метода intersection О:
Листинг 2.127: Пересечение множеств
—
1 # Задаем первое множество
2 my.set = {1, 2, 3, 4, 5}
з » Задаем -торое множество
4 other.set = {4, 5, 6, 7, 8}
з # Находим пересечение множеств
6 comnon.elements = my.sec.intersection(other.set)
7 # Вывод: {4, 5}
Найдем объединение множеств my.set и other_set. с помощью метода
union!):
Листинг 2.128: Объединение множеств
1 # Задаем первое множеств^
2 my.set = Ц, 2, 3, 4, 5}
з « Задаем второе множество
4 other.set = {4, 5, 6, 7, 8}
s п Находим объединение множеств
е combined-elements = my.set.uni on(other.set)
7 # Вывод: {1, 2, 3, 4, 5, 6, 7, 8}
Найдем разность множеств my_set и other.set, с помощью метода
difference О •
Листинг 2.129: Разность множеств
1 # Задаем первое множество
2 my.set = {1, 2, 3, 4, 5}
з я Задаем вторсе множество
4 other_set = 14, 5, 6, 7, 8}
□ # Находим разность множеств
в unique.elements = my.set.difierence(other.set)
7 # Вывод: 11, 2, 3}
Найдем симметрическую разность множеств my.set и other.set, с по-
мощью метода symmetric-difference О;
Листинг 2.130: Симметрическая разность множеств
# Задаем первое множество
my.set = 11, 2, 3, 4, 5}
# Задаем второе множество
uther.set = {4, 5, 6, 7, 8}
# Находим симметрическую разность множеств
uni que_е 1 ements = <-»
<—> my.set symmetric-difference(other.set)
# Вывод: {1, 2, 3, 6, 7, 8}
Добавим элементы из множества other.set во множество my.set с по-
мощью метода updated;
Листинг 2.131: Обновление множества
1 # Задаем первое множеств
2 my.set = {1, 2, 3, 4, 5}
з п Задаем второе множество
4 other.set = {4, 5, 6, 7, 8}
э # Обновляем первое множество
в my.set.update(other.set)
7 # Вывод: {1, 2, 3, 4, 5, 6, 7, 8}
Множества в Python также поддерживают операции проверки принад-
лежности элементов, такие как in и not in.
Например, можно проверить, содержится ли элемент 6 во множестве
my.set:
Листинг 2.132: Проверка принадлежности элемента множеству
/
1 » Задаем множество
2 my.set = {1, 2, 3, 4, 5}
з # Проверяем принадлежность элемента
4 print(f’Число 6 принадлежит множеству my_set:’, 6
in my_set)
□ # вывод: Число 6 принадлежит множеству my_set: False
Использование изменяемых множеств (set) особенно эффективно для
операций поиска уникальных элементов, проверки пересечений, объединений
и разностей коллекций. Они незаменимы при работе с алгоритмами, требу-
ющими быстрой проверки принадлежности элементов, и при решении задач,
связанных с теорией множеств.
Применение неизменяемых множеств (frozenset) полезно в ситуациях,
когда требуется гарантировать неизменность данных, например, при использо-
вании в качестве ключей словарей или элементов других неизменяемых мно-
жеств.
В таблице 2.15 перечислены основные методы неизменяемых множеств
(frozenset) в Python, которые позволяют выполнять операции над неизменяе-
мыми множествами.
Таблица 2.15: Основные методы неизменяемых множеств (frozenset) в Python
Метод Описание
сору О Возвращает неглубокую копию объекта frozenset.
rsdisjoint(other) Возвращает True, если ни один элемент frozenset не содержится в other
issubset(other) Возвращает True, если все элементы frozenset содержатся в other
issuperset(other) Возвращает True, если все элементы other со- держатся в frozenset
uni c-n(*others) Возвращает новое frozenset, содержащее все элементы исходного и переданных множеств.
intersect ion(*orhers) Возвращает новое frozenset, содержащее только общие для всех множеств элементы.
di fference(«others) Возвращает новое frozenset, содержащее элементы, присутствующие в исходном, но от- сутствующие в других.
Метод Описание
synnnotric.dif f erence(other) Возвращает новое frozenset с элементами, присутствующими в одном из множеств, но не в обоих.
Мы можем создать неизменяемое множество из различных итерируемых
объектов: строк, списка, кортежа, изменяемого множества, неизменяемой по-
следовательности целых чисел (диапазона) и т.д. Для создания неизменяемого
множества используется функция frozenset,
Листинг 2.133: Создание неизменяемого множества
1 И Задаем строку
2 my.string = "Hello MGIMO-University!"
з » Создание неизменяемого множества
4 frozen_set = frozenset(my.string)
s print(frozen.set) # Вывод: f rozenset ({ ’ H ’ , ’1’, ’*-»
w o’, ’ ’M’, ’O’. ’I’, ’m’, ’u’, ’n’, ’i’, ’v’, <’
* e ’ , ’ r ’ , ’s’, ’у’ , ’ I ’})
Выясним, содержит ли множество other.frozenset элементы множества
my_frozenset
Листинг 2.134: Проверка вхождения элементов одного множества в другое мно-
жество
1 # Создание множеств
2 other_frozenset = frozenset({1, 2, 3, 4, 5});
з my.frozenset = frozenset({1, 2, 3});
4 # Про: зрка вхождения элемент.>в одного множества в др<—»
» угое
s print(my.frozenset.issubset(other_frozenset))
ь # Вывод: True
§2.11. Проверка типов данных
Встроенные функции для проверки типов данных в Python позволяют
определить, к какому типу принадлежит объект, и выполнять операции с раз-
личными типами данных.
Основные функции для проверки типов данных включают:
• isinstanceO — проверка принадлежности объекта к определенному ти-
пу;
• type() — получение типа объекта;
• issubclassO — проверка принадлежности класса к другому классу;
• callable О проверка, является ли объект вызываемым (функцией или
методом);
• dir О — получение списка атрибутов и методов объекта:
• helpO получение справки по объекту (методу, классу и т.д.);
• гергО получение строкового представления объекта, которое можно
использовать для его восстановления.
Выясним, является ли введенное число целым числом:
Листинг 2.135: Проверка принадлежности переменной целому тину
Z
1 # Присваивание переменной числового типа
2 num = 5
з # Проверка принадлежности переменней к типу int
4 print (f 'Число {num} является целым:’, «-»
1 s1nstance (num , int))
s # Вывод: Числе 5 является целым: True
Аналогичным образом можно выполнить проверку на принадлежность
к другим типам данных.
Выясним тип переменной можно с помощью функции type О;
Листинг 2.136: Определение типа переменной
1
2
3
4
6
7
8
9
10
11
12
13
14
15
1в
17
18
19
20
21
# Присваивание переменных различных типов
а = 10
b = "Hello"
с = [1, 2, 3]
d = (4, 5, 6)
е = {7, 8, 9}
# Определение типа переменной а
print(f’Twn переменной a-’, type(а))
# Вывод: <class ’int’>
tt Определение типа переменной b
print(f’THn переменной b: ’ , type(b))
# Вывод: <class ’str’>
tt Определение типа переменной с
printCf’Tnn переменной с:’, type(c))
tl Вывод: <class ’list’>
# Определение типа переменной d
print(f’Тип переменной d.’, type(d))
# Вывод; <class ’tuple’>
# Определение типа переменной е
print(f’Тип переменной е:’, type(e))
# Вывод: <class ’set ’ >
§2.12 . Встроенные функции для работы с основными
типами данных
Встроенные функции в Python позволяют выполнять операции с различ-
ными типами данных, такими как числа, строки, списки, кортежи, множества
и словари.
При первоначальном изучении Python полезно ознакомиться с основ-
ными встроенными функциями, которые облегчают работу с данными. Язык
Python предоставляет множество встроенных функций для работы с различ-
ными типами данных. Некоторые из них включают:
• abs() — возвращает абсолютную вс шчину (модуль числа):
• round О — округляет число до ближайшего целого или до указанного ко-
личества знаков после запятой:
• sum() — возвращает сумму элементов в списке или другом итерируемом
объекте:
• max О возвращает максимальное значение из списка или другого ите-
рируемого объекта:
• min() — возвращает минимальное значение из списка или другого итери-
руемого объекта;
• 1еп() — возвращает количество элементов в списке или другом итериру-
емом объекте:
• sorted() — возвращает отсортированный список или другой итерируемый
объект;
* zip() принимает на входе несколько итерируемых объектов (iterable)
пли итераторов (iterators) и поэлементно группирует их в кортежи по их
индексам;
• enumerate () возвращает итератор, который преобразует последователь-
ность в пары (индекс, элемент).
Использование функций позволяет упростить код и сделать его более
читаемым. Подробнее о создании пользовательских функций мы поговорим
в параграфе §4.1..
§2.13 . Преобразование типов данных
Язык Python поддерживает преобразование между различными тинами
данных. Основные функции для преобразования включают:
• int() — преобразование в целое число;
• float О преобразование в число с плавающей точкой:
• complex О — преобразование в комплексное число:
• str() преобразование в строку;
• bool () преобразование в логическое значение;
• list О — преобразование в список;
• tuple () преобразование в кортеж:
• set () преобразование в множество:
• dict() преобразование в словарь:
• frozenset () преобразование в неизменяемое множество.
Преобразование типов данных позволяет выполнять операции с различ-
ными тинами данных и использовать их в различных контекстах. Например,
можно преобразовать строку в число, чтобы выполнить арифметические опе-
рации.
Интерпретатор Python автоматически выполняет преобразование типов
данных в некоторых случаях, например при выполнении арифметических опе-
раций между различными типами. Пример: при сложении целого числа и числа
с плавающей точкой, целое число будет автоматически преобразовано в число
с плавающей точкой.
При вводе данных пользователем с клавиатуры в некоторые ноля, на-
пример в веб-приложениях, все значения будут интерпретироваться как строки.
Поэтому, если необходимо выполнить арифметические операции, строки нужно
предварительно преобразовать в числа, используя функции преобразования.
Листинг 2.137: Преобразование строки в число
/
1 # Задаем строки
2 а = "5"
з b = "2.5"
4 с = "True"
о я Преобразование строки в целое число
в а = int(а)
? # Преобразование строки в число с плавающей точкой
8
9
10
b = float(b)
4 Преобразование строки з логическое значение
с = bool(с)
На практике преобразование типов данных может быть полезным в раз-
личных ситуациях. Например, для удаления дубликатов из списка можно ис-
пользовать преобразование в множество, так как множества не допускают по-
вторяющихся элементов.
Листинг 2.138: Удаление дубликатов из списка
Z
1 4 Задаем список
2 original.list ж [1, 2, 3, 2, 4, 3, 5]
з # Удаляем дубликаты из списка
4 unique,values = set(original_list)
5 # Вывод: (1, 2, 3, 4, 5}
Затем можно преобразовать множество обратно в список, если это необ-
ходимо:
Листинг 2.139: Преобразование множества обратно в список
1 # Задаем множество
г unique.values • {1, 2, 3, 4, 5}
з # Преобразуем множество обратно в список
4 unique.list = list(unique.values)
s # Зывод: [1, 2, 3, 4, 5]
Аналогичная операция может быть выполнена для других типов данных,
таких как строки, списки и кортежи. Создание нового словаря может быть
выполнено с помощью функции diet О из списка кортежей.
Листинг 2.140: Создание нового словаря из списка кортежей
1 # Задаем список кортежей
a data = [("keyl", "valuel"), (“key2", “value2“), <—J
i—> ("кеуЗ", "value3")]
з # Создаем новый словарь
4 new_dict = dict(data)
s # Вывод: {’keyl’: ’valuel’, ’key2’: ’value2’, ’ <->
«-» кеуЗ’: ’value3’}
Создание нового словаря может быть выполнено с помощью функции
diet () из двух кортежей, где первый кортеж содержит ключи, а второй
значения.
Листинг 2.111: Создание нового словаря из двух кортежей
1 # Задаем кортежи
2 keys = ("keyl", "key2", "кеуЗ")
з values = ("valuel", "value2", "value3")
4 я Создаем новчй словарч
з new_dict = diet(zip(keys, values))
e # Вывод: {’keyl’: ’valuel’, ’key2’: ’value2’, ’4-^
> кеуЗ’: ’ value3 ’ }
§2.14. Изменяемые и неизменяемые типы данных
Одной из ключевых особенностей Python, которая часто приводит
к недоразумениям у начинающих программистов, является разделение типов
данных на изменяемые (mutable) и неизменяемые (immutable). Пони-
мание этого концепта критически важно для правильной работы с данными
и избежания трудноуловимых ошибок в коде.
2.14.1. Неизменяемые типы данных
Неизменяемые объекты это объекты, содержимое которых нельзя
изменить после создания.
Неизменяемые тины данных включают:
• кортежи (tuple);
• строки (str);
• числа (int, float, complex);
• логические значения (bool);
• NoneType;
• неизменяемые множества (frozenset).
Рассмотрим на примере, что означает неизменяемость.
Листинг 2.112: Неизменяемость строк
1 К Создаем переменную с названием компании
2 company.name = "ООО Альфа"
з print(f"ID объекта: {id(company_name)}")
4 # Изменяем название компании
s company_name = company_name + " Банк"
e print(f"Новое название {company_name}")
7 print(f"ID объекта: {id(company_name)}")
В данном примере при изменении содержимого переменной
company.паше интерпретатор Python создаст новый объект с новым идентифи-
катором. Исходная строка остается неизменной, но переменная company .name
теперь содержит ссылку на другой объект в памяти. Отметим, что хотя пере-
менные неизменяемых типов нельзя изменить, но с их помощью можно создать
новый объект с измененным содержимым.
2.14.2. Изменяемые типы данных
Изменяемые объекты это объекты, содержимое которых можно мо-
дифицировать без создания нового объекта.
Изменяемые типы данных включают:
• списки (list);
• словари (diet);
• множества (set);
• пользовательские классы (по умолчанию).
Рассмотрим на примере, что означает изменяемость.
Листинг 2.143: Изменяемость списков
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Создаем список квартальной выручки (в млн руб.)
quarterly.revenue = [120.5, 135.2, 128 7, 142.11
print(f"Исходный список: {quarterly.revenue}")
# Вывод: [120.5, 135.2, 128.7, 142.1]
print(f"II' объекта: { id ( quart er ly .revenue )}" )
# Добавляем данные за новый квартал
quarterly_revenue.append(156.3)
print(f"После добавления: {quarterly.revenue}")
# Вывод: [120.5, 135.2, 128.7, 142 1, 156.3]
print(f"IP объекта: {id(quarterly.revenue)}")
# Корректируем данные за второй квартал
quarterly.revenue [1] = 138.4
print(f"После корректировки: {quarterly.revenue}")
# Вывод: [120.5, 138.4, 128.7, 142.1, 156 3]
print(f"ID объекта: {id(quarterly.revenue)}")
В данном примере после добавления элемента и замены значения в спис-
ке quarterly_reven.ue идентификатор объекта, который был присвоен перемен-
ной, остается неизменным, несмотря па модификации содержимого’*. Таким
образом, изменяемые типы данных позволяют изменять свои элементы, добав-
лять и удалять элементы, а также изменять порядок элементов без создания
нового объекта.
2.14.3. Ошибки при копировании изменяемых объектов
Различие меж,\у изменяемыми и неизменяемыми типами становится осо-
бенно важным при работе с функциями и присваивании переменных.
Листинг 2.144: Безопасное копирование неизменяемых объектов
1 # Работа с процентными ставками
2 base_rate = 5.5
з new_rate = base_rate
4
5 4 Изменяем новую ставку
e new_rate = new_rate + 0.25
7
в print (f "Базовая ставка. {base_rate }7," ) # ы: . ц 5 5
э print (f "Новая ставка: <new_rate}7t") # Вывод 5.75
Листинг 2.145: Опасность при копировании изменяемых объектов
1 # Создаем портфель акций
з original_portfolio = (’"AAPL", "GOOGL", "MSFT"]
з print(original_portfolio)
4 # Вывод: [’AAPL’, ’GGOGL’, ’MSFT’]
1'Поскольку при работе интерпретатора Python на каждом компьютере идентификаторы
объектов могут различаться, мы пе можем полагаться на их абсолютные значения. Рекомен-
дуем читателю проверить, какой идентификатор получает объект после каждой операции.
6
7
8
9
10
11
12
13
14
15
backup_port.folio = original_portfolio # Э.о HE копи*-»
«-> я!
# Добавляем акцию в "резервный" портфель
backup_portf olio.append("TSLA")
print(f"Исходный портфель. {original_portfо 1io}")
# Вывод: [’AAPL1, ’GOOGL’, ’MSFT’, ’TSLA’]
print(f"Резервный портфель: -{ backup_port f ol i о } " )
# Вывод: [’AAPL’, ’GOOGL’, ’MSFT’, ’TSLA’]
print(f"Одинаковые объекты? {огзginal.portfolio is
< —> backup_portfolio} " ) я Вывод Tru*-
2.14.4. Правильное копирование изменяемых объектов
Для создания независимых копий изменяемых объектов используются
специальные методы:
Листинг 2.146: Поверхностное и глубокое копирование
1
2
3
4
5
6
7
8
9
10
11
import сору
# Исходные данные о сотрудниках
employees = [
{"name": "Иванов И.И.", "salary": 50000, "*-»
w department": "IT"],
{"name": "Петров П.П.", "salary": 60000, "<->
W department": "Finance"}
]
# Поверхностное копирование
shallow_copy = employees copyO » или . iployees [
shallow_copy.append({"name": "Сидоров С C.", "4-^
salary": 55000, "department": "HR"})
12
13
14
15
16
17
18
19
20
21
22
23
21
25
26
27
28
29
print("После добавления в поверхностную копию:")
print(f"Исходный список: {len(employees)} сотрудников—
в")
print(f"Копия: {Ion(shallow_cору)} сотрудников")
# Но изменение вложенного объекта затронет оба списка
«-> а !
shallow_copy[0] ["sal ary"] = 55000
print(f"Salary в исходном списке <—»
> {employees [0] [’ salary ’]}" )
print(f"Salary в копии: {shallow_copy [0] [’salary’]}")
# Глубокое копирование для полной независимости
deep_copy = copy.deepcopy(employees)
deep_copyГО] Г"salary"] = 70000
print(f"После глубокого копирования:")
print(f"Salary в исходном списке ’
{employees ГО] [’salary’]}")
print(f"Salary в глубокой копии
{deep_copy ГО] [ ’ salary ’ ] } ")
2.14.5. Практические рекомендации
При работе с изменяемыми и неизменяемыми типами данных в Python
важно соблюдать определенные правила, чтобы избежать неожиданных ошибок
и обеспечить надежность кода.
Во-первых, при работе* с функциями помните, что изменяемые объ-
екты передаются по ссылке и они могут быть изменены внутри функции. Это
может привести к непредвиденным последствиям в вашем коде.
Листинг 2.147: Функции и изменяемые объекты
I
2
3
4
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def add.transactiсn(account_balance, amount):
"""Небезопасная функция - изменяет исходный списН
—> ок"""
account_balance.append(amount)
return account-balance
def add.transaction.safe(account.balance, amount):
"""Безопасная функция - создает новый список"""
return account.balance + [amount]
ft Пример использования
ba 1 ance.history = [1000, 1200, 980]
print(f"Исходная история: {balance.history}")
ft Небезопасный вызов
add.transaction(balance.history, 1500)
print (f "После небезопасного вызова: <->
{ balance.hist ory } ")
ft Безопасный вызов
new.balance = add.transact ion.safe(balance.history, <->
800)
print (f "Исходная история: ( bal ance .hist ory }" )
print (f "Новая история: {new.balan.ce}")
Во-вторых, используйте неизменяемые типы для констант и конфи-
гурационных данных.
Листинг 2.148: Использование кортежей для констант
—
1 ft Хорошо: использование кортежа для неизменяемых дак<-^
ных
2 TAX.RATES = (0.13, 0.15, 0.30) Я Ставки подоходног w
налога
з COMPANY-COORDINATES = (55 7558, 37.6176) * Координат
ты офиса
4
5 И Плохо: использование списка для констант
в # TAX-RATES = [0.13, 0.15, 0.30] # Можно случайно иС-
—> зменигь!
В-третьих, будьте осторожны с изменяемыми значениями но
умолчанию в функциях.
Листинг 2.149: Опасность изменяемых значений по умолчанию
1 def create_portf о Li о ( s tocks = [] ) : гг Опасн.
2 "“"Неправильная реализация"""
3 stocks . append ("BTC")
4 return stocks
5
6 def create_portfoliu_correct(stocks=None): « Пра илн •—> ьно 1
7 '"'"Правильная реализация"""
8 if stocks is None :
9 stocks = []
10 stocks append("BTC")
11 return stocks
12
13 # Демонстрация проблемы
14 portfoliol = create.portfolio()
15 portfolios = create_portfolio()
16 print(f"Portfolio 1. {portfoliol}-")
17 print(f"Portfolio 2: {portfolios}")
18 print (f "Одинаковые объекты? {portfoliol is portfolio2}")
Понимание различий между изменяемыми и неизменяемыми типами
данных это основа для написания надежного и предсказуемого кода. В кон-
тексте работы с экономическими и финансовыми данными это особенно важно,
поскольку случайное изменение исходных данных может привести к серьезным
ошибкам в расчетах и анализе.
Запомните основные принципы работы с изменяемыми и неизменяе-
мыми типами данных:
• неизменяемые объекты безопасны для передачи и копирования:
• изменяемые объекты требуют осторожности при работе с функциями
п присваивании:
• используйте сору - deepcopy () для создания полностью независимых ко-
пий сложных структур:
• предпочитайте неизменяемые типы для данных, которые нс должны из-
меняться.
Контрольные вопросы
1. Какие правила необходимо соблюдать при именовании переменных
в Python?
2. Приведите примеры корректных и некорректных имен переменных.
3. Являются ли переменные variable. Variable и VARIABLE одинаковыми
в Python? Объясните почему.
4. Что такое ключевые слова в Python и можно ли их использовать в каче-
стве имен переменных?
5. Какие числовые типы данных существуют в Python?
6. В чем разница между типами int, float и complex?
7. Перечислите все арифметические операции в Python и объясните их на-
значение.
8. Что произойдет при делении целого числа на ноль?
9. В чем разница между операциями / и //?
10. Что возвращает операция 7, и приведите примеры ее использования.
11. Какой приоритет имеют арифметические операции в Python?
12. Что такое операторы комбинированного присваивания? Приведите при-
меры.
13. Чем отличается х = х + 5 от х += 5?
14. Перечислите все возможные операторы комбинированного присваивания
для арифметических операций.
15. Какие значения может принимать логический тип данных в Python?
16. Перечислите все логические операции и объясните их работу.
17. Какие значения в Python считаются ложными (falsy) при логических опе-
рациях?
18. Что возвращают операции and и or — всегда ли это True или False?
19. Объясните принцип короткого замыкания в логических операциях.
20. Что такое последовательность в Python? Приведите примеры типов по-
следовательностей.
21, Что такое длина последовательности и как ее определить?
22. Как работает индексация в Python? С какого числа начинается отсчет?
23. Что такое отрицательные индексы и как они работают?
24. Что произойдет при обращении к несуществующему индексу?
25. Что такое срез (slice) и какой синтаксис у операции среза?
26. Объясните значение параметров start, stop и step в срезах.
27. Что произойдет, если не указать параметры среза (например, [:] или
[::2])?
28. Как получить последовательность в обратном порядке с помощью срезов?
29. Как происходит сравнение последовательностей в Python?
30. Можно ли сравнивать последовательности разных типов?
31. Что означает лексикографический порядок при сравнении последователь-
ностей?
32. Как можно создать строку в Python? Приведите различные способы.
33. 13 чем разница между одинарными, двойными и тройными кавычками?
34. Что такое экранирование символов в строках?
35. Какие операции можно выполнять со строками (конкатенация, повторение
и ДР-)?
36. Являются ли строки изменяемым типом данных в Python?
37. Перечислите основные методы для работы со строками.
38. Что такое тип range и для чего он используется?
39. Какие параметры принимает функция range О?
10. Как преобразовать объект range в список?
41. Можно ли изменить объект тина range после его создания?
42. Как создать список в Python? Приведите различные способы.
43. Можно ли хранить в списке элементы разных типов данных?
44. Перечислите основные методы для работы со списками.
45. В чем разница между методами append() и extendO?
46. Как удалить элемент из списка? Приведите различные способы.
47. Что произойдет при попытке изменить элемент списка по несуществую-
щему индексу?
48. Что такое кортеж и чем он отличается от списка?
49. Как создать кортеж в Python? Что особенного в создании кортежа из
одного элемента?
50. Можно ли изменить элементы кортежа после его создания?
51. Какие операции доступны для кортежей?
52. В каких случаях лучше использовать кортежи вместо списков?
53. Что такое словарь в Python и как он устроен?
54. Какие типы данных можно использовать в качестве ключей словаря?
55. Как создать словарь? Приведите различные способы.
56. Как добавить, изменить и удалить элементы словаря?
57. Что произойдет при обращении к несуществующему ключу словаря?
58. Перечислите основные методы для работы со словарями.
59. Как получить все ключи, значения или пары «ключ-значение» из словаря?
60. Что такое множество в Python и какие у него особенности?
61. Как создать множество? В чем разница между set О и {}?
62. Какие математ ические операции можно выполнять с множествами?
63. Перечислите методы для добавления и удаления элементов множества.
64. Что такое замороженное множество (frozenset) и чем оно отличается от
обычного множества?
65. ' 1то такое явное и неявное преобразование типов данных?
66. Какие функции используются для преобразования типов данных
в Python?
67. Что произойдет при попытке преобразовать строку “abc” в число?
68. Как преобразовать число в строку и обратно?
69. Приведите примеры преобразования между различными типами последо-
вательностей.
70. Какие функции используются для проверки типа данных переменной?
71. В чем разница между функциями typeO и isinstanceO?
72. Когда следует использовать isinstanceO вместо typeO?
73. Перечислите основные встроенные функции для работы с последователь-
ностями.
74. Что возвращают функции len(), min(), max(), sumO?
75. Для каких типов данных можно использовать функции sorted О
и reversed О?
76. В чем разница между sortO и sortedO?
77. Что означают понятия изменяемый и неизменяемый тип данных?
78. Перечислите изменяемые и неизменяемые типы данных в Python.
79. Почему строки и кортежи называются неизменяемыми, если можно пере-
присвоить переменную?
80. Что происходит в памяти при изменении изменяемого и неизменяемого
объекта?
81. Как ведут себя изменяемые и неизменяемые объекты при передаче в функ-
цию?
82. В чем проблема при копировании изменяемых объектов простым присва-
иванием?
83. Что такое поверхностное (shallow) и глубокое (deep) копирование?
84. Какие методы используются для правильного копирования изменяемых
объектов?
85. В каких случаях нужно использовать модуль сору?
86. Какие рекомендации следует соблюдать при работе с изменяемыми объ-
ектами?
87. Почему не рекомендуется использовать изменяемые объекты в качестве
значений по умолчанию в функциях?
88. Как избежать неожиданных изменений данных при работе со списками
и словарями?
89. Напишите код, который демонстрирует разницу между поверхностным
и глубоким копированием списка списков.
90. Создайте программу, которая показывает, как ведут себя изменяемые
и неизменяемые объекты при множественном присваивании.
91. Приведите пример кода, где неправильное копирование изменяемого объ-
екта приводит к ошибке в логике программы.
Практикум: работа с основными типами данных
В этом разделе мы рассмотрим практические примеры работы с различ-
ными типами данных в Python. Мы создадим различные структуры данных,
выполним операции с ними и проверим их типы.
Упражнения
Арифметические операции над числами
1. Напишите программу, которая вычисляет значение выражения
11 + 7 - 345 • 28.
Какой тип данных имеет результат вычислений?
2. Напишите программу, которая вычисляет значение выражения
29 26 „ 2
—---------- 5 1 —.
459--------378-59
Какой тип данных имеет результат вычислений?
3. Напишите программу, которая вычисляет значение выражения
(о 4- 4 • /<) • (а — 3 • Ь) 4- сг
при а = 7 и b = 15. Предусмотрите возможность изменения значений
переменных а и Ь.
4. Напишите программу, которая вычисляет значение выражения
|;с| +- х • 5
при х = —2. Предусмотрите возможность изменения значений перемен-
ной х.
5. Напишите программу, которая переводит время указанное в минутах во
время в секундах? Сколько секунд в 37 минутах и 37 секундах?
6. Напишите программу, которая переводит температуру из Фаренгейта
в Цельсий. Используйте формулу: С = |(F — 32), где С — температу-
ра по Цельсию, F — температура по Фаренгейту.
7. Напишите программу, которая переводит километры в мили. Используйте
формулу: 1 миля = 1.61 км. Сколько миль в 45 километрах?
8. Напишите программу. которая запрашивает у пользователя два числа (ти-
па floar) и выполняет с ними все арифметические операции (сложение,
вычитание, умножение, деление, возведение в степень, целочисленное де-
ление, остаток от деления). Выведите результаты на экран.
9. Напишите программу, которая запрашивает у пользователя радиус круга
и вычисляет его площадь и периметр. Используйте формулы: 5 = тгт2
и Р — 2тгг, где г — радиус круга.
10. Напишите программу, которая запрашивает у пользователя два числа
и выводит их сумму, разность, произведение и частное.
И. Напишите программу, которая находит среднее арифметическое трех чи-
сел, введенных пользователем.
12. Напишите программу, которая запрашивает у пользователя три числа.
Далее она увеличивает первое число в четыре раза, второе число умень-
шает на 3.6, третье число возводит в четвертую степень и затем находит
сумму новых трех чисел.
13. Напишите программу, которая запрашивает у пользователя два числа
и меняет их значения местами.
14. Напишите программу, которая находит квадратный корень из числа, вве-
денного пользователем.
15. Если вы пробежали 10 километров за 42 минуты 42 секунды, каков ваш
средний темп бега (время, затраченное на преодоление мили, в минутах
и секундах)? Какова ваша средняя скорость в милях в час?
16. Предположим,что книга стоит 354 рублей 90 копеек, при этом книжный
магазин предоставляет скидку в 40%. Стоимость доставки составляет 150
рублей за первый экземпляр и 48 рублей 50 копеек за каждый дополни-
тельный. В какую сумму обойдется закупка 70 экземпляров?
17. Если я вышел из дома в 7:54 утра и пробежал 1 км в легком темпе (I км
за 9 мни. 15 сек.), потом 3 км в среднем темпе (1 км за 7 мин. 12 сок.)
и 1 км в легком темпе снова, то во сколько я вернусь домой позавтракать?
Используйте функции abs(), round!), sum(), max() и min() для выпол-
нения операций.
Строки и операции со строками
18.
19.
Преобразуйте строку "python" к заглавным буквам.
Преобразуйте строку "HELLO" в строчные буквы.
2U. Сделайте первую букву строки "hello world" заглавной.
21. Сделайте заглавными первые буквы каждого слова в строке "hello world
python".
22. Удалите лишние пробелы в начале и в конце строки "hello world ".
23. Замените слово "world" па "Python" в строке "Hello world".
24. Найдите индекс первого вхождения подстроки "Python" в строке "I love
Python".
25. Подсчитайте количество вхождений символа "а" в строке "banana".
26. Разделите строку "apple, orange, banana" на список фруктов.
27. Соедините элементы списка | Hello’, ’Python’l в строку через пробел.
28. Проверьте, начинается ли строка "Hello world" со слова "Hello".
29. Проверьте, закапчивается ли строка "Hello world" словом "Python".
30. Проверьте, состоит ли строка "abcDEF" только из букв.
31. Проверьте, состоит ли строка "123456" только из цифр.
32. Проверьте, состоит ли строка "Data Science" только из пробелов.
33. Центрируйте строку "Hi" до длины 10. используя символ *.
34. Дополните строку "42" пулями слова до длины 6.
35. Поменяйте регистр символов строки "Hollo World" на противоположный.
36. Разделите строку "python programming" па список слов.
37. Замените все пробелы в строке "good bye world" на символ подчеркивания.
38. Преобразуйте строку "Data Science" в верхний регистр.
39. Преобразуйте строку "PYTHON" в нижний регистр.
40. Сделайте первую букву строки "machine learning" заглавной.
41. Сделайте заглавными первые буквы каждого слова в строке "data analysis
and visualization".
42. Удалите пробелы только слева в строке " leading spaces".
43. Удалите пробелы только справа в строке "trailing spaces ".
44. Замените все буквы "а" на "о" в строке "banana".
45. Найдите индекс первого вхождения подстроки "learn" в строке "I want to
learn Python".
46. Подсчитайте количество вхождений подстроки "ing" в строке "learning is
fun and interesting".
47. Разделите строку "red;grcen;blne" на список цветов по разделителю .
48. Соедините элементы списка [’Data’, ’Science’, ’АГ] в строку через дефис
(-)•
49. Проверьте, начинается ли строка "Artificial Intelligence" со слова
"Artificial".
50. Проверьте, заканчивается ли строка "Deep Learning" словом "Python".
51. Проверьте, состоит ли строка "OpenAI" только из букв.
52. Проверьте, состоит ли строка "2024" только из цифр.
53. Проверьте, состоит ли строка " t п " только из пробельных символов.
54. Центрируйте строку "Center" до длины 15, используя символ -.
55. Дополните строку "7" нулями слева до длины 4.
56. Поменяйте регистр символов строки "Python Is Fun" на противополож-
ный.
57. Разделите строку "one two three four" на список слов.
58. Замените все пробелы в строке "hello world" на символ "*".
59. Преобразуйте строку "MixedCase" в полностью заглавные буквы.
60. Преобразуйте строку "MIXEDca.se" в полностью строчные буквы.
61. Сделайте первую букву каждого слова в строке "welcome to python
programming" заглавной.
62. Удалите символы 11,11 с начала и конца строки "!!!Не11о!!!".
63. Замените первую букву "h" па "Н" в строке "hello".
64. Найдите индекс подстроки "Ру" в строке "Python Programming".
65. Подсчитайте количество пробелов в строю' "count the spaces here ".
66. Разделите строку "apple|banana|cherry" на список фруктов по разделите-
лю
67. Соедините элементы списка [’2024’, ’АГ, ’ML’] в строку через пробел.
68. Проверьте, начинается ли строка "Hello. Python" со строки "Hi".
69. Проверьте, заканчивается ли строка "Learning Python" словом "Python".
70. Проверьте, состоит ли строка "Python3" только из букв.
71. Проверьте, состоит ли строка "123abc" только из цифр.
72. Центрируйте строку "Align" до длины 12, используя символ
73. Дополните строку "99" нулями слева до длины 5.
74. Поменяйте регистр символов строки "Good Morning" па противополож-
ный.
75. Разделите строку "split,this,string" па список слов по разделителю ".
76. Замените все символы "о" в строке "foo bar" на "0".
77. Преобразуйте строку "Convert Me" в нижний регистр и затем в верхний.
78. Сделайте первую букву строки "data" заглавной, а остальные строчными.
79. Замените все вхождения "е" на "3" в строке "test example".
80. Найдите индекс первого вхождения буквы "а" в строке "alphabet".
81. Подсчитайте количество букв "t" в строке "testing the method".
82. Разделите строку "2024/09/18" на список дат ио разделителю "/".
83. Проверьте, начинается ли строка "Start Неге" со слова "Start".
84. Проверьте, заканчивается ли строка "End Game" словом "Game".
85. Проверьте, состоит ли строка "OnlyLettcrs" только из букв.
86. Проверьте, состоит ли строка "NoDigitsl23" только из цифр.
87. Проверьте, состоит ли строка " n\t "только из пробельных символов.
88. Центрируйте строку "Middle* до длины 2D. используя символ "*".
89. Дополните строку "5" нулями слева до длины 3.
90. Поменяйте регистр символов строки "Case Swap" на противоположный.
91. Разделите строку "alpha.beta,gamma.delta" па список слов по разделите-
лю ".
92. Замените все пробелы в строке "space here" на "+".
93. Преобразуйте строку "Example" в заглавные буквы и затем обратно
в строчные.
94. Сделайте первую букву каждого слова в строке "learn python
programming" заглавной.
95. Удалите все символы "*" с начата и конца строки "***star***"_
96. Замените первую букву "б" па "S" в строке "start".
97. Найдите индекс подстроки "gram" в строке "programming".
98. Подсчитайте количество букв "ш" в строке "programming is fun".
99. Разделите строку "keyl:valuel;key2:value2" на список но разделителю
100. Соедините элементы списка | keyl valuel’, ’key2 value2'| в строку через
И
101. Проверьте, начинается ли строка "Function test." со слова "Test".
102. Проверьте, заканчивается ли строка "Final Test" словом "Test".
103. Проверьте, состоит ли строка "Test 123" только из букв.
104. Проверьте, состоит ли строка "456789" только из цифр.
105. Проверьте, состоит ли строка " ^t\n " только из пробелов.
106. Центрируйте строку "Edgc"flO длины 8, используя символ "+".
107. Дополните, строку "8" нулями слева до длины 2.
108. Поменяйте регистр символов строки "Flip CASE" на противоположный.
109. Разделите строку "one|two|three|four" на список слов по разделителю "|".
ПО. Замените все буквы "е" в строке "Elephant" на "3".
111. Преобразуйте строку "convert, me" в заглавные буквы и затем в нижние.
112. Сделайте первую букву строки "python" заглавной, а остальные оставьте
без изменений.
113. Замените вес вхождения "о" на "0" в строке "look for opportunities".
114. Найдите индекс первого вхождения подстроки "for" в строке "search for а
keyword".
115. Подсчитайте количество вхождений подстроки "or" в строке "for or
against".
Списки и операции со списками
116. Создай те список из первых пяти букв русского алфавита.
117. Создайте список из букв слова ’python’.
118. Создайте список из первых 30 натуральных чисел. Подсказка: исполь-
зуйте функцию range().
119. Создайте список из четных чисел от 0 до 30.
120. Создайте список из нечетных чисел от 0 до 30.
121. Создайте список из чисел от -5 до 5.
122. Создайте список из чисел от 1 до 10 и добавьте в конец число 11.
123. Создайте список из букв ’а’, Ъ’, ’с’ и вставьте букву ’сГ на позицию 1.
124. Найдите индекс элемента ’cherry’ в списке [’apple.’, banana’, ’cherry’].
125. Создайте список чисел от 1 до 5 и найдите его длину.
126. Объедините два списка [1. 2. 3| и (4, 5. 6].
127. Создайте список из элементов |1, 2, 3|, повторенных 3 раза.
128. Объедините два отсортированных списка [1, 3, 5] и |2, 4, 6] в один отсор-
тированный список.
129. Удалите последний элемент из списка |1, 2. 3. 4, 5].
130. Вставьте число 0 в начало списка [1. 2. 3].
131. Найдите сумму элементов списка |1, 2, 3, 4, 5].
132. Создайте список из пяти элементов и проверьте, содержится ли число 3
в списке. Подсказка: используйте оператор in
133. Создайте список чисел от 1 до 10 и найдите сумму всех элементов.
134. Найдите максимальное и минимальное значения в списке [10. 5. 8. 3. 7].
135. Найдите разницу между максимальным и минимальным элементами спис-
ка [10, 5. 8. 3. 7].
136. Посчитайте количество элементов в списке [1, 2, 3, 4, 5].
137. Создайте список из чисел и найдите количество элементов между первым
и последним элементом.
138. Отсортируйте список [3, 1,4, 1, 5, 9, 2, 6, 5] ио возрастанию.
139. Переверните порядок элементов в списке [1. 2, 3. 4. 5].
140. Поменяйте порядок элементов в списке |1, 2, 3. 4, 5] на обратный.
141. Создайте список из чисел и отсортируйте его без изменения оригинала.
142. Замените второй элемент списка |1, 2, 3, 4, 5] на число 10.
143. Создайте копию списка |1, 2, 3| и измените первый элемент копии на 10.
144. Найдите индекс первого вхождения числа 3 в списке [1, 2, 3, 4, 3, 5|.
145. Создайте список из чисел и посчитайте количество элементов, равных 5.
146. Посчитайте количество вхождений числа 2 в список |1, 2, 2, 3, 2. 4, 2, 5|.
147. Найдите индекс первого вхождения числа 7 в список |5, 3, 7, 1, 7, 9].
118. Создайте список из чисел и найдите индекс последнего вхождения числа
5.
149. Создайте список из чисел и найдите количество элементов, равных мини-
мальному значению.
150. Объедините все строки в списке [’Hello’, ’World’, ’!’] в одну строку.
151. Создайте список из строк и объедините их в одну строку, разделяя про-
белами.
152. Поменяйте местами первый и последний элементы в списке |1. 2. 3, 4, 5].
153. Поменяйте местами минимальный и максимальный элементы в списке [4.
2, 9, 7. 5, 1,8|.
154. Создайте список из 5 элементов и удалите все элементы, используя метод
с1саг().
155. Создайте список из чисел и удалите элемент но индексу 3.
156. Создайте список чисел от 1 до 10 и удалите последний элемент.
157. Удалите из списка [1, 2, 3, 4, 5] элементы со второго по четвертый вклю-
чительно.
158. Удалите из списка |1, 2, 3, 4, 5| каждый второй элемент.
159. Удалите из списка |1. 2. 3. 4, 5. 6. 7, 8. 9. 10| каждый третий элемент.
160. Удалите из списка [‘а’, Ъ’, ’с’, ’d’, ’e’j элементы с четными индексами.
Кортежи и операции с кортежами
161. Создайте пустой кортеж и выведите его.
162. Создайте кортеж с элементами: 1, 2, 3.
163. Создайте кортеж с одним элементом 5. Обратите внимание на синтак-
сис.
164. Создайте кортеж с одним элементом 'Hello' и выведите его тип.
165. Создайте кортеж из строк: ’яблоко', ’банан’, ’вишня".
166. Создайте кортеж с элементами; 1, 2, 3, ’Python’, True и выводите его.
167. Создайте кортеж с элементами из диапазона от 0 до 4. Используйте функ-
цию range().
168. Создайте кортеж из десяти элементов и замените его па новый кортеж
с другими элементами.
169. Создайте кортеж, состоящий из символов строки "python". Используйте
функцию tuple().
170. Преобразуйте список [4, 5, 6] в кортеж и выведите его.
171. Определите, какой элемент первым встречается в кортеже (5, 3, 5. 2).
172. Создайте кортеж (’а1, ’Ъ’, ’с’, (Г) и выведите второй элемент.
173. Создайте кор теж (’х’, ’у’, ’z‘) и выведите его второй элемент.
174. Создайте кортеж (1, 2, 3, 4, 5) и выведите* элемент с индексом -2.
175. Создайте кортеж из двух чисел и вычислите их разность.
176. Создайте кортеж (10, 20, 30, 10, 50) и выведите срез с индексами от 1 до
3 включительно.
177. Создайте кортеж (1, 3, 5, 7, 9) и выведите срез с индексами от 2 до конца.
178. Создайте кортеж (’apple1, ’banana’, ’cherry’) и выведите последний эле-
мен г.
179. Создайте кортеж (1, 2. 3, 4. 5) и выведите первые три элемента.
180. Получите подкортеж с элементами с индексами 1 и 2 из кортежа (10, 20,
30, 40).
181. Создайте кортеж (1, 2, 3, 4, 5) и выведите его в обратном порядке. Ис-
пользуйте срезы.
182. Создайте кортеж чисел (1, 3, 5. 7, 9) и выведите элементы с четными
индексами.
183. Создайте кортеж из элементов ('а’, Ъ’, ’с’, ’cl’) и получите подкортеж (’Ь’,
’с').
184. В кортеже (1, 2, 2, 3, 4, 2) найдите количество вхождений числа 2.
185. В кортеже (10, 20, 30, 40) найдите индекс элемента 30.
186. Создайте вложенный кортеж (1, (2. 3), (4, 5, 6)) и выведите элемент 3.
187. Объедините кортежи (1, 2, 3) и (4. 5, 6) и выведите результат.
188. Создайте кортеж (1, 2, 3) и добавьте к нему элемент 4 с помощью конка-
тенации.
189. Повторите кортеж (1. 2, 3) дважды и выведите результат.
190. Проверьте, содержится ли элемент ’Ь’ в кортеже (’а’, ’Ь’, ’с’).
191. Найдите длину кортежа (3. 1, 4, 1, 5) с помощью функции 1еп()
192. Найдите минимальный и максимальный элементы в кортеже (3, 1, 4, 1,
5).
193. Создайте кортеж чисел (5, 10, 15, 20, 25) и найдите разницу между мак-
симальным и минимальным значениями. Выведите результат.
194. Найдите сумму элементов кортежа (10, 20, 30).
195. Создайте кортеж чисел (10, 20, 30, 40, 50) и найдите среднее значение
элементов без использования встроенных функций. Выведите результат.
196. Отсортируйте кортеж (5, 3, 1, 4, 2) и выведите отсортированный список.
197. Создайте кортеж чисел ‘(7, 2, 5, 1, 3)‘ и отсортируйте его элементы по
убыванию. Используйте функцию sorted (tuple, reverse=True).
198. Создайте кортеж с элементами (1, ’two', 3.0, False) и преобразуйте его
в список.
199. Преобразуйте кортеж (1, 2, 3) в список, добавьте элемент 4 и снова пре-
образуйте в кортеж.
200. Создайте кортеж с числами (2, 4, 6. 8) и преобразуйте его в список. До-
бавьте число 10 в список и преобразуйте обратно в кортеж. Выведите
итоговый кортеж.
201. Создайте кортеж (’Python’, 'Java’, ’C++’) и замените 'Java' па 'JavaScript'
путем преобразования кортежа в список. Выведите обновленный кортеж.
202. Создайте список [1, 2, 3], преобразуйте, его в кортеж и выведите.
203. Создайте кортеж ('Hello', ’World’) и объедините его элементы в одну стро-
ку с пробелом.
204. Создайте кортеж (’apple’, 'banana’, 'cherry') и преобразуйте его в строку,
разделенную дефисами. Выведите результат.
205. Создайте кортеж (’apple’, ’banana’, ’cherry’) и выведите его элементы, раз-
деленные. запятой и пробелом.
Заключение
206. Создайте кортеж (1, 2, 3) и преобразуйте его в строку (1. 2. 3)'.
207. Создайте кортеж из строк ’one’, ’two’, ’three’ и преобразуйте его в строку
с помощью метода join().
203. Преобразуйте строку Hello, World!’ в кортеж символов и выведите его.
209. Создайте кортеж (1, 2, 3, 4, 5) и проверьте, больше ли первый элемент
второго.
210. Создайте кортеж (’а’, ’Ь’, ’а’, ’с’) и найдите индекс второю вхождения ’а’.
211. Создайте кортеж (’х!, ’у’, ’z’) и используйте распаковку кортежа для при-
своения значений переменным а, Ь, с. Выведите переменные.
212. Создайте кортеж чисел (1, 2, 3, 4, 5) и выведите каждый элемент па от-
дельной строке с помощью распаковки.
213. Создайте кортеж ( red’, ’green’, blue’, green’) и удалите первое вхожде-
ние green . Поскольку кортежи неизменяемы, создайте новый кортеж без
этого элемента. Выведите результат.
214. Создайте кортеж, содержащий элементы из списка |1. 2, 3] и строки ’abc’.
Объедините их в один кортеж.
215. Создайте кортеж из трех кортежей и найдите длину основного кортежа.
Заключение
В этом разделе мы рассмотрели основные типы данных в Python, их
особенности и способы проверки типов данных. Python предоставляет мощные
инструменты для работы с различными типами данных, что делает его уни-
версальным языком программирования. Мы изучили, как создавать и исполь-
зовать числовые типы данных, строки, списки, кортежи, словари и множества.
Также мы рассмотрели операции с этими типами данных и способы их преобра-
зования. Важно помнить, что Python является динамически типизированным
языком, что означает, что тип данных переменной определяется автоматически
в процессе выполнения upoi раммы. Это позволяет разработчикам сосредото-
читься на логике программы, а нс на управлении типами данных. Кроме того,
Python предоставляет множество встроенных функций и методов для работы
с тинами данных, что упрощает разработку и повышает производительность
программ.
В следующем разделе мы рассмотрим управление потоком выполнения
программы, включая условные операторы и циклы. Эти конструкции позволя-
ют создавать более сложные и гибкие программы, которые могут реагировать
на различные условия и выполнять повторяющиеся действия.
Глава 3. Управляющие конструкции
Программы в Python выполняются последовательно, начиная с первой
строки кода н заканчивая последней. Однако часто необходимо изменить поря-
док выполнения различных действий (инструкций) в зависимости от некоторых
условий или повторить выполнение определенных действий несколько раз. Для
этого в языке Python предусмотрены несколько типов управляющих конструк-
ций. которые позволяют управлять потоком выполнения программы:
• условные операторы (if, if-else, if-elif-else) позволяют выпол-
нять определенные действия в зависимости от условий:
• циклы (for. while) позволяют выполнять блок кода несколько раз;
• операторы управления циклом (pass, break, continue) позволяют
управлять выполнением циклов;
* генераторы списков, множеств и словарей позволяют создавать но-
вые коллекции на основе существующих;
• операторы обработки ошибок и исключений (try, except, finally)
позволяют обрабатывать ошибки и исключения, которые могут возник-
нуть во время выполнения программы.
§3.1. Условные операторы if, if-else, if-elif-else
Условные операторы в языках программирования позволяют создавать
более сложное поведение, выполняя определенные действия (блок кода) в зави-
симости от истинности или ложности условий (логических выражений), обраба-
тывая входные данные или состояния программы. Условные операторы вклю-
чают if, if-else и if-elif-else
Условный оператор if имеет следующий синтаксис: начинается с клю-
чевого слова if. за которым следует логическое выражение, двоеточие и блок
кода, выполняемый при истинности логического выражения. При этом исполь-
зуются отступы в четыре пробела для обозначения границ блока кода.
Листинг 3.1: Синтаксис оператора if
1 if <условие>:
г <блок кода, выполняемый при истинности условия?
При этом <условие> любое выражение, приводимое к логическому (бу-
левому) значению с помощью «правила истинности (truthincss)». Данное прави-
ло позволяет определить, является ли значение истинным или ложным. Поми-
мо известных значений, таких как True и False, в Python существуют и другие
значения, которые также могут восприниматься как истинные или ложные. На-
пример. мы уже разобрали операторы сравнения, которые возвращают логиче-
ское значение в зависимости от сравниваемых объектов. Кроме этого, «правило
истинности (truthincss) гласит: 0. пустые коллекции, None. False воспринима-
ются как False: все прочие значения как True
Например, если мы хотим выяснить, являетесь ли вы совершеннолет-
ним. то нам необходимо сравнить ваш возраст с числом 18 и в зависимости от
результата сравнения принять решение. Применив условный оператор if для
обработки возраста, мы можем написать следующий код:
Листинг 3.2: Пример использования оператора if
1 # Задаем значение возраста
2 age = 18
з # Проверяем возраст
4 if age >= 18.
з print("Вы совершеннолетний")
в # Вывод: Вы совершеннолетний
В данном примере, если значение переменной age больше или равно 18,
то будет выведено сообщение "Вы совершеннолетний”. Если условие не вы-
полняется. то блик кода после оператора if не будет выполнен, и программа
продолжит выполнение следующей строки кода.
Если необходимо выполнить один блок кода при истинности условия
и другой блок кода при его ложности, то используется оператор if-else. Ука-
занный оператор имеет следующий синтаксис: начинается с ключевого слова
if. за которым следует логическое выражение, двоеточие и блок кода, выпол-
няемый при истинности логического выражения. Затем следует ключевое слово
§3.1. Условные операторы if, if-else, if-elif-else
else, двоеточие и блок кода, выполняемый при ложности логического выраже-
ния. При этом используется отступ в четыре пробела для обозначения границ
блока кода.
Листинг 3.3: Синтаксис оператора if-else
—
1 if <условие>:
з <блок кода, выполняемый при истинности условия>
з else :
4 <блок кода, выполняемый при ложности условия>
Продолжим рассмотрение примера с проверкой совершеннолетия, в слу-
чае если ваш возраст меньше 18 лет, выведем об этом сообщение. Для этого
добавим блок else в код прошлого примера:
Листинг 3.1: Пример использования оператора if-else
1 в Задаем значение возраста
2 age = 17
з # Пре теряем возраст
4 if age >= 18:
5 print("Вы совершеннолетний")
с else :
т print("Ebi несовершеннолетний")
s г Вывод: Вы несовершеннолетний
В данном примере, если значение переменной age больше или равно 18,
то будет выведено сообщение "Вы совершеннолетний", иначе будет выведено
сообщение "Вы несовершеннолетний".
Если необходимо выполнить один из нескольких блоков кода в зависи-
мости от условий, то используется оператор if-elif-else. Данный оператор
позволяет проверить несколько условий последовательно и выполнить соот-
ветствующий блок кода. Условный оператор if-elif-else имеет следующий
синтаксис: начинается с ключевого слова if, за которым следует логическое
выражение, двоеточие п блок кода, выполняемый при истинности логического
выражения. Затем следует одно пли несколько ключевых слов elif, за кото-
рыми следует логическое выражение, двоеточие и блик кода, выполняемый при
истинности этого условия. В конце следует ключевое слово else, двоеточие
и блок кода, выполняемый при ложности всех предыдущих условий. При этом
используется отступ в четыре пробела для обозначения границ блока кода.
Листинг 3.5: Пример использования оператора if-elif-else
1
2
3
4
5
6
7
8
9
10
# Задаем значение переменной х
х = 10
# Проверяем значение переменной х
if х > 10:
print("x больше 10")
elif х == 10:
printCx равнч 10")
else :
print ("х меньше 10")
# Еывод: х равно 10
В данном примере, если значение переменной х больше 10. то будет вы-
ведено сообщение "х больше 10", если х равно 10, то будет выведено сообщение
"х равно 10" , иначе будет выведено сообщение "х меньше 10".
Язык Python позволяет использовать сокращенную форму записи
условного оператора if-else, которая называется тернарным оператором
if-else. Он позволяет записать условное выражение в одной строке, что дела-
ет код более компактным и читаемым. Тернарный оператор имеет еле,чующий
синтаксис:
Листинг 3.6: Синтаксис тернарного оператора if-else
1 <значение если истина> if <условие> else <значение е<-^
-Э ели ложь>
§3.1 . Условные операторы if, if-else, if-elif-else
В этом синтаксисе, если условие истинно, то будет возвращено значение
<значение если истина>, иначе будет возвращено значение <значение если
ложь> Если необходимо присвоить переменной значение в зависимости от усло-
вия, то можно использовать тернарный оператор.
Листинг 3.7: Пример использования тернарного оператора if-else
I
2
3
4
# Задаем значение переменной х
х = 10
# Проверяем значение переменной х
result = "Even" if х '/, 2 == 0 else "Odd"
prinr(result) # Вы: од Evin
В примере, если значение переменной х четное, то переменной result
будет присвоено значение "Even" , иначе будет присвоено значение "Odd".
Оператор if может быть использован в различных конструкциях, таких
как условные операторы, циклы, списковые включения и другие. Он позволяет
выполнясь определенные действия в зависимости от условий, что делает код
более гибким и адаптивным.
Типичные ошибки при использовании оператора if включают:
• пропуск отступов пли смешение пробелов и табуляций, что может приве-
сти к ошибкам в определении блоков кода:
• использование неверных операторов сравнения, что может привести к ю-
гпчсским ошибкам. Например, использование присваивания (=) вместо
сравнения (==);
• использование вложенных if вместо elif. когда нужна взаимная эксклю-
зивность, может привести к логическим ошибкам;
• сложные логические выражения без пояснения: когда условие слишком
громоздкое, лучше вынести часть в именованную переменную с понятным
именем, чтобы улучшить читаемость кода.
§ 3.2. Циклы for и while
Цикл это конструкция в языке программирования, которая позволяет
выполнять один и тот же блок кода несколько раз. Язык Python поддерживает
два основных типа циклов: for и while.
3.2.1. Цикл for
Цикл for предназначен для последовательного обхода элементов (итера-
ции) любого итерируемого объекта* (например, списка, строки, кортежа, мно-
жества или диапазона) и выполнения блока кода для каждого элемента.
Цикл for имеет следующий синтаксис: начинается с ключевого слова
for. за которым следует переменная, двоеточие и блок кода, выполняемый на
каждой итерации.
Листинг 3.8: Синтаксис цикла for
for <переменная> in <итерируемый>:
<блок кода> # Тело цикла
При этом <итерируемый> вычисляется один раз перед началом цикла,
после чего последовательность его элементов извлекается по одному и присваи-
вается переменной, которая указана в <переменная> на каждой итерации. Блок
кода выполняется дзя каждого элемента. Для <блока кода>, который является
телом цикла (выполняется в цикле) необходимо соблюдать отступы в четыре
пробела. После завершения итерации по всем элементам поток управления пе-
реходит к инструкции после цикла (или к блоку else, если он есть).
Для перебора элементов списка можно использовать цикл for.
1 Итерируемый объект — объект, реализующий метод_iter_или протокол последова-
тельности с __getitem_________________________________.
Листинг 3.9: Пример использования цикла for для перебора элементов списка
1 # Задаем список фруктов
2 fruits = ["apple", "banana", "cherry"]
з for fruit in fruits:
t print 5 # Вывод: (f"fl люблю {fruit}")
в # Я люблю apple
т Я Я люблю banana
8 # Я люблю к. cherry
В данном примере в цикле for переменная fruit на каждой итерации по-
лучает очередное значение из списка. На выходе мы получаем фразу "Я люблю
fruit” для каждого фрукта в списке.
Аналогично можно перебрать элементы строки, кортежа, множества или
неизменяемой последовательности целых чисел (диапазона).
Листинг 3.10: Перебор элементов диапазона с помощью цикла for
1 for i in range (5) •
2 print("Элемент диапазона равен", i)
Зывод:
Элемент диапазона равен 0
# Элемент диапазона равен 1
# Элемент диапазона равен 2
tt Элемент диапазона равен 3
Элемент диапазона равен 4
В примере цикл for будет выполняться 5 раз. и па каждой итерации
будет выводиться значение переменной i от 0 до 4.
3.2.2. Цикл while
Пикл while предназначен для выполнения блока кода, пока заданное
условие истинно.
Пикл while имеет следующий синтаксис: начинается с ключевого слова
while, за которым следует условие, двоеточие и блок кода, выполняемый, пока
условие истинно.
Листинг 3.11: Синтаксис цикла while
while <условие>:
<блок кода> я Тело цикла
При этом <условие> проверяется перед каждой итерацией, и если оно
истинно, выполняется <блок кода>. Если <условие> ложно, выполнение цик-
ла прекращается, и управление передается следующей инструкции после цик-
ла. Для тела цикла необходимо соблюдать отступы в четыре пробела. Если
<условие> никогда не становится ложным, цикл бесконечен, пока не встретит-
ся оператор break или внешнее прерывание. Часто используют счетчики или
проверку изменения состояния внутри цикла, чтобы гарантировать выход.
Выведем числа от 0 до 4 с помощью цикла while
Листинг 3.12: Пример использования цикла while для вывода чисел от 0 до 4
1
2
3
4
6
7
8
9
10
11
12
13
# Задаем начальное значение переменной
х = О
while х < 5:
# Выводим текущее значение х
print("Текущее значение х:", х)
# Увеличиваем значение х на 1
х += 1
# Вывод:
# Текущее значение х: О
я Текущее значение х: 1
# Текущее значение х: 2
« Текущее значение х: 3
» Текущее значение х: 4
В примере цикл while будет выполняться, пока значение переменной х
меньше 5.
Если условие всегда истинно, то цикл будет выполняться бесконечно.
Листинг 3.13: Пример бесконечного цикла while
1
2
3
4
5
6
7
8
9
10
11
8 Задаем начальное значение переменной
х = 1
while х > О
# Выводим текущее значение х
print("Текущее значение х:", х)
х += 1
» вывод:
# Текущее значение х: О
8 Текущее значение х; 1
8 Текущее значение х 2
В этом примере цикл while будет выполняться, пока значение переменной х
больше 0. На каждой итерации будет выводиться значение переменной х и уве-
личиваться на 1. Очевидно, что этот никл является бесконечным, так как зна-
чение переменной х всегда будет больше 0 при увеличении на 1.
Выделим типичные ошибки при использовании цикла while:
• забыть изменить переменную, влияющую па условие, что приводит к бес-
конечному циклу. Решение: следить за изменением состояния, иногда до-
бавлять таймаут или счетчик.
• помещать тяжелые операции в условие или тело без необходимости, что
может замедлить программу. Лучше вычислять дополнительные значения
заранее.
• использование while там, где уместнее for: когда известна структура ите-
рируемого, for считается лучшим выбором.
3.2.3. Операторы pass, break и continue
Операторы pass, break и continue используются для управления выпол-
нением циклов в Python.
Оператор pass является пустой операцией, по выполняет никаких дей-
ствии и используется как заглушка, когда синтаксически требуется оператор,
но действия не нужны. Например, при выстраивании структуры кода можно
использовать оператор pass в местах, где позже будут добавлены реальные
операции. В циклах или условных операторах можно временно вставить pass,
чтобы сохранить корректность синтаксиса.
Листинг 3.14: Пример использования оператора pass в условном операторе
—
1 х = О
2 if х < 10:
з pass # пока ничего не делаем
4 else :
з print("x больше или равно 10")
Аналогичное поведение наблюдается и в циклах. Например, в цикле
while можно использовать pass для сохранения структуры кода.
Листинг 3.15: Пример использования оператора pass в цикле while
/-------------------------------------------------------------
1 # Задаем начальное значение переменной
2 х = 0
з while х < 10.
4 if х == 5:
з pass # пока ничего не делаем
Оператор break используется для досрочного прерывания выполнения
цикла. Когда интерпретатор Python встречает оператор break, он выходит из
текущего цикла и продолжает выполнение кода после него.
Например, в цикле while можно использовать break для прерывания
выполнения цикла. Допустим мы хотим прервать цикл, когда значение пере-
менной х равно 5.
Листинг 3.16: Пример использования оператора break в цикле while
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Задаем начальное значение переменной х
х = О
# Задаем цикл while
while х < 10:
if х == 5:
break
print("Текущее значение x =", x)
x += 1
# Вывод:
# Текущее значение х = 0
# Текущее значение х = 1
# Текущее значение х “ 2
Текущее значение х • 3
# Текущее значение х = 4
В дампом примере цикл while будет выполняться, пока значение пере-
менной х меньше 10. Если значение переменной х равно 5, то выполнение цикла
будет прервано оператором break.
Аналогичное поведение оператора break наблюдается и в цикле for.
Листинг 3.17: Пример использования оператора break в цикле for
/
1 # Последовательно перебираем значения
2 for 1 in range (10);
з if i == 5:
4 break
5 print("Текущее значение i =", a)
6 # Вывод:
? # Текущее значение i = 0
8
9
10
И
» Текущее значение i = 1
# Текущее значение i = 2
# Текущее значение i = 3
# Текущее значение i = 4
В данном примере цикл for будет выполняться, пока значение перемен-
ной i меньше 10. Если значение переменной i равно 5, то выполнение цикла
будет прервано оператором break.
Оператор continue используется для пропуска текущей итерации цик-
ла и перехода к следующей. Когда интерпретатор Python встречает оператор
continue, он немедленно завершает выполнение текущей итерации, пропускает
оставшуюся часть тела текущей итерации и переходит к следующей итерации
цикла. Такое поведение оператора continue полезно, когда необходимо пропу-
стить определенные значения или условия, нс прерывая весь цикл.
Листинг 3.18: Пример использования оператора continue в цикле while
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
я Задаем начальное значение переменной х
х = 0
while х < 10.
х += 1
if х == 5.
continue
print("Текущее значение х =", х)
# Вывод:
# Текущее значение х = 1
# Текущее значение х = 2
я Текущее значение х = 3
# Текущее значение х = 4
# Текущее значение х = 6
# Текущее значение х = 7
в Текущее значение х = 8
# Текущее значение х = 9
В рассмотренном примере цикл while будет выполняться, пока значение
переменной х меньше 10. Если значение переменной х равно 5, то выполнение
текущей итерации будет пропущено оператором continue и управление пере-
дастся на следующую итерацию цикла.
Аналогичное поведение оператора continue наблюдается и в цикле for.
Листинг 3.19: Пример использования оператора continue в цикле for
1 р Последовательно перебираем значения
2 for i in range (10) :
з if i 7. 2 == 0:
4 continue # не выполнять оставшийся код, пере-*
ейти к следующему i
з print("Текущее значение i =", i)
# Вывод: выводит только нечетные
# Текущее значение i = 1
# Текущее значение i = 3
# Текущее значение i = 5
# Текущее значение i = 7
# Текущее значение i = 9
В привсдепом примере в цикле for будут перебираться значения от 0
до 9. Если значение переменной i является четным, то выполнение текущей
итерации будет пропущено оператором continue и управление передастся на
следующую итерацию цикла.
Может быть полезно использовать оператор continue во вложенных цик-
лах. чтобы пропустить итерации па более глубоком уровне.
Листинг 3.20: Пример использования оператора continue в вложенном цикле
1 л Последозательно перебираем значения
2 for i in range(3):
з for j in range(3) :
4 if x == j:
о continue
6 print(f"i: Ш, j: {j}")
7 # Вывод
8 # i : 0, j : 1
9 # i : 0, j = 2
10 # i : 1, j = 0
11 it i : 1, j : 2
12 it i : 2 , j : 0
13 it i : 2, j = 1
В данном примере цикл for будет выполняться, пока значение перемен-
ной 1 меньше 3. Если значение переменной i равно значению переменной j, го
выполнение текущей итерации будет пропущено оператором continue и управ-
ление передастся на следующую итерацию цикла.
§ 3.3. Цикл for с else
Цикл for может быть использован с оператором else, который выпол-
няется, если цикл завершился «нормально», то есть не был прерван оператором
break Расширенный синтаксис цикла for, содержащий оператор else: начина-
ется с ключевого слова for, за которым следует переменная, двоеточие и блок
кода, выполняемый па каждой итерации; после этого следует оператор else
и блок кода, выполняемый после завершения цикла, если он не был прерван
оператором break
Листинг 3.21: Синтаксис цикла for с else
1 for <переменная> in <итерируемый>:
2 <блок кода>
з else:
« «.блок при отсутствии break>
Пикл for с оператором else используется в алгоритмах, где нужно убе-
диться, что элемент не найден или условие не сработало. Например, осуществим
поиск элемента в списке с помощью цикла for, оператора else и оператора
break
# Задаем значения переменных
fruits = ["яблоко", "банан", "груша"]
search = "апельсин"
# Перебираем элементы списка
for fruit in fruits:
if fruit == search:
print(f"Нашел: {search}!")
break
else:
print(f"{search} не найден в списке ")
# Чывод: апельсин не найден в списке
Листинг 3.22: Пример использования цикла for с else
1
2
3
4
5
6
7
8
9
10
11
В рассмотренном примере цикл for будет выполняться, пока пе будет
найден искомый элемент или не завершится перебор всех элементов списка.
Поскольку элемент search пе найден, то условие fruit == search будет лож-
ным и выполнение цикла не будет прервано оператором break, и блок else
будет выполнен.
Замечание 17. Цикл for с оператором else позволяет более гибко управлять
потоком выполнения программы, обеспечивая возможность обработки различ-
ных сценариев завершения цикла. При этом возможно использовать операторы
pass, break и continue внутри цикла, что позволяет более точно контролиро-
вать логику выполнения.
§ 3.1. Цикл while с else
Цикл while также может быть использован с оператором else, который
выполняется после завершения цикла, если цикл пе был прерван оператором
break
Расширенный синтаксис цикла while, содержащий оператор else: начи-
нается с ключевого слова while, за которым следует условие, двоеточие и блок
кода, выполняемый на каждой итерации; после этого еле,дуст оператор else
и блок кода, выполняемый после завершения цикла, если он не был прерван
оператором break.
Листинг 3.23: Синтаксис цикла while с else
1 while <условие>:
2 <блок кода>
з else:
4 <блок при отсутствии break>
Пикл while с оператором else используется в алгоритмах, где нужно
убедиться, что условие не сработало. Например, мы можем организовать про-
верку пароля с помощью цикла while, оператора else и оператора break.
Листинг 3.21: Пример использования цикла while с else
1
2
3
4
6
7
8
9
10
11
12
13
14
15
# Задаем пароль
password = "secret"
# Задаем количество попыток ввода пароля
attempts = 3
# Проверяем пароль
while attempts > О'
# Получаем ввод пользователя
user_input = input("Введите пароль: ")
» Проверяем введенный пароль
if user_input == password-
print("Доступ разрешен!")
break # Прерываем цикл при успешном вводе
# Уменьшаем количество попыток
attempts -= 1
print(f"Неверный пароль. Осталось попыток: «—
с > {attempts}")
is else :
it print("Превышено количество попыток. Доступ запре-'
с—> еден ")
В приведенном примере цикл while будет выполняться до тех пор. пока
пользователь не введет правильный пароль или нс исчерпает все попытки.
Замечание 18. Цикл while с оператором else позволяет использовать опера-
торы pass, break и continue внутри цикла, что позволяет более точно контро-
лировать логику выполнения.
§3.5. Включения (comprehensions)
Включения (comprehensions) это элегантный и производительный
способ создания новых коллекций (списков, множеств, словарей) на основе об-
работки элементов из другого итерируемого объекта. Их главные преимуще-
ства лаконичность и читаемость.
Основная идея включений состоит в том, что мы можем заменить
многострочный цикл for с наполнением коллекции одной выразительной стро-
кой.
Включения предпочтительнее явных циклов по следующим причинам:
• Читаемость: код становится более декларативным он описывает, что
нужно сделать («создать список квадратов»), а не как это делать (создать
список, запустить цикл, добавлять элементы).
* Производительность: под капотом операции внутри включений опти-
мизированы интерпретатором Python и выполняются, как правило, быст-
рее, чем аналогичный код в классическом цикле.
* Безопасность: исключаются потенциальные ошибки, связанные с ини-
циализацией списка, опечатками в именах переменных и т. д.
Включения часто предпочтительнее явных циклов для простых транс-
формаций и фильтрации данных (с помощью оператора if).
Перед тем как мы перейдем к конкретным тинам включений. критически
важно развести два понятия, которые часто путают из-за схожести названий:
включения (comprehensions) и генераторы (generators).
• Включения это «алгоритмический сахар» для создания готовых кол-
лекций (списков, множеств, словарей). Они выполняют весь цикл сразу
и возвращают полную коллекцию, целиком находящуюся в памяти. Это
быстрый и удобный способ преобразовать один итерируемый объект в дру-
гой.
♦ Генераторы — это инструменты для ленивых (lazy) вычислений. Они
пе создают коллекцию сразу Вместо этого они возвращают специальный
объект, который генерирует элементы по одному, по мере необходимости,
экономя память. Это идеально для работы с бесконечными последователь-
ностями или очень большими объемами данных, которые нс нужно или
нельзя загружать в память целиком.
Сравним включения и генераторы на примере:
Листинг 3.25: Сравнение включений и генераторов
1
2
3
4
5
в
7
8
9
10
11
12
13
# Списковое ВКЛЮЧЕНИЕ - создает список сразу
list_comp = [х**2 for х in range(5)]
print(list_comp) ft [0, 1, 4, 9, 16’
print (type (list_cocip)) # <clajs ’list’>
# Выражение-ГЕНЕРАТОР - создает объект-генератор
gen.expr = (х**2 for х in range(5))
print (gen_expr) # generator object <genexpr> at «->
< -> Ox ... >
print(type(gen_expr)) # <class ’gen rator’>
# Чтобы получить значения из генератора, его нужно
w терировать
for value in gen_expr:
print(value) # Выводит 0, 1, 4, 9, 16 по одному
3.5.1. Списковые включения
Списковые включения (list comprehensions) в Python это лако-
ничный и эффективный способ создания списков. Они объединяют цикл, услов-
ный оператор и выражения в одну строку, улучшая читаемость и производи-
тельность кода.
Списковые включения имеют следующий синтаксис: начинаются с от-
крывающей квадратной скобки, за которой следует выражение, затем ключевое
слово for и, при необходимости, условие if.
Листинг 3.26: Синтаксис списковых включений
1 [«выражение? for <переменная> in «итерируемки? if <у<—“
«-> словие?]
• «выражение? определяет значение для каждого элемента в списке.
• «переменная? принимает значение каждого элемента из итерируемого
объекта.
• «итерируемый? это любой итерируемый объект, например список, кор-
теж, множество и т. д.
• <условие> это необязательная часть, которая позволяет фильтро-
вать элементы итерируемого объекта. Если условие выполняется, элемент
включается в список.
Замечание 19. Отметим, что
• «выражение? вычисляется для каждого элемента «переменная? из
<итерируемый>;
• <условие> фильтрует элементы, для которых будет вычисляться
«выражение? Блок if «условие? необязателен.
Создадим список квадратов чисел от 0 до 4 с помощью спискового вклю-
чения.
Листинг 3.27: Пример создания списка квадратов чисел от 0 до 4
# Создаем список квадратов чисел :т 0 до 4
х = [i**2 for i in range(5)]
print(x)
# Вывод: [0, 1, 4, 9, 16]
В данном пример блок условного оператора является необязательным
Код примера работает следующим образом: для каждого числа из диапазона
от 0 до 4 вычисляется его квадрат, и результат добавляется в новый список.
Создадим список квадратов четных чисел от 1 ди 5 с помощью спискового
включения.
Листинг 3.28: Пример создания списка квадратов четных чисел
i
2
3
# Создаем список квадратов четных чисел
х = [i**2 for i in range(l, 6) if i 7. 2 == 0]
print(x) # Вывод [4, 16J
В рассмотренном примере блок условного оператора является обязатель-
ным, поскольку мы хотим получить квадраты только четных чисел. Код при-
мера работает следующим образом: для каждого числа из диапазона от 1 до 5
проверяется, является ли оно четным. Если да, то к нему применяется операция
возведения в квадрат и результат добавляется в новый список.
Другой пример использования списковых включений: создание списка
квадратов только тех чисел из исходного списка, которые являются четными.
Листинг 3.29: Пример использования списковых включений
i
2
3
4
5
# Создаем список чисел
х = [1 , 2, 3, 4, 5]
# Создаем список квадратов четных чисел
у = [i**2 for i in х if i 7» 2 == 0]
print(y) » Вывод: [4, 16]
В этом примере из списка х будут выбраны только четные числа,
п к каждому из них будет применено выражение i**2, чтобы получить их
квадрат. Результат будет сохранен в списке у Списковые включения позво-
ляют создавать новые списки с помощью компактного синтаксиса, что делает
код более читаемым и понятным.
Заметим, что можно использовать вложенные циклы в списковых вклю-
чениях. Например, можно создать список, содержащий пары чисел из некото-
рого диапазона:
Листинг 3.30: Пример использования спискового включения с вложенными цик-
лами
1
2
3
# Создаем все пары (i, j) для 1 в [0,1] и j в [0,1]
pairs = [(i, j) for i in range(2) for j in range(2)]
print(pairs) 4 Вы. [(0, 0), (0, 1), (1, 0), (1, 1)]
Также списковые включения можно использовать во вложенных струк-
турах данных, таких как списки списков. Например, можно создать список,
содержащий квадраты чисел из вложенного списка.
Листинг 3.31: Пример использования спискового включения во вложенных
структурах данных
1
2
3
4
5
4 Создаем список списков чисел
х = [[1, 2, 3] , [4,5, 6]]
# Создаем список списков квадратов чисел
у = [[i**2 for i in sublist] for sublist in x]
print(y) # Вывод: [[1, 4, 9], [16, 25, 36]]
Отметим, что можно использовать множественные условные операторы
if в списковых включениях. Например, можно создать список, содержащий
числа от 0 до 20. которые кратны 2 и 3:
Листинг 3.32: Пример использования множественных условных операторов
в списковых включениях
1 # Создаем список чисел кратных 2 и 3 из диапазона от*-»
—> 0 до 20
2 nuins = [х for х in range (21) if x 7. 2 == 0 if x 7, 3 н
== 0]
з print(nuns) # Вы од [0, 6, 12, 18]
3.5.2. Множественные включения
Множественные включения (set comprehensions) в Python это
компактный способ создания множеств (коллекций уникальных, неупорядочен-
ных элементов) с использованием синтаксиса, аналогичного списковым включе-
ниям. Отличия — фигурные скобки { } и автоматическое удаление дубликатов.
Создадим множество из уникальных символов строки
"Hello MGIMO-University" с помощью множественного включения.
Листинг 3.33: Пример создания множества с использованием множественного
включения
1 # Создаем множество из уникальных символов строки
2 unique_chars = {char for char in "Hello
w MGIMO - University " }
з print(unique_chars)
4 # Вывод: {’s’, ’№, ’v’, ’y’, ’O’, ’ ’, ’H’, ’«-3
—> n’, ’!’, ’U’ , ’G’, ’t’, ’o’, ’r’, ’1’, ’e’}
5 # (порядок может меняться)
Создадим множество уникальных четных чисел из списка с помощью
множественного включения
Листинг 3.34: Пример использования множественного включения с условным
оператором
1 # Создаем список чисел
2 3 nums = [ 1 , # Создаем 2, 2, 3, 4, 4, 5] множество уникальных четных чисел из списке-
4 а evens = {х for X in nums if х 7, 2 == 0}
5 print(evens) # # Вывод: {2, 4}
Заменим отрицательные числа из списка на 0 и удалим дубликаты
с помощью множественного включения.
Листинг 3.35: Пример использования множественного включения с тернарным
оператором
1 # Создаем список чисел
2 nums = [-2, -1, 0, 1, 1, -2]
з # Заменяем отрицательные числа на 0 и удаляем дублике^
=—> аты
4 processed = {х if х >= 0 else 0 for х in nums}
s print(processed)
в # Чывод: {0, 1}
3.5.3. Словарные включения
Словарные включения (dictionary comprehensions) в Python это
компактный и производительный способ создания словарей с использованием
синтаксиса, похожего на списковые включения. Они позволяют создавать сло-
вари в одну строку, объединяя циклы, условные операторы и выражения.
Словарные включения имеет следующий синтаксис: начинается с фигур-
ной скобки, за которой следует выражение для ключа и значения, разделенные
двоеточием, и затем цикл for, возможно, с условным оператором if
Листинг 3.36: Синтаксис словарных включений
—
1 {<ключ выражением <значение выражение> for <перемен<-^
е—> ная> in <итерируемый> if <уславие>}
• <ключ выражение> определяет ключ для каждого элемента в словаре.
• оначение выражение> определяет значение для каждого ключа.
• <переменная> принимает значение каждого элемента из итерируемого
объекта.
• <итерируемый> — это любой итерируемый объект, например список, кор-
теж, множество и т. д.
• <условие> это необязательная часть, которая позволяет фильтро-
вать элементы итерируемого объекта. Если условие выполняется, элемент
включается в словарь.
Создадим словарь, в котором ключами будут числа из списка, а значе-
ниями — их квадраты.
Листинг 3.37: Создание словаря с помощью словарного включения
1 # Создаем список чисел
2 numbers = [1, 2, 3, 4, 5]
з # Создаем словарь, в кот -рс и ключами будут числа, а <—»
> значениями их квадраты
4 squared_dict = {х: х**2 for х in numbers}
s print(squared_dict)
ъ H Вывод: {!• 1, 2: 4, 3: 9, 4: 16, 5; 25}
Если дополнительно будем выбирать только четные числа из списка
numbers в качестве ключей словаря, то нам потребуется добавить условие
в словарное включение.
Листинг 3.38: Создание словаря с помощью словарного включения с условием
—
1 # Создаем список, чисел
2 numbers = [1, 2, 3, 4, 5]
з # Создаем словар:., в котором ключами будут четные чи<—>
—? ела, а значениями их квадраты
4 squared_dict = {х: х**2 for х in numbers if х X 2 н
== 0}
s print(squared_dict)
в я Вывод: {2: 4, 4: 16}
Словарные включения позволяют удобно и лаконично создавать словари
на основе существующих данных, выполняя преобразования и фильтрацию по
необходимости
§3.6. Обработка исключений
Исключения (exceptions) это ошибки, которые могут возникнуть
во время выполнения программы. Они могут быть вызваны различными при-
чинами, такими как деление на ноль, обращение к несуществующему элементу
списка и т. д.
Обработка исключений в Python является важным механизмом для
управления ошибками, которые могут возникнуть во время выполнения про-
граммы. Она позволяет разработчикам предвидеть возможные ошибки и обра-
батывать их так, чтобы программа могла продолжить работу или завершиться
корректно.
Таблица 3.1 содержит список распространенных исключений в Python.
Таблица 3.1: Распространенные исключения в Python
Исключение Описание
BaseException Базовый класс для всех исключений
Exception Базовый класс для всех стандартных исключений
ArithmeticError Базовый класс для всех арифметических ошибок
OverflowError Выход за пределы диапазона представления чисел
Исключение Описание
Float ingPoint.Error Ошибка с плавающей точкой
SystcmExit Выход из программы
Keyboardinterrupt Прерывание программы пользователем
GeneratorExit Завершение генератора
ZeroDivisionError Деление па ноль
NameError Переменная не определена
TypeError Операция применена к объекту неверного типа
ValucError Функция получает аргумент правильного типа, ио некорректного значения
IndexError Индекс вне диапазона
KeyError Ключ по найден в словаре
Основной конструкцией для обработки исключений является блок
try-except. Синтаксис обработки исключений представлен в листинге 3.39.
Листинг 3.39: Синтаксис обработки исключений
1
2
3
4
5
6
7
8
9
10
11
12
try :
«блок, где может возникнуть исключение:*
except «Исключением as е:
•«обработка Исключениям
except (<Исключение2'> , <ИсключениеЗ>) as е:
«обработка нескольких типов исключений:*
except:
«обработка любых исключений (не рекомендуется бее-*
•-> з явного указания типа)>
else:
«блок, выполняемый если исключений не было*
f inally:
«блок, выполняющийся в любом случае, после try, <-
> либо после except>
Объясним основные части синтаксиса обработки исключений
• try — блок, где выполняется код, который может вызвать исключение.
Если в блоке try происходит ошибка (исключение), выполнение преры-
вается и управление передается ближайшему подходящему блоку except
Если ошибок пет, все except пропускаются и выполняется блок el зе (если
присутствует), затем finally (если присутствует).
• except <Исключение> as е — блок, в котором обрабатывается исключе-
ние, если оно произошло. Здесь е это объект исключения, который
можно использовать для получения информации об ошибке. Обработчик
может либо заглушить исключение (не возвращая его дальше), либо пе-
ребросить (raise или raise е). Рекомендуется перехватывать только те
исключения, которые ожидаются и можно корректно обработать.
• except без указания типа блок, который обрабатывает любые исклю-
чения, по попавшие в предыдущие блоки except.
• else блок, который выполняется, если исключение в блоке try не про-
изошло. Полезен для кода, который должен выполняться, только если не
произошло ошибки, отделяя его от обработчиков исключений.
• finally — блок, который выполняется в любом случае после блоков
try/except/else, независимо от того, произошло исключение или нет.
Используется дтя освобождения ресурсов: закрытие файлов, сетевых со-
единений, откат транзакций и т. д.
Рассмотрим пример обработки исключения, которое может возникнуть
при делении шт поль.
Листинг 3.40: Пример обработки исключений
/
1 # Пример обработки исключений
2 try:
з х = 10 / О
4 except ZeroDivisionError
о print("Деление на ноль")
в else :
? print("Результат, х)
s finally:
s рг!пт("Блок finally")
ю 7 Вывод:
11 # Деление на ноль
12 # Блок finally
В этом примере, если произойдет ошибка долепим на ноль, то будет выве-
дено сообщение "Деление на ноль". Блок finally выполнится в любом случае,
независимо от того, произошла ошибка или нет.
Исключение может возникнуть при попытке преобразовать элементы
списка в целые числа.
Листинг 3.41: Обработка исключений при преобразовании элементов списка
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Задаем список
numbers = ["1", "2", "three", "4", "десять"]
# Пробуем преобразовать элементы списка
for n in numbers:
try :
# Пробуем напечатать преобразованный в числом—>
гэ элемент
print (i nt (n))
except ValueError:
print(f"Ошибка невозможно преобразовать ’<-»
«-> {n} ’ в число")
# Вывод.
а 1
# 2
# Ошибка, невозможно преобразовать ’three’ в число
# 4
# Ошибка: невозможно преобразовать ’десять’ в число
В данном примере, если элемент не может быть преобразован в число,
то будет выведено сообщение об ошибке.
При этом рассмотренный пример можно улучшить, составив список
успешно преобразованных значений и список ошибок.
Листинг 3.42: Улучшенная обработка исключений при преобразовании элемен-
тов списка
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Я Задаем список
data = ["1", ”2", "three", "4", "десять"]
# Создаем пустой список для успешно преобразованных <-»
значений
numbers = []
# Создаем пустой список для ошибок
errors = []
# Пробуем преобразовать элементы списка
for item in data:
try :
# Пробуем преобразовать элемент в число
numbers.append(int(item))
except ValueError:
# Если преобразование невозможно, добавляем t-
«-> элемент в список ошибок
errors.append(item)
print("Успешно преобразованные числа:", numbers)
print("Ошибки преобразования:", errors)
Я Вывод:
# Успешно преобразованные числа; [1, 2, 4]
» Сшибки преобразования: [’three’, ’десять’]
Распространенная ситуация, когда необходимо обрабатывать несколько
исключений. Рассмотрим пример обработки нескольких исключений.
Листинг 3.43: Обработка нескольких исключений
—
1 я Задаем список
2 values = [10, "пять", 0, 3.14, None, "NaN"J
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Пробуем преобразовать элементы списка
for value in values:
try :
result = 100 / int(value)
printCf"100 / {value} = {result}")
except ValueError.
print(f"0_ибка: невозможно преобразовать ’<->
<-> {value}’ в число")
except TypeError:
print(f"Ошибка тип ’ {type ( value )} ’ не поддев—’
<-> рживается")
except ZeroDivisionError'
print("Ошибка• деление на ноль невозможно")
# Вывод:
# 100 / 10 = 10.0
# Ошибка: невозможно преобразовать ’пять’ в число
# Ошибка: деление на ноль невозможно
# 100 /3.14- 31.83093861837906
# Ошибка: тип ’<class ’NoneType’>’ не поддерживается
# Ошибка: невозможно преобразовать ’NaN’ в число
Другой способ для генерации исключений в Python использует опера-
тор raise. Он позволяет вручную вызвать исключение, когда это необходимо.
Основной синтаксис выглядит следующим образом:
Листинг 3.44: Синтаксис оператора raise
1 raise <тип исключения>(<ссобщение>)
• <тип исключения> это тип исключения, которое нужно вызвать.
• <сообщение> это сообщение, которое будет выводиться при вызове ис-
ключения.
Рассмотрим пример использования оператора raise в условных опера-
торах.
Листинг 3.45: Обработка исключения с помощью оператора raise
—
1 3 Задаем озраст
2 age = 17
з % Проверяем возраст
4 if age < 18:
s raise ValueError("Доступ запрещен для лиц мл<—'
<-> адше 18 лет")
в else :
7 print("Доступ разрешен")
s # Вывод:
о # Доступ запрещен для лиц младше 18 лет
В данном примере, если возрас т меньше 18 лет, то вызываегся исключе-
ние ValueError с сообщением "Доступ запрещен для лиц младше 18 лет".
Таким образом, чтобы вернуть исключение, можно использовать опера-
тор raise с. нужным типом исключения и сообщением об ошибке.
Контрольные вопросы
1. Какой символ используется для обозначения начала блока кода в условном
операторе?
2. Что такое логическое выражение в контексте условного оператора?
3. Какие значения в Python считаются ложными (falsy)?
4. В чем разница между операторами if-else и if-clif-else?
5. Можно ли использовать несколько условий elif в одной конструкции?
6. Обязательно ли использовать блок else в условной конструкции?
7. Что такое вложенные условные операторы?
8. Как записать условный оператор в одну строку (тернарный оператор)?
9. Какие логические операторы можно использовать в условиях?
10. Что произойдет, если в условии использовать оператор присваивания вме-
сто сравнения?
И. Для чего предназначен цикл fur в Python?
12. Какие типы данных можно использоват ь в цикле for?
13. Что такое итерируемый объект?
14. Как получить индекс элемента при итерации по списку?
15. Для чего используется функция range() в цикле for?
16. Какие параметры принимает функция range()?
17. Как перебрать элементы словаря с помощью цикла for?
18. Что такое распаковка в цикле for?
19. Можно ли изменять список во время итерации но нему?
20. Как перебрать несколько последовательностей одновременно?
21. В каких случаях используется цикл while?
22. Что такое бесконечный цикл и как его избежать?
23. В чем разница между циклами for и while?
24. Можно ли использовать блик else с циклом while?
25. Как реализовать цикл while в Python?
26. Что нужно обязательно изменять внутри цикла while?
27. Какие условия могут привести к бесконечному циклу?
28. Для чего используется оператор pass?
29. В каких ситуациях необходим оператор pass?
30. Что делает оператор break?
31. Влияет ли break на внешние циклы при вложенных циклах?
32. Для чего используется оператор continue?
33. В чем разница между break и continue?
34. Что происходит с блоком else цикла при использовании break?
35. Что происходит с блоком else цикла при использовании continue?
36. Можно ли использовать break и continue вне циклов?
37. Как досрочно завершить выполнение вложенных циклов?
38. Что такое списковое включение (list comprehension)?
39. Какой синтаксис используется для создания спискового включения?
40. В чем преимущества списковых включений перед обычными циклами?
41. Можно ли использовать условие в списковом включении?
42. Где размешается условие фильтрации в списковом включении?
43. Что такое вложенные списковые включения?
44. Как создать словарное включение (diet comprehension)?
45. Что такое множественное включение (set comprehension)?
46. Когда следует использовать списковое включение, а когда обычные цик-
лы?
47. Можно ли использовать несколько циклов for в одном списковом включе-
нии?
48. Как обработать вложенные структуры данных с помощью включений?
49. Что такое исключение в Python?
50. Какая конструкция используется для обработки исключений?
51. В чем разница между блоками try и except?
52. Можно ли использовать несколько блоков except?
53. Для чего используется блок else в обработке исключений?
54. Когда выполняется блок finally?
55. Что такое иерархия исключений в Python?
56. Какое исключение является базовым для всех исключений?
57. Как получить информацию об исключении в блоке except?
58. Что делает оператор raise?
59. Можно ли создавать собственные типы исключений?
60. Что такое цепочка исключений (exception chaining)?
61. Какие встроенные исключения наиболее часто встречаются?
62. Что происходит с необработанным исключением?
63. Как повторно возбудить исключение в блоке except?
64. В каких случаях следует использовать обработку исключений?
65. Что такое контекстные менеджеры и как они связаны с исключениями?
66. Можно ли перехватить все исключения одним блоком except?
67. Почему не рекомендуется перехватывать все исключения?
68. Как правильно легировать исключения?
69. Напишите код. который проверяет, является ли число четным или нечет-
ным.
70. Как найти все четные числа от 1 до 100 с помощью генератора списков?
71. Какой тин цикла лучше использовать для чтения файла построчно?
72. Как безопасно преобразовать строку в число с обработкой исключений?
73. Напишите генератор списков для создания списка квадратов нечетных
чисел.
74. Как организовать меню программы с использованием цикла while?
75. В каких случаях использование блока finally критически важно?
76. Как правильно обработать ситуацию деления на ноль?
Практикум: Условные операторы и циклы
В этом практикуме вы создадите несколько программ, которые использу-
ют условные операторы и циклы. Вы также научитесь использовать операторы
break и continue для управления выполнением циклов.
Упражнения
Условные операторы
1. Дано число. Проверьте, положительное оно, отрицательное или ноль.
2. Дапо число. Проверьте, является ли число четным. Если число четное,
вывести ’Четное', иначе Нечетное’.
3. Даны два числа. Вывести большее из них. Если два числаравны, вывести
’Числа равны’, иначе — вывести большее 'из них.
4. Дано целое число. Определите, является ли число трехзначным.
5. Дапо число. Проверьте, кратно ли число 7.
G. Дано число. Определите, делится ли число на 2 и не делится ли па 3
одновременно.
7. Даны три числа. Определите знак произведения трех чисел.
8. Дапо число. Проверьте, лежит ли число в интервале от -5 до 3. Если число
больше -5 и меньше 3, вывести ’Число в диапазоне’, иначе — ’Число вне
диапазона ’.
9. Дано целое число. Определите, является ли число отрицательным и чет-
ным одновременно. Если число отрицательное и четное, вывести ’Отри-
цательное четное’, если отрицательное и нечетное ’Отрицательное
нечетное’, если неотрицательное — 'Неотрицательное’.
10. Дана строка. Проверьте, начинается ли строка с русской буквы ’А’.
И. Дана строка. Проверьте, является ли первая буква строки заглавной.
12. Дапгт строка. Определите, оканчивается ли строка па точку.
13. Дана строка. Проверьте, является ли строка пустой.
14. Дана строка. Проверьте, содержит ли строка пробелы.
15. Дана строка. Проверьте, состоит ли строка только из цифр.
16. Дана строка. Проверьте, является ли строка палиндромом. Если стро-
ка читается одинаково слева направо и справа налево, вывести ’Палин-
дром иначе — 'Не палиндром ’.
17. Дан список. Определите, равны ли первый и последний элементы списка.
18. Дан список. Определите, есть ли в списке хотя бы один элемент.
19. Дан кортеж, содержащий числа. Проверьте, содержит ли кортеж значе-
ние 7. Вывест и 'Семерка найдена ’, иначе ’Семерка отсутствует'.
20. Дан список из пяти чисел. Определите, является ли элемент с индексом 2
четным числом. Если элемент на индексе 2 в списке четный, вывести
’Четное’, иначе. — ’Нечетное’.
21. Определите, является ли прямоугольник квадратом.
22. Определите, лежит ли точка с координатами (х, у) в первой четверти ко-
ординатной плоскости.
23. Проверьте, может ли существовать треугольник с заданными сторонами.
24. Проверьте, лежит ли точка внутри круга радиуса В с центром в начало
координат.
25. Проверьте, является ли введенный пользователем символ гласной буквой
(для русского алфавита).
26. Проверьте, состоит ли строка только из заглавных букв.
27. Определите, лежит ли точка внутри прямоугольника с заданными коор-
динатами углов.
28. Проверьте, является ли треугольник прямоугольным.
29. Проверьте, образуют ли три числа арифметическую прогрессию.
30. Проверьте, является ли число автоморфным (его квадрат оканчивается
этим же числом).
31. Проверьте, все ли цифры числа, введенного пользователем, различны.
Подсказка: используйте функцию se£().
32. Проворьте, является ли сумма первой и последней цифры числа, введен-
ного иолы зо вате л см, четной.
33. Дано положительное четырехзначное число. Проверьте, равна ли сумма
первой и последней цифры произведению средних цифр.
34. Напишите программу, которая принимает возраст человека и определяет,
к какой возрастной категории он относится:
• 0 2: младенец
• 3 6: дошкольник
• 7 17: школьник
• 18 22: студент
• 23 60: работник
• 61+: пенсионер
При этом возраст не может быть отрицательным.
Циклы и включения
35. Выведите числа от 1 до 10.
36. Выведите все четные числа от 2 до 20.
37. Выведите все числа от 1 до 10 в обратном порядке.
3(8. Выведите сумму чисел от 1 до 100.
39. Выведите сумму всех нечетных чисел от 1 до 50.
40. Выведите произведение чисел от 1 до 10.
41. Выведите квадраты чисел от 1 до 10.
42. Выведите таблицу умножения на 5.
43. Выведите все буквы строки ’Python’ ио одной в строке.
44. Подсчитайте количество букв 'а' в строке 'Ананас’ используя циклы.
45. Подсчитайте количество цифр в строке ’Python 3.9’.
4G. Выведите символы строки Python" в обратном порядке.
47. Создайте список, содержащий квадраты чисел от 1 до 10.
48. Выведите все числа от 1 до 100, которые делятся на 7.
49. Выведите все числа от 1 до 100, пропуская числа, которые делятся на 5.
50. Найдите все числа от 1 до 50. которые делятся на 3 и 5.
51. Создайте список из всех делителей числа 36.
52. Создайте список с квадратами нечетных чисел от 1 до 20.
53. Найдите сумму квадратов чисел от 1 до 20.
54. Найдите сумму первых 10 натуральных чисел, кратных 3.
55. Найдите все двузначные числа, сумма цифр которых равна 8.
56. Подсчитайте количество гласных и согласных в строке.
57. Найдите наибольший общий делитель двух чисел.
58. Выведите первые 10 чисел последовательности Фибоначчи.
59. Проверьте, является ли число палиндромом.
60. Подсчитайте сумму цифр числа 12345.
61. Выведите каждый второй символ строки ’abedef’.
62. Найдите сумму всех элементов списка |1. 2, 3, 4, 5| не используя функцию
зит^.
63. Создайте новый список, содержащий только четные числа из списка 11, 2,
3, 4, 5. 6, 7, 8, 9, 10].
64. Вычислите произведение всех чисел в списке [1, 3, 5. 7, 9].
65. Вычислите сумму всех чисел в двумерном списке |[1, 2]. [3, 4], [5, 6]|.
66. Найдите сумму всех нечетных чисел в строке ’Ia2b3c4d5c6f7g8h9i‘.
67. Найдите факториал числа 10.
68. Вывесдите все гласные в строке ’Hello World’.
69. Подсчитайте, сколько раз встречается слово ’apple' в списке [ apple’,
‘banana1, ’apple1, ’orange1].
70. Создайте список, содержащий строки, длина которых больше трех симво-
лов. в списке [’cat’, ’elephant’, ’dog’, ’mouse’].
71. Выведите первый символ каждого слова в строке Hello World from
Python1.
72. Составьте строку, состоящую из первых букв каждого слова в строке
Python is great’.
73. Создайте строку, состоящую из первых трех букв каждого слова в строке
'I love programming'.
74. Сформируйте список, содержащий только те элементы, которые начина-
ются на букву 'а' в строке ’apple, banana, avocado’.
75. Выведите вес элементы списка [1, 5, 3, 5, 7, 5, 9, 5, 5], за исключением
числа 5.
76. Найдите минимальное и максимальное число в списке |3, 5, 1, 8, 9, 2], не
используя функции min () и тот().
77. Посчитайте количество чисел в списке |1. 6. 3. 7. 8. 2. 10]. которые боль-
ше 5.
78. Найдите самую длинную последовательность одинаковых символов
в строке ’aabbbccccdddd’.
79. Найти наибольшее число в списке [2, 3, 5, 7, 8. 10, 13], которое меньше 10.
80. Создайте список, содержащий все буквы из строки 'python programming1,
которые встречаются больше одного раза.
81. Найдите все простые числа до заданного числа (решето Эратосфена).
82. Найдите все совершенные числа до 1000 (число называется совершенным,
если оно равно сумме своих делителей).
83. Выведите числа Армстронга до 100О (сумма цифр в степени количества
цифр равна самому числу).
84. Найдите все числа Харшад (делятся на сумму своих цифр) до 1000.
85. Проверьте, является ли число автоморфным (квадрат числа оканчивается
самим числом).
86. Найдите все числа-палиндромы, которые при возведении в квадрат дают
палиндром.
87. Создайте список квадратов чисел or 1 до 10.
88. Создайте список только четных чисел от 0 до 20.
89. Дан список строк ['hello’, python’. !codc’|. Создайте новый список, где каж-
дая строка продублирована (например, из ’hello’ получается ’hellohello').
90. Дан список слов [python’, ’java’, javascript’, ’css’|. Создайте список, содер-
жащий длину каждого слова.
91. Дапо слово 'python'. Создайте список, состоящий из букв этого слова
в верхнем регистре.
92. Создайте список кортежей, где каждый кортеж содержит число и его
квадрат для чисел от 1 до 5.
93. Дан список строк ['cat’, dog’, ’elephant’, ’bee’, ’butterfly’]. Создайте но-
вый список, содержащий только те строки, длина которых больше трех
символов.
94. Создайте список всех чисел от 1 до 30. которые делятся либо на 3, либо
па 5.
95. Дан список [0, 10. 20, 25. 30| температур по Цельсию. Преобразуйте их
в температуры но Фаренгейту.
96. Дапо предложение Python is a great programming language’. Создайте спи-
сок из первых букв каждого слова (только для непустых слов).
97. Дана строка 'python'. Создайте список всех возможных подстрок длины 2.
98. Дан список дат [’2024-03-01", '2024-03-15', ’2024-04-0Г| в формате ’YYYY-
MM-DD’. Преобразуйте их в список кортежей (год, месяц, день).
99. Дапо предложение ’Python programming is very interesting’. Создайте спи-
сок слов, которые содержат хотя бы одну гласную букву.
100. Найдите все числа-палиндромы в диапазоне от 100 до 1000.
101. Дан список чисел [1, 2, 3. 4, 5]. Создайте список, содержащий суммы каж-
дой пары соседних элементов.
102. Дан список строк [’contact@ex&mple.coin’( 'python.org'. 'user@niail.coin’,
'no-rcply@sitc.com’, ’invalid.email’|. Извлеките из него все email адреса
(строки, содержащие символ ’@’).
103. Создайте список всех дат определенного месяца (например, март 2024)
в формате ’YYYY-MM-DD’.
104. Среди чисел от 1 до 20 найдите все упорядоченные тройки (л,Ь, с) чисел,
для которых выполняется равенство а2 + Ъ2 — с2.
Заключение
В дайной главе мы рассмотрели условные операторы, никлы, генерато-
ры списков, словарей и множеств, а также обработку исключений в Python.
Эти конструкции являются основой для создания сложных программ и позво-
ляют эффективно управлять потоком выполнения кода. Понимание и умение
использовать эти инструменты поможет вам писать более гибкие и надежные
программы.
Глава 4. Повторное использование кода
Повторное использование кода ^code reuse) — ключевой принцип раз-
работки программного обеспечения, повышающий эффективность, надежность
и поддсрживасмость проектов. В Python это реализуется прежде всего через
функции, модули, пакеты, объектно-ориентированное программирование, а так-
же* инструменты документации и тестирования.
В данной главе мы рассмотрим, как организовать код в функции и моду-
ли, чтобы избежать дуб лирования и сделать код более читаемым и поддержива-
емым. Мы также обсудим, как использовать встроенные функции и библиотеки
Python для выполнения различных задач.
§4.1 . Функции
Функция в Python это блок кода, который выполняет определенную
задачу и может быть вызван многократно, функциии помогают структуриро-
вать код, делая его более читаемым и по,одерживаемым. Они позволяют разбить
программу на логические части, которые можно использовать повторно.
Код функции отвечает за решение определенной задачи: например,
в игре «Тетрис» будут отдельные функции доя подсчета очков, рисования иг-
рового поля, движения фигурки и так далее.
Обычно функции определяют в начале файла, чтобы они были доступны
для использования в любом месте программы.
Выделим ключевые особенности функций в Python.
• Функция выполняется только тогда, когда се вызывает основная програм-
ма.
• Функции могут иметь параметры.
• В функцию можно передавать различные данные, то есть аргументы
• Функция может формировать некоторое возвращаемое значение.
• Функции могут передавать результаты своей работы в основную програм-
му или в другие функции.
• Функции могут вызывать другие функции, рекурсивно вызывать себя.
• Функции могут иметь документацию (docstring), описывающую их назна-
чение и использование.
• Функции могут быть встроенными (например, print О) или пользователь-
скими (определенными пользователем).
Параметры это переменные, которые используются при объявлении
функции.
Аргументы фактические значения, которые передаются переменным
при вызове функции.
4.1.1. Определение функции
Для создания функции в Python используется ключевое слово def (от ан-
гл. detine определять), за которым следует имя функции и список параметров
в круглых скобках. Если их (параметров) нет. то скобки остаются пустыми, по
они обязательно должны быть. Далее идет двоеточие, обозначающее окончание
заголовка функции. Затем идет обязательный блок кода (тело функции), кото-
рый будет выполнять определенную задачу при вызове функции. Обязательный
блок кода должен быть выделен с помощью четырех пробелов.
Листинг 4.1: Синтаксис создания функции
I*
1 def <имя функции>([<параметры>])
2 [."""строка документации (docstring)"""]
з <6лок кода> г т< тс функции
4 [return <возвращаемый результат:»]
• <имя функции>: имя функции, которое должно быть уникальным в преде-
лах модуля.
• <параметры>: список параметров, разделенных запятыми, которые функ-
ция ожидает принять при вызове. Они указывают на то. какие данные
она будет обрабатывать.
• «блок кода>. код. который будет выполнен при вызове функции
• «возвращаемый результата значение, которое функция возвращает при
завершении.
При объявлении функции в квадратных скобках указаны необязатель-
ные элементы. Необязательная строка документации (docstring) нужна для опи-
сания того, что делает функция. Каждая строка в теле функции выделена от-
ступом. обычно используют четыре пробела. Для того чтобы отделить ло1 иче-
ские блоки кода, можно использовать пустые строки. Обычно после окончания
тела функции добавляют пустую строку.
При определении функции важно учитывать следующие принципы:
• «имя функциях имя функции должно быть глаголом и отражать выпол-
няемую задачу.
• <параметры>: параметры функции должны быть четко определены и до-
ку менти рован ы.
• «блок кодах тело функции должно быть [акопичны.м и сосредоточенным
на решении одной задачи.
• «возвращаемый результатХ функция должна возвращать значение, если
это необходимо, и явно указывать, что опа возвращает.
Замечание 20. Обратите внимание, что в Python функции могут быть опреде-
лены в любом месте программы, но обычно их определяют в начале файла. При
проектировании функций важно учитывать следующие аспекты:
• Важно следовать принципам проектирования функций, чтобы обеспечить
их читаемость и удобство использования.
• Каждая функция должна иметь четко определенные входные и выходные
параметры.
• Правила для записи имени функции такие же, как и для перемен-
ных: имя может содержать строчные буквы английского алфавита, цифры
и знаки подчеркивания
• Тело функции содержит код, который работает с аргументами и внеш-
ними переменными, а затем возвращает результат с помощью оператора
return,
• Тело функции не может быть пустым — это приведет к сообщению об
ошибке. Если по какой-то причине нужно оставить тело функции пустым,
используют оператор pass, который выступает в роли заглушки.
• Возвращаемый результат должен быть четко определен и документи-
рован.
• Функция в Python всегда возвращает результат, даже если в ней нет
return или присутствует return без возвращаемого значения. Тогда воз-
вращаемый результат будет Копе
• Документация функции должна быть написана в виде строки докумен-
тации (docstring) и описывать ее поведение, параметры и возвращаемое
значение.
• Функции могут быть вложенными, то есть определяться внутри других
функций Это позволяет создавать более сложные структуры и использо-
вать функции как объекты первого класса.
• При определении функции можно использовать аннотации типов для
параметров и возвращаемого значения, что позволяет улучшить чита-
емость кода и облегчить его поддержку. Аннотация чипов указывается
с помощью символа двоеточия (:) после имени параметра для указания
его типа и стрелки (->) после закрывающей скобки, но перед двоеточием
для указания типа возвращаемого значения. Важно помнить, что аннота-
ции типов не влияют на выполнение программы — Python нс проверяет
автоматически соответствие типов во время выполнения, и они служат
в первую очередь для документации. Однако они крайне полезны для
статического анализа кода с помощью инструментов вроде туру, а также
для улучшения автодоиолнения и подсказок в современных IDE.
Если при проектировании функций нужно определить структуру функ-
ции, но реализация еще не готова, может быть полезна «временная заглушка»,
реализованная либо с помощью оператора pass, либо . .. (троегочия). Это поз-
воляет избежать ошибок при вызове функции, которая еще не реализована,
и продолжить разработку других частей программы. Правила для записи за-
глушки такие же, как и для тела функции: отступы должны быть соблюдены,
а код должен быть корректным. Предпочтительным является использование
оператора pass, так как оп явно указывает на то. что функция нс реализована.
Листинг 4.2: Пример функции-заглушки
1 def my_function О:
pass
4.1.2. Вызов функции
Для вызова функции пишут се имя и круглые скобки. В скобках ука-
зывают аргументы, которые передаются в функцию. В случае если функция
выполняет какое-либо действие, например печать, и не возвращает пи одного
значения, то для сс вывода достаточно указать се имя. Если же она возвращает
значение, то это значение необходимо присвоить переменной.
Рассмотрим пример простейшей функции, которая не получает и не воз-
вращает никаких данных просто выполняет одну команду по выводу строки
с приветствием.
Листинг 4.3: Пример функции без параметров и возвращаемого значения
I # Определяем функцию
г def my_function ():
з print("Hello, MGIMO University!")
Для вызова такой функции достаточно написать се имя после того, как
она была определена.
Листиш 4.4: Вызов функции без параметров и возвращаемого значения
# Определяем функцию
def my.function ():
print("Hello, MGIMO University!")
# Вызываем функцию
my.function()
# Вывод: Hello, MGIMO University!
Приведем пример простейшей функции, которая принимает аргумент
и не возвращает значение.
Листинг 4.5: Прим-ер функции с аргументом и без возвращаемого значения
1 # Определяем функцию
2 def my.function(name):
з print(f"Hello , {name}!")
s # Вызываем функцию
e my_function("MGIML University")
7 # Вывод: Hello, MGIMO University!
При вызове функция my .function О получает аргумент "MGIMO
University", который используется внутри функции, присваивается перемен-
ной name и выводится на экран.
При вызове функция ожидает получить набор аргументов (значений), со-
ответствующий числу параметров. Например, функция my_f unctionO должна
получить при вызове два аргумента имя и фамилию.
Листинг 4.6: Пример функции с несколькими аргументами
/
1 » Определяем функцию
2 def my_function(name, lastname):
з print(f’Добрый день, {name} {lastname}!’)
# Вызываем функцию
my_function("Александр" , "Лата")
# Вывод: Добрый день, Александр Лата!
Отметим, что при вызове функции необходимо передавать аргументы
в том порядке, в котором они определены в параметрах функции. Если чис-
ло аргументов окажется меньше числа параметров, то возникнет ошибка
ТуреЕггог.
Вызов функции можно совмещать с другими операциями.
Листинг 4.7: Пример вызова функции с арифметическими операциями
1 - Определяем функцию
2 def add_nutrbers (а, b) :
з return а + b
4
з # Вызываем функцию и совмещаем с арифметической :пер<->
—> ацией
в result = add_numbers(5, 10) * 2
7
8 # Выводим результат
a print(result) я Buj ; 30
Функции можно вызывать несколько раз, передавая им разные аргумен-
ты.
Листинг 4.8: Приме}) многократного вызова функции
1
2
3
4
5
6
# Определяем функцию
def add_numbers(а , b) :
return а + b
# Вызываем функцию с разными аргументами
print ( add_nuir.bers (5 , 10))
7
8
9
10
print(add.numbers (20 , 30))
# Вывод:
# 15
# 50
Функции могут вызываться рекурсивно, то сеть функция может вызы-
вать саму себя. Это позволяет решать задачи, которые можно разбить на более
простые подзадачи. Рассмотрим пример рекурсивной функции, которая вычис-
ляет факториал числа.
Листинг 4.9: Пример рекурсивной функции для вычисления факториала
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
й Определяем рекурсивную функцию
def factorial (n):
"""Вычисляет факториал неотрицательного целого ч<-^
исла п. '....
# Базовый случай: факториал 0 равен 1
if п == 0:
return 1
elif n < 0
raise ValueError("Факториал не определен длян
<-> отрицательных чисел")
elif is instance(n , float):
raise TypeErrcr("Факториал не определен для <—>
вещественных чисел")
# Рекурсивный случай: п! = п * (п-1)!
else :
return п * factorial(n -1)
# Вызываем функцию
print(factorial (5))
# Вывод. 120
Обратите внимание, что в этом примере функция factorial О вызывает
саму себя с уменьшенным значением п. По мере достижения базового случая
(когда и становится равным 0) рекурсия прекращается, и функция возвращает
значение 1. Если передать в функцию отрицательное число, то будет вызвано
исключение ValueError, гак как факториал не определен для отрицательных
чисел. Если передать в функцию вещественное число, то будет вызвано исклю-
чение ТуреЕггог, так как факториал не определен для вещественных чисел.
На практике рекурсия используется реже, чем итеративные подходы, из-
за возможных ограничений по глубине рекурсии и производительности
Функция может не использовать параметры, но получать данные от
пользователя с помощью функции input О
Листинг 4.10: Пример функции, использующей input()
1 # Определяем функцию
г def get_user_inf о О :
з name = input("Введите ваше имя: ")
4 age = input("Введите ваш возраст: ")
s return name , age
в
т # Вызываем функцию и распаковываем результат
s user.name , user_age = get_user_infо О
< print("Имя, user_name)
io print ("Возраст, user_age)
Функция get_user_info() запрашивает у пользователя его имя и воз-
раст, а затем возвращает эти значения. Функции могут быть вызваны в любом
месте программы после их определения. Если функция вызывается до се опре-
деления, то будет вызвана ошибка NameError. так как интерпретатор не знает
о существовании этой функции.
4.1.3. Возвращаемые значения
Функции могут возвращать значения с помощью ключевого слова
return Если функция не возвращает значение, то она возвращает None по
умолчанию.
Рассмотрим пример функции, которая возвращает сумму двух чисел.
Листинг 4.11: Пример функции с возвращаемым значением
1
'2.
3
<1
6
7
# Определяем функцию
def add^numbers(а, b):
return а + b
# Вызываем функцию
result = add_numbers (5 , 10)
print(result) я Вы: oj 15
Напишем функцию, которая проверяет, что список целых чисел, переда-
ваемый ей как аргумент, содержит только четные числа.
Листинг 4.12: Пример функции, проверяющей четные числа
i
2
3
4
5
6
7
8
9
10
11
12
13
14
# Определяем функцию
def are_all_even(numbers)
result = True
for x in numbers:
if x 7. 2 != 0:
result = False
break
return result
# вызываем функцию
print(are_all_even([2, 4, 6]))
# Вывод: True
print(are.all_even([1, 2, 3]))
# Вывод: False
В функциях можно использовать несколько операторов return. Первый
сработавший в геле функции оператор return остановит выполнение функции
и вернет ее значение.
Наш пример можно упростить, использовав вместо флага, result
несколько точек возврата значения.
Листинг 4.13: Упрощенная версия функции
1 я Определяем функцию
2 def are_al1_even(numbers):
з for n in numbers:
4 i f n % 2 ! = 0:
s return False
e return True
7
s » йызызаем функцию
э print(are_all_even([2, 4, 6]))
io # Вы од: True
и print(are_all_even( [1, 2, 3]))
12 # Выпод: False
Функция может возвращать сразу несколько значений. Для этого их
нужно перечислить через запятую после оператора return. После вызова функ-
ции эти значения будут по умолчанию упакованы в кортеж, который можно
распаковать в несколько переменных. Тип возвращаемого значения функции
может быть разным Его можно явно определить, возвращая объект конкрет-
ного типа после оператора return.
Добавим в функцию are_all_even() дополнительно возврат индекса
первого нечетного элемента, который встретится.
Листинг 4.14: Пример функции с несколькими возвращаемыми значениями
Z \
1 # Определяем функцию
2 def are_all_even(numbers):
з for i, n in enumerate(numbers):
4 if n 7. 2 != 0:
5 return False, i
6 return True , -1
s # Вызываем функцию
э print(are_all_even([2, 4, 6]))
ю # Вывод: (True, -1)
п print(are_all_even( [1, 2, 3J))
12 # Вывод: (False , 0)
Обратите внимание, что в данном примере функция возвращает кортеж.
Рассмотрим пример функции, которая принимает список чисел и возвра-
щает их сумму и произведение.
Листинг 4.15: Пример функции с несколькими возвращаемыми значениями
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
я Определяем функцию
def sum.and.product(numbers):
total = sum(numbers)
product = 1
for n in numbers.
product *= n
return total , product
# Вызываем функцию и распаковываем результат в две гг-»
временные
sum_result , product_resu It = sum.and.product( 12, 3,
4])
print(’Сумма чисел равна’, sum.result)
print(’Произведение чисел равно’, product_result)
# Вывод:
» Сумма чисел равна 9
# Произведение чисел равно 24
Замечание 21. Обратите внимание, что результат работы функции можно вы-
вести с помощью print() Хотя визуально вывод идентичен, па самом деле
имеются различия
• Использование return возвращает значение функции и прерывает ее ра-
боту.
• Функция print О просто выводит это значение пользователю и не влияет
па дальнейшее исполнение кода, если он есть.
4.1.4. Документация функций
4.1.5. Позиционные и именованные аргументы функции
При вызове функции аргументы передаются в круглых скобках после
со имени. Эти аргументы подставляются на места параметров, определенных
в функции.
В языке программирования Python аргументы функции могут переда-
ваться двумя основными способами позиционно и по имени.
Позиционные аргументы это аргументы, которые передаются
функции в определенном порядке, и они сопоставляются с параметрами функ-
ции на основе их позиции в вызове функции. Это означает, что первый аргумент
соответствует первому параметру, второй аргумент второму параметру, и так
далее.
Листинг 4.16: Пример функции с позиционными аргументами
# Определяем функцию def my_function(name, lastname): { lastname } ! ’ )
print(f’Добрый день, {name}
» Вызываем функцию с позиционными аргументами
mj -function("Александр", "Лата")
» □ывод: Добрый день, Александр Лата!
В данном примере функция my_f unction принимает два аргумента и под-
ставляет их в соответствующие параметры name и lastname. При вызове функ-
ции my_function(’Александр’, ’Лата’) передается значение ’Александр’
в параметр пасе и значение ’Лата’ в параметр lastname Это означает, что
порядок аргументов имеет значение и они должны быть переданы в том поряд-
ке, в котором они определены в функции. В противном случае, если порядок
аргументов будет нарушен, то функция может работать некорректно или вы-
давать ошибку. Интерпретатор Python обрабатывает позиционные аргументы
слева направо.
Именованные аргументы — это аргументы, которые передаются
функции с указанием имени параметра, которому они соответствуют. В отли-
чие от позиционных аргументов, порядок передачи именованных аргументов по
важен, так как каждый аргумент явно сопоставляется с параметром по имени.
Листинг 4.17: Пример функции с именованными аргументами
1
2
3
4
5
6
7
# Определяем функцию
def my_function(name, lastname):
print(f’Добрый день, {name} {lastname}1’)
# Вызываем функцию с именованными аргументами
my_function(lastname="Лата", пате="Александр")
# Вывод: Добрый день, Александр Лата!
В данном примере функция my_function вызывается с именованными
аргументами, что позволяет передавать их в любом порядке. При вызове функ-
ции my_function(lasrname=’)laTa’, name=’Александр’) значение ’Лата’ бу-
дет присвоено параметру lastname, а значение ’Александр’ будет присвоено
параметру name. Это позволяет избежать ошибок, связанных с неправильным
порядком аргументов, и делает код более читаемым.
Позиционные и именованные аргументы можно комбинировать в одном
вызове функции.
Листинг 4.18: Пример функции с позиционными и именованными аргументами
—
t # Определяем функцию с тремя параметрами
2 def my_function(name, lastname, patronymic=None):
з
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
“""Функция приветствует пользователя по имени, ф<—>
амилии и отчеству (если указано)."""
“""Параметры:
пате: имя пользователя
lastname: фамилия пользователя
patronymic: отчество пользователя (по умолчанию
> None)
к и н
if patronymiс:
print(f’Добрый день, {name} {patronymic} «—>
<-> {last name }! ’ )
else:
print(f’Добрый день, {паше} {lastname}!’)
# вызываем функцию с позиционными и именованными арг«—•
М1 ументами
my_function("Александр", lastname="Лата", w
раДгопуп!1с = "Николаевич")
» Вывод:
# Добрый день, Александр Николаевич Лата!
my_function("Александр" , "Лата")
# Вывод: Добрый день, Александр Лата!
В примере функция my.function принимает три параметра:
name, lastname и patronymic Параметр name является позиционным,
a lastname и patronymic являются именованными. При вызове функ-
ции my_f unction ("Александр lastiiame='^aTapatronymic="HHKoraeBH4") пе-
редаются позиционный аргумент "Александр" для параметра name, име-
нованный аргумент lastname со значением "Лата" и именованный ар-
гумент patronymic со значением "Николаевич" При вызове функции
my_function("AneKcaHflp "Лата") передаются только позиционные аргументы
"Александр" и "Лата", а параметр patronymic будет иметь значение но умол-
чанию None.
Именованные аргументы особенно полезны при работе с функциями, ко-
торые имеют множество параметров или параметры со значениями по умол-
чанию. так как они позволяют передавать значения только для необходимых
параметров, нс заботясь о порядке.
Аргументы по умолчанию — это аргументы, которые имеют значе-
ние по умолчанию, если при вызове функции нс передано значение для этого
параметра. Это позволяет сделать параметры функции необязательными и ис-
пользовать их только при необходимости.
Аргументы по умолчанию определяются при объявлении функции.
Листинг 4.19: Пример функции с несколькими аргументами ио умолчанию
1 # Определяем функцию с аргументами по умолчанию
г def conf igure_server (host , port=80, timeout=30, >
«-> max.connect i ons = 100) :
з return f"Server configured’ host={host}, ’
<—> port={port} , timeout-{ timeout} , н
"-> max. connect ions ={max_ connect ions } "
4
5 print ( conf igure, server (host = " exampl e . com'1 , <->
«-> timeout =60) )
6 it Вывод: Server configured host=example.com, P
«-> port=80, timeout=60, max_conneccions = 100
- print(configure_server(host="example com",
'-» port=8080, max_connections=200))
s # Зывод: Server configured: host=example.com, <->
=-» port=8080, timeout=30, max_connections=200
В этим примере функция configure_server имеет четыре парамет-
ра: host, port, timeout u max_connections Параметры port, timeout
и max_connections имеют значения но умолчанию, что позволяет вызы-
вать функцию без указания этих параметров. Если при вызове функции
нс передать значение для параметра, то будет использовано значение по
умолчанию, указанное при объявлении функции. Например, при вызове
conf igure_server (host="example. com timeout=60) параметр port будет иметь
значение ио умолчанию 80, а параметр max_connections будет иметь значение
ио умолчанию 100.
Позиционные и именованные аргументы представляют собой два способа
передачи аргументов в функции, которые могут использоваться как по отдель-
ности, так и в комбинации. Основная связь между ними заключается в том,
что они дополняют друг друга, предоставляя гибкость при передаче аргумен-
тов функции. Основные моменты связи между позиционными и именованными
аргументами:
1. Комбинирование в вызове функции.
• Позиционные аргументы могут быть использованы вместе с имено-
ванными аргументами в одном вызове функции.
• Позиционные аргументы должны идти первыми, а именованные ар-
гументы могут следовать за ними в любом порядке.
• При использовании как позиционных, так и именованных аргумен-
тов, позиционные аргументы должны бьпь указаны в том порядке,
в котором они определены в функции.
• Именованные аргументы могут быть указаны в любом порядке, по
должны соответствовать именам параметров функции
2. Уникальность соответствия: каждый параметр функции может полу-
чить значение только от одного аргумента. Это означает, что нельзя пе-
редавать несколько значений дтя одного параметра, даже если они пере-
даются разными способами (позиционно и по имени).
Листинг 4.20: Пример ошибки при передаче нескольких значений для
одного параметра
1
2
3
4
5
def greet(name, greeting):
return f"{greeting}, {name}!"
print(greet("Александр", name="Александр"))
# TypeError : greet() gut multiple values for <—
^3 argument ’name’
В примере функция greet принимает два параметра: name и greeting
При вызове функции передаются два значения для параметра name — од-
но позиционно и одно по имени, что приводит к ошибке ТуреЕггог.
3. Порядок разрешения аргументов: при комбинировании позиционных
и именованных аргументов, интерпретатор Python сначала сопоставляет
позиционные аргументы с параметрами в порядке их следования, а затем
сопоставляет именованные аргументы с оставшимися параметрами.
4. Дополнительные возможности В Python, начиная с версии 3.8. можно
использовать специальные символы / и * в определении функции для
более точного управления тем, как аргументы могут передаваться:
• Символ / используется для указания, что все параметры до него
должны передаваться позиционно.
Листинг 4.21: Пример использования символа / для позиционных
1
2
3
4
5
№
параметров
def f (а, b, /, с, d) :
pass
f (1, 2, c=3, d=4) # Корректно
f(a=l, b=2, c=3, d=4) # Ошибка: а и b должны передав
м- ваться позиционно
я ТуреЕггог: f() got multiple values for argument ’a’
• Символ * используется для указания, что все параметры после него
должны передаваться именованно.
Листинг 4.22: Пример использования символа * для именованных
параметров
def f(a, b, *, с, d):
pass
4 f(l, 2, с=3, d=4) # Корректно
s f (1, 2, 3, 4) # Ошибка: end должны передаваться и<-^
" т меноианно
в # TypeError: f() takes 2 positional arguments but 4
were given
Понимание связи между позиционными и именованными аргументами
помогает писать более гибкий и читаемый код, а также избегать ошибок, свя-
занных с неправильным порядком аргументов.
4.1.6. Аргументы переменной длины
Иногда необходимо передать функции переменное количество аргумен-
тов. В Python это можно сделать с помощью аргументов переменной длины,
которые обозначаются с помощью символа * для позиционных аргументов и **
для именованных аргументов.
Позиционные аргументы переменной длины обозначаются с по-
мощью символа *, который добавляется перед именем параметра переменной
длины. Эти позволяет передавать функции любое количество позиционных ар-
гументов. которые будут собраны в кортеж.
Листинг 4.23: Функция с позиционными аргументами переменной длины
2
3
4
6
7
8
9
10
# Определяем функцию с позиционными аргументами пере<—>
менной длины
def process.items(*items) :
for item in items :
print(f"Обрабатываем элемент: {item}")
process.items("apple", "banana",
# Вывод:
# Обрабатываем элемент: apple
в Обрабатываем элемент: banana
# Обрабатываем элемент: cherry
"cherry " )
В этом примере функция process.items принимает любое количество
позиционных аргументов, которые собираются в кортеж items. При вызове1
функции process.items С’apple’, ’banana’, ’cherry’), аргументы ’apple’,
’banana’ и ’cherry’ будут собраны в кортеж items и обработаны внутри функ-
ции.
Именованные аргументы переменной длины обозначаются с по-
мощью символа **, который добавляется перед именем параметра переменной
длины. Это позволяет передавать функции любое количество именованных ар-
гументов. которые будут собраны в словарь.
Листинг 4.24: Функция с именованными аргументами переменной длины
1
2
3
4
5
6
7
8
9
10
# Определяем функцию с именованными аргументами пере<—>
* —> менной длины
def print.user.infо(**user_info)
for key, value in user.info items ()
print(f"{key}: {value}")
print.user.infо(name="Александр", age=32, з—
- э city = "MocKBa")
# Вывод:
# name: Александр
# age. 32
# city: Москва
В этом примере функция print_user_inf о принимает любое количество
именованных аргументов, которые собираются в словарь user.info. При вы-
зове функции print_user_infо(name="Александр" , age=32, city=‘'MocKBa"),
аргументы name, age и city будут собраны в словарь user.info и обработаны
внутри функции.
Позиционные и именованные аргументы переменной длины могут быть
использованы вместе в одной функции. При этом позиционные аргументы
должны идти первыми, а именованные аргументы переменной длины должны
идти после них.
Листинг 4.25: Пример функции с позиционными и именованными аргументами
переменной длины
i
2
3
4
b
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Определяем функцию с позиционными и именованными а*-»
ргументами переменной длины
def process.data(data.type, *data_items, **metadata):
print(f"Data Type: {data.type}")
print("Data Items:")
for item in data.items:
print(f"- {item}")
print("Metadata:")
for key, value in metadata.items() :
print(f"{key}: {value}")
# Вызываем функцию с позиционными и именованными арг<-^
ументами переменной длины
process.data("Numbers", 1, 2, 3, source-" Sensors" , 4-^
timestamp = "2023 -10-01" )
# Вывод:
# Data Type: Numbers
# Data Items:
# - 1
a - 2
i t - 3
# Metadata:
tt source: Sensors
# timestamp: 2023-10-01
В этом примере функция process_data принимает позиционный аргу-
мент data.type, любое количество позиционных аргументов, которые собира-
ются в кортеж data.items. и любое количество именованных аргументов, кото-
рые собираются в словарь metadata. При вызове функции process.data аргу-
мент ’Numbers’ будет присвоен параметру data.type. аргументы 1. 2 и 3 будут
собраны в кортеж data.items, а именованные аргументы source и timestamp
будут собраны в словарь metadata
4.1.7. Области видимости переменных
Область видимости (scope) определяет, в каких частях программы
доступна та или иная переменная. В Python выделяют несколько областей ви-
димости: встроенную (built-in), глобальную (global), нелокальную (nonlocal)
и локальную (local). Глобальные переменные определяются на уровне модуля
и доступны из любой функции внутри него. Локальные переменные объявля-
ются внутри функции и доступны только в рамках этой функции. Нелокальные
переменные используются во вложенных функциях для обращения к перемен-
ным из окружающей (внешней) функции, не являющимся глобальными.
Понимание принципов разрешения имен переменных LEGB (Local,
Enclosing. Global, Built-in) помогает избежать ошибок, связанных с неправиль-
ным чтением и записью переменных.
• Local (Локальная): переменные, объявленные внутри текущей функ-
ции.
• Enclosing (Нелокальная): переменные из внешней функции (лля вло-
женных функций).
• Global (Глобальная)' переменные, объявленные на уровне модуля.
• Built-in (Встроенная): встроенные функции и исключения Python (на-
пример, len, str. ValueError).
При обращении к переменной интерпретатор Python ищет ее в порядке
LEGB. При присваивании значения переменной внутри функции по умолчанию
создается новая локальная переменная, если только не использованы ключевые
слова global или nonlocal
Покажем на примере, что значение параметра доступно только внутри
функции.
Листинг 4.26: Пример функции с параметрами
/
1 я Определяем функцию
2 def are_all_even(numbers).
з for i, n in enumerate(numbers):
4
5
6
7
8
9
10
if n У. 2 != 0:
return False, i
return True , -1
# Пытаемся получить значение параметра
print(numbers 1
# NameError: name ’numbers’ is not defined
Получили ошибку, так как переменная numbers не доступна вне функции.
Это произошло, поскольку параметр функции является локальной переменной.
Он существует только во время выполнения функции и доступен только внутри
нес. Также говорят, что параметр функции находится в локальной области
видимости функции.
Важно понимать, что время существования переменной напрямую свя-
зано с се областью видимости. Локальные переменные создаются при входе
в функцию и уничтожаются после ее завершения. Глобальные и встроенные пе-
ременные существуют па протяжении всего времени выполнения программы
Нелокальные переменные из окружающих функций (enclosing scope) сохраня-
ются до тех пор, пока существует хотя бы одна вложенная функция, которая
может к ним обратиться (через замыкание).
4.1.8. Лямбда-функции
Лямбда-функции — это функции, которые позволяют создавать
небольшие функции в одну строку. Опи используются для создания функ-
ций без необходимости явно определясь их с помощью ключевого слова def
Лямбда-функции полезны, когда нужно передать небольшую функцию в каче-
стве аргумента другой функции или когда функция нужна только один раз.
Например, они часто передаются как аргументы в функции высшего поряд-
ка, такие как sorted, map и filter. Лямбда-функции также называются ано-
нимными функциями, так как они могут не иметь имени. Происхождение
термина «лямбда» связано с формальной системой А-исчпсления.
Лямбда-функции определяются с помощью ключевого слова lambda, за
которым следует список парамет ров, двоеточие и выражение.
Листинг 4.27: Пример лямбда-функции
1 lambda <параметры>: <выражение>
Лямбда-функции могут принимать любое количество параметров, но со-
держат только одно выражение, которое вычисляется и возвращается при вы-
зове функции.
Создадим лямбда-функцию, которая принимает один аргумент и возвра-
щает его квадрат.
Листинг 4.28: Пример лямбда-функции
1 # Определяем лямбда-функцию
2 square = lambda х: х ** 2
з print(square (5)) # 25
4 # Вывод: 25
В данном примере лямбда-функция имеет имя square и принимает один
параметр х. При вызове square(5) функция возвращает квадрат числа 5, то
есть 25.
Создадим лямбда-функцию, которая сортирует список строк по длине.
Листинг 4.29: Пример лямбда-функции для сортировки строк
1
2
3
4
5
в
7
# Список строк
words = ["apple", "banana", "cherry", "date"]
# Сортируем список по длине
sorted_words = sorted(words, key-lambda x: len(x))
print(sorted_words)
# Вывод: [’date*, ’apple’, ’banana’, ’cherry’]
В примере лямбда-функция используется в качестве аргумента key для
функции sorted, чтобы отсортировать список строк но их длине.
Создадим лямбда-функцию, которая применяется при сортировке списка
словарей по значению ключа age
Листинг 4.30: Пример лямбда-функции, которая используется для сортировки
1
2
3
4
5
6
7
8
а
ю
п
# Список словарей
people = [
{"name": "Alice", "age": 30},
{"name": "Bob", "age"u 25},
{"name": "Charlie", "age": 35}
]
» Сортируем список по возрасту
sorted_people = sorted (people , key = larr.bda x: x["age"J)
print(sorted_people)
» Вывод: [{’name’: ’Bob’, ’age’: 25}, {’name’: ’ <—•
• —> Alice’, ’age’: 30}, {’name’: ’Charlie’, ’age’: 35}]
В рассмотренном примере лямбда-функция не имеет имени и использует-
ся в качестве аргумента key для функции sorted, чтобы отсортировать список
словарей по значению ключа age
Лямбдагфункции могут быть полезны в ситуациях, когда нужно быстро
определить небольшую функцию без необходимости создавать отдельное имя
для псе.
§ 4.2. Магические методы и функции
Магические методы и функции в Python это специальные методы
и функции, которые позволяют разработчикам определять поведение объектов
и модулей Они позволяют переопределять стандартные операции и поведение
объектов, такие как сложение, сравнение, преобразование в строку и т. д. Маги-
ческие методы и функции начинаются и закапчиваются двойным подчеркива-
нием (_). Магические методы и функции позволяют разработчикам создавать
более гибкие и удобные для использования объекты и модули, которые могут
взаимодействовать с другими частями кода в Python.
Магические методы и функции могут быть определены в классах и моду-
лях. Магические методы определяются в классах и позволяют переопределять
стандартные операции, такие как сложение, сравнение, преобразование в строку
и т. д. Магические функции определяются в модулях и позволяют переопреде-
лять стандартные функции, такие как lent), str О, reprO и т. д.
Примеры магических методов:___init__,___str__,___repr__,__len__,
__getitem___, __setitem_,____del item_,___iter__,____next__,____call_,
_____________________________________________________________________enter_______,_exit_.
Примеры магических функций:___import__,____debug_,____doc__,
__name_,____file__,____package__,___spec__,___loader___,___builtins__,
_____________________________________________________________________annotations_. Магические методы и функции позволяют разработчикам
определять поведение объектов и модулей в Python.
Важно понимать, что магические методы и функции не вызываются
напрямую, а используются в контексте других операций. Например, метод
__init_вызывается автоматически при создании экземпляра класса, а метод
_______str_вызывается при преобразовании объекта в строку с помощью функции
str().
Более подробно о магических методах и функциях можно узнать в офи-
циальной документации Python, а также в книгах и учебных материалах по
Python при изучении объектно-ориентированного программирования (ООП).
При первоначальном изучении Python магические методы и функции мо-
гут показаться сложными, но они являются важной частью языка и позволяют
создавать более гибкие и удобные для использования объекты и модули.
Будут полезны след,тощие магические функции:
•___doc__ возвращает строку документации объекта, класса или модуля.
•___version__ возвращает версию объекта, класса или модуля.
• name возвращает имя объекта, класса или модуля.
• file возвращает путь к файлу, в котором определен объект, класс
или модуль.
•___package_ возвращает имя пакета, к которому принадлежит модуль.
•___loader__— возвращает загрузчик модуля, который используется для
его загрузки.
•___builtins__— возвращает встроенные функции и классы Python.
•___annotations__ возвращает аннотации типов параметров и возвращав
смого значения функции или метода.
После подключения библиотеки Numpy можно выяснить ее версию с по-
мощью магической функции____version___.
Листинг 4.31: Получение версии библиотеки Numpy
1 # Подключаем библиотеку Numpy
2 import numpy as пр
з print(пр...version.^)
4 # Вывод: 2.3.0 (или другая версия, в зависимости от <—>
«-> установленной версии Numpy)
Также можно получить информацию о модуле Numpy с помощью маги-
ческой функции_doc_.
Листинг 4.32: Получение документации модуля Numpy
# Подключаем библиотеку Numpy
import numpy as пр
# Получаем документацию модуля Numpy
print(np.__doc__)
§4.3. Документация кода
Документация кода — это важный аспект разработки программного обес-
печения, который помогает разработчикам понять, как использовать код, какие
функции и методы доступны н как они работают. Документация облегчает ис-
пользование и сопровождение кода другими разработчиками (пли самим авто-
ром спустя время). Документация может быть написана в виде комментариев
в коде, докстрингов или отдельной документации Хорошая документация де-
лает код более понятным и легким для поддержки, а также помогает другим
разработчикам быстро разобраться в коде и использовать его в своих проектах.
4.3.1. Докстринги
Докстрпнги (docstrings) строки документации, стоящие сразу по-
сле определения функции, метода, класса или модуля. Используется для описа-
ния назначения, параметров, возвращаемых значений, возможных исключении
и примерного использования. Докстринги являются важной частью докумен-
тации кода, так как они позволяют разработчикам быстро понять, что делает
функция или класс и как его использовать. Докстринги помещаются в тройные
кавычки (...или ) и могут содержать описание параметров, возвращаемых
значений и примеров использования. Докстрпнги могут быть многострочными
и однострочными
Листинг 4.33: Докстрипг функции
6
7
8
9
10
11
12
def calculatе_sum(a, b):
(i и it
Функция для вычисления суммы двух чисел.
Параметры:
a (int): Первое число,
b (int): Второе число
Возвращает:
int: Сумма двух чисел.
II И II
return а + b
В примере докстринг описывает функцию calculate.suniO, ее парамет-
ры и возвращаемое значение.
Докстринги могут быть получены с помощью функции helpO или ат-
рибута _doc___.
Листинг 4.34: Получение докстринга
1 help(calculate_sum) # Получение докстринга функции
2 print(calculate_sum.__doc__) & Получение докстрингз<-»
> функции
Докстринги могут быть использованы для автоматической генерации до-
кументации с помощью инструментов, таких как Sphinx или pydoc.
Существует несколько распространенных стилей написания докстрингов,
таких как Google Style, NumPy Style и reStructuredText (reST). Каждый из
этих стилей имеет свои правила форматирования и может быть использован
в зависимости от предпочтений разработчика или команды.
4.3.2. Комментарии и отдельная документация
Комментарии и отдельная документация играют важную роль в разра-
ботке программного обеспечения. Опи помогают разработчикам понять, что де-
лает код и как его использовать. Комментарии могут быть однострочными или
многострочными, а отдельная документация может быть написана в виде тек-
стового файла, HTML-страницы пли другого формата. Примеры комментариев
и отдельной документации приведены ниже.
Листинг 4.35: Пример комментариев
1 # Это однострочный комментарий
г print("Hello, MGIMO-University!") й Это koi ментари t
> в конце строки
II II II
s Это многострочный комментарий, который может занимать—*
«-> ь несколько строк.
II II и
о
7 print (" Hello , MGIMO-University!") fl Это комме trap iЙ4—>
в конце строки
Листинг 4.36: Пример отдельной документации
1 # Пример отдельной документации
2 # Функция calculate_sumО вычисляет сумму двух чисел.
з з Параметры:
4 # a (int): Первое число
# b (int): Второе число.
в я еозвращает:
7 Я int: Сумма двух чисел.
s def calculate_sum(a , b) :
s return a + b
§4.4. Работа с внешними модулями и пакетами
Организация кода в модули и пакеты позволяет с труктурировать проект,
повторно использовать компоненты и подключать внешние библиотеки. Python
имеет гибкую систему импорта: import <имя модуля>, from <имя модуля>
import <имя функции>, относительные имнорты в пакетах и т. д. Понимание
при]шипов упаковки (packaging) и управления зависимостями (requirements)
важно для повторного использования и распространения кода.
Модули и пакеты позволяют организовывать код в отдельные файлы
и директории Модуль это файл с расширением .ру, содержащий функ-
ции. классы и переменные. Пакет это директория, содержащая модули
и файл__init__.ру. Пакеты позволяют организовывать модули в иерархиче-
скую структуру. Для того чтобы использовать модуль или пакет, нужно импор-
тировать его с помощью ключевого слова import
§4.4. Работа с внешними модулями и пакетами
Импортируем модуль math для работы с математическими функциями.
Листинг 4.37: Импортирование модуля
import math
print(math.sqrt (16)) # 4.0
В данном примере мы импортируем модуль math и используем его функ-
цию sqrtO для вычисления квадратного корня из 16.
Можно импортировать отдельные функции пли классы из модуля с по-
мощью ключевого слова from.
Листинг 4.38: Импортирование функции из модуля
i
2
from math import sqrt
print(sqrt (16) ) w 4.0
В рассмотренном примере мы импортируем только функцию sqrtO из
модуля math и используем ее для вычисления квадратного корня из 16.
Также можно импортировать все функции и классы из модуля с помо-
щью символа * В таком случае все функции и классы будут доступны без
необходимости указывать имя модуля.
Листинг 4.39: Импортирование всех функций из модуля
from math import *
print(sqrt (16)) # 4.0
Замечание 22. На практике импортирование всех функций из модуля с помо-
щью символа * нс рекомендуется, так как это может привести к конфликтам
имен и затруднить понимание кода. Лучше импортировать только тс функции,
которые необходимы для выполнения задачи.
Отметим, что в Python при импортировании модулей создастся отдель-
ное пространство имен, что позволяет избежать конфликтов имен. Также
в Python можно использовать альтернативные имена вместо оригинальных
имен. Алиас (элиас, alias) это альтернативное имя, которое присваива-
ется импортируемому объекту. Дтя создания альтернативных имен (алиасов)
при импорте используется ключевое слово as
Алиасы полезны для сокращения длинных имен модулей, функций или
классов, а также дтя устранения конфликтов между одноимёнными объект ами
в разных модулях и пакетах.
Листинг 4.10: Создание элиаса
1 import math as m в m алиас
2 print(m sqrt(16)) # 4.0
В примере мы создали элиас п. для модуля math и используем его Д1Я
вызова функции sqrt().
Импортируем модуль random и используем его дтя генерации случайных
чисел.
Листинг 4.41: Импортирование модуля random
1 import random
2 print (random . rand int (1 , 10)) # Ген рация слу’ а inoroH
<—> числа от 1 до 10
Также можно импортировать модули из других директорий, указав путь к ним.
Для этого нужно использовать ключевое слово sys path. append () для добав-
ления пути к директории с модулями.
Листинг 4.42: Импортирование модуля из другой директории
—
t import sys
2 sys.path.append(’/path/to/your/module/directory’)
Контрольные вопросы
з import your_module
4 pr i nt (your_module. your _f unction О)
В рассмотренном примере мы добавляем путь к директории
/path/to/your/module/directory с модулями в системный путь поиска моду-
лей и затем импортируем модуль your_module. Далее мы можем использовать
функции и классы из этого модуля.
Контрольные вопросы
1. Какое ключевое слово используется для определения функции в Python?
2. Какой синтаксис определения функции в Python? Как указывать пара-
метры со значениями по умолчанию?
3. Обязательно ли указывать тип возвращаемого значения при определении
функции?
4. Как задать параметры функции?
5. Как вызвать функцию с позиционными аргументами?
G. Как вызвать функцию с именованными аргументами?
7. Что такое аргументы переменной длины и как их определить?
8. Как передать произвольное количество позиционных аргументов в функ-
цию?
9. Как передать произвольное количество именованных аргументов в функ-
цию?
10. Можно ли определить функцию внутри другой функции?
11. Как вызвать функцию, если она нс принимает параметров?
12. Что произойдет, если вызвать функцию с неправильным количеством ар-
гументов?
13. Можно ли вызвать функцию до се определения в коде?
14. Как передать аргументы функции по имени параметра?
15. В чем разница между параметрами и аргументами функции?
16. Что такое параметры по умолчании)? Приведите пример.
17. Что означают обозначения *args и **kwargs в определении функции?
18. Можно ли изменить порядок позиционных и именованных аргументов при
вызове?
19. Какое ключевое слово используется для возврата значения из функции?
20. Что возвращает функция, если в ней пет операторе! return?
21. Может ли функция возвращать несколько значений?
22. Как вернуть несколько значений из функции?
23. Можно ли использовать несколько операторов return в одной функции?
24. Что такое локальная область видимости?
25. Что такое глобальная область видимости?
26. Для чего используется ключевое слови global?
27. Что означает ключевое слово nonlocal?
28. Что такое правило LEGB?
29. Что такое лямбда-функция?
30. Какие ограничения сеть у лямбда-функций?
31. В каких случаях целесообразно использовать лямбда-функции?
32. Можно ли в лямбда-функции использовать несколько выражений?
33. Что такое магические методы в Python?
34. Что такое докстринг?
35. Где должен располагаться докстриш функции?
36. Какие кавычки используются для многострочных докстрипгов?
37. Как получить доступ к докстрипгу функции программно?
38. Какие основные разделы должен содержать докстрипг функции?
39. В чем разница .между комментариями и докстрингами?
40. Когда следует использовать комментарии, а когда докстрингп?
41. Что такое внешняя документация?
42. Какие инструменты используются для генерации документации в Python?
43. Что такое модуль в Python?
44. Как импортировать модуль целиком?
45. Как импортировать отдельные функции из модуля?
46. Что означает конструкция from module import *?
47. Что такое пакет в Python?
48. Как установить внешний пакет с помощью pip?
49. Что такое виртуальное окружение и зачем оно нужно?
50. Как посмотреть список установленных пакетов?
51. Что такое файл requirements.txt?
Практикум: создание и использование функций
В этом практикуме вы создадите несколько функций, которые выпол-
няют различные задачи. Вы также научитесь использовать функции в других
функциях и передавать функции в качестве аргументов.
Упражнения
Функции с позиционными аргументами
1, Напишите функцию sum two numbers, принимающую 2 аргумента
числа а и Ь и возвращающую 1 значение: их сумму.
2. Напишите функцию is even, принимающую 1 аргумент число п
и возвращающую I значение: Time, если число четное, и False в против-
ном случае.
3. Напишите функцию max of three, принимающую 3 аргумента числа
а. b и с и возвращающую 1 значение: наибо. ibinee из них Не исполь-
зуйте встроенную функцию тах().
4. Напишите функцию is vowel, принимающую 1 аргумент символ ch
и возвращающую 1 значение: True, если он является гласной, и False
в противном случае.
5. Напишите функцию count vowels, принимающую 1 аргумент строку
s и возвращающую 1 значение: количество гласных в этой строке.
б. Напишите функцию factorial, принимающую 1 аргумент число п
и возвращающую 1 значение: его факториал. Решите задачу двумя
способами: рекурсивно и итеративно.
7. Напишите функцию reverse_string, принимающую 1 аргумент строку
s — и возвращающую 1 значение: се в обратном порядке.
8. Напишите функцию is palindrome, принимающую 1 аргумент — строку
s и возвращающую 1 значение: True, если строка является палиндро-
мом, и False в противном случае.
9. Напишите функцию is palindrome ignore spaces, принимающую 1
аргумент строку s и возвращающую 1 значение: True, если строка
является палиндромом, игнорируя регистр и пробелы, и False в против-
ном случае.
10. Напишите функцию remove_duplicates, принимающую 1 аргумент
список 1st и возвращающую 1 значение: новый список без повторяю-
щихся элементов.
И. Напишите функцию fibonacci, принимающую 1 аргумент число п
и возвращающую 1 значение: n-ое число Фибоначчи. Решите задачу
двумя способами: рекурсивно и итеративно.
12. Напишите функцию sum_list. принимающую 1 аргумент список чисел
1st — и возвращающую 1 значение: их сумму. При решении не исполь-
зуйте встроенные функции.
13. Напишите функцию find min. принимающую 1 аргумент список чисел
1st — и возвращающую 1 значение: минимальное значение в списке. При
решении не используйте встроенные функции.
14. Напишите функцию find max. принимающую 1 аргумент список чи-
сел 1st и возвращающую 1 значение: максимальное значение в списке.
При решении не используйте встроенные функции.
15. Напишите функцию is_prime, принимающую 1 аргумент — число п
и возвращающую 1 значение: True, если число простое, и False в против-
ном случае.
16. Напишите функцию sort list, принимающую 1 аргумент — список чисел
1st и возвращающую 1 значение: список, отсортированный по возраста-
нию. При решении не используйте встроенные функции.
17. Напишите функцию average, принимающую 1 аргумент — список чисел
1st — и возвращающую 1 значение: их среднее значение.
18. Напишите функцию merge lists, принимающую 2 аргумента списки
Istl и 1st2 и возвращающую 1 значение: объединенный список.
19. Напишите функцию capitalize_ words, принимающую 1 аргумент
строку s — и возвращающую 1 значение: строку, где каждое слово на-
чинается с заглавной буквы.
2U. Напишите функцию count occurrences, принимающую 2 аргумента
список 1st и элемент elem и возвращающую 1 значение: количество
вхождений элемента elem в список 1st. При решении не используйте
встроенные функции и методы.
21. Напишите функцию remove vowels, принимающую 1 аргумент стро-
ку s — и возвращающую 1 значение: строку без гласных букв.
22. Напишите функцию power, принимающую 2 аргумента — число base
и степень ехр и возвращающую 1 значение: результат возведения чис-
ла base в степень ехр При решении не используйте встроенные
функции.
23. Напишите функцию swap first last, принимающую 1 аргумент спи-
сок 1st и возвращающую 1 значение: список с первым и последним
элементами, поменянными местами.
24. Напишите функцию count characters, принимающую 1 аргумент
строку s — и возвращающую 1 значение: количество символов в строке.
25. Напишите функцию to_uppcrcasc, принимающую 1 аргумент — строку
s и возвращающую 1 значение: строку в верхнем регистре.
26. Напишите функцию to lowercase, принимающую 1 аргумент строку
s — и возвращающую 1 значение: строку в нижнем регистре.
27. Напишите функцию find _second_largest, принимающую 1 аргумент
список чисел 1st — и возвращающую 1 значение: второе по величине число.
28. Напишите функцию sum_of_squares, принимающую 1 аргумент — спи-
сок чисел 1st и возвращающую i значение: сумму их квадратов.
29. Напишите функцию find longest word, принимающую 1 аргумент
строку s и возвращающую 1 значение: самое длинное слово в строке.
30. Напишите функцию count words, принимающую 1 аргумент — строку
s и возвращающую 1 значение: количество слов в строке.
31. Напишите функцию remove negatives, принимающую 1 аргумент
список 1st и возвращающую 1 значение: новый список без отрицатель-
ных чисел.
32. Напишите функцию multiply list, принимающую 1 аргумент список
чисел 1st — и возвращающую 1 значение: произведение всех элементов
списка.
33. Напишите функцию is_anagrani, принимающую 2 аргумента строки
si и s2 — и возвращающую 1 значение: True, если одна строка является
анаграммой другой, и False в противном случае.
34. Напишите функцию unique_ elements, принимающую 1 аргумент спи-
сок 1st — и возвращающую i значение: новый список только с уникаль-
ными элементами.
35. Напишите функцию is_ sublist, принимающую 2 аргумента списки 1st 1
и lst2 и возвращающую 1 значение: ’lYue, если Istl является подсписком
lst2. и False в противном случае.
36. Напишите функцию find median, принимающую 1 аргумент список
чисел 1st — и возвращающую 1 значение: медиану списка.
37. Напишите функцию remove evens, принимающую 1 аргумент список
1st — и возвращающую 1 значение: новый список без четных чисел.
38. Напишите функцию largest negative, принимающую 1 аргумент спи-
сок 1st — и возвращающую 1 значение: наибольшее отрицательное число
в списке.
39. Напишите функцию count multiples of three, принимающую 1 ар-
гумент список 1st и возвращающую 1 значение: количество чисел,
кратных трем, в списке.
49. Напишите функцию join_ with _comma, принимающую 1 аргумент
список строк 1st — и возвращающую 1 значение: строку с элементами,
разделенными занятой.
41. Напишите функцию power list, принимающую 2 аргумента — список
чисел 1st и степень ехр и возвращающую 1 значение: новый список
с элементами, возведенными в степень ехр
42. Напишите функцию abs negatives, принимающую 1 аргумент список
1st — и возвращающую 1 значение: список с абсолютными значениями
отрицательных чисел.
43. Напишите функцию fahrenheit_to_celsius, принимающую 1 аргу-
мент — температуру f в градусах Фаренгейта - и возвращающую 1 значе-
ние: температуру в градусах Цельсия.
44. Напишите функцию is_alpha, принимающую 1 аргумент — строку s
и возвращающую 1 значение: True, если строка содержит только буквы,
и False в противном случае.
45. Напишите функцию remove spaces, принимающую 1 аргумент строку
s — и возвращающую 1 значение: строку без пробелов.
46. Напишите функцию fibonacci_sequence, принимающую 1 аргумент
число 11 — и возвращающую 1 значение: список из первых п чисел Фибо-
наччи.
47. Напишите функцию all_ even, принимающую 1 аргумент список 1st
и возвращающую 1 значение: True, если все элементы списка четные,
и False в противном случае.
18. Напишите функцию square all. принимающую 1 аргумент список чи-
сел 1st — и возвращающую 1 значение: новый список с квадратами всех
элементов.
49. Напишите функцию count long words, принимающую 2 аргумента
строку s и число п и возвращающую 1 значение: количество слов
в строке длиной больше п.
50. Напишите функцию squares_dict, принимающую 1 аргумент число
п — и возвращающую 1 значение: словарь, где ключи — числа от 1 до и,
а значения их квадраты.
51. Напишите функцию count above average, принимающую 1 аргу-
мент синеок чисел 1st и возвращающую 1 значение: количество чисел
в списке, которые больше среднего значения списка.
52. Напишите функцию find all indices, принимающую 2 аргумента спи-
сок 1st и элемент elem и возвращающую 1 значение: список всех ин-
дексов элемента elem в списке 1st.
53. Напишите функцию fiip_ signs, принимающую 1 аргумент — список чи-
сел 1st — и возвращающую 1 значение: список с противоположными зна-
ками элементов.
54. Напишите функцию acronym, принимающую 1 аргумент — строку s
и возвращающую 1 значение: строку, состоящую из первых букв каждого
слова в s.
55. Напишите функцию filter even length words, принимающую 1 аргу-
мент — строку s — и возвращающую 1 значение: список слов четной ,дли-
ны.
56. Напишите функцию cube all, принимающую 1 аргумент — список чисел
1st и возвращающую 1 значение: новый список с кубами элементов.
57. Напишите функцию is substring принимающую 2 аргумента строки
si и s2 и возвращающую 1 значение: True, если si является подстрокой
s2. и False в противном случае.
58. Напишите функцию remove_spaces, принимающую 1 аргумент строку
s — и возвращающую 1 значение: строку без пробелов.
59. Напишите функцию is_strictly increasing, принимающую 1 аргу-
мент список 1st и возвращающую 1 значение: True, если список яв-
ляется строго возрастающей последовательностью, и False в противном
случае.
60. Напишите функцию min_max, принимающую 1 аргумент список чи-
сел 1st — и возвращающую 1 значение: кортеж с минимальным и макси-
мальным элементами списка.
61. Напишите функцию alternate^ case, принимающую 1 аргумент — стро-
ку s и возвращающую 1 значение: строку с чередующимся регистром
символов.
62. Напишите функцию flattcn_list, принимающую 1 аргумент список
списков 1st — и возвращающую 1 значение: плоский список
63. Напишите функцию sum of_digits, принимающую 1 аргумент число
и — и возвращающую 1 значение: сумму его цифр.
64. Напишите функцию common elements, принимающую 2 аргумента
списки 1st 1 и lst2 и возвращающую 1 значение: список общих элемен-
тов.
65. Напишите функцию second smallest, принимающую 1 аргумент спи-
сок чисел 1st — и возвращающую 1 значение: второе по величине мини-
мальное число.
66. Напишите функцию is_pangram, принимающую 1 аргумент строку
s — и возвращающую 1 значение: True, если строка содержит все буквы
алфавита хотя бы один раз, и False в противном случае.
67. Напишите функцию reverse words, принимающую 1 аргумент строку
s и возвращающую 1 значение: строку с словами в обратном порядке.
68. Напишите функцию sum of cubes, принимающую 1 аргумент список
чисел 1st и возвращающую 1 значение: сумму их кубов.
69. Напишите функцию replace_ vowels, принимающую 2 аргумента стро-
ку s и символ ch и возвращающую 1 значение: строку с гласными, за-
мененными на ch.
70. Напишите функцию has equal _char frequency, принимающую 1 ар-
гумент строку s и возвращающую 1 значение: True, если строка
содержит одинаковое количество каждой буквы, и False в противном слу-
чае.
71. Напишите функцию multiply _ list, принимающую 1 аргумент список
чисел 1st — и возвращающую 1 значение: произведение всех элементов
списка.
72. Напишите функцию unique words, принимающую 1 аргумент — спи-
сок строк 1st и возвращающую 1 значение: строку, содержащую только
уникальные слова.
73. Напишите функцию count vowels consonants, принимающую 1 аргу-
мент — строку s — и возвращающую 1 значение: кортеж с количеством
гласных и согласных.
74. Напишите функцию count unique, принимающую 1 аргумент — список
1st — и возвращающую 1 значение: количество уникальных чисел в списке.
75. Напишите функцию find pairs with sum, принимающую 2 аргумен-
та — список чисел 1st и число sum и возвращающую 1 значение: список
пар чисел, сумма которых равна sum
76. Напишите функцию can sort _ with one swap, принимающую 1 аргу-
мент - список чисел 1st и возвращающую 1 значение: True, если список
можно упорядочить по возрастанию с одной заменой элемента, и False
в противном случае.
77. Напишите функцию lilter by length, принимающую 2 аргумента
список строк 1st и число п и возвращающую 1 значение: список слов
длиной больше или равной п.
78. Напишите функцию permutations, принимающую 1 аргумент строку
s и возвращающую 1 значение: список всех возможных перестановок
символов строки.
79. Напишите функцию all_sublists, принимающую 1 аргумент список
1st и возвращающую 1 значение: список всех возможных подсписков.
80. Напишите функцию word frequency, принимающую 1 аргумент стро-
ку s и возвращающую 1 значение: словарь, где ключ слово из строки,
а значение частота его появления.
81. Напишите функцию romove_duplicates, принимающую 1 аргумент
список 1st — и возвращающую 1 значение: список без элементов, встреча-
ющихся более одного раза.
82. Напишите функцию to title case, принимающую 1 аргумент — строку
s и возвращающую 1 значение: строку в формате заголовка.
83. Напишите функцию sentence count, принимающую 1 аргумент стро-
ку s и возвращающую 1 значение: количество предложений в строке.
84. Напишите функцию all_strings_ unique, принимающую 1 аргумент
список строк 1st и возвращающую 1 значение: True, если все строки
в списке уникальны, и False в противном случае.
85. Напишите функцию count less than, принимающую 2 аргумента
список чисел 1st и число п и возвращающую 1 значение: количество
чисел в списке, которые меньше п.
86. Напишите функцию multiples, принимающую 2 аргумента числа п
и m и возвращающую 1 значение: список из первых п чисел, кратных
т.
87. Напишите функцию filter_ positive, принимающую 1 аргумент список
чисел 1st — и возвращающую 1 значение: список только с положительны-
ми числами.
88. Напишите функцию unique random numbers, принимающую 2 аргу-
мента числа п и range_max и возвращающую 1 значение: список из
п уникальных случайных чисел в диапазоне от 0 до range_max.
89. Напишите функцию capitalize_alternate, принимающую 1 аргумент
строку s и возвращающую 1 значение: строку с каждой второй буквой
заглавной.
90. Напишите функцию rotate list, принимающую 2 аргумента список 1st
и число и и возвращающую 1 .значение: список, циклически сдвинутый
на п позиций.
91. Напишите функцию divisors, принимающую 1 аргумент число п
и возвращающую 1 значение: список всех делителей числа п.
92. Напишите функцию sum_of digits_squared, принимающую 1 аргу-
мент — число п — и возвращающую 1 значение: сумму квадратов цифр
числа.
93. Напишите функцию square properties, принимающую 1 аргумент
сторону квадрата а и возвращающую 3 значения (с помощью корте-
жа): периметр квадрата, площадь квадрата и диагональ квадрата.
94. Напишите функцию arithmetic_progression, принимающую 3 позици-
онных аргумента а, п и с/: первый а — первый член арифметической про-
грессии, второй п — номер члена арифметической прогрессии (п нату-
ральное число), третий d — разность арифметической прогрессии, - и воз-
вращающую 1 значение: н-ый член арифметической прогрессии.
95. Напишите функцию geometric_ progression, принимающую 3 позицион-
ных аргумента Ь. п и q: первый b первый член геометрической прогрес-
сии, второй п - номер члена геометрической прогрессии (п натуральное
число), третий у знаменатель геометрической прогрессии, - и возвраща-
ющую 1 значение: n-ый член геометрической прогрессии.
9G. Напишите функцию perform operation, принимающую 3 позиционных
аргумента: первые два числа а и Ь, третий операция ор, которая
должна быть произведена над ними. Если третий аргумент ‘+‘, сложить
их; если то вычесть (из первого второе); — умножить: ' ‘ — разде-
лить (первое на второе). В остачьных случаях вернуть строку «Неизвест-
ная операция».
97. Напишите функцию compound_interest, принимающую 2 аргумента
сумму вклада а и срок вклада years — и возвращающую 1 значение: сум-
му, которая будет на счету пользователя через years лет при годовой про-
центной ставке 10%.
Функции с именованными аргументами
98. Напишите функцию arithmetic_progression sum. принимающую
3 именованных аргумента а, п и d: первый а первый член арифме-
тической прогрессии, второй п число первых членов арифметической
прогрессии (п натуральное число), третий d разность арифметической
прогрессии, — и возвращающую 1 значение: сумму п первых членов ариф-
метической прогрессии. По умолчанию d = 1.
99. Напишите функцию geometric progression sum. принимающую
3 именованных аргумента Ь, п и q: первый b первый член геометри-
ческой прогрессии, второй п — число первых членив геометрической про-
грессии (п натуральное число), третий q — знаменатель геометрической
прогрессии, — и возвращающую 1 значение: сумму п первых членов гео-
метрической прогрессии. По умолчанию q = 1.
100. Напишите функцию polynomial value, принимающую 7 именованных
аргументов: т, аи, cii, а2, аз, и а5, и возвращающую 1 значение: зна-
чение многочлена пятой степени р(.т) = а(|.т5 + aj т* + а2.г3 + (I3T2 + щ.г т а5
с действительными коэффициентами. По умолчанию а, = 1 для всех i.
101. Напишите функцию calculate^bonus, принимающую 4 аргумента: два
именованных аргумента name и last_name — имя и фамилию сотруд-
ника, и два аргумента по умолчанию salary= 120000 и bonus=10
(оклад и премия), — и возвращающую 2 значения: размер новогодней пре-
мии для сотрудника и зарплату с учетом премии (см. примеры вызова).
Примеры вызова функции:
cal cul ate_bonus (’ Алина ’ , ’Тимофеева’, salary = 150000 ,
bonus=25)
calculate_bonus(’Алексей ’ , ’Ковалев’, bonus=15)
calculate_bonus(’Hropb’, ’Ефимов’)
calculate.bonus(’Анастасия’, 'Яковлева’,
c salary=100000, bonus=20)
Примеры вызова функции:
Новогодняя премия сотрудника Алина Тимофеева: «—>
W 37500 00 руб.
Оклад: 150000.00 руб.
Всего к выдаче: 187500 00 руб
Новогодняя премия сотрудника Алексей Ковалев: е=>
18000.00 руб.
Оклад: 120000.00 руб.
Всего к выдаче- 138000 00 руб
Новогодняя премия сотрудника Игорь Ефимов: 12000 00 pt->
с-> уб.
Оклад: 120000.00 руб.
Всего к выдаче: 132000 00 руб.
Новогодняя премия сотрудника Анастасия Яковлева . <-»
20000.00 руб.
Оклад: 100000.00 руб.
Всего к выдаче: 120000.00 руб.
102. Напишите функцию calculate_discount, принимающую 3 аргумента: два
именованных аргумента price и discount цена товара и размер скид-
ки, и один аргумент по умолчанию quantity—1 (количество товаров),
и возвращающую 1 значение: общую стоимость покупки с учетом скидки.
103. Напишите функцию calculate_bmi. принимающую 2 именованных ар-
гумента вес (weight) и рост (height) человека и возвращающую
1 значение: индекс массы тела (BMI).
104. Напишите функцию calculate_interest, принимающую 3 именованных
аргумента — сумму вклада (principal), процентную ставку (rate) и срок
вклада в годах (years) и возвращающую 1 значение: сумму процентов,
начисленных за этот срок.
105. Напишите функцию calculate discount, принимающую 2 именованных
аргумента цену товара (price) и процент скидки (discount) и воз-
вращающую 1 значение: цену товара после применения скидки.
106. Напишите функцию calculate_future_value, принимающую 3 имено-
ванных аргумента сумму вклада (principal), процентную ставку (rate)
и срок вклада в годах (years) — и возвращающую 1 значение: будущую
стоимость вклада.
107. Напишите функцию calculate_age. принимающую 1 именованных ар-
гумент — дату рождения в формате ’YYYY-MM-DD’ (birthdate)
и возвращающую 1 значение: возраст человека в годах.
108. Напишите функцию calculate days between dates, принимающую
2 именованных аргумента две даты (datel и date2) в формате ’YYYY-
MM-DD' — и возвращающую 1 значение: количество дней между ними.
Функции с переменным числом аргументов
109. Напишите функцию average numbers, принимающую произвольное ко-
личество целых чисел (позиционных аргументов) и возвращающую 1 зна-
чение: среднее арифметическое без использования встроенных функций
sum() и 1еп().
ПО. Напишите функцию sum of squares, принимающую произвольное ко-
личество числовых аргументов и возвращающую 1 значение: сумму их
квадратов.
111. Напишите функцию to_uppercase_words, принимающую произволь-
ное количество строк (позиционных аргументов) и возвращающую список
строк, где каждое слово преобразовано в верхний регистр.
112. Напишите функцию concatenate_strings, принимающую произвольное
количество строк (позиционных аргументов) и возвращающую 1 значение:
объединенную строку.
113. Напишите функцию max_ number, принимающую произвольное количе-
ство чисел (позиционных аргументов) и возвращающую 1 значение: наи-
большее из них.
114. Напишите функцию min number, принимающую произвольное количе-
ство чисел (позиционных аргументов) и возвращающую I значение: наи-
меньшее из них.
115. Напишите функцию reverse_ strings, принимающую произвольное коли-
чество строк (позиционных аргументов) и возвращающую список строк,
где каждая строка перевернута.
116. Напишите функцию count _ vowels, принимающую произвольное количе-
ство строк (позиционных аргументов) и возвращающую список, где каж-
дый элемент представляет количество гласных в соответствующей строке.
117. Напишите функцию factorial numbers, принимающую произвольное
количество целых чисел (позиционных аргументов) и возвращающую спи-
сок, где каждый элемент представляет факториал соответствующего чис-
ла.
118. Напишите функцию is palindrome, принимающую произвольное коли-
чество строк (позиционных аргументов) и возвращающую список, где
каждый элемент представляет True, если строка является палиндромом,
и False в противном случае.
119. Напишите функцию remove_spaces, принимающую произвольное коли-
чество строк (позиционных аргументов) и возвращающую список строк
без пробелов.
120. Напишите функцию sort numbers, принимающую произвольное коли-
чество чисел (позиционных аргументов) и возвращающую список, отсор-
тированный по возрастанию.
121. Напишите функцию unique_elements. принимающую произвольное ко-
личество аргументов и возвращающую список уникальных элементов.
122. Напишите функцию count_characters, принимающую произвольное ко-
личество строк (позиционных аргументов) и возвращающую список, где
каждый элемент представляет количество символов в соответствующей
строке.
123. Напишите функцию multiply numbers, принимающую произвольное
количество чисел (позиционных аргументов) и возвращающую 1 значе-
ние произведение всех чисел.
124. Напишите функцию is_prime, принимающую произвольное количество
целых чисел (позиционных аргументов) и возвращающую список, где каж-
дый элемент представляет True, если число простое, и False в противном
случае.
125. Напишите функцию join_with hyphen, принимающую произвольное
количество строк (позиционных аргументов) и возвращающую 1 значе-
ние: строку, где все элементы соединены дефисом.
126. Напишите функцию cube numbers, принимающую произвольное ко-
личество чисел (позиционных аргументов) и возвращающую список, где
каждый элемент представляет куб соответствующего числа.
127. Напишите функцию reverse words, принимающую произвольное коли-
чество строк (позиционных аргументов) и возвращающую список строк,
где слова в каждой строке расположены в обратном порядке.
Заключение
В данной главе мы рассмотрели основы работы с функциями в Python,
включая определение функций, передачу аргументов, использование значений
по умолчанию и работу с переменным числом аргументов, а также лямбда-
функции. Мы также изучили различные способы создания функций для ре-
шения практических задач. Функции являются важным инструментом для ор-
ганизации кода, повышения его читаемости и повторного использования. Они
позволяют разбивать сложные задачи па более мелкие, управляемые части, что
упрощает разработку и отладку программ.
Учебное издание
Гутник Сергей Александрович, Лата Александр Николаевич
ВЫЧИСЛИТЕЛЬНЫЕ МЕТОДЫ НА PYTHON
Учебное пособие
В двух книгах
Книга первая (главы 1-4)
Шеф-редактор И. Ю. Окунев
Заведующая редакцией Л. С. Жирнова
Выпускающий редактор Н. Г. Карпинская
Компьютерная верстка Л. Н. Лата
Художественное оформление обложки А. Г. Киров
Допечатай подготовка .4. О. Бирюков
Подписано в печать 23.12.2025. Формат 60 х h4 J/s.
Усл. печ. л. 34.1 Уч.-изд. л. 10 Заказ X* 149J1
Издательский дом МГИМО
119454, Москва, пр. Вернадского, 76
mgirao.ru/ id; id@inno.ingimo.ru
Отпечатано в производственном отделе
Издательского дома МГИМО
119154. Москва, пр. Вернадского, 76
mgimo.ru/id; print@inno.mgimo.ru
МГИМО
ИЗДАТЕЛЬСКИЙ
ДОМ
мчс? выпускает учебные издания по Kiswahili
AM X АРСКИЙ English -2 СУАХИЛ И Точней
АНГЛИЙСКИЙ АРАБСКИЙ иностранным языкам: ТАДЖИКСКИЙ Turkle ТУРЕЦКИЙ
Afrikaans Bahasa Indonesu Nederlands Украшська
АФРИКААНС ИНДОНЕЗИЙСКИЙ НИДЕРЛАНДСКИЙ УКРАИНСКИЙ
Espanol Norsk
БЕНГАЛЬСКИЙ ИСПАНСКИЙ НОРВЕЖСКИЙ УРДУ
Български Italiano (^9 Is Suomi
БОЛГАРСКИЙ Tieng Viet ИТАЛЬЯНСКИЙ г., > . ПЕРСИДСКИЙ Polski ФИНСКИЙ
Ч1 X Fran^ais
вьетнамский КИТАЙСКИЙ ПОЛЬСКИЙ ФРАНЦУЗСКИЙ Гл П
ГПТМ<|\г\[\ Portugues 11?’ч!
готский КОРЕЙСКИЙ ПОРТУГАЛЬСКИЙ ХИНДИ
Ел/оулхя Hrvatski
ГРЕЧЕСКИЙ ЛАОССКИЙ ПУШТУ ХОРВАТСКИЙ
Latina Romana Cestina
ДАРИ ЛАТИНСКИЙ РУМЫНСКИЙ ЧЕШСКИЙ
Dansk Монгол Русский Svenska
ДАТСКИЙ монгольский РУССКИЙ ШВЕДСКИЙ
Deutsch Српски
ИВРИТ НЕМЕЦКИЙ СЕРБСКИЙ ЯПОНСКИЙ
mgimo.ru/id
ийММи
^раЭиЦми Тип,
МГИМО
ИЗДАТЕЛЬСКИЙ
ДОМ
е?и
* ,4Hhoui30B
УЧЕБНАЯ И НАУЧНАЯ
ЛИТЕРАТУРА
ПО ТЕМАМ
международные
отношения
mgimo.ru/id
страны и регионы
мира
•
мировая
экономика
vk.com/mgimoid
международное
право
иностранные
языки
books@inno.mgimo ru
МГИМО
ИЗДАТЕЛЬСКИЙ
ДОМ
I 8 2 8
Гутник
Сергей Александрович
доцент кафедрой
математики,
эконометрики
и информационных
технологий, доктор
физико-математических
наук, доцент
Лата
Александр Николаевич
преподаватель кафедры
математики, эконометрики
и информационных
технологий, кандидат
физико-математических
наук
ISBN ч?8-5-чггв-за?ч-ч
9
7859??
S3074