Chapter 5 Exercise Set 2

  1. Open a file named ch05warmups.py and make the following doctests pass:

    """
      >>> 13 in junk
      True
      >>> del junk[4]
      >>> junk
      [3, 7, 9, 10, 17, 21, 24, 27]
      >>> del junk[a:b]
      >>> junk
      [3, 7, 27]
    """
    
    """
      >>> nlist[2][1]
      0
      >>> nlist[0][2]
      17
      >>> nlist[1][1]
      5
    """
    
    """
      >>> mystring.split('??')
      ['this', 'and', 'that']
    """
    

    Only a string that appears as the first line in a file is the docstring for that file, and only doctests in that string will run.

    Add the first set of tests to a string at the beginning of the file, make them all pass, then add the second set of tests to the same docstring, make them all pass, and then add the last doctest and make it pass.

    Note

    We will study how this works in much greater detail in the Maps, files, and modules chapter.

Doctest practice set 3

Put the next two exercises in a file named ch05practice3.py.

lots_of_letters

  1. Write a function named lots_of_letters that takes a word (string) as an argument and returns a new string with the first letter once, the second letter twice, the third letter three times, and so forth.

    Your function should pass the following doctests:

    def lots_of_letters(word):
        """
          >>> lots_of_letters('Lidia')
          'Liidddiiiiaaaaa'
          >>> lots_of_letters('Python')
          'Pyyttthhhhooooonnnnnn'
          >>> lots_of_letters('')
          ''
          >>> lots_of_letters('1')
          '1'
        """
    

    What will happen if you pass this function a list or tuple instead of a string? Explain your answer.

seperate_by_type

  1. Write a function named seperate_by_type that takes a list of values of any type and returns a 3-tuple of lists containing the numbers, sequences, and other types from the argument list in the same order in which they originally occurred.

    Your function should pass the following doctests:

    def seperate_by_type(list_of_stuff):
        """
          >>> seperate_by_type([3, 'a', 4.2, None, (1, 2), 'b'])
          ([3, 4.2], ['a', (1, 2), 'b'], [None])
          >>> seperate_by_type([1, 3, 'xyz', 42, (0, 2), 'qwerty', [1, 0], 12])
          ([1, 3, 42, 12], ['xyz', (0, 2), 'qwerty', [1, 0]], [])
          >>> seperate_by_type([])
          ([], [], [])
        """
    

numberlists

  1. Create a new file named numberlists.py and add the following functions to it:

    def only_evens(numbers):
      """
        >>> only_evens([1, 3, 4, 6, 7, 8])
        [4, 6, 8]
        >>> only_evens([2, 4, 6, 8, 10, 11, 0])
        [2, 4, 6, 8, 10, 0]
        >>> only_evens([1, 3, 5, 7, 9, 11])
        []
        >>> only_evens([4, 0, -1, 2, 6, 7, -4])
        [4, 0, 2, 6, -4]
        >>> nums = [1, 2, 3, 4]
        >>> only_evens(nums)
        [2, 4]
        >>> nums
        [1, 2, 3, 4]
      """
    
    def only_odds(numbers):
        """
          >>> only_odds([1, 3, 4, 6, 7, 8])
          [1, 3, 7]
          >>> only_odds([2, 4, 6, 8, 10, 11, 0])
          [11]
          >>> only_odds([1, 3, 5, 7, 9, 11])
          [1, 3, 5, 7, 9, 11]
          >>> only_odds([4, 0, -1, 2, 6, 7, -4])
          [-1, 7]
          >>> nums = [1, 2, 3, 4]
          >>> only_odds(nums)
          [1, 3]
          >>> nums
          [1, 2, 3, 4]
        """
    

    Be sure these new functions pass the doctests.

multiples_of(num, numlist)

  1. Add a function multiples_of(num, numlist) to numberlists.py that takes an integer (num), and a list of integers (numlist) as arguments and returns a list of those integers in numlist that are multiples of num. Add your own doctests and use TDD to develope this function.

s.join(s.split(song) vs. s

  1. Given:

    import string
    
    song = "The rain in Spain..."
    

    Describe the relationship between string.join(string.split(song)) and song. Are they the same for all strings? When would they be different?

replace(s, old, new)

  1. Write a function replace(s, old, new) that replaces all occurences of old with new in a string s.

    def replace(s, old, new):
        """
          >>> replace('Mississippi', 'i', 'I')
          'MIssIssIppI'
          >>> s = 'I love spom!  Spom is my favorite food.  Spom, spom, yum!'
          >>> replace(s, 'om', 'am')
          'I love spam!  Spam is my favorite food.  Spam, spam, spam, yum!'
          >>> replace(s, 'o', 'a')
          'I lave spam!  Spam is my favarite faad.  Spam, spam, spam, yum!'
        """
    

    Hint

    Your solution should pass the doctests above. Hint: use split and join string methods.

Alarm clock

  1. You look at the clock and it is exactly 2 pm. You set an alarm to go off in 51 hours. At what time does the alarm go off?

def will_ring(timenow, hourslater):
    """
    """

Generalized alarm clock

  1. Write a Python program to solve the general version of the above problem. Ask the user for the time now (in hours), and ask for the number of hours to wait. Your program should output what the time will be on the clock when the alarm goes off.

Week days

  1. Assume the days of the week are numbered 0, 1, 2, 3, 4, 5, 6 from Sunday to Saturday. Write a program which is given the day number, and it computes the day name (a string).

Wonderful holiday

  1. You go on a wonderful holiday leaving on day number 3 (a Wednesday). You return home after 137 sleeps. Write a general version of the program which asks for the starting day number, and the length of your stay, and it will tell you the name of day of the week on which you will return.

Greatest Common Factor (GCF)

  1. The greatest common factor of two positive integers, m and n, is the largest positive integer that that will divide both m and n evenly.

    def gcf(m, n):
        """
          >>> gcf(10, 25)
          5
          >>> gcf(8, 12)
          4
          >>> gcf(5, 12)
          1
          >>> gcf(24, 12)
          12
        """
    

    Write a function body for gcf that will make the doctests pass.

    Note

    There is a well known recursive algorithm to solve this problem named after the Greek mathematician who described it in one of his books. Do a web search for this and see if you can use it to solve this problem.