Robert Sjoblom wrote: > #assuming target number 15 > roll = (result, initial_mins, initial_max) > if roll[0] > 15: > if roll[1] >= 2: > print("Success") > elif roll[2] >= 2: > print("Critical failure!") > else: > print("Failure.") > elif roll[0] <= 15: > if roll[1] >= 2: > print("Critical success!") > elif roll[2] >= 2: > print("Failure") > else: > print("Success") > > This handles all the test cases I've come up with, but it feels very > ugly. Is there a better way to do this?
Sometimes a table-driven approach is preferable. Your code would become something like def show_result(result, initial_mins, initial_max): messages = [ ["Critical success!", "Failure", "Success"], ["Success", "Critical failure!", "Failure."]] messages = messages[result > 15] if initial_mins >= 2: message = messages[0] elif initial_max >= 2: message = messages[1] else: message = messages[2] print(message) or, taken to the extreme, def first(pairs): for predicate, value in pairs: if predicate: return value raise ValueError def show_result(result, initial_mins, initial_max): messages = [ ["Critical success!", "Failure", "Success"], ["Success", "Critical failure!", "Failure."]] def checks(): yield initial_mins >= 2 yield initial_max >= 2 yield True print(first(zip(checks(), messages[result > 15]))) I don't think these alternatives have an advantage over the nested ifs in this case. _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor