2013-09-04 5 views
6

ich eine Generatorfunktion schreibe, die mich Alpha-Zeichen gibt, wie so,über Werte in einer Generatorfunktion Skipping

def gen_alphaLabels(): 
    a = range(65,91) 
    for i in a: 
     yield chr(i) 

k = gen_alphaLabels() 
for i in range(26): 
    print k.next(), 

Dies ergibt,

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 

Dies funktioniert ....

Ich würde die Funktion, um einige Zeichen, die in einer donotInclude-Liste zu überspringen. Ich konnte tun dies außerhalb des Generators ist, wie so,

k = gen_alphaLabels() 
donotInclude = ['D','K','J'] 
for i in range(26): 
    r = k.next() 
    if r not in donotInclude: 
     print r, 

Dies ergibt das gewünschte Ergebnis Überspringen ‚D‘, ‚K‘ und ‚J‘

A B C E F G H I L M N O P Q R S T U V W X Y Z 

Gibt es eine Möglichkeit umfassen die Logik in Bezug auf das Überspringen von Zeichen in der Generatorfunktion? Manche Dinge entlang der Linien von

def gen_alphaLabels(): 
    a = range(65,91) 
    for i in a: 
     r = chr(i) 
     if r in donotInclude: 
      yield self.next() 
     else: 
      yield r 
+1

Eine Notiz auf einem Teil des Codes, die nicht direkt auf Ihre Frage in engen Zusammenhang steht: Um Verbraucher Ihres Generator sollten Sie tun 'für c wahrscheinlich in get_alphaLabels(): print c,' anstatt auf einer Reihe Looping und manuell 'next() 'aufrufen. Dies ist wichtig, wenn Ihr Generator eine unbekannte Anzahl von Werten liefert! – Blckknght

Antwort

6

Ohne Verwendung fortsetzen + ein wenig Verkürzung des Codes:

def gen_alphaLabels(donotInclude): 
    for i in range(65,91): 
     char = chr(i) 
     if char not in donotInclude: 
      yield char 
+2

Dies sollte eine Bearbeitung von RickyA's Antwort sein, keine neue. – Bonifacio2

+2

@ Bonifacio2 Nun, ich denke, die Antwort unterscheidet sich genug, um ihren eigenen Platz zu rechtfertigen. Nur eine Frage der Meinung. – Joohwan

+0

Die erste Version Ihrer Antwort war nichts anderes als eine Kopie von RickyA. Jetzt, da es einen Mehrwert bringt, widerrufe ich meinen Downvote. – Bonifacio2

7

continue zur Rettung:

def gen_alphaLabels(): 
    a = range(65,91) 
    for i in a: 
     r = chr(i) 
     if r in donotInclude: 
      continue 
     yield r 
+0

Danke für eine schnelle Antwort zu diesem Thema. Ich akzeptiere Joowanis Antwort, da es die mit weniger Zeilenanzahl und prägnanterem Text ist. – nitin

0

können Sie verwenden string.uppercase statt chr (Ich habe auch ein Listenverständnis anstelle von if) verwendet:

import string 
def gen_alphalabels(exclude): 
    labels = [c for c in string.uppercase if c not in exclude] 
    for label in labels: 
     yield label 

Liste Verständnis oben kann eine Geschmackssache sein, aber es erlaubt uns yield from in Python 3.3 zu verwenden, ist es noch prägnanter zu machen:

import string 
def gen_alphalabels(exclude): 
    labels = [c for c in string.ascii_uppercase if c not in exclude] 
    yield from labels 
+0

Es erscheint mir albern, ein Listenverständnis zu machen, dann sofort von der Liste zu weichen. Ich würde entweder eine explizite Schleife verwenden und individuelle Werte liefern (wie die anderen Antworten tun) oder einfach die Liste zurückgeben! – Blckknght

+0

@Blckknght, ich gehe davon aus, dass er den Generator irgendwo verwenden möchte, wo er seine Werte im Wechsel mit etwas anderem abgeben wird. Was das Listenverständnis betrifft, finde ich es besser lesbar, aber ich habe gesagt, dass es Geschmackssache ist. –

+0

@Blckknght, Oh, und wie ich in der Antwort sagte, mit der Liste Verständnis können Sie 'Ausbeute von Etiketten ', was ich denke, Sie stimmen überein ist schöner als die' for' Schleife. –

0

Sie müssen keine Variablen verwenden in Ihrem gen in diesem Fall.

def gen_alphaLabels(): 
    for i in range(65,91): 
     if chr(i) not in donotInclude: 
      yield (chr(i)) 
Verwandte Themen