ar
Feedback

لا تقع ضحية للمخادعين! تيليمتريو يكتشف ويُميّز هذه القنوات 👉 إذا كنت تريد رؤية العلامة، اشترك 👈

Python | Вопросы собесов

Python | Вопросы собесов

الذهاب إلى القناة على Telegram

Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads

إظهار المزيد

📈 نظرة تحليلية على قناة تيليجرام Python | Вопросы собесов

تُعد قناة Python | Вопросы собесов (@python_easy_ru) في القطاع اللغوي الروسية لاعباً نشطاً. يضم المجتمع حالياً 12 637 مشتركاً، محتلاً المرتبة 9 922 في فئة التكنولوجيات والتطبيقات والمرتبة 51 155 في منطقة روسيا.

📊 مؤشرات الجمهور والحراك

منذ تأسيسه في невідомо، حقق المشروع نمواً سريعاً وجمع 12 637 مشتركاً.

بحسب آخر البيانات بتاريخ 13 أكتوبر, 2026، تحافظ القناة على نشاط مستقر. خلال آخر 30 يوماً تغيّر عدد الأعضاء بمقدار -115، وفي آخر 24 ساعة بمقدار -6، مع بقاء الوصول العام مرتفعاً.

  • حالة التحقق: غير موثّقة
  • معدل التفاعل (ER): يبلغ متوسط تفاعل الجمهور 6.04‎%. وخلال أول 24 ساعة من النشر يحصد المحتوى عادةً 4.18‎% من ردود الفعل نسبةً إلى إجمالي المشتركين.
  • وصول المنشورات: يحصل كل منشور على متوسط 763 مشاهدة. وخلال اليوم الأول يجمع عادةً 528 مشاهدة.
  • التفاعلات والاستجابة: يتفاعل الجمهور بانتظام؛ متوسط التفاعلات لكل منشور يبلغ 2.
  • الاهتمامات الموضوعية: يركز المحتوى على مواضيع رئيسية مثل ставь, модуль, строка, docker, alice.

📝 الوصف وسياسة المحتوى

يصف المؤلف القناة بأنها مساحة للتعبير عن الآراء الذاتية:
“Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads”

بفضل وتيرة التحديث المرتفعة (أحدث البيانات بتاريخ 14 أكتوبر, 2026) تحافظ القناة على حداثتها ومستوى وصول مرتفع. وتُظهر التحليلات تفاعلاً نشطاً من الجمهور، ما يجعلها نقطة تأثير مهمة ضمن فئة التكنولوجيات والتطبيقات.

12 637
المشتركون
-624 ساعات
-357 أيام
-11530 أيام
أرشيف المشاركات
🤔 В чем преимущество ООП перед обычными функциями? 1. ООП позволяет организовать код в виде классов и объектов, что делает его более читаемым и структурированным. 2. Предоставляет механизмы инкапсуляции, наследования и полиморфизма, что упрощает переиспользование и поддержку кода. 3. Объектно-ориентированный подход лучше подходит для моделирования сложных систем. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

📺 Уникальная база IT собеседований 370+ реальных собеседований на программиста, тестировщика, аналитика и прочие IT профы. Е
📺 Уникальная база IT собеседований 370+ реальных собеседований на программиста, тестировщика, аналитика и прочие IT профы. Есть собесы от ведущих компаний: Сбер, Яндекс, ВТБ, Тинькофф, Озон, Wildberries и т.д. 🎯 Переходи по ссылке и присоединяйся к базе, чтобы прокачать свои шансы на успешное трудоустройство!

🤔 Какие нюансы есть в использовании чисел как ключей? Использование чисел в качестве ключей в словарях Python – это достаточно распространённый случай. Однако у этого подхода есть несколько нюансов, которые нужно учитывать для избежания ошибок. 🚩Хешируемость чисел Ключи в словаре должны быть хешируемыми, поскольку словари в Python основаны на хеш-таблицах. Хешируемость означает, что объект имеет неизменное значение хеша в течение его жизни. Числа (как int, так и float) являются хешируемыми, поэтому их можно использовать в качестве ключей.
d = {1: "один", 2: "два"}
print(d[1])  # "один"
🚩Взаимодействие `int` и `float` Python не делает различий между int и float, если их значения равны. Это связано с тем, что у них одинаковое хеш-значение при равенстве.
d = {1: "один", 1.0: "float один", 2: "два"}
print(d)  # {1: 'float один', 2: 'два'}
🚩Непредсказуемое поведение при работе с `float` Числа с плавающей запятой (float) иногда ведут себя непредсказуемо из-за ошибок округления, которые возникают из-за особенностей представления чисел в памяти компьютера.
d = {0.1 + 0.2: "значение"}  # 0.1 + 0.2 не равно точно 0.3 из-за округления
print(d.get(0.3))  # None, ключ не найден!
🚩Производительность Использование чисел как ключей в словарях эффективно с точки зрения производительности. Поскольку числа хешируются быстро и занимают меньше памяти, операции добавления, удаления и поиска выполняются очень быстро. 🚩Проблемы при преобразованиях Если ключами словаря являются числа, то при обработке данных (например, чтении из файла или API) можно случайно преобразовать их в строки, что приведёт к созданию новых ключей вместо использования существующих.
d = {1: "один", 2: "два"}
print(d.get("1"))  # None, строка "1" и число 1 – это разные ключи!
🚩Пользовательские объекты с числовыми свойствами Если вы используете пользовательские объекты как ключи и они ведут себя как числа (например, реализуют методы __hash__ и __eq__), то их поведение должно быть совместимо с ожидаемым использованием.
class MyNumber:
    def __init__(self, value):
        self.value = value
    
    def __hash__(self):
        return hash(self.value)
    
    def __eq__(self, other):
        return self.value == other.value

d = {MyNumber(1): "один"}
print(d[MyNumber(1)])  # "один"
Ставь 👍 и забирай 📚 Базу знаний

🤔 Как абстрактный класс реализуется? Абстрактные классы реализуются через модуль abc с использованием декоратора @abstractmethod. 1. Класс должен наследоваться от ABC (Abstract Base Class). 2. Абстрактные методы обязаны быть реализованы в подклассах. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие есть высокоуровневые языки программирования? Предоставляют более высокую степень абстракции от аппаратного обеспечения компьютера, чем низкоуровневые языки. Они ориентированы на удобство программирования, упрощение разработки, читаемость и поддержку кода. Эти языки скрывают детали работы с памятью и процессором, позволяя программистам сосредоточиться на логике приложения. 🚩Основные высокоуровневые языки программирования: 🟠Python Веб-разработка, анализ данных, научные исследования, искусственный интеллект, автоматизация.
def greet(name):
    return f"Hello, {name}!"

print(greet("World"))     
🟠Java Разработка корпоративного ПО, веб-приложений, мобильных приложений (Android), больших распределенных систем.
public class Main {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
   }
}
     
🟠C# Разработка настольных приложений, веб-приложений, игр (с использованием Unity), облачных сервисов.
using System;

class Program {
    static void Main() {
        Console.WriteLine("Hello, World!");
    }
}     
🟠JavaScript Веб-разработка, создание интерактивных пользовательских интерфейсов, серверные приложения, мобильные приложения (с использованием фреймворков, таких как React Native).
function greet(name) {
    return `Hello, ${name}!`;
}

console.log(greet("World"));     
🟠Ruby Веб-разработка, скрипты автоматизации, создание прототипов.
def greet(name)
  "Hello, #{name}!"
end

puts greet("World")     
🟠PHP Веб-разработка, серверные приложения, управление контентом.
<?php
function greet($name) {
    return "Hello, $name!";
}

echo greet("World");
?>     
🟠Swift Разработка мобильных и настольных приложений для экосистемы Apple.
func greet(name: String) -> String {
    return "Hello, \(name)!"
}

print(greet(name: "World"))     
🟠Kotlin Разработка Android-приложений, серверных приложений, веб-приложений.
fun greet(name: String): String {
    return "Hello, $name!"
}

fun main() {
    println(greet("World"))
}     
🟠Go (Golang) Разработка серверных приложений, облачных сервисов, микросервисов.
package main
import "fmt"

func main() {
   fmt.Println("Hello, World!")
}     
🟠Rust Системное программирование, разработка высокопроизводительных приложений, безопасное многопоточность.
fn main() {
    println!("Hello, World!");
}      
Ставь 👍 и забирай 📚 Базу знаний

🤔 Как реализуются статические методы? Статические методы реализуются с помощью декоратора @staticmethod. 1. Такие методы не имеют доступа к атрибутам или методам класса/экземпляра. 2. Они похожи на обычные функции, но принадлежат классу и вызываются через него. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое паттерн Стратегия (Strategy) ? Это поведенческий паттерн проектирования, который определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми. Паттерн "Стратегия" позволяет изменять алгоритмы независимо от клиентов, которые их используют. 🚩Зачем нужен данный паттерн? 🟠Изоляция алгоритмов Позволяет инкапсулировать различные алгоритмы и использовать их независимо. 🟠Упрощение кода Устраняет дублирование кода и упрощает классы, которые используют эти алгоритмы. 🟠Гибкость и расширяемость Легко добавлять новые алгоритмы или изменять существующие без изменения клиентского кода. 🚩Как работает данный паттерн? 🟠Стратегия (Strategy) Интерфейс, определяющий общий метод, который должны реализовать все алгоритмы. 🟠Конкретные стратегии (ConcreteStrategy) Реализации различных алгоритмов, которые реализуют интерфейс стратегии. 🟠Контекст (Context) Класс, использующий стратегию для выполнения задачи.
from abc import ABC, abstractmethod

# Интерфейс стратегии
class Strategy(ABC):
    @abstractmethod
    def sort(self, data):
        pass

# Конкретные стратегии
class BubbleSortStrategy(Strategy):
    def sort(self, data):
        print("Sorting using Bubble Sort")
        for i in range(len(data)):
            for j in range(0, len(data)-i-1):
                if data[j] > data[j+1]:
                    data[j], data[j+1] = data[j+1], data[j]

class QuickSortStrategy(Strategy):
    def sort(self, data):
        print("Sorting using Quick Sort")
        self.quick_sort(data, 0, len(data) - 1)

    def quick_sort(self, data, low, high):
        if low < high:
            pi = self.partition(data, low, high)
            self.quick_sort(data, low, pi - 1)
            self.quick_sort(data, pi + 1, high)

    def partition(self, data, low, high):
        pivot = data[high]
        i = low - 1
        for j in range(low, high):
            if data[j] <= pivot:
                i = i + 1
                data[i], data[j] = data[j], data[i]
        data[i + 1], data[high] = data[high], data[i + 1]
        return i + 1

# Контекст
class SortingContext:
    def __init__(self, strategy: Strategy):
        self._strategy = strategy

    def set_strategy(self, strategy: Strategy):
        self._strategy = strategy

    def sort(self, data):
        self._strategy.sort(data)

# Клиентский код
data = [5, 2, 9, 1, 5, 6]

context = SortingContext(BubbleSortStrategy())
context.sort(data)
print(data)  # [1, 2, 5, 5, 6, 9]

context.set_strategy(QuickSortStrategy())
data = [3, 7, 8, 5, 2, 1, 9, 5, 4]
context.sort(data)
print(data)  # [1, 2, 3, 4, 5, 5, 7, 8, 9]
🚩Плюсы и минусы ➕Изоляция алгоритмов Алгоритмы инкапсулируются в отдельные классы, что упрощает их замену и добавление. ➕Упрощение кода Контекст использует стратегии, избегая громоздких условных операторов. ➕Гибкость и расширяемость Легко добавлять новые стратегии без изменения существующего кода. ➖Усложнение структуры кода Добавление множества классов стратегий может усложнить проект. ➖Контекст знает о стратегиях Контекст должен знать о всех возможных стратегиях, чтобы иметь возможность их переключать. 🚩Когда использовать данный паттерн? Когда есть несколько вариантов алгоритмов для выполнения задачи. Когда нужно динамически выбирать алгоритм во время выполнения. Когда необходимо избежать множества условных операторов для выбора алгоритма. Ставь 👍 и забирай 📚 Базу знаний

🤔 Как реализуются методы класса? Методы класса реализуются с использованием декоратора @classmethod. 1. Первый аргумент метода — cls, который указывает на сам класс, а не на экземпляр. 2. Используются для работы с атрибутами и методами класса, а не конкретного объекта. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое set? Это неупорядоченная коллекция уникальных элементов в Python. Это одна из встроенных структур данных языка, которая используется, когда вам нужно работать с наборами данных, исключая дубликаты и выполняя операции над множествами (например, пересечение, объединение и разность). 🚩Основные характеристики `set` 🟠Неупорядоченность Элементы множества не имеют фиксированного порядка, то есть вы не можете обращаться к элементам по индексу, как в списках или кортежах. 🟠Уникальность элементов Во множестве не может быть дубликатов. Если вы добавите во множество несколько одинаковых элементов, они будут храниться как один экземпляр. 🟠Изменяемость Множества в Python изменяемы: вы можете добавлять, удалять и изменять их элементы. Однако сами элементы множества должны быть неизменяемыми (например, числа, строки, кортежи). 🟠Быстродействие Операции проверки принадлежности (in), добавления и удаления элементов работают очень быстро, благодаря использованию хэш-таблиц в реализации множества. 🚩Создание множества 🟠Пустое множество Для создания пустого множества используется функция set(), так как {} создаёт пустой словарь
empty_set = set()
print(empty_set)  # Output: set()
🟠Создание множества с элементами Вы можете передать список, строку, кортеж или другой итерируемый объект в функцию set().
# Создание множества из списка
numbers = set([1, 2, 3, 4, 5])
print(numbers)  # Output: {1, 2, 3, 4, 5}

# Создание множества из строки (уникальные символы)
chars = set("hello")
print(chars)  # Output: {'h', 'e', 'l', 'o'}  (порядок может быть разным)
🟠Использование литералов Вы также можете использовать фигурные скобки {} для создания множества
fruits = {"apple", "banana", "cherry"}
print(fruits)  # Output: {'apple', 'banana', 'cherry'}
🚩Основные операции с множествами 🟠Добавление элементов Используется метод add()
my_set = {1, 2, 3}
my_set.add(4)
print(my_set)  # Output: {1, 2, 3, 4}
🟠Удаление элементов remove() — удаляет элемент, выбрасывая ошибку, если его нет. discard() — удаляет элемент, не выбрасывая ошибку, если его нет.
my_set = {1, 2, 3}
my_set.remove(2)  # Удаляем элемент 2
print(my_set)  # Output: {1, 3}

my_set.discard(5)  # Ошибки не будет, если элемента 5 нет
pop() — удаляет и возвращает случайный элемент (так как множество неупорядочено)
my_set = {1, 2, 3}
removed_element = my_set.pop()
print(removed_element)  # Например: 1
print(my_set)  # Например: {2, 3}
🟠Очистка множества
my_set = {1, 2, 3}
my_set.clear()
print(my_set)  # Output: set()
🟠Проверка наличия элемента Используется оператор in
my_set = {1, 2, 3}
print(2 in my_set)  # Output: True
print(5 in my_set)  # Output: False
🚩Операции над множествами Python поддерживает классические операции теории множеств: 🟠Объединение (`union` или `|`) Возвращает множество, содержащее все элементы из двух множеств.
set1 = {1, 2, 3}
set2 = {3, 4, 5}
print(set1 | set2)  # Output: {1, 2, 3, 4, 5}
print(set1.union(set2))  # То же самое
🟠Пересечение (`intersection` или `&`) Возвращает элементы, которые присутствуют в обоих множествах.
print(set1 & set2)  # Output: {3}
print(set1.intersection(set2))  # То же самое
🟠Разность (`difference` или `-`) Возвращает элементы, которые присутствуют только в одном множестве (а не в другом).
print(set1 - set2)  # Output: {1, 2} (только в set1)
print(set1.difference(set2))  # То же самое
🟠Симметрическая разность (`symmetric_difference` или `^`) Возвращает элементы, которые есть в одном из множеств, но не в обоих сразу.
print(set1 ^ set2)  # Output: {1, 2, 4, 5}
print(set1.symmetric_difference(set2))  # То же самое
🚩Неизменяемое множество (`frozenset`) Если вам нужно создать множество, которое нельзя изменить, используйте frozenset
frozen = frozenset([1, 2, 3])
print(frozen)  # Output: frozenset({1, 2, 3})

# frozen.add(4)  # Ошибка: 'frozenset' object has no attribute 'add'
Ставь 👍 и забирай 📚 Базу знаний

🤔 Как устроены переменные? Это ссылки на объекты, хранящиеся в памяти. 1. Переменная не содержит сам объект, а указывает на него. 2. Тип объекта определяется автоматически, а его управление памятью осуществляется сборщиком мусора. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что можете сказать о конструкции import package.item? Конструкция import package.item используется для импорта конкретного подмодуля или элемента из пакета в Python. 🚩Пакеты и Подмодули Пакет — это каталог, который содержит файл __init__.py и может содержать подкаталоги и модули. Подкаталоги в пакете также могут содержать файлыия import py, что делает их под-пакетами. Пример структуры пакета:
package/
вероятность
py
item.py
subpackage/
Конструкции
py
subitem.py
🚩Импорт Подмодуля Конструкция import package.item позволяет импортировать подмодуль item из пакета package. Например:
import package.item

# Теперь вы можете использовать функции и классы из package.item
package.item.some_function()
🚩Почему это важно? 🟠Организация кода Пакеты позволяют структурировать код в иерархическую систему, что делает его более организованным и модульным. 🟠Избежание конфликтов имен Использование пакетов помогает избежать конфликтов имен, так как разные модули могут иметь одинаковые имена, но располагаться в разных пакетах. 🟠Управление зависимостями Пакеты упрощают управление зависимостями между различными частями кода. Структура каталога
math_operations/
init.
py
addition.py
subtraction.py
Код вort package.ite
def add(a, b):
return a + b
Код вport package.item
def subtract(a, b):
return a - b
Использование в скрипте
import math_operations.addition
import math_operations.subtraction

result_add = math_operations.addition.add(5, 3)
result_subtract = math_operations.subtraction.subtract(5, 3)

print("Addition:", result_add)  # Выведет: Addition: 8
print("Subtraction:", result_subtract)  # Выведет: Subtraction: 2
Ставь 👍 и забирай 📚 Базу знаний

🤔 В чем разница между процессом и потоком? 1. Процесс — это независимая единица выполнения с собственной памятью. 2. Поток — это часть процесса, использующая общую память с другими потоками того же процесса. 3. Потоки легче создаются, но менее изолированы, чем процессы. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое RESTful? Это подход к проектированию веб-сервисов, основанный на архитектурном стиле REST (*Representational State Transfer*). Это не протокол или стандарт, а набор принципов и ограничений, которые используются для создания систем, взаимодействующих через HTTP. Если API соответствует этим принципам, его называют RESTful. 🚩 Основные принципы REST 🟠Клиент-серверная архитектура Клиент (например, браузер или мобильное приложение) и сервер (где размещена база данных и логика обработки данных) чётко разделены: Клиент запрашивает данные или отправляет запросы к серверу. Сервер отвечает, предоставляя ресурсы или выполняя действия. 🟠Состояние отсутствия (Stateless) Каждый запрос от клиента к серверу должен быть самодостаточным. Это означает, что сервер не хранит информацию о состоянии клиента между запросами. Вся необходимая информация передается в запросе (например, токен аутентификации). 🟠Унифицированный интерфейс RESTful API использует единый, стандартный интерфейс для взаимодействия. Это достигается следующими средствами: Идентификация ресурсов через URI: Каждый ресурс имеет уникальный адрес (URI).
     GET https://api.example.com/users/123
     
Использование стандартных HTTP-методов: GET — для получения данных. POST — для создания новых данных. PUT или PATCH — для обновления данных. DELETE — для удаления данных. Ресурсы как представления: Ресурсы передаются в формате JSON, XML или другом формате. 🟠Кэширование Ответы сервера могут быть кэшируемыми. Это уменьшает нагрузку на сервер и ускоряет работу клиента. 🟠Единообразие и слои RESTful системы могут включать несколько слоев (например, балансировщики нагрузки, кеш-сервисы), но клиент взаимодействует только с сервером, не зная о внутренних слоях. 🟠Код по требованию (опционально) Иногда сервер может передавать исполняемый код (например, JavaScript) клиенту, чтобы расширить его функциональность. Это не обязательно. 🚩Почему RESTful важен? RESTful архитектура позволяет: 🟠Сделать API простым и понятным Клиенты легко понимают, как обращаться к ресурсам (используя стандартные методы и адреса). 🟠Обеспечить гибкость Клиенты и серверы могут развиваться независимо друг от друга. 🟠Поддерживать масштабируемость RESTful API легко масштабируются, так как все запросы независимы друг от друга (статичность). 🟠Облегчить интеграцию RESTful API поддерживают стандартизированные протоколы (HTTP), что делает интеграцию с другими сервисами проще. Ставь 👍 и забирай 📚 Базу знаний

Узнай грейд и рыночную зарплату + получи план развития бесплатно На связи ШОРТКАТ. Мы провели 300+ собеседований с менторами
Узнай грейд и рыночную зарплату + получи план развития бесплатно На связи ШОРТКАТ. Мы провели 300+ собеседований с менторами из бигтеха, собрали ключевые вопросы с собесов и сделали тест, который поможет оценить навыки. Вот как это работает: 1. Ты проходишь экспресс-тест за 20 минут или его расширенную версию 2. Бронируешь звонок для презентации обратной связи по ответам — можем встретиться уже на следующий день! 3. К созвону проверим ответы, чекнем СV и на основе этого оценим твой грейд. Ещё подскажем зарплату в рынке, построим план развития до следующего уровня и расскажем про наш новый продукт, который поможет получить выгодный оффер в 2025 году. Переходи в бота и проходи тест бесплатно, а дальше расскажем, что и как  👉@shortcut_python_bot Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2VtzquX4q6B

🤔 В чем разница между `copy()` и `deepcopy()`? 1. copy() создаёт поверхностную копию, при которой вложенные объекты остаются общими с оригиналом. 2. deepcopy() создаёт глубокую копию, рекурсивно копируя все вложенные объекты. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Зачем нужны классы BaseExceptionGroup и ExceptionGroup? В Python 3.11 были добавлены новые классы исключений BaseExceptionGroup и ExceptionGroup. Эти классы решают проблему одновременной обработки нескольких исключений, которые могут возникать в сложных ситуациях, таких как асинхронное программирование, многопоточность или обработка нескольких связанных ошибок. Давайте разберем, зачем они нужны, как их использовать и какие преимущества они дают. 🚩Зачем нужны `BaseExceptionGroup` и `ExceptionGroup`? Ранее в Python было возможно выбросить только одно исключение за раз, и обработка нескольких исключений одновременно требовала сложного и неочевидного кода. Например: При работе с асинхронными функциями или потоками может возникнуть сразу несколько ошибок, и их нужно корректно обработать. В больших приложениях или библиотеках (например, при работе с asyncio) может быть необходимость передать сразу несколько исключений, которые произошли в разных местах, как единый объект. BaseExceptionGroup и его подкласс ExceptionGroup позволяют группировать несколько исключений и выбрасывать их вместе в виде одного объекта. Это делает код более читаемым, упрощает обработку и исключает необходимость ручной агрегации ошибок. 🚩Разница между `BaseExceptionGroup` и `ExceptionGroup` BaseExceptionGroup - это базовый класс для группировки исключений. Он наследуется от BaseException и, как правило, не используется напрямую. ExceptionGroup - это подкласс, который наследуется от Exception. Этот класс используется для обработки групп исключений, которые возникают при обычных ошибках в коде (не фатальных). 🚩Как они работают? Классы исключений BaseExceptionGroup и ExceptionGroup позволяют создать "группу исключений", которая содержит несколько отдельных исключений. Это полезно, когда вам нужно: Указать несколько ошибок одновременно. Позволить обработчику исключений работать с каждым из них.
def task_1():
    raise ValueError("Ошибка в задаче 1")

def task_2():
    raise TypeError("Ошибка в задаче 2")

try:
    # Создаем группу исключений
    raise ExceptionGroup(
        "Ошибки в задачах",
        [ValueError("Ошибка в задаче 1"), TypeError("Ошибка в задаче 2")]
    )
except ExceptionGroup as eg:
    for exc in eg.exceptions:
        print(f"Обнаружено исключение: {exc}")
Результат
Обнаружено исключение: Ошибка в задаче 1
Обнаружено исключение: Ошибка в задаче 2
🚩Обработка групп исключений При обработке ExceptionGroup можно использовать механизм фильтрации с помощью конструкции except*. Это нововведение в Python 3.11 позволяет обрабатывать разные типы исключений внутри группы по-разному.
try:
    raise ExceptionGroup(
        "Ошибки в задачах",
        [ValueError("Ошибка 1"), TypeError("Ошибка 2"), ValueError("Ошибка 3")]
    )
except* ValueError as ve:
    print("Обрабатываем ValueError:", ve)
except* TypeError as te:
    print("Обрабатываем TypeError:", te)
Результат
Обрабатываем ValueError: Ошибка 1
Обрабатываем ValueError: Ошибка 3
Обрабатываем TypeError: Ошибка 2
🚩Преимущества использования ➕Работа с несколькими исключениями одновременно. Вы можете объединить связанные ошибки и передать их в одном объекте. ➕Четкое разграничение типов исключений. Использование except* позволяет обработать каждое исключение из группы отдельно, не теряя гибкости. ➕Удобство при асинхронном программировании. В асинхронных задачах (asyncio) часто возникает несколько ошибок одновременно, и их можно группировать для дальнейшей обработки. ➕Упрощение сложной логики. Код становится проще и понятнее, так как не нужно вручную собирать и разбирать исключения. 🚩Когда использовать? Когда вы работаете с несколькими задачами, которые могут порождать ошибки одновременно (например, асинхронный код). Когда вы хотите сообщить о нескольких связанных ошибках, не выбрасывая каждую из них отдельно. Когда требуется раздельная обработка разных типов ошибок. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое итерируемый объект? Это объект, который можно перебрать с помощью цикла for. 1. Он должен реализовывать метод __iter__, возвращающий итератор. 2. Примеры: списки, строки, словари, множества. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Чем асинхронность отличается от многопоточности? Это два подхода, которые используются для выполнения нескольких задач одновременно или для улучшения производительности. Однако они имеют разные концепции, способы реализации и области применения. 🚩Асинхронность Это способ организации кода, при котором задачи, занимающие много времени (например, ввод/вывод, запросы к базе данных или сетевые операции), не блокируют выполнение остальных частей программы. Основная идея асинхронности заключается в том, чтобы не ждать завершения одной операции перед началом следующей. 🟠Использует один поток Асинхронный код работает в основном потоке программы и переключается между задачами, когда одна из них ожидает завершения (например, чтения данных из сети). 🟠Ожидание через "event loop" Асинхронный подход использует цикл событий (event loop), который управляет выполнением задач. Если задача блокируется, цикл событий переключается на следующую задачу. 🟠Неблокирующий ввод/вывод Асинхронный код не простаивает в ожидании завершения операций ввода/вывода (I/O). Вместо этого такие операции сигнализируют о завершении через "обещание" (например, Future или asyncio.Task).
import asyncio

async def fetch_data():
    print("Начинаем загрузку данных...")
    await asyncio.sleep(2)  # Асинхронная пауза (имитирует длительную операцию)
    print("Данные загружены!")
    return {"data": "some data"}

async def main():
    print("Старт программы")
    data = await fetch_data()
    print(f"Результат: {data}")
    print("Конец программы")

# Запуск цикла событий
asyncio.run(main())
🚩Многопоточность Это способ выполнения нескольких задач одновременно с использованием нескольких потоков. Потоки — это "легковесные" процессы, которые разделяют одну и ту же память, но могут выполняться независимо друг от друга. 🟠Несколько потоков Программа создает несколько потоков, каждый из которых выполняет свою задачу. 🟠Параллельное выполнение Если у процессора несколько ядер, потоки могут выполняться действительно параллельно. 🟠Блокирующий код В отличие от асинхронного подхода, потоки часто блокируются в ожидании завершения операций (например, I/O).
import threading
import time

def task(name):
    print(f"Начало задачи {name}")
    time.sleep(2)  # Имитация длительной операции
    print(f"Конец задачи {name}")

# Создаем и запускаем потоки
thread1 = threading.Thread(target=task, args=("A",))
thread2 = threading.Thread(target=task, args=("B",))

thread1.start()
thread2.start()

# Ожидаем завершения потоков
thread1.join()
thread2.join()
print("Все задачи завершены")
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое поверхностная копия? Поверхностная копия (shallow copy) создаёт новый объект, но копирует ссылки на вложенные объекты. Изменение вложенных данных в копии отразится на оригинале. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как отсортировать список словарей по определенному полю? Для сортировки списка словарей по определенному полю в 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}]
Ставь 👍 и забирай 📚 Базу знаний