2014-10-17 58 views
0

我需要创建一个消息计数器对象 - 不要与Python的Counter类混淆。该规范要求计数器初始化为0,然后递增1,直到它达到4294967295,此时它应该循环回到1.建立一个python计数器翻转

我已经实现了一个类来完成此操作,但这是只是天真的做法。有没有更好的方法来实现这个目标?

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

神奇的数字不谈,这是一个非常有效的方法。你究竟感到不舒服? – ch3ka 2014-10-17 14:11:51

+3

因为这是一段没有特定问题的代码,所以将它发布在CodeReview – njzk2 2014-10-17 14:12:17

+0

'self.value = self.value + 1 if self.value <4294967295 else 1' – joaoricardo000 2014-10-17 14:12:23

回答

0

而不是复位,你可以使用模运算符:。它将“重置”为0而不是1,但这应该不重要,因为你初始化为0.

def increment(self): 
    self.value = (value + 1) % 4294967296 
+3

检查比mod功能更高效 – cengizkrbck 2014-10-17 14:14:46

+0

我倾向于不喜欢模数,因为它可能是一个非常慢的操作。此外,这不会重置为1,而是重置为0.您需要'(值%4294967295)+ 1' – njzk2 2014-10-17 14:15:04

+0

比模运算符的效率要高得多,效率高得多。特别是当模数运算符被调用的次数与翻转的几率相比非常小时。 – aruisdante 2014-10-17 14:16:13

-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 
+0

为什么在'increment'函数中会有'reset'参数? – njzk2 2014-10-17 14:14:44

+0

以消除重置功能。这只是一个建议 – cengizkrbck 2014-10-17 14:16:25

+0

我想象允许手动重置,但没有真正有意义的被纳入检查方法。 – aruisdante 2014-10-17 14:17:18

4

作为面向对象的替代方法,您可以创建一个生成函数,该函数按顺序产生数字,直到永远。有很多方法可以做到这一点。在规模和率直的递减顺序:

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)

+0

使用无限生成器实际上是解决这个问题的最pythonic方法(我确实相当确定生成无限循环是教程中生成器的第一个示例之一) – aruisdante 2014-10-17 18:19:03