As usual, create a directory to hold today's files. All programs that you write today should be stored in this directory.
    $ cd ~/cs120/labs
    $ mkdir lab19 
    $ cd lab19 
      Write a function
      called append_exclamation(a_phrase), which
        takes a string as a parameter.  This function should return a
      string, which
        is simply a_phrase with an exclamation point appended
      to the end.
  
    Write a function called get_extents(a_phrase), which
    takes a string as a parameter.  This function should return a
    string, which contains only the first and last characters
    from a_phrase.
  
Passwords are possibly the most important way that individuals can ensure their own safety on the Internet. However, it is also typically the easiest thing for a hacker to figure out, or to get their hands on. This is simply because most Internet users choose incredibly weak passwords. The easiest way to get around this issue to to use a randomly generated password.
  Write a function called generate_password(size), which
  takes a positive integers as a parameter.  Your program should
  return a string of lower case letters of the specified size.  This
  function should randomly choose the lower case letters in the
  returned string.
Your program should ask the user for a password length, and print to the terminal the password you generate.
Make sure you test your program well. How many test cases do you need? Make sure you follow all of the course's coding conventions.
$ python3 password_generation.py How long do you want your password? 5 neolp $ python3 password_generation.py How long do you want your password? 10 wigmnhgqwn
	  Since you only need to generate lower case passwords, you
	  can use the string.ascii_lowercase constant to
	  access letters from that range.
	
	  You can use the random module to generate
	  random numbers.  Since we know we are generating lower-case
	  characters, you need to generate a random number to use as
	  an index in the
	  string.ascii_lowercase string.
	
Since you know how many characters you want, you should use a for loop for this activity. You are also using the accumulator pattern again, but with strings this time.
Even random strings of lowercase characters are pretty easy to break. A better program would randomly decide to include some uppercase letters as well. Alter your function so that it will sometimes include uppercase letters in the generated passwords. Make sure the parameter used to determine how often an uppercase character is used is well documented and easily altered.
Some states require that legal documents not be written above a certain grade level. The Flesch-Kincaid grade level is a numeric score that indicates the minimum grade level in which an average student would be able to understand a text. Writing a function that computes the grade level of text requires being able to count the number of occurrences of certain characters.
  In a file called reading_level.py write the
  function compute_reading_level(text).  The function
  should return the Flesch-Kincaid grade level of the input text.  The
  Flesch-Kincaid grade level equation requires determining the number
  of syllables in a sentence, which is very difficult for a program to
  compute without a dictionary. The following equation is an
  approximation to the Flesch-Kincaid grade level that does not use
  syllables:
$$0.39\cdot(W/S)+11.8\cdot((L/3)/W)-15.59$$
Where \(W\) is the total number of words, \(S\) is the total number of sentences, and \(L\) is the total number of letters. Assume that all sentences end in a period, that all words are separated by a single space, and that all characters that are not a space or period are letters.
| Function Parameters | Expected Output | 
|---|---|
| 'I do not like them Sam I am. I do not like green eggs and ham.' | -1.4075 | 
| 'To be or not to be that is the question. Whether tis nobler in the mind to suffer the slings and arrows of outrageous fortune or to take arms against a sea of troubles and by opposing end them.' | 7.445769230769233 | 
          Determining the number of words requires counting the number
          of space characters and determining the number of sentences
          requires counting the period characters.  Instead of writing
          code to count each of these characters separately,  write a
          function count_character(character, text) that
          counts the number of times character occurs
          in text.  The function should use an
          accumulator variable to count and a for loop to traverse the
          text one character at a time.  For each character in the text
          that is equal to input character, increment the counter.
	
Use the above function to determine the number of words and sentences. Determine the number of letters by using the length of the input text and the number of non-alphabetic characters. Before computing the reading level, test your code by printing the number of words, sentences, and letters on short examples.
The character count function was easy to write because it assumes that the input text only has alphabetic characters, single space characters, and period characters. This isn't very useful because most text does not conform to these restrictions. Modify the function so that it can work for any text. It should: