Going Deeper with Strings

Read this for more on strings.

13. Exercises

Exercise 1 

Read the documentation of the string methods at http://docs.python.org/3/library/stdtypes.html#string-methods. 

You might want to experiment with some of them to make sure you understand how they work. strip and replace are particularly useful. 

The documentation uses a syntax that might be confusing. For example, in find(sub[, start[, end]]), the brackets indicate optional arguments. So sub is required, but start is optional, and if you include start, then end is optional. 


Exercise 2 There is a string method called count that is similar to the function in Section 8.7. Read the documentation of this method and write an invocation that counts the number of a’s in 'banana'.


Exercise 3 A string slice can take a third index that specifies the “step size”; that is, the number of spaces between successive characters. A step size of 2 means every other character; 3 means every third, etc.

>>> fruit ='banana' 
>>> fruit[0:5:2] 
'bnn'
A step size of -1 goes through the word backwards, so the slice [::-1] generates a reversed string. Use this idiom to write a one-line version of is_palindrome from Exercise 3. 


Exercise 4 The following functions are all intended to check whether a string contains any lowercase letters, but at least some of them are wrong. For each function, describe what the function actually does (assuming that the parameter is a string).

    
    def any_lowercase1(s):
        for c in s: 
            if c.islower(): 
                return True 
        else: 
                return False 
    
    def any_lowercase2(s): 
        for c in s: 
            if 'c'.islower(): 
                return 'True' 
        else: 
                return 'False' 
  
   def any_lowercase3(s): 
        for c in s: 
            flag = c.islower() 
        return flag
   
   def any_lowercase4(s): 
        flag = False 
        for c in s: 
            flag = flag or c.islower() 
    return flag 
   
   def any_lowercase5(s): 
        for c in s: 
            if not c.islower(): 
                return False 
        return True 


Exercise 5 A Caesar cypher is a weak form of encryption that involves “rotating” each letter by a fixed number of places. To rotate a letter means to shift it through the alphabet, wrapping around to the beginning if necessary, so ’A’ rotated by 3 is ’D’ and ’Z’ rotated by 1 is ’A’. 

To rotate a word, rotate each letter by the same amount. For example, “cheer” rotated by 7 is “jolly” and “melon” rotated by -10 is “cubed”. In the movie 2001: A Space Odyssey, the ship computer is called HAL, which is IBM rotated by -1. 

Write a function called rotate_word that takes a string and an integer as parameters, and returns a new string that contains the letters from the original string rotated by the given amount. 

You might want to use the built-in function ord, which converts a character to a numeric code, and chr, which converts numeric codes to characters. Letters of the alphabet are encoded in alphabetical order, so for example:

 >>> ord('c') - ord('a') 
  2
Because 'c' is the two-eth letter of the alphabet. But beware: the numeric codes for upper case letters are different.

Potentially offensive jokes on the Internet are sometimes encoded in ROT13, which is a Caesar cypher with rotation 13. If you are not easily offended, find and decode some of them.
Solution: http://thinkpython2.com/code/rotate.py.