1.2 АРХИТЕКТУРА ВЫПОЛНЕНИЯ ПРОГРАММ НА PYTHON

Понимание того, как выполняется программа на Python, необходимо для осознанной работы с кодом, а не только для изучения внутреннего устройства интерпретатора. Это особенно важно в анализе данных, где программы часто работают с большими объёмами информации.

1.2.1 Особенности выполнения программ на Python

Python выполняется интерпретатором, что определяет особенности работы с программой на практике. Выполнение происходит последовательно – от первой строки к последней, при этом каждая инструкция исполняется в момент обращения к ней. Ошибки, как правило, обнаруживаются во время выполнения, а не до запуска программы.

Порядок расположения инструкций имеет принципиальное значение: если переменная используется до её создания, возникает ошибка.

Выполнение программы может быть организовано поэтапно. В интерактивных средах (например, Jupyter Notebook) возможно запускать отдельные блоки кода с анализом промежуточных результатов.

Поведение программы зависит от текущего состояния памяти. Если данные были изменены ранее, это влияет на последующие вычисления.

Для аналитика важно учитывать не только синтаксис языка, но и порядок выполнения программы.

1.2.2 Объекты и переменные

В Python все данные представлены в виде объектов: это могут быть числа, строки, списки, функции и даже классы. Рассмотрим пример:

x = 10
y = "Привет"
z = [1, 2, 3]

В приведённом примере создаются три разных объекта – целое число, строка и список. Переменные x, y и z при этом не хранят сами значения, а содержат ссылки на соответствующие объекты, размещённые в памяти. Переменную можно рассматривать как имя, связанное с объектом. Если ей присваивается новое значение, она начинает указывать на другой объект. Для определения типа объекта используется функция type():

print(type(x))
print(type(y))
print(type(z))

Результат выполнения:

<class 'int'>
<class 'str'>
<class 'list'>

Функция type() возвращает тип объекта, на который указывает переменная.

Понимание того, что переменные являются ссылками на объекты, важно при работе с данными. Например, при использовании списков, таблиц Pandas или массивов NumPy изменение объекта через одну переменную может повлиять на данные, доступные через другую.

По этой причине при разработке программ анализа данных учитывается не только значение переменных, но и то, как они связаны с объектами в памяти.

1.2.3 Изменяемость объектов и поведение ссылок

В предыдущем подразделе было отмечено, что переменная в Python является ссылкой на объект. Поведение программы во многом зависит от того, можно ли изменить сам объект после его создания. С этой точки зрения объекты в Python делятся на изменяемые и неизменяемые.

Неизменяемые объекты – это объекты, состояние которых нельзя изменить после создания. Если переменной присваивается новое значение, создаётся новый объект. К неизменяемым типам относятся:

·  целые числа;

·  вещественные числа;

·  строки;

·  кортежи.

Рассмотрим пример:

a = 5
b = a
a = 10
 
print(b)

Результат:

5

Здесь при выполнении операции a = 10 создаётся новый объект со значением 10. Переменная b продолжает ссылаться на прежний объект со значением 5. Сам объект числа 5 не изменяется. Теперь рассмотрим изменяемый объект.

Изменяемые объекты – это объекты, содержимое которых можно изменить без создания нового объекта. К изменяемым типам относятся:

·  списки;

·  словари;

·  множества.

Пример:

list1 = [1, 2, 3]
list2 = list1
 
list1.append(4)
 
print(list2)

Результат:

[1, 2, 3, 4]

В этом примере обе переменные ссылаются на один и тот же объект. Метод append() изменяет сам список, поэтому изменения отображаются при обращении к нему через обе переменные.

Практическое значение для анализа данных

При работе с данными важно учитывать, является ли объект изменяемым. Например:

·  при передаче списка в функцию он может быть изменён внутри неё;

·  при работе с таблицами Pandas изменения могут затронуть исходные данные, если не создана копия;

·  при подготовке обучающих выборок случайное изменение исходного массива может привести к ошибкам в модели.

Поэтому при необходимости сохранить исходные данные следует создавать копии объектов.

1.2.4 Область видимости переменных

При выполнении программы важно понимать, где именно переменная может быть использована. Это определяется её областью видимости.

Область видимости – это часть программы, в пределах которой переменная существует и доступна для обращения.

Наиболее распространённая ситуация – объявление переменной внутри функции. В этом случае переменная существует только в пределах этой функции. Рассмотрим пример:

def example():

    local_var = 10

    print(local_var)

 

example()

Внутри функции создаётся переменная local_var. Она доступна только во время выполнения функции example(). Если попытаться обратиться к ней вне функции, возникнет ошибка:

print(local_var)

Интерпретатор сообщит, что имя не определено, поскольку переменная была создана в локальной области видимости и не существует за её пределами. Такое поведение позволяет изолировать части программы друг от друга. Переменные, созданные внутри функции, не влияют на переменные вне её, если это специально не предусмотрено. Для аналитика это имеет практическое значение. При написании функций для обработки данных важно:

·  не изменять случайно внешние переменные;

·  передавать данные через параметры функции;

·  возвращать результат явно с помощью оператора return.

Правильное понимание области видимости способствует написанию структурированного и предсказуемого кода, особенно при разработке аналитических модулей и моделей.

1.2.5 Исключения и обработка ошибок

В задачах анализа данных программа часто работает с внешними источниками информации: файлами, базами данных, сетевыми сервисами. Данные могут быть неполными, повреждёнными или иметь неожиданный формат, что может приводить к ошибкам во время выполнения программы. В Python для работы с подобными ситуациями используется механизм обработки исключений.

Исключение – это событие, возникающее во время выполнения программы и прерывающее её обычный ход.

Рассмотрим пример:

try:

    number = int("abc")

except ValueError:

    print("Ошибка преобразования строки в число")

Пояснение к коду

int("abc") – попытка преобразовать строку в целое число.

Такое преобразование невозможно, поэтому возникает ошибка типа ValueError.

Конструкция try-except позволяет перехватить эту ошибку и выполнить альтернативное действие вместо аварийного завершения программы. В анализе данных обработка исключений особенно важна при:

·  чтении файлов, которые могут отсутствовать или иметь неверный формат;

·  преобразовании типов данных;

·  работе с пользовательским вводом;

·  взаимодействии с внешними источниками данных.

Механизм обработки исключений позволяет избежать аварийного завершения программы и даёт возможность корректно реагировать на возникающие ошибки в процессе выполнения.

Итоги подраздела

Особенности выполнения программ на Python связаны с порядком выполнения инструкций и организацией данных в памяти. Переменные при этом выступают как ссылки, что влияет на поведение программы и результаты вычислений.

Различие между изменяемыми и неизменяемыми объектами особенно проявляется при работе со структурами данных. В ряде случаев это приводит к неожиданным результатам при выполнении операций.

Ошибки выполнения не всегда останавливают программу. При использовании механизма исключений их можно обработать и продолжить вычисления.

Практическое понимание этих особенностей формируется при анализе поведения программ. В лабораторной работе №1 предлагается рассмотреть влияние ссылок, изменяемости объектов и обработки исключений на выполнение кода.