Придя на собеседование, вы должны быть готовы к тому, что могут спросить что угодно, связанное с бекенд-стеком.
Например: что такое генераторы? Кандидат должен понимать, что такое генераторы и как они работают в Python, что они используют yield вместо return, и что они позволяют генерировать последовательность значений по запросу.
Но теория — это лишь вершина айсберга, вас могут попросить реализовать простейшую функцию-генератор. Одной их классических задач является реализация функции-генератора случайных числе в заданном диапазоне.
Задача:
Напишите функцию-генератор random_numbers(a, b, k)
, которая будет возвращать последовательность случайных чисел в заданном диапазоне и с заданной длиной.
a (int) —
Нижняя граница диапазона случайных чисел (включительно)
b (int) —
Верхняя граница диапазона случайных чисел (включительно)
k (int) —
Количество случайных чисел, которые генератор должен вернуть за одну итерацию
# usage example
gen = random_numbers(a=5, b=10, k=3)
# first call next()
print(next(gen)) # output 3 random numbers from 5 to 10, for example: [7, 9, 5]
# second call next()
print(next(gen)) # output another 3 random numbers for example: [10, 6, 8]
# and so on
Требования:
1. Реализовать функцию-генератор random_numbers(a, b, k)
2. Использовать модуль random
для генерации случайных чисел
3. Генератор должен возвращать список из k
случайных чисел при каждом вызове next()
.
4. После исчерпания генератора (например, при бесконечном вызове next
), он не должен вызывать ошибку StopIteration
(на практике для собеседования это не критично, но если кандидат сам отметит бесконечность, то это будет плюсом)
Дополнительно: Можно ли сделать данный генератор бесконечным, чтобы он не выбрасывал исключение StopIteration
?
Почему эта задача подходит для собеседования:
Перейдем от слов к реализации:
import random
def random_numbers(*, a: int, b: int, k: int):
while True:
result = []
for _ in range(k):
result.append(random.randint(a, b))
yield result
# Пример использования:
gen = random_numbers(a=5, b=10, k=3)
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))
import random:
— Импортируем модуль random для работы со случайными числами.
def random_numbers(*, a: int, b: int, k: int):
— Определяем функцию-генератор random_numbers, которая принимает три аргумента согласно условию задачи.
while True:
— Создаем бесконечный цикл, чтобы генератор не заканчивался. Это позволяет генерировать последовательности случайных чисел, пока это необходимо. Если это убрать, то генератор будет завершаться.
result = []:
— На каждой итерации цикла создаем пустой список result, в который будем добавлять случайные числа.
for _ in range(k):
— Запускаем цикл k раз для генерации k случайных чисел.
random.randint(a, b):
— Функция random.randint() генерирует случайное целое число в диапазоне от a до b (включительно).
result.append(...):
— Каждое сгенерированное случайное число добавляется в список result.
yield result:
— Ключевое слово yield превращает функцию в генератор. yield result возвращает список result и приостанавливает выполнение генератора, сохраняя его состояние. При следующем вызове next() выполнение продолжится с места, где оно было приостановлено, и сгенерируется следующий список.
Данный генератор является бесконечным благодаря циклу while True
То есть, без него, функция-генератор будет выбрасывать исключение StopIteration