[Tutor] If, elif, else

spir denis.spir at gmail.com
Wed Jan 29 01:47:22 CET 2014


On 01/28/2014 11:46 PM, Michael L. Pierre wrote:
> I am a newbie with Python (programming in general) and I am trying to create a program that will take user name and dob and pump out their age, while on a person's birthday the output not only states their name and age, but also prints out ***HAPPY BIRTHDAY***
> I have gotten it resolved to the point that it understands leap  years and gives the correct age. My problem arises when a date is input that is the current month, but a future date (i.e. today's date is 1/28/2014 but the input dob is 1/30/1967) It skips over the elif option to subtract one year and prints out ***HAPPY BIRTHDAY***
> I am only going to paste the non-leap year code, because the leap year code is basically identical.
>
> #Leapyear calculations/decision
> if leap_year != int:
>      age_month = int(current_split[1]) - int(dob_split[1])
>      #print age_month
>      if age_month != 0:
>          month_less = 1
>          age = int(current_split[0]) - int(dob_split[0]) - month_less
>          print "you are", age, "years old"
>      elif age_month == 0 and int(current_split[2]) > int(dob_split[2]):
>          age = int(current_split[0]) - int(dob_split[0]) - month_less
>          print "you are", age, "years old"
>      else:
>         age = int(current_split[0]) - int(dob_split[0])
>         print "You are", age, "and today is your birthday ***HAPPY BIRTHDAY***"
>
> Any help would be greatly appreciated :)

This is not an answer to your question, just some notes (which may help for this 
issue and others). The number one problem in programming is certainly 
understandability, or clarity for short. Programming is very hard (and quality 
very low) because we have major problems to understand what the code *actually* 
means, even often our own code while we're at it (not to mention a few weeks 
later, or years). We should do our best to reduce complication and obscurity as 
much as possible (even to the point of reducing our ambitions in terms of scope 
or scale, functionality or sophistication).

* What about a comment explaining your logic here, also for yourself, in plain 
natural language? (obviously it's not obvious, firstly for yourself, else the 
bug would be obvious...)

* I cannot guess what "if leap_year != int" may mean. (But I note you know, 
apparently, that int is a python type and int() acts like a function producing 
an int value.)

* You are using items of multi-item data 'current_split' and 'dob_split' 
(probably tuples) as key elements in the control of your application logic: why 
about naming these elements after their *meaning*? This would make the flow 
control clear, your understanding better, and your debugging, modifications, 
maintenance far easier? eg for instance
	year, month, day = current_split
[Or better create a Date type with year, month, day properties (or use python's, 
in the module datetime).]

* It's certainly acceptable to name something 'dob' in code (provided you 
comment it), but not in the text of a message on a mailing. (For whatever 
mysterious reason the meaning popped up in mind nevertheless, so _i_ don't need 
a translation anymore.)

* You don't need the "age_month == 0" sub-condition in the elif branch. (why?) 
(or your logic is wrong otherwise)

d


More information about the Tutor mailing list