跳过生成器函数中的值

时间:2013-09-04 17:44:46

标签: python generator

我正在编写一个生成器函数,它给我字母字符,就像这样,

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

4 个答案:

答案 0 :(得分:7)

continue救援:

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

答案 1 :(得分:7)

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

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

答案 2 :(得分: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

上面的列表理解可能是一个品味问题,但它确实允许我们在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

答案 3 :(得分:0)

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

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