Генераторы и оператор yield

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

import collections def it(l): for i in l: if isinstance(i, collections.Iterable): it(i) else: print i it([ [1, 2, 3], [[4, [5, 6]], 7], 8, [9, 10]]) 

Это дает следующий результат (как и ожидалось): 1 2 3 4 5 6 7 8 9 10

Не предполагается, что я хочу сделать это с помощью генератора. Почему следующие работы не работают, как я ожидал бы (по существу, заменяя оператор print продуктом):

 import collections def it(l): for i in l: if isinstance(i, collections.Iterable): it(i) else: yield i 

Благодаря!

One Solution collect form web for “Генераторы и оператор yield”

потому что, когда вы рекурсируете, вы возвращаете новый генератор. Но этот генератор никогда ничего не дает, потому что вы не перебираете его. Вместо этого сделайте что-нибудь вроде:

 def it(l): for i in l: if isinstance(i, collections.Iterable): for item in it(i): yield item else: yield i 

Или, в python3.3, вы можете использовать yield from ключевого слова.

  • Как изменить объект трассировки Python при создании исключения?
  • конвертировать цветовые коды rgba 255,255,255,255 в цветовые коды kivy в 1,1,1,1
  • Создание динамических URL-адресов в Flask с помощью url_for ()
  • Нет модуля с именем flask.ext.restful
  • удаление акцента и специальных символов
  • New to flask и Flask-Login - ImportError: нет имени модуля с именем
  • Диапазон с шагом типа float
  • Инъекционная инфраструктура Python
  • Ошибка «Неизвестная задача» в цвете сельдерея при публикации новой задачи
  • Когда использовать возврат (что-то вывести)?
  • Пользователь flask-login установлен на анонимный после входа в систему
  • Python - лучший язык программирования в мире.