我写了一个生成器函数,我实例化然后一次又一次地调用,每次增加数字。
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次。用于生成页码。所以我事先不知道要打电话多少次。在每个调用之间,有很多代码可以计算内容并生成图形。
答案 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())