python generator/yield 实施示例
Example python implementation of generator/yield
让我们用下面的python代码来生成一个无限计数器:
def infinite_sequence():
num = 0
while True:
yield num
num += 1
然后我可以将其称为:
for i in infinite_sequence():
print (i)
并在我想退出时执行 KeyboardInterrupt
。 yield/generator
内容在 C/Cpython 中实现。在 python 中实施类似 "generator functionality" 的示例是什么?也就是说,如果我可以调用 function/method 代替 yield num
行,并获得相同的功能,那么 python 中的示例实现是什么?
您必须自己实现迭代器协议。
class InfiniteSequence:
def __init__(self):
self.x = 0
def __iter__(self):
return self
def __next__(self):
x = self.x
self.x = x + 1
return x
for i in InfiniteSequence():
print(i)
__iter__
方法必须 return 实现 __next__
的东西。 __next__
方法必须 return 序列中的下一个值。实例属性在 __next__
.
调用之间保持状态
相同的 class 不必实现这两种方法。您可能需要一个单独的迭代器 class,以便您可以在可迭代序列上拥有多个独立的迭代器。
class InfiniteSequence:
def __init__(self, start):
self.start = start
def __iter__(self):
return InfSeqIterator(self.start)
class InfSeqIterator:
def __init__(self, x):
self.x = x
def __iter__(self):
return self
def __next__(self):
x = self.x
self.x += 1
return x
nats = InfiniteSequence()
i1 = iter(nats)
i2 = iter(nats)
assert next(i1) == 0
assert next(i2) == 0 # not 1
generator
只是实现此协议的 class 的一个示例;您使用生成器表达式 ((x for x in [1,2,3])
) 或生成器函数(即使用 yield
的函数)创建 generator
的实例。
让我们用下面的python代码来生成一个无限计数器:
def infinite_sequence():
num = 0
while True:
yield num
num += 1
然后我可以将其称为:
for i in infinite_sequence():
print (i)
并在我想退出时执行 KeyboardInterrupt
。 yield/generator
内容在 C/Cpython 中实现。在 python 中实施类似 "generator functionality" 的示例是什么?也就是说,如果我可以调用 function/method 代替 yield num
行,并获得相同的功能,那么 python 中的示例实现是什么?
您必须自己实现迭代器协议。
class InfiniteSequence:
def __init__(self):
self.x = 0
def __iter__(self):
return self
def __next__(self):
x = self.x
self.x = x + 1
return x
for i in InfiniteSequence():
print(i)
__iter__
方法必须 return 实现 __next__
的东西。 __next__
方法必须 return 序列中的下一个值。实例属性在 __next__
.
相同的 class 不必实现这两种方法。您可能需要一个单独的迭代器 class,以便您可以在可迭代序列上拥有多个独立的迭代器。
class InfiniteSequence:
def __init__(self, start):
self.start = start
def __iter__(self):
return InfSeqIterator(self.start)
class InfSeqIterator:
def __init__(self, x):
self.x = x
def __iter__(self):
return self
def __next__(self):
x = self.x
self.x += 1
return x
nats = InfiniteSequence()
i1 = iter(nats)
i2 = iter(nats)
assert next(i1) == 0
assert next(i2) == 0 # not 1
generator
只是实现此协议的 class 的一个示例;您使用生成器表达式 ((x for x in [1,2,3])
) 或生成器函数(即使用 yield
的函数)创建 generator
的实例。