Python 跳过生成器函数中的值

Python 跳过生成器函数中的值,python,generator,Python,Generator,我在写一个生成函数,它给我alpha字符,就像这样 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(), k = gen_alphaLabels() donotInclude = ['D','K','J'] for i in range(26): r =

我在写一个生成函数,它给我alpha字符,就像这样

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(),
k = gen_alphaLabels()
donotInclude = ['D','K','J']
for i in range(26):
    r = k.next()
    if r not in donotInclude:
        print r,
这就产生了,

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列表中的一些字符。我可以在发电机外面这样做

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

继续
救援:

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

不使用continue+稍微缩短代码:

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

您可以使用
string.uppercase
而不是
chr
(如果
,我还使用了列表理解而不是
):

上面的列表理解可能是一个品味问题,但它确实允许我们在Python 3.3中使用
yield from
,使其更加简洁:

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

在这种情况下,不需要在gen中使用任何变量

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

@博尼法西奥我认为答案的差异足以证明它的正确性。只是意见问题。你的答案的第一个版本只不过是RickyA的一个副本。现在它增加了一些价值,我取消了我的否决票。谢谢你对这个问题的快速回答。我接受Joowani的答案,因为这是一个行数较少、代码中与您的问题没有直接关系的部分更加简洁的答案:为了使用您的生成器,您可能应该在get_alphaLabels():print c,
中对c执行
,而不是在一个范围内循环并手动调用
next()
。当生成器生成未知数量的值时,这一点非常重要!在我看来,做一个列表理解,然后立即从列表中让步是愚蠢的。我要么使用显式循环并生成单个值(就像其他答案一样),要么简单地返回列表@Blckknght,我假设他想在某个地方使用发电机,在那里他将产生与其他东西交替的值。至于列表理解,我觉得这样更容易理解,但我确实说过我认为这是一个品味的问题。@Blckknght,哦,正如我在回答中所说的,通过列表理解,你可以从标签中获得
yield
,我想你会同意,这比
for
循环更好。我的观点是,如果你只是想从预先制作的集合中获得收益,就不需要将函数作为生成器。您可以用
返回标签
替换
来自标签的收益
,它在任何情况下都会工作得很好或更好。如果发电机只是在需要时才进行计算,从而节省了工作量,那么它才是一个好主意。@Blckknght,如果这是你的观点,那么在这个问题上提出建议,为尼廷的问题提供更好的解决方案,会更有用。列表理解是一种转移注意力的方法;它不再是一个预先制作的集合,而是从65到91的范围。不过,谢谢你让我想一想。我知道生成器在大量计算中最有用,但我总是模糊地认为它们保持状态的能力是一个很好的通用特性。不过我从来没有在严肃的场合使用过它们,所以我完全相信你是对的。