我正在撰写generator
,其中包含iterable
和整数n
。例如,如果我打电话给我的发电机:
generator('abcdefg',2)
然后它应该会产生a
,d
,g
跳过2个字母。
当我致电iter(iterable)
然后使用yield next
时,yield
会自动跳过1个字母。我如何告诉python跳过让步让我跳过n
个字母?
答案 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