# [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
>

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