在python中跳过yield

时间:2014-04-30 06:38:10

标签: python python-3.x iterator generator yield

我正在撰写generator,其中包含iterable和整数n。例如,如果我打电话给我的发电机:

generator('abcdefg',2)

然后它应该会产生adg跳过2个字母。

当我致电iter(iterable)然后使用yield next时,yield会自动跳过1个字母。我如何告诉python跳过让步让我跳过n个字母?

4 个答案:

答案 0 :(得分:2)

您的生成器实际上是islice,带有step参数,因此您可以将原始iterable包裹起来:

from itertools import islice

def generator(iterable, skip):
    return islice(iterable, None, None, skip+1)

for item in generator('abcdefg', 2):
    print(item)
# a
# d
# g

如果你想手工编写,那么也许一种简单的理解方法是先从迭代中yield,然后从迭代中消耗间隙大小......

def generator(iterable, skip):
    it = iter(iterable)
    while True:
        yield next(it)
        for _ in range(skip):
            next(it)

答案 1 :(得分:2)

这可能就是你想要的

def generator(string, skip):
    for i,c in enumerate(string):
        if i % (skip+1)==0:
            yield c

这实际上并不“跳过”yield语句,即每个yield都会被执行。但是,仅在字符串字符的迭代的固定间隔调用yield。

答案 2 :(得分:0)

使用custom iterator的基本框架:

class skipper():
    def __init__(self, iterable, skip_count):
        self.it = iter(iterable)
        self.skip = skip_count
    def __iter__(self):
        return self
    def __next__(self):
        value = next(self.it)
        for _ in range(self.skip):
            next(self.it, None)
        return value

您可以轻松添加此课程所需的任何其他行为。

答案 3 :(得分:0)

您只需使用 next()功能

即可
def make_generator():
    for x in range(1, 10):
        yield x


my_generator = make_generator()


def generator(temp_generator, num):  # generator('abcdefg',2)
    for x in range(num):
        next(temp_generator)
    for y in temp_generator:
        print(y)  # Skipped Value of generator
generator(my_generator, 2)

输出:3 4 五 6 7 8 9