9

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

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

4 回答 4

8

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

def gen_alphaLabels(donotInclude):
    for i in range(65,91):
        char = chr(i)
        if char not in donotInclude:
            yield char
于 2013-09-04T17:50:53.717 回答
7

continue救援:

def gen_alphaLabels():
    a = range(65,91)
    for i in a:
        r = chr(i)
        if r in donotInclude:
            continue
        yield r
于 2013-09-04T17:47:47.017 回答
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
于 2013-09-04T19:15:34.030 回答
0

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

def gen_alphaLabels():
    for i in range(65,91):
        if chr(i) not in donotInclude:
            yield (chr(i))
于 2017-09-03T17:32:03.113 回答