Четвертый день обучения

Примеры методов:

__abs__, __add__, __and__, __bool__, __ceil__, __class__, __contains__, __delattr__, __delete__, __dir__, __divmod__, __enter__, __eq__, __exit__, __float__, __floordiv__, __format__, __ge__, __get__, __getattribute__, __getitem__, __getnewargs__, __gt__, __hash__, __iadd__, __iand__, __idivmod__, __ifloordiv__, __ilshift__, __imatmul__, __imod__, __imul__, __index__, __init__, __init_subclass__, __instancecheck__, __int__, __invert__, __ior__, __ipow__, __irshift__, __isub__, __iter__, __itruediv__, __ixor__, __le__, __len__, __length_hint__, __lshift__, __lt__, __matmul__, __missing__, __mod__, __mul__, __ne__, __neg__, __new__, __next__, __or__, __pos__, __pow__, __prepare__, __radd__, __rand__, __rdivmod__, __reduce__, __reduce_ex__, __repr__, __reversed__, __rfloordiv__, __rlshift__, __rmatmul__, __rmod__, __rmul__, __ror__, __round__, __rpow__, __rrshift__, __rshift__, __rsub__, __rtruediv__, __rxor__, __set__, __set_name__, __setattr__, __setitem__, __setstate__, __sizeof__, __str__, __sub__, __subclasscheck__, __truediv__, __trunc__, __xor__

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

Так можно посмотреть какие методы доступны функции:

print(dir(bool))

**Ответ в консоли:**
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__getstate__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_count', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'is_integer', 'numerator', 'real', 'to_bytes']

Магические методы в Python

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

Некоторые из наиболее часто используемых магических методов в Python включают:

  • __init__: метод-конструктор, вызываемый при создании нового экземпляра класса. Он позволяет инициализировать атрибуты объекта и выполнить другие необходимые действия перед его использованием.
  • __str__: метод, возвращающий строковое представление объекта. Этот метод используется, когда объект нужно представить в виде строки, например, при выводе на экран или при преобразовании в строку.
  • __len__: метод, возвращающий длину объекта. Он позволяет получить информацию о количестве элементов в объекте, что может быть полезно при работе с коллекциями данных, такими как списки или кортежи.
  • __getitem__ и __setitem__: методы, позволяющие получить и установить значение элемента объекта по индексу. Они позволяют обращаться к объекту, как к последовательности или контейнеру, и работать с его элементами.
  • __iter__ и __next__: методы, позволяющие итерировать по объекту. Они позволяют использовать объект в цикле for, перебирая его элементы один за другим.

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

Вот несколько простых примеров кода, демонстрирующих использование магических методов в Python:

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def __str__(self):
        return f"Rectangle({self.width}, {self.height})"

    def __len__(self):
        return self.width * self.height

    def __getitem__(self, index):
        if index == 0:
            return self.width
        elif index == 1:
            return self.height
        else:
            raise IndexError("Index out of range")

    def __setitem__(self, index, value):
        if index == 0:
            self.width = value
        elif index == 1:
            self.height = value
        else:
            raise IndexError("Index out of range")

rectangle = Rectangle(5, 3)
print(rectangle)  # Вывод: Rectangle(5, 3)

print(len(rectangle))  # Вывод: 15

print(rectangle[0])  # Вывод: 5
print(rectangle[1])  # Вывод: 3

rectangle[0] = 7
rectangle[1] = 4
print(rectangle)  # Вывод: Rectangle(7, 4)

В этом примере мы создаем класс Rectangle, который имеет атрибуты width (ширина) и height (высота). Мы определяем магические методы __str__, __len__, __getitem__ и __setitem__ для представления объекта в виде строки, получения его длины, доступа к его элементам по индексу и изменения значений элементов соответственно.

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

Списки list

Последовательность элементов

Упорядоченная последовательность элементов

my_fruits = ['apple', 'banana', 'lime']

posts_ids = [151, 552, 255]

user_inputs = [True, 'hi!', 10.5]

Порядок элементов в списке имеет значение

Каждый элемент в списке имеет свой номер

Проверка длины списка функция len

Для удаления пункта из списка можно использовать оператор del

user_inputs = [True, 'hi!', 10.5]
print(len(user_inputs))
#3

del user_inputs[1]
print(user_inputs)
#True 'hi!'
print(len(user_inputs))
#2

Списки словарей

users = [
	{
		'user_id': 134,
		'user_nmae': 'Alice',
	}		
	{
		'user_id': 821,
		'user_name': 'Bob'
	}
]

print(len(users))
#2
print(users[1]['user_id'])
#821

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

append, clear, copy, count, extend, index, insert, pop, remove, reverse, sort

Методы списков объекты наследуют от класса list

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

pop– удаление из списка (если без указания числа) будет удален последний элемент

sort– сортировка, сортировка по умолчанию по возрастанию идет, если нужно отсортировать в обратном порядке (по убыванию) пишем именованый аргумент (revers=True)

Конвертация в список

greeting = "Hallo from Python"
greeting_letters = list(greeting)

print(greeting_letters)
#['H', 'a', 'l', 'l', 'o', ' ', 'f', 'r', 'o', 'm', ' ', 'P', 'y', 't', 'h', 'o', 'n']

**Конвертация словарей в списки**
my_dict = {'a': 10, 'b': True}
my_dict_keys = list(my_dict)

print(my_dict_keys)
#['a', 'b']

Арифметические операции в списках

rating = [2.5, 5.0, 4.3, 3.7]

print(min(rating))
print(max(rating))
print(sum(rating))

print(sum(rating)/len(rating))
#2.5
#5.0
#15.5
#3.875

**Объедиение списков**
my_ratings = [2.5, 5.0]
other_ratings = [3.7, 4.5, 4.9]

all_ratings = my_ratings + other_ratings
print(all_ratings)
#[2.5, 5.0, 3.7, 4.5, 4.9]

*при использовании оператора + вызывается магический метод ____add__ 
в котором уже указано что можно делать с списками*

**Нарезка списков**
ratings = [2.5, 5.0, 4.3, 3.7]

first_two_ratings = ratings[:2]
print(first_two_ratings)
#[2.5, 5.0]

Копирование списков

**Копирование по ссылке:**
my_cars = ['BMW', 'Mercedes']
copied_cars = my_cars
copied_cars.append('Audi')

print(copied_cars)
#['BMW', 'Mercedes', 'Audi']

**Создание нового списка такого же: через :**
my_cars = ['BMW', 'Mercedes']
copied_cars = my_cars [:]
copied_cars.append('Audi')

print(copied_cars)
#['BMW', 'Mercedes', 'Audi']

**Создание нового списка такого же: через функцию copy**
my_cars = ['BMW', 'Mercedes']
copied_cars = my_cars.copy()
copied_cars.append('Audi')

print(copied_cars)
#['BMW', 'Mercedes', 'Audi']

**Создание нового списка такого же: через функцию list**
my_cars = ['BMW', 'Mercedes']
copied_cars = list(my_cars)
copied_cars.append('Audi')

print(copied_cars)
#['BMW', 'Mercedes', 'Audi']