Hahah, fair enough!
Usually in real life you won't be making such small programs such as these. Instead, you will be stringing many different functions together to reach an ultimate goal. In that regard, the only thing you can say is "it depends".
In many cases functions will perform tasks which will require little to no feedback to the originating process. In others, you'll definitely want feedback or resulting values. Printing on the other hand is only meant for visible output (be it to the user or to output files)...
Here's a real world example in meta-code:
# get next available uid
# check that new uid is within bounds
# get next available gid
# check that new gid is within bounds
#create new group with gid and name = username
gcos = raw_input("Whose account are we making? ")
username = raw_input("What's the desired username? ")
uid = generate_uid()
gid = generate_gid(username)
useradd = "useradd -u %s -g %s -d /home/%s %s" %(uid, gid, username, username)
print "Made user account %s, with uid and gid of %s, %s.) %(username, uid, gid)
It's not great, but it's a start.