[Tutor] How to separate UI code from program logic?

Mark Lawrence breamoreboy at gmail.com
Sun May 6 18:35:51 EDT 2018

On 06/05/18 22:59, boB Stepp wrote:
> I was solving a programming problem in one of my books concerning the
> generation of a Collatz sequence
> (https://en.wikipedia.org/wiki/Collatz_conjecture), and started to
> wonder how I should separate my program's output from its logic.  It
> seems like this should be obvious to me, but, unfortunately, it isn't.
> The core functions from my program are:
> #----------------------------------------------------------------------------
> def collatz(integer):
>      """Returns the Collatz sequence number corresponding to integer.  integer
>      must be > 0, or the sequence will not converge to 1."""
>      if integer % 2 == 0:
>          return integer // 2
>      else:
>          return 3 * integer + 1
> def generate_collatz_sequence(seed):
>      """Generates a Collatz sequence starting from seed.
>      seed must be a positive integer, or the sequence will not
>      coverge to 1."""
>      counter = 0
>      collatz_number = seed
>      print("Collatz seed number: ", collatz_number)
>      while True:
>          counter += 1
>          collatz_number = collatz(collatz_number)
>          print("Collatz number", counter, ": ", collatz_number)
>          if collatz_number == 1:
>              print("The Collatz sequence has once again converged to 1!")
>              break
> #----------------------------------------------------------------------------
> My understanding of best practice here is that I should not have any
> print() calls inside my generate_collatz_sequence() function.  I
> _could_ store the generated sequence in a list and return it, but that
> does not seem like good use of RAM if some user-supplied seed value
> led to kazillions of Collatz sequence numbers being generated.  As it
> stands there will be no theoretical RAM issues as the numbers are
> being generated and then outputted one at a time.  OTOH, if I created
> some kind of display messages function, I don't see how I have gained
> anything as these calls to a display message function would just be
> taking the place of the print() calls.  The end result would be the
> same -- display code interleaved with program logic code.  What am I
> being dense about here?

You're not being dense, you're just trying to wrap your head around a 
difficult concept.  I suggest you read up on the model view controller 
pattern.  First hit on google 
seems as good as any.

My fellow Pythonistas, ask not what our language can do for you, ask
what you can do for our language.

Mark Lawrence

More information about the Tutor mailing list