Hey guys,

thanks for all this help, I now got a clearer picture.
Given the confusion as to the CHAR_MAP I am attaching the entire file.

It comes, btw, out of Jeff McNeil's "Python 2.6 Text Processing" book
(Packt), p. 11.

Happy hacking,

David




On 03/22/2011 06:45 AM, Dave Angel wrote:
> On 01/-10/-28163 02:59 PM, Alex Hall wrote:
>> On 3/21/11, David<[email protected]>  wrote:
>>> Hello list,
>>>
>>> I am having trouble understanding the following function. What trips me
>>> up is the "letter = letter.lower()" line.
>>>
>>> As I understand, the function takes a letter and assigns True to a
>>> letter if it is upper case.
>> No, the function takes a letter and returns that letter in its
>> uppercase form.
>> lr="a"
>> lr.upper() #lr now = A
>> lr.lower() #lr now equals a
>> I should actually say that it takes a string and uppercases any
>> letters in it. It just happens that you are dealing with one letter
>> here.
> 
> Not even close.  The CHAR_MAP is apparently a map from char to char,
> where both are presumably lower-case ones.  My suspicion is the map
> looks like:
> 
>   CHAR_MAP = { "a":"n", "b", "o", ...   "z":"m"}
> 
> The code simply returns its input if it's not represented in the map.
> But if the letter is lowercase, it's just looked up in the map, and the
> result is returned.  if the letter is uppercase, it's changed to
> lowercase, looked up, then changed back to uppercase.
> 
> The code could have been trivial if the map had simply had both lower
> and uppercase entries in it to begin with.  The table would be twice the
> size, but the code would then have been trivial.
> 
> Of course, the maketrans function could have simplified it even more. Or
> you could just use the rot_13 encoder:
> 
>>>> import codecs
>>>> f = codecs.getencoder("rot_13")
>>>> f("Abcde")
> ('Nopqr', 5)
> 
> 
> 
> DaveA
> 
>>>
>>> But then he goes to
>>>
>>> letter = letter.lower()
>>>
>>> and all letters are converted back to lower again!?? The point is that,
>>> to my understanding, the logic follows from the first block to
>>> letter = letter.lower(). Isn't that true?
>>>
>>> Thanks for helping me out,
>>>
>>> David
>>>
>>>
>>> def rotate13_letter(letter):
>>>      """
>>>      Return the 13-char rotation of a letter.
>>>      """
>>>      do_upper = False
>>>      if letter.isupper():
>>>          do_upper = True
>>>
>>>      letter = letter.lower()
>>>      if letter not in CHAR_MAP:
>>>          return letter
>>>
>>>      else:
>>>          letter = CHAR_MAP[letter]
>>>          if do_upper:
>>>              letter = letter.upper()
>>>
>>>      return letter
>>> _______________________________________________
>>> Tutor maillist  -  [email protected]
>>> To unsubscribe or change subscription options:
>>> http://mail.python.org/mailman/listinfo/tutor
>>>
>>
>>
> 
> 

import sys
import string

CHAR_MAP = dict(zip(
    string.ascii_lowercase,
    string.ascii_lowercase[13:26] + string.ascii_lowercase[0:13]
    )
)

def rotate13_letter(letter):
    """
    Return the 13-char rotation of a letter.
    """
    do_upper = False
    if letter.isupper():
        do_upper = True

    letter = letter.lower()
    if letter not in CHAR_MAP:
        return letter

    else:
        letter = CHAR_MAP[letter]
        if do_upper:
            letter = letter.upper()

    return letter

if __name__ == '__main__': # script runs only directly from command line
    for char in sys.argv[1]:
        sys.stdout.write(rotate13_letter(char))
    sys.stdout.write('\n')
_______________________________________________
Tutor maillist  -  [email protected]
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to