【问题标题】:python iterator skip_funcpython迭代器skip_func
【发布时间】:2016-04-28 16:41:10
【问题描述】:
def yield_and_skip(iterable,skip):
    for i in iterable:
        print(skip(i))
        for x in range(skip(i)):
            pass
        yield i

我正在定义一个名为 skip_yield 的函数,它从可迭代对象中生成一个值,但随后它会跳过在刚刚生成的值上调用函数参数时指定的值的数量。它需要 2 个参数:skip 是一个小函数。 但是,如果我尝试这样做:

print(''.join([v for v in yield_and_skip('abbabxcabbcaccabb',lambda x : {'a':1,'b':2,'c':3}.get(x,0))]))

它给了我:

abbabcabbcaccabb

但它应该给我:

abxccab

有什么想法吗?

【问题讨论】:

  • 这里有一个空主体 (pass) 的循环有什么意义?
  • 能分享一下yield_and_skip函数吗?
  • 请不要污蔑您的问题。

标签: python iterator generator skip


【解决方案1】:

首先,pass 不会对 iterable 做任何事情。如果您需要推进迭代器,请在迭代器对象skip(i) 上调用next 函数次数(直接或间接)。

另外,next 调用可能引发StopIteration,从而终止循环。 yield i 在推进迭代器之前提供第二个参数,以使 next 吞下异常。

你的代码看起来像

def yield_and_skip(iterable, skip):
    it = iter(iterable)
    for i in it:
        for _ in range(skip(i)):
            next(it, None)
        yield i

【讨论】:

  • “在推进迭代器之前产生 i”不是必需的,next(it) 应该是 next(it, None)
【解决方案2】:

您可以为要跳过的元素数量定义一个计数器并相应地更新它

def yield_and_skip(iterable,skip):
    num_to_skip = 0
    for i in iterable:
        if num_to_skip == 0:
            num_to_skip = skip(i)
            yield i
        else:
            num_to_skip -= 1

你的采样线的输出是

>>> print(''.join([v for v in yield_and_skip('abbabxcabbcaccabb',lambda x : {'a':1,'b':2,'c':3}.get(x,0))]))
abxccab

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-01
    • 2013-06-20
    • 2021-10-05
    • 2014-07-19
    • 2012-02-17
    • 1970-01-01
    相关资源
    最近更新 更多