【问题标题】:Skipping yield in python在python中跳过产量
【发布时间】:2014-06-16 08:53:39
【问题描述】:
我正在写一个generator,它接受一个iterable 和一个整数n。例如,如果我调用我的生成器:
generator('abcdefg',2)
那么它应该产生a,d,g跳过2个字母。
当我调用 iter(iterable) 然后使用 yield next 时,yield 会自动跳过 1 个字母。我如何告诉 python 跳过让步以便我可以跳过 n 字母?
【问题讨论】:
标签:
python
python-3.x
iterator
generator
yield
【解决方案1】:
您的生成器实际上是带有 step 参数的 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'ing,然后从可迭代中消耗间隙大小...
def generator(iterable, skip):
it = iter(iterable)
while True:
yield next(it)
for _ in range(skip):
next(it)
【解决方案2】:
这可能是你想要的
def generator(string, skip):
for i,c in enumerate(string):
if i % (skip+1)==0:
yield c
这实际上并没有“跳过” yield 语句,即每个 yield 都被执行。然而,yield 只在字符串字符的固定迭代间隔被调用。
【解决方案3】:
使用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
您可以轻松地将所需的任何其他行为添加到此类。
【解决方案4】:
您只需使用 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