- •§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. Подсчет букв
§3.10. Стековые диаграммы
Для наглядности можно рисовать так называемые стековые диаграммы. Называются они так не случайно: они изображают стек вызовов.
Стек - это специальная структура данных, напоминающая стопку тарелок, потому что взаимодействие со стеком производится по специальному правилу LIFO (от англ. Last In First
44
Ревизия: 170
Функции
Out - «последним вошел, первым вышел»). Возвращаясь к аналогии со стопкой тарелок, мы кладем тарелки одну на другую, а берем их, начиная сверху. Немного позже мы научимся моделировать стек и некотрые другие структуры данных, которые часто используются для решения различных задач, а пока, ограничившись интуитивным пониманием стека, изобразим стековую диаграмму для примера из предыдущего раздела.
F1 () begins Hello world!
fl()
f1() ends
f 2 () begins
£2()
f2() ends
f3 () begins
£3()
f3() ends
Main program begins
main
Main program ends
На данной диаграмме поток выполнения указан стрелками, подпрограммы -прямоугольными блоками; справа и слева от стековой диаграммы дописаны строки, выводимые программой. Внизу «стопки» находится основная программа (она обозначается
как main ); соответственно завершиться она не может до тех пор, пока не завершатся все
функции, которые в стеке вызовов находятся «над ней». Таким образом, использование стека для отслеживания потока выполнения является наиболее естественным и простым решением. В процессе выполнения программы стек вызовов может разрастаться и опустошаться по многу раз.
Когда в одной из функций возникает исключение, часто бывает довольно трудно понять, при каких условиях (или при каком наборе параметров) произошел сбой, т.к. одна и та же функция может вызываться из различных мест программы по многу раз. Поэтому для облегчения процесса отладки интерпретатор Питона выводит не только номер строки, где возникло исключение, но и весь стек вызовов на момент возникновения исключения. Давайте немного подправим нашу программу так, чтобы в функции f 1 () было сгенерировано исключение деления на ноль, заменив вывод приветствия мира на выражение а = 1/0:
def fl () :
print "fl а = 1/0 print "fl
begins"
ends"
Теперь запустим эту программу:
$ python ргодб |
РУ |
|
|
|
|
Main |
program begins |
|
|
|
|
f3() |
begins |
|
|
|
|
f2() |
begins |
|
|
|
|
fl() |
begins |
|
|
|
|
Traceback (most recent |
ca |
11 |
last): |
||
45
Ревизия: 170
Функции
File "ргодб.ру", |
line |
17, |
in ? |
|
f3() |
|
|
|
|
File "ргодб.ру", |
line |
13, |
in f3 |
|
f2() |
|
|
|
|
File "ргодб.ру", |
line |
8, |
in f2 |
|
fl() |
|
|
|
|
File "ргодб.ру", |
line |
3, |
in fl |
|
a = 1/0 |
|
|
|
|
ZeroDivisionError: |
integer |
division |
or modulo by zero |
|
После сообщения о начале выполнения функции f 1 () интерпретатор вывел так называемый traceback (русскоязычные программисты обычно так и говорят «трейсбэк» или просто «трейс»). Traceback содержит не только названия функций из стека вызовов, но и номера строк, из которых был произведен каждый вызов. Кроме номеров указывается еще и название файла с программой, ведь проект может содержать не один модуль. Так что найти и исправить ошибку становится гораздо проще.
