fa
Feedback

فریب کلاهبرداران را نخورید! تل‌متریو این کانال‌ها را شناسایی و برچسب‌گذاری می‌کند 👉 برای مشاهده برچسب، اشتراک تهیه کنید 👈

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

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

رفتن به کانال در Telegram

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

نمایش بیشتر

📈 تحلیل کانال تلگرام Python | Вопросы собесов

کانال Python | Вопросы собесов (@python_easy_ru) در بخش زبانی روسی بازیگری فعال است. در حال حاضر جامعه شامل 12 637 مشترک است و جایگاه 9 918 را در دسته فناوری و برنامه‌ها و رتبه 51 142 را در منطقه روسيا دارد.

📊 شاخص‌های مخاطب و پویایی

از زمان ایجاد در невідомо، پروژه رشد سریعی داشته و 12 637 مشترک جذب کرده است.

بر اساس آخرین داده‌ها در تاریخ 14 اکتبر, 2026، کانال فعالیت پایداری دارد. در ۳۰ روز گذشته تغییر اعضا برابر -107 و در ۲۴ ساعت گذشته برابر 0 بوده و همچنان دسترسی گسترده‌ای حفظ شده است.

  • وضعیت تأیید: تأیید نشده
  • نرخ تعامل (ER): میانگین تعامل مخاطب 6.11% است و در ۲۴ ساعت نخست پس از انتشار، محتوا معمولاً 4.23% واکنش نسبت به کل مشترکان کسب می‌کند.
  • دسترسی پست‌ها: هر پست به طور میانگین 772 بازدید دریافت می‌کند. در اولین روز معمولاً 534 بازدید جمع‌آوری می‌شود.
  • واکنش‌ها و تعامل: مخاطبان به‌طور فعال حمایت می‌کنند؛ میانگین واکنش به هر پست 3 است.
  • علایق موضوعی: محتوا بر موضوعات کلیدی مانند ставь, модуль, строка, docker, alice تمرکز دارد.

📝 توضیح و سیاست محتوایی

نویسنده این فضا را محل بیان دیدگاه‌های شخصی توصیف می‌کند:
“Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads”

به لطف به‌روزرسانی‌های پرتکرار (آخرین داده در تاریخ 15 اکتبر, 2026)، کانال همواره به‌روز و دارای دسترسی بالاست. تحلیل‌ها نشان می‌دهد مخاطبان به‌طور فعال با محتوا تعامل دارند و آن را به نقطه اثرگذاری مهم در دسته فناوری و برنامه‌ها تبدیل کرده‌اند.

12 637
مشترکین
اطلاعاتی وجود ندارد24 ساعت
-307 روز
-10730 روز
آرشیو پست ها
🤔 В чем преимущество ООП перед обычными функциями? 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}]
Ставь 👍 и забирай 📚 Базу знаний