On Sat, 2008-08-16 at 07:40 +0200, [EMAIL PROTECTED] wrote:
> Message: 1
> Date: Fri, 15 Aug 2008 22:22:00 -0700
> From: "Joseph Bae" <[EMAIL PROTECTED]>
> Subject: Re: [Tutor] Beginner problem: name 'convertToFahrenheit' is
>         not     defined
> To: "Alan Gauld" <[EMAIL PROTECTED]>
> Cc: tutor@python.org
> Message-ID:
>         <[EMAIL PROTECTED]>
> Content-Type: text/plain; charset="iso-8859-1"
> 
> Thanks for the help!
> 
> I have managed to get a good temperature converter program working! I
> am
> working on beefing it up a bit with some exception handling and an
> "and-or
> trick". The error handling works okay but I am having problems using
> and-or.
> Here's my updated code:
> 

You can fix some of these:

> def main():
>     true = 1
>     while true:

You can use True (note the capital (T)rue) for the boolean value of
True.

>         try:
>             temp = int(raw_input("Enter A Number : "))
>             break
>         except ValueError:
>             print "Invalid Input"

Following the concept: Don't Make Me Repeat Myself, you could factor out
the input function:

def take_input(prompt, 
               validator = int, 
               errormessage = 'Invalid Input', 
               exceptions = (ValueError, )):
    '''
    prompt - String to be printed before raw_input
    validator - Function to be called after raw_input
    errormessage - String to be printed if any exceptions in 
                   exceptions is raised
    exceptions - List/Tuple containing list of exceptions to caught
    '''

    while True:
        print prompt, 
        try:
            return validator(raw_input())
        except exceptions:
            print errormessage

>     while true:
>         convertTo = raw_input("Convert To (F)ahrenheit or (C)elsius? :
> ")
>         if not convertTo == "F" and not convertTo == "C":

If a boolean expression so simple looks complex, there is usually a
simpler version. Try learning boolean logic a little bit, specifically
boolean simplification for formal ways to simplify a boolean expression
(although many text about boolean logic subject is from electronic, the
basic rules are the same in programming and math).

>             print "Invalid Input"
> *        else:
>             convertTo == "C" and convertToCelsius(temp) or
> convertToFahrenheit(temp)

Never use and-or trick except if you're writing for Python Obfuscation
Code Contest, they have huge pitfalls[1], the and-or trick was useful
before python got "inline if" (although Guido choose a frankly rather
unusual syntax):

true_value if expression else false_value

so your and-or trick should be:
convertToCelcius(temp) if convertTo == 'C' else
convertToFahrenheit(temp)

[1] in and-or hackery a problem arises for codes like this:
>>> b = 0
>>> c = 3
>>> True and b or c
3
>>> False and b or c
3

I'll leave it to you for brain exercise on why that thing happened

>             break


> *
> def convertToCelsius(t):
>     tC = (9.0/5.0) * (t - 32)
>     print "%d Fahrenheit = %d Celsius" % (t, tC)

It's a bad idea for reusability to make convertToCelcius and
convertToFahrenheit print the result themselves, the function would be
more useful if it return the converted value and let the main program
print them. This way, the function could be used for other things as
well (for example, in a more complex temperature converter, rather than
typing out all to all converters, it's a much better idea to convert to
a common unit (say Kelvin, the SI standard for temperature), then
convert it again to the target unit. This is impossible to be done if
convertToCelcius prints the result themself.

i.e.:
def convertToCelcius(t):
    return #Do some formula
t = 10
print '%s %s = %s %s' + (t, 'Fahrenheit', convertToCelcius(t),
'Celcius')

> def convertToFahrenheit(t):
>     tF = (9.0/5.0) * (t + 32)
>     print "%d Celsius = %d Fahrenheit" % (t, tF)
> 
> if __name__=="__main__":

it's not a must, you should see PEP 8 (it's the style guideline):
http://www.python.org/dev/peps/pep-0008/

>     main()
> 
> Sample Output (as of right now):
> 
> Enter A Number : 50
> Convert to (F)ahrenheit or (C)elsius? C
> 50 Fahrenheit = 32 Celsius
> 32 Celsius = 147 Fahrenheit <-- shouldn't show up and 147 is too
> high ...
> 
> This only happens when I tell it to convert to C, if I say F it works
> normally. I've debugged it with pdb.set_trace() many times but can't
> figure
> out what's wrong. Help is much appreciated =)
> 
> Thanks,
> 
> Joe

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to