Вопрос №55209 от пользователя Denys Bondarenko в испытании «Перемежовка последовательности»

Denys Bondarenko

Не понимаю до конца этого устройства, помогите пожалуйста разобратся. Во время прохождения курса решал не всегда через итераторы и генераторы, некоторые решения учителя выглядели как-то наизнанку. Выглядит круто, но не очень понятно. Думал проверять если idx % 2 == 1 добавлять разделитель, иначе елемент из последовательности, но реализовать не получается. Если можно, наведите на мысль.

3 0

Aleksei Pirogov

Denis Bondarenko, по вашей ссылке вы генерируете последовательность пар из значений от источника и разделителей. Нужно же возвращать "плоскую" последовательность, в которой значения из источника и разделители чередуются, но находятся на одном, верхнем уровне.

Можете попробовать получить из вашей последовательности пар плоскую последовательность отдельным comprehension. Между прочим, среди примеров к теории был пример кода, который делал нечто подобное!

0

Denys Bondarenko

Aleksei Pirogov, "плоская" последовательность возвращается. Первую функцию тестов решение проходит (test_intersperse), но со второй (test_intersperse_laziness) проблема - как будто зацикливается. Честно говоря, мне не понятно как моя функция сможет пройтись по функции indicator , которая в тесте передается первым аргументом

# Эта функция-генератор помнит, сколько было итераций когда либо
    def indicator():
        while True:
            indicator.count += 1
            yield "click"
    indicator.count = 0

    clicks = intersperse(indicator(), ",")

ведь фунцкия не iterable. По идее ее бы следовало вызывать?

Вторая моя потуга (закомментированая функция) проходит второй тест :) но это я так только, тыкаю - пробую что к чему, намудрил и без толку :/

0

Aleksei Pirogov

"плоская" последовательность возвращается.

Слишком сложно сделали. Распаковка аргументов - не такая уж дешёвая операция.

Кроме того, аргументы распаковываются энергично, то есть всегда и до конца. Поэтому ваша функция и не проходит тест, который проверяет ленивость потребления данных: итератор-то вы возвращаете ленивый, но источник потребляете сразу и до конца! Более того, ваша функция потребляет входной итератор до того, как возвращаемый вами итератор будет использован. А значит на бесконечном входном потоке программа зациклится прямо на вызове вашей функции. Следом интерпретатор упадёт из-за перерасхода памяти - перерасхода на бесконечное количество кортежей, которые вы распаковываете в аргументы. И никакой ленивый chain тут не поможет - до его вызова исполнение даже не дойдёт!

ведь фунцкия не iterable. По идее ее бы следовало вызывать?

indicator - генераторная функция. Результат её вызова является iterable. И функция вызывается в clicks = intersperse(indicator(), ",").

1

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Фронтенд-разработчик
Профессия
Разработка фронтенд-компонентов веб-приложений
25 мая 10 месяцев
Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
25 мая 10 месяцев
Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
25 мая 10 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
25 мая 10 месяцев
Иконка программы Fullstack-разработчик
Профессия
Новый
Разработка фронтенд и бэкенд компонентов веб-приложений
25 мая 16 месяцев
Иконка программы Верстальщик
Профессия
Вёрстка с использованием последних стандартов CSS
в любое время 5 месяцев
Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
25 мая 10 месяцев
Иконка программы Разработчик на Ruby on Rails
Профессия
Создает веб-приложения со скоростью света
25 мая 5 месяцев