[Tutor] strange behavior in program

Gregor Lingl glingl at aon.at
Sat Jun 12 17:16:24 EDT 2004



Dragonfirebane at aol.com schrieb:

>Hello all,
>
>I've finally managed to make the text converter in the code below do what its supposed to, but when i run it with more than one character ('hello', for example), it'll do the following (convert the first letter then ask if more letters are to be converted and regardless of the answer continue until the word is done, at which point 'y' begins the program again and 'n' ends it like it's supposed to):
>
>  
>
>Please enter numbers or text to be converted. hello
>1000
>Would you like to convert more text or numbers [y/n]? n
>101
>Would you like to convert more text or numbers [y/n]? y
>1100
>Would you like to convert more text or numbers [y/n]? 
>1100
>Would you like to convert more text or numbers [y/n]? 1
>1111
>Would you like to convert more text or numbers [y/n]? y
>Please enter numbers or text to be converted. a
>01
>Would you like to convert more text or numbers [y/n]? n
>Thank you for using Multivert.  Multivert will now close
>  
>
Hi Dragonfirebane!

This (to you) unexpected behaviour comes from the fact, that in


    for char in original:
        try:
            int(original)
        except TypeError:
            convertxt()
        except ValueError:
            convertxt()
        else:
            if char in number:
                convertnum()
        again = raw_input("Would you like to convert more text or numbers [y/n]? ")
        if again in 'Yy':
            again = True
        elif again in 'Nn':
            again = False

the raw_input() call is made once for every char in original,
that is - in your example - in "hello": 5 times!
And only if you answer with n in the last of these five inputs
the enclosing while loop will terminate.

So, I think, you shouldn't put the last five lines into the 
for-loop. 

Apart from this there are several flaws in your program, which
make it hard for me to understand, what it should do.
And because the program seems to be relatively complex it's
also hard to tear them apart and isolate them.

Two tiny examples:

(1)I'd much prefer if you wrote something like:
    more = raw_input("Would you like to convert more text or numbers [y/n]? ")
    if more in 'Yy':
        again = True # albeit this doesn't change anything, because
                     # if again weren't true you wouldn't get here
    elif  more in "Nn":
        again = False

    (I mean: why use the same name for different things?)

(2) The inner "while loop" in convertxt is a strange construction
    because it contains an unconditional break, which (unconditionally)
    terminates the loop after the first run through it.

   

        while char in alphabet[x]:
            print binary[x]
            break

    I think this should equivavlently better be written as:
   
        if char in alphabet[x]:
            print binary[x]

    (Moreover note, on the other side, that without the break this 
     "while loop" would run indefinitely as there is nothing
     in the loop's body, which changes the condition: once True -
     - forever True

     Additionally: alphabet[x] is invariably a one-character-string,
     so char in alphabet[x] should be equivalent to
     char == alphabet[x] ---  did you think of this or did you 
     intend something completely different?)

I must confess, that i don't fully understand what your program is
intended to do. I would very much appreciate, if you could 
assemble (for instance at first with paper and pencil) a sample-run
of the program with some chracteristic inputs and corresponding
outputs and post it here. Perhaps then I ( and other people on this
list ) could support you with more fruitful hints or
propositions to make it more clear an concise.

Regards, Gregor
 

>here's the code:
>
>def convertxt():
>    x = 0
>    while x <= 25:
>        while char in alphabet[x]:
>            print binary[x]
>            break
>        x += 1
>def convertnum():
>    whichconv = raw_input("""Convert to:
>1: Binary
>2: Hexadecimal
>""")
>    if whichconv in('1','Binary','binary','bin','b'):
>        if char in number:
>            print binary[int(original) - 1]
>    elif whichconv in('2','Hexadecimal','hexadecimal','hexadec','hex','h'):
>        if char in number:
>            print hexadec[int(original) - 1]
>
>
>import time
>
>alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
>binary = ['01','10','11','100','101','110','111','1000','1001','1010','1011','1100','1101','1110','1111','10000','10001','10010','10011','10100','10101','10110','10111','11000','11001','11010','11011','11100','11101','11110','11111','100000','100001','100010','100011','100100','100101','100110','100111','101000','101001','101010','101011','101100','101101','101110','101111','110000','110001','110010','110011','110100','110101','110110','110111','111000','111001','111010','111011','111100','111101','111110','111111','1000000','1000001','1000010','1000011','1000100','1000101','1000110','1000111','1001000','1001001','1001010','1001011','1001100','1001101','1001110','1001111','1010000','1010001','1010010','1010011','1010100','1010101','1010110','1010111','1011000','1011001','1011010','1011011','1011100','1011101','1011110','1011111','1100000','1100001','1100010','1100011','1100100','1100101','1100110','1100111','1101000','1101001','1101010','1101011','1101100','1101101','1101110','1101111','1110000','1110001','1110010','1110011','1110100','1110101','1110110','1110111','1111000','1111001','1111010','1111011','1111100','1111101','1111110','1111111','10000000','10000001','10000010','10000011','10000100','10000101','10000110','10000111','10001000','10001001','10001010','10001011','10001100','10001101','10001110','10001111','10010000','10010001','10010010','10010011','10010100','10010101','10010110','10010111','10011000','10011001','10011010','10011011','10011100','10011101','10011110','10011111','10100000','10100001','10100010','10100011','10100100','10100101','10100110','10100111','10101000','10101001','10101010','10101011','10101100','10101101','10101110','10101111','10110000','10110001','10110010','10110011','10110100','10110101','10110110','10110111','10111000','10111001','10111010','10111011','10111100','10111101','10111110','10111111','11000000','11000001','11000010','11000011','11000100','11000101','11000110','11000111','11001000','11001001','11001010','11001011','11001100','11001101','11001110','11001111','11010000','11010001','11010010','11010011','11010100','11010101','11010110','11010111','11011000','11011001','11011010','11011011','11011100','11011101','11011110','11011111','11100000','11100001','11100010','11100011','11100100','11100101','11100110','11100111','11101000','11101001','11101010','11101011','11101100','11101101','11101110','11101111','11110000','11110001','11110010','11110011','11110100','11110101','11110110','11110111','11111000','11111001','11111010','11111011','11111100','11111101','11111110','11111111']
>number = ['0','1','2','3','4','5','6','7','8','9']
>hexadec = ['1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','10','11','12','13','14','15','16','17','18','19','1A','1B','1C','1D','1E','1F','20','21','22','23','24','25','26','27','28','29','2A','2B','2C','2D','2E','2F','30','31','32','33','33','34','35','36','37','38','39','3A','3B','3C','3D','3E','3F','40','41','42','43','44','45','46','47','48','49','4A','4B','4C','4D','4E','4F','50','51','52','53','54','55','56','57','58','59','5A','5B','5C','5D','5E','5F','60','61','62','63','64','65','66','67','68','69','6A','6B','6C','6D','6E','6F','70','71','72','73','74','75','76','77','78','79','7A','7B','7C','7D','7E','7F','80','81','82','83','84','85','86','87','88','89','8A','8B','8C','8D','8E','8F','90','91','92','93','94','95','96','97','98','99','9A','9B','9C','9D','9E','9F','A1','A2','A3','A4','A5','A6','A7','A8','A9','AA','AB','AC','AD','AE','AF','B0','B1','B2','B3','B4','B5','B6','B7','B8','B9','BA','BB','BC','BD','BE','BF','C0','C1','C2','C3','C4','C5','C6','C7','C8','C9','CA','CB','CC','CD','CE','CF','D0','D1','D2','D3','D4','D5','D6','D7','D8','D9','DA','DB','DC','DD','DE','DF','E0','E1','E2','E3','E4','E5','E6','E7','E8','E9','EA','EB','EC','ED','EE','EF','F0','F1','F2','F3','F4','F5','F6','F7','F8','F9','FA','FB','FC','FD','FE','FF']
>again = True
>while again:
>    original = raw_input("Please enter numbers or text to be converted. ")
>    for char in original:
>        try:
>            int(original)
>        except TypeError:
>            convertxt()
>        except ValueError:
>            convertxt()
>        else:
>            if char in number:
>                convertnum()
>        again = raw_input("Would you like to convert more text or numbers [y/n]? ")
>        if again in 'Yy':
>            again = True
>        elif again in 'Nn':
>            again = False
>print "Thank you for using Multivert.  Multivert will now close"
>time.sleep(1.1)
>import sys
>sys.exit()
>
>if any one has any idea why this happens and how I can fix it, I'd be grateful.
>
>"n thats the way the cookie crumbles"
>
>America's Favorite Cookie
>  
>
>------------------------------------------------------------------------
>
>_______________________________________________
>Tutor maillist  -  Tutor at python.org
>http://mail.python.org/mailman/listinfo/tutor
>  
>



More information about the Tutor mailing list