- •§0.1. Базовые знания
- •§0.2. Где достать интерпретатор языка Питон?
- •§0.3. Установка интерпретатора языка Питон в unix
- •§0.3.1. Установка/обновление Питона из грт-пакета
- •§0.3.2. Установка Питона из исходного кода
- •§0.4. Установка Питона в ос Windows
- •§0.5. Запуск программ, написанных на Питоне
- •§0.6. Среда разработки
- •§1.1. Алгоритмы и программы
- •§1.2. Языки программирования и уровни абстракции
- •Глава 1. Базовые понятия
- •§1.3. Формальные и естественные языки
- •§1.4. Интерпретаторы и компиляторы
- •§1.5. Первая программа
- •§1.6. Что такое отладка?
- •§1.6.1. Синтаксические ошибки (syntax errors)
- •§1.6.2. Ошибки выполнения (runtime errors)
- •§1.6.3. Семантические ошибки (semantic errors)
- •§1.6.4. Процесс отладки
- •Глава 2. Переменные, операции и выражения
- •§2.1. Значения и типы
- •§2.2. Преобразование типов
- •§2.3. Переменные
- •§2.4. Имена переменных и ключевые слова
- •§2.5. Выражения
- •§2.6. Выполнение выражений
- •§2.7. Операторы и операнды
- •§2.8. Порядок операций
- •§2.9. Простейшие операции над строками
- •§2.10. Композиция
- •Глава 3. Функции §3.1. Подпрограммы
- •§3.2. Вызовы функций
- •§3.3. Справочная система
- •§3.4. Импорт модулей и математические функции
- •§3.5. Композиция
- •§3.6. Создание функций
- •§3.7. Параметры и аргументы
- •§3.8. Локальные переменные
- •§3.9. Поток выполнения
- •§3.10. Стековые диаграммы
- •§3.11. Функции, возвращающие результат
- •Глава 4. Компьютерная графика
- •Глава 5. Логические выражения, условия и рекурсия §5.1. Комментарии в программах
- •§5.2. Простые логические выражения и логический тип данных
- •§5.3. Логические операторы
- •§5.4. Выполнение по условию и «пустота»
- •§5.5. Ввод данных с клавиатуры
- •§5.6. Альтернативные ветки программы (Chained conditionals)
- •§5.7. Пустые блоки
- •§5.8. Вложенные условные операторы (Nested conditionals)
- •§5.9. Рекурсия
- •§5.10. Стековые диаграммы рекурсивных вызовов
- •§5.11. Максимальная глубина рекурсии
- •§5.12. Числа Фибоначчи
- •Глава 6. Циклы
- •§6.1. Оператор цикла while
- •§6.2. Счетчики
- •§6.3. Бесконечные циклы
- •§6.4. Альтернативная ветка цикла while
- •§6.5. Табулирование функций
- •§6.6. Специальные и экранируемые символы
- •§6.7. Числа Фибоначчи и оператор цикла while
- •§6.8. Вложенные операторы цикла и двумерные таблицы
- •§6.9. Классификация операторов цикла
- •§6.10. Управляющие структуры
- •Глава 7. Строки
- •§7.1. Оператор индексирования
- •§7.2. Длина строки и отрицательные индексы
- •§7.3. Перебор и цикл for
- •§7.4. Срезы строк
- •§7.5. Сравнение строк
- •§7.6. Строки нельзя изменить
- •§7.7. Функция find
- •§7.8. Циклы и счётчики
- •§7.9. Модуль string
- •§7.10. Классификация символов
- •§10.2. Операции над словарями
- •§10.3. Методы словарей
- •§10.4. Использование псевдонимов и копирование
- •§10.5. Разряженные матрицы
- •§10.6. Подсказки
- •§10.7. Тип «длинное целое число»
- •§10.8. Подсчет букв
Глава 1. Базовые понятия
Для начала придется разобраться с некоторыми базовыми понятиями. Не стоит их заучивать - достаточно их понять хотя бы на интуитивном уровне. Позднее вы начнете использовать их на практике, и все встанет на свои места. Это, пожалуй, одна из самых утомительных частей книги.
§1.1. Алгоритмы и программы
Понятие алгоритма является одним их центральных понятий всей компьютерной дисциплины. Слово «алгоритм», в сущности, является синонимом слов «способ» или «рецепт». Можно говорить, в этом смысле, об алгоритме нахождения корней уравнения по его коэффициентам, или об алгоритме разложения натурального числа на простые множители. Если в основе алгоритмов лежат простые вычисления, то такие алгоритмы называют численными. Впрочем, довольно часто рассматриваются и нечисленные алгоритмы. Например, в роли исходных данных и результатов могут выступать последовательности символов: тексты, формулы и т.д. В роли операций - не привычные операции сложения, умножения и подобные им, а операции сцепления строк или операции замены одних символов на другие по некоторой таблице соответствий. Примером может служить кодирование текста азбукой Морзе. Существуют алгоритмы построения сложных графических объектов и их преобразования. Для того, чтобы научить компьютер что-то делать, нужно предварительно составить алгоритм.
Алгоритм - это описанный со всеми подробностями способ получения результатов, удовлетворяющих поставленным условиям, по исходным данным.
Программа - это последовательность машинных инструкций, описывающая алгоритм. Разумеется, для того, чтобы написать программу, нужно придумать алгоритм. Компьютерные программы обычно составляются на специальных языках программирования.
§1.2. Языки программирования и уровни абстракции
Существует несколько подходов к программированию. Изначально вычисления описывались на уровне машинных команд в двоичном коде. Логику подобных программ было довольно трудно уловить из-за того, что программисту приходилось уделять внимание таким вопросам, как, например, сколько ячеек памяти необходимо выделить для хранения того или иного значения. Для сложения двух чисел необходимо было предварительно вычислить адреса ячеек памяти, в которых хранились складываемые значения, и только после этого произвести операцию сложения двоичных чисел. Такой подход к программированию иногда называют адресным.
Прочесть и разобраться, как работает программа, написанная в двоичных кодах, было очень сложно, не говоря уже о том, чтобы найти и исправить в ней ошибку. Поэтому для упрощения своей работы программисты придумали мнемокоды (от греч. Mnemonikos <— mnemon - запомнить) или мнемоники - буквенные обозначения машинных двоичных команд, которые проще запомнить, чем последовательности нулей и единиц. Для упрощения работы с ячейками памяти стали использовать понятие переменной.
Переменная - в программировании это буквенное обозначение области памяти, в которой хранится некоторое значение.
14
Ревизия: 170
Базовые понятия
Для перевода мнемокодов в машинные инструкции и имен переменных в адреса ячеек памяти использовалась специальная программа - транслятор. Языки мнемо-кодов получили название ассемблеров.
Технологии разработки продолжали развиваться, специалисты искали новые подходы и вскоре стали выкристаллизовываться идеи, которые впоследствии легли в основу так называемого структурного подхода. Было замечено, что все вычисления сводятся следующим элементарным действиям:
Ввод данных с клавиатуры, из файла или с какого-либо устройства;
Вывод данных на экран, в файл, на принтер или другое устройство;
Выполнение некоторых операций над числами, строками или другими объектами;
Выбор ветви выполнения программы на основе принятого решения (например, по результатам сравнения двух значений);
Повторение группы операций чаще всего с изменением одного или нескольких параметров.
Скоро вы увидите, что это действительно так. Параллельно начали появляться новые трансляторы, которые преобразовывали в машинные команды программы, написанные на языках, основанных на этих базовых операциях. Такие языки стали называть структурными или языками высокого уровня. Программы на высокоуровневых языках описывают вычислительный процесс на более высоком уровне абстракции, т.е. позволяют программисту абстрагироваться от особенностей машинной реализации.
Проиллюстрируем это двумя простыми примерами. Первая программа, имитирует низкоуровневый язык, а вторая - высокоуровневый:
1.Занести в регистр edx адрес первого числа
Занести в регистр-счетчик 10
Занести в регистр еах 0
Метка 1р:
Сравнить значение регистра еах со значением, хранящимся по адресу
взятому из регистра edx
Если оно меньше или равно, то перейти к метке l_next
Занести в регистр еах значение из ячейки, адрес которой хранится
в edx
Метка l_next:
Прибавить к значению регистра edx 4
Если в регистре-счетчике не 0, то уменьшить значение в регистре-счетчике на 1 и перейти к метке 1р
Записать в переменную Мах значение из регистра еах 2.Занести в переменную Мах 0
Повторять пока переменная i изменяется от 1 до 10 с шагом +1:
Если i-e число больше Мах, то занести его в переменную Мах
Вывести значение переменной Мах.
15
Ревизия: 170
Базовые понятия
Обе программы находят максимальное из десяти заданных натуральных чисел. Названия операций изменены на русскоязычные аналоги (такой способ записи иногда называют псевдокодом), но смысл действий сохранен, так что понять их различие несложно.
Чаще всего программы, написанные на языках высокого уровня работают медленнее, т.к. трансляторы строят не самый оптимальный машинный код по тексту программы. Но зато языки высокого уровня обладают многими преимуществами: их легче читать и понимать, кроме того, они имеют свойство переносимости. Это означает то, что высокоуровневые программы могут выполняться на различных типах компьютеров или под управлением различных операционных систем, причем с минимальными изменениями или вовсе без таковых, в то время как низкоуровневые программы обычно пишутся под определенный тип компьютеров или операционную систему, и для переноса таких программ на другую платформу их приходится переписывать.
Обратите внимание на то, что в первой программе результат не выводится. Способ вывода в низкоуровневой программе будет разным в зависимости от платформы, на которой будет выполняться данная программа. Более того, на процессоре Intel 80286 эта программа работать тоже не сможет, т.к. регистры edx и еах появились только в Intel 80386.
Классическими структурными языками являются С1 и Pascal. Они позволяют описывать вычислительные процессы на более высоком уровне абстракции, чем ассемблеры, но, тем не менее, им присущ ряд недостатков. В частности, программисту, пишущему на этих языках, все же приходится явно указывать тип переменных, с которыми будут работать его программы, для того, чтобы транслятор знал, сколько памяти выделять под их хранение. Кроме того, в переменных предназначенных для хранения целых чисел невозможно сохранить, например, строку.
В последнее время стали приобретать популярность так называемые языки очень высокого уровня. Они позволяют абстрагироваться от типов переменных, что открывает новые возможности. С ними мы познакомимся в процессе изучения языка Python, который является одним из представителей этой группы языков программирования.
