Python | Вопросы собесов – Telegram
Python | Вопросы собесов
13.6K subscribers
36 photos
3 videos
1 file
1.17K links
Cайт: easyoffer.ru
Реклама: @easyoffer_adv
ВП: @easyoffer_vp

Тесты t.me/+20tRfhrwPpM4NDQy
Задачи t.me/+nsl4meWmhfQwNDVi
Вакансии t.me/+cXGKkrOY2-w3ZTky
Download Telegram
🤔 Чем хорош FastAPI?

1. Высокая производительность: использует Starlette и Pydantic, обеспечивая быстрый отклик.
2. Асинхронность: поддерживает async/await для обработки множества запросов одновременно.
3. Автогенерация документации: автоматически создаёт OpenAPI-спецификации и Swagger UI.
4. Удобство валидации: встроенная поддержка проверки данных.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍181
🤔 Что такое проблема наследования ?

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

🚩Основные проблемы

🟠Жёсткая связь (Tight Coupling)
Классы-наследники зависят от родительских классов. Изменения в родительских классах могут потребовать изменений в классах-наследниках. Если метод в родительском классе изменяет свою сигнатуру или поведение, все классы-наследники должны быть проверены и, возможно, изменены. Решение: Использование композиции вместо наследования, когда это возможно.

🟠Проблема повторного использования (Fragile Base Class Problem)
Изменения в базовом классе могут непредсказуемо повлиять на поведение классов-наследников. Добавление нового метода в базовый класс может конфликтовать с существующим методом в классе-наследнике. Решение: Ограничение изменений в базовом классе, тщательное проектирование и тестирование.

🟠Проблемы с множественным наследованием
Может привести к конфликтам имен методов и атрибутов, а также к сложности разрешения порядка вызовов методов (MRO — Method Resolution Order). Если два родительских класса имеют методы с одинаковыми именами, класс-наследник может неясно указывать, какой метод использовать. Решение: Использование интерфейсов (в языках, поддерживающих интерфейсы) или композиций. В Python использовать миксины.

🟠Избыточность интерфейсов
Классы-наследники наследуют все методы и атрибуты родительских классов, даже если они не нужны. Класс-наследник может быть перегружен ненужными методами и свойствами, которые ему не требуются. Решение: Использование композиции для включения только нужных функциональностей.

🟠Нарушение инкапсуляции
Классы-наследники могут получить доступ к защищённым (protected) и приватным (private) членам родительского класса, что может нарушить инкапсуляцию. Класс-наследник может изменить состояние родительского класса, вызывая неожиданные побочные эффекты. Решение: Строгое следование принципам инкапсуляции, использование методов доступа (геттеров и сеттеров).
class A:
def method(self):
print("Method from class A")

class B:
def method(self):
print("Method from class B")

class C(A, B):
pass

c = C()
c.method() # Вывод: Method from class A (MRO выбрал метод из класса A)


🚩Решение проблем наследования

🟠Композиция вместо наследования
Предлагает включение объектов других классов в качестве членов, предоставляя больше гибкости и меньшую связанность по сравнению с наследованием.
      class Engine:
def start(self):
print("Engine started")

class Car:
def __init__(self):
self.engine = Engine()

def start(self):
self.engine.start()
print("Car started")

car = Car()
car.start()


🟠Использование интерфейсов и абстрактных классов
Могут помочь определить строгие контракты для классов-наследников без предоставления реализации.

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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍142🤯1
🤔 Что такое HTTP и HTTPS?

1. HTTP (HyperText Transfer Protocol): протокол передачи данных между клиентом и сервером, передаёт данные в открытом виде.
2. HTTPS: расширение HTTP, использующее шифрование через SSL/TLS для защиты передаваемых данных.
3. HTTPS обеспечивает конфиденциальность, целостность данных и аутентификацию сервера.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16😁3🤯2
🤔 Когда нельзя линеаризовать ?

Это процесс определения порядка разрешения методов (Method Resolution Order, MRO), который используется для поиска методов и атрибутов в иерархии классов при множественном наследовании.

🚩Когда нельзя линеаризовать иерархию классов

🟠Несоответствие принципам C3-линеаризации
Python использует алгоритм C3-линеаризации для определения MRO. Если иерархия классов не соответствует принципам C3-линеаризации, то линеаризация невозможна.

🟠Конфликтные зависимости
Конфликты возникают, когда два или более родительских класса содержат методы или атрибуты с одинаковыми именами, и порядок их разрешения не может быть однозначно определён.

🟠Несовместимые суперклассы
Если классы в иерархии имеют несовместимые или пересекающиеся зависимости, это может сделать линеаризацию невозможной.

class A:
pass

class B(A):
pass

class C(A):
pass

class D(B, C):
pass


🚩Как определяется

Python использует C3-линеаризацию для определения порядка разрешения методов. Этот алгоритм соблюдает порядок наследования классов, учитывая при этом принципы монотонности и консистентности.
class A:
def method(self):
print("A")

class B(A):
def method(self):
print("B")

class C(A):
def method(self):
print("C")

class D(B, C):
pass

d = D()
d.method() # Вывод: B


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41
🤔 Что такое async?

Это ключевое слово, используемое для создания асинхронных функций, которые работают в неблокирующем режиме.
1. Асинхронные операции позволяют выполнять другие задачи, пока ожидается завершение медленных операций, таких как запросы к сети или доступ к файлам.
2. Async используется с await для управления асинхронным кодом.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
🤔 Что такое конструктор класса ?

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

🚩Конструктор

Называется __init__. Этот метод вызывается автоматически при создании нового объекта класса и используется для инициализации атрибутов объекта.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def display(self):
print(f"Name: {self.name}, Age: {self.age}")

# Создание экземпляра класса Person
person1 = Person("Alice", 30)
person1.display() # Вывод: Name: Alice, Age: 30

person2 = Person("Bob", 25)
person2.display() # Вывод: Name: Bob, Age: 25


🚩Основные функции

🟠Инициализация атрибутов
Инициализирует атрибуты объекта начальными значениями.

🟠Выполнение необходимой логики
Может выполнять любые действия, необходимые при создании объекта (например, проверка входных данных).

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

🚩Перегрузка

Перегрузка конструктора не поддерживается напрямую, но можно использовать аргументы по умолчанию или конструкцию args и kwargs для имитации перегрузки.
#include <iostream>
using namespace std;

class Person {
public:
string name;
int age;

// Конструктор по умолчанию
Person() {
name = "Unknown";
age = 0;
}

// Конструктор с параметрами
Person(string n, int a) {
name = n;
age = a;
}

void display() {
cout << "Name: " << name << ", Age: " << age << endl;
}
};

int main() {
Person person1;
person1.display(); // Вывод: Name: Unknown, Age: 0

Person person2("Alice", 30);
person2.display(); // Вывод: Name: Alice, Age: 30

return 0;
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8💊1
🤔 Для чего можно использовать Celery?

1. Это инструмент для выполнения задач в фоновом режиме.
2. Используется для отправки уведомлений, обработки данных, построения отчётов и выполнения длительных операций вне основного потока.
3. Поддерживает планирование задач и распределённую обработку через брокеры, такие как RabbitMQ или Redis.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
5🔥2
🤔 Что такое деструктор класса ?

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

🚩Деструкторы

Определяется с помощью метода __del__. Этот метод вызывается, когда объект становится недоступным для использования и должен быть удалён сборщиком мусора.
class Person:
def __init__(self, name):
self.name = name
print(f"{self.name} is created")

def __del__(self):
print(f"{self.name} is deleted")

# Создание экземпляра класса Person
person1 = Person("Alice")

# Удаление ссылки на объект
del person1

# Пример с автоматическим вызовом деструктора при завершении программы
person2 = Person("Bob")


🚩Основные функции

🟠Освобождение ресурсов
Используется для освобождения ресурсов, таких как память, файловые дескрипторы, сетевые соединения и другие.

🟠Выполнение завершающих действий
Может выполнять любые завершающие действия, которые необходимо выполнить перед удалением объекта.

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

🚩Особенности

🟠Неопределённое время вызова
Сборщик мусора управляет временем жизни объектов, поэтому точное время вызова деструктора не всегда определено.
🟠Не вызывается для циклических ссылок
Деструкторы не вызываются для объектов, участвующих в циклических ссылках. Для таких случаев рекомендуется использовать модуль weakref.

import weakref

class Node:
def __init__(self, name):
self.name = name
self.next = None
print(f"{self.name} is created")

def __del__(self):
print(f"{self.name} is deleted")

# Создание узлов
node1 = Node("Node1")
node2 = Node("Node2")

# Создание циклической ссылки
node1.next = node2
node2.next = node1

# Удаление узлов (циклическая ссылка предотвратит вызов деструкторов)
del node1
del node2

# Использование слабых ссылок для предотвращения утечек памяти
node1 = Node("Node1")
node2 = Node("Node2")
node1.next = weakref.ref(node2)
node2.next = weakref.ref(node1)

# Удаление узлов (слабые ссылки позволят вызвать деструкторы)
del node1
del node2


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🤔 В чём суть проекта Celery?

Предоставляет систему для распределённого выполнения фоновых задач.
1. Работает с брокерами сообщений (Redis, RabbitMQ) для передачи задач.
2. Позволяет распределять обработку задач между несколькими рабочими процессами (workers).
3. Используется для автоматизации долгих или повторяющихся операций.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
🤔 Расскажи о методах len и abs ?

Методы __len__ и abs являются специальными методами (или "магическими методами"), которые позволяют объектам классов взаимодействовать с встроенными функциями и операциями языка. Эти методы обеспечивают удобную и интуитивно понятную интеграцию пользовательских классов с стандартными операциями Python.

🚩Метод len

Используется для определения длины объекта. Он должен возвращать количество элементов в объекте. Позволяет объектам взаимодействовать с встроенной функцией len().
class MyCollection:
def __init__(self, items):
self.items = items

def __len__(self):
return len(self.items)

# Использование
my_collection = MyCollection([1, 2, 3, 4, 5])
print(len(my_collection)) # Вывод: 5


🚩Метод abs

Используется для вычисления абсолютного значения объекта. Он должен возвращать абсолютное значение объекта. Позволяет объектам взаимодействовать с встроенной функцией abs().
class MyNumber:
def __init__(self, value):
self.value = value

def __abs__(self):
return abs(self.value)

# Использование
my_number = MyNumber(-10)
print(abs(my_number)) # Вывод: 10


🚩Преимущества

Интеграция с встроенными функциями
Методы len и abs позволяют пользовательским объектам взаимодействовать с встроенными функциями Python, что делает их использование более интуитивно понятным и удобным.

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

Читаемость кода
Использование стандартных функций len() и abs() для пользовательских объектов делает код более понятным и читабельным.

import math

class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __len__(self):
return 2 # Вектор на плоскости всегда имеет два компонента

def __abs__(self):
return math.sqrt(self.x**2 + self.y**2) # Длина (модуль) вектора

def __repr__(self):
return f"Vector({self.x}, {self.y})"

# Использование
v = Vector(3, 4)
print(len(v)) # Вывод: 2
print(abs(v)) # Вывод: 5.0


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Для чего подходят асинхронные операции?

1. Асинхронные операции подходят для задач с высокой задержкой: сетевые запросы, доступ к базам данных, ввод/вывод файлов.
2. Они повышают производительность за счёт параллельного выполнения задач, не блокируя основной поток.
3. Особенно полезны для приложений с большим числом одновременно обслуживаемых клиентов (например, веб-серверы).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍4
🤔 Расскажи о методах add , mul , sub , truediv?

Методы add, mul, sub и truediv являются специальными методами (или "магическими методами"), которые позволяют объектам пользовательских классов взаимодействовать с операциями сложения, умножения, вычитания и деления соответственно. Эти методы обеспечивают удобную и интуитивно понятную интеграцию пользовательских классов с арифметическими операциями Python.

🟠Метод add
Используется для реализации оператора сложения (+). Он вызывается, когда используется оператор + между двумя объектами.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)

def __repr__(self):
return f"Vector({self.x}, {self.y})"

# Использование
v1 = Vector(1, 2)
v2 = Vector(3, 4)
v3 = v1 + v2
print(v3) # Вывод: Vector(4, 6)


🟠Метод mul
Используется для реализации оператора умножения (*). Он вызывается, когда используется оператор * между двумя объектами.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __mul__(self, scalar):
return Vector(self.x * scalar, self.y * scalar)

def __repr__(self):
return f"Vector({self.x}, {self.y})"

# Использование
v = Vector(1, 2)
v2 = v * 3
print(v2) # Вывод: Vector(3, 6)


🟠Метод sub
Используется для реализации оператора вычитания (-). Он вызывается, когда используется оператор - между двумя объектами.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __sub__(self, other):
return Vector(self.x - other.x, self.y - other.y)

def __repr__(self):
return f"Vector({self.x}, {self.y})"

# Использование
v1 = Vector(5, 7)
v2 = Vector(2, 3)
v3 = v1 - v2
print(v3) # Вывод: Vector(3, 4)


🟠Метод truediv
Используется для реализации оператора деления (/). Он вызывается, когда используется оператор / между двумя объектами.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __truediv__(self, scalar):
return Vector(self.x / scalar, self.y / scalar)

def __repr__(self):
return f"Vector({self.x}, {self.y})"

# Использование
v = Vector(6, 8)
v2 = v / 2
print(v2) # Вывод: Vector(3.0, 4.0)


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
🤔 Что такое `args`?

Это сокращение для передачи произвольного количества позиционных аргументов в функцию.
1. Указывается как *args в объявлении функции.
2. Позволяет обрабатывать переменное количество аргументов в виде кортежа.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍8💊1
🤔 Расскажи о методе bool?

Метод __bool__ является специальным методом, который позволяет определить, как объект будет оцениваться в логическом контексте. Этот метод должен возвращать булево значение (True или False), которое указывает на истинность или ложность объекта.

🚩Основное предназначение

Используется для реализации логического поведения объектов при использовании встроенной функции bool() и в условиях (например, в инструкциях if и while). Если объект не имеет метода bool, Python вызывает метод len, и если len возвращает ноль, объект считается ложным.
class Box:
def __init__(self, items):
self.items = items

def __bool__(self):
return bool(self.items)

def __repr__(self):
return f"Box({self.items})"

# Использование
box1 = Box([1, 2, 3])
box2 = Box([])

print(bool(box1)) # Вывод: True
print(bool(box2)) # Вывод: False

if box1:
print("box1 is not empty") # Вывод: box1 is not empty

if not box2:
print("box2 is empty") # Вывод: box2 is empty


🚩Использование метода len для логического контекста

Если метод bool не определён, Python использует метод len для определения логического значения объекта. Если метод len возвращает 0, объект считается ложным, в противном случае — истинным.
class Box:
def __init__(self, items):
self.items = items

def __len__(self):
return len(self.items)

def __repr__(self):
return f"Box({self.items})"

# Использование
box1 = Box([1, 2, 3])
box2 = Box([])

print(bool(box1)) # Вывод: True
print(bool(box2)) # Вывод: False

if box1:
print("box1 is not empty") # Вывод: box1 is not empty

if not box2:
print("box2 is empty") # Вывод: box2 is empty


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
🤔 Что такое `kwargs`?

Это способ передачи произвольного количества именованных аргументов.
1. Указывается как **kwargs в объявлении функции.
2. Аргументы передаются в виде словаря.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🔥62🤯1💊1
🤔 Расскажи о методах eq, ne, lt, le, qt, qe?

Методы eq, ne, lt, le, gt, и ge являются специальными методами, которые позволяют определять, как объекты пользовательских классов будут сравниваться друг с другом. Эти методы обеспечивают перегрузку операторов сравнения, таких как ==, !=, <, <=, >, и >=.

🟠Метод eq
Используется для перегрузки оператора равенства (==). Он вызывается, когда нужно проверить, равны ли два объекта.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __eq__(self, other):
if isinstance(other, Person):
return self.name == other.name and self.age == other.age
return False

# Использование
p1 = Person("Alice", 30)
p2 = Person("Alice", 30)
p3 = Person("Bob", 25)

print(p1 == p2) # Вывод: True
print(p1 == p3) # Вывод: False


🟠Метод name, age
Используется для перегрузки оператора неравенства (!=). Он вызывается, когда нужно проверить, не равны ли два объекта.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __ne__(self, other):
if isinstance(other, Person):
return self.name != other.name or self.age != other.age
return True

# Использование
p1 = Person("Alice", 30)
p2 = Person("Alice", 30)
p3 = Person("Bob", 25)

print(p1 != p2) # Вывод: False
print(p1 != p3) # Вывод: True


🟠Метод age
Используется для перегрузки оператора "меньше чем" (<). Он вызывается, когда нужно проверить, меньше ли один объект другого.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __lt__(self, other):
if isinstance(other, Person):
return self.age < other.age
return NotImplemented

# Использование
p1 = Person("Alice", 30)
p2 = Person("Bob", 25)

print(p1 < p2) # Вывод: False
print(p2 < p1) # Вывод: True


🟠Метод ass
Используется для перегрузки оператора "меньше или равно" (<=). Он вызывается, когда нужно проверить, меньше ли или равен один объект другому.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __le__(self, other):
if isinstance(other, Person):
return self.age <= other.age
return NotImplemented

# Использование
p1 = Person("Alice", 30)
p2 = Person("Bob", 25)
p3 = Person("Charlie", 30)

print(p1 <= p2) # Вывод: False
print(p2 <= p1) # Вывод: True
print(p1 <= p3) # Вывод: True


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5💊32
🤔 Что такое аннотации типов?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17
🤔 Какие есть методы у классов ?

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

🟠Обычные методы (Instance Methods)
Работают с экземплярами класса и могут изменять состояние объекта. Они принимают как первый аргумент self, который ссылается на экземпляр класса.
class MyClass:
def __init__(self, value):
self.value = value

def increment(self):
self.value += 1

# Использование
obj = MyClass(10)
obj.increment()
print(obj.value) # Вывод: 11


🟠Методы класса (Class Methods)
Работают с самим классом, а не с экземплярами. Они принимают как первый аргумент cls, который ссылается на класс. Методы класса обозначаются декоратором @classmethod.
class MyClass:
count = 0

def __init__(self):
MyClass.count += 1

@classmethod
def get_count(cls):
return cls.count

# Использование
obj1 = MyClass()
obj2 = MyClass()
print(MyClass.get_count()) # Вывод: 2


🟠Статические методы (Static Methods)
Не зависят ни от экземпляра класса, ни от самого класса. Они не принимают self или cls в качестве первого аргумента. Статические методы обозначаются декоратором @staticmethod.
class MyClass:
@staticmethod
def greet(name):
return f"Hello, {name}!"

# Использование
print(MyClass.greet("Alice")) # Вывод: Hello, Alice!


🚩Специальные методы (Special Methods или Magic Methods)

Специальные методы определяют поведение объектов при использовании встроенных функций и операций. Они включают такие методы, как init, str, repr, len, getitem, setitem, delitem, call, enter, exit, и многие другие.

🟠init
Конструктор класса, вызываемый при создании нового экземпляра.
        class MyClass:
def init(self, value):
self.value = value

obj = MyClass(10)



🟠str
Определяет строковое представление объекта для функции str() и оператора print.
        class MyClass:
def init(self, value):
self.value = value

def str(self):
return f"MyClass with value: {self.value}"

obj = MyClass(10)
print(obj) # Вывод: MyClass with value: 10


🟠__getitem__, __setitem__, __delitem__
Определяют поведение объекта при доступе к элементам по индексу (для коллекций).
    class MyList:
def __init__(self, items):
self.items = items

def __getitem__(self, index):
return self.items[index]

def __setitem__(self, index, value):
self.items[index] = value

def __delitem__(self, index):
del self.items[index]

lst = MyList([1, 2, 3])
print(lst[1]) # Вывод: 2
lst[1] = 20
print(lst[1]) # Вывод: 20
del lst[1]
print(lst.items) # Вывод: [1, 3]


🟠
__enter__, __exit__
Определяют поведение объекта в контексте оператора with.
    ```python
class ManagedResource:
def enter(self):
print("Entering the context")
return self

def exit(self, exc_type, exc_value, traceback):
print("Exiting the context")
return False

with ManagedResource():
print("Inside the context")


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍91🔥1
🤔 Что такое глубокая копия?

Глубокая копия (deep copy) создаёт новый объект и рекурсивно копирует все вложенные объекты.
Используется, чтобы избежать изменения оригинала при работе с вложенными структурами данных.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍8
🤔 Как отсортировать список словарей по определенному полю?

Для сортировки списка словарей по определенному полю в Python удобно использовать функцию sorted() или метод sort(). Оба подхода позволяют указать ключ сортировки с помощью параметра key, где можно передать либо функцию, либо лямбда-выражение, которое извлекает значение из словаря для сортировки.

🚩Почему это важно?

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

🚩Как это сделать?

🟠Использование функции `sorted()`
Эта функция возвращает новый отсортированный список.
   employees = [
{"name": "Alice", "age": 30, "salary": 70000},
{"name": "Bob", "age": 25, "salary": 50000},
{"name": "Charlie", "age": 35, "salary": 120000}
]

# Сортировка по возрасту
sorted_employees = sorted(employees, key=lambda x: x["age"])

print(sorted_employees)


Результат
   [{'name': 'Bob', 'age': 25, 'salary': 50000},
{'name': 'Alice', 'age': 30, 'salary': 70000},
{'name': 'Charlie', 'age': 35, 'salary': 120000}]


🟠Использование метода `sort()`
Этот метод изменяет существующий список.
   employees = [
{"name": "Alice", "age": 30, "salary": 70000},
{"name": "Bob", "age": 25, "salary": 50000},
{"name": "Charlie", "age": 35, "salary": 120000}
]

# Сортировка по зарплате
employees.sort(key=lambda x: x["salary"])

print(employees)


Результат
   [{'name': 'Bob', 'age': 25, 'salary': 50000},
{'name': 'Alice', 'age': 30, 'salary': 70000},
{'name': 'Charlie', 'age': 35, 'salary': 120000}]


🟠Сортировка в обратном порядке
Установите параметр reverse=True, чтобы отсортировать в порядке убывания.
   sorted_employees_desc = sorted(employees, key=lambda x: x["age"], reverse=True)
print(sorted_employees_desc)


🟠Использование функции `itemgetter` из модуля `operator`
Это более эффективный способ, чем лямбда-функция, особенно для больших данных.
   from operator import itemgetter

sorted_employees = sorted(employees, key=itemgetter("age"))
print(sorted_employees)


🚩Обработка отсутствующих значений

Если поле может отсутствовать в некоторых словарях, можно использовать параметр key для обработки таких ситуаций.
employees = [
{"name": "Alice", "age": 30},
{"name": "Bob"},
{"name": "Charlie", "age": 35}
]

sorted_employees = sorted(employees, key=lambda x: x.get("age", 0))
print(sorted_employees)


Результат
[{'name': 'Bob'},
{'name': 'Alice', 'age': 30},
{'name': 'Charlie', 'age': 35}]


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15