用翻转构建一个python计数器

时间:2014-10-17 14:05:26

标签: python oop

我需要创建一个消息计数器对象 - 不要与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

3 个答案:

答案 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