Python:使用`yield from`

时间:2018-04-04 02:43:49

标签: python yield

在以下代码中,我遇到了RecursionError: maximum recursion depth exceeded

def unpack(given):
    for i in given:
        if hasattr(i, '__iter__'):
            yield from unpack(i)
        else:
            yield i

some_list = ['a', ['b', 'c'], 'd']

unpacked = list(unpack(some_list))

如果我使用some_list = [1, [2, [3]]],这样可以正常工作,但是当我使用字符串进行尝试时则不行。

我怀疑我在python中缺乏知识。任何指导意见。

1 个答案:

答案 0 :(得分:6)

字符串是无限可迭代的。即使是单字符字符串也是可迭代的。

因此,除非为字符串添加特殊处理,否则总是会出现堆栈溢出:

def flatten(x):
    try:
        it = iter(x)
    except TypeError:
        yield x
        return
    if isinstance(x, str):
        yield x
        return
    for elem in it:
        yield from flatten(elem)

注意:使用hasattr(i, '__iter__')不足以检查i是否可迭代,因为还有其他方法可以满足迭代器协议。确定对象是否可迭代的only可靠方法是调用iter(obj)