ЭВТЮМИЯ

Итераторы и генераторы

Основы Python | 21.05.2025
17 0

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

Мы уже не единожды работали с итераторами, например, когда перебирали элементы коллекций в цикле for. Он неявно превращает итерируемый объект в итератор, обеспечивающий последовательный доступ к его элементам. Но также мы можем вручную преобразовать итерируемый объект в итератор и последовательно получить каждый его элемент с помощью функций iter() и next().

Функция iter() принимает итерируемый объект (например, список, кортеж или строку) и возвращает его итератор. Он не является копией переданной коллекции, а просто указывает на то, где в данный момент находится процесс итерации.

Функция next() принимает итератор и возвращает следующий элемент из его последовательности.

Перегрузка арифметических операторов и операторов сравнения

Основы Python | 12.07.2025
17 0

Встроенные типы данных поддерживают множество стандартных операций. Например, числа поддерживают все арифметические операции, а строки мы можем складывать и умножать на число.

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

Например, давайте вспомним, что в математике есть такое понятие как вектор – направленный отрезок, соединяющий две точки. Тогда координатами вектора AB с началом в точке A с координатами (x1; y1) и концом в точке B с координатами (x2; y2) является разность соответствующих координат конца и начала, то есть (x2 - x1; y2 - y1). Поэтому при создании класса вектора Vector мы можем инициализировать его координатами x и y, представляющими собой его смещение относительно начала координат:

class Vector:
    def __init__(self, x: int | float, y: int | float):
        self.x = x
        self.y = y
        
    def __repr__(self) -> str:
        return f"Vector(x={self.x}, y={self.y})"

Генераторы коллекций

Основы Python | 10.04.2025
16 0

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

Один из способов сделать это – перебрать все элементы исходного списка в цикле for и добавить в новый список квадраты тех чисел, которые делятся на 2 без остатка:

numbers = [1, 2, 3, 4, 5]
squared_numbers = []
for n in numbers:
    if n % 2 == 0:
        squared_numbers.append(n ** 2)
print(squared_numbers)
# Вывод: [4, 16]

Этот код отлично справляется со своей задачей, но в Python существует более компактный способ создания списков, называемый генератором списка (или списочным выражением). Он позволяет создать новый список всего в одну строку кода.

Атрибуты и методы класса. Статические методы

Основы Python | 02.07.2025
16 0

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

Чтобы понять разницу, давайте рассмотрим пример с классом Parcel, описывающим посылку в курьерской службе. У такого класса могут быть следующие атрибуты:

  • Атрибуты экземпляра класса – это уникальные характеристики конкретной посылки. Например, weight для веса или address для адреса доставки. У каждой посылки свой вес и свой адрес.
  • Атрибуты класса – это характеристики, которые одинаковы для всех посылок, обрабатываемых этой службой. Например, carrier для названия курьерской компании. Это свойство не меняется от посылки к посылке.

Перебор элементов коллекций

Основы Python | 24.02.2025
14 0

Все встроенные коллекции в Python, такие как списки, кортежи, строки, множества и словари, объединяет то, что они являются итерируемыми объектами (англ. iterable object), то есть такими объектами, которые поддерживают возможность последовательного прохода по своим элементам. Это означает, что мы можем перебрать каждый элемент таких коллекций в цикле for:

for элемент in коллекция:
    действия_с_элементом

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

Методы списков

Основы Python | 14.03.2025
14 0

Списки в Python обладают множеством встроенных методов, которые значительно упрощают работу с ними. При этом списки изменяемы, поэтому большая часть методов изменяет исходный список и возвращает None. Это отличает их от строк, для которых методы возвращают их преобразованную копию.

Метод list.append() добавляет элемент в конец списка. Например, добавим в конец списка с одеждой новый элемент:

clothes = ["Туника", "Тога"]
clothes.append("Мантия")
print(clothes) 
# Вывод: ['Туника', 'Тога', 'Мантия']

Списки и кортежи

Основы Python | 10.03.2025
12 0

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

Списки, благодаря своей гибкости, являются одним из наиболее часто используемых типов данных в Python. Кортежи в свою очередь идеально подходят для хранения набора фиксированных значений, обеспечивая целостность данных, занимая (в некоторых случаях) меньше памяти и демонстрируя более высокую производительность при переборе элементов.

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

Сохранение и восстановление объектов

Основы Python | 30.10.2025
12 0

Текстовые форматы, например, CSV и JSON могут сериализовать (преобразовать в текст) только базовые типы: строки, числа, списки и словари, однако они не позволят сохранить данные более сложных типов, например, экземпляры классов.

Модуль pickle был создан специально для решения этой проблемы. С английского слово «pickle» переводится как «соленья», что является метафорой для «консервирования» данных.

Ключевой особенностью модуля pickle является использование двоичного формата хранения данных. Он не пытается быть читаемым человеком, а сосредоточен на сохранении внутренней структуры объекта. По этой причине файлы, созданные с помощью pickle, всегда открываются в двоичном режиме (с буквой «b» в конце, например, "rb" или "wb").

Наследование и полиморфизм

Основы Python | 23.06.2025
11 0

Наследование и полиморфизм – это ещё два основных принципа ООП, которые часто используются вместе. Наследование позволяет дочернему классу перенимать свойства и поведение родительского класса. А полиморфизм позволяет работать с объектами разных классов через единый интерфейс.

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

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