и посмотреть медиа
Preguntas de la entrevista de Python - pruebas
и посмотреть медиа
Preguntas, pruebas y tareas para entrevistas en Python.
Preguntas, pruebas y tareas para entrevistas en Python.
bot de IA para clonar texto a voz y voz en Telegram. Cree audio utilizando la red neuronal de forma rápida y fácil.
Canal con preguntas para entrevistas a Python. Pruebas, tareas y materiales para la preparación.
🤔 Как происходит наследование моделей в Django? В Django можно наследовать модели, используя стандартное наследование классов. Это помогает повторно использовать код, организовывать данные и добавлять общие поля в несколько моделей. Django поддерживает три основных типа наследования: 🟠Абстрактные модели Абстрактные модели используются, когда нужно создать базовый класс с полями и методами, которые должны быть унаследованы, но сам класс не должен создавать таблицу в базе данных. Создается базовый класс с abstract = True в Meta. Дочерние классы наследуют его поля и методы, но не его саму в виде отдельной таблицы. from django.db import models class BaseModel(models.Model): created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: abstract = True # Указывает, что это абстрактная модель class Post(BaseModel): title = models.CharField(max_length=255) content = models.TextField() class Comment(BaseModel): text = models.TextField() 🟠Многоуровневое (конкретное) наследование Этот тип наследования создаёт отдельные таблицы для каждой модели. Используется, когда дочерний класс должен представлять отдельную сущность, но при этом иметь доступ к полям родительского класса. Django создаёт отдельные таблицы в БД для родительской и дочерней модели. Дочерняя модель автоматически получает OneToOneField на родительскую. class Person(models.Model): name = models.CharField(max_length=255) class Employee(Person): # Отдельная таблица employee salary = models.DecimalField(max_digits=10, decimal_places=2) 🟠Прокси-модели (Proxy Models) Используются, когда нужно изменить поведение модели без изменения структуры базы данных. Прокси-модель наследует поля родительской модели. В Meta указывается proxy = True. Можно переопределять методы, добавлять новые, но не менять поля. class Person(models.Model): name = models.CharField(max_length=255) class Manager(Person): class Meta: proxy = True # Указываем, что это прокси-модель def get_uppercase_name(self): return self.name.upper() Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Как в обычном tuple происходит обращение? В обычном tuple доступ к элементам осуществляется только по индексу Обычные кортежи не имеют имён полей, и их нельзя использовать как именованные структуры без дополнительных обёрток. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Как отсортировать список словарей по определенному полю? Для сортировки списка словарей по определенному полю в 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}] Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Срезы или слайсы в Python? Позволяют получить подмножество элементов из строки, списка и других последовательностей с помощью синтаксиса [start:stop:step]. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Чем отличаются методы сокрытия? Методы и атрибуты класса могут быть скрыты от внешнего использования с помощью различных уровней сокрытия. Сокрытие реализуется с помощью соглашений об именах, а не с помощью жесткой инкапсуляции, как в некоторых других языках программирования. Основные уровни сокрытия включают публичные, защищенные и приватные методы и атрибуты. 🚩Публичные методы и атрибуты Доступны из любого места, как внутри класса, так и за его пределами. Их имена не начинаются с подчеркиваний. class MyClass: def __init__(self): self.public_attribute = "I am public" def public_method(self): return "This is a public method" obj = MyClass() print(obj.public_attribute) # Вывод: I am public print(obj.public_method()) # Вывод: This is a public method 🚩Защищенные методы и атрибуты Не предназначены для использования за пределами класса и его подклассов. Они обозначаются одним подчеркиванием в начале имени. Это всего лишь соглашение, сигнализирующее другим разработчикам, что такие методы и атрибуты не следует использовать вне класса или его подклассов. class MyClass: def __init__(self): self._protected_attribute = "I am protected" def _protected_method(self): return "This is a protected method" class SubClass(MyClass): def access_protected(self): return self._protected_method() obj = MyClass() sub_obj = SubClass() print(sub_obj.access_protected()) # Вывод: This is a protected method 🚩Приватные методы и атрибуты Скрыты от внешнего доступа и доступны только внутри самого класса. Они обозначаются двумя подчеркиваниями в начале имени. Python реализует это с помощью механизма именования, который изменяет имя метода или атрибута, добавляя к нему имя класса, чтобы затруднить доступ извне. class MyClass: def __init__(self): self.__private_attribute = "I am private" def __private_method(self): return "This is a private method" def access_private(self): return self.__private_method() obj = MyClass() try: print(obj.__private_attribute) except AttributeError as e: print(e) # Вывод: 'MyClass' object has no attribute '__private_attribute' try: print(obj.__private_method()) except AttributeError as e: print(e) # Вывод: 'MyClass' object has no attribute '__private_method' # Доступ к приватным методам через публичный метод класса print(obj.access_private()) # Вывод: This is a private method Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Чем отличается re.match от re.search? - re.match() проверяет только начало строки на соответствие шаблону. Если начало не совпадает — возвращает None. - re.search() ищет соответствие в любом месте строки и возвращает первое совпадение. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Какие нюансы есть в использовании чисел как ключей? Использование чисел в качестве ключей в словарях 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)]) # "один" Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что такое Docker Daemon? Docker Daemon (dockerd) — это фоновый процесс, управляющий: - образами, - контейнерами, - сетями и томами. Он слушает команды от клиента (docker) и взаимодействует с ядром ОС для запуска контейнеров. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Почему вычислять большие значения в асинхронной функции плохо? Асинхронность (asyncio) в Python не выполняет код параллельно, а переключается между задачами во время ожидания (I/O-bound). Если в async-функции делать тяжёлые вычисления (CPU-bound), это блокирует asyncio, потому что в Python есть GIL (Global Interpreter Lock). 🚩Асинхронность в Python подходит для ввода-вывода (I/O-bound) Асинхронность позволяет выполнять задачи без блокировки, но только если они ждут чего-то (файлы, сеть, БД). import asyncio import aiohttp async def fetch(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response: return await response.text() async def main(): urls = ["Ссылка скрыта * 5 results = await asyncio.gather(*(fetch(url) for url in urls)) asyncio.run(main()) 🚩Проблема с `async` и тяжёлыми вычислениями (CPU-bound) Если в async-функции делать тяжёлые вычисления, Python не сможет переключаться между задачами. import asyncio async def heavy_task(n): print(f"Вычисляю {n}...") total = sum(i**2 for i in range(n)) # Долгий процесс return total async def main(): await asyncio.gather(heavy_task(10**7), heavy_task(10**7)) asyncio.run(main()) 🚩Как правильно выполнять вычисления в `async`? 🟠Использовать `asyncio.to_thread()` (делегирование в потоки) В Python 3.9+ можно выполнять CPU-задачи в отдельных потоках, не блокируя asyncio. import asyncio def heavy_computation(n): return sum(i**2 for i in range(n)) async def main(): result = await asyncio.to_thread(heavy_computation, 10**7) print(result) asyncio.run(main()) 🟠Использовать `multiprocessing` (запуск на нескольких ядрах) Так как Python использует GIL, единственный способ выполнять настоящий параллелизм — это multiprocessing. import asyncio import multiprocessing def heavy_computation(n): return sum(i**2 for i in range(n)) async def main(): loop = asyncio.get_running_loop() with multiprocessing.Pool() as pool: result = await loop.run_in_executor(pool, heavy_computation, 10**7) print(result) asyncio.run(main()) Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиаSolo los usuarios registrados pueden compartir su opinión.
¡Sé el primero en compartir tu experiencia con este recurso!