Python | Вопросы собесов
13.7K subscribers
37 photos
1 video
1 file
1.07K links
Download Telegram
🤔 Что такое моржовый оператор?

Моржовый оператор (:=) – это новый оператор, появившийся в Python 3.8, который позволяет присваивать значение переменной прямо внутри выражения.

🚩Как он работает?

Обычно мы записываем код так:
value = len(my_list)  # Сначала присваиваем
if value > 10: # Потом используем
print("Список большой")


С := можно совместить оба действия
if (value := len(my_list)) > 10:
print("Список большой")


🚩Где использовать?

В циклах (избегаем лишних вычислений). Вместо:
data = input("Введите строку: ")
while data != "exit":
print("Вы ввели:", data)
data = input("Введите строку: ")


С := можно записать короче:
while (data := input("Введите строку: ")) != "exit":
print("Вы ввели:", data)


В if и while (проверяем и присваиваем одновременно)
Без :=
text = input("Введите слово: ")
if len(text) > 5:
print(f"Слово длинное ({len(text)} символов)")


С :=:
if (length := len(text)) > 5:
print(f"Слово длинное ({length} символов)")


В списковых включениях (list comprehensions)
Без :=:
numbers = [random.randint(1, 100) for _ in range(10)]
filtered = [num for num in numbers if num % 2 == 0]


С :=:
filtered = [num for _ in range(10) if (num := random.randint(1, 100)) % 2 == 0]


🚩Когда не стоит использовать `:=`?

Если код становится сложнее для чтения
if (a := func()) and (b := another_func(a)) > 10:
...


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🤔2
🤔 Почему не рекомендуется авторизовываться через GET?

Потому что:
- Данные передаются в URL, и могут попасть в историю браузера, логи, прокси.
- Это небезопасно, особенно для логинов, паролей и токенов.
- GET предназначен для чтения, а не отправки чувствительных данных.
POST — безопаснее, так как данные передаются в теле запроса, а не в адресной строке.


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

В Python можно создать класс двумя основными способами:
Через class (обычный способ)
Через type() (динамическое создание класса)

🚩Обычное создание класса через `class`

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

def say_hello(self):
return f"Привет, я {self.name}!"

p = Person("Алиса")
print(p.say_hello()) # Привет, я Алиса!


🚩Динамическое создание класса через `type()`

Функция type() позволяет создать класс "на лету".
Person = type("Person", (object,), {
"__init__": lambda self, name: setattr(self, "name", name),
"say_hello": lambda self: f"Привет, я {self.name}!"
})

p = Person("Боб")
print(p.say_hello()) # Привет, я Боб!


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7💊2🔥1
🤔 Что такое TCP/IP?

TCP/IP — это набор сетевых протоколов, на которых работает интернет.
Он определяет, как компьютеры обмениваются данными в сети: как разбиваются, передаются, маршрутизируются и собираются пакеты.
TCP/IP — это основа передачи данных в интернете и локальных сетях.


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

🟠`datetime` – встроенный модуль Python
Модуль datetime позволяет работать с датами и временем, но по умолчанию он не поддерживает часовые пояса.
from datetime import datetime

dt = datetime.now() # Получаем текущую дату и время
print(dt) # Например: 2024-02-28 14:30:00.123456
print(dt.tzinfo) # None (нет информации о часовом поясе)


🟠`pytz` – внешний модуль для работы с часовыми поясами
Библиотека pytz добавляет поддержку часовых поясов и позволяет работать с разными временными зонами.
from datetime import datetime
import pytz

tz = pytz.timezone("Europe/Moscow") # Часовой пояс Москвы
dt = datetime.now(tz) # Получаем текущее время с учетом часового пояса

print(dt) # Например: 2024-02-28 17:30:00+03:00
print(dt.tzinfo) # Europe/Moscow


🚩Как работать с часовыми поясами правильно?

Создание datetime с часовым поясом pytz
dt = datetime(2024, 2, 28, 15, 0)  # Наивная дата
tz = pytz.timezone("Europe/Moscow")
dt = tz.localize(dt) # Присваиваем часовой пояс
print(dt) # 2024-02-28 15:00:00+03:00


Конвертация времени между часовыми поясами
ny_tz = pytz.timezone("America/New_York")
ny_time = dt.astimezone(ny_tz)
print(ny_time) # Конвертированное время в Нью-Йорке


Использование UTC (лучший подход для серверов)
utc_now = datetime.now(pytz.UTC)  # Текущее время в UTC
print(utc_now) # Например: 2024-02-28 14:30:00+00:00


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2
Media is too big
VIEW IN TELEGRAM
📺 База 1000+ реальных собеседований

На программиста, тестировщика, аналитика, проджекта и другие IT профы.

Есть собесы от ведущих компаний: Сбер, Яндекс, ВТБ, Тинькофф, Озон, Wildberries и т.д.

🎯 Переходи по ссылке и присоединяйся к базе, чтобы прокачать свои шансы на успешное трудоустройство!
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Можно ли извлечь элемент генератора по индексу?

Нет, генераторы не поддерживают индексацию. Их элементы можно получить только путём итерации.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Что такое паттерн Стратегия (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]


🚩Плюсы и минусы

Изоляция алгоритмов
Алгоритмы инкапсулируются в отдельные классы, что упрощает их замену и добавление.
Упрощение кода
Контекст использует стратегии, избегая громоздких условных операторов.
Гибкость и расширяемость
Легко добавлять новые стратегии без изменения существующего кода.
Усложнение структуры кода
Добавление множества классов стратегий может усложнить проект.
Контекст знает о стратегиях
Контекст должен знать о всех возможных стратегиях, чтобы иметь возможность их переключать.

🚩Когда использовать данный паттерн?

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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Что такое и чем отличается old-style от new-style classes?

Old-style классы были в Python 2 и не наследовали object. В Python 3 все классы автоматически new-style и обладают расширенными возможностями
.

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

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

🚩Основные этапы SDLC

🟠Планирование и анализ требований (Planning and Requirements Analysis)
На этом этапе определяются цели проекта, анализируются потребности и требования к системе. Включает сбор требований от заинтересованных сторон, анализ бизнес-процессов и создание документации с описанием требований.
Встречи с клиентами и пользователями для определения функций системы. Документирование функциональных и нефункциональных требований.

🟠Проектирование (Design)
На этапе проектирования разрабатывается архитектура системы и ее компоненты. Создаются технические спецификации, включая схемы базы данных, диаграммы классов и интерфейсов, а также детализируется план реализации.Разработка диаграмм UML.Создание прототипов пользовательского интерфейса.Проектирование архитектуры системы.

🟠Разработка (Implementation or Coding)
На этом этапе осуществляется непосредственная разработка программного обеспечения на основе спецификаций, созданных на предыдущем этапе. Кодирование выполняется в соответствии с выбранными языками программирования и инструментами разработки. Написание кода для модулей и компонентов системы. Интеграция различных компонентов системы. Регулярное использование систем контроля версий (например, Git).

🟠Тестирование (Testing)
Этап тестирования включает проверку и валидацию системы для обнаружения и исправления ошибок. Тестирование проводится в различных формах, включая юнит-тестирование, интеграционное тестирование, системное тестирование и приемочное тестирование. Автоматизированное тестирование с использованием фреймворков, таких как pytest или JUnit. Ручное тестирование функциональности и пользовательского интерфейса. Тестирование производительности и безопасности.

🟠Развертывание (Deployment)
На этом этапе программное обеспечение разворачивается в рабочей среде и становится доступным пользователям. Включает настройку серверов, развертывание баз данных и настройку инфраструктуры. Развертывание на облачных платформах, таких как AWS или Azure. Настройка и конфигурация серверов и сетей. Миграция данных и начальная загрузка данных.

🟠Поддержка и сопровождение (Maintenance)
Этап поддержки и сопровождения включает в себя обслуживание и улучшение системы после ее развертывания. Включает исправление ошибок, обновление функциональности и оптимизацию производительности. Обновление системы безопасности. Внесение изменений на основе отзывов пользователей. Обслуживание серверов и баз данных.

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

При итерации по списку в Python, интерпретатор последовательно обращается к каждому элементу списка. Это может быть реализовано с помощью цикла `for`, который автоматически вызывает метод `__iter__` списка для получения итератора, а затем последовательно вызывает `__next__` для доступа к каждому элементу.

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

Хеш-таблица (HashMap) — это структура данных, которая позволяет быстро хранить и искать пары ключ → значение. В Python её аналогом является dict.

🚩Основная идея

Ключ проходит через хеш-функцию → превращается в число (индекс).
Значение сохраняется в массиве по этому индексу.
При поиске: ключ снова хешируется, и мы мгновенно находим нужное значение.

🚩Как это работает в Python?

Создание хеш-таблицы (dict)
hash_map = {}  # Пустой словарь
hash_map["apple"] = 10 # Добавляем элемент
hash_map["banana"] = 20

print(hash_map["apple"]) # 10


🟠Хеширование ключа
Ключи сначала хешируются с помощью встроенной функции hash().
print(hash("apple"))  # Например: 2837462816
print(hash("banana")) # Другое число


🟠Разрешение коллизий
Иногда разные ключи могут давать одинаковый хеш. Это называется коллизией. Python использует метод цепочек (Chaining): Если у двух ключей один хеш, они хранятся в виде списка в одной ячейке.
hash_map = { "key1": 100, "key2": 200 }
print(hash("key1") % 10) # Допустим, 4
print(hash("key2") % 10) # Тоже 4 (коллизия!)

# Python хранит их в одной ячейке как список [(key1, 100), (key2, 200)]


🟠Динамическое расширение
При заполнении хеш-таблицы, если она становится слишком загруженной, Python автоматически увеличивает её размер, чтобы избежать замедления.
d = {}  # Создаём пустой dict
for i in range(1000):
d[i] = i

print(len(d)) # 1000, Python сам расширил таблицу


🟠Удаление элементов
Удаление также выполняется за O(1)
del hash_map["apple"]  # Мгновенно удаляем


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Разница URI и URL?

- URI — это общее понятие: любой способ идентификации ресурса.
- URL — это конкретный тип URI, указывающий, где найти ресурс и как его получить.
То есть все URL — это URI, но не все URI — это URL.


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

Многопоточность в Python реализуется с помощью модуля threading, но из-за GIL (Global Interpreter Lock) потоки не могут выполняться параллельно на нескольких ядрах.

🟠Модуль `threading` (многопоточность, но с GIL)
Модуль threading позволяет запускать несколько потоков (threads) в одном процессе.
import threading
import time

def task(name):
print(f"{name} начал работу")
time.sleep(2) # Имитация задержки
print(f"{name} завершил работу")

# Создаём два потока
t1 = threading.Thread(target=task, args=("Поток 1",))
t2 = threading.Thread(target=task, args=("Поток 2",))

t1.start()
t2.start()

t1.join()
t2.join()
print("Все потоки завершены")


Вывод
Поток 1 начал работу
Поток 2 начал работу
(пауза 2 секунды)
Поток 1 завершил работу
Поток 2 завершил работу
Все потоки завершены


🟠Модуль `multiprocessing` (настоящая параллельность)
В отличие от threading, модуль multiprocessing создаёт отдельные процессы, которые могут выполняться на разных ядрах процессора.
import multiprocessing
import time

def task(name):
print(f"{name} начал работу")
time.sleep(2)
print(f"{name} завершил работу")

if __name__ == "__main__":
p1 = multiprocessing.Process(target=task, args=("Процесс 1",))
p2 = multiprocessing.Process(target=task, args=("Процесс 2",))

p1.start()
p2.start()

p1.join()
p2.join()
print("Все процессы завершены")


🟠Модуль `concurrent.futures` (более удобный API)
Этот модуль позволяет легко управлять потоками (ThreadPoolExecutor) и процессами (ProcessPoolExecutor).
from concurrent.futures import ThreadPoolExecutor
import time

def task(n):
time.sleep(2)
return f"Готово: {n}"

with ThreadPoolExecutor(max_workers=2) as executor:
results = executor.map(task, [1, 2, 3])

for result in results:
print(result)


Пример ProcessPoolExecutor (процессы)
from concurrent.futures import ProcessPoolExecutor

def square(n):
return n * n

with ProcessPoolExecutor() as executor:
results = executor.map(square, [1, 2, 3, 4])

print(list(results)) # [1, 4, 9, 16]


🟠Модуль `asyncio` (асинхронность, не потоки!)
Модуль asyncio не создаёт потоки или процессы, а работает через "корутины" и цикл событий (event loop).
import asyncio

async def task():
print("Начало")
await asyncio.sleep(2) # Не блокирует другие задачи
print("Конец")

async def main():
await asyncio.gather(task(), task())

asyncio.run(main())


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

Оригинальный объект будет заменён на None, что приведёт к ошибке при попытке вызова. Это типичная ошибка при написании декоратора без return.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 В чем отличие @foobar от @foobar()?

В Python @ используется для декораторов, и разница между @foobar и @foobar() заключается в том, вызывается ли сам декоратор с параметрами или без.

🟠`@foobar` — декоратор без вызова
Если мы пишем @foobar, то используется сам декоратор как есть, без передачи аргументов.
def foobar(func):
def wrapper():
print("Декоратор вызван!")
return func()
return wrapper

@foobar # Просто передаём функцию в декоратор
def hello():
print("Hello, world!")

hello()


Вывод
Декоратор вызван!
Hello, world!


🟠`@foobar()` — декоратор с вызовом (и параметрами)
Если декоратор принимает параметры, то он сначала вызывается (foobar()), а потом возвращает сам декоратор.
def foobar(arg):
def decorator(func):
def wrapper():
print(f"Декоратор вызван с аргументом: {arg}")
return func()
return wrapper
return decorator

@foobar("Привет") # Вызываем foobar("Привет"), который вернёт реальный декоратор
def hello():
print("Hello, world!")

hello()


Вывод
Декоратор вызван с аргументом: Привет
Hello, world!


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

- Nested Loop Join — переборка строк (для малых таблиц);
- Merge Join — эффективен при сортированных данных;
- Hash Join — создание хеш-таблицы для одного источника и поиск по ней;
- Cross Join — декартово произведение.


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

У Академии программирования электронных устройств стартует курс «Программирование на Python» — базовый уровень, идеально для тех, кто только начинает путь в IT.
Самая низкая цена на курсы по python!

💡 Что ждёт тебя:
• пошаговое обучение с практикой и понятными объяснениями;
• полное погружение: установка, первая программа, типы данных, коллекции, функции, ООП, работа с файлами и модулями.
• индивидуальные (один на один!) онлайн-консультации с преподавателем-практиком с богатым опытом разработки и применения Python в реальных проектах;
• групповые консультации с разбором вопросов от учеников;
• проверка домашних заданий и разбор ошибок;
• доступ к базе знаний на 12 месяцев и закрытому клубу выпускников: общайся, задавай вопросы, расти дальше.

❗️Возможность использовать промокод за проверку знаний — получай скидку до 30% при оформлении.
Чтобы получить скидку, нажимай ссылку "ПОЛУЧИТЬ ПРОМОКОД" на сайте!

📅 Начало: 10 ноября 2025 г. — осталось ограниченное число мест.

Преподаватель с опытом работы более 17 лет в IT Выполнял проекты различной сложности. Вырос до руководителя отдела, руководителя проектов. Занимается продвижением различных веб проектов и созданию ИИ агентов и ботов. Использует языки программирования Python, JS, PHP, а так же SQL, CSS, HTML.

Подробнее о курсе и запись: по ссылке

Не откладывай — начни программировать уже в этом месяце!
🤔 Как в Python происходит поиск переменной по области видимости?

В Python поиск переменной происходит по правилу LEGB, которое определяет порядок поиска в четырёх областях видимости:
Пример работы LEGB
x = "глобальная"  # Global

def outer():
x = "охватывающая" # Enclosing
def inner():
x = "локальная" # Local
print(x) # Поиск начинается отсюда (L)

inner()

outer()


Вывод
локальная


🚩Глобальные переменные (`global`)

Если нужно изменить глобальную переменную внутри функции, используем global
x = 10  # Глобальная переменная

def modify_global():
global x
x = 20 # Меняем глобальную переменную

modify_global()
print(x) # 20


🚩Переменные из внешней функции (`nonlocal`)

Если в вложенной функции нужно изменить переменную из enclosing-области, используем nonlocal
def outer():
x = 10 # Переменная из enclosing-области

def inner():
nonlocal x
x = 20 # Меняем `x` в `outer()`

inner()
print(x) # 20

outer()


🚩Что если переменная отсутствует во всех областях?

Если переменная не найдена в LEGB, Python выдаст NameError
def func():
print(y) # Ошибка: y не объявлена!

func()


Ошибка
NameError: name 'y' is not defined


🚩`Built-in` — встроенные функции

Python в последнюю очереде проверяет встроенные функции (print(), len(), sum() и т. д.).
print = "Ошибка!"  # Переопределили встроенную функцию
print("Hello") # TypeError: 'str' object is not callable


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