Python вопросы с собеседований
Вопросы с собеседований по Python @workakkk - админ @machinelearning_interview - вопросы с собесдований по Ml @pro_python_code - Python @data_analysis_ml - анализ данных на Python @itchannels_telegram - 🔥 главное в ит РКН: clck.ru/3FmrFd
Show more📈 Analytical overview of Telegram channel Python вопросы с собеседований
Channel Python вопросы с собеседований (@python_job_interview) in the Russian language segment is an active participant. Currently, the community unites 24 966 subscribers, ranking 5 488 in the Technologies & Applications category and 26 804 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 24 966 subscribers.
According to the latest data from 05 June, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -153 over the last 30 days and by -5 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 6.12%. Within the first 24 hours after publication, content typically collects 3.05% reactions from the total number of subscribers.
- Post reach: On average, each post receives 1 527 views. Within the first day, a publication typically gains 762 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 8.
- Thematic interests: Content is focused on key topics such as github, api, собеседование, git, docker.
📝 Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
“Вопросы с собеседований по Python
@workakkk - админ
@machinelearning_interview - вопросы с собесдований по Ml
@pro_python_code - Python
@data_analysis_ml - анализ данных на Python
@itchannels_telegram - 🔥 главное в ит
РКН: clck.ru/3FmrFd”
Thanks to the high frequency of updates (latest data received on 06 June, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
contextlib.contextmanager.
Это позволяет красиво управлять ресурсами (файлами, соединениями, блокировками) без лишнего кода.
from contextlib import contextmanager
import time
@contextmanager
def timer(name: str):
start = time.time()
try:
yield
finally:
end = time.time()
print(f"[{name}] elapsed: {end - start:.4f} sec")
# Использование
with timer("heavy calc"):
sum(i * i for i in range(10_000_000))
🔥 Фишка: можно легко оборачивать любой ресурс (БД, сокет, API) и гарантировать его закрытие или освобождение.
Это делает код чище и надёжнее.pip install easyocr
🟢Репозиторийipaddress.
import ipaddress
# Создаём сеть
net = ipaddress.ip_network("192.168.1.0/24")
# Проверяем, входит ли IP в сеть
print(ipaddress.ip_address("192.168.1.42") in net) # True
print(ipaddress.ip_address("10.0.0.5") in net) # False
# Перебираем все адреса подсети
for ip in net.hosts():
print(ip)
break # выведет первый адрес
# Работаем с IPv6 так же просто
ipv6 = ipaddress.ip_network("2001:db8::/32")
print(ipaddress.ip_address("2001:db8::1") in ipv6) # True
📌 Чем полезно
Проверка принадлежности адреса подсети
Удобный парсинг IPv4 и IPv6
Генерация диапазонов IP
Всё встроено в Python — никаких сторонних зависимостей
🔥 Отлично подходит для написания сетевых тулзов, firewall-скриптов, DevOps-автоматизации и тестов.
#Python #Networking #Tips #DevOps
import json
data = '{"name": "Alice", "age": 25}'
parsed = json.loads(data)
print(parsed["name"]) # Alice
2️⃣ HTML/XML-парсинг с BeautifulSoup
from bs4 import BeautifulSoup
html = "<h1>Hello <b>Python</b></h1>"
soup = BeautifulSoup(html, "html.parser")
print(soup.h1.text) # Hello Python
3️⃣ Парсинг аргументов командной строки с argparse
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--name")
args = parser.parse_args()
print(f"Hello, {args.name}")
4️⃣ Быстрый CSV-парсинг
import csv
with open("data.csv") as f:
reader = csv.DictReader(f)
for row in reader:
print(row["username"], row["score"])
5️⃣ Регулярки для гибкого текста
import re
text = "Email: test@example.com"
match = re.search(r"\w+@\w+\.\w+", text)
print(match.group()) # test@example.com
🔥 Эти трюки помогают парсить JSON, HTML, CSV, аргументы CLI и даже “грязный” текст.
Подойдут как для скриптов, так и для продакшн-кода.
👉 Сохрани, чтобы не забыть!uv.lock, poetry.lock, Pipfile.lock, pyproject.toml, Pipfile, requirements.txt и др.
- Сверяет зависимости с базами уязвимостей: PyPA Advisory Database, PyPI JSON API, OSV.dev
- Поддерживает вывод в формате: человекочитаемом, JSON, SARIF или Markdown — отлично подходит для CI/CD и IDE-интеграций (например, GitHub Security)
- Написан на Rust с асинхронной обработкой, многоуровневым кэшированием и оптимизированной резолюцией — очень быстро и эффективно
uvx pysentry-rs /path/to/project
🟢 GithubThreadPoolExecutor
Этот скрипт использует urllib.request + concurrent.futures, чтобы загружать файлы одновременно и значительно ускорить процесс.
import os
import urllib.request
from concurrent.futures import ThreadPoolExecutor, as_completed
def downloader(url):
"""Скачивает указанный URL и сохраняет его на диск"""
req = urllib.request.urlopen(url)
filename = os.path.basename(url)
ext = os.path.splitext(url)[1]
if not ext:
raise RuntimeError('URL не содержит расширения')
with open(filename, 'wb') as file_handle:
while True:
chunk = req.read(1024)
if not chunk:
break
file_handle.write(chunk)
return f'Загрузка завершена: {filename}'
def main(urls):
"""Создаёт пул потоков и скачивает указанные файлы"""
with ThreadPoolExecutor(max_workers=5) as executor:
futures = [executor.submit(downloader, url) for url in urls]
for future in as_completed(futures):
print(future.result())
if __name__ == '__main__':
urls = [
"http://www.irs.gov/pub/irs-pdf/f1040.pdf",
"http://www.irs.gov/pub/irs-pdf/f1040a.pdf",
"http://www.irs.gov/pub/irs-pdf/f1040ez.pdf",
"http://www.irs.gov/pub/irs-pdf/f1040es.pdf",
"http://www.irs.gov/pub/irs-pdf/f1040sb.pdf"
]
main(urls)callbacks, где каждая функция при вызове печатает свой индекс.
> Затем вызовите их по очереди (или из потоков/таймеров) — ожидаемый вывод: 0 1 2.
Наивное решение (почти все так пишут)
callbacks = [lambda: print(i) for i in range(3)]
for f in callbacks:
f()
Что выведет?
2 2 2 — и это не баг интерпретатора.
В чём подвох
- Замыкание поздно связывает имя i: лямбды не «копируют» значение, а смотрят на переменную i, когда вы их вызываете.
- К моменту вызова цикл уже закончился, i == 2, значит все три лямбды печатают 2.
Правильные варианты
Привязать значение через параметр по умолчанию (часто лучший баланс читаемости)
callbacks = [lambda i=i: print(i) for i in range(3)]
for f in callbacks:
f() # 0 1 2
Заводим фабрику функций (прямо подчёркивает намерение)
def make_printer(i):
def _f():
print(i)
return _f
callbacks = [make_printer(i) for i in range(3)]
for f in callbacks:
f() # 0 1 2
functools.partial — когда нужно просто «прикрутить аргументы»
from functools import partial
callbacks = [partial(print, i) for i in range(3)]
for f in callbacks:
f() # 0 1 2
А если таймеры/потоки?
import threading
for i in range(3):
# ПЛОХО: замкнёт одно и то же i
# threading.Timer(1, lambda: print(i)).start()
# ХОРОШО: привяжем значение сразу
threading.Timer(1, lambda i=i: print(i)).start()
Мини-чеклист для собеса
- Лямбды/внутренние функции в цикле → проверь, не упираешься ли в late binding.
- Если нужна «заморозка» значения, используй параметр по умолчанию, фабрику или partial.
Не путай с другой классикой: изменяемые значения по умолчанию (например, def f(x, acc=[])), это другая ловушка.
Вывод
В Python замыкания захватывают имена, а не значения.
Привязывай нужное значение в момент создания функции — и подвох исчезнет..env: IPYTHONDIR=/code/attic/ipython/
- В .gitignore: attic/
- В Docker Compose: подключай .env и твой проект как volume, чтобы IPython создавал конфигурацию в attic/ipython/profile_default/ :contentReference[oaicite:0]{index=0}.
2. Настройка по вкусу:
- В ipython_config.py можно задать стиль редактирования (например, `c.editing_mode = "vi"`).
- Автоматически импортируй часто используемые библиотеки через c.InteractiveShellApp.exec_lines = [...] или скрипты в папке startup/, пронумерованные по порядку загрузки :contentReference[oaicite:1]{index=1}.
3. Предзагрузка данных для удобной работы:
Например, при работе с Django можно автоматически загрузить dev-данные. Скрипт 20-load-devdata-assignment.py внутри startup/ пытается получить объект Assignment и связанные с ним данные, делая работу в IPython удобнее :contentReference[oaicite:2]{index=2}.
4. Собственный инструмент для рутины:
Автор реализовал класс URLFinder, который извлекает UUID из строки URL, красиво их отображает с помощью библиотеки rich — и позволяет получить нужный UUID по индексу (`ids(0)`, ids(1) и т.п.) :contentReference[oaicite:3]{index=3}.
Вывод:
Настройка IPython в Docker — это просто, удобно и лично. И это не навязывает изменения команде. Даже маленький инструмент вроде URLFinder может существенно упростить рутину.
Опубликовано 19 августа 2025 года автором Frank Wiles, основателем REVSYS и бывшим президентом Django Software Foundation .
Если хочешь, могу добавить краткий пример docker-compose.yaml или показать фрагмент скрипта URLFinder — скажи!
https://frankwiles.com/posts/customize-ipython-docker/ -def counter(func):
count = 0
def wrapper(*args, **kwargs):
nonlocal count
count += 1
print(f"Функция {func.__name__} вызвана {count} раз")
return func(*args, **kwargs)
return wrapper
@counter
def greet(name):
return f"Привет, {name}!"
print(greet("Анна"))
print(greet("Пётр"))
Вопрос: Что выведет данный код?
Правильный ответ:
Функция greet вызвана 1 раз
Привет, Анна!
Функция greet вызвана 2 раз
Привет, Пётр!
Пояснение:
1. Декоратор counter создает замыкание — внутреннюю функцию wrapper, которая имеет доступ к переменной count.
2. При каждом вызове декорированной функции greet:
— Увеличивается счетчик count
— Выводится сообщение с текущим значением счетчика
— Вызывается оригинальная функция greet с переданными аргументами
3. Переменная count сохраняет свое состояние между вызовами благодаря механизму замыканий.
4. nonlocal позволяет изменять переменную из внешней области видимости
@python_job_interviewvalidate_product, которая проходит несколько вложенных проверок.
Линтер Ruff с правилом C901 (McCabe Complexity) сигнализирует: сложность функции = 7, что выше лимита 5.
📏 McCabe Complexity измеряет количество ветвлений и условий в функции. Чем выше показатель, тем сложнее код для понимания и поддержки.
⚠️ Почему это важно:
• Снижение читаемости
• Рост вероятности багов
• Трудности при тестировании
💡 Решение:
1. Разбить функцию на несколько маленьких с понятными именами
2. Использовать ранние выходы (`return`) вместо вложенных if
3. Упрощать логику с помощью вспомогательных функций или структур данных
#Python #Ruff #CleanCode #Refactoring #McCabeComplexitysender_id и количество сообщений.
Подход:
1) Отфильтровать сообщения по интервалу августа — в T-SQL удобно задавать полуинтервалом [2022-08-01, 2022-09-01), без функций над датой (чтобы не ломать индексы).
2) Посчитать сообщения по sender_id.
3) Отсортировать по убыванию и взять TOP 2.
Если хотите корректно обрабатывать «ничьи» — используйте DENSE_RANK().
Быстрое решение (T-SQL):
SELECT TOP (2)
sender_id,
COUNT(*) AS message_count
FROM messages
WHERE sent_date >= '2022-08-01'
AND sent_date < '2022-09-01'
GROUP BY sender_id
ORDER BY COUNT(*) DESC, sender_id;
Вариант с учетом ничьих (tie-safe):
WITH monthly AS (
SELECT sender_id, COUNT(*) AS message_count
FROM messages
WHERE sent_date >= '2022-08-01'
AND sent_date < '2022-09-01'
GROUP BY sender_id
),
ranked AS (
SELECT sender_id, message_count,
DENSE_RANK() OVER (ORDER BY message_count DESC) AS rnk
FROM monthly
)
SELECT sender_id, message_count
FROM ranked
WHERE rnk <= 2
ORDER BY message_count DESC, sender_id;
Почему так:
- Фильтр по диапазону дат без функций сохраняет «sargable» запрос (используются индексы по sent_date).
- GROUP BY + COUNT(*) дают нужную метрику.
- DENSE_RANK() аккуратно захватывает все «совместные» вторые места.
Available now! Telegram Research 2025 — the year's key insights 
