2016-04-28 57 views
0
def yield_and_skip(iterable,skip): 
    for i in iterable: 
     print(skip(i)) 
     for x in range(skip(i)): 
      pass 
     yield i 

我定义了一个称为skip_yield的函数,它从iterable产生一个值,然后跳过刚刚生成的值上调用函数参数时指定的值的数量。它需要2个参数:skip是一个小函数。 但是,如果我尝试这样做:python iterator skip_func

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

它给了我:

abbabcabbcaccabb 

,但它应该给我:

abxccab 

任何想法?

+1

什么是具有空体('pass')的循环在这里的呢? – GingerPlusPlus

+0

你能分享yield_and_skip函数吗? – pmaniyan

+0

请不要污蔑你的问题。 – vaultah

回答

3

首先,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 
+0

“在推进迭代器之前产生我”是不必要的,“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