我正在编写一个生成器函数,它给我字母字符,就像这样,
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
答案 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))