On 01/-10/-28163 02:59 PM, Cathy James wrote:
I need a jolt here with my python excercise, please somebody!! How can I
make my functions work correctly? I tried below but I get the following
error:

if f_dict[capitalize]:

KeyError:<function capitalize at 0x00AE12B8>

Code below:



def capitalize (s):
     """capitalize accepts a string parameter and applies the capitalize()
method"""
     s.capitalize()
def title(s):
     """accepts a string parameter and applies the title() method"""
     s.title()
def upper(s):
     """accepts a string parameter and applies the upper() method"""
     s.upper()
def lower(s):
     """accepts a string parameter and applies the lower() method"""
     s.lower()
def exit():
     """ends the program"""
     import sys
     sys.exit()
if __name__ == "__main__":
     f_dict = {'capitalize': 'capitalize(s)',
           'title': 'title(s)',
           'upper': 'upper(s)',
           'lower': 'lower(s)',
           'exit': 'exit(s)'}
     options = f_dict.keys()
     prompt = 'Enter a function name from the list (%s): ' % ',
'.join(options)
while True:
     inp = input(prompt)
     option =f_dict.get(inp, None)#either finds the function in question or
returns a None object
     s = input ("Enter a string: ").strip()
     if not (option):
         print ("Please enter a valid selection")
     else:
         if f_dict[capitalize]:
             capitalize(s)
         elif f_dict [title]:
             title(s)
         elif f_dict[upper]:
             upper(s)
         elif f_dict [lower]:
             lower(s)
         elif f_dict[exit]:
             print ("Goodbye!! ")


You have a number of things wrong here. The most obvious is that capitalize, which is a function object, cannot be used as a key in the dictionary. That's okay, because the actual keys in your dictionary are strings, like 'capitalize'.

But there are more fundamental things wrong. You should test each piece before worrying about the program as a whole. The functions like capitalize, as written, do nothing useful. They don't return a value, they can't modify their argument (assuming their argument is a string, which is immutable). You probably wanted a return statement in each of them.

After each function, add lines like

print capitalize("Howdy Doody")

to see that it returns something reasonable. You can remove those prints after it all works.

Next, you have a dictionary of dubious purpose. Probably you meant for it to have a mapping from string to function, but it's just from string to string.

Next, in your else clause, you are looking up const values in the dictionary (or at least will if you change to the literals I suggested above). So you'll always match on the first one. Somehow you have to use either inp or option in those tests, if you want to do different things based on the token that was input.

I suspect you meant to store function objects as values in the dictionary, in which case option will be a function object. If that's the case, then the else clause doesn't need any additional tests, it can just call the function object, passing it the string object s.

Finally, you probably want to have some output, in each of those cases. If you changed the functions as I suggested, you might replace the whole else clause with:

      else:
           print option(s)

HTH,
DaveA


--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to