在Python中跳过yield

2 投票
4 回答
5681 浏览
提问于 2025-04-18 04:51

我正在写一个 generator(生成器),它需要一个 iterable(可迭代对象)和一个整数 n。比如说,如果我这样调用我的生成器:

generator('abcdefg',2)

那么它应该返回 adg,每次跳过2个字母。

当我调用 iter(iterable) 然后使用 yield next 时,yield 默认会跳过1个字母。我该如何告诉 Python 跳过 n 个字母呢?

4 个回答

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
5
6
7
8
9

0

这是一个使用自定义迭代器的基本框架:

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

你可以很简单地在这个类里添加你需要的其他功能。

2

这可能正是你想要的内容

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

这里其实并不是“跳过”yield语句,实际上每个yield都会被执行。不过,yield只会在遍历字符串字符的固定间隔时被调用。

3

你的生成器实际上就是带有步长参数的 islice,所以你可以像下面这样包装原始的 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)

撰写回答