2013-09-04 3 views
6

Я пишу функцию генератора, который дает мне альфа-символы, как это так,перепрыгивал значений в функции генератора

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(), 

Это дает,

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 

Это работает ....

Я бы хотел пропустить некоторые символы, которые отображаются в списке donotInclude. Я мог бы сделать это за пределами генератора, как это так,

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

Это дает желаемый результат пропуска через «D», «K» и «J»

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

Есть ли способ включить логика, связанная с пропуском символов в функции генератора? Некоторые вещи вдоль линий

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

Замечание о части вашего кода, который непосредственно не связанной с вашим вопросом: Для потребителя вашего генератора, вероятно, вы должны сделать 'для с в get_alphaLabels(): печать с,' а не зацикливание на диапазоне и вручную вызывая 'next()'. Это будет важно, когда ваш генератор даст неизвестное количество значений! – Blckknght

ответ

6

без использования продолжить + немного укорочение кода:

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

Это должно быть отредактировано для ответа RickyA, а не нового. – Bonifacio2

+2

@ Bonifacio2 Ну, я думаю, что ответ отличается достаточно, чтобы оправдать свое собственное место. Просто вопрос мнения. – Joohwan

+0

Первая версия вашего ответа была не чем иным, как копией RickyA. Теперь, когда он добавляет некоторую ценность, я отменяю свой downvote. – Bonifacio2

7

continue к спасению:

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

Спасибо за быстрый ответ. Я принимаю ответ Joowani, поскольку он имеет меньшее количество строк и более кратким. – nitin

0

Вы можете использовать string.uppercase вместо chr (Я также использовал список, а не if):

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

Список понимание выше, может быть дело вкуса, но это не позволяет нам использовать yield from в Python 3.3, что делает его еще более кратким:

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

Мне кажется глупым, чтобы сделать понимание списка, а затем сразу же получить из списка. Я бы либо использовал явный цикл, и дал отдельные значения (как это делают другие ответы), либо просто вернул список! – Blckknght

+0

@Blckknght, я предполагаю, что он хочет использовать генератор где-нибудь, где он будет давать свои значения, чередующиеся с чем-то другим. Что касается понимания списка, я считаю его более читаемым, но я сказал, что думаю, что это вопрос вкуса. –

+0

@Blckknght, О, и, как я сказал в ответ, с пониманием списка вы можете делать «уступку от ярлыков», что, я думаю, вы согласитесь лучше, чем цикл 'for'. –

0

Вам не нужно использовать какие-либо переменные в gen в этом случае.

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