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

Ich defning eine Funktion skip_yield genannt, die einen Wert aus der iterable erzeugt aber dann springt er dann die Anzahl der Werte angegeben, wenn das Funktionsargument auf dem soeben erzeugten Wert genannt wird. Es benötigt 2 Parameter: skip ist eine kleine Funktion. Allerdings, wenn ich versuchen, dies zu tun: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))])) 

es gibt mir:

abbabcabbcaccabb 

aber es sollte geben Sie mir:

abxccab 

Jede Idee?

+1

Was ist der Punkt eine Schleife mit leeren Körper ('pass') der mit hier? – GingerPlusPlus

+0

Können Sie die yield_and_skip-Funktion teilen? – pmaniyan

+0

Bitte entschuldigen Sie nicht Ihre Fragen. – vaultah

Antwort

3

Zunächst einmal ist pass nicht zu überspringen und aktualisieren alles zu iterable. Wenn Sie den Iterator weiterleiten müssen, rufen Sie die next-Funktion für das Iteratorobjekt skip(i) (entweder direkt oder indirekt) auf.

Auch next Anruf kann StopIteration aufrufen und damit die Schleife beenden. yield i vor dem Fortschreiten des Iterators oder bieten das zweite Argument, next schlucken die Ausnahme zu machen.

Ihr Code aussehen würde

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

"Ausbeute ich vor dem Fortschreiten des Iterators" ist nicht notwendig und 'next (it)' sollte 'next (it, None)' sein –

2

Sie einen Zähler für die Anzahl der Elemente definieren könnten es dementsprechend tun

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 

Der Ausgang der Probenleitung ist

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