具有不同next()条件的python生成器

时间:2016-04-29 09:05:50

标签: python python-2.6

我使用了一个python生成器来获取pdf文件中的行高。 为此,我创建了一个生成器,它返回下一行的高度。

def height_generator(height):
    while height > 0:
        height -= 15
        yield(height)

到目前为止这种方法很完美。

但我需要不同的高度。例如,如果我的文件中需要一个新段落,我需要将高度减少20而不是15。

为了得到这个,我想在我打电话给我的发电机时定义,如果我想要新线或新的段落。

我喜欢这样的事情:

def height_generator(height):
    while height > 0:
        def spacer(height, a):
            if a == 1:
                height -= 15
                yield(height)
            elif a ==2:
                height -= 20
                yield(height)

但它不起作用。

2 个答案:

答案 0 :(得分:4)

您正在while循环中定义一个函数,这会使您的代码无限循环。

您需要send(a)生成器告诉它该做什么。例如

def height_generator(height):
    while height > 0:
        a = yield height
        if a == 1:
            height -= 15
        else:
            height -= 20

g = height_generator(100)
g.next()
print g.send(1) # 85
print g.send(2) # 65
print g.send(1) # 50

yield不仅是生成器为其调用者生成值的方式,还可以用于向生成器发送值。传递给send的参数将是表达式yield height的值。有关详细信息,请阅读PEP 255

答案 1 :(得分:0)

为什么不做这样的事情?:

def height_generator(height):
    while height > 0:
        a= yield height
        if a == 'nl':
            height -= 15
        elif a == 'np':
            height -= 20