Встроенные фикстуры — хороший инструмент, чтобы не создавать свои велосипеды и эффективно использовать мощь фреймворка, которую хотели передать авторы. Фикстуры помогают в разных случаях: при работе с выводом ошибок, логировании, создании отчетов и так далее. В статье разберем основные встроенные фикстуры и их применение в 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 метода протокола дескрипторов:
Если применяется только метод
Покажем использование дескрипторов на вышеупомянутом примере.
Пример – IDE
---
# Создаем класс с протоколами дескриптора
# Инициализируем свойства с учетом требуемых проверок
# Тесты
Результат выполнения
---
ValueError: Нужно предоставить строку
ValueError: Минимум две буквы в атрибуте требуется
@python_job_interview
Очень часто переменные, инициализируемые в классе, являются однотипными. Например, есть класс 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
Сложность задачи: Средняя
Условие задачи:
Дан массив интервалов времени проведения совещаний, 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
Условие: Имеется 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
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
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
Множество проектов, e-mail рассыльщик, парсеры, собственный Paint и многое другое.
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Составили подборку из 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
▪Видео
▪Код из видео
▪Часть 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
Почитать:
— 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
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
Задача на сложение матриц
Уровень: новичок
Напишите функцию (без использования
// returns:
[ [3, 4, 4],
[6, 4, 4],
[2, 2, 4] ]
#junior #numpy
Пишите свое решение в комментариях👇
@python_job_interview
Уровень: новичок
Напишите функцию (без использования
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
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
Media is too big
VIEW IN TELEGRAM
📹 Устраиваемся на работу. Решаем тестовое задание на позицию Python Junior.
▪Видео
▪Задание
▪ Код из видео
▪Тест
▪ Список реальных тестовых заданий с собеседований.
@python_job_interview
▪Видео
▪Задание
▪ Код из видео
▪Тест
▪ Список реальных тестовых заданий с собеседований.
@python_job_interview