Alan, Wow! Those changes radically change the program!
Is there a way to get the try-exception to cause the end user questions to be repeated until acceptable answers are given? Like a kind of "return" or "repeat" command that could be added to the except side of things? try: start = int(raw_input("Enter yyyy for beginning year : ")) end = int(raw_input("Enter yyyy for ending year : ")) except ValueError: print "Must be a integer number as YEAR." I also noticed that I had to make the statement "start = end = 0" prior to the 'try'. To my eye, it looks to me that 'start' and 'end' are being declared inside the try-exception, but evidently python does not agree. Thanks, Terry On Tue, 2007-07-03 at 21:42 +0100, Alan Gauld wrote: > "Terry" <[EMAIL PROTECTED]> wrote > > > trapping for possible user errors. > > I am using x.isalnum() to check that I have a number > > First, alnum() checks for alpha-numeric characters so > will allow both alphabetic characters and numerics. > > BUT in python its better to ask forgiveness that permission > so don't bother doing the check but catch the errors when > they occur: > > try: start = int(start); end = int(end) > except: ValueError: start = None # or whatever you prefer > > > def leap(yyyy): > > answer = 0 > > t1 = yyyy / 4 > > if t1 == int(t1): > > For integer division this will always be true. > > > t2 = yyyy / 100 > > t3 = yyyy / 400 > > if t2 <> int(t2) or t3 == int(t3): > > and similarly the second test will always be true. > > > answer = "-- leap year!" > > thus this will always be true. > > > start = raw_input("Enter yyyy for beginning year : ") > > end = raw_input("Enter yyyy for ending year : ") > > The easiest way to solve your conversion problems > is to do it at source so wrap raw_input in a call to int() > and wrap both prompts in a try/except as shown above. > > try: > start = int(raw_input....) > end = int(raw_input....) > except ValueError: pass # do something with error > > > if len(start) == 4 and len(end) == 4: > > that way you don't need these lines but can instead > test if the numeric value is greater than some lower > limit > > > if start.isalnum() == 1 and end.isalnum() == 1: > > #<----------fails to detect 'aaaa' as not a number > > start = int(start); end = int(end) > > #<----------commits suicide here > > if start > 0 and end > start: > > As you are doing it start can never be less than 1000 > (unless the user enters 0001 I suppose...) > > Also in Python you can use the neater style of > > if 0 < start < end: > > to test whether start lies between 0 and end. > > > for i in range(start, end + 1): > > answer = leap(i) > > if answer != 0: > > Its best not to mix return types in a function. If it is a > leap year you return a string. If it's not, you return a > number - 0. It would probably be better for the function > to return a boolean: True if it is a leap year and False > if not. That style of function is often called a predicate > and is usually named with an 'is' in front so it would > become isLeapYear() Then this test becomes the more > readable > > for y in range(start, end+1): # use y for year instead of meaningless > i > if isLeapYear(y): > print i, 'is a leap year' > > HTH, > >
_______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor