Python вопросы с собеседований
Вопросы с собеседований по Python @workakkk - админ @machinelearning_interview - вопросы с собесдований по Ml @pro_python_code - Python @data_analysis_ml - анализ данных на Python @itchannels_telegram - 🔥 главное в ит РКН: clck.ru/3FmrFd
显示更多📈 Telegram 频道 Python вопросы с собеседований 的分析概览
频道 Python вопросы с собеседований (@python_job_interview) 俄语 语言赛道中的 是活跃参与者。目前社区聚集了 24 967 名订阅者,在 技术与应用 类别中位列第 5 489,并在 俄罗斯 地区排名第 26 805 位。
📊 受众指标与增长动态
自 невідомо 创建以来,项目保持高速增长,吸引了 24 967 名订阅者。
根据 04 六月, 2026 的最新数据,频道保持稳定运转。过去 30 天订阅人数变化为 -145,过去 24 小时变化为 -13,整体触达仍然可观。
- 认证状态: 未认证
- 互动率 (ER): 平均受众互动率为 6.29%。内容发布后 24 小时内通常能获得 3.00% 的反应,占订阅者总量。
- 帖子覆盖: 每篇帖子平均可获得 1 570 次浏览,首日通常累积 750 次浏览。
- 互动与反馈: 受众积极参与,单帖平均反应数为 8。
- 主题关注点: 内容集中在 github, api, собеседование, git, docker 等核心主题上。
📝 描述与内容策略
作者将该频道定位为表达主观观点的平台:
“Вопросы с собеседований по Python
@workakkk - админ
@machinelearning_interview - вопросы с собесдований по Ml
@pro_python_code - Python
@data_analysis_ml - анализ данных на Python
@itchannels_telegram - 🔥 главное в ит
РКН: clck.ru/3FmrFd”
凭借高频更新(最新数据采集于 05 六月, 2026),频道始终保持新鲜度与高覆盖。分析显示受众积极互动,使其成为 技术与应用 类别中的关键影响点。
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() аккуратно захватывает все «совместные» вторые места.
现已上线!2025 年 Telegram 研究 — 年度关键洞察 
