Python вопросы с собеседований
24.7K subscribers
508 photos
16 videos
17 files
404 links
Вопросы с собеседований по Python

@workakkk - админ

@machinelearning_interview - вопросы с собесдований по Ml

@pro_python_code - Python

@data_analysis_ml - анализ данных на Python

@itchannels_telegram - 🔥 главное в ит

РКН: clck.ru/3FmrFd
加入频道
🖥 Что такое фикстуры в Pytest? Какие фикстуры вы знаете ?

Встроенные фикстуры — хороший инструмент, чтобы не создавать свои велосипеды и эффективно использовать мощь фреймворка, которую хотели передать авторы. Фикстуры помогают в разных случаях: при работе с выводом ошибок, логировании, создании отчетов и так далее. В статье разберем основные встроенные фикстуры и их применение в Pytest.

Потоки ввода и вывода ошибок

Когда нужно протестировать системные сообщения или перехватить ошибку, помогают фикстуры, которые умеют работать с потоками вывода.

Capfd — фикстура для работы с потоками стандартного ввода и вывода ошибок на уровне операционной системы. Она позволяет перехватывать не только то, что происходит в python-коде, но и то, что происходит в операционной системе.

Захваченный вывод доступен через вызов метода capfd.readouterr(), который возвращает named tuple с stderr и stdout в виде строк.

def test_system_echo(capfd):
os.system('echo "hello"')
captured = capfd.readouterr()
assert captured.out == "hello\n"

Capfdbinary — тоже работает со стандартным выводом и ошибками, но возвращает именованный кортеж, где сообщения из stderr и stdout представлены в виде байтовых строк.

def test_system_echo(capfdbinary):
os.system('echo "hello"')
captured = capfdbinary.readouterr()
assert captured.out == b"hello\n"

Capsys — фикстура для работы с потоками для стандартного вывода и вывода ошибок на уровне python-кода. Захватывает sys.stdout и sys.stderr из кода и возвращает в виде строк.

def test_output(capsys):
print("hello")
captured = capsys.readouterr()
assert captured.out == "hello\n"

Capsysbinary — подходит для работы с потоками стандартного вывода на уровне python-кода. Захватывает sys.stdout и sys.stderr из кода и возвращает в виде байтовых строк.

def test_output(capsysbinary):
print("hello")
captured = capsysbinary.readouterr()
assert captured.out == b"hello\n"
Логирование
Логи — отличный инструмент для дебага, когда дело касается стабильной работы приложения. По ним можно понять, когда и из-за чего в работе системы возник сбой. Pytest имеет несколько фикстур для управления логами из тестов.

Caplog — позволяет работать с логами в python-коде. Дает возможность изменять уровень логирования, перехватывать сообщения, модифицировать их и многое другое.

# Задать уровень логирования
def test_foo(caplog):
caplog.set_level(logging.INFO)
for message in caplog.messages:
assert "for debug level" not in message
# Пример проверки уровня логирования и текста в сообщении лога
def test_baz(caplog):
func_under_test()
for record in caplog.records:
assert record.levelname != "CRITICAL"
assert "wally" not in caplog.text

Recwarn — возвращает экземпляр класса WarningsRecorder, где будут храниться все warnings, которые были вызваны с помощью warnings.warn в тестовых функциях.

import warnings

def test_check_warnings(recwarn):
warnings.warn("hello", UserWarning)
assert len(recwarn) == 1
warn = recwarn.pop(UserWarning)
assert issubclass(warn.category, UserWarning)
assert str(warn.message) == "hello"
assert warn.filename

Отчеты и документация
Pytest из коробки позволяет генерировать отчеты в формате JUnit XML, поэтому во фреймворке имеется ряд специальных фикстур для управления формированием отчета.

Doctest_namespace — фикстура для работы со встроенной библиотекой doctest. Библиотека помогает сравнить поведение функции с тем, что описано в docstring как ее ожидаемое поведение.

# Объявляем фикстуру в conftest.py
import numpy

@pytest.fixture(autouse=True)
def add_np(doctest_namespace):
doctest_namespace["np"] = numpy # Добавляет в namespace np ссылку на объект numpy


# Вызываем namespace в numpy.py
def arange():
"""
>>> a = np.arange(10)
>>> len(a)
10
"""
pass

Напишите фикстуры, которые вы используете в комментариях 👇

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое дескрипторы данных?

Очень часто переменные, инициализируемые в классе, являются однотипными. Например, есть класс Employee (сотрудник), принимающий параметры: имя, фамилия, отчество, должность. Все они являются строками. Следовательно, прежде чем создать экземпляр класса, нужно проверить, что пользователь ввел строки. А для этого потребуются сеттеры, проверяющие тип вводимых параметров. В итоге, мы 4 раза повторим код проверки. Нарушается принцип DRY (don't repeat yourself).

Для таких ситуаций удобно использовать дескрипторы (они, к слову, широко применяются во фреймворке Django при создании моделей).

Дескриптор - такой атрибут объекта, поведение которого переопределяется специальными методами. Проще говоря, доступ к какому-то свойству экземпляра можно переопределить с учетом дополнительных проверок. Если делать эти верификации без дескрипторов, то один и тот же код начнет повторяться.

Существует 4 метода протокола дескрипторов:
get__() - получить значение свойства;
set__() - задать значение;
delete__() - удалить атрибут;
set_name__() - присвоить имя свойству (появился в Питоне версии 3.6).

Если применяется только метод __get__(), то мы имеем дело с дескриптором без данных, а если есть еще и __set__(), то речь будет идти о дескрипторе данных.

Покажем использование дескрипторов на вышеупомянутом примере.

Пример – IDE
---
# Создаем класс с протоколами дескриптора
class StringChecker:

# Получаем доступ к свойству
def __get__(self, instance, owner):
if instance is None:
return self
return instance.__dict__[self.name]

# Меняем свойство
def __set__(self, instance, str_value):
if not isinstance(str_value, str):
raise ValueError('Нужно предоставить строку')
elif len(str_value) < 2:
raise ValueError('Необходимо минимум 2 буквы')
instance.__dict__[self.name] = str_value

# Задаем имя свойства
def __set_name__(self, owner, name):
self.name = name


class Employee:


# Определяем атрибуты (их может быть любое количество)
name = StringChecker()
surname = StringChecker()
patronymic = StringChecker()
post = StringChecker()

# Инициализируем свойства с учетом требуемых проверок
def __init__(self, name, surname, patronymic, post):
self.name = name
self.surname = surname
self.patronymic = patronymic
self.post = post



# Тесты
director = Employee('Иван', 'Николаевич', 'Прогин', 'Директор')
print(director.__dict__)
director.name = 1
director.name = 'A'



Результат выполнения
---
{'name': 'Иван', 'surname': 'Николаевич', 'patronymic': 'Прогин', 'post': 'Директор'}
ValueError: Нужно предоставить строку
ValueError: Минимум две буквы в атрибуте требуется

@python_job_interview
🖥 Задача: Конференц-залы II.

Сложность задачи: Средняя

Условие задачи:
Дан массив интервалов времени проведения совещаний, intervals, где intervals[i] = [start(i), end(i)]. Найдите минимальное требуемое количество конференц-залов.

Пример:
Ввод: intervals = [[0,30],[5,10],[15,20]]
Вывод: 2

Ввод: intervals = [[7,10],[2,4]]
Вывод: 1

📌Решение

Пишите свое решение в комментариях👇

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
💡 Задача: Самые дешевые авиабилеты в пределах K остановок

Условие: Имеется n городов, соединенных некоторым количеством рейсов. Вам дан массив flights, где flights[i] = [fromi, toi, pricei] означает, что существует рейс из города fromi в город toi со стоимостью pricei.

Также даны три целых числа src, dst и k, возвращаем самую дешевую цену из src в dst с не более чем k остановками. Если такого маршрута не существует, возвращается -1.

Пример:

Ввод:
n = 4, flights = [[0,1,100],[1,2,100],[2,0,100],[1,3,600],[2,3,200]], src = 0, dst = 3, k = 1
Вывод: 700

Ввод: n = 3, flights = [[0,1,100],[1,2,100],[0,2,500]], src = 0, dst = 2, k = 1
Вывод: 200

📌Решение

Пишите свое решение в комментариях👇

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
💡 Задача: Лучшая команда, в которой нет конфликтов

Вы являетесь менеджером баскетбольной команды. Для участия в предстоящем турнире Вы хотите выбрать команду, набравшую наибольшее количество очков. Показатель команды складывается из суммы показателей всех игроков команды.

Однако в баскетбольной команде не должно быть конфликтов. Конфликт возникает, если младший игрок набрал строго больше очков, чем старший. Конфликт не возникает между игроками одного возраста.

Задав два списка, scores и ages, в которых каждый scores[i] и ages[i] представляет собой счет и возраст i-го игрока соответственно, верните наибольший общий балл среди всех возможных баскетбольных команд.

Пример:

Ввод:
scores = [1,3,5,10,15], ages = [1,2,3,4,5]
Вывод: 34

Ввод: scores = [4,5,6,5], ages = [2,1,2,1]
Вывод: 16

Решение

Пишите свое решение в комментариях👇

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Уроки Парсинга на Python Сравниваем Scrappy и bs4

🎞 Видео

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Умножение строк

Сложность: Средняя

Условие задачи:
Даны два неотрицательных целых числа num1 и num2, представленные в виде строк, вернуть произведение num1 и num2, также представленное в виде строки.

Примечание. Вы не должны использовать какую-либо встроенную библиотеку BigInteger или напрямую преобразовывать входные данные в целое число.

Пример:
Ввод: num1 = "2", num2 = "3"
Вывод: "6"

Ввод: num1 = "123", num2 = "456"
Вывод: "56088"

📌Решение

Пишите свое решение в комментариях👇

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Продвинутый парсинг на Python со сменой прокси

🎞 Video

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
52 Amazing Python Projects For Developers.pdf
710.2 KB
🔥 Более 50 крутых проектов на Python для практики с исходным кодом и подробными объяснениями, как мы любим.

Множество проектов, e-mail рассыльщик, парсеры, собственный Paint и многое другое.

@python_job_interview
🖥Многопоточный парсер на Python. ООП подход

🎞 Video

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
📧Python Атоматизация отправки email с selenium

Видео

@python_job_interview
🧠 5 задач с собеседований Amazon для Python-разработчиков

Составили подборку из 5 задач с собеседований в Amazon, IBM и Apple для Python-разработчиков для джунов и миддлов.

Они относительно несложные и подойдут для junior и middle программистов, а встретить задачки можно в том числе на собеседованиях в Apple, Samsung, Oracle и IBM.


1. Изменить порядок слов
Вам дана строка 's' с некоторым количеством слов N. Нужно сделать так, чтобы исходный порядок слов в строке изменился на обратный.

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

Время выполнения скрипта не должно превышать 1 секунду.

Решение:
Если строка равна нулю или пуста, в выводе должна появиться пустая строка. То же самое стоит сделать, если в исходной строке находится один пробел.

Инициализируйте String ans для хранения перевернутой строки.

Инициализируйте указатель на конец исходной строки и запускайте цикл while, пока указатель не достигнет начала строки.

Если в строке встречается несколько пробелов, уменьшите указатель.

Добавьте пробелы в строку ans. После этого запустите вложенный цикл while, чтобы извлечь текущее слово из ans в вывод.

После прохождения всей строки верните ответ.

'''
Time Complexity = O(N)
Space Complexity = O(N)

Where N is the length of the string.
'''

def reverseString(str: str) -> str:

# if the string is " " then return "".
if(str == "" or str == " "):
return ""
ans = ''

start = len(str) - 1

while(start >= 0):

# Skip multiple spaces.
if(str[start] == ' '):
start-=1
else:

# Add space between words.
if(len(ans) > 0):
ans += (' ')

j = start

while(j >= 0 and str[j] != ' '):
j-=1

# add current word to ans.
ans += (str[j+1: j+1+start-j])
start = j

return ans

2. Сумма всех чисел до N
Вам дано число N. Напишите скрипт, который считал бы сумму всех четных чисел в промежутке от 1 до N, включая N. К примеру, если N равняется 6, то вывод должен быть равен 2+4+6, то есть 12.

Решение:
Нам нужно вывести формулу для вычисления суммы четных чисел до числа 'N'.

Пусть задано число N. Тогда общее количество четных чисел от 1 до N будет равно N/2. Например, для 4 список четных чисел будет равен 2 и 4, а их количество равно 2.

Последовательность четных чисел до N образует арифметическую прогрессию с общей разницей D между числами в 2, первым элементом A = 2, и количеством элементов N, равным N/2, как доказано выше.

Сумма арифметической прогрессии равна (N/2)*(A+L), где N — количество элементов, а L — последнее число, которое также можно записать как A + (N - 1)D.

Таким образом, сумма равна (N/2*2) * (2 + 2 + (N/2 - 1)*2) = (N/2) * (1 + 1 + N/2 - 1) = (N/2) * (N/2 + 1).

'''
Time Complexity : O(1)
Space Complexity : O(1)
'''

def evenSumTillN(n):

# Calculate the sum.
sum = (n // 2) * (n // 2 + 1)

return sum


📌Остальные

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Полный курс по библиотеке Numpy. Урок 5: Продвинутые функции.

Видео
Код из видео
Часть 1
Часть 2
Часть 3
Часть4

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Дайджест полезных материалов из мира Python за неделю

Почитать:
Django или Fast API: выбираем Python-фреймворк для веб-разработки
Что нового в Pandas 2.1
Готовые скрипты Python
Интеграция Telegram ботов в Django приложениях
6 развлекательных проектов на Python: от шаверма-бота до игры в слова
9 лучших консольных файловых менеджеров Linux
Управление сервоприводами, часть 2. Управляем сервоприводами с помощью серво-контроллера через USB любых компьютеров
Клонирование голоса, замена лица по фото, удаления объектов в видео и все в одном open-source проекте Wunjo AI
Эластичный DAG или «гнём, где не гнулось»
Как понять, что клиента пора реактивировать?
Анализ данных с использованием библиотеки Dask
Взгляд на телеграм-ботов изнутри
Учим ИИ чатбота слушать и говорить
Создание интерактивных аналитических панелей с помощью Python Streamlit
Deploying Apps on Render
Mastering ZIP File Handling in Python: Reading and Creating Zip Archives
The Minion Game - HackerRank Solution Python
Iterables and Iterators - HackerRank Solution Python
Regex Substitution - HackerRank Solution Python
How to Solve the "No Idea!" Challenge in Python
🌐 UN Goals : Education & Gender Equity ⚖️
Starting my Journey in Open Source
Created a toggle_state_button with PyQt5
Accelerating Releases with Pulumi: My Proxy Project Journey

Посмотреть:
🌐 HTMX заменит Frontend?! WTF? ( 12:12)
🌐 Полный курс по библиотеке Numpy. Матрицы ( 11:24)
🌐 Уроки Golang с нуля /#26 - Обработка ошибок ( 08:14)
🌐 Python+SQL работа с базами данных. ( 11:10)
🌐 Полный курс по библиотеке Numpy. Полезные функции ( 11:05)
🌐 Полный курс по библиотеке Numpy. Применение Numpy ( 11:52)
🌐 Полный курс по библиотеке Numpy. Создание матриц из файла ( 15:55)
🌐 Python Атоматизация отправки email с selenium ( 04:59)
🌐 Полный курс по библиотеке Numpy. Продвинутые методы работы с матрицами ( 07:28)
🌐 Python анализ данных с Pandas. ( 17:04)
🌐 【作業配信】ろっきーさんの新ビジュアル仕上げていくぅ~!龍角散と共に・・・! ( 01:34:00)
🌐 Задание 8 | ЕГЭ по информатике | ДЕМО-2024 ( 08:55)
🌐 Задание 9 | ЕГЭ по информатике | ДЕМО-2024 ( 09:11)
🌐 Задание 10 | ЕГЭ по информатике | ДЕМО-2024 ( 02:16)
🌐 Задание 11 | ЕГЭ по информатике | ДЕМО-2024 ( 04:18)
🌐 Задача с собеседования на Junior Python разработчика #shorts #python ( 00:48)
🌐 Как узнать процент заряда батареи с помощью Python #shorts ( 00:45)

Хорошего дня!

@python_job_interview
Переменная s - строка. Нужно ее обратить, получив строку задом наперед.
Какой вариант не позволяет это сделать?
Anonymous Quiz
31%
s[::-1]
13%
''.join(reversed(s))
22%
str(reduce(lambda acc, x: x + acc, s))
21%
s.reverse()
13%
Посмотреть результаты
Легкий способ получать свежие обновлении и следить за трендами в разработке на вашем языке. Находите свой стек и подписывайтесь:

Data Science: t.me/data_analysis_ml
Java: t.me/javatg
Базы данных: t.me/sqlhub
Машинное обучение: t.me/ai_machinelearning_big_data
Go: t.me/Golang_google
C/C++/ t.me/cpluspluc
C#: t.me/csharp_ci
Хакинг: t.me/linuxkalii
Мобильная разработка: t.me/mobdevelop
Docker: t.me/+0WdB4uvOwCY0Mjdi
Python: t.me/pythonl
Rust: t.me/rust_code
Javascript: t.me/javascriptv
React: t.me/react_tg
PHP: t.me/phpshka
Android: t.me/android_its
Linux: t.me/+A8jY79rcyKJlYWY6
Big Data: t.me/bigdatai
Devops: t.me/devOPSitsec
Тестирование:https://yangx.top/+F9jPLmMFqq1kNTMy
Собеседования: https://yangx.top/machinelearning_interview

💼 Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: https://yangx.top/addlist/2Ls-snqEeytkMDgy

😆ИТ-Мемы: t.me/memes_prog

🇬🇧Английский: t.me/english_forprogrammers

ИИ: t.me/vistehno

📕Ит-книги бесплатно: https://yangx.top/addlist/BkskQciUW_FhNjEy
Задача на сложение матриц

Уровень: новичок

Напишите функцию (без использования numpy.matrix.sum()), которая складывает две квадратные матрицы и возвращает их сумму. Все элементы матриц — целочисленные значения.

matrixAddition(
[ [1, 2, 3],
[3, 2, 1],
[1, 1, 1] ],
// +
[ [2, 2, 1],
[3, 2, 3],
[1, 1, 3] ] )

// returns:
[ [3, 4, 4],
[6, 4, 4],
[2, 2, 4] ]

#junior #numpy

Пишите свое решение в комментариях👇

@python_job_interview
🖥 Python+SQL часть2 создание таблиц.

Видео
Часть 1

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Количество узлов

Условие: дано дерево (т.е. связный неориентированный граф, не имеющий циклов), состоящее из n узлов с числом от 0 до n - 1 и ровно n - 1 ребер. Корнем дерева является узел 0, и каждый узел дерева имеет метку, которая представляет собой символ нижнего регистра, указанный в строковых метках (т.е. узел с номером i имеет метку labels[i]).

Массив ребер задан на ребрах фермы[i] = [ai, bi], что означает наличие ребра между узлами ai и bi в дереве.

Возвращает массив размера n, где и[i] - количество узлов в поддереве узла земли, которые имеют ту же метку, что и узел i.

Поддерево дерева - это дерево, состоящее из узла в T и всех его дочерних узлов.

Пример:
Ввод:
n = 7, edges = [[0,1],[0,2],[1,4],[1,5],[2,3],[2,6]], labels = "abaedcd"
Вывод: [2,1,1,1,1,1,1]

Объяснение:
Ввод:
n = 4, edges = [[0,1],[1,2],[0,3]], labels = "bbbb"
Вывод: [4,2,1,1]

📌Решение

Пишите свое решение в комментариях👇

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM