python 迭代器 skip_func

python iterator skip_func

def yield_and_skip(iterable,skip):
    for i in iterable:
        print(skip(i))
        for x in range(skip(i)):
            pass
        yield i

我正在定义一个名为 skip_yield 的函数,它从可迭代对象中生成一个值,然后在对刚刚生成的值调用函数参数时跳过指定的值数。它需要 2 个参数:skip 是一个小函数。 但是,如果我尝试这样做:

print(''.join([v for v in yield_and_skip('abbabxcabbcaccabb',lambda x : {'a':1,'b':2,'c':3}.get(x,0))]))

它给了我:

abbabcabbcaccabb

但它应该给我:

abxccab

有什么想法吗?

您可以为要跳过的元素数量定义一个计数器并相应地更新它

def yield_and_skip(iterable,skip):
    num_to_skip = 0
    for i in iterable:
        if num_to_skip == 0:
            num_to_skip = skip(i)
            yield i
        else:
            num_to_skip -= 1

你的样本行的输出是

>>> print(''.join([v for v in yield_and_skip('abbabxcabbcaccabb',lambda x : {'a':1,'b':2,'c':3}.get(x,0))]))
abxccab

首先,pass 不会对 iterable 做任何事情。如果需要推进迭代器,请在迭代器对象上调用 next 函数 skip(i) 次(直接或间接)。

此外,next 调用可能引发 StopIteration,从而终止循环。 yield i 在推进迭代器之前 提供第二个参数,使 next 吞下异常。

你的代码看起来像

def yield_and_skip(iterable, skip):
    it = iter(iterable)
    for i in it:
        for _ in range(skip(i)):
            next(it, None)
        yield i