Prosto Python | вопросы с собесов
363 subscribers
184 photos
1 video
2 files
565 links
🚀 Python-собесы без сюрпризов! Разбираем реальные вопросы, ошибки кандидатов и лайфхаки, которые помогают пройти интервью. Джун → мидл → сеньор — прокачивайся и разнеси следующий собес! 🔥
Download Telegram
🐍 Python Style
Тема: используй set для проверок вхождения


Часто нужно проверить, есть ли элемент в коллекции 👇
Работает, но можно сделать быстрее и чище.


Не по-питоничному:

items = [1, 3, 5, 7, 9]

if x in items:
print("Найдено")


(Особенно больно, если список большой)
Python Style:


items = {1, 3, 5, 7, 9}

if x in items:
print("Найдено")


🧠 Почему это хороший стиль:
🔹 проверка in за O(1), а не O(n)
🔹 код сразу говорит: «мне важна уникальность и поиск»
🔹 меньше скрытых проблем с производительностью
🔹 идеально для фильтров, флагов, whitelists / blacklists

📌 Запомни:
list — когда важен порядок
set — когда важна скорость и уникальность

🐍Вопросы с собесов -> ProstoPython
🔥4👍2
Попробуйте ответить без запуска кода, разбор будет через 2 часа

🐍Вопросы с собесов -> ProstoPython
👍3
Правильный ответ
Правильный вариант:


[1]
[1, 2]
[1, 2, 3]


🧠 Почему именно так

Подвох в значении по умолчанию аргумента items=[].

В Python:

🔷 значения аргументов по умолчанию
🔷 создаются один раз — в момент определения функции
🔷 и переиспользуются при каждом вызове

То есть items — это один и тот же список для всех вызовов add_item.

Что происходит пошагово:

1️⃣ add_item(1)
🔷 список был пуст
🔷 добавили 1
🔷 [1]

2️⃣ add_item(2)
🔷 это тот же самый список
🔷 добавили 2
🔷 [1, 2]

3️⃣ add_item(3)
🔷 снова тот же объект
🔷 [1, 2, 3]

Накидайте 🔥, если было полезно и интересно

🐍Вопросы с собесов -> ProstoPython
🔥5
🧰 Code Cleanup — выпуск 19
Тема: почему else иногда лишний?


Часто в коде можно увидеть такую конструкцию:

Плохо:

if user.is_banned:
return "Access denied"
else:
return "Welcome"


else здесь технически не нужен, но визуально утяжеляет код.
Читать приходится дольше, чем нужно 👀


Code Cleanup:

if user.is_banned:
return "Access denied"
return "Welcome"


Логика та же, но код стал проще и прямолинейнее.

🧠 Почему так лучше:
🔹 меньше уровней вложенности
🔹 код читается сверху вниз
🔹 проще добавлять новые условия
🔹 легче поддерживать и рефакторить

🐍Вопросы с собесов -> ProstoPython
👍6
🧰 Code Cleanup — выпуск 20
Тема: почему временные переменные — лишние

Иногда код усложняют переменные, которые живут пару строк и не несут смысла.

Плохо:

result = user.balance * 0.9
return result


Работает, но переменная здесь ничего не объясняет и только засоряет код.

Code Cleanup:

return user.balance * 0.9


🧠 Почему так лучше:
🔹 меньше шума в коде
🔹 сразу видно, что возвращается
🔹 проще читать и поддерживать
🔹 меньше мест для ошибок

🐍Вопросы с собесов -> ProstoPython
🔥5
Dict comprehension — это краткий способ создания словаря на основе итерируемого объекта.

Пример:

numbers = [1, 2, 3, 4]

squares = {n: n**2 for n in numbers}

print(squares)


Результат:

{1: 1, 2: 4, 3: 9, 4: 16}


Можно добавлять условия:

even_squares = {n: n**2 for n in numbers if n % 2 == 0}


Создаёт словарь только из чётных чисел.

🐍Вопросы с собесов -> ProstoPython
👍5
Новая рубрика в канале — Rookie Mistakes

Рубрика про типичные ошибки, которые делают начинающие Python-разработчики.
Показываем, как делать не стоит, и сразу разбираем, как писать правильно и чище 🐍

Мы постоянно работаем над качеством контента, ищем лучшие примеры и придумываем новые форматы, чтобы тебе было проще расти как разработчику и увереннее чувствовать себя на собеседованиях 🚀

👉 Делись с друзьями и коллегами — пусть меньше людей наступает на одни и те же грабли 😉

🐍Вопросы с собесов -> ProstoPython
🔥41
Rookie Mistakes #1 — list как аргумент по умолчанию

Кажется безобидно, но это одна из самых коварных ошибок в Python 😬

Плохо
def add_item(item, items=[]):
items.append(item)
return items

print(add_item(1)) # [1]
print(add_item(2)) # [1, 2] 😱


Почему так?
items создаётся один раз, а не при каждом вызове функции.


Хорошо

def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items

print(add_item(1)) # [1]
print(add_item(2)) # [2]


🐍Вопросы с собесов -> ProstoPython
🔥6
gather() используется в asyncio для одновременного запуска и ожидания нескольких асинхронных задач.

🔹 запускает корутины параллельно
🔹 дожидается завершения всех задач
🔹 возвращает результаты в том же порядке, что и переданные задачи

Применяется, когда нужно выполнить несколько асинхронных операций одновременно.

🐍Вопросы с собесов -> ProstoPython
🏆3
Попробуйте ответить без запуска кода, разбор будет через 2 часа

🐍Вопросы с собесов -> ProstoPython
👍41🥰1
Что выведет код выше?
Anonymous Poll
49%
10
22%
5
11%
None
19%
Ошибка
👍1👎1🥰1
Правильный ответ: Ошибка — UnboundLocalError

🧠 Почему так?


🔷Внутри foo() есть присваивание x = 5

🔷Python считает x локальной переменной во всей функции

🔷Но print(x) идёт до присваивания

🔷В итоге: обращение к локальной переменной до её создания -> ошибка

Как исправить, если нужен внешний x:

def foo():
global x
print(x)
x = 5


Или лучше так:

def foo(x):
print(x)
x = 5


🔹 Вывод:
👉 Если в функции есть присваивание — переменная становится локальной, даже если она объявлена снаружи.


🐍Вопросы с собесов -> ProstoPython
🔥51🥰1😁1
🧰 Code Cleanup — выпуск 21
Тема: лишний else после return


Если функция уже что-то вернула — else чаще всего не нужен.

Плохо:
def is_even(n):
if n % 2 == 0:
return True
else:
return False


Код работает, но else здесь — просто шум.

Code Cleanup:
def is_even(n):
return n % 2 == 0


🧠 Почему так лучше:
🔹 меньше строк — быстрее читается
🔹 нет лишней вложенности
🔹 проще логика

🐍Вопросы с собесов -> ProstoPython
👍31
Асинхронность работает быстрее, потому что не блокирует выполнение программы во время ожидания медленных операций.

🔹 пока одна задача ждёт I/O (сеть, БД, файлы), выполняются другие
🔹 процессор не простаивает
🔹 можно обслуживать много задач одним потоком

Итог: ресурсы используются эффективнее, особенно в I/O-нагруженных приложениях.

🐍Вопросы с собесов -> ProstoPython
🔥4
Rookie Mistakes 2— ловушка or при значениях по умолчанию

Очень популярная ошибка у новичков.

Плохо:
def get_limit(limit):
return limit or 10

print(get_limit(0))


Ожидаешь 0, а получаешь 10 😬

Хорошо:
def get_limit(limit):
if limit is None:
return 10
return limit


🧠 Почему так происходит:

or возвращает первое truthy значение

0, '', [] — это False

Python думает, что значения «нет», хотя оно есть

🐍Вопросы с собесов -> ProstoPython
🔥4
🧰 Code Cleanup — выпуск 22
Тема: не усложняй if, когда можно проще


Иногда условия пишут слишком подробно, хотя Python умеет короче.

Плохо:
if is_active == True:
send_email()


Работает, но сравнение с True здесь лишнее.

Code Cleanup:
if is_active:
send_email()


🧠 Почему так лучше:
🔹 код короче и чище
🔹 сразу читается логика
🔹 меньше лишних сравнений

🐍Вопросы с собесов -> ProstoPython
🔥4
Rookie Mistakes #3 — забыли return

Код выглядит нормально.
Но функция делает не то, что ожидаешь 😬


Плохо:

def calc_discount(price):
price * 0.9

result = calc_discount(100)
print(result)


Ожидаешь 90, а получаешь None.

Хорошо:
def calc_discount(price):
return price * 0.9


🧠 Почему так происходит:

🔹Если в функции нет return — Python возвращает None

🔹Выражение само по себе ничего не возвращает

🔹Ошибка не всегда заметна сразу

🐍Вопросы с собесов -> ProstoPython
👍4
Git rebase нужен для переноса коммитов одной ветки поверх другой.

🔹 делает историю линейной и более чистой
🔹 убирает лишние merge-коммиты
🔹 позволяет «переиграть» изменения поверх актуальной версии ветки

Используется для упорядочивания истории перед слиянием.

🐍Вопросы с собесов -> ProstoPython
🔥4
Rookie Mistakes #9 — путаница между sort() и sorted()

Плохо:
numbers = [3, 1, 2]
sorted_numbers = numbers.sort()

print(sorted_numbers)


Ожидаешь [1, 2, 3],
а получаешь None.


Хорошо:
numbers = [3, 1, 2]
sorted_numbers = sorted(numbers)

print(sorted_numbers)


🧠 Почему так происходит:


🔹list.sort() сортирует список на месте и возвращает None

🔹sorted() создаёт новый отсортированный список

🔹Многие путают их из-за похожих названий

🐍Вопросы с собесов -> ProstoPython
👍3
GET
🔹 запрашивает данные
🔹 возвращает тело ответа
🔹 используется для получения ресурсов

POST
🔹 отправляет данные на сервер
🔹 создаёт или изменяет ресурс
🔹 передаёт данные в теле запроса

HEAD
🔹 работает как GET, но
🔹 возвращает только заголовки без тела ответа

🐍Вопросы с собесов -> ProstoPython
🔥4