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

boB Stepp robertvstepp at gmail.com
Sun May 6 17:59:58 EDT 2018

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
        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!")

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?


More information about the Tutor mailing list