3

イテラブルを取る関数を作成したいとします。その iterable には、任意のレベルの他の iterable を含めることができます。これらを順番にたどる関数を作りたいです。たとえば、次のようになります。

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ステートメントをyieldに置き換えます):

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

ありがとう!

4

1 に答える 1

5

再帰すると、新しいジェネレーターが返されるためです-しかし、そのジェネレーターは、反復処理を行わないため、何も生成されません。代わりに、次のようにします。

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

yield fromまたは、python3.3 では、キーワードを使用できます。

于 2013-10-01T22:11:40.420 に答える