Генераторы и оператор 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 получает все перестановки чисел
  • Повторные однократные или множественные тесты с носом
  • Короткий алфавитно-цифровой хэш-код Python с минимальными коллизиями
  • Python Fabric - нет хостов. Укажите (единственную) строку хоста для подключения:
  • Каковы преимущества и недостатки использования упаковки Python * .egg через простой каталог с setup.py?
  • Передача опций носу в тестовом скрипте Python
  • Переменная в маршрутизации статических файлов Flask
  • Что делает объект Python Ellipsis?
  • Python - лучший язык программирования в мире.