Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Чаплыгин А.Н. Учимся програмировать вместе с Пи...doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
3 Мб
Скачать
☆

§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 содержит не только названия функций из стека вызовов, но и номера строк, из которых был произведен каждый вызов. Кроме номеров указывается еще и название файла с программой, ведь проект может содержать не один модуль. Так что найти и исправить ошибку становится гораздо проще.