50 команд на Python часть 8. Внутренние переменные, Сравнение объектов, Slices, Лямбда-выражения, Компиляция объектов кода

41. Внутренние переменные
Для людей, пришедших из других языков программирования, существует концепция, согласно которой определенные переменные или методы могут быть доступны только внутри объекта. В Python такой концепции нет. Все элементы объекта доступны. Однако существует правило стиля, которое может имитировать такое поведение. Любые имена, начинающиеся с символа подчеркивания, должны рассматриваться как внутренние имена и быть закрытыми для объекта. Однако они не являются скрытыми, и явной защиты для этих переменных или методов не существует. Программист должен следовать намерениям автора класса и не изменять ни одно из этих внутренних имен. Однако вы можете свободно вносить такие изменения, если в этом возникнет необходимость.
42. Сравнение объектов
В Python существует несколько способов сравнения объектов, с некоторыми оговорками. Первая заключается в том, что между объектами можно проверить две вещи: равенство и идентичность. Если вы проверяете идентичность, вы проверяете, действительно ли два имени ссылаются на один и тот же объект. Это можно сделать с помощью команды 'cmp (obj1, obj2)'. Вы также можете проверить это условие с помощью ключевого слова 'is'. Например, 'obj1 is obj2'. Если вы проверяете равенство, вы проверяете, равны ли значения в объектах, на которые ссылаются два имени. Этот тест выполняется с помощью оператора '==', как в примере 'obj1 == obj2'. Проверка на равенство может стать сложной для более сложных объектов.
43. Slices
Хотя это и не совсем команда, но срезы - слишком важная концепция, чтобы не упомянуть ее в этом списке основных команд. Индексирование элементов в структурах данных, таких как списки, является одним из наиболее распространенных действий в Python. Вы можете выбрать один элемент, задав одно значение индекса. Что еще более интересно, можно выбрать диапазон элементов, указав начальный и конечный индексы, разделенные двоеточием. Это возвращается в виде нового списка, который можно сохранить в имени новой переменной. Можно даже изменить размер шага, что позволяет пропустить некоторое количество элементов. Так, вы можете взять каждый нечетный элемент из списка 'a' с помощью фрагмента 'a[1::2]'. Это начинается с индекса 1, продолжается до конца и перебирает значения индекса по 2 за раз. Ломтикам можно присваивать отрицательные значения индексов. В этом случае они начинаются с конца списка и отсчитываются назад.
44. Лямбда-выражения
Поскольку объекты и имена, указывающие на них, - это действительно разные вещи, вы можете иметь объекты, на которые нет ссылок. Одним из примеров этого является лямбда-выражение. С его помощью вы можете создать анонимную функцию. Это позволяет использовать методы функционального программирования в Python. Формат: ключевое слово "лямбда", затем список параметров, двоеточие и код функции. Например, вы можете создать собственную функцию для возведения числа в квадрат с помощью 'lambda x: x*x'. Затем вы можете получить функцию, которая может программно создавать новые функции и возвращать их в вызывающий код. С помощью этой возможности вы можете создавать генераторы функций, чтобы иметь самомодифицирующиеся программы. Единственным ограничением является то, что они ограничены одним выражением, поэтому вы не можете создавать очень сложные функции.
45. Компиляция объектов кода
Python - интерпретируемый язык, что означает, что исходный код, который вы пишете, должен быть скомпилирован в формат байт-кода. Затем этот байт-код поступает в движок Python для выполнения инструкций. В вашей программе может возникнуть необходимость взять под контроль процесс преобразования кода в байт-код и выполнения результатов. Возможно, вы захотите создать свой собственный REPL. Команда 'compile ()' принимает строковый объект, содержащий коллекцию кода Python, и возвращает объект, представляющий собой перевод этого кода в байт-код. Затем этот новый объект можно передать команде 'eval ()' или 'exec ()' для выполнения. Вы можете использовать параметр 'mode=', чтобы указать компилятору, какой тип кода компилируется. Режим 'single' - это один оператор, 'eval' - одно выражение, а 'exec' - целый блок кода.