2016-04-28 30 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