On Thu, Nov 12, 2015 at 6:59 PM, Larry Hudson via Python-list < python-list@python.org> wrote:
Nothing to do with your original question, just a trivial suggestion which > you are free to ignore. You can shorten this tick() method by using the > divmod() function. It does a division and returns both the quotient AND > the remainder. IOW, given divmod(x, y) it returns the tuple (x/y, x%y). > It is a very useful function. Try this: > > def tick(self): > xtra, self._seconds = divmod(self._seconds + 1, 60) > xtra, self._minutes = divmod(self._minutes + xtra, 60) > self._hours += xtra > > Explanation: (to shorten this, I'm leaving off the leading "self._" from > the actual code.) > The first divmod() sets xtra = (seconds+1) / 60, which is the 'overflow' > if any, from the division by 60, and seconds is the updated seconds limited > to 0-59 (the result of (seconds+1) % 60). The second divmod() does the > same thing to update minutes (if xtra != 0) and xtra is set to the > 'overflow' from that division, which is then added to hours. > > More confusing perhaps, but definitely shorter. > As I said above, use it if you want or ignore it if it's too confusing. > > -=- Larry -=- > > -- > https://mail.python.org/mailman/listinfo/python-list > Beat me to the punch. I was about to suggest something similar, but I thought that since one using this class would probably be "tick()-ing" more than "str()-ing", It might also be better to store the value in seconds, and convert to HH:MM:SS upon stringification; again using divmod: class Clock(object): def __init__(self,hours=0,minutes=0,seconds=0): self.set(hours,minutes,seconds) def tick(self): self.__secs+=1 def set(self,hours, minutes, seconds): self.__secs = seconds + (minutes*60) + (hours*60*60) def __str__(self): rest, seconds = divmod(self.__secs, 60) hours, minutes = divmod(rest, 60) return "%02d:%02d:%02d" % (hours, minutes, seconds) def display(self): print(str(self)) if __name__ == "__main__": x = Clock() print("Default construction, no parameters, Before ticks: {}".format(x)) for i in range(10000): x.tick() print("After ticks: {}".format(x)) x = Clock(hours=2, minutes=20, seconds=5) print("\nConstructor with hours=2, minutes=20, seconds=5: {}".format(x)) print("Test of display() method: ",end=' ') x.display() This is my first post here, and I am a Python n00b (coming from that four-letter word language "p***"), so if I broke some top/bottom posting or formatting rules, I apologize, and would appreciate any posting pointers Nathan H. -- https://mail.python.org/mailman/listinfo/python-list