Python | Вопросы собесов
13.9K subscribers
36 photos
1 file
935 links
Download Telegram
🤔 Что такое JSON?

Это текстовый формат обмена данными:
- Представляет объекты и массивы в виде пар "ключ-значение".
- Легко читается человеком и машиной.
- Независим от языка, но тесно связан с синтаксисом JavaScript.
- Используется повсеместно для API и веб-приложений.
Примеры типов: строки, числа, булевы, массивы, объекты, null.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2
🤔 Cловари {dict}?

Словарь (dict) — это структура данных, которая хранит пары "ключ → значение".

🟠Создание словаря
Через {} (фигурные скобки)
my_dict = {"name": "Alice", "age": 25, "city": "New York"}


Изменение значения
my_dict["age"] = 26  # Меняем возраст


del — удаление по ключу
del my_dict["city"]


Перебор ключей (for key in dict)
for key in my_dict:
print(key, my_dict[key])


Проверка наличия ключа
if "name" in my_dict:
print("Ключ существует!")


🟠Генерация словарей (Dictionary Comprehension)
Создадим словарь квадратов чисел
squares = {x: x**2 for x in range(1, 6)}
print(squares) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}


🟠Ключи должны быть хешируемыми (неизменяемыми)
Нельзя использовать list как ключ!
my_dict[[1, 2, 3]] = "Ошибка"  # TypeError: unhashable type: 'list'


Можно использовать tuple, int, str, frozenset
my_dict[(1, 2, 3)] = "OK"


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 L - Liskov Substitution Principle - принцип подстановки Барбары Лисков

Любой объект подкласса должен быть заменяем на объект суперкласса без нарушения функциональности. Это поддерживает корректность и предсказуемость поведения кода.

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

В SQL можно объединять данные из двух таблиц без использования JOIN, используя альтернативные методы.

🚩Использование подзапросов (`SELECT` внутри `SELECT`)

Подзапрос (subquery) позволяет выбрать данные из одной таблицы, используя данные из другой.
Допустим, у нас есть две таблицы:
employees (id, name, department_id)
departments (id, name)
SELECT name, 
(SELECT name FROM departments WHERE id = employees.department_id) AS department_name
FROM employees;


🚩Использование `IN` или `EXISTS`

Можно фильтровать данные из одной таблицы, проверяя наличие значений в другой.
SELECT name 
FROM employees
WHERE department_id IN (SELECT id FROM departments);


🚩Объединение данных через `UNION`
Если таблицы имеют схожие колонки, можно объединить их с UNION.
SELECT id, name, email FROM users_old
UNION
SELECT id, name, email FROM users_new;


🚩Использование `CROSS JOIN` через `WHERE`

Хотя CROSS JOIN делает декартово произведение, его можно фильтровать WHERE, имитируя INNER JOIN.
SELECT e.name, d.name AS department
FROM employees e, departments d
WHERE e.department_id = d.id;


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

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


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

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

🚩Зачем нужен паттерн Заместитель

🟠Управление доступом
Когда необходимо контролировать доступ к ресурсу.
🟠Отложенная инициализация
Когда необходимо отложить создание ресурсоёмких объектов до момента их первого использования.
🟠Управление ресурсами
Для управления ресурсами, такими как память или сетевые соединения.
🟠Логирование и кэширование
Для добавления дополнительной функциональности, такой как логирование или кэширование, без изменения кода основного объекта.

🚩Типы заместителей

🟠Управляющий заместитель (Virtual Proxy):
Контролирует доступ к объекту, создавая его по требованию.
🟠Защитный заместитель (Protection Proxy):
Контролирует доступ к объекту, ограничивая права пользователей.
🟠Удалённый заместитель (Remote Proxy)
Управляет доступом к объекту, находящемуся в другом адресном пространстве.
🟠Кэш-прокси (Cache Proxy)
Кэширует результаты запросов к объекту для повышения производительности.

🚩Как используется паттерн Заместитель

Заместитель реализует интерфейс основного объекта и перенаправляет вызовы к реальному объекту, добавляя при этом дополнительную функциональность. В этом примере класс Proxy контролирует доступ к классу RealSubject, добавляя проверку доступа и логирование.
from abc import ABC, abstractmethod

class Subject(ABC):
@abstractmethod
def request(self):
pass

class RealSubject(Subject):
def request(self):
print("Реальный объект: Обработка запроса.")

class Proxy(Subject):
def __init__(self, real_subject):
self._real_subject = real_subject

def request(self):
if self.check_access():
self._real_subject.request()
self.log_access()

def check_access(self):
print("Заместитель: Проверка доступа перед выполнением запроса.")
return True

def log_access(self):
print("Заместитель: Логирование времени запроса.")

# Клиентский код
real_subject = RealSubject()
proxy = Proxy(real_subject)

proxy.request()


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🤔 Какие способы есть работы с базой данных?

- Через SQL-запросы напрямую (CLI, pgAdmin, MySQL Workbench);
- Через ORM (Django ORM, SQLAlchemy, Hibernate);
- Через Query Builder;
- Через API (REST, GraphQL, если БД скрыта за сервером);
- С использованием GUI-инструментов для админов.


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

Когда сервер получает HTTP-запрос типа GET, он выполняет следующие действия

🟠Анализ запроса
проверяет URL и параметры в строке запроса (например, ?id=123).
🟠Поиск ресурса
находит запрашиваемый файл, данные из базы или другой ресурс.
🟠Возврат ответа
отправляет данные клиенту (если ресурс найден — код 200, если нет — 404).

🚩Особенности GET-запроса

🟠Безопасный
не изменяет данные на сервере, используется только для чтения.
🟠Идемпотентный
повторные запросы дают одинаковый результат.
🟠Параметры в URL
данные передаются через строку запроса, что не подходит для конфиденциальной информации.

import requests

response = requests.get("https://api.example.com/data", params={"id": 123})
print(response.text) # Данные с сервера


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 В каких случаях использовать встроенные коллекции (list, tuple, set)?

Списки (list) применяются, когда нужен изменяемый порядок элементов. Кортежи (tuple) подходят для фиксированных наборов данных, а множества (set) — для уникальных, неупорядоченных элементов с быстрым поиском.


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

В Python практически всё является объектом: числа, строки, функции, классы, модули и даже сам интерпретатор Python рассматривает их как объекты. Однако есть несколько вещей, которые объектами не являются:

🟠Операторы и синтаксические конструкции
Операторы (+, -, *, and, or, not и т. д.) сами по себе не являются объектами. Они — часть синтаксиса языка и не имеют представления в виде объектов в памяти.
   a = 10 + 5  # Оператор "+" выполняет сложение, но сам по себе не объект
print(type(+)) # Ошибка: нельзя получить тип оператора


🟠Ключевые слова (keywords)
Встроенные ключевые слова Python (if, else, while, for, def, class, return и т. д.) не являются объектами. Они зарезервированы интерпретатором и используются для управления потоком выполнения кода.
   print(type(if))  # Ошибка: ключевое слово не является объектом


🟠Идентификаторы переменных
Хотя переменные ссылаются на объекты, сами идентификаторы (имена переменных) — это просто ссылки, а не объекты.
   x = 42  # x — это имя, а не объект
print(type(x)) # Это целое число, но само имя "x" объектом не является


🟠Аннотации типов во время компиляции
Аннотации типов в Python, такие как list[str], не создают объекты во время компиляции кода. Они интерпретируются только на уровне анализа типов.
   def func(x: int) -> str:
return str(x)


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Опишите функцию filter из модуля functools

На самом деле filter — встроенная функция, а не из functools. Она фильтрует элементы последовательности по заданному условию. Возвращает итератор только тех значений, для которых функция-условие возвращает истину.


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

Для сортировки списка словарей по определенному полю в 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
👍4
🤔 Байтовые массивы (byte array)?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2💊1
🤔 Почему вычислять большие значения в асинхронной функции плохо?

Асинхронность (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 = ["https://example.com"] * 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())


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥4
🤔 Какие основные функции Python есть?

Встроенные функции Python включают такие базовые инструменты, как len, type, print, input, int, str, list, dict, sum, max, min, zip, enumerate, range, map, filter и многие другие. Они обеспечивают широкий функционал без необходимости импортировать внешние библиотеки.


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

Это декоратор, предоставленный модулем dataclasses, который автоматически генерирует специальные методы, такие как __init__,🤔 Что так🤔 Что т и другие, для вашего класса. Это упрощает создание классов, предназначенных для хранения данных, устраняя необходимость писать много шаблонного кода.

🚩Зачем нужен

🟠Упрощение кода
Автоматически генерирует методы, сокращая шаблонный код.
🟠Читабельность
Делает код более чистым и легким для понимания.
🟠Удобство
Обеспечивает удобные и мощные возможности для работы с данными.

🚩Как использовать

Нужно импортировать его из модуля dataclasses и применить к классу. Внутри класса достаточно определить только поля данных.
from dataclasses import dataclass

@dataclass
class Person:
name: str
age: int

# Примеры использования
person1 = Person(name="Alice", age=30)
person2 = Person(name="Bob", age=25)

print(person1) # Вывод: Person(name='Alice', age=30)
print(person2) # Вывод: Person(name='Bob', age=25)
print(person1 == person2) # Вывод: False


🚩Автоматически генерируемые методы

🟠`__init__`
Инициализирует объект с заданными значениями атрибутов.
🟠`__repr__`
Возвращает строковое представление объекта, удобное для отладки.
🟠`__eq__`
Сравнивает объекты на равенство по их атрибутам.
🟠`__lt__`, __le__,🤔 Что так🤔 Что такМогут быть сгенерированы для сравнения объектов (если указано).

🚩Настройка поведения

Вы можете настроить поведение @dataclass с помощью параметров, таких как order, frozen, и других.

🟠`order=True`
Генерирует методы для сравнения объектов.
🟠`frozen=True`
Делает экземпляры неизменяемыми (immutable).

Пример
from dataclasses import dataclass

@dataclass(order=True, frozen=True)
class Person:
name: str
age: int

person1 = Person(name="Alice", age=30)
person2 = Person(name="Bob", age=25)

print(person1 > person2) # Вывод: True (поскольку 'Alice' > 'Bob' по алфавиту, если имена равны, сравниваются возраста)
# person1.age = 31 # Ошибка: FrozenInstanceError (поскольку класс заморожен)


🚩Поля данных и их настройки

Вы можете использовать функцию field() для настройки отдельных полей, например, для указания значений по умолчанию или исключения полей из методов
5)

print(

🤔 Что т и других.
from dataclasses import dataclass, field

@dataclass
class Person:
name: str
age: int = 0
address: str = field(default="Unknown", repr=False)

person = Person(name="Alice")
print(person) # Вывод: Person(name='Alice', age=0)


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8💊5🤔4
🤔 Чем WebSocket отличается от обычного сокета?

WebSocket — это протокол поверх TCP, предназначенный для двусторонней коммуникации в браузере. Он начинает с HTTP-запроса, а затем переходит в постоянное соединение. Обычные сокеты не привязаны к вебу и требуют ручной реализации протокола.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥3💊1
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Встроенные функции Python

В Python есть встроенные функции (built-in functions) — это функции, которые можно использовать без импорта. Они делают код проще и удобнее.
Полный список встроенных функций можно посмотреть так:
print(dir(__builtins__))


🚩Основные категории встроенных функций

Работа с числами
print(abs(-5))  # 5
print(round(3.14159, 2)) # 3.14
print(pow(2, 3)) # 8
print(min([3, 1, 4])) # 1


Работа со строками
print(len("hello"))  # 5
print(str(123)) # '123'
print(ord('A')) # 65
print(chr(65)) # 'A'


Работа с коллекциями (списки, кортежи, множества)
a = [3, 1, 2]
print(sorted(a)) # [1, 2, 3]

nums = [1, 2, 3]
names = ["Alice", "Bob", "Charlie"]
print(list(zip(nums, names))) # [(1, 'Alice'), (2, 'Bob'), (3, 'Charlie')]


Работа с логикой и проверками
print(bool(""))  # False
print(all([True, 1, "Hello"])) # True
print(any([0, "", None, 5])) # True (есть хотя бы один True)


Работа с функциями
nums = [1, 2, 3, 4]
squared = list(map(lambda x: x**2, nums))
print(squared) # [1, 4, 9, 16]

evens = list(filter(lambda x: x % 2 == 0, nums))
print(evens) # [2, 4]


Работа с файлами
with open("file.txt", "w") as f:
f.write("Hello, world!")

name = input("Введите имя: ")
print("Привет,", name)


Работа с объектами и атрибутами
print(type(42))  # <class 'int'>
print(isinstance(42, int)) # True
print(dir([])) # Методы списка


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