我需要创建一个消息计数器对象 - 不要与Python的Counter类混淆。该规范要求一个初始化为0的计数器,然后递增1直到它达到4294967295,此时它应该循环回到1.
我已经实现了一个类来执行此操作,但这只是一种天真的方法。有没有更好的方法来实现这一目标?
class MessageCounter():
def __init__(self):
self.value = 0
def increment(self):
if self.value < 4294967295:
self.value += 1
else:
self.reset()
def reset():
self.value = 1
答案 0 :(得分:5)
作为OO的替代方案,您可以创建一个生成函数,永久地按顺序生成数字。有很多方法可以做到这一点。按大小和直截了当的降序排列:
def count_loop(upper_limit):
while True:
for i in range(upper_limit):
yield i
gen = count_loop(4294967295)
import itertools
gen = (i for _ in itertools.count() for i in range(4294967295))
gen = (i for _ in iter(int,1) for i in range(4294967295))
然后,您可以通过执行next(gen)
来检索您的值。
>>> next(gen)
0
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
3
(注意:Python 2.7用户应该使用xrange
而不是range
。但是,这可能仅适用于小于2 ^ 31的最大值。
答案 1 :(得分:0)
您可以使用模运算符代替重置:它将重置&#34;为0而不是1,但这并不重要,因为你将其设为0。
def increment(self):
self.value = (value + 1) % 4294967296
答案 2 :(得分:-2)
我有一个例子,只是更短。
class MessageCounter():
def __init__(self):
self.value = 0
def increment(self, reset=False):
self.value = self.value + 1 if self.value < 4294967295 and not reset else 1