Вопрос №55209 от пользователя Denys Bondarenko в испытании «Перемежовка последовательности»
Не понимаю до конца этого устройства, помогите пожалуйста разобратся. Во время прохождения курса решал не всегда через итераторы и генераторы, некоторые решения учителя выглядели как-то наизнанку. Выглядит круто, но не очень понятно. Думал проверять если idx % 2 == 1 добавлять разделитель, иначе елемент из последовательности, но реализовать не получается. Если можно, наведите на мысль.
Denis Bondarenko, по вашей ссылке вы генерируете последовательность пар из значений от источника и разделителей. Нужно же возвращать "плоскую" последовательность, в которой значения из источника и разделители чередуются, но находятся на одном, верхнем уровне.
Можете попробовать получить из вашей последовательности пар плоскую последовательность отдельным comprehension. Между прочим, среди примеров к теории был пример кода, который делал нечто подобное!
Aleksei Pirogov, "плоская" последовательность возвращается. Первую функцию тестов решение проходит (test_intersperse
), но со второй (test_intersperse_laziness
) проблема - как будто зацикливается. Честно говоря, мне не понятно как моя функция сможет пройтись по функции indicator
, которая в тесте передается первым аргументом
# Эта функция-генератор помнит, сколько было итераций когда либо
def indicator():
while True:
indicator.count += 1
yield "click"
indicator.count = 0
clicks = intersperse(indicator(), ",")
ведь фунцкия не iterable. По идее ее бы следовало вызывать?
Вторая моя потуга (закомментированая функция) проходит второй тест :) но это я так только, тыкаю - пробую что к чему, намудрил и без толку :/
"плоская" последовательность возвращается.
Слишком сложно сделали. Распаковка аргументов - не такая уж дешёвая операция.
Кроме того, аргументы распаковываются энергично, то есть всегда и до конца. Поэтому ваша функция и не проходит тест, который проверяет ленивость потребления данных: итератор-то вы возвращаете ленивый, но источник потребляете сразу и до конца! Более того, ваша функция потребляет входной итератор до того, как возвращаемый вами итератор будет использован. А значит на бесконечном входном потоке программа зациклится прямо на вызове вашей функции. Следом интерпретатор упадёт из-за перерасхода памяти - перерасхода на бесконечное количество кортежей, которые вы распаковываете в аргументы. И никакой ленивый chain тут не поможет - до его вызова исполнение даже не дойдёт!
ведь фунцкия не iterable. По идее ее бы следовало вызывать?
indicator
- генераторная функция. Результат её вызова является iterable. И функция вызывается в clicks = intersperse(indicator(), ",")
.
Используйте Хекслет по максимуму!
- Задавайте вопросы по уроку
- Проверяйте знания в квизах
- Проходите практику прямо в браузере
- Отслеживайте свой прогресс
Зарегистрируйтесь или войдите в свой аккаунт
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.







