2014-10-17 57 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