Поверхностное и глубокое копирование в Python

Перевод статьи Python Shallow Copy and Deep Copy.

Копирование объектов в Python

Оператор присваивания = не создаёт копию объекта. Присваивание создаёт новую переменную которая дублирует ссылку на исходный объект.

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

После запуска программа выдаст следующее:

Обе переменные ссылаются на один объект, это подтверждает одинаковый идентификатор объекта 140673303268168. Так что при изменении значений в переменных new_list и old_list, изменение будет видно в обоих переменных.

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

Читать далее Поверхностное и глубокое копирование в Python

Изменяемые и неизменяемые объекты в Python

Перевод статьи Mutable vs Immutable Objects in Python.

Все значения в Python это объекты. Объекты делятся на изменяемые и неизменяемые.

Python, схема объектов

Каждая переменная ссылается на экземпляр объекта. При создании, объекту присваивается уникальный идентификатор (object id) и тип объекта. Тип объекта не меняется после создания, но может изменится состояние объекта. Изменяемые объекты меняют своё состояние после создания, а неизменяемые сохраняются в том виде в котором были созданы.

Встроенные неизменяемые типы: int, float, bool, str, tuple, unicode. Встроенные изменяемые типы list, set, dict. Пользовательские классы обычно изменяемы. Для имитирования неизменяемости переопределите методы изменения и удаления значений чтобы они возвращали исключение.

Python. таблица изменяемых и неизменяемых объектов

Чтобы узнать ссылается ли переменная на изменяемый или неизменяемый рассмотрим подробнее функции id() и type().

Читать далее Изменяемые и неизменяемые объекты в Python

Python. Свойства

Перевод статьи Python @property.

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

Начальный пример

Представим что вы решили сделать класс хранящий температуру в градусах Цельсия. Он также должен реализовывать метод для конвертации температуры в градусы Фаренгейта. Реализуем класс так:

Затем создаём объект этого класса и меняем значение температуры как пожелаем:

Дополнительные десятичные разряды при конвертации в градусы Фаренгейта происходят из-за арифметической ошибки с плавающей запятой (попробуйте сложить 1.1 + 2.2 в интерпретаторе).

Когда мы присваиваем или извлекаем атрибут объекта, такой как temperature, Python ищет его в словаре объекта __dict__.

Внутри интерпретатора man.temperature становится man.__dict__['temperature'].

Читать далее Python. Свойства

Python. Функция property()

Перевод статьи Python | property() function.

Функция property() создаёт новое свойство. Свойство — это атрибут класса с которым связаны функции чтения и записи.

Параметры:

  • fget() – используется для получения значения атрибута
  • fset() – используется для установки значения атрибута
  • fdel() – используется для удаления атрибута
  • doc() – строка с документацией (docstring) для атрибута

Функция property() возвращает свойство с данными геттером, сеттером и deleter.

Вызванная без аргументов функция property() возвращает свойство без геттера, сеттера и deleter.

Читать далее Python. Функция property()

Обработка ошибок и проектирование компилятора

Перевод статьи Error Handling in Compiler Design.

Задача по обработке ошибок (Error Handling) включает в себя: обнаружение ошибок, сообщения об ошибках пользователю, создание стратегии восстановления и реализации обработки ошибок. Кроме того система обработки ошибок должна работать быстро.

Типы источников ошибок

Источники ошибок делятся на два типа: ошибки времени выполнения (run-time error) и ошибки времени компиляции (compile-time error).

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

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

Читать далее Обработка ошибок и проектирование компилятора

Статические и динамические области видимости

Перевод статьи Static and Dynamic Scoping.

Область видимости переменной x это область программы в которой использование имени x ссылается на объявление этой переменной. Одна из причин использование областей видимости — сохранить переменные в разных частях программы отличными друг от друга. Количество коротких имён для переменных ограничено и программисты используют общепринятые имена (например i для индекса массива). В любой программе среднего размера одинаковые названия переменных используются в разных частях программы.

Области видимости делятся на два вида: статические и динамические.

Статические области видимости

Статические области видимости (Static scoping) так же называются лексическими областями видимости (Lexical scoping). В этих областях видимости имена переменных всегда ссылаются на окружение более верхнего уровня. Это свойство текста программы и не связано со стеком вызовов во время выполнения. Статические области видимости упрощают написание модульного кода, так как программист вычисляет область видимости просто смотря на код. В отличии от этого, динамические области видимости требуют от разработчика учитывать все возможные варианты динамического контекста.

Читать далее Статические и динамические области видимости

Python. Структуры данных: список, кортеж, множество, словарь

Перевод параграфа 3.6 Data Structures из книги Intermediate Python.

Python содержит встроенные типы данных: списки, кортежи, словари.

Списки

Чтобы создать список используйте квадратные скобки или функцию list():

Список сохраняет порядок элементов с которым создаётся или в котором элементы добавляются. Списки являются последовательностями и поддерживают доступ к элементам по индексу, другие свойства последовательностей будут описаны в следующих главах.

Первый элемент списка находится под индексом 0, последний — на единицу меньше длины списка.

Метод append() добавляет элемент в список.

Читать далее Python. Структуры данных: список, кортеж, множество, словарь

Отзыв про Стратоплан

Я обучался на Стратоплане с сентября 2018 по май 2019, специальность "Руководитель отдела". Далее я опишу организацию процесса обучения.

Может показаться что отзыв негативный. Это не так, в целом, я рекомендую обучение на Стратоплане.

Занятия

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

У нас занятия проходили в 19 мск. Два раза в неделю, по будням. Одно занятие длилось в среднем час. Занятия проходили по Skype, голосом без видео.

Перед занятием обучающиеся смотрят видео (в среднем 40-60 минут). Кроме видео выдавалась ссылка на страницу с заданием в гуглдоке. На этой же странице ученики пишут ответы на вопросы из задания. Ответы от каждого ученика отдельно, но все видят ответы друг друга. Написание ответа рекомендовалось, но не было обязательным.

Во время занятия формировался окончательный ответ на задание, на той же странице в гуглдоке, но уже от всей команды. Его фиксировал либо куратор, либо один из учеников.

К конце занятие куратор давал ссылку на страницу с решением от преподавателя и предлагал прочитать и сравнить его с решением группы.

Читать далее Отзыв про Стратоплан

Задача Pythagorean Triplet

Условие

Дано число \(N\). Найти все пифагоровы тройки такие что \(a + b + c = N\). Пифагоровы тройки удовлетворяют условиям \(a^2 + b^2 = c^2\) и \(a \lt b \lt c\).

Решение

Простейшее решение перебором даёт сложность \(O(n^2)\):

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

Эту же задачу можно решить за \(O(n)\). Из условий задачи следуют два уравнения:

  • \(a + b + c = N\)
  • \(a^2 + b^2 = c^2\)

\(N\) является константой. Примем так же за константу \(a\). Остаётся система из двух уравнений с двумя неизвестными. Последовательно решаем её.

  • \(c = N - a - b\) (1)
  • \(c^2 - b^2 = a^2\)
  • \((c - b)(c + b) = a^2\) (2)
  • \((n - a - b - b)(n - a - b + b) = a^2\) (подставляем 1 в 2)
  • \((n - a - 2b)(n - a) = a^2\)
  • \(n^2 - an - 2nb - an + a^2 + 2ab = a^2\)
  • \(n^2 - 2an - 2nb + 2ab = 0\)
  • \((2a - 2n)b = 2an - n^2\)
  • \(b = \frac{2an - n^2}{2a - 2n}\)
  • \(c = N - a - b\)

Используя формулы для вычисления \(b\) и \(c\) в цикле по \(a\) находим все пифагоровы тройки.

Курсы на brilliant.org

Brilliant org logo

На brilliant.org находятся курсы по математике и CS (полный список курсов). Курсы построены в полуигровой форме, сначала даётся попытка решить задание, потом краткое объяснение. Задачи направлены на концептуальное понимание тем, теории мало, периодически бывают ссылки на подробное описание.

Большинство задач очень простые, так как темы делятся на маленькие шаги. Например, в теме про наименьшее общее кратное, перед его объяснением проходит более 10 шагов. Часть задач интерактивная, например, связанные с алгоритмами и программированием.

Кроме курсов на brilliant.org есть ежедневные задачи на темы освещенные в курсах и wiki с подробным разъяснением теории. 

Курсы платные, примерно 4500р. при годовой подписке.

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