Программирование для «нормальных» с нуля на языке Python. Часть 1 [М. В. Сысоева] (pdf) читать онлайн

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

В серии:

Библиотека 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
c

Сысоева М. В., Сысоев И. В., 2018
Basealt, 2018

Оглавление
5

Предисловие
Глава
1.1
1.2
1.3
1.4
1.5
1.6

1. Введение
Языки программирования . . . . . . . .
Парадигмы программирования . . . . .
Типизация в языках программирования
Области программирования . . . . . . .
Области применения Python . . . . . . .
Первая программа. Среда разработки . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

7
7
12
14
20
23
27

Глава
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8

2. Основные типы данных
Числа. Арифметические операции с числами. Модуль math
Строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Условия и логические операции . . . . . . . . . . . . . . . .
Списки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Кортежи . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Словари . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Примеры решения задач . . . . . . . . . . . . . . . . . . . .
Задания . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

32
32
38
42
48
53
55
56
59

Глава
3.1
3.2
3.3
3.4
3.5

3. Циклы
Цикл с условием (while) . . . . . . . . . . . . .
Цикл обхода последовательности (for) . . . . .
Некоторые основные алгоритмические приёмы
Отладка программы . . . . . . . . . . . . . . . .
Задания на циклы . . . . . . . . . . . . . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

67
67
70
73
78
86

Глава
4.1
4.2
4.3
4.4
4.5
4.6
4.7

4. Функции
Функции в программировании . . . .
Параметры и аргументы функций . .
Локальные и глобальные переменные
Программирование сверху вниз . . .
Рекурсивный вызов функции . . . . .
Примеры решения заданий . . . . . .
Задания на функции . . . . . . . . .

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

93
93
97
100
102
103
106
108

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

Оглавление

4
Глава
5.1
5.2
5.3
5.4
5.5

5. Массивы. Модуль numpy
Создание и индексация массивов . . . . . . . . . .
Арифметические операции и функции с массивами
Двумерные массивы, форма массивов . . . . . . .
Примеры решения задач . . . . . . . . . . . . . . .
Задания на массивы, модуль numpy . . . . . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

112
113
120
125
130
132

Глава
6.1
6.2
6.3
6.4
6.5
6.6
6.7
6.8
6.9

6. Графики. Модуль matplotlib
Простые графики . . . . . . . . . . . .
Заголовок, подписи, сетка, легенда . .
Несколько графиков на одном полотне
Гистограммы, диаграммы-столбцы . .
Круговые и контурные диаграммы . .
Трёхмерные графики . . . . . . . . . .
Учёт ошибок . . . . . . . . . . . . . . .
Примеры построения графиков . . . .
Задания на построение графиков . . .

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

134
134
138
141
146
149
150
152
153
156

Глава
7.1
7.2
7.3
7.4
7.5

7. Библиотеки, встроенные в numpy
Элементы линейной алгебры . . . . . . . . . . . . . . . .
Быстрое преобразование Фурье . . . . . . . . . . . . . .
Генерация случайных чисел . . . . . . . . . . . . . . . .
Примеры решения заданий . . . . . . . . . . . . . . . . .
Задания на использование встроенных библиотек numpy

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

160
160
163
166
167
171

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

Предисловие
Эта книга написана для инженеров, физиков, биологов и просто всех-всех, кто
не изучал программирование прежде, но для кого оно может быть полезно как
средство решения своих насущных задач, а не является самоцелью. Для них выбор правильного языка для обучения и работы очень важен: такой язык должен
быть одновременно прост в освоении и использовании и логично организован,
иметь много внешних модулей и расширений для решения реальных задач (то
есть быть популярным), и быть хорошо доступен — свободно распространяться
вместе со внешними модулями для всех основных операционных систем. Язык
Python лучше всех других удовлетворяет всем этим требованиям и поэтому ныне
используется во многих вузах и школах для обучения и одновременно бьёт рекорды по популярности среди учёных и инженеров.
Книга позволит вам, начав с нуля, быстро и качественно научиться делать
нужные вещи: производить вычисления, читать, записывать и анализировать
данные, строить графики, и при этом освоить основные принципы программирования: структуры данных, циклы, условия, подпрограммы, поиск ошибок и
отладку. Подбирая материал, мы сознательно придерживались самых простых
путей решения той иной задачи, даже если это несколько противоречило академически принятому порядку изложения или сложившимся традициям. В ряде случаев, например, при работе с текстовыми файлами и массивами, мы даже предпочли использование широко популярных внешних модулей встроенным
средствам. Всё изложение построено так, чтобы быть полезным и применимым
сразу, ведь усваивается то, что используется.
Книга может выступать как в качестве самоучителя, так и в качестве учебника для преподавания в школе или вузе, задачника или просто справочника.

Сведения об авторах
• Сысоева Марина Вячеславовна — кандидат физико-математических наук,
ассистент кафедры «Радиоэлектроника и телекоммуникации» Саратовского государственного технического университета имени Гагарина Ю.А.
• Сысоев Илья Вячеславович — кандидат физико-математических наук, доцент кафедры динамического моделирования и биомедицинской инженерии

Предисловие

6

Саратовского национального исследовательского государственного университета имени Н.Г. Чернышевского.

Сведения о рецензентах
• Пономаренко Владимир Иванович — доктор физико-математических наук,
ведущий научный сотрудник Саратовского филиала Института радиотехники и электроники имени В.А. Котельникова РАН.
• Огнева Марина Валентиновна — кандидат физико-математических наук,
заведующая кафедрою информатики и программирования Саратовского
национального исследовательского государственного университета имени
Н. Г. Чернышевского.
• Курячий Георгий Владимирович — преподаватель факультета ВМК Московского Государственного Университета им. М. В. Ломоносова, автор курсов по Python для ВУЗов и Вечерней математической Школы, разработчик
компании «Базальт СПО».

Глава 1
Введение
1.1

Языки программирования

Первый проект вычислительной машины был разработан Чарльзом Бэббиджем в 1833 году в Великобритании. Описание проекта сделала Августа Ада
Кинг (единственная дочь знаменитого поэта лорда Байрона), она же ввела такие
фундаментальные понятия, как «цикл», «рабочая ячейка», и потому считается
первым в мире программистом; язык программирования Ада назван в её честь.
Машина Бэббиджа никогда не была реализована полностью, хотя на её реализацию ушло 17 тысяч фунтов стерлингов и 9 лет времени. Основная проблема,
с которою столкнулся Бэббидж, — низкий уровень элементной базы: промышленность того времени не была готова производить детали нужного качества и
в требуемые сроки. Тем не менее, его последователь Георг Шутц в 1850-ых построил несколько работающих «разностных машин».
Первая реальная электрическая вычислительная машина была построена
немецким инженером-исследователем К. Цузе в 1938 году, аналогичные работы велись независимо от него в США Д. Штибитцем и Г. Айкеном. Базовые
принципы архитектуры современных ЭВМ были сформулированы Джоном фон
Нейманом в 1946 году в США, а в 1948 году в Англии была построена первая
ЭВМ, основанная на этих принципах.
В СССР первая машина БЭСМ была спроектирована в 1951 году и уже в
следующем году началась её практическая эксплуатация. Элементная база для
первых ЭВМ 40-50-ых годов представляла собою вакуумные лампы. Переход на
полупроводниковую элементную базу в 1960-ых позволил существенно повысить
быстродействие, уменьшить размер и энергопотребление ЭВМ. Следующим этапом стал переход от отдельных транзисторов к интегральным логическим схемам.
Первые программы заключались в установке ключевых переключателей на
передней панели вычислительного устройства. Очевидно, таким способом можно было составить только небольшие программы. Одну из первых попыток со-

8

Глава 1. Введение

здать полноценный язык программирования предпринял немецкий учёный Конрад Цузе, который в период с 1943 по 1945 год разработал язык Plankalkül
(Планкалкюль). В переводе на русский язык это название соответствует выражению «планирующее исчисление». Это был очень перспективный язык, фактически являвшийся языком высокого уровня, однако из-за военных действий он
не был доведён до практической реализации.
Неизвестно, насколько бы ускорилось развитие программирования, если бы
наработки Цузе стали доступны другим учёным в конце 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
int 21 h
END START
Поскольку команды ассемблера всего лишь более удобно обозначенные инструкции в двоичных кодах, как правило, можно добиться взаимнооднозначного
соответствия между программами в машинных кодах и программами на ассемблере, следовательно, они оказываются полностью взаимно заменяемыми. В этом
кроется как ключевое преимущество, так и ключевой недостаток ассемблера. С
одной стороны, программирование в двоичных кодах становится ненужным ровно с того момента, как написана программа-транслятор, при этом сохраняется
полный доступ ко всем возможностям ЭВМ. С другой стороны, если изменятся инструкции или регистры, программа на ассемблере окажется бесполезна.
Поскольку архитектура ЭВМ меняется часто, а одновременно сосуществуют вычислительные машины различных архитектур, получается, что программы на
ассемблере приходится всё время переписывать.
Чтобы не переписывать каждый раз программу, необходимо было создать
некоторый уровень абстракции: спрятать детали организации конкретного компьютера от программиста и позволить ему мыслить категориями более универсальными, чем категории конкретных инструкций конкретной машины. Такой
шаг был впервые сделан в 1958 году, когда появился первый язык высокого
уровня — FORTRAN (сокращение от FORmula TRANSlation). Хотя программы на Фортране работали существенно (в 2–4 раза) медленнее, чем программы
на ассемблере, переход на языки высокого уровня стал огромным шагом вперёд,
поскольку число способных к программированию людей резко увеличилось: стало не нужно помнить все регистры и инструкции процессора. Программировать
начали не только профессиональные программисты, но и учёные и инженеры.
Программа «Привет мир» на Фортране (эта программа будет компилироваться только сравнительно современными компиляторами, поддерживающими
стандарт Frotran 90 или более новые):

Program hello
write (* ,*) ’ Hello , Ђ World ! ’
end
Конечно, программа на Фортране требовала перевода в двоичный код, который, в отличие от ассемблера, нельзя было сделать простым взаимно однозначным транслированием. Для этого была написана на ассемблере специальная
программа — компилятор. Поэтому такие языки получили название компилируемых. Когда изменяется архитектура ЭВМ, компилятор для каждого языка
приходится переписывать, ведь он всё равно написан на ассемблере. Компилируемые языки: Fortran (1958 г.), Algol (1960 г.), С (1970 г.) и его потомки (C++,

Глава 1. Введение

10

D, Vala), Pascal (1970 г.) и его потомки (Delphi, FreePascal/Lazarus) — основа
современного программирования.
Программа «Привет мир» на Pascal:

program hello ;
begin
write ( ’ Hello , Ђ World ’ );
end .
Программа «Привет мир» на С:

# in lude < stdio .h >
int main () {
printf ( ’ Hello , Ђ World ’ );

return 0;
}

Со временем производительность компьютеров выросла настолько, что оказалось возможным не компилировать код программ в двоичный, а сразу исполнять его строчка за строчкою. Такой способ называется интерпретированием,
программа, интерпретирующая код — интерпретатором, а такие языки — интерпретируемые. MATLAB (1978 г.), Perl (1987 г.), Python (1992 г.), PHP (1995
г.), Ruby (1995 г.), Javascript (1995 г.) — примеры популярных интерпретируемых языков. Интерпретатор может работать в двух режимах: интерактивном и
выполнения скрипта.
Программа «Привет мир» на Perl:
# !/ usr / bin / perl
print " Hello , Ђ World \ n "
Программа «Привет мир» на Python:

print ( ’ Hello , Ђ World ’)
На PHP: