在Python中跳过yield
我正在写一个 generator
(生成器),它需要一个 iterable
(可迭代对象)和一个整数 n
。比如说,如果我这样调用我的生成器:
generator('abcdefg',2)
那么它应该返回 a
、d
、g
,每次跳过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)