结合Python3生成器和实例化的函数

时间:2019-06-23 15:50:26

标签: python python-3.x generator

我写了一个生成器函数,我实例化然后一次又一次地调用,每次增加数字。

def pagecnt():
    n = 1
    while True:
        yield n
        n += 1

pg = pagecnt()
print(next(pg))
print(next(pg))
print(next(pg))

先打印1,再打印2,然后打印3。是否可以通过某种方式将生成器和实例化组合为一个新函数,以便我可以调用

print(newfunc())
print(newfunc())
print(newfunc())

获得1、2和3?

编辑:我不只是想叫它3次。用于生成页码。所以我事先不知道要打电话多少次。在每个调用之间,有很多代码可以计算内容并生成图形。

2 个答案:

答案 0 :(得分:2)

只需创建一个实例化生成器并调用n次next的函数

def combine_func(n):
    pg = pagecnt()
    for _ in range(n):
        print(next(pg))

或者我们可以定义一个包装函数,该函数接受生成器实例,并返回一个可以调用以获取下一个元素的函数

def combine_func(pg):

    def next_elem():
        return next(pg)

    return next_elem

pg = pagecnt()
cf = combine_func(pg)
print(cf())
print(cf())
print(cf())

答案 1 :(得分:1)

您可以使用定义了__call__()的简单Counter类:

class Counter():
    def __init__(self):
        self.count = 0
    def __call__(self):
        self.count += 1
        return self.count

c = Counter()
print(c())
print(c())
print(c())

打印:

1
2
3

您还可以在闭包中捕获迭代器并返回lambda函数:

from itertools import count

def Counter():
    it = count(1)
    return lambda: next(it)

c = Counter()
print(c())
print(c())
print(c())

打印与上述相同。在这两种情况下,如果您想从0以外的地方开始,都很容易传递起始值。

编辑:

这与使用count相同,但使用自定义生成器:

def Counter():
    def pagecnt():
        n = 1
        while True:
            yield n
            n += 1
    it = pagecnt()
    return lambda: next(it)

c = Counter()
print(c())
print(c())
print(c())