Питон для нормальных. Учебник Москва Базальт спо макс пресс 2018
Скачать 2.54 Mb.
|
В серии: Библиотека ALT М. В. Сысоева, И. В. Сысоев Программирование для «нормальных» с нуля на языке Python В двух частях Часть 1 Учебник Москва Базальт СПО МАКС Пресс 2018 УДК 004.43 ББК 22.1 С95 С95 Сысоева М. В., Сысоев И. В. Программирование для «нормальных» с нуля на языке Python: Учебник. В двух частях. Часть 1 / Ответственный редактор: В. Л. Черный : — М.: Базальт СПО; МАКС Пресс, 2018. — 176 с. [+4 с. вкл]: ил. — (Библиотека ALT). ISBN 978-5-9908979-5-3 ISBN 978-5-317-05783-1 ISBN 978-5-317-05784-8 (часть 1) Книга — учебник, задачник и самоучитель по алгоритмизации и программированию на Python. Она не требует предварительных знаний в области программирования и может использоваться для обучения «с нуля». Издание адресовано студентам, аспирантам и преподавателям ин- женерных и естественно-научных специальностей вузов, школьникам старших классов и учителям информатики. Обучение языку в значи- тельной степени строится на примерах решения задач обработки ре- зультатов радиофизического и биологического эксперимента. Сайт книги: http://www.altlinux.org/Books:Python-sysoeva Ключевые слова: программирование; численные методы; алгорит- мы; графики; Python; numpy УДК 004.43 ББК 22.1 Материалы, составляющие данную книгу, распространяются на условиях лицензии GNU FDL. Книга содержит следующий текст, помещаемый на первую страницу обложки: «В серии “Библиотека ALT”». Название: «Программирование для «нормальных» с нуля на языке Python. В двух частях. Часть 1». Книга не содержит неизменяемых разделов. Linux — торговая мар- ка Линуса Торвальдса. Прочие встречающиеся названия могут являться торговыми марками соответствующих владельцев. ISBN 978-5-9908979-5-3 ISBN 978-5-317-05783-1 ISBN 978-5-317-05784-8 (часть 1) c Сысоева М. В., Сысоев И. В., 2018 c Basealt, 2018 Оглавление Предисловие 5 Глава 1. Введение 7 1.1 Языки программирования . . . . . . . . . . . . . . . . . . . . . . 7 1.2 Парадигмы программирования . . . . . . . . . . . . . . . . . . . 12 1.3 Типизация в языках программирования . . . . . . . . . . . . . . 14 1.4 Области программирования . . . . . . . . . . . . . . . . . . . . . 20 1.5 Области применения Python . . . . . . . . . . . . . . . . . . . . . 23 1.6 Первая программа. Среда разработки . . . . . . . . . . . . . . . . 27 Глава 2. Основные типы данных 32 2.1 Числа. Арифметические операции с числами. Модуль math . . . 32 2.2 Строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 2.3 Условия и логические операции . . . . . . . . . . . . . . . . . . . 42 2.4 Списки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 2.5 Кортежи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 2.6 Словари . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 2.7 Примеры решения задач . . . . . . . . . . . . . . . . . . . . . . . 56 2.8 Задания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Глава 3. Циклы 67 3.1 Цикл с условием (while) . . . . . . . . . . . . . . . . . . . . . . . 67 3.2 Цикл обхода последовательности (for) . . . . . . . . . . . . . . . 70 3.3 Некоторые основные алгоритмические приёмы 73 3.4 Отладка программы . . . . . . . . . . . . . . . . . . . . . . . . . . 78 3.5 Задания на циклы . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 Глава 4. Функции 93 4.1 Функции в программировании . . . . . . . . . . . . . . . . . . . . 93 4.2 Параметры и аргументы функций . . . . . . . . . . . . . . . . . . 97 4.3 Локальные и глобальные переменные . . . . . . . . . . . . . . . . 100 4.4 Программирование сверху вниз . . . . . . . . . . . . . . . . . . . 102 4.5 Рекурсивный вызов функции . . . . . . . . . . . . . . . . . . . . . 103 4.6 Примеры решения заданий . . . . . . . . . . . . . . . . . . . . . . 106 4.7 Задания на функции . . . . . . . . . . . . . . . . . . . . . . . . . 108 4 Оглавление Глава 5. Массивы. Модуль numpy 112 5.1 Создание и индексация массивов . . . . . . . . . . . . . . . . . . 113 5.2 Арифметические операции и функции с массивами . . . . . . . . 120 5.3 Двумерные массивы, форма массивов . . . . . . . . . . . . . . . 125 5.4 Примеры решения задач . . . . . . . . . . . . . . . . . . . . . . . 130 5.5 Задания на массивы, модуль numpy . . . . . . . . . . . . . . . . . 132 Глава 6. Графики. Модуль matplotlib 134 6.1 Простые графики . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 6.2 Заголовок, подписи, сетка, легенда . . . . . . . . . . . . . . . . . 138 6.3 Несколько графиков на одном полотне . . . . . . . . . . . . . . . 141 6.4 Гистограммы, диаграммы-столбцы . . . . . . . . . . . . . . . . . 146 6.5 Круговые и контурные диаграммы . . . . . . . . . . . . . . . . . 149 6.6 Трёхмерные графики . . . . . . . . . . . . . . . . . . . . . . . . . 150 6.7 Учёт ошибок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 6.8 Примеры построения графиков . . . . . . . . . . . . . . . . . . . 153 6.9 Задания на построение графиков . . . . . . . . . . . . . . . . . . 156 Глава 7. Библиотеки, встроенные в numpy 160 7.1 Элементы линейной алгебры . . . . . . . . . . . . . . . . . . . . . 160 7.2 Быстрое преобразование Фурье . . . . . . . . . . . . . . . . . . . 163 7.3 Генерация случайных чисел . . . . . . . . . . . . . . . . . . . . . 166 7.4 Примеры решения заданий . . . . . . . . . . . . . . . . . . . . . . 167 7.5 Задания на использование встроенных библиотек numpy . . . . . 171 Предисловие Эта книга написана для инженеров, физиков, биологов и просто всех-всех, кто не изучал программирование прежде, но для кого оно может быть полезно как средство решения своих насущных задач, а не является самоцелью. Для них вы- бор правильного языка для обучения и работы очень важен: такой язык должен быть одновременно прост в освоении и использовании и логично организован, иметь много внешних модулей и расширений для решения реальных задач (то есть быть популярным), и быть хорошо доступен — свободно распространяться вместе со внешними модулями для всех основных операционных систем. Язык Python лучше всех других удовлетворяет всем этим требованиям и поэтому ныне используется во многих вузах и школах для обучения и одновременно бьёт ре- корды по популярности среди учёных и инженеров. Книга позволит вам, начав с нуля, быстро и качественно научиться делать нужные вещи: производить вычисления, читать, записывать и анализировать данные, строить графики, и при этом освоить основные принципы программи- рования: структуры данных, циклы, условия, подпрограммы, поиск ошибок и отладку. Подбирая материал, мы сознательно придерживались самых простых путей решения той иной задачи, даже если это несколько противоречило ака- демически принятому порядку изложения или сложившимся традициям. В ря- де случаев, например, при работе с текстовыми файлами и массивами, мы да- же предпочли использование широко популярных внешних модулей встроенным средствам. Всё изложение построено так, чтобы быть полезным и применимым сразу, ведь усваивается то, что используется. Книга может выступать как в качестве самоучителя, так и в качестве учеб- ника для преподавания в школе или вузе, задачника или просто справочника. Сведения об авторах • Сысоева Марина Вячеславовна — кандидат физико-математических наук, ассистент кафедры «Радиоэлектроника и телекоммуникации» Саратовско- го государственного технического университета имени Гагарина Ю.А. • Сысоев Илья Вячеславович — кандидат физико-математических наук, до- цент кафедры динамического моделирования и биомедицинской инженерии 6 Предисловие Саратовского национального исследовательского государственного универ- ситета имени Н.Г. Чернышевского. Сведения о рецензентах • Пономаренко Владимир Иванович — доктор физико-математических наук, ведущий научный сотрудник Саратовского филиала Института радиотех- ники и электроники имени В.А. Котельникова РАН. • Огнева Марина Валентиновна — кандидат физико-математических наук, заведующая кафедрою информатики и программирования Саратовского национального исследовательского государственного университета имени Н. Г. Чернышевского. • Курячий Георгий Владимирович — преподаватель факультета ВМК Мос- ковского Государственного Университета им. М. В. Ломоносова, автор кур- сов по Python для ВУЗов и Вечерней математической Школы, разработчик компании «Базальт СПО». Глава 1 Введение 1.1 Языки программирования Первый проект вычислительной машины был разработан Чарльзом Бэбби- джем в 1833 году в Великобритании. Описание проекта сделала Августа Ада Кинг (единственная дочь знаменитого поэта лорда Байрона), она же ввела такие фундаментальные понятия, как «цикл», «рабочая ячейка», и потому считается первым в мире программистом; язык программирования Ада назван в её честь. Машина Бэббиджа никогда не была реализована полностью, хотя на её реа- лизацию ушло 17 тысяч фунтов стерлингов и 9 лет времени. Основная проблема, с которою столкнулся Бэббидж, — низкий уровень элементной базы: промыш- ленность того времени не была готова производить детали нужного качества и в требуемые сроки. Тем не менее, его последователь Георг Шутц в 1850-ых по- строил несколько работающих «разностных машин». Первая реальная электрическая вычислительная машина была построена немецким инженером-исследователем К. Цузе в 1938 году, аналогичные рабо- ты велись независимо от него в США Д. Штибитцем и Г. Айкеном. Базовые принципы архитектуры современных ЭВМ были сформулированы Джоном фон Нейманом в 1946 году в США, а в 1948 году в Англии была построена первая ЭВМ, основанная на этих принципах. В СССР первая машина БЭСМ была спроектирована в 1951 году и уже в следующем году началась её практическая эксплуатация. Элементная база для первых ЭВМ 40-50-ых годов представляла собою вакуумные лампы. Переход на полупроводниковую элементную базу в 1960-ых позволил существенно повысить быстродействие, уменьшить размер и энергопотребление ЭВМ. Следующим эта- пом стал переход от отдельных транзисторов к интегральным логическим схе- мам. Первые программы заключались в установке ключевых переключателей на передней панели вычислительного устройства. Очевидно, таким способом мож- но было составить только небольшие программы. Одну из первых попыток со- 8 Глава 1. Введение здать полноценный язык программирования предпринял немецкий учёный Ко- нрад Цузе, который в период с 1943 по 1945 год разработал язык Plankalk¨ ul (Планкалкюль). В переводе на русский язык это название соответствует выра- жению «планирующее исчисление». Это был очень перспективный язык, факти- чески являвшийся языком высокого уровня, однако из-за военных действий он не был доведён до практической реализации. Неизвестно, насколько бы ускорилось развитие программирования, если бы наработки Цузе стали доступны другим учёным в конце 40-х годов, но на прак- тике с развитием компьютерной техники сначала получил распространение ма- шинный язык. Запись программы на нём состояла из единиц и нулей. Машинный язык принято считать языком программирования первого поколения (при этом разные машины разных производителей использовали различные коды, что тре- бовало переписывать программу при переходе на другую ЭВМ). Программа «Hello, world!» для процессора архитектуры x86 (ОС MS DOS, вывод при помощи BIOS прерывания int10h) выглядит следующим образом (в шестнадцатеричном представлении): BB 11 01 B9 0 D 00 B4 0 E 8 A 07 43 CD 10 E2 F9 CD 20 48 65 6 C 6 C 6 F 2 C 20 57 6 F 72 6 C 64 21 Вскоре на смену такому методу программирования пришло применение язы- ков второго поколения, также ограниченных спецификациями конкретных ма- шин, но более простых для использования человеком за счет использования мне- моник (символьных обозначений машинных команд) и возможности сопоставле- ния имен адресам в машинной памяти. Они традиционно известны под наиме- нованием языков ассемблера (транслируемые языки). Эти языки относятся к языкам низкого уровня, то есть близким к программированию непосредственно в машинных кодах. Однако при использовании ассемблера становился необходимым процесс пере- вода программы на язык машинных двоичных кодов перед её выполнением, для чего были разработаны специальные программы, также получившие название ассемблеров (трансляторов). Сохранялись и проблемы с переносимостью про- граммы с ЭВМ одной архитектуры на другую, и необходимость для программи- ста при решении задачи мыслить терминами «низкого уровня»: ячейка, адрес, команда. Классическая программа на одном из диалектов Ассемблера: .386 // тип процессора . MODEL SMALL // модель памяти . DATA // инициализированные данные: msg DB ’ Hello , Ђ World ’ , 13 , 10 , ’$ ’ . CODE // исполняемый код: START : mov ax , @DATA // Загрузка адреса сегмента в регистр ds mov ds , ax 1.1. Языки программирования 9 mov ax , 0900 h lea dx , msg int21h mov ax , 4 C00h i n t 21 h END START Поскольку команды ассемблера всего лишь более удобно обозначенные ин- струкции в двоичных кодах, как правило, можно добиться взаимнооднозначного соответствия между программами в машинных кодах и программами на ассем- блере, следовательно, они оказываются полностью взаимно заменяемыми. В этом кроется как ключевое преимущество, так и ключевой недостаток ассемблера. С одной стороны, программирование в двоичных кодах становится ненужным ров- но с того момента, как написана программа-транслятор, при этом сохраняется полный доступ ко всем возможностям ЭВМ. С другой стороны, если изменят- ся инструкции или регистры, программа на ассемблере окажется бесполезна. Поскольку архитектура ЭВМ меняется часто, а одновременно сосуществуют вы- числительные машины различных архитектур, получается, что программы на ассемблере приходится всё время переписывать. Чтобы не переписывать каждый раз программу, необходимо было создать некоторый уровень абстракции: спрятать детали организации конкретного ком- пьютера от программиста и позволить ему мыслить категориями более универ- сальными, чем категории конкретных инструкций конкретной машины. Такой шаг был впервые сделан в 1958 году, когда появился первый язык высокого уровня — FORTRAN (сокращение от FORmula TRANSlation). Хотя програм- мы на Фортране работали существенно (в 2–4 раза) медленнее, чем программы на ассемблере, переход на языки высокого уровня стал огромным шагом вперёд, поскольку число способных к программированию людей резко увеличилось: ста- ло не нужно помнить все регистры и инструкции процессора. Программировать начали не только профессиональные программисты, но и учёные и инженеры. Программа «Привет мир» на Фортране (эта программа будет компилиро- ваться только сравнительно современными компиляторами, поддерживающими стандарт Frotran 90 или более новые): P r o g r a m hello w r i t e (* ,*) ’ Hello , Ђ World ! ’ e n d Конечно, программа на Фортране требовала перевода в двоичный код, ко- торый, в отличие от ассемблера, нельзя было сделать простым взаимно одно- значным транслированием. Для этого была написана на ассемблере специальная программа — компилятор. Поэтому такие языки получили название компили- руемых. Когда изменяется архитектура ЭВМ, компилятор для каждого языка приходится переписывать, ведь он всё равно написан на ассемблере. Компили- руемые языки: Fortran (1958 г.), Algol (1960 г.), С (1970 г.) и его потомки (C++, 10 Глава 1. Введение D, Vala), Pascal (1970 г.) и его потомки (Delphi, FreePascal/Lazarus) — основа современного программирования. Программа «Привет мир» на Pascal: p r o g r a m hello ; b e g i n w r i t e ( ’ Hello , Ђ World ’ ); e n d Программа «Привет мир» на С: # i n l u d e < stdio .h > i n t main () { printf ( ’ Hello , Ђ World ’ ); r e t u r n 0; } Со временем производительность компьютеров выросла настолько, что ока- залось возможным не компилировать код программ в двоичный, а сразу испол- нять его строчка за строчкою. Такой способ называется интерпретированием, программа, интерпретирующая код — интерпретатором, а такие языки — ин- терпретируемые. MATLAB (1978 г.), Perl (1987 г.), Python (1992 г.), PHP (1995 г.), Ruby (1995 г.), Javascript (1995 г.) — примеры популярных интерпретируе- мых языков. Интерпретатор может работать в двух режимах: интерактивном и выполнения скрипта. Программа «Привет мир» на Perl: # !/ usr / bin / perl p r i n t " Hello , Ђ World \ n " Программа «Привет мир» на Python: p r i n t ( ’ Hello , Ђ World ’) На PHP: = ’ Hello , Ђ World ’? > На Ruby: { puts " Hello , Ђ World " } На JavaScript: < script type =" a p p l i c a t i o n / j a v a s c r i p t " > Alert ( ’ Hello , World ’); script > Интерпретируемые языки проще в освоении и использовании, но их область применения ограничена, поскольку программы на них не могут взаимодейство- вать с процессором напрямую, а производительность существенно ниже, чем у 1.1. Языки программирования 11 компилируемых. Они используются там, где либо время исполнения программы некритично, либо в случае, когда программа пишется на один раз, поскольку то- гда относительно большое время исполнения компенсируется существенно мень- шим временем написания. Так, Perl появился как язык для обработки текстов, PHP — пример удачного языка для создания сайтов. Промежуточное положение между компилируемыми и интерпретируемыми языками занимают языки виртуальных машин, самые распространённые из ко- торых Java (компилируется в машинный код виртуальной машины Java Virtual Machine) и C# (компилируется в машинный код виртуальной машины Common Language Runtime — основы для всех языков семейства .NET). Для них компиляция происходит не в двоичный код данного конкретного процессора, а в двоичный код специальной виртуальной машины (иногда его называют байткод). Таким образом, достигаются два существенных плюса: во- первых, можно не перекомпилировать программу под каждый новый процессор, |