[
  {
    "path": ".ipynb_checkpoints/Untitled-checkpoint.ipynb",
    "content": "{\n \"cells\": [],\n \"metadata\": {},\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/.ipynb_checkpoints/01-Numbers-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Numbers and more in Python!\\n\",\n    \"\\n\",\n    \"In this lecture, we will learn about numbers in Python and how to use them.\\n\",\n    \"\\n\",\n    \"We'll learn about the following topics:\\n\",\n    \"\\n\",\n    \"    1.) Types of Numbers in Python\\n\",\n    \"    2.) Basic Arithmetic\\n\",\n    \"    3.) Differences between classic division and floor division\\n\",\n    \"    4.) Object Assignment in Python\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Types of numbers\\n\",\n    \"\\n\",\n    \"Python has various \\\"types\\\" of numbers (numeric literals). We'll mainly focus on integers and floating point numbers.\\n\",\n    \"\\n\",\n    \"Integers are just whole numbers, positive or negative. For example: 2 and -2 are examples of integers.\\n\",\n    \"\\n\",\n    \"Floating point numbers in Python are notable because they have a decimal point in them, or use an exponential (e) to define the number. For example 2.0 and -2.1 are examples of floating point numbers. 4E2 (4 times 10 to the power of 2) is also an example of a floating point number in Python.\\n\",\n    \"\\n\",\n    \"Throughout this course we will be mainly working with integers or simple float number types.\\n\",\n    \"\\n\",\n    \"Here is a table of the two main types we will spend most of our time working with some examples:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<table>\\n\",\n    \"<tr>\\n\",\n    \"    <th>Examples</th> \\n\",\n    \"    <th>Number \\\"Type\\\"</th>\\n\",\n    \"</tr>\\n\",\n    \"\\n\",\n    \"<tr>\\n\",\n    \"    <td>1,2,-5,1000</td>\\n\",\n    \"    <td>Integers</td> \\n\",\n    \"</tr>\\n\",\n    \"\\n\",\n    \"<tr>\\n\",\n    \"    <td>1.2,-0.5,2e2,3E2</td> \\n\",\n    \"    <td>Floating-point numbers</td> \\n\",\n    \"</tr>\\n\",\n    \" </table>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \" \\n\",\n    \" \\n\",\n    \"Now let's start with some basic arithmetic.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Basic Arithmetic\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Addition\\n\",\n    \"2+1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Subtraction\\n\",\n    \"2-1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Multiplication\\n\",\n    \"2*2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1.5\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Division\\n\",\n    \"3/2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Floor Division\\n\",\n    \"7//4\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Whoa! What just happened? Last time I checked, 7 divided by 4 equals 1.75 not 1!**\\n\",\n    \"\\n\",\n    \"The reason we get this result is because we are using \\\"*floor*\\\" division. The // operator (two forward slashes) truncates the decimal without rounding, and returns an integer result.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**So what if we just want the remainder after division?**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Modulo\\n\",\n    \"7%4\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"4 goes into 7 once, with a remainder of 3. The % operator returns the remainder after division.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Arithmetic continued\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"8\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Powers\\n\",\n    \"2**3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2.0\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Can also do roots this way\\n\",\n    \"4**0.5\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"105\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Order of Operations followed in Python\\n\",\n    \"2 + 10 * 10 + 3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"156\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Can use parentheses to specify orders\\n\",\n    \"(2+10) * (10+3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Variable Assignments\\n\",\n    \"\\n\",\n    \"Now that we've seen how to use numbers in Python as a calculator let's see how we can assign names and create variables.\\n\",\n    \"\\n\",\n    \"We use a single equals sign to assign labels to variables. Let's see a few examples of how we can do this.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Let's create an object called \\\"a\\\" and assign it the number 5\\n\",\n    \"a = 5\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now if I call *a* in my Python script, Python will treat it as the number 5.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Adding the objects\\n\",\n    \"a+a\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What happens on reassignment? Will Python let us write it over?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Reassignment\\n\",\n    \"a = 10\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"a\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Yes! Python allows you to write over assigned variable names. We can also use the variables themselves when doing the reassignment. Here is an example of what I mean:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"a\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Use A to redefine A\\n\",\n    \"a = a + a\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"20\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check \\n\",\n    \"a\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The names you use when creating these labels need to follow a few rules:\\n\",\n    \"\\n\",\n    \"    1. Names can not start with a number.\\n\",\n    \"    2. There can be no spaces in the name, use _ instead.\\n\",\n    \"    3. Can't use any of these symbols :'\\\",<>/?|\\\\()!@#$%^&*~-+\\n\",\n    \"    4. It's considered best practice (PEP8) that names are lowercase.\\n\",\n    \"    5. Avoid using the characters 'l' (lowercase letter el), 'O' (uppercase letter oh), \\n\",\n    \"       or 'I' (uppercase letter eye) as single character variable names.\\n\",\n    \"    6. Avoid using words that have special meaning in Python like \\\"list\\\" and \\\"str\\\"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Using variable names can be a very useful way to keep track of different variables in Python. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Use object names to keep better track of what's going on in your code!\\n\",\n    \"my_income = 100\\n\",\n    \"\\n\",\n    \"tax_rate = 0.1\\n\",\n    \"\\n\",\n    \"my_taxes = my_income*tax_rate\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10.0\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Show my taxes!\\n\",\n    \"my_taxes\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"So what have we learned? We learned some of the basics of numbers in Python. We also learned how to do arithmetic and use Python as a basic calculator. We then wrapped it up with learning about Variable Assignment in Python.\\n\",\n    \"\\n\",\n    \"Up next we'll learn about Strings!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"anaconda-cloud\": {},\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/.ipynb_checkpoints/01-Variable Assignment-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Variable Assignment\\n\",\n    \"\\n\",\n    \"## Rules for variable names\\n\",\n    \"* names can not start with a number\\n\",\n    \"* names can not contain spaces, use _ intead\\n\",\n    \"* names can not contain any of these symbols:\\n\",\n    \"\\n\",\n    \"      :'\\\",<>/?|\\\\!@#%^&*~-+\\n\",\n    \"       \\n\",\n    \"* it's considered best practice ([PEP8](https://www.python.org/dev/peps/pep-0008/#function-and-variable-names)) that names are lowercase with underscores\\n\",\n    \"* avoid using Python built-in keywords like `list` and `str`\\n\",\n    \"* avoid using the single characters `l` (lowercase letter el), `O` (uppercase letter oh) and `I` (uppercase letter eye) as they can be confused with `1` and `0`\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Dynamic Typing\\n\",\n    \"\\n\",\n    \"Python uses *dynamic typing*, meaning you can reassign variables to different data types. This makes Python very flexible in assigning data types; it differs from other languages that are *statically typed*.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_dogs = 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"my_dogs\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_dogs = ['Sammy', 'Frankie']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['Sammy', 'Frankie']\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"my_dogs\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Pros and Cons of Dynamic Typing\\n\",\n    \"#### Pros of Dynamic Typing\\n\",\n    \"* very easy to work with\\n\",\n    \"* faster development time\\n\",\n    \"\\n\",\n    \"#### Cons of Dynamic Typing\\n\",\n    \"* may result in unexpected bugs!\\n\",\n    \"* you need to be aware of `type()`\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Assigning Variables\\n\",\n    \"Variable assignment follows `name = object`, where a single equals sign `=` is an *assignment operator*\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"a = 5\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"5\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"a\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Here we assigned the integer object `5` to the variable name `a`.<br>Let's assign `a` to something else:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"a = 10\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"a\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can now use `a` in place of the number `10`:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"20\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"a + a\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Reassigning Variables\\n\",\n    \"Python lets you reassign variables with a reference to the same object.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"a = a + 10\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"20\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"a\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There's actually a shortcut for this. Python lets you add, subtract, multiply and divide numbers with reassignment using `+=`, `-=`, `*=`, and `/=`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"a += 10\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"30\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"a\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"a *= 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"60\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"a\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Determining variable type with `type()`\\n\",\n    \"You can check what type of object is assigned to a variable using Python's built-in `type()` function. Common data types include:\\n\",\n    \"* **int** (for integer)\\n\",\n    \"* **float**\\n\",\n    \"* **str** (for string)\\n\",\n    \"* **list**\\n\",\n    \"* **tuple**\\n\",\n    \"* **dict** (for dictionary)\\n\",\n    \"* **set**\\n\",\n    \"* **bool** (for Boolean True/False)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"int\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"type(a)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"a = (1,2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"tuple\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"type(a)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Simple Exercise\\n\",\n    \"This shows how variables make calculations more readable and easier to follow.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_income = 100\\n\",\n    \"tax_rate = 0.1\\n\",\n    \"my_taxes = my_income * tax_rate\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10.0\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"my_taxes\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! You should now understand the basics of variable assignment and reassignment in Python.<br>Up next, we'll learn about strings!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/.ipynb_checkpoints/02-Strings-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Strings\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Strings are used in Python to record text information, such as names. Strings in Python are actually a *sequence*, which basically means Python keeps track of every element in the string as a sequence. For example, Python understands the string \\\"hello' to be a sequence of letters in a specific order. This means we will be able to use indexing to grab particular letters (like the first letter, or the last letter).\\n\",\n    \"\\n\",\n    \"This idea of a sequence is an important one in Python and we will touch upon it later on in the future.\\n\",\n    \"\\n\",\n    \"In this lecture we'll learn about the following:\\n\",\n    \"\\n\",\n    \"    1.) Creating Strings\\n\",\n    \"    2.) Printing Strings\\n\",\n    \"    3.) String Indexing and Slicing\\n\",\n    \"    4.) String Properties\\n\",\n    \"    5.) String Methods\\n\",\n    \"    6.) Print Formatting\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Creating a String\\n\",\n    \"To create a string in Python you need to use either single quotes or double quotes. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'hello'\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Single word\\n\",\n    \"'hello'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'This is also a string'\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Entire phrase \\n\",\n    \"'This is also a string'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'String built with double quotes'\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# We can also use double quote\\n\",\n    \"\\\"String built with double quotes\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"SyntaxError\",\n     \"evalue\": \"invalid syntax (<ipython-input-4-da9a34b3dc31>, line 2)\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;36m  File \\u001b[1;32m\\\"<ipython-input-4-da9a34b3dc31>\\\"\\u001b[1;36m, line \\u001b[1;32m2\\u001b[0m\\n\\u001b[1;33m    ' I'm using single quotes, but this will create an error'\\u001b[0m\\n\\u001b[1;37m        ^\\u001b[0m\\n\\u001b[1;31mSyntaxError\\u001b[0m\\u001b[1;31m:\\u001b[0m invalid syntax\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Be careful with quotes!\\n\",\n    \"' I'm using single quotes, but this will create an error'\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The reason for the error above is because the single quote in <code>I'm</code> stopped the string. You can use combinations of double and single quotes to get the complete statement.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"\\\"Now I'm ready to use the single quotes inside a string!\\\"\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"\\\"Now I'm ready to use the single quotes inside a string!\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now let's learn about printing strings!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Printing a String\\n\",\n    \"\\n\",\n    \"Using Jupyter notebook with just a string in a cell will automatically output strings, but the correct way to display strings in your output is by using a print function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello World'\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# We can simply declare a string\\n\",\n    \"'Hello World'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello World 2'\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Note that we can't output multiple strings this way\\n\",\n    \"'Hello World 1'\\n\",\n    \"'Hello World 2'\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can use a print statement to print a string.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Hello World 1\\n\",\n      \"Hello World 2\\n\",\n      \"Use \\n\",\n      \" to print a new line\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"See what I mean?\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('Hello World 1')\\n\",\n    \"print('Hello World 2')\\n\",\n    \"print('Use \\\\n to print a new line')\\n\",\n    \"print('\\\\n')\\n\",\n    \"print('See what I mean?')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## String Basics\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can also use a function called len() to check the length of a string!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"11\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len('Hello World')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Python's built-in len() function counts all of the characters in the string, including spaces and punctuation.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## String Indexing\\n\",\n    \"We know strings are a sequence, which means Python can use indexes to call parts of the sequence. Let's learn how this works.\\n\",\n    \"\\n\",\n    \"In Python, we use brackets <code>[]</code> after an object to call its index. We should also note that indexing starts at 0 for Python. Let's create a new object called <code>s</code> and then walk through a few examples of indexing.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Assign s as a string\\n\",\n    \"s = 'Hello World'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello World'\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#Check\\n\",\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Hello World\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Print the object\\n\",\n    \"print(s) \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's start indexing!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'H'\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Show first element (in this case a letter)\\n\",\n    \"s[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'e'\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s[1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'l'\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s[2]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can use a <code>:</code> to perform *slicing* which grabs everything up to a designated point. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'ello World'\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Grab everything past the first term all the way to the length of s which is len(s)\\n\",\n    \"s[1:]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello World'\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Note that there is no change to the original s\\n\",\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hel'\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Grab everything UP TO the 3rd index\\n\",\n    \"s[:3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note the above slicing. Here we're telling Python to grab everything from 0 up to 3. It doesn't include the 3rd index. You'll notice this a lot in Python, where statements and are usually in the context of \\\"up to, but not including\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello World'\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#Everything\\n\",\n    \"s[:]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can also use negative indexing to go backwards.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'d'\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Last letter (one index behind 0 so it loops back around)\\n\",\n    \"s[-1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello Worl'\"\n      ]\n     },\n     \"execution_count\": 21,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Grab everything but the last letter\\n\",\n    \"s[:-1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can also use index and slice notation to grab elements of a sequence by a specified step size (the default is 1). For instance we can use two colons in a row and then a number specifying the frequency to grab elements. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello World'\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Grab everything, but go in steps size of 1\\n\",\n    \"s[::1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'HloWrd'\"\n      ]\n     },\n     \"execution_count\": 23,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Grab everything, but go in step sizes of 2\\n\",\n    \"s[::2]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'dlroW olleH'\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# We can use this to print a string backwards\\n\",\n    \"s[::-1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## String Properties\\n\",\n    \"It's important to note that strings have an important property known as *immutability*. This means that once a string is created, the elements within it can not be changed or replaced. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello World'\"\n      ]\n     },\n     \"execution_count\": 25,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"TypeError\",\n     \"evalue\": \"'str' object does not support item assignment\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mTypeError\\u001b[0m                                 Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-26-976942677f11>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      1\\u001b[0m \\u001b[1;31m# Let's try to change the first letter to 'x'\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m----> 2\\u001b[1;33m \\u001b[0ms\\u001b[0m\\u001b[1;33m[\\u001b[0m\\u001b[1;36m0\\u001b[0m\\u001b[1;33m]\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[1;34m'x'\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mTypeError\\u001b[0m: 'str' object does not support item assignment\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Let's try to change the first letter to 'x'\\n\",\n    \"s[0] = 'x'\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice how the error tells us directly what we can't do, change the item assignment!\\n\",\n    \"\\n\",\n    \"Something we *can* do is concatenate strings!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello World'\"\n      ]\n     },\n     \"execution_count\": 27,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello World concatenate me!'\"\n      ]\n     },\n     \"execution_count\": 28,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Concatenate strings!\\n\",\n    \"s + ' concatenate me!'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# We can reassign s completely though!\\n\",\n    \"s = s + ' concatenate me!'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Hello World concatenate me!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(s)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello World concatenate me!'\"\n      ]\n     },\n     \"execution_count\": 31,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can use the multiplication symbol to create repetition!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"letter = 'z'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'zzzzzzzzzz'\"\n      ]\n     },\n     \"execution_count\": 33,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"letter*10\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Basic Built-in String methods\\n\",\n    \"\\n\",\n    \"Objects in Python usually have built-in methods. These methods are functions inside the object (we will learn about these in much more depth later) that can perform actions or commands on the object itself.\\n\",\n    \"\\n\",\n    \"We call methods with a period and then the method name. Methods are in the form:\\n\",\n    \"\\n\",\n    \"object.method(parameters)\\n\",\n    \"\\n\",\n    \"Where parameters are extra arguments we can pass into the method. Don't worry if the details don't make 100% sense right now. Later on we will be creating our own objects and functions!\\n\",\n    \"\\n\",\n    \"Here are some examples of built-in methods in strings:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello World concatenate me!'\"\n      ]\n     },\n     \"execution_count\": 34,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'HELLO WORLD CONCATENATE ME!'\"\n      ]\n     },\n     \"execution_count\": 35,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Upper Case a string\\n\",\n    \"s.upper()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'hello world concatenate me!'\"\n      ]\n     },\n     \"execution_count\": 36,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Lower case\\n\",\n    \"s.lower()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['Hello', 'World', 'concatenate', 'me!']\"\n      ]\n     },\n     \"execution_count\": 37,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Split a string by blank space (this is the default)\\n\",\n    \"s.split()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 38,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['Hello ', 'orld concatenate me!']\"\n      ]\n     },\n     \"execution_count\": 38,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Split by a specific element (doesn't include the element that was split on)\\n\",\n    \"s.split('W')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There are many more methods than the ones covered here. Visit the Advanced String section to find out more!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Print Formatting\\n\",\n    \"\\n\",\n    \"We can use the .format() method to add formatted objects to printed string statements. \\n\",\n    \"\\n\",\n    \"The easiest way to show this is through an example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Insert another string with curly brackets: The inserted string'\"\n      ]\n     },\n     \"execution_count\": 39,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"'Insert another string with curly brackets: {}'.format('The inserted string')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We will revisit this string formatting topic in later sections when we are building our projects!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Next up: Lists!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/.ipynb_checkpoints/03-Print Formatting with Strings-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# String Formatting\\n\",\n    \"\\n\",\n    \"String formatting lets you inject items into a string rather than trying to chain items together using commas or string concatenation. As a quick comparison, consider:\\n\",\n    \"\\n\",\n    \"    player = 'Thomas'\\n\",\n    \"    points = 33\\n\",\n    \"    \\n\",\n    \"    'Last night, '+player+' scored '+str(points)+' points.'  # concatenation\\n\",\n    \"    \\n\",\n    \"    f'Last night, {player} scored {points} points.'          # string formatting\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"There are three ways to perform string formatting.\\n\",\n    \"* The oldest method involves placeholders using the modulo `%` character.\\n\",\n    \"* An improved technique uses the `.format()` string method.\\n\",\n    \"* The newest method, introduced with Python 3.6, uses formatted string literals, called *f-strings*.\\n\",\n    \"\\n\",\n    \"Since you will likely encounter all three versions in someone else's code, we describe each of them here.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Formatting with placeholders\\n\",\n    \"You can use <code>%s</code> to inject strings into your print statements. The modulo `%` is referred to as a \\\"string formatting operator\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"I'm going to inject something here.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(\\\"I'm going to inject %s here.\\\" %'something')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can pass multiple items by placing them inside a tuple after the `%` operator.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"I'm going to inject some text here, and more text here.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(\\\"I'm going to inject %s text here, and %s text here.\\\" %('some','more'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can also pass variable names:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"I'm going to inject some text here, and more text here.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x, y = 'some', 'more'\\n\",\n    \"print(\\\"I'm going to inject %s text here, and %s text here.\\\"%(x,y))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Format conversion methods.\\n\",\n    \"It should be noted that two methods <code>%s</code> and <code>%r</code> convert any python object to a string using two separate methods: `str()` and `repr()`. We will learn more about these functions later on in the course, but you should note that `%r` and `repr()` deliver the *string representation* of the object, including quotation marks and any escape characters.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"He said his name was Fred.\\n\",\n      \"He said his name was 'Fred'.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('He said his name was %s.' %'Fred')\\n\",\n    \"print('He said his name was %r.' %'Fred')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"As another example, `\\\\t` inserts a tab into a string.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"I once caught a fish this \\tbig.\\n\",\n      \"I once caught a fish 'this \\\\tbig'.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('I once caught a fish %s.' %'this \\\\tbig')\\n\",\n    \"print('I once caught a fish %r.' %'this \\\\tbig')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The `%s` operator converts whatever it sees into a string, including integers and floats. The `%d` operator converts numbers to integers first, without rounding. Note the difference below:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"I wrote 3.75 programs today.\\n\",\n      \"I wrote 3 programs today.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('I wrote %s programs today.' %3.75)\\n\",\n    \"print('I wrote %d programs today.' %3.75)   \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Padding and Precision of Floating Point Numbers\\n\",\n    \"Floating point numbers use the format <code>%5.2f</code>. Here, <code>5</code> would be the minimum number of characters the string should contain; these may be padded with whitespace if the entire number does not have this many digits. Next to this, <code>.2f</code> stands for how many numbers to show past the decimal point. Let's see some examples:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Floating point numbers: 13.14\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('Floating point numbers: %5.2f' %(13.144))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Floating point numbers: 13\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('Floating point numbers: %1.0f' %(13.144))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Floating point numbers: 13.14400\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('Floating point numbers: %1.5f' %(13.144))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Floating point numbers:      13.14\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('Floating point numbers: %10.2f' %(13.144))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Floating point numbers:                     13.14\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('Floating point numbers: %25.2f' %(13.144))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"For more information on string formatting with placeholders visit https://docs.python.org/3/library/stdtypes.html#old-string-formatting\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Multiple Formatting\\n\",\n    \"Nothing prohibits using more than one conversion tool in the same print statement:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"First: hi!, Second:  3.14, Third: 'bye!'\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('First: %s, Second: %5.2f, Third: %r' %('hi!',3.1415,'bye!'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Formatting with the `.format()` method\\n\",\n    \"A better way to format objects into your strings for print statements is with the string `.format()` method. The syntax is:\\n\",\n    \"\\n\",\n    \"    'String here {} then also {}'.format('something1','something2')\\n\",\n    \"    \\n\",\n    \"For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"This is a string with an insert\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('This is a string with an {}'.format('insert'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### The .format() method has several advantages over the %s placeholder method:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### 1. Inserted objects can be called by index position:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"The quick brown fox\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('The {2} {1} {0}'.format('fox','brown','quick'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### 2. Inserted objects can be assigned keywords:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"First Object: 1, Second Object: Two, Third Object: 12.3\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('First Object: {a}, Second Object: {b}, Third Object: {c}'.format(a=1,b='Two',c=12.3))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### 3. Inserted objects can be reused, avoiding duplication:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"A penny saved is a penny earned.\\n\",\n      \"A penny saved is a penny earned.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('A %s saved is a %s earned.' %('penny','penny'))\\n\",\n    \"# vs.\\n\",\n    \"print('A {p} saved is a {p} earned.'.format(p='penny'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Alignment, padding and precision with `.format()`\\n\",\n    \"Within the curly braces you can assign field lengths, left/right alignments, rounding parameters and more\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Fruit    | Quantity \\n\",\n      \"Apples   |       3.0\\n\",\n      \"Oranges  |        10\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('{0:8} | {1:9}'.format('Fruit', 'Quantity'))\\n\",\n    \"print('{0:8} | {1:9}'.format('Apples', 3.))\\n\",\n    \"print('{0:8} | {1:9}'.format('Oranges', 10))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"By default, `.format()` aligns text to the left, numbers to the right. You can pass an optional `<`,`^`, or `>` to set a left, center or right alignment:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Left     |  Center  |    Right\\n\",\n      \"11       |    22    |       33\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('{0:<8} | {1:^8} | {2:>8}'.format('Left','Center','Right'))\\n\",\n    \"print('{0:<8} | {1:^8} | {2:>8}'.format(11,22,33))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can precede the aligment operator with a padding character\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Left==== | -Center- | ...Right\\n\",\n      \"11====== | ---22--- | ......33\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('{0:=<8} | {1:-^8} | {2:.>8}'.format('Left','Center','Right'))\\n\",\n    \"print('{0:=<8} | {1:-^8} | {2:.>8}'.format(11,22,33))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Field widths and float precision are handled in a way similar to placeholders. The following two print statements are equivalent:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"This is my ten-character, two-decimal number:     13.58\\n\",\n      \"This is my ten-character, two-decimal number:     13.58\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('This is my ten-character, two-decimal number:%10.2f' %13.579)\\n\",\n    \"print('This is my ten-character, two-decimal number:{0:10.2f}'.format(13.579))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note that there are 5 spaces following the colon, and 5 characters taken up by 13.58, for a total of ten characters.\\n\",\n    \"\\n\",\n    \"For more information on the string `.format()` method visit https://docs.python.org/3/library/string.html#formatstrings\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Formatted String Literals (f-strings)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Introduced in Python 3.6, f-strings offer several benefits over the older `.format()` string method described above. For one, you can bring outside variables immediately into to the string rather than pass them as arguments through `.format(var)`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"He said his name is Fred.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"name = 'Fred'\\n\",\n    \"\\n\",\n    \"print(f\\\"He said his name is {name}.\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Pass `!r` to get the string representation:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"He said his name is 'Fred'\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(f\\\"He said his name is {name!r}\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Float formatting follows `\\\"result: {value:{width}.{precision}}\\\"`\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Where with the `.format()` method you might see `{value:10.4f}`, with f-strings this can become `{value:{10}.{6}}`\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"My 10 character, four decimal number is:   23.4568\\n\",\n      \"My 10 character, four decimal number is:   23.4568\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"num = 23.45678\\n\",\n    \"print(\\\"My 10 character, four decimal number is:{0:10.4f}\\\".format(num))\\n\",\n    \"print(f\\\"My 10 character, four decimal number is:{num:{10}.{6}}\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note that with f-strings, *precision* refers to the total number of digits, not just those following the decimal. This fits more closely with scientific notation and statistical analysis. Unfortunately, f-strings do not pad to the right of the decimal, even if precision allows it:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"My 10 character, four decimal number is:   23.4500\\n\",\n      \"My 10 character, four decimal number is:     23.45\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"num = 23.45\\n\",\n    \"print(\\\"My 10 character, four decimal number is:{0:10.4f}\\\".format(num))\\n\",\n    \"print(f\\\"My 10 character, four decimal number is:{num:{10}.{6}}\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If this becomes important, you can always use `.format()` method syntax inside an f-string:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"My 10 character, four decimal number is:   23.4500\\n\",\n      \"My 10 character, four decimal number is:   23.4500\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"num = 23.45\\n\",\n    \"print(\\\"My 10 character, four decimal number is:{0:10.4f}\\\".format(num))\\n\",\n    \"print(f\\\"My 10 character, four decimal number is:{num:10.4f}\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"For more info on formatted string literals visit https://docs.python.org/3/reference/lexical_analysis.html#f-strings\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"That is the basics of string formatting!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/.ipynb_checkpoints/04-Lists-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Lists\\n\",\n    \"\\n\",\n    \"Earlier when discussing strings we introduced the concept of a *sequence* in Python. Lists can be thought of the most general version of a *sequence* in Python. Unlike strings, they are mutable, meaning the elements inside a list can be changed!\\n\",\n    \"\\n\",\n    \"In this section we will learn about:\\n\",\n    \"    \\n\",\n    \"    1.) Creating lists\\n\",\n    \"    2.) Indexing and Slicing Lists\\n\",\n    \"    3.) Basic List Methods\\n\",\n    \"    4.) Nesting Lists\\n\",\n    \"    5.) Introduction to List Comprehensions\\n\",\n    \"\\n\",\n    \"Lists are constructed with brackets [] and commas separating every element in the list.\\n\",\n    \"\\n\",\n    \"Let's go ahead and see how we can construct lists!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Assign a list to an variable named my_list\\n\",\n    \"my_list = [1,2,3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We just created a list of integers, but lists can actually hold different object types. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_list = ['A string',23,100.232,'o']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Just like strings, the len() function will tell you how many items are in the sequence of the list.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(my_list)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Indexing and Slicing\\n\",\n    \"Indexing and slicing work just like in strings. Let's make a new list to remind ourselves of how this works:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_list = ['one','two','three',4,5]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'one'\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Grab element at index 0\\n\",\n    \"my_list[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['two', 'three', 4, 5]\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Grab index 1 and everything past it\\n\",\n    \"my_list[1:]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['one', 'two', 'three']\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Grab everything UP TO index 3\\n\",\n    \"my_list[:3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can also use + to concatenate lists, just like we did for strings.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['one', 'two', 'three', 4, 5, 'new item']\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"my_list + ['new item']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note: This doesn't actually change the original list!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['one', 'two', 'three', 4, 5]\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"my_list\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You would have to reassign the list to make the change permanent.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Reassign\\n\",\n    \"my_list = my_list + ['add new item permanently']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['one', 'two', 'three', 4, 5, 'add new item permanently']\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"my_list\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can also use the * for a duplication method similar to strings:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['one',\\n\",\n       \" 'two',\\n\",\n       \" 'three',\\n\",\n       \" 4,\\n\",\n       \" 5,\\n\",\n       \" 'add new item permanently',\\n\",\n       \" 'one',\\n\",\n       \" 'two',\\n\",\n       \" 'three',\\n\",\n       \" 4,\\n\",\n       \" 5,\\n\",\n       \" 'add new item permanently']\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Make the list double\\n\",\n    \"my_list * 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['one', 'two', 'three', 4, 5, 'add new item permanently']\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Again doubling not permanent\\n\",\n    \"my_list\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Basic List Methods\\n\",\n    \"\\n\",\n    \"If you are familiar with another programming language, you might start to draw parallels between arrays in another language and lists in Python. Lists in Python however, tend to be more flexible than arrays in other languages for a two good reasons: they have no fixed size (meaning we don't have to specify how big a list will be), and they have no fixed type constraint (like we've seen above).\\n\",\n    \"\\n\",\n    \"Let's go ahead and explore some more special methods for lists:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Create a new list\\n\",\n    \"list1 = [1,2,3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Use the **append** method to permanently add an item to the end of a list:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Append\\n\",\n    \"list1.append('append me!')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 3, 'append me!']\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Show\\n\",\n    \"list1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Use **pop** to \\\"pop off\\\" an item from the list. By default pop takes off the last index, but you can also specify which index to pop off. Let's see an example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Pop off the 0 indexed item\\n\",\n    \"list1.pop(0)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[2, 3, 'append me!']\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Show\\n\",\n    \"list1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Assign the popped element, remember default popped index is -1\\n\",\n    \"popped_item = list1.pop()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'append me!'\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"popped_item\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[2, 3]\"\n      ]\n     },\n     \"execution_count\": 21,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Show remaining list\\n\",\n    \"list1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"It should also be noted that lists indexing will return an error if there is no element at that index. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"IndexError\",\n     \"evalue\": \"list index out of range\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mIndexError\\u001b[0m                                Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-22-af6d2015fa1f>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mlist1\\u001b[0m\\u001b[1;33m[\\u001b[0m\\u001b[1;36m100\\u001b[0m\\u001b[1;33m]\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mIndexError\\u001b[0m: list index out of range\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"list1[100]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can use the **sort** method and the **reverse** methods to also effect your lists:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"new_list = ['a','e','x','b','c']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['a', 'e', 'x', 'b', 'c']\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#Show\\n\",\n    \"new_list\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Use reverse to reverse order (this is permanent!)\\n\",\n    \"new_list.reverse()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['c', 'b', 'x', 'e', 'a']\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"new_list\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Use sort to sort the list (in this case alphabetical order, but for numbers it will go ascending)\\n\",\n    \"new_list.sort()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['a', 'b', 'c', 'e', 'x']\"\n      ]\n     },\n     \"execution_count\": 28,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"new_list\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Nesting Lists\\n\",\n    \"A great feature of of Python data structures is that they support *nesting*. This means we can have data structures within data structures. For example: A list inside a list.\\n\",\n    \"\\n\",\n    \"Let's see how this works!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Let's make three lists\\n\",\n    \"lst_1=[1,2,3]\\n\",\n    \"lst_2=[4,5,6]\\n\",\n    \"lst_3=[7,8,9]\\n\",\n    \"\\n\",\n    \"# Make a list of lists to form a matrix\\n\",\n    \"matrix = [lst_1,lst_2,lst_3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[[1, 2, 3], [4, 5, 6], [7, 8, 9]]\"\n      ]\n     },\n     \"execution_count\": 30,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Show\\n\",\n    \"matrix\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can again use indexing to grab elements, but now there are two levels for the index. The items in the matrix object, and then the items inside that list!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 3]\"\n      ]\n     },\n     \"execution_count\": 31,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Grab first item in matrix object\\n\",\n    \"matrix[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 32,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Grab first item of the first item in the matrix object\\n\",\n    \"matrix[0][0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# List Comprehensions\\n\",\n    \"Python has an advanced feature called list comprehensions. They allow for quick construction of lists. To fully understand list comprehensions we need to understand for loops. So don't worry if you don't completely understand this section, and feel free to just skip it since we will return to this topic later.\\n\",\n    \"\\n\",\n    \"But in case you want to know now, here are a few examples!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Build a list comprehension by deconstructing a for loop within a []\\n\",\n    \"first_col = [row[0] for row in matrix]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 4, 7]\"\n      ]\n     },\n     \"execution_count\": 34,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"first_col\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We used a list comprehension here to grab the first element of every row in the matrix object. We will cover this in much more detail later on!\\n\",\n    \"\\n\",\n    \"For more advanced methods and features of lists in Python, check out the Advanced Lists section later on in this course!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/.ipynb_checkpoints/05-Dictionaries-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Dictionaries\\n\",\n    \"\\n\",\n    \"We've been learning about *sequences* in Python but now we're going to switch gears and learn about *mappings* in Python. If you're familiar with other languages you can think of these Dictionaries as hash tables. \\n\",\n    \"\\n\",\n    \"This section will serve as a brief introduction to dictionaries and consist of:\\n\",\n    \"\\n\",\n    \"    1.) Constructing a Dictionary\\n\",\n    \"    2.) Accessing objects from a dictionary\\n\",\n    \"    3.) Nesting Dictionaries\\n\",\n    \"    4.) Basic Dictionary Methods\\n\",\n    \"\\n\",\n    \"So what are mappings? Mappings are a collection of objects that are stored by a *key*, unlike a sequence that stored objects by their relative position. This is an important distinction, since mappings won't retain order since they have objects defined by a key.\\n\",\n    \"\\n\",\n    \"A Python dictionary consists of a key and then an associated value. That value can be almost any Python object.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"## Constructing a Dictionary\\n\",\n    \"Let's see how we can construct dictionaries to get a better understanding of how they work!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Make a dictionary with {} and : to signify a key and a value\\n\",\n    \"my_dict = {'key1':'value1','key2':'value2'}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'value2'\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Call values by their key\\n\",\n    \"my_dict['key2']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Its important to note that dictionaries are very flexible in the data types they can hold. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_dict = {'key1':123,'key2':[12,23,33],'key3':['item0','item1','item2']}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['item0', 'item1', 'item2']\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Let's call items from the dictionary\\n\",\n    \"my_dict['key3']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'item0'\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Can call an index on that value\\n\",\n    \"my_dict['key3'][0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'ITEM0'\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Can then even call methods on that value\\n\",\n    \"my_dict['key3'][0].upper()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can affect the values of a key as well. For instance:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"123\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"my_dict['key1']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Subtract 123 from the value\\n\",\n    \"my_dict['key1'] = my_dict['key1'] - 123\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#Check\\n\",\n    \"my_dict['key1']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"A quick note, Python has a built-in method of doing a self subtraction or addition (or multiplication or division). We could have also used += or -= for the above statement. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"-123\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Set the object equal to itself minus 123 \\n\",\n    \"my_dict['key1'] -= 123\\n\",\n    \"my_dict['key1']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can also create keys by assignment. For instance if we started off with an empty dictionary, we could continually add to it:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Create a new dictionary\\n\",\n    \"d = {}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Create a new key through assignment\\n\",\n    \"d['animal'] = 'Dog'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Can do this with any object\\n\",\n    \"d['answer'] = 42\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'animal': 'Dog', 'answer': 42}\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#Show\\n\",\n    \"d\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Nesting with Dictionaries\\n\",\n    \"\\n\",\n    \"Hopefully you're starting to see how powerful Python is with its flexibility of nesting objects and calling methods on them. Let's see a dictionary nested inside a dictionary:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Dictionary nested inside a dictionary nested inside a dictionary\\n\",\n    \"d = {'key1':{'nestkey':{'subnestkey':'value'}}}\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Wow! That's a quite the inception of dictionaries! Let's see how we can grab that value:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'value'\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Keep calling the keys\\n\",\n    \"d['key1']['nestkey']['subnestkey']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## A few Dictionary Methods\\n\",\n    \"\\n\",\n    \"There are a few methods we can call on a dictionary. Let's get a quick introduction to a few of them:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Create a typical dictionary\\n\",\n    \"d = {'key1':1,'key2':2,'key3':3}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"dict_keys(['key1', 'key2', 'key3'])\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Method to return a list of all keys \\n\",\n    \"d.keys()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"dict_values([1, 2, 3])\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Method to grab all values\\n\",\n    \"d.values()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"dict_items([('key1', 1), ('key2', 2), ('key3', 3)])\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Method to return tuples of all items  (we'll learn about tuples soon)\\n\",\n    \"d.items()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Hopefully you now have a good basic understanding how to construct dictionaries. There's a lot more to go into here, but we will revisit dictionaries at later time. After this section all you need to know is how to create a dictionary and how to retrieve values from it.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/.ipynb_checkpoints/06-Tuples-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Tuples\\n\",\n    \"\\n\",\n    \"In Python tuples are very similar to lists, however, unlike lists they are *immutable* meaning they can not be changed. You would use tuples to present things that shouldn't be changed, such as days of the week, or dates on a calendar. \\n\",\n    \"\\n\",\n    \"In this section, we will get a brief overview of the following:\\n\",\n    \"\\n\",\n    \"    1.) Constructing Tuples\\n\",\n    \"    2.) Basic Tuple Methods\\n\",\n    \"    3.) Immutability\\n\",\n    \"    4.) When to Use Tuples\\n\",\n    \"\\n\",\n    \"You'll have an intuition of how to use tuples based on what you've learned about lists. We can treat them very similarly with the major distinction being that tuples are immutable.\\n\",\n    \"\\n\",\n    \"## Constructing Tuples\\n\",\n    \"\\n\",\n    \"The construction of a tuples use () with elements separated by commas. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Create a tuple\\n\",\n    \"t = (1,2,3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check len just like a list\\n\",\n    \"len(t)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"('one', 2)\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Can also mix object types\\n\",\n    \"t = ('one',2)\\n\",\n    \"\\n\",\n    \"# Show\\n\",\n    \"t\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'one'\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Use indexing just like we did in lists\\n\",\n    \"t[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Slicing just like a list\\n\",\n    \"t[-1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Basic Tuple Methods\\n\",\n    \"\\n\",\n    \"Tuples have built-in methods, but not as many as lists do. Let's look at two of them:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Use .index to enter a value and return the index\\n\",\n    \"t.index('one')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Use .count to count the number of times a value appears\\n\",\n    \"t.count('one')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Immutability\\n\",\n    \"\\n\",\n    \"It can't be stressed enough that tuples are immutable. To drive that point home:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"TypeError\",\n     \"evalue\": \"'tuple' object does not support item assignment\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mTypeError\\u001b[0m                                 Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-8-1257c0aa9edd>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mt\\u001b[0m\\u001b[1;33m[\\u001b[0m\\u001b[1;36m0\\u001b[0m\\u001b[1;33m]\\u001b[0m\\u001b[1;33m=\\u001b[0m \\u001b[1;34m'change'\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mTypeError\\u001b[0m: 'tuple' object does not support item assignment\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"t[0]= 'change'\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Because of this immutability, tuples can't grow. Once a tuple is made we can not add to it.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"AttributeError\",\n     \"evalue\": \"'tuple' object has no attribute 'append'\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mAttributeError\\u001b[0m                            Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-9-b75f5b09ac19>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mt\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mappend\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;34m'nope'\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mAttributeError\\u001b[0m: 'tuple' object has no attribute 'append'\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"t.append('nope')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## When to use Tuples\\n\",\n    \"\\n\",\n    \"You may be wondering, \\\"Why bother using tuples when they have fewer available methods?\\\" To be honest, tuples are not used as often as lists in programming, but are used when immutability is necessary. If in your program you are passing around an object and need to make sure it does not get changed, then a tuple becomes your solution. It provides a convenient source of data integrity.\\n\",\n    \"\\n\",\n    \"You should now be able to create and use tuples in your programming as well as have an understanding of their immutability.\\n\",\n    \"\\n\",\n    \"Up next Files!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/.ipynb_checkpoints/07-Sets and Booleans-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Set and Booleans\\n\",\n    \"\\n\",\n    \"There are two other object types in Python that we should quickly cover: Sets and Booleans. \\n\",\n    \"\\n\",\n    \"## Sets\\n\",\n    \"\\n\",\n    \"Sets are an unordered collection of *unique* elements. We can construct them by using the set() function. Let's go ahead and make a set to see how it works\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"x = set()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# We add to sets with the add() method\\n\",\n    \"x.add(1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1}\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#Show\\n\",\n    \"x\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note the curly brackets. This does not indicate a dictionary! Although you can draw analogies as a set being a dictionary with only keys.\\n\",\n    \"\\n\",\n    \"We know that a set has only unique entries. So what happens when we try to add something that is already in a set?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Add a different element\\n\",\n    \"x.add(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2}\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#Show\\n\",\n    \"x\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Try to add the same element\\n\",\n    \"x.add(1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2}\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#Show\\n\",\n    \"x\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice how it won't place another 1 there. That's because a set is only concerned with unique elements! We can cast a list with multiple repeat elements to a set to get the unique elements. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Create a list with repeats\\n\",\n    \"list1 = [1,1,2,2,3,4,5,6,1,1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 3, 4, 5, 6}\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Cast as set to get unique values\\n\",\n    \"set(list1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Booleans\\n\",\n    \"\\n\",\n    \"Python  comes with Booleans (with predefined True and False displays that are basically just the integers 1 and 0). It also has a placeholder object called None. Let's walk through a few quick examples of Booleans (we will dive deeper into them later in this course).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Set object to be a boolean\\n\",\n    \"a = True\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#Show\\n\",\n    \"a\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can also use comparison operators to create booleans. We will go over all the comparison operators later on in the course.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Output is boolean\\n\",\n    \"1 > 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can use None as a placeholder for an object that we don't want to reassign yet:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# None placeholder\\n\",\n    \"b = None\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Show\\n\",\n    \"print(b)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Thats it! You should now have a basic understanding of Python objects and data structure types. Next, go ahead and do the assessment test!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/.ipynb_checkpoints/08-Files-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Files\\n\",\n    \"\\n\",\n    \"Python uses file objects to interact with external files on your computer. These file objects can be any sort of file you have on your computer, whether it be an audio file, a text file, emails, Excel documents, etc. Note: You will probably need to install certain libraries or modules to interact with those various file types, but they are easily available. (We will cover downloading modules later on in the course).\\n\",\n    \"\\n\",\n    \"Python has a built-in open function that allows us to open and play with basic file types. First we will need a file though. We're going to use some IPython magic to create a text file!\\n\",\n    \"\\n\",\n    \"## IPython Writing a File \\n\",\n    \"#### This function is specific to jupyter notebooks! Alternatively, quickly create a simple .txt file with sublime text editor.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Overwriting test.txt\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%writefile test.txt\\n\",\n    \"Hello, this is a quick test file.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Python Opening a file\\n\",\n    \"\\n\",\n    \"Let's being by opening the file test.txt that is located in the same directory as this notebook. For now we will work with files located in the same directory as the notebook or .py script you are using.\\n\",\n    \"\\n\",\n    \"It is very easy to get an error on this step:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"FileNotFoundError\",\n     \"evalue\": \"[Errno 2] No such file or directory: 'whoops.txt'\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mFileNotFoundError\\u001b[0m                         Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-1-dafe28ee473f>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mmyfile\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[0mopen\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;34m'whoops.txt'\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mFileNotFoundError\\u001b[0m: [Errno 2] No such file or directory: 'whoops.txt'\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"myfile = open('whoops.txt')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"To avoid this error,make sure your .txt file is saved in the same location as your notebook, to check your notebook location, use **pwd**:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\00-Python Object and Data Structure Basics'\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"pwd\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Alternatively, to grab files from any location on your computer, simply pass in the entire file path. **\\n\",\n    \"\\n\",\n    \"For Windows you need to use double \\\\ so python doesn't treat the second \\\\ as an escape character, a file path is in the form:\\n\",\n    \"\\n\",\n    \"    myfile = open(\\\"C:\\\\\\\\Users\\\\\\\\YourUserName\\\\\\\\Home\\\\\\\\Folder\\\\\\\\myfile.txt\\\")\\n\",\n    \"\\n\",\n    \"For MacOS and Linux you use slashes in the opposite direction:\\n\",\n    \"\\n\",\n    \"    myfile = open(\\\"/Users/YouUserName/Folder/myfile.txt\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Open the text.txt we made earlier\\n\",\n    \"my_file = open('test.txt')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello, this is a quick test file.'\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# We can now read the file\\n\",\n    \"my_file.read()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"''\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# But what happens if we try to read it again?\\n\",\n    \"my_file.read()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This happens because you can imagine the reading \\\"cursor\\\" is at the end of the file after having read it. So there is nothing left to read. We can reset the \\\"cursor\\\" like this:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Seek to the start of file (index 0)\\n\",\n    \"my_file.seek(0)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello, this is a quick test file.'\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Now read again\\n\",\n    \"my_file.read()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can read a file line by line using the readlines method. Use caution with large files, since everything will be held in memory. We will learn how to iterate over large files later in the course.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['Hello, this is a quick test file.']\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Readlines returns a list of the lines in the file\\n\",\n    \"my_file.seek(0)\\n\",\n    \"my_file.readlines()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"When you have finished using a file, it is always good practice to close it.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_file.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Writing to a File\\n\",\n    \"\\n\",\n    \"By default, the `open()` function will only allow us to read the file. We need to pass the argument `'w'` to write over the file. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Add a second argument to the function, 'w' which stands for write.\\n\",\n    \"# Passing 'w+' lets us read and write to the file\\n\",\n    \"\\n\",\n    \"my_file = open('test.txt','w+')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### <strong><font color='red'>Use caution!</font></strong> \\n\",\n    \"Opening a file with `'w'` or `'w+'` truncates the original, meaning that anything that was in the original file **is deleted**!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"18\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Write to the file\\n\",\n    \"my_file.write('This is a new line')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'This is a new line'\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Read the file\\n\",\n    \"my_file.seek(0)\\n\",\n    \"my_file.read()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_file.close()  # always do this when you're done with a file\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Appending to a File\\n\",\n    \"Passing the argument `'a'` opens the file and puts the pointer at the end, so anything written is appended. Like `'w+'`, `'a+'` lets us read and write to a file. If the file does not exist, one will be created.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"23\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"my_file = open('test.txt','a+')\\n\",\n    \"my_file.write('\\\\nThis is text being appended to test.txt')\\n\",\n    \"my_file.write('\\\\nAnd another line here.')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"This is a new line\\n\",\n      \"This is text being appended to test.txt\\n\",\n      \"And another line here.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"my_file.seek(0)\\n\",\n    \"print(my_file.read())\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_file.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Appending with `%%writefile`\\n\",\n    \"We can do the same thing using IPython cell magic:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Appending to test.txt\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%writefile -a test.txt\\n\",\n    \"\\n\",\n    \"This is text being appended to test.txt\\n\",\n    \"And another line here.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Add a blank space if you want the first line to begin on its own line, as Jupyter won't recognize escape sequences like `\\\\n`\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Iterating through a File\\n\",\n    \"\\n\",\n    \"Lets get a quick preview of a for loop by iterating over a text file. First let's make a new text file with some IPython Magic:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Overwriting test.txt\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%writefile test.txt\\n\",\n    \"First Line\\n\",\n    \"Second Line\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we can use a little bit of flow to tell the program to for through every line of the file and do something:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"First Line\\n\",\n      \"\\n\",\n      \"Second Line\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for line in open('test.txt'):\\n\",\n    \"    print(line)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Don't worry about fully understanding this yet, for loops are coming up soon. But we'll break down what we did above. We said that for every line in this text file, go ahead and print that line. It's important to note a few things here:\\n\",\n    \"\\n\",\n    \"1. We could have called the \\\"line\\\" object anything (see example below).\\n\",\n    \"2. By not calling `.read()` on the file, the whole text file was not stored in memory.\\n\",\n    \"3. Notice the indent on the second line for print. This whitespace is required in Python.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"First Line\\n\",\n      \"\\n\",\n      \"Second Line\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Pertaining to the first point above\\n\",\n    \"for asdf in open('test.txt'):\\n\",\n    \"    print(asdf)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We'll learn a lot more about this later, but up next: Sets and Booleans!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/.ipynb_checkpoints/09-Objects and Data Structures Assessment Test-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\\n\",\n    \"# Objects and Data Structures Assessment Test\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## Test your knowledge. \\n\",\n    \"\\n\",\n    \"** Answer the following questions **\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"Write (or just say out loud to yourself) a brief description of all the following Object Types and Data Structures we've learned about. You can edit the cell below by double clicking on it. Really this is just to test if you know the difference between these, so feel free to just think about it, since your answers are self-graded.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Double Click HERE to edit this markdown cell and write answers.\\n\",\n    \"\\n\",\n    \"Numbers:\\n\",\n    \"\\n\",\n    \"Strings:\\n\",\n    \"\\n\",\n    \"Lists:\\n\",\n    \"\\n\",\n    \"Tuples:\\n\",\n    \"\\n\",\n    \"Dictionaries:\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Numbers\\n\",\n    \"\\n\",\n    \"Write an equation that uses multiplication, division, an exponent, addition, and subtraction that is equal to 100.25.\\n\",\n    \"\\n\",\n    \"Hint: This is just to test your memory of the basic arithmetic commands, work backwards from 100.25\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Answer these 3 questions without typing code. Then type code to check your answer.\\n\",\n    \"\\n\",\n    \"    What is the value of the expression 4 * (6 + 5)\\n\",\n    \"    \\n\",\n    \"    What is the value of the expression 4 * 6 + 5 \\n\",\n    \"    \\n\",\n    \"    What is the value of the expression 4 + 6 * 5 \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What is the *type* of the result of the expression 3 + 1.5 + 4?<br><br>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What would you use to find a number’s square root, as well as its square? \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Square root:\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Square:\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Strings\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Given the string 'hello' give an index command that returns 'e'. Enter your code in the cell below:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"s = 'hello'\\n\",\n    \"# Print out 'e' using indexing\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Reverse the string 'hello' using slicing:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"s ='hello'\\n\",\n    \"# Reverse the string using slicing\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Given the string hello, give two methods of producing the letter 'o' using indexing.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"s ='hello'\\n\",\n    \"# Print out the 'o'\\n\",\n    \"\\n\",\n    \"# Method 1:\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Method 2:\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Lists\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Build this list [0,0,0] two separate ways.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Method 1:\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Method 2:\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Reassign 'hello' in this nested list to say 'goodbye' instead:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"list3 = [1,2,[3,4,'hello']]\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Sort the list below:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"list4 = [5,3,4,6,1]\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Dictionaries\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Using keys and indexing, grab the 'hello' from the following dictionaries:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"d = {'simple_key':'hello'}\\n\",\n    \"# Grab 'hello'\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"d = {'k1':{'k2':'hello'}}\\n\",\n    \"# Grab 'hello'\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Getting a little tricker\\n\",\n    \"d = {'k1':[{'nest_key':['this is deep',['hello']]}]}\\n\",\n    \"\\n\",\n    \"#Grab hello\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# This will be hard and annoying!\\n\",\n    \"d = {'k1':[1,2,{'k2':['this is tricky',{'tough':[1,2,['hello']]}]}]}\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Can you sort a dictionary? Why or why not?<br><br>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Tuples\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What is the major difference between tuples and lists?<br><br>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"How do you create a tuple?<br><br>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Sets \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What is unique about a set?<br><br>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Use a set to find the unique values of the list below:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"list5 = [1,2,2,33,4,4,11,22,3,3,2]\\n\",\n    \"\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Booleans\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"For the following quiz questions, we will get a preview of comparison operators. In the table below, a=3 and b=4.\\n\",\n    \"\\n\",\n    \"<table class=\\\"table table-bordered\\\">\\n\",\n    \"<tr>\\n\",\n    \"<th style=\\\"width:10%\\\">Operator</th><th style=\\\"width:45%\\\">Description</th><th>Example</th>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>==</td>\\n\",\n    \"<td>If the values of two operands are equal, then the condition becomes true.</td>\\n\",\n    \"<td> (a == b) is not true.</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>!=</td>\\n\",\n    \"<td>If values of two operands are not equal, then condition becomes true.</td>\\n\",\n    \"<td> (a != b) is true.</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&gt;</td>\\n\",\n    \"<td>If the value of left operand is greater than the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &gt; b) is not true.</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&lt;</td>\\n\",\n    \"<td>If the value of left operand is less than the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &lt; b) is true.</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&gt;=</td>\\n\",\n    \"<td>If the value of left operand is greater than or equal to the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &gt;= b) is not true. </td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&lt;=</td>\\n\",\n    \"<td>If the value of left operand is less than or equal to the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &lt;= b) is true. </td>\\n\",\n    \"</tr>\\n\",\n    \"</table>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What will be the resulting Boolean of the following pieces of code (answer fist then check by typing it in!)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Answer before running cell\\n\",\n    \"2 > 3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Answer before running cell\\n\",\n    \"3 <= 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Answer before running cell\\n\",\n    \"3 == 2.0\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Answer before running cell\\n\",\n    \"3.0 == 3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Answer before running cell\\n\",\n    \"4**0.5 != 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Final Question: What is the boolean output of the cell block below?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# two nested lists\\n\",\n    \"l_one = [1,2,[3,4]]\\n\",\n    \"l_two = [1,2,{'k1':4}]\\n\",\n    \"\\n\",\n    \"# True or False?\\n\",\n    \"l_one[2][0] >= l_two[2]['k1']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Great Job on your first assessment! \"\n   ]\n  }\n ],\n \"metadata\": {\n  \"anaconda-cloud\": {},\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/.ipynb_checkpoints/10-Objects and Data Structures Assessment Test-Solution-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\\n\",\n    \"\\n\",\n    \"# Objects and Data Structures Assessment Test\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## Test your knowledge. \\n\",\n    \"\\n\",\n    \"** Answer the following questions **\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"Write a brief description of all the following Object Types and Data Structures we've learned about: \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**For the full answers, review the Jupyter notebook introductions of each topic!**\\n\",\n    \"\\n\",\n    \"[Numbers](http://nbviewer.ipython.org/github/jmportilla/Complete-Python-Bootcamp/blob/master/Numbers.ipynb)\\n\",\n    \"\\n\",\n    \"[Strings](http://nbviewer.ipython.org/github/jmportilla/Complete-Python-Bootcamp/blob/master/Strings.ipynb)\\n\",\n    \"\\n\",\n    \"[Lists](http://nbviewer.ipython.org/github/jmportilla/Complete-Python-Bootcamp/blob/master/Lists.ipynb)\\n\",\n    \"\\n\",\n    \"[Tuples](http://nbviewer.ipython.org/github/jmportilla/Complete-Python-Bootcamp/blob/master/Tuples.ipynb)\\n\",\n    \"\\n\",\n    \"[Dictionaries](http://nbviewer.ipython.org/github/jmportilla/Complete-Python-Bootcamp/blob/master/Dictionaries.ipynb)\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Numbers\\n\",\n    \"\\n\",\n    \"Write an equation that uses multiplication, division, an exponent, addition, and subtraction that is equal to 100.25.\\n\",\n    \"\\n\",\n    \"Hint: This is just to test your memory of the basic arithmetic commands, work backwards from 100.25\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"100.25\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Your answer is probably different\\n\",\n    \"(60 + (10 ** 2) / 4 * 7) - 134.75\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Answer these 3 questions without typing code. Then type code to check your answer.\\n\",\n    \"\\n\",\n    \"    What is the value of the expression 4 * (6 + 5)\\n\",\n    \"    \\n\",\n    \"    What is the value of the expression 4 * 6 + 5 \\n\",\n    \"    \\n\",\n    \"    What is the value of the expression 4 + 6 * 5 \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"44\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"4 * (6 + 5)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"29\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"4 * 6 + 5 \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"34\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"4 + 6 * 5 \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What is the *type* of the result of the expression 3 + 1.5 + 4?\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Answer: Floating Point Number**\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What would you use to find a number’s square root, as well as its square? \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10.0\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Square root:\\n\",\n    \"100 ** 0.5\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"100\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Square:\\n\",\n    \"10 ** 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Strings\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Given the string 'hello' give an index command that returns 'e'. Enter your code in the cell below:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'e'\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s = 'hello'\\n\",\n    \"# Print out 'e' using indexing\\n\",\n    \"\\n\",\n    \"s[1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Reverse the string 'hello' using slicing:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'olleh'\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s ='hello'\\n\",\n    \"# Reverse the string using slicing\\n\",\n    \"\\n\",\n    \"s[::-1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Given the string 'hello', give two methods of producing the letter 'o' using indexing.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'o'\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s ='hello'\\n\",\n    \"# Print out the 'o'\\n\",\n    \"\\n\",\n    \"# Method 1:\\n\",\n    \"\\n\",\n    \"s[-1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'o'\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Method 2:\\n\",\n    \"\\n\",\n    \"s[4]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Lists\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Build this list [0,0,0] two separate ways.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 0, 0]\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Method 1:\\n\",\n    \"[0]*3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 0, 0]\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Method 2:\\n\",\n    \"list2 = [0,0,0]\\n\",\n    \"list2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Reassign 'hello' in this nested list to say 'goodbye' instead:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"list3 = [1,2,[3,4,'hello']]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"list3[2][2] = 'goodbye'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, [3, 4, 'goodbye']]\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list3\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Sort the list below:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"list4 = [5,3,4,6,1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 3, 4, 5, 6]\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Method 1:\\n\",\n    \"sorted(list4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 3, 4, 5, 6]\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Method 2:\\n\",\n    \"list4.sort()\\n\",\n    \"list4\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Dictionaries\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Using keys and indexing, grab the 'hello' from the following dictionaries:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'hello'\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d = {'simple_key':'hello'}\\n\",\n    \"# Grab 'hello'\\n\",\n    \"\\n\",\n    \"d['simple_key']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'hello'\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d = {'k1':{'k2':'hello'}}\\n\",\n    \"# Grab 'hello'\\n\",\n    \"\\n\",\n    \"d['k1']['k2']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Getting a little tricker\\n\",\n    \"d = {'k1':[{'nest_key':['this is deep',['hello']]}]}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'hello'\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# This was harder than I expected...\\n\",\n    \"d['k1'][0]['nest_key'][1][0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# This will be hard and annoying!\\n\",\n    \"d = {'k1':[1,2,{'k2':['this is tricky',{'tough':[1,2,['hello']]}]}]}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'hello'\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Phew!\\n\",\n    \"d['k1'][2]['k2'][1]['tough'][2][0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Can you sort a dictionary? Why or why not?\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Answer: No! Because normal dictionaries are *mappings* not a sequence. **\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Tuples\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What is the major difference between tuples and lists?\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Tuples are immutable!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"How do you create a tuple?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"t = (1,2,3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Sets \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What is unique about a set?\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Answer: They don't allow for duplicate items!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Use a set to find the unique values of the list below:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"list5 = [1,2,2,33,4,4,11,22,3,3,2]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 3, 4, 11, 22, 33}\"\n      ]\n     },\n     \"execution_count\": 27,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"set(list5)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Booleans\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"For the following quiz questions, we will get a preview of comparison operators. In the table below, a=3 and b=4.\\n\",\n    \"\\n\",\n    \"<table class=\\\"table table-bordered\\\">\\n\",\n    \"<tr>\\n\",\n    \"<th style=\\\"width:10%\\\">Operator</th><th style=\\\"width:45%\\\">Description</th><th>Example</th>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>==</td>\\n\",\n    \"<td>If the values of two operands are equal, then the condition becomes true.</td>\\n\",\n    \"<td> (a == b) is not true.</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>!=</td>\\n\",\n    \"<td>If values of two operands are not equal, then condition becomes true.</td>\\n\",\n    \"<td> (a != b) is true.</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&gt;</td>\\n\",\n    \"<td>If the value of left operand is greater than the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &gt; b) is not true.</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&lt;</td>\\n\",\n    \"<td>If the value of left operand is less than the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &lt; b) is true.</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&gt;=</td>\\n\",\n    \"<td>If the value of left operand is greater than or equal to the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &gt;= b) is not true. </td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&lt;=</td>\\n\",\n    \"<td>If the value of left operand is less than or equal to the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &lt;= b) is true. </td>\\n\",\n    \"</tr>\\n\",\n    \"</table>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What will be the resulting Boolean of the following pieces of code (answer fist then check by typing it in!)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 28,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Answer before running cell\\n\",\n    \"2 > 3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 29,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Answer before running cell\\n\",\n    \"3 <= 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 30,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Answer before running cell\\n\",\n    \"3 == 2.0\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 31,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Answer before running cell\\n\",\n    \"3.0 == 3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 32,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Answer before running cell\\n\",\n    \"4**0.5 != 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Final Question: What is the boolean output of the cell block below?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 33,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# two nested lists\\n\",\n    \"l_one = [1,2,[3,4]]\\n\",\n    \"l_two = [1,2,{'k1':4}]\\n\",\n    \"\\n\",\n    \"# True or False?\\n\",\n    \"l_one[2][0] >= l_two[2]['k1']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Great Job on your first assessment! \"\n   ]\n  }\n ],\n \"metadata\": {\n  \"anaconda-cloud\": {},\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/01-Numbers.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Numbers and more in Python!\\n\",\n    \"\\n\",\n    \"In this lecture, we will learn about numbers in Python and how to use them.\\n\",\n    \"\\n\",\n    \"We'll learn about the following topics:\\n\",\n    \"\\n\",\n    \"    1.) Types of Numbers in Python\\n\",\n    \"    2.) Basic Arithmetic\\n\",\n    \"    3.) Differences between classic division and floor division\\n\",\n    \"    4.) Object Assignment in Python\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Types of numbers\\n\",\n    \"\\n\",\n    \"Python has various \\\"types\\\" of numbers (numeric literals). We'll mainly focus on integers and floating point numbers.\\n\",\n    \"\\n\",\n    \"Integers are just whole numbers, positive or negative. For example: 2 and -2 are examples of integers.\\n\",\n    \"\\n\",\n    \"Floating point numbers in Python are notable because they have a decimal point in them, or use an exponential (e) to define the number. For example 2.0 and -2.1 are examples of floating point numbers. 4E2 (4 times 10 to the power of 2) is also an example of a floating point number in Python.\\n\",\n    \"\\n\",\n    \"Throughout this course we will be mainly working with integers or simple float number types.\\n\",\n    \"\\n\",\n    \"Here is a table of the two main types we will spend most of our time working with some examples:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<table>\\n\",\n    \"<tr>\\n\",\n    \"    <th>Examples</th> \\n\",\n    \"    <th>Number \\\"Type\\\"</th>\\n\",\n    \"</tr>\\n\",\n    \"\\n\",\n    \"<tr>\\n\",\n    \"    <td>1,2,-5,1000</td>\\n\",\n    \"    <td>Integers</td> \\n\",\n    \"</tr>\\n\",\n    \"\\n\",\n    \"<tr>\\n\",\n    \"    <td>1.2,-0.5,2e2,3E2</td> \\n\",\n    \"    <td>Floating-point numbers</td> \\n\",\n    \"</tr>\\n\",\n    \" </table>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \" \\n\",\n    \" \\n\",\n    \"Now let's start with some basic arithmetic.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Basic Arithmetic\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Addition\\n\",\n    \"2+1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Subtraction\\n\",\n    \"2-1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Multiplication\\n\",\n    \"2*2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1.5\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Division\\n\",\n    \"3/2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Floor Division\\n\",\n    \"7//4\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Whoa! What just happened? Last time I checked, 7 divided by 4 equals 1.75 not 1!**\\n\",\n    \"\\n\",\n    \"The reason we get this result is because we are using \\\"*floor*\\\" division. The // operator (two forward slashes) truncates the decimal without rounding, and returns an integer result.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**So what if we just want the remainder after division?**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Modulo\\n\",\n    \"7%4\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"4 goes into 7 once, with a remainder of 3. The % operator returns the remainder after division.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Arithmetic continued\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"8\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Powers\\n\",\n    \"2**3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2.0\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Can also do roots this way\\n\",\n    \"4**0.5\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"105\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Order of Operations followed in Python\\n\",\n    \"2 + 10 * 10 + 3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"156\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Can use parentheses to specify orders\\n\",\n    \"(2+10) * (10+3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Variable Assignments\\n\",\n    \"\\n\",\n    \"Now that we've seen how to use numbers in Python as a calculator let's see how we can assign names and create variables.\\n\",\n    \"\\n\",\n    \"We use a single equals sign to assign labels to variables. Let's see a few examples of how we can do this.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Let's create an object called \\\"a\\\" and assign it the number 5\\n\",\n    \"a = 5\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now if I call *a* in my Python script, Python will treat it as the number 5.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Adding the objects\\n\",\n    \"a+a\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What happens on reassignment? Will Python let us write it over?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Reassignment\\n\",\n    \"a = 10\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"a\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Yes! Python allows you to write over assigned variable names. We can also use the variables themselves when doing the reassignment. Here is an example of what I mean:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"a\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Use A to redefine A\\n\",\n    \"a = a + a\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"20\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check \\n\",\n    \"a\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The names you use when creating these labels need to follow a few rules:\\n\",\n    \"\\n\",\n    \"    1. Names can not start with a number.\\n\",\n    \"    2. There can be no spaces in the name, use _ instead.\\n\",\n    \"    3. Can't use any of these symbols :'\\\",<>/?|\\\\()!@#$%^&*~-+\\n\",\n    \"    4. It's considered best practice (PEP8) that names are lowercase.\\n\",\n    \"    5. Avoid using the characters 'l' (lowercase letter el), 'O' (uppercase letter oh), \\n\",\n    \"       or 'I' (uppercase letter eye) as single character variable names.\\n\",\n    \"    6. Avoid using words that have special meaning in Python like \\\"list\\\" and \\\"str\\\"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Using variable names can be a very useful way to keep track of different variables in Python. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Use object names to keep better track of what's going on in your code!\\n\",\n    \"my_income = 100\\n\",\n    \"\\n\",\n    \"tax_rate = 0.1\\n\",\n    \"\\n\",\n    \"my_taxes = my_income*tax_rate\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10.0\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Show my taxes!\\n\",\n    \"my_taxes\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"So what have we learned? We learned some of the basics of numbers in Python. We also learned how to do arithmetic and use Python as a basic calculator. We then wrapped it up with learning about Variable Assignment in Python.\\n\",\n    \"\\n\",\n    \"Up next we'll learn about Strings!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"anaconda-cloud\": {},\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/01-Variable Assignment.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Variable Assignment\\n\",\n    \"\\n\",\n    \"## Rules for variable names\\n\",\n    \"* names can not start with a number\\n\",\n    \"* names can not contain spaces, use _ intead\\n\",\n    \"* names can not contain any of these symbols:\\n\",\n    \"\\n\",\n    \"      :'\\\",<>/?|\\\\!@#%^&*~-+\\n\",\n    \"       \\n\",\n    \"* it's considered best practice ([PEP8](https://www.python.org/dev/peps/pep-0008/#function-and-variable-names)) that names are lowercase with underscores\\n\",\n    \"* avoid using Python built-in keywords like `list` and `str`\\n\",\n    \"* avoid using the single characters `l` (lowercase letter el), `O` (uppercase letter oh) and `I` (uppercase letter eye) as they can be confused with `1` and `0`\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Dynamic Typing\\n\",\n    \"\\n\",\n    \"Python uses *dynamic typing*, meaning you can reassign variables to different data types. This makes Python very flexible in assigning data types; it differs from other languages that are *statically typed*.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_dogs = 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"my_dogs\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_dogs = ['Sammy', 'Frankie']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['Sammy', 'Frankie']\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"my_dogs\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Pros and Cons of Dynamic Typing\\n\",\n    \"#### Pros of Dynamic Typing\\n\",\n    \"* very easy to work with\\n\",\n    \"* faster development time\\n\",\n    \"\\n\",\n    \"#### Cons of Dynamic Typing\\n\",\n    \"* may result in unexpected bugs!\\n\",\n    \"* you need to be aware of `type()`\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Assigning Variables\\n\",\n    \"Variable assignment follows `name = object`, where a single equals sign `=` is an *assignment operator*\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"a = 5\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"5\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"a\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Here we assigned the integer object `5` to the variable name `a`.<br>Let's assign `a` to something else:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"a = 10\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"a\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can now use `a` in place of the number `10`:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"20\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"a + a\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Reassigning Variables\\n\",\n    \"Python lets you reassign variables with a reference to the same object.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"a = a + 10\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"20\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"a\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There's actually a shortcut for this. Python lets you add, subtract, multiply and divide numbers with reassignment using `+=`, `-=`, `*=`, and `/=`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"a += 10\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"30\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"a\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"a *= 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"60\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"a\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Determining variable type with `type()`\\n\",\n    \"You can check what type of object is assigned to a variable using Python's built-in `type()` function. Common data types include:\\n\",\n    \"* **int** (for integer)\\n\",\n    \"* **float**\\n\",\n    \"* **str** (for string)\\n\",\n    \"* **list**\\n\",\n    \"* **tuple**\\n\",\n    \"* **dict** (for dictionary)\\n\",\n    \"* **set**\\n\",\n    \"* **bool** (for Boolean True/False)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"int\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"type(a)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"a = (1,2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"tuple\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"type(a)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Simple Exercise\\n\",\n    \"This shows how variables make calculations more readable and easier to follow.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_income = 100\\n\",\n    \"tax_rate = 0.1\\n\",\n    \"my_taxes = my_income * tax_rate\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10.0\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"my_taxes\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! You should now understand the basics of variable assignment and reassignment in Python.<br>Up next, we'll learn about strings!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/02-Strings.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Strings\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Strings are used in Python to record text information, such as names. Strings in Python are actually a *sequence*, which basically means Python keeps track of every element in the string as a sequence. For example, Python understands the string \\\"hello' to be a sequence of letters in a specific order. This means we will be able to use indexing to grab particular letters (like the first letter, or the last letter).\\n\",\n    \"\\n\",\n    \"This idea of a sequence is an important one in Python and we will touch upon it later on in the future.\\n\",\n    \"\\n\",\n    \"In this lecture we'll learn about the following:\\n\",\n    \"\\n\",\n    \"    1.) Creating Strings\\n\",\n    \"    2.) Printing Strings\\n\",\n    \"    3.) String Indexing and Slicing\\n\",\n    \"    4.) String Properties\\n\",\n    \"    5.) String Methods\\n\",\n    \"    6.) Print Formatting\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Creating a String\\n\",\n    \"To create a string in Python you need to use either single quotes or double quotes. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'hello'\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Single word\\n\",\n    \"'hello'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'This is also a string'\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Entire phrase \\n\",\n    \"'This is also a string'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'String built with double quotes'\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# We can also use double quote\\n\",\n    \"\\\"String built with double quotes\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"SyntaxError\",\n     \"evalue\": \"invalid syntax (<ipython-input-4-da9a34b3dc31>, line 2)\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;36m  File \\u001b[1;32m\\\"<ipython-input-4-da9a34b3dc31>\\\"\\u001b[1;36m, line \\u001b[1;32m2\\u001b[0m\\n\\u001b[1;33m    ' I'm using single quotes, but this will create an error'\\u001b[0m\\n\\u001b[1;37m        ^\\u001b[0m\\n\\u001b[1;31mSyntaxError\\u001b[0m\\u001b[1;31m:\\u001b[0m invalid syntax\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Be careful with quotes!\\n\",\n    \"' I'm using single quotes, but this will create an error'\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The reason for the error above is because the single quote in <code>I'm</code> stopped the string. You can use combinations of double and single quotes to get the complete statement.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"\\\"Now I'm ready to use the single quotes inside a string!\\\"\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"\\\"Now I'm ready to use the single quotes inside a string!\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now let's learn about printing strings!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Printing a String\\n\",\n    \"\\n\",\n    \"Using Jupyter notebook with just a string in a cell will automatically output strings, but the correct way to display strings in your output is by using a print function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello World'\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# We can simply declare a string\\n\",\n    \"'Hello World'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello World 2'\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Note that we can't output multiple strings this way\\n\",\n    \"'Hello World 1'\\n\",\n    \"'Hello World 2'\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can use a print statement to print a string.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Hello World 1\\n\",\n      \"Hello World 2\\n\",\n      \"Use \\n\",\n      \" to print a new line\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"See what I mean?\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('Hello World 1')\\n\",\n    \"print('Hello World 2')\\n\",\n    \"print('Use \\\\n to print a new line')\\n\",\n    \"print('\\\\n')\\n\",\n    \"print('See what I mean?')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## String Basics\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can also use a function called len() to check the length of a string!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"11\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len('Hello World')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Python's built-in len() function counts all of the characters in the string, including spaces and punctuation.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## String Indexing\\n\",\n    \"We know strings are a sequence, which means Python can use indexes to call parts of the sequence. Let's learn how this works.\\n\",\n    \"\\n\",\n    \"In Python, we use brackets <code>[]</code> after an object to call its index. We should also note that indexing starts at 0 for Python. Let's create a new object called <code>s</code> and then walk through a few examples of indexing.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Assign s as a string\\n\",\n    \"s = 'Hello World'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello World'\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#Check\\n\",\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Hello World\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Print the object\\n\",\n    \"print(s) \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's start indexing!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'H'\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Show first element (in this case a letter)\\n\",\n    \"s[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'e'\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s[1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'l'\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s[2]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can use a <code>:</code> to perform *slicing* which grabs everything up to a designated point. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'ello World'\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Grab everything past the first term all the way to the length of s which is len(s)\\n\",\n    \"s[1:]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello World'\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Note that there is no change to the original s\\n\",\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hel'\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Grab everything UP TO the 3rd index\\n\",\n    \"s[:3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note the above slicing. Here we're telling Python to grab everything from 0 up to 3. It doesn't include the 3rd index. You'll notice this a lot in Python, where statements and are usually in the context of \\\"up to, but not including\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello World'\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#Everything\\n\",\n    \"s[:]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can also use negative indexing to go backwards.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'d'\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Last letter (one index behind 0 so it loops back around)\\n\",\n    \"s[-1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello Worl'\"\n      ]\n     },\n     \"execution_count\": 21,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Grab everything but the last letter\\n\",\n    \"s[:-1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can also use index and slice notation to grab elements of a sequence by a specified step size (the default is 1). For instance we can use two colons in a row and then a number specifying the frequency to grab elements. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello World'\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Grab everything, but go in steps size of 1\\n\",\n    \"s[::1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'HloWrd'\"\n      ]\n     },\n     \"execution_count\": 23,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Grab everything, but go in step sizes of 2\\n\",\n    \"s[::2]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'dlroW olleH'\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# We can use this to print a string backwards\\n\",\n    \"s[::-1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## String Properties\\n\",\n    \"It's important to note that strings have an important property known as *immutability*. This means that once a string is created, the elements within it can not be changed or replaced. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello World'\"\n      ]\n     },\n     \"execution_count\": 25,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"TypeError\",\n     \"evalue\": \"'str' object does not support item assignment\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mTypeError\\u001b[0m                                 Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-26-976942677f11>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      1\\u001b[0m \\u001b[1;31m# Let's try to change the first letter to 'x'\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m----> 2\\u001b[1;33m \\u001b[0ms\\u001b[0m\\u001b[1;33m[\\u001b[0m\\u001b[1;36m0\\u001b[0m\\u001b[1;33m]\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[1;34m'x'\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mTypeError\\u001b[0m: 'str' object does not support item assignment\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Let's try to change the first letter to 'x'\\n\",\n    \"s[0] = 'x'\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice how the error tells us directly what we can't do, change the item assignment!\\n\",\n    \"\\n\",\n    \"Something we *can* do is concatenate strings!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello World'\"\n      ]\n     },\n     \"execution_count\": 27,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello World concatenate me!'\"\n      ]\n     },\n     \"execution_count\": 28,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Concatenate strings!\\n\",\n    \"s + ' concatenate me!'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# We can reassign s completely though!\\n\",\n    \"s = s + ' concatenate me!'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Hello World concatenate me!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(s)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello World concatenate me!'\"\n      ]\n     },\n     \"execution_count\": 31,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can use the multiplication symbol to create repetition!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"letter = 'z'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'zzzzzzzzzz'\"\n      ]\n     },\n     \"execution_count\": 33,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"letter*10\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Basic Built-in String methods\\n\",\n    \"\\n\",\n    \"Objects in Python usually have built-in methods. These methods are functions inside the object (we will learn about these in much more depth later) that can perform actions or commands on the object itself.\\n\",\n    \"\\n\",\n    \"We call methods with a period and then the method name. Methods are in the form:\\n\",\n    \"\\n\",\n    \"object.method(parameters)\\n\",\n    \"\\n\",\n    \"Where parameters are extra arguments we can pass into the method. Don't worry if the details don't make 100% sense right now. Later on we will be creating our own objects and functions!\\n\",\n    \"\\n\",\n    \"Here are some examples of built-in methods in strings:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello World concatenate me!'\"\n      ]\n     },\n     \"execution_count\": 34,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'HELLO WORLD CONCATENATE ME!'\"\n      ]\n     },\n     \"execution_count\": 35,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Upper Case a string\\n\",\n    \"s.upper()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'hello world concatenate me!'\"\n      ]\n     },\n     \"execution_count\": 36,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Lower case\\n\",\n    \"s.lower()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['Hello', 'World', 'concatenate', 'me!']\"\n      ]\n     },\n     \"execution_count\": 37,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Split a string by blank space (this is the default)\\n\",\n    \"s.split()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 38,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['Hello ', 'orld concatenate me!']\"\n      ]\n     },\n     \"execution_count\": 38,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Split by a specific element (doesn't include the element that was split on)\\n\",\n    \"s.split('W')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There are many more methods than the ones covered here. Visit the Advanced String section to find out more!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Print Formatting\\n\",\n    \"\\n\",\n    \"We can use the .format() method to add formatted objects to printed string statements. \\n\",\n    \"\\n\",\n    \"The easiest way to show this is through an example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Insert another string with curly brackets: The inserted string'\"\n      ]\n     },\n     \"execution_count\": 39,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"'Insert another string with curly brackets: {}'.format('The inserted string')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We will revisit this string formatting topic in later sections when we are building our projects!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Next up: Lists!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/03-Print Formatting with Strings.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# String Formatting\\n\",\n    \"\\n\",\n    \"String formatting lets you inject items into a string rather than trying to chain items together using commas or string concatenation. As a quick comparison, consider:\\n\",\n    \"\\n\",\n    \"    player = 'Thomas'\\n\",\n    \"    points = 33\\n\",\n    \"    \\n\",\n    \"    'Last night, '+player+' scored '+str(points)+' points.'  # concatenation\\n\",\n    \"    \\n\",\n    \"    f'Last night, {player} scored {points} points.'          # string formatting\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"There are three ways to perform string formatting.\\n\",\n    \"* The oldest method involves placeholders using the modulo `%` character.\\n\",\n    \"* An improved technique uses the `.format()` string method.\\n\",\n    \"* The newest method, introduced with Python 3.6, uses formatted string literals, called *f-strings*.\\n\",\n    \"\\n\",\n    \"Since you will likely encounter all three versions in someone else's code, we describe each of them here.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Formatting with placeholders\\n\",\n    \"You can use <code>%s</code> to inject strings into your print statements. The modulo `%` is referred to as a \\\"string formatting operator\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"I'm going to inject something here.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(\\\"I'm going to inject %s here.\\\" %'something')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can pass multiple items by placing them inside a tuple after the `%` operator.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"I'm going to inject some text here, and more text here.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(\\\"I'm going to inject %s text here, and %s text here.\\\" %('some','more'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can also pass variable names:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"I'm going to inject some text here, and more text here.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x, y = 'some', 'more'\\n\",\n    \"print(\\\"I'm going to inject %s text here, and %s text here.\\\"%(x,y))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Format conversion methods.\\n\",\n    \"It should be noted that two methods <code>%s</code> and <code>%r</code> convert any python object to a string using two separate methods: `str()` and `repr()`. We will learn more about these functions later on in the course, but you should note that `%r` and `repr()` deliver the *string representation* of the object, including quotation marks and any escape characters.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"He said his name was Fred.\\n\",\n      \"He said his name was 'Fred'.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('He said his name was %s.' %'Fred')\\n\",\n    \"print('He said his name was %r.' %'Fred')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"As another example, `\\\\t` inserts a tab into a string.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"I once caught a fish this \\tbig.\\n\",\n      \"I once caught a fish 'this \\\\tbig'.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('I once caught a fish %s.' %'this \\\\tbig')\\n\",\n    \"print('I once caught a fish %r.' %'this \\\\tbig')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The `%s` operator converts whatever it sees into a string, including integers and floats. The `%d` operator converts numbers to integers first, without rounding. Note the difference below:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"I wrote 3.75 programs today.\\n\",\n      \"I wrote 3 programs today.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('I wrote %s programs today.' %3.75)\\n\",\n    \"print('I wrote %d programs today.' %3.75)   \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Padding and Precision of Floating Point Numbers\\n\",\n    \"Floating point numbers use the format <code>%5.2f</code>. Here, <code>5</code> would be the minimum number of characters the string should contain; these may be padded with whitespace if the entire number does not have this many digits. Next to this, <code>.2f</code> stands for how many numbers to show past the decimal point. Let's see some examples:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Floating point numbers: 13.14\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('Floating point numbers: %5.2f' %(13.144))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Floating point numbers: 13\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('Floating point numbers: %1.0f' %(13.144))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Floating point numbers: 13.14400\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('Floating point numbers: %1.5f' %(13.144))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Floating point numbers:      13.14\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('Floating point numbers: %10.2f' %(13.144))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Floating point numbers:                     13.14\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('Floating point numbers: %25.2f' %(13.144))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"For more information on string formatting with placeholders visit https://docs.python.org/3/library/stdtypes.html#old-string-formatting\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Multiple Formatting\\n\",\n    \"Nothing prohibits using more than one conversion tool in the same print statement:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"First: hi!, Second:  3.14, Third: 'bye!'\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('First: %s, Second: %5.2f, Third: %r' %('hi!',3.1415,'bye!'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Formatting with the `.format()` method\\n\",\n    \"A better way to format objects into your strings for print statements is with the string `.format()` method. The syntax is:\\n\",\n    \"\\n\",\n    \"    'String here {} then also {}'.format('something1','something2')\\n\",\n    \"    \\n\",\n    \"For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"This is a string with an insert\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('This is a string with an {}'.format('insert'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### The .format() method has several advantages over the %s placeholder method:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### 1. Inserted objects can be called by index position:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"The quick brown fox\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('The {2} {1} {0}'.format('fox','brown','quick'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### 2. Inserted objects can be assigned keywords:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"First Object: 1, Second Object: Two, Third Object: 12.3\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('First Object: {a}, Second Object: {b}, Third Object: {c}'.format(a=1,b='Two',c=12.3))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### 3. Inserted objects can be reused, avoiding duplication:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"A penny saved is a penny earned.\\n\",\n      \"A penny saved is a penny earned.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('A %s saved is a %s earned.' %('penny','penny'))\\n\",\n    \"# vs.\\n\",\n    \"print('A {p} saved is a {p} earned.'.format(p='penny'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Alignment, padding and precision with `.format()`\\n\",\n    \"Within the curly braces you can assign field lengths, left/right alignments, rounding parameters and more\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Fruit    | Quantity \\n\",\n      \"Apples   |       3.0\\n\",\n      \"Oranges  |        10\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('{0:8} | {1:9}'.format('Fruit', 'Quantity'))\\n\",\n    \"print('{0:8} | {1:9}'.format('Apples', 3.))\\n\",\n    \"print('{0:8} | {1:9}'.format('Oranges', 10))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"By default, `.format()` aligns text to the left, numbers to the right. You can pass an optional `<`,`^`, or `>` to set a left, center or right alignment:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Left     |  Center  |    Right\\n\",\n      \"11       |    22    |       33\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('{0:<8} | {1:^8} | {2:>8}'.format('Left','Center','Right'))\\n\",\n    \"print('{0:<8} | {1:^8} | {2:>8}'.format(11,22,33))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can precede the aligment operator with a padding character\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Left==== | -Center- | ...Right\\n\",\n      \"11====== | ---22--- | ......33\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('{0:=<8} | {1:-^8} | {2:.>8}'.format('Left','Center','Right'))\\n\",\n    \"print('{0:=<8} | {1:-^8} | {2:.>8}'.format(11,22,33))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Field widths and float precision are handled in a way similar to placeholders. The following two print statements are equivalent:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"This is my ten-character, two-decimal number:     13.58\\n\",\n      \"This is my ten-character, two-decimal number:     13.58\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('This is my ten-character, two-decimal number:%10.2f' %13.579)\\n\",\n    \"print('This is my ten-character, two-decimal number:{0:10.2f}'.format(13.579))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note that there are 5 spaces following the colon, and 5 characters taken up by 13.58, for a total of ten characters.\\n\",\n    \"\\n\",\n    \"For more information on the string `.format()` method visit https://docs.python.org/3/library/string.html#formatstrings\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Formatted String Literals (f-strings)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Introduced in Python 3.6, f-strings offer several benefits over the older `.format()` string method described above. For one, you can bring outside variables immediately into to the string rather than pass them as arguments through `.format(var)`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"He said his name is Fred.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"name = 'Fred'\\n\",\n    \"\\n\",\n    \"print(f\\\"He said his name is {name}.\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Pass `!r` to get the string representation:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"He said his name is 'Fred'\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(f\\\"He said his name is {name!r}\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Float formatting follows `\\\"result: {value:{width}.{precision}}\\\"`\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Where with the `.format()` method you might see `{value:10.4f}`, with f-strings this can become `{value:{10}.{6}}`\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"My 10 character, four decimal number is:   23.4568\\n\",\n      \"My 10 character, four decimal number is:   23.4568\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"num = 23.45678\\n\",\n    \"print(\\\"My 10 character, four decimal number is:{0:10.4f}\\\".format(num))\\n\",\n    \"print(f\\\"My 10 character, four decimal number is:{num:{10}.{6}}\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note that with f-strings, *precision* refers to the total number of digits, not just those following the decimal. This fits more closely with scientific notation and statistical analysis. Unfortunately, f-strings do not pad to the right of the decimal, even if precision allows it:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"My 10 character, four decimal number is:   23.4500\\n\",\n      \"My 10 character, four decimal number is:     23.45\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"num = 23.45\\n\",\n    \"print(\\\"My 10 character, four decimal number is:{0:10.4f}\\\".format(num))\\n\",\n    \"print(f\\\"My 10 character, four decimal number is:{num:{10}.{6}}\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If this becomes important, you can always use `.format()` method syntax inside an f-string:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"My 10 character, four decimal number is:   23.4500\\n\",\n      \"My 10 character, four decimal number is:   23.4500\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"num = 23.45\\n\",\n    \"print(\\\"My 10 character, four decimal number is:{0:10.4f}\\\".format(num))\\n\",\n    \"print(f\\\"My 10 character, four decimal number is:{num:10.4f}\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"For more info on formatted string literals visit https://docs.python.org/3/reference/lexical_analysis.html#f-strings\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"That is the basics of string formatting!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/04-Lists.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Lists\\n\",\n    \"\\n\",\n    \"Earlier when discussing strings we introduced the concept of a *sequence* in Python. Lists can be thought of the most general version of a *sequence* in Python. Unlike strings, they are mutable, meaning the elements inside a list can be changed!\\n\",\n    \"\\n\",\n    \"In this section we will learn about:\\n\",\n    \"    \\n\",\n    \"    1.) Creating lists\\n\",\n    \"    2.) Indexing and Slicing Lists\\n\",\n    \"    3.) Basic List Methods\\n\",\n    \"    4.) Nesting Lists\\n\",\n    \"    5.) Introduction to List Comprehensions\\n\",\n    \"\\n\",\n    \"Lists are constructed with brackets [] and commas separating every element in the list.\\n\",\n    \"\\n\",\n    \"Let's go ahead and see how we can construct lists!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Assign a list to an variable named my_list\\n\",\n    \"my_list = [1,2,3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We just created a list of integers, but lists can actually hold different object types. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_list = ['A string',23,100.232,'o']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Just like strings, the len() function will tell you how many items are in the sequence of the list.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(my_list)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Indexing and Slicing\\n\",\n    \"Indexing and slicing work just like in strings. Let's make a new list to remind ourselves of how this works:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_list = ['one','two','three',4,5]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'one'\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Grab element at index 0\\n\",\n    \"my_list[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['two', 'three', 4, 5]\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Grab index 1 and everything past it\\n\",\n    \"my_list[1:]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['one', 'two', 'three']\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Grab everything UP TO index 3\\n\",\n    \"my_list[:3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can also use + to concatenate lists, just like we did for strings.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['one', 'two', 'three', 4, 5, 'new item']\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"my_list + ['new item']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note: This doesn't actually change the original list!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['one', 'two', 'three', 4, 5]\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"my_list\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You would have to reassign the list to make the change permanent.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Reassign\\n\",\n    \"my_list = my_list + ['add new item permanently']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['one', 'two', 'three', 4, 5, 'add new item permanently']\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"my_list\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can also use the * for a duplication method similar to strings:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['one',\\n\",\n       \" 'two',\\n\",\n       \" 'three',\\n\",\n       \" 4,\\n\",\n       \" 5,\\n\",\n       \" 'add new item permanently',\\n\",\n       \" 'one',\\n\",\n       \" 'two',\\n\",\n       \" 'three',\\n\",\n       \" 4,\\n\",\n       \" 5,\\n\",\n       \" 'add new item permanently']\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Make the list double\\n\",\n    \"my_list * 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['one', 'two', 'three', 4, 5, 'add new item permanently']\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Again doubling not permanent\\n\",\n    \"my_list\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Basic List Methods\\n\",\n    \"\\n\",\n    \"If you are familiar with another programming language, you might start to draw parallels between arrays in another language and lists in Python. Lists in Python however, tend to be more flexible than arrays in other languages for a two good reasons: they have no fixed size (meaning we don't have to specify how big a list will be), and they have no fixed type constraint (like we've seen above).\\n\",\n    \"\\n\",\n    \"Let's go ahead and explore some more special methods for lists:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Create a new list\\n\",\n    \"list1 = [1,2,3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Use the **append** method to permanently add an item to the end of a list:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Append\\n\",\n    \"list1.append('append me!')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 3, 'append me!']\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Show\\n\",\n    \"list1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Use **pop** to \\\"pop off\\\" an item from the list. By default pop takes off the last index, but you can also specify which index to pop off. Let's see an example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Pop off the 0 indexed item\\n\",\n    \"list1.pop(0)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[2, 3, 'append me!']\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Show\\n\",\n    \"list1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Assign the popped element, remember default popped index is -1\\n\",\n    \"popped_item = list1.pop()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'append me!'\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"popped_item\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[2, 3]\"\n      ]\n     },\n     \"execution_count\": 21,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Show remaining list\\n\",\n    \"list1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"It should also be noted that lists indexing will return an error if there is no element at that index. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"IndexError\",\n     \"evalue\": \"list index out of range\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mIndexError\\u001b[0m                                Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-22-af6d2015fa1f>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mlist1\\u001b[0m\\u001b[1;33m[\\u001b[0m\\u001b[1;36m100\\u001b[0m\\u001b[1;33m]\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mIndexError\\u001b[0m: list index out of range\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"list1[100]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can use the **sort** method and the **reverse** methods to also effect your lists:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"new_list = ['a','e','x','b','c']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['a', 'e', 'x', 'b', 'c']\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#Show\\n\",\n    \"new_list\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Use reverse to reverse order (this is permanent!)\\n\",\n    \"new_list.reverse()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['c', 'b', 'x', 'e', 'a']\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"new_list\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Use sort to sort the list (in this case alphabetical order, but for numbers it will go ascending)\\n\",\n    \"new_list.sort()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['a', 'b', 'c', 'e', 'x']\"\n      ]\n     },\n     \"execution_count\": 28,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"new_list\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Nesting Lists\\n\",\n    \"A great feature of of Python data structures is that they support *nesting*. This means we can have data structures within data structures. For example: A list inside a list.\\n\",\n    \"\\n\",\n    \"Let's see how this works!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Let's make three lists\\n\",\n    \"lst_1=[1,2,3]\\n\",\n    \"lst_2=[4,5,6]\\n\",\n    \"lst_3=[7,8,9]\\n\",\n    \"\\n\",\n    \"# Make a list of lists to form a matrix\\n\",\n    \"matrix = [lst_1,lst_2,lst_3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[[1, 2, 3], [4, 5, 6], [7, 8, 9]]\"\n      ]\n     },\n     \"execution_count\": 30,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Show\\n\",\n    \"matrix\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can again use indexing to grab elements, but now there are two levels for the index. The items in the matrix object, and then the items inside that list!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 3]\"\n      ]\n     },\n     \"execution_count\": 31,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Grab first item in matrix object\\n\",\n    \"matrix[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 32,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Grab first item of the first item in the matrix object\\n\",\n    \"matrix[0][0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# List Comprehensions\\n\",\n    \"Python has an advanced feature called list comprehensions. They allow for quick construction of lists. To fully understand list comprehensions we need to understand for loops. So don't worry if you don't completely understand this section, and feel free to just skip it since we will return to this topic later.\\n\",\n    \"\\n\",\n    \"But in case you want to know now, here are a few examples!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Build a list comprehension by deconstructing a for loop within a []\\n\",\n    \"first_col = [row[0] for row in matrix]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 4, 7]\"\n      ]\n     },\n     \"execution_count\": 34,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"first_col\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We used a list comprehension here to grab the first element of every row in the matrix object. We will cover this in much more detail later on!\\n\",\n    \"\\n\",\n    \"For more advanced methods and features of lists in Python, check out the Advanced Lists section later on in this course!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/05-Dictionaries.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Dictionaries\\n\",\n    \"\\n\",\n    \"We've been learning about *sequences* in Python but now we're going to switch gears and learn about *mappings* in Python. If you're familiar with other languages you can think of these Dictionaries as hash tables. \\n\",\n    \"\\n\",\n    \"This section will serve as a brief introduction to dictionaries and consist of:\\n\",\n    \"\\n\",\n    \"    1.) Constructing a Dictionary\\n\",\n    \"    2.) Accessing objects from a dictionary\\n\",\n    \"    3.) Nesting Dictionaries\\n\",\n    \"    4.) Basic Dictionary Methods\\n\",\n    \"\\n\",\n    \"So what are mappings? Mappings are a collection of objects that are stored by a *key*, unlike a sequence that stored objects by their relative position. This is an important distinction, since mappings won't retain order since they have objects defined by a key.\\n\",\n    \"\\n\",\n    \"A Python dictionary consists of a key and then an associated value. That value can be almost any Python object.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"## Constructing a Dictionary\\n\",\n    \"Let's see how we can construct dictionaries to get a better understanding of how they work!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Make a dictionary with {} and : to signify a key and a value\\n\",\n    \"my_dict = {'key1':'value1','key2':'value2'}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'value2'\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Call values by their key\\n\",\n    \"my_dict['key2']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Its important to note that dictionaries are very flexible in the data types they can hold. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_dict = {'key1':123,'key2':[12,23,33],'key3':['item0','item1','item2']}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['item0', 'item1', 'item2']\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Let's call items from the dictionary\\n\",\n    \"my_dict['key3']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'item0'\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Can call an index on that value\\n\",\n    \"my_dict['key3'][0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'ITEM0'\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Can then even call methods on that value\\n\",\n    \"my_dict['key3'][0].upper()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can affect the values of a key as well. For instance:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"123\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"my_dict['key1']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Subtract 123 from the value\\n\",\n    \"my_dict['key1'] = my_dict['key1'] - 123\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#Check\\n\",\n    \"my_dict['key1']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"A quick note, Python has a built-in method of doing a self subtraction or addition (or multiplication or division). We could have also used += or -= for the above statement. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"-123\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Set the object equal to itself minus 123 \\n\",\n    \"my_dict['key1'] -= 123\\n\",\n    \"my_dict['key1']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can also create keys by assignment. For instance if we started off with an empty dictionary, we could continually add to it:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Create a new dictionary\\n\",\n    \"d = {}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Create a new key through assignment\\n\",\n    \"d['animal'] = 'Dog'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Can do this with any object\\n\",\n    \"d['answer'] = 42\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'animal': 'Dog', 'answer': 42}\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#Show\\n\",\n    \"d\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Nesting with Dictionaries\\n\",\n    \"\\n\",\n    \"Hopefully you're starting to see how powerful Python is with its flexibility of nesting objects and calling methods on them. Let's see a dictionary nested inside a dictionary:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Dictionary nested inside a dictionary nested inside a dictionary\\n\",\n    \"d = {'key1':{'nestkey':{'subnestkey':'value'}}}\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Wow! That's a quite the inception of dictionaries! Let's see how we can grab that value:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'value'\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Keep calling the keys\\n\",\n    \"d['key1']['nestkey']['subnestkey']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## A few Dictionary Methods\\n\",\n    \"\\n\",\n    \"There are a few methods we can call on a dictionary. Let's get a quick introduction to a few of them:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Create a typical dictionary\\n\",\n    \"d = {'key1':1,'key2':2,'key3':3}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"dict_keys(['key1', 'key2', 'key3'])\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Method to return a list of all keys \\n\",\n    \"d.keys()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"dict_values([1, 2, 3])\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Method to grab all values\\n\",\n    \"d.values()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"dict_items([('key1', 1), ('key2', 2), ('key3', 3)])\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Method to return tuples of all items  (we'll learn about tuples soon)\\n\",\n    \"d.items()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Hopefully you now have a good basic understanding how to construct dictionaries. There's a lot more to go into here, but we will revisit dictionaries at later time. After this section all you need to know is how to create a dictionary and how to retrieve values from it.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/06-Tuples.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Tuples\\n\",\n    \"\\n\",\n    \"In Python tuples are very similar to lists, however, unlike lists they are *immutable* meaning they can not be changed. You would use tuples to present things that shouldn't be changed, such as days of the week, or dates on a calendar. \\n\",\n    \"\\n\",\n    \"In this section, we will get a brief overview of the following:\\n\",\n    \"\\n\",\n    \"    1.) Constructing Tuples\\n\",\n    \"    2.) Basic Tuple Methods\\n\",\n    \"    3.) Immutability\\n\",\n    \"    4.) When to Use Tuples\\n\",\n    \"\\n\",\n    \"You'll have an intuition of how to use tuples based on what you've learned about lists. We can treat them very similarly with the major distinction being that tuples are immutable.\\n\",\n    \"\\n\",\n    \"## Constructing Tuples\\n\",\n    \"\\n\",\n    \"The construction of a tuples use () with elements separated by commas. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Create a tuple\\n\",\n    \"t = (1,2,3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check len just like a list\\n\",\n    \"len(t)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"('one', 2)\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Can also mix object types\\n\",\n    \"t = ('one',2)\\n\",\n    \"\\n\",\n    \"# Show\\n\",\n    \"t\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'one'\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Use indexing just like we did in lists\\n\",\n    \"t[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Slicing just like a list\\n\",\n    \"t[-1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Basic Tuple Methods\\n\",\n    \"\\n\",\n    \"Tuples have built-in methods, but not as many as lists do. Let's look at two of them:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Use .index to enter a value and return the index\\n\",\n    \"t.index('one')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Use .count to count the number of times a value appears\\n\",\n    \"t.count('one')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Immutability\\n\",\n    \"\\n\",\n    \"It can't be stressed enough that tuples are immutable. To drive that point home:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"TypeError\",\n     \"evalue\": \"'tuple' object does not support item assignment\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mTypeError\\u001b[0m                                 Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-8-1257c0aa9edd>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mt\\u001b[0m\\u001b[1;33m[\\u001b[0m\\u001b[1;36m0\\u001b[0m\\u001b[1;33m]\\u001b[0m\\u001b[1;33m=\\u001b[0m \\u001b[1;34m'change'\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mTypeError\\u001b[0m: 'tuple' object does not support item assignment\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"t[0]= 'change'\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Because of this immutability, tuples can't grow. Once a tuple is made we can not add to it.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"AttributeError\",\n     \"evalue\": \"'tuple' object has no attribute 'append'\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mAttributeError\\u001b[0m                            Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-9-b75f5b09ac19>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mt\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mappend\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;34m'nope'\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mAttributeError\\u001b[0m: 'tuple' object has no attribute 'append'\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"t.append('nope')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## When to use Tuples\\n\",\n    \"\\n\",\n    \"You may be wondering, \\\"Why bother using tuples when they have fewer available methods?\\\" To be honest, tuples are not used as often as lists in programming, but are used when immutability is necessary. If in your program you are passing around an object and need to make sure it does not get changed, then a tuple becomes your solution. It provides a convenient source of data integrity.\\n\",\n    \"\\n\",\n    \"You should now be able to create and use tuples in your programming as well as have an understanding of their immutability.\\n\",\n    \"\\n\",\n    \"Up next Files!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/07-Sets and Booleans.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Set and Booleans\\n\",\n    \"\\n\",\n    \"There are two other object types in Python that we should quickly cover: Sets and Booleans. \\n\",\n    \"\\n\",\n    \"## Sets\\n\",\n    \"\\n\",\n    \"Sets are an unordered collection of *unique* elements. We can construct them by using the set() function. Let's go ahead and make a set to see how it works\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"x = set()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# We add to sets with the add() method\\n\",\n    \"x.add(1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1}\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#Show\\n\",\n    \"x\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note the curly brackets. This does not indicate a dictionary! Although you can draw analogies as a set being a dictionary with only keys.\\n\",\n    \"\\n\",\n    \"We know that a set has only unique entries. So what happens when we try to add something that is already in a set?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Add a different element\\n\",\n    \"x.add(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2}\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#Show\\n\",\n    \"x\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Try to add the same element\\n\",\n    \"x.add(1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2}\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#Show\\n\",\n    \"x\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice how it won't place another 1 there. That's because a set is only concerned with unique elements! We can cast a list with multiple repeat elements to a set to get the unique elements. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Create a list with repeats\\n\",\n    \"list1 = [1,1,2,2,3,4,5,6,1,1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 3, 4, 5, 6}\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Cast as set to get unique values\\n\",\n    \"set(list1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Booleans\\n\",\n    \"\\n\",\n    \"Python  comes with Booleans (with predefined True and False displays that are basically just the integers 1 and 0). It also has a placeholder object called None. Let's walk through a few quick examples of Booleans (we will dive deeper into them later in this course).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Set object to be a boolean\\n\",\n    \"a = True\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#Show\\n\",\n    \"a\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can also use comparison operators to create booleans. We will go over all the comparison operators later on in the course.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Output is boolean\\n\",\n    \"1 > 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can use None as a placeholder for an object that we don't want to reassign yet:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# None placeholder\\n\",\n    \"b = None\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Show\\n\",\n    \"print(b)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Thats it! You should now have a basic understanding of Python objects and data structure types. Next, go ahead and do the assessment test!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/08-Files.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Files\\n\",\n    \"\\n\",\n    \"Python uses file objects to interact with external files on your computer. These file objects can be any sort of file you have on your computer, whether it be an audio file, a text file, emails, Excel documents, etc. Note: You will probably need to install certain libraries or modules to interact with those various file types, but they are easily available. (We will cover downloading modules later on in the course).\\n\",\n    \"\\n\",\n    \"Python has a built-in open function that allows us to open and play with basic file types. First we will need a file though. We're going to use some IPython magic to create a text file!\\n\",\n    \"\\n\",\n    \"## IPython Writing a File \\n\",\n    \"#### This function is specific to jupyter notebooks! Alternatively, quickly create a simple .txt file with sublime text editor.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Overwriting test.txt\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%writefile test.txt\\n\",\n    \"Hello, this is a quick test file.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Python Opening a file\\n\",\n    \"\\n\",\n    \"Let's being by opening the file test.txt that is located in the same directory as this notebook. For now we will work with files located in the same directory as the notebook or .py script you are using.\\n\",\n    \"\\n\",\n    \"It is very easy to get an error on this step:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"FileNotFoundError\",\n     \"evalue\": \"[Errno 2] No such file or directory: 'whoops.txt'\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mFileNotFoundError\\u001b[0m                         Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-1-dafe28ee473f>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mmyfile\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[0mopen\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;34m'whoops.txt'\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mFileNotFoundError\\u001b[0m: [Errno 2] No such file or directory: 'whoops.txt'\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"myfile = open('whoops.txt')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"To avoid this error,make sure your .txt file is saved in the same location as your notebook, to check your notebook location, use **pwd**:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\00-Python Object and Data Structure Basics'\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"pwd\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Alternatively, to grab files from any location on your computer, simply pass in the entire file path. **\\n\",\n    \"\\n\",\n    \"For Windows you need to use double \\\\ so python doesn't treat the second \\\\ as an escape character, a file path is in the form:\\n\",\n    \"\\n\",\n    \"    myfile = open(\\\"C:\\\\\\\\Users\\\\\\\\YourUserName\\\\\\\\Home\\\\\\\\Folder\\\\\\\\myfile.txt\\\")\\n\",\n    \"\\n\",\n    \"For MacOS and Linux you use slashes in the opposite direction:\\n\",\n    \"\\n\",\n    \"    myfile = open(\\\"/Users/YouUserName/Folder/myfile.txt\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Open the text.txt we made earlier\\n\",\n    \"my_file = open('test.txt')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello, this is a quick test file.'\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# We can now read the file\\n\",\n    \"my_file.read()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"''\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# But what happens if we try to read it again?\\n\",\n    \"my_file.read()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This happens because you can imagine the reading \\\"cursor\\\" is at the end of the file after having read it. So there is nothing left to read. We can reset the \\\"cursor\\\" like this:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Seek to the start of file (index 0)\\n\",\n    \"my_file.seek(0)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello, this is a quick test file.'\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Now read again\\n\",\n    \"my_file.read()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can read a file line by line using the readlines method. Use caution with large files, since everything will be held in memory. We will learn how to iterate over large files later in the course.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['Hello, this is a quick test file.']\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Readlines returns a list of the lines in the file\\n\",\n    \"my_file.seek(0)\\n\",\n    \"my_file.readlines()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"When you have finished using a file, it is always good practice to close it.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_file.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Writing to a File\\n\",\n    \"\\n\",\n    \"By default, the `open()` function will only allow us to read the file. We need to pass the argument `'w'` to write over the file. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Add a second argument to the function, 'w' which stands for write.\\n\",\n    \"# Passing 'w+' lets us read and write to the file\\n\",\n    \"\\n\",\n    \"my_file = open('test.txt','w+')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### <strong><font color='red'>Use caution!</font></strong> \\n\",\n    \"Opening a file with `'w'` or `'w+'` truncates the original, meaning that anything that was in the original file **is deleted**!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"18\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Write to the file\\n\",\n    \"my_file.write('This is a new line')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'This is a new line'\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Read the file\\n\",\n    \"my_file.seek(0)\\n\",\n    \"my_file.read()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_file.close()  # always do this when you're done with a file\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Appending to a File\\n\",\n    \"Passing the argument `'a'` opens the file and puts the pointer at the end, so anything written is appended. Like `'w+'`, `'a+'` lets us read and write to a file. If the file does not exist, one will be created.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"23\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"my_file = open('test.txt','a+')\\n\",\n    \"my_file.write('\\\\nThis is text being appended to test.txt')\\n\",\n    \"my_file.write('\\\\nAnd another line here.')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"This is a new line\\n\",\n      \"This is text being appended to test.txt\\n\",\n      \"And another line here.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"my_file.seek(0)\\n\",\n    \"print(my_file.read())\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_file.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Appending with `%%writefile`\\n\",\n    \"We can do the same thing using IPython cell magic:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Appending to test.txt\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%writefile -a test.txt\\n\",\n    \"\\n\",\n    \"This is text being appended to test.txt\\n\",\n    \"And another line here.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Add a blank space if you want the first line to begin on its own line, as Jupyter won't recognize escape sequences like `\\\\n`\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Iterating through a File\\n\",\n    \"\\n\",\n    \"Lets get a quick preview of a for loop by iterating over a text file. First let's make a new text file with some IPython Magic:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Overwriting test.txt\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%writefile test.txt\\n\",\n    \"First Line\\n\",\n    \"Second Line\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we can use a little bit of flow to tell the program to for through every line of the file and do something:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"First Line\\n\",\n      \"\\n\",\n      \"Second Line\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for line in open('test.txt'):\\n\",\n    \"    print(line)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Don't worry about fully understanding this yet, for loops are coming up soon. But we'll break down what we did above. We said that for every line in this text file, go ahead and print that line. It's important to note a few things here:\\n\",\n    \"\\n\",\n    \"1. We could have called the \\\"line\\\" object anything (see example below).\\n\",\n    \"2. By not calling `.read()` on the file, the whole text file was not stored in memory.\\n\",\n    \"3. Notice the indent on the second line for print. This whitespace is required in Python.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"First Line\\n\",\n      \"\\n\",\n      \"Second Line\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Pertaining to the first point above\\n\",\n    \"for asdf in open('test.txt'):\\n\",\n    \"    print(asdf)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We'll learn a lot more about this later, but up next: Sets and Booleans!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/09-Objects and Data Structures Assessment Test.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\\n\",\n    \"# Objects and Data Structures Assessment Test\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## Test your knowledge. \\n\",\n    \"\\n\",\n    \"** Answer the following questions **\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"Write (or just say out loud to yourself) a brief description of all the following Object Types and Data Structures we've learned about. You can edit the cell below by double clicking on it. Really this is just to test if you know the difference between these, so feel free to just think about it, since your answers are self-graded.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Double Click HERE to edit this markdown cell and write answers.\\n\",\n    \"\\n\",\n    \"Numbers:\\n\",\n    \"\\n\",\n    \"Strings:\\n\",\n    \"\\n\",\n    \"Lists:\\n\",\n    \"\\n\",\n    \"Tuples:\\n\",\n    \"\\n\",\n    \"Dictionaries:\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Numbers\\n\",\n    \"\\n\",\n    \"Write an equation that uses multiplication, division, an exponent, addition, and subtraction that is equal to 100.25.\\n\",\n    \"\\n\",\n    \"Hint: This is just to test your memory of the basic arithmetic commands, work backwards from 100.25\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Answer these 3 questions without typing code. Then type code to check your answer.\\n\",\n    \"\\n\",\n    \"    What is the value of the expression 4 * (6 + 5)\\n\",\n    \"    \\n\",\n    \"    What is the value of the expression 4 * 6 + 5 \\n\",\n    \"    \\n\",\n    \"    What is the value of the expression 4 + 6 * 5 \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What is the *type* of the result of the expression 3 + 1.5 + 4?<br><br>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What would you use to find a number’s square root, as well as its square? \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Square root:\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Square:\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Strings\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Given the string 'hello' give an index command that returns 'e'. Enter your code in the cell below:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"s = 'hello'\\n\",\n    \"# Print out 'e' using indexing\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Reverse the string 'hello' using slicing:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"s ='hello'\\n\",\n    \"# Reverse the string using slicing\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Given the string hello, give two methods of producing the letter 'o' using indexing.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"s ='hello'\\n\",\n    \"# Print out the 'o'\\n\",\n    \"\\n\",\n    \"# Method 1:\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Method 2:\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Lists\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Build this list [0,0,0] two separate ways.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Method 1:\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Method 2:\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Reassign 'hello' in this nested list to say 'goodbye' instead:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"list3 = [1,2,[3,4,'hello']]\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Sort the list below:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"list4 = [5,3,4,6,1]\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Dictionaries\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Using keys and indexing, grab the 'hello' from the following dictionaries:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"d = {'simple_key':'hello'}\\n\",\n    \"# Grab 'hello'\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"d = {'k1':{'k2':'hello'}}\\n\",\n    \"# Grab 'hello'\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Getting a little tricker\\n\",\n    \"d = {'k1':[{'nest_key':['this is deep',['hello']]}]}\\n\",\n    \"\\n\",\n    \"#Grab hello\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# This will be hard and annoying!\\n\",\n    \"d = {'k1':[1,2,{'k2':['this is tricky',{'tough':[1,2,['hello']]}]}]}\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Can you sort a dictionary? Why or why not?<br><br>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Tuples\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What is the major difference between tuples and lists?<br><br>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"How do you create a tuple?<br><br>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Sets \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What is unique about a set?<br><br>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Use a set to find the unique values of the list below:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"list5 = [1,2,2,33,4,4,11,22,3,3,2]\\n\",\n    \"\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Booleans\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"For the following quiz questions, we will get a preview of comparison operators. In the table below, a=3 and b=4.\\n\",\n    \"\\n\",\n    \"<table class=\\\"table table-bordered\\\">\\n\",\n    \"<tr>\\n\",\n    \"<th style=\\\"width:10%\\\">Operator</th><th style=\\\"width:45%\\\">Description</th><th>Example</th>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>==</td>\\n\",\n    \"<td>If the values of two operands are equal, then the condition becomes true.</td>\\n\",\n    \"<td> (a == b) is not true.</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>!=</td>\\n\",\n    \"<td>If values of two operands are not equal, then condition becomes true.</td>\\n\",\n    \"<td> (a != b) is true.</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&gt;</td>\\n\",\n    \"<td>If the value of left operand is greater than the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &gt; b) is not true.</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&lt;</td>\\n\",\n    \"<td>If the value of left operand is less than the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &lt; b) is true.</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&gt;=</td>\\n\",\n    \"<td>If the value of left operand is greater than or equal to the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &gt;= b) is not true. </td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&lt;=</td>\\n\",\n    \"<td>If the value of left operand is less than or equal to the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &lt;= b) is true. </td>\\n\",\n    \"</tr>\\n\",\n    \"</table>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What will be the resulting Boolean of the following pieces of code (answer fist then check by typing it in!)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Answer before running cell\\n\",\n    \"2 > 3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Answer before running cell\\n\",\n    \"3 <= 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Answer before running cell\\n\",\n    \"3 == 2.0\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Answer before running cell\\n\",\n    \"3.0 == 3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Answer before running cell\\n\",\n    \"4**0.5 != 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Final Question: What is the boolean output of the cell block below?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# two nested lists\\n\",\n    \"l_one = [1,2,[3,4]]\\n\",\n    \"l_two = [1,2,{'k1':4}]\\n\",\n    \"\\n\",\n    \"# True or False?\\n\",\n    \"l_one[2][0] >= l_two[2]['k1']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Great Job on your first assessment! \"\n   ]\n  }\n ],\n \"metadata\": {\n  \"anaconda-cloud\": {},\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/10-Objects and Data Structures Assessment Test-Solution.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\\n\",\n    \"\\n\",\n    \"# Objects and Data Structures Assessment Test\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## Test your knowledge. \\n\",\n    \"\\n\",\n    \"** Answer the following questions **\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"Write a brief description of all the following Object Types and Data Structures we've learned about: \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**For the full answers, review the Jupyter notebook introductions of each topic!**\\n\",\n    \"\\n\",\n    \"[Numbers](http://nbviewer.ipython.org/github/jmportilla/Complete-Python-Bootcamp/blob/master/Numbers.ipynb)\\n\",\n    \"\\n\",\n    \"[Strings](http://nbviewer.ipython.org/github/jmportilla/Complete-Python-Bootcamp/blob/master/Strings.ipynb)\\n\",\n    \"\\n\",\n    \"[Lists](http://nbviewer.ipython.org/github/jmportilla/Complete-Python-Bootcamp/blob/master/Lists.ipynb)\\n\",\n    \"\\n\",\n    \"[Tuples](http://nbviewer.ipython.org/github/jmportilla/Complete-Python-Bootcamp/blob/master/Tuples.ipynb)\\n\",\n    \"\\n\",\n    \"[Dictionaries](http://nbviewer.ipython.org/github/jmportilla/Complete-Python-Bootcamp/blob/master/Dictionaries.ipynb)\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Numbers\\n\",\n    \"\\n\",\n    \"Write an equation that uses multiplication, division, an exponent, addition, and subtraction that is equal to 100.25.\\n\",\n    \"\\n\",\n    \"Hint: This is just to test your memory of the basic arithmetic commands, work backwards from 100.25\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"100.25\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Your answer is probably different\\n\",\n    \"(60 + (10 ** 2) / 4 * 7) - 134.75\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Answer these 3 questions without typing code. Then type code to check your answer.\\n\",\n    \"\\n\",\n    \"    What is the value of the expression 4 * (6 + 5)\\n\",\n    \"    \\n\",\n    \"    What is the value of the expression 4 * 6 + 5 \\n\",\n    \"    \\n\",\n    \"    What is the value of the expression 4 + 6 * 5 \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"44\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"4 * (6 + 5)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"29\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"4 * 6 + 5 \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"34\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"4 + 6 * 5 \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What is the *type* of the result of the expression 3 + 1.5 + 4?\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Answer: Floating Point Number**\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What would you use to find a number’s square root, as well as its square? \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10.0\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Square root:\\n\",\n    \"100 ** 0.5\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"100\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Square:\\n\",\n    \"10 ** 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Strings\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Given the string 'hello' give an index command that returns 'e'. Enter your code in the cell below:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'e'\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s = 'hello'\\n\",\n    \"# Print out 'e' using indexing\\n\",\n    \"\\n\",\n    \"s[1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Reverse the string 'hello' using slicing:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'olleh'\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s ='hello'\\n\",\n    \"# Reverse the string using slicing\\n\",\n    \"\\n\",\n    \"s[::-1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Given the string 'hello', give two methods of producing the letter 'o' using indexing.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'o'\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s ='hello'\\n\",\n    \"# Print out the 'o'\\n\",\n    \"\\n\",\n    \"# Method 1:\\n\",\n    \"\\n\",\n    \"s[-1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'o'\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Method 2:\\n\",\n    \"\\n\",\n    \"s[4]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Lists\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Build this list [0,0,0] two separate ways.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 0, 0]\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Method 1:\\n\",\n    \"[0]*3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 0, 0]\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Method 2:\\n\",\n    \"list2 = [0,0,0]\\n\",\n    \"list2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Reassign 'hello' in this nested list to say 'goodbye' instead:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"list3 = [1,2,[3,4,'hello']]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"list3[2][2] = 'goodbye'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, [3, 4, 'goodbye']]\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list3\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Sort the list below:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"list4 = [5,3,4,6,1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 3, 4, 5, 6]\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Method 1:\\n\",\n    \"sorted(list4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 3, 4, 5, 6]\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Method 2:\\n\",\n    \"list4.sort()\\n\",\n    \"list4\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Dictionaries\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Using keys and indexing, grab the 'hello' from the following dictionaries:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'hello'\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d = {'simple_key':'hello'}\\n\",\n    \"# Grab 'hello'\\n\",\n    \"\\n\",\n    \"d['simple_key']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'hello'\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d = {'k1':{'k2':'hello'}}\\n\",\n    \"# Grab 'hello'\\n\",\n    \"\\n\",\n    \"d['k1']['k2']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Getting a little tricker\\n\",\n    \"d = {'k1':[{'nest_key':['this is deep',['hello']]}]}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'hello'\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# This was harder than I expected...\\n\",\n    \"d['k1'][0]['nest_key'][1][0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# This will be hard and annoying!\\n\",\n    \"d = {'k1':[1,2,{'k2':['this is tricky',{'tough':[1,2,['hello']]}]}]}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'hello'\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Phew!\\n\",\n    \"d['k1'][2]['k2'][1]['tough'][2][0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Can you sort a dictionary? Why or why not?\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Answer: No! Because normal dictionaries are *mappings* not a sequence. **\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Tuples\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What is the major difference between tuples and lists?\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Tuples are immutable!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"How do you create a tuple?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"t = (1,2,3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Sets \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What is unique about a set?\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Answer: They don't allow for duplicate items!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Use a set to find the unique values of the list below:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"list5 = [1,2,2,33,4,4,11,22,3,3,2]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 3, 4, 11, 22, 33}\"\n      ]\n     },\n     \"execution_count\": 27,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"set(list5)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Booleans\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"For the following quiz questions, we will get a preview of comparison operators. In the table below, a=3 and b=4.\\n\",\n    \"\\n\",\n    \"<table class=\\\"table table-bordered\\\">\\n\",\n    \"<tr>\\n\",\n    \"<th style=\\\"width:10%\\\">Operator</th><th style=\\\"width:45%\\\">Description</th><th>Example</th>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>==</td>\\n\",\n    \"<td>If the values of two operands are equal, then the condition becomes true.</td>\\n\",\n    \"<td> (a == b) is not true.</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>!=</td>\\n\",\n    \"<td>If values of two operands are not equal, then condition becomes true.</td>\\n\",\n    \"<td> (a != b) is true.</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&gt;</td>\\n\",\n    \"<td>If the value of left operand is greater than the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &gt; b) is not true.</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&lt;</td>\\n\",\n    \"<td>If the value of left operand is less than the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &lt; b) is true.</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&gt;=</td>\\n\",\n    \"<td>If the value of left operand is greater than or equal to the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &gt;= b) is not true. </td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&lt;=</td>\\n\",\n    \"<td>If the value of left operand is less than or equal to the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &lt;= b) is true. </td>\\n\",\n    \"</tr>\\n\",\n    \"</table>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What will be the resulting Boolean of the following pieces of code (answer fist then check by typing it in!)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 28,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Answer before running cell\\n\",\n    \"2 > 3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 29,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Answer before running cell\\n\",\n    \"3 <= 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 30,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Answer before running cell\\n\",\n    \"3 == 2.0\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 31,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Answer before running cell\\n\",\n    \"3.0 == 3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 32,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Answer before running cell\\n\",\n    \"4**0.5 != 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Final Question: What is the boolean output of the cell block below?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 33,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# two nested lists\\n\",\n    \"l_one = [1,2,[3,4]]\\n\",\n    \"l_two = [1,2,{'k1':4}]\\n\",\n    \"\\n\",\n    \"# True or False?\\n\",\n    \"l_one[2][0] >= l_two[2]['k1']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Great Job on your first assessment! \"\n   ]\n  }\n ],\n \"metadata\": {\n  \"anaconda-cloud\": {},\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "00-Python Object and Data Structure Basics/test.txt",
    "content": "First Line\nSecond Line"
  },
  {
    "path": "01-Python Comparison Operators/.ipynb_checkpoints/01-Comparison Operators-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Comparison Operators \\n\",\n    \"\\n\",\n    \"In this lecture we will be learning about Comparison Operators in Python. These operators will allow us to compare variables and output a Boolean value (True or False). \\n\",\n    \"\\n\",\n    \"If you have any sort of background in Math, these operators should be very straight forward.\\n\",\n    \"\\n\",\n    \"First we'll present a table of the comparison operators and then work through some examples:\\n\",\n    \"\\n\",\n    \"<h2> Table of Comparison Operators </h2><p>  In the table below, a=3 and b=4.</p>\\n\",\n    \"\\n\",\n    \"<table class=\\\"table table-bordered\\\">\\n\",\n    \"<tr>\\n\",\n    \"<th style=\\\"width:10%\\\">Operator</th><th style=\\\"width:45%\\\">Description</th><th>Example</th>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>==</td>\\n\",\n    \"<td>If the values of two operands are equal, then the condition becomes true.</td>\\n\",\n    \"<td> (a == b) is not true.</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>!=</td>\\n\",\n    \"<td>If values of two operands are not equal, then condition becomes true.</td>\\n\",\n    \"<td>(a != b) is true</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&gt;</td>\\n\",\n    \"<td>If the value of left operand is greater than the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &gt; b) is not true.</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&lt;</td>\\n\",\n    \"<td>If the value of left operand is less than the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &lt; b) is true.</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&gt;=</td>\\n\",\n    \"<td>If the value of left operand is greater than or equal to the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &gt;= b) is not true. </td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&lt;=</td>\\n\",\n    \"<td>If the value of left operand is less than or equal to the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &lt;= b) is true. </td>\\n\",\n    \"</tr>\\n\",\n    \"</table>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's now work through quick examples of each of these.\\n\",\n    \"\\n\",\n    \"#### Equal\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 == 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"1 == 0\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note that <code>==</code> is a <em>comparison</em> operator, while <code>=</code> is an <em>assignment</em> operator.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Not Equal\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 != 1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 != 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Greater Than\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 > 1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 > 4\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Less Than\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 < 4\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 < 1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Greater Than or Equal to\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 >= 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 >= 1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Less than or Equal to\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 <= 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 <= 4\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Great! Go over each comparison operator to make sure you understand what each one is saying. But hopefully this was straightforward for you.**\\n\",\n    \"\\n\",\n    \"Next we will cover chained comparison operators\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "01-Python Comparison Operators/.ipynb_checkpoints/02-Chained Comparison Operators-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Chained Comparison Operators\\n\",\n    \"\\n\",\n    \"An interesting feature of Python is the ability to *chain* multiple comparisons to perform a more complex test. You can use these chained comparisons as shorthand for larger Boolean Expressions.\\n\",\n    \"\\n\",\n    \"In this lecture we will learn how to chain comparison operators and we will also introduce two other important statements in Python: **and** and **or**.\\n\",\n    \"\\n\",\n    \"Let's look at a few examples of using chains:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"1 < 2 < 3\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The above statement checks if 1 was less than 2 **and** if 2 was less than 3. We could have written this using an **and** statement in Python:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"1<2 and 2<3\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The **and** is used to make sure two checks have to be true in order for the total check to be true. Let's see another example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"1 < 3 > 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The above checks if 3 is larger than both of the other numbers, so you could use **and** to rewrite it as:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"1<3 and 3>2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"It's important to note that Python is checking both instances of the comparisons. We can also use **or** to write comparisons in Python. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"1==2 or 2<3\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how it was true; this is because with the **or** operator, we only need one *or* the other to be true. Let's see one more example to drive this home:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"1==1 or 100==1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! For an overview of this quick lesson: You should have a comfortable understanding of using **and** and **or** statements as well as reading chained comparison code.\\n\",\n    \"\\n\",\n    \"Go ahead and go to the quiz for this section to check your understanding!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "01-Python Comparison Operators/01-Comparison Operators.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Comparison Operators \\n\",\n    \"\\n\",\n    \"In this lecture we will be learning about Comparison Operators in Python. These operators will allow us to compare variables and output a Boolean value (True or False). \\n\",\n    \"\\n\",\n    \"If you have any sort of background in Math, these operators should be very straight forward.\\n\",\n    \"\\n\",\n    \"First we'll present a table of the comparison operators and then work through some examples:\\n\",\n    \"\\n\",\n    \"<h2> Table of Comparison Operators </h2><p>  In the table below, a=3 and b=4.</p>\\n\",\n    \"\\n\",\n    \"<table class=\\\"table table-bordered\\\">\\n\",\n    \"<tr>\\n\",\n    \"<th style=\\\"width:10%\\\">Operator</th><th style=\\\"width:45%\\\">Description</th><th>Example</th>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>==</td>\\n\",\n    \"<td>If the values of two operands are equal, then the condition becomes true.</td>\\n\",\n    \"<td> (a == b) is not true.</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>!=</td>\\n\",\n    \"<td>If values of two operands are not equal, then condition becomes true.</td>\\n\",\n    \"<td>(a != b) is true</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&gt;</td>\\n\",\n    \"<td>If the value of left operand is greater than the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &gt; b) is not true.</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&lt;</td>\\n\",\n    \"<td>If the value of left operand is less than the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &lt; b) is true.</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&gt;=</td>\\n\",\n    \"<td>If the value of left operand is greater than or equal to the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &gt;= b) is not true. </td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>&lt;=</td>\\n\",\n    \"<td>If the value of left operand is less than or equal to the value of right operand, then condition becomes true.</td>\\n\",\n    \"<td> (a &lt;= b) is true. </td>\\n\",\n    \"</tr>\\n\",\n    \"</table>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's now work through quick examples of each of these.\\n\",\n    \"\\n\",\n    \"#### Equal\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 == 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"1 == 0\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note that <code>==</code> is a <em>comparison</em> operator, while <code>=</code> is an <em>assignment</em> operator.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Not Equal\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 != 1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 != 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Greater Than\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 > 1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 > 4\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Less Than\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 < 4\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 < 1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Greater Than or Equal to\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 >= 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 >= 1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Less than or Equal to\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 <= 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 <= 4\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Great! Go over each comparison operator to make sure you understand what each one is saying. But hopefully this was straightforward for you.**\\n\",\n    \"\\n\",\n    \"Next we will cover chained comparison operators\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "01-Python Comparison Operators/02-Chained Comparison Operators.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Chained Comparison Operators\\n\",\n    \"\\n\",\n    \"An interesting feature of Python is the ability to *chain* multiple comparisons to perform a more complex test. You can use these chained comparisons as shorthand for larger Boolean Expressions.\\n\",\n    \"\\n\",\n    \"In this lecture we will learn how to chain comparison operators and we will also introduce two other important statements in Python: **and** and **or**.\\n\",\n    \"\\n\",\n    \"Let's look at a few examples of using chains:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"1 < 2 < 3\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The above statement checks if 1 was less than 2 **and** if 2 was less than 3. We could have written this using an **and** statement in Python:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"1<2 and 2<3\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The **and** is used to make sure two checks have to be true in order for the total check to be true. Let's see another example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"1 < 3 > 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The above checks if 3 is larger than both of the other numbers, so you could use **and** to rewrite it as:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"1<3 and 3>2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"It's important to note that Python is checking both instances of the comparisons. We can also use **or** to write comparisons in Python. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"1==2 or 2<3\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how it was true; this is because with the **or** operator, we only need one *or* the other to be true. Let's see one more example to drive this home:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"1==1 or 100==1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! For an overview of this quick lesson: You should have a comfortable understanding of using **and** and **or** statements as well as reading chained comparison code.\\n\",\n    \"\\n\",\n    \"Go ahead and go to the quiz for this section to check your understanding!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "02-Python Statements/.ipynb_checkpoints/01-Introduction to Python Statements-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"# Introduction to Python Statements\\n\",\n    \"\\n\",\n    \"In this lecture we will be doing a quick overview of Python Statements. This lecture will emphasize differences between Python and other languages such as C++. \\n\",\n    \"\\n\",\n    \"There are two reasons we take this approach for learning the context of Python Statements:\\n\",\n    \"\\n\",\n    \"    1.) If you are coming from a different language this will rapidly accelerate your understanding of Python.\\n\",\n    \"    2.) Learning about statements will allow you to be able to read other languages more easily in the future.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"## Python vs Other Languages\\n\",\n    \"\\n\",\n    \"Let's create a simple statement that says:\\n\",\n    \"\\\"If a is greater than b, assign 2 to a and 4 to b\\\"\\n\",\n    \"\\n\",\n    \"Take a look at these two if statements (we will learn about building out if statements soon).\\n\",\n    \"\\n\",\n    \"**Version 1 (Other Languages)**\\n\",\n    \"\\n\",\n    \"    if (a>b){\\n\",\n    \"        a = 2;\\n\",\n    \"        b = 4;\\n\",\n    \"    }\\n\",\n    \"                        \\n\",\n    \"**Version 2 (Python)**   \\n\",\n    \"\\n\",\n    \"    if a>b:\\n\",\n    \"        a = 2\\n\",\n    \"        b = 4\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You'll notice that Python is less cluttered and much more readable than the first version. How does Python manage this?\\n\",\n    \"\\n\",\n    \"Let's walk through the main differences:\\n\",\n    \"\\n\",\n    \"Python gets rid of () and {} by incorporating two main factors: a *colon* and *whitespace*. The statement is ended with a colon, and whitespace is used (indentation) to describe what takes place in case of the statement.\\n\",\n    \"\\n\",\n    \"Another major difference is the lack of semicolons in Python. Semicolons are used to denote statement endings in many other languages, but in Python, the end of a line is the same as the end of a statement.\\n\",\n    \"\\n\",\n    \"Lastly, to end this brief overview of differences, let's take a closer look at indentation syntax in Python vs other languages:\\n\",\n    \"\\n\",\n    \"## Indentation\\n\",\n    \"\\n\",\n    \"Here is some pseudo-code to indicate the use of whitespace and indentation in Python:\\n\",\n    \"\\n\",\n    \"**Other Languages**\\n\",\n    \"\\n\",\n    \"    if (x)\\n\",\n    \"        if(y)\\n\",\n    \"            code-statement;\\n\",\n    \"    else\\n\",\n    \"        another-code-statement;\\n\",\n    \"        \\n\",\n    \"**Python**\\n\",\n    \"    \\n\",\n    \"    if x:\\n\",\n    \"        if y:\\n\",\n    \"            code-statement\\n\",\n    \"    else:\\n\",\n    \"        another-code-statement\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how Python is so heavily driven by code indentation and whitespace. This means that code readability is a core part of the design of the Python language.\\n\",\n    \"\\n\",\n    \"Now let's start diving deeper by coding these sort of statements in Python!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## Time to code!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "02-Python Statements/.ipynb_checkpoints/02-if, elif, and else Statements-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# if, elif, else Statements\\n\",\n    \"\\n\",\n    \"<code>if</code> Statements in Python allows us to tell the computer to perform alternative actions based on a certain set of results.\\n\",\n    \"\\n\",\n    \"Verbally, we can imagine we are telling the computer:\\n\",\n    \"\\n\",\n    \"\\\"Hey if this case happens, perform some action\\\"\\n\",\n    \"\\n\",\n    \"We can then expand the idea further with <code>elif</code> and <code>else</code> statements, which allow us to tell the computer:\\n\",\n    \"\\n\",\n    \"\\\"Hey if this case happens, perform some action. Else, if another case happens, perform some other action. Else, if *none* of the above cases happened, perform this action.\\\"\\n\",\n    \"\\n\",\n    \"Let's go ahead and look at the syntax format for <code>if</code> statements to get a better idea of this:\\n\",\n    \"\\n\",\n    \"    if case1:\\n\",\n    \"        perform action1\\n\",\n    \"    elif case2:\\n\",\n    \"        perform action2\\n\",\n    \"    else: \\n\",\n    \"        perform action3\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## First Example\\n\",\n    \"\\n\",\n    \"Let's see a quick example of this:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"It was true!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"if True:\\n\",\n    \"    print('It was true!')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's add in some else logic:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"I will be printed in any case where x is not true\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = False\\n\",\n    \"\\n\",\n    \"if x:\\n\",\n    \"    print('x was True!')\\n\",\n    \"else:\\n\",\n    \"    print('I will be printed in any case where x is not true')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Multiple Branches\\n\",\n    \"\\n\",\n    \"Let's get a fuller picture of how far <code>if</code>, <code>elif</code>, and <code>else</code> can take us!\\n\",\n    \"\\n\",\n    \"We write this out in a nested structure. Take note of how the <code>if</code>, <code>elif</code>, and <code>else</code> line up in the code. This can help you see what <code>if</code> is related to what <code>elif</code> or <code>else</code> statements.\\n\",\n    \"\\n\",\n    \"We'll reintroduce a comparison syntax for Python.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Welcome to the bank!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"loc = 'Bank'\\n\",\n    \"\\n\",\n    \"if loc == 'Auto Shop':\\n\",\n    \"    print('Welcome to the Auto Shop!')\\n\",\n    \"elif loc == 'Bank':\\n\",\n    \"    print('Welcome to the bank!')\\n\",\n    \"else:\\n\",\n    \"    print('Where are you?')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how the nested <code>if</code> statements are each checked until a True boolean causes the nested code below it to run. You should also note that you can put in as many <code>elif</code> statements as you want before you close off with an <code>else</code>.\\n\",\n    \"\\n\",\n    \"Let's create two more simple examples for the <code>if</code>, <code>elif</code>, and <code>else</code> statements:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Welcome Sammy!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"person = 'Sammy'\\n\",\n    \"\\n\",\n    \"if person == 'Sammy':\\n\",\n    \"    print('Welcome Sammy!')\\n\",\n    \"else:\\n\",\n    \"    print(\\\"Welcome, what's your name?\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Welcome George!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"person = 'George'\\n\",\n    \"\\n\",\n    \"if person == 'Sammy':\\n\",\n    \"    print('Welcome Sammy!')\\n\",\n    \"elif person =='George':\\n\",\n    \"    print('Welcome George!')\\n\",\n    \"else:\\n\",\n    \"    print(\\\"Welcome, what's your name?\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Indentation\\n\",\n    \"\\n\",\n    \"It is important to keep a good understanding of how indentation works in Python to maintain the structure and order of your code. We will touch on this topic again when we start building out functions!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "02-Python Statements/.ipynb_checkpoints/03-for Loops-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# for Loops\\n\",\n    \"\\n\",\n    \"A <code>for</code> loop acts as an iterator in Python; it goes through items that are in a *sequence* or any other iterable item. Objects that we've learned about that we can iterate over include strings, lists, tuples, and even built-in iterables for dictionaries, such as keys or values.\\n\",\n    \"\\n\",\n    \"We've already seen the <code>for</code> statement a little bit in past lectures but now let's formalize our understanding.\\n\",\n    \"\\n\",\n    \"Here's the general format for a <code>for</code> loop in Python:\\n\",\n    \"\\n\",\n    \"    for item in object:\\n\",\n    \"        statements to do stuff\\n\",\n    \"    \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The variable name used for the item is completely up to the coder, so use your best judgment for choosing a name that makes sense and you will be able to understand when revisiting your code. This item name can then be referenced inside your loop, for example if you wanted to use <code>if</code> statements to perform checks.\\n\",\n    \"\\n\",\n    \"Let's go ahead and work through several example of <code>for</code> loops using a variety of data object types. We'll start simple and build more complexity later on.\\n\",\n    \"\\n\",\n    \"## Example 1\\n\",\n    \"Iterating through a list\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# We'll learn how to automate this sort of list in the next lecture\\n\",\n    \"list1 = [1,2,3,4,5,6,7,8,9,10]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"1\\n\",\n      \"2\\n\",\n      \"3\\n\",\n      \"4\\n\",\n      \"5\\n\",\n      \"6\\n\",\n      \"7\\n\",\n      \"8\\n\",\n      \"9\\n\",\n      \"10\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for num in list1:\\n\",\n    \"    print(num)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Hopefully this makes sense. Now let's add an <code>if</code> statement to check for even numbers. We'll first introduce a new concept here--the modulo.\\n\",\n    \"### Modulo\\n\",\n    \"The modulo allows us to get the remainder in a division and uses the % symbol. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"17 % 5\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This makes sense since 17 divided by 5 is 3 remainder 2. Let's see a few more quick examples:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# 3 Remainder 1\\n\",\n    \"10 % 3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# 2 Remainder 4\\n\",\n    \"18 % 7\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# 2 no remainder\\n\",\n    \"4 % 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice that if a number is fully divisible with no remainder, the result of the modulo call is 0. We can use this to test for even numbers, since if a number modulo 2 is equal to 0, that means it is an even number!\\n\",\n    \"\\n\",\n    \"Back to the <code>for</code> loops!\\n\",\n    \"\\n\",\n    \"## Example 2\\n\",\n    \"Let's print only the even numbers from that list!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"2\\n\",\n      \"4\\n\",\n      \"6\\n\",\n      \"8\\n\",\n      \"10\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for num in list1:\\n\",\n    \"    if num % 2 == 0:\\n\",\n    \"        print(num)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We could have also put an <code>else</code> statement in there:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Odd number\\n\",\n      \"2\\n\",\n      \"Odd number\\n\",\n      \"4\\n\",\n      \"Odd number\\n\",\n      \"6\\n\",\n      \"Odd number\\n\",\n      \"8\\n\",\n      \"Odd number\\n\",\n      \"10\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for num in list1:\\n\",\n    \"    if num % 2 == 0:\\n\",\n    \"        print(num)\\n\",\n    \"    else:\\n\",\n    \"        print('Odd number')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example 3\\n\",\n    \"Another common idea during a <code>for</code> loop is keeping some sort of running tally during multiple loops. For example, let's create a <code>for</code> loop that sums up the list:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"55\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Start sum at zero\\n\",\n    \"list_sum = 0 \\n\",\n    \"\\n\",\n    \"for num in list1:\\n\",\n    \"    list_sum = list_sum + num\\n\",\n    \"\\n\",\n    \"print(list_sum)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Read over the above cell and make sure you understand fully what is going on. Also we could have implemented a <code>+=</code> to perform the addition towards the sum. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"55\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Start sum at zero\\n\",\n    \"list_sum = 0 \\n\",\n    \"\\n\",\n    \"for num in list1:\\n\",\n    \"    list_sum += num\\n\",\n    \"\\n\",\n    \"print(list_sum)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example 4\\n\",\n    \"We've used <code>for</code> loops with lists, how about with strings? Remember strings are a sequence so when we iterate through them we will be accessing each item in that string.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"T\\n\",\n      \"h\\n\",\n      \"i\\n\",\n      \"s\\n\",\n      \" \\n\",\n      \"i\\n\",\n      \"s\\n\",\n      \" \\n\",\n      \"a\\n\",\n      \" \\n\",\n      \"s\\n\",\n      \"t\\n\",\n      \"r\\n\",\n      \"i\\n\",\n      \"n\\n\",\n      \"g\\n\",\n      \".\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for letter in 'This is a string.':\\n\",\n    \"    print(letter)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example 5\\n\",\n    \"Let's now look at how a <code>for</code> loop can be used with a tuple:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"1\\n\",\n      \"2\\n\",\n      \"3\\n\",\n      \"4\\n\",\n      \"5\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"tup = (1,2,3,4,5)\\n\",\n    \"\\n\",\n    \"for t in tup:\\n\",\n    \"    print(t)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example 6\\n\",\n    \"Tuples have a special quality when it comes to <code>for</code> loops. If you are iterating through a sequence that contains tuples, the item can actually be the tuple itself, this is an example of *tuple unpacking*. During the <code>for</code> loop we will be unpacking the tuple inside of a sequence and we can access the individual items inside that tuple!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"list2 = [(2,4),(6,8),(10,12)]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"(2, 4)\\n\",\n      \"(6, 8)\\n\",\n      \"(10, 12)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for tup in list2:\\n\",\n    \"    print(tup)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"2\\n\",\n      \"6\\n\",\n      \"10\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Now with unpacking!\\n\",\n    \"for (t1,t2) in list2:\\n\",\n    \"    print(t1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Cool! With tuples in a sequence we can access the items inside of them through unpacking! The reason this is important is because many objects will deliver their iterables through tuples. Let's start exploring iterating through Dictionaries to explore this further!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example 7\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"d = {'k1':1,'k2':2,'k3':3}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"k1\\n\",\n      \"k2\\n\",\n      \"k3\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for item in d:\\n\",\n    \"    print(item)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice how this produces only the keys. So how can we get the values? Or both the keys and the values? \\n\",\n    \"\\n\",\n    \"We're going to introduce three new Dictionary methods: **.keys()**, **.values()** and **.items()**\\n\",\n    \"\\n\",\n    \"In Python each of these methods return a *dictionary view object*. It supports operations like membership test and iteration, but its contents are not independent of the original dictionary – it is only a view. Let's see it in action:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"dict_items([('k1', 1), ('k2', 2), ('k3', 3)])\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Create a dictionary view object\\n\",\n    \"d.items()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Since the .items() method supports iteration, we can perform *dictionary unpacking* to separate keys and values just as we did in the previous examples.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"k1\\n\",\n      \"1\\n\",\n      \"k2\\n\",\n      \"2\\n\",\n      \"k3\\n\",\n      \"3\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Dictionary unpacking\\n\",\n    \"for k,v in d.items():\\n\",\n    \"    print(k)\\n\",\n    \"    print(v) \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you want to obtain a true list of keys, values, or key/value tuples, you can *cast* the view as a list:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['k1', 'k2', 'k3']\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(d.keys())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Remember that dictionaries are unordered, and that keys and values come back in arbitrary order. You can obtain a sorted list using sorted():\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 3]\"\n      ]\n     },\n     \"execution_count\": 21,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sorted(d.values())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Conclusion\\n\",\n    \"\\n\",\n    \"We've learned how to use for loops to iterate through tuples, lists, strings, and dictionaries. It will be an important tool for us, so make sure you know it well and understood the above examples.\\n\",\n    \"\\n\",\n    \"[More resources](http://www.tutorialspoint.com/python/python_for_loop.htm)\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "02-Python Statements/.ipynb_checkpoints/04-while Loops-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# while Loops\\n\",\n    \"\\n\",\n    \"The <code>while</code> statement in Python is one of most general ways to perform iteration. A <code>while</code> statement will repeatedly execute a single statement or group of statements as long as the condition is true. The reason it is called a 'loop' is because the code statements are looped through over and over again until the condition is no longer met.\\n\",\n    \"\\n\",\n    \"The general format of a while loop is:\\n\",\n    \"\\n\",\n    \"    while test:\\n\",\n    \"        code statements\\n\",\n    \"    else:\\n\",\n    \"        final code statements\\n\",\n    \"\\n\",\n    \"Let’s look at a few simple <code>while</code> loops in action. \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"x is currently:  0\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  1\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  2\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  3\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  4\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  5\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  6\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  7\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  8\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  9\\n\",\n      \" x is still less than 10, adding 1 to x\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = 0\\n\",\n    \"\\n\",\n    \"while x < 10:\\n\",\n    \"    print('x is currently: ',x)\\n\",\n    \"    print(' x is still less than 10, adding 1 to x')\\n\",\n    \"    x+=1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice how many times the print statements occurred and how the <code>while</code> loop kept going until the True condition was met, which occurred once x==10. It's important to note that once this occurred the code stopped. Let's see how we could add an <code>else</code> statement:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"x is currently:  0\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  1\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  2\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  3\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  4\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  5\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  6\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  7\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  8\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  9\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"All Done!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = 0\\n\",\n    \"\\n\",\n    \"while x < 10:\\n\",\n    \"    print('x is currently: ',x)\\n\",\n    \"    print(' x is still less than 10, adding 1 to x')\\n\",\n    \"    x+=1\\n\",\n    \"    \\n\",\n    \"else:\\n\",\n    \"    print('All Done!')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# break, continue, pass\\n\",\n    \"\\n\",\n    \"We can use <code>break</code>, <code>continue</code>, and <code>pass</code> statements in our loops to add additional functionality for various cases. The three statements are defined by:\\n\",\n    \"\\n\",\n    \"    break: Breaks out of the current closest enclosing loop.\\n\",\n    \"    continue: Goes to the top of the closest enclosing loop.\\n\",\n    \"    pass: Does nothing at all.\\n\",\n    \"    \\n\",\n    \"    \\n\",\n    \"Thinking about <code>break</code> and <code>continue</code> statements, the general format of the <code>while</code> loop looks like this:\\n\",\n    \"\\n\",\n    \"    while test: \\n\",\n    \"        code statement\\n\",\n    \"        if test: \\n\",\n    \"            break\\n\",\n    \"        if test: \\n\",\n    \"            continue \\n\",\n    \"    else:\\n\",\n    \"\\n\",\n    \"<code>break</code> and <code>continue</code> statements can appear anywhere inside the loop’s body, but we will usually put them further nested in conjunction with an <code>if</code> statement to perform an action based on some condition.\\n\",\n    \"\\n\",\n    \"Let's go ahead and look at some examples!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"x is currently:  0\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"continuing...\\n\",\n      \"x is currently:  1\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"continuing...\\n\",\n      \"x is currently:  2\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x==3\\n\",\n      \"x is currently:  3\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"continuing...\\n\",\n      \"x is currently:  4\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"continuing...\\n\",\n      \"x is currently:  5\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"continuing...\\n\",\n      \"x is currently:  6\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"continuing...\\n\",\n      \"x is currently:  7\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"continuing...\\n\",\n      \"x is currently:  8\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"continuing...\\n\",\n      \"x is currently:  9\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"continuing...\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = 0\\n\",\n    \"\\n\",\n    \"while x < 10:\\n\",\n    \"    print('x is currently: ',x)\\n\",\n    \"    print(' x is still less than 10, adding 1 to x')\\n\",\n    \"    x+=1\\n\",\n    \"    if x==3:\\n\",\n    \"        print('x==3')\\n\",\n    \"    else:\\n\",\n    \"        print('continuing...')\\n\",\n    \"        continue\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how we have a printed statement when x==3, and a continue being printed out as we continue through the outer while loop. Let's put in a break once x ==3 and see if the result makes sense:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"x is currently:  0\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"continuing...\\n\",\n      \"x is currently:  1\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"continuing...\\n\",\n      \"x is currently:  2\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"Breaking because x==3\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = 0\\n\",\n    \"\\n\",\n    \"while x < 10:\\n\",\n    \"    print('x is currently: ',x)\\n\",\n    \"    print(' x is still less than 10, adding 1 to x')\\n\",\n    \"    x+=1\\n\",\n    \"    if x==3:\\n\",\n    \"        print('Breaking because x==3')\\n\",\n    \"        break\\n\",\n    \"    else:\\n\",\n    \"        print('continuing...')\\n\",\n    \"        continue\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how the other <code>else</code> statement wasn't reached and continuing was never printed!\\n\",\n    \"\\n\",\n    \"After these brief but simple examples, you should feel comfortable using <code>while</code> statements in your code.\\n\",\n    \"\\n\",\n    \"**A word of caution however! It is possible to create an infinitely running loop with <code>while</code> statements. For example:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# DO NOT RUN THIS CODE!!!! \\n\",\n    \"while True:\\n\",\n    \"    print(\\\"I'm stuck in an infinite loop!\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"A quick note: If you *did* run the above cell, click on the Kernel menu above to restart the kernel!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "02-Python Statements/.ipynb_checkpoints/05-Useful-Operators-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Useful Operators\\n\",\n    \"\\n\",\n    \"There are a few built-in functions and \\\"operators\\\" in Python that don't fit well into any category, so we will go over them in this lecture, let's begin!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## range\\n\",\n    \"\\n\",\n    \"The range function allows you to quickly *generate* a list of integers, this comes in handy a lot, so take note of how to use it! There are 3 parameters you can pass, a start, a stop, and a step size. Let's see some examples:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"range(0, 11)\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"range(0,11)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note that this is a **generator** function, so to actually get a list out of it, we need to cast it to a list with **list()**. What is a generator? Its a special type of function that will generate information and not need to save it to memory. We haven't talked about functions or generators yet, so just keep this in your notes for now, we will discuss this in much more detail in later on in your training!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Notice how 11 is not included, up to but not including 11, just like slice notation!\\n\",\n    \"list(range(0,11))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(range(0,12))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 2, 4, 6, 8, 10]\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Third parameter is step size!\\n\",\n    \"# step size just means how big of a jump/leap/step you \\n\",\n    \"# take from the starting number to get to the next number.\\n\",\n    \"\\n\",\n    \"list(range(0,11,2))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(range(0,101,10))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## enumerate\\n\",\n    \"\\n\",\n    \"enumerate is a very useful function to use with for loops. Let's imagine the following situation:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"At index 0 the letter is a\\n\",\n      \"At index 1 the letter is b\\n\",\n      \"At index 2 the letter is c\\n\",\n      \"At index 3 the letter is d\\n\",\n      \"At index 4 the letter is e\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"index_count = 0\\n\",\n    \"\\n\",\n    \"for letter in 'abcde':\\n\",\n    \"    print(\\\"At index {} the letter is {}\\\".format(index_count,letter))\\n\",\n    \"    index_count += 1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Keeping track of how many loops you've gone through is so common, that enumerate was created so you don't need to worry about creating and updating this index_count or loop_count variable\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"At index 0 the letter is a\\n\",\n      \"At index 1 the letter is b\\n\",\n      \"At index 2 the letter is c\\n\",\n      \"At index 3 the letter is d\\n\",\n      \"At index 4 the letter is e\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Notice the tuple unpacking!\\n\",\n    \"\\n\",\n    \"for i,letter in enumerate('abcde'):\\n\",\n    \"    print(\\\"At index {} the letter is {}\\\".format(i,letter))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## zip\\n\",\n    \"\\n\",\n    \"Notice the format enumerate actually returns, let's take a look by transforming it to a list()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e')]\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(enumerate('abcde'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"It was a list of tuples, meaning we could use tuple unpacking during our for loop. This data structure is actually very common in Python , especially when working with outside libraries. You can use the **zip()** function to quickly create a list of tuples by \\\"zipping\\\" up together two lists.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"mylist1 = [1,2,3,4,5]\\n\",\n    \"mylist2 = ['a','b','c','d','e']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<zip at 0x1d205086f08>\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# This one is also a generator! We will explain this later, but for now let's transform it to a list\\n\",\n    \"zip(mylist1,mylist2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e')]\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(zip(mylist1,mylist2))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"To use the generator, we could just use a for loop\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"For this tuple, first item was 1 and second item was a\\n\",\n      \"For this tuple, first item was 2 and second item was b\\n\",\n      \"For this tuple, first item was 3 and second item was c\\n\",\n      \"For this tuple, first item was 4 and second item was d\\n\",\n      \"For this tuple, first item was 5 and second item was e\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for item1, item2 in zip(mylist1,mylist2):\\n\",\n    \"    print('For this tuple, first item was {} and second item was {}'.format(item1,item2))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## in operator\\n\",\n    \"\\n\",\n    \"We've already seen the **in** keyword during the for loop, but we can also use it to quickly check if an object is in a list\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 21,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"'x' in ['x','y','z']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"'x' in [1,2,3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## not in\\n\",\n    \"\\n\",\n    \"We can combine **in** with a **not** operator, to check if some object or variable is not present in a list.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"'x' not in ['x','y','z']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"'x' not in [1,2,3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## min and max\\n\",\n    \"\\n\",\n    \"Quickly check the minimum or maximum of a list with these functions.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"mylist = [10,20,30,40,100]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10\"\n      ]\n     },\n     \"execution_count\": 27,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"min(mylist)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 44,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"100\"\n      ]\n     },\n     \"execution_count\": 44,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"max(mylist)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## random\\n\",\n    \"\\n\",\n    \"Python comes with a built in random library. There are a lot of functions included in this random library, so we will only show you two useful functions for now.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from random import shuffle\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# This shuffles the list \\\"in-place\\\" meaning it won't return\\n\",\n    \"# anything, instead it will effect the list passed\\n\",\n    \"shuffle(mylist)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[40, 10, 100, 30, 20]\"\n      ]\n     },\n     \"execution_count\": 36,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mylist\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from random import randint\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"25\"\n      ]\n     },\n     \"execution_count\": 41,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Return random integer in range [a, b], including both end points.\\n\",\n    \"randint(0,100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 42,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"91\"\n      ]\n     },\n     \"execution_count\": 42,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Return random integer in range [a, b], including both end points.\\n\",\n    \"randint(0,100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## input\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 43,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Enter Something into this box: great job!\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'great job!'\"\n      ]\n     },\n     \"execution_count\": 43,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"input('Enter Something into this box: ')\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "02-Python Statements/.ipynb_checkpoints/05-range()-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# range()\\n\",\n    \"\\n\",\n    \"In this short lecture we will be discussing the range function. We haven't developed a very deep level of knowledge of functions yet, but we can understand the basics of this simple (but extremely useful!) function.\\n\",\n    \"\\n\",\n    \"range() allows us to generate a list of numbers ranging from a starting point *up to but not including* an ending point. We can also specify step size. Let's walk through a few examples:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(range(0,10))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"To see the output of range() as a list, we *cast* it as a list as shown above. This is rarely done, as normally range is used in <code>for</code> loops.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"range\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Range objects\\n\",\n    \"x =range(0,10)\\n\",\n    \"type(x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<code>range</code> objects behave like *generators* - they don't produce every value all at once, but deliver them one at a time as needed. Behind the scenes this saves on overhead since you're not storing every value, and it improves the performance of your code! We will learn more about generators later on in the course.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"start = 0 #Default\\n\",\n    \"stop = 20 \\n\",\n    \"x = range(start,stop)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Notice how it went *up to* 20, but doesn't actually produce 20. Just like in indexing. What about step size? We can specify that as a third argument:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"x = range(start,stop,2)\\n\",\n    \"\\n\",\n    \"#Show\\n\",\n    \"list(x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"You should now have a good understanding of how to use range() in Python.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "02-Python Statements/.ipynb_checkpoints/06-List Comprehensions-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# List Comprehensions\\n\",\n    \"\\n\",\n    \"In addition to sequence operations and list methods, Python includes a more advanced operation called a list comprehension.\\n\",\n    \"\\n\",\n    \"List comprehensions allow us to build out lists using a different notation. You can think of it as essentially a one line <code>for</code> loop built inside of brackets. For a simple example:\\n\",\n    \"## Example 1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Grab every letter in string\\n\",\n    \"lst = [x for x in 'word']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['w', 'o', 'r', 'd']\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"lst\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This is the basic idea of a list comprehension. If you're familiar with mathematical notation this format should feel familiar for example: x^2 : x in { 0,1,2...10 } \\n\",\n    \"\\n\",\n    \"Let's see a few more examples of list comprehensions in Python:\\n\",\n    \"## Example 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Square numbers in range and turn into list\\n\",\n    \"lst = [x**2 for x in range(0,11)]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lst\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example 3\\n\",\n    \"Let's see how to add in <code>if</code> statements:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check for even numbers in a range\\n\",\n    \"lst = [x for x in range(11) if x % 2 == 0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 2, 4, 6, 8, 10]\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lst\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example 4\\n\",\n    \"Can also do more complicated arithmetic:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[32.0, 50.0, 68.18, 94.1]\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Convert Celsius to Fahrenheit\\n\",\n    \"celsius = [0,10,20.1,34.5]\\n\",\n    \"\\n\",\n    \"fahrenheit = [((9/5)*temp + 32) for temp in celsius ]\\n\",\n    \"\\n\",\n    \"fahrenheit\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example 5\\n\",\n    \"We can also perform nested list comprehensions, for example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 1, 16, 81, 256, 625, 1296, 2401, 4096, 6561, 10000]\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lst = [ x**2 for x in [x**2 for x in range(11)]]\\n\",\n    \"lst\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Later on in the course we will learn about generator comprehensions. After this lecture you should feel comfortable reading and writing basic list comprehensions.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "02-Python Statements/.ipynb_checkpoints/07-Statements Assessment Test-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# Statements Assessment Test\\n\",\n    \"Let's test your knowledge!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"_____\\n\",\n    \"**Use <code>for</code>, .split(), and <code>if</code> to create a Statement that will print out words that start with 's':**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"st = 'Print only the words that start with s in this sentence'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#Code here\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"______\\n\",\n    \"**Use range() to print all the even numbers from 0 to 10.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#Code Here\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"**Use a List Comprehension to create a list of all numbers between 1 and 50 that are divisible by 3.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#Code in this cell\\n\",\n    \"[]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"_____\\n\",\n    \"**Go through the string below and if the length of a word is even print \\\"even!\\\"**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"st = 'Print every word in this sentence that has an even number of letters'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#Code in this cell\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a program that prints the integers from 1 to 100. But for multiples of three print \\\"Fizz\\\" instead of the number, and for the multiples of five print \\\"Buzz\\\". For numbers which are multiples of both three and five print \\\"FizzBuzz\\\".**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#Code in this cell\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Use List Comprehension to create a list of the first letters of every word in the string below:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"st = 'Create a list of the first letters of every word in this string'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#Code in this cell\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "02-Python Statements/.ipynb_checkpoints/08-Statements Assessment Test - Solutions-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# Statements Assessment Solutions\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"_____\\n\",\n    \"**Use <code>for</code>, .split(), and <code>if</code> to create a Statement that will print out words that start with 's':**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"st = 'Print only the words that start with s in this sentence'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"start\\n\",\n      \"s\\n\",\n      \"sentence\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for word in st.split():\\n\",\n    \"    if word[0] == 's':\\n\",\n    \"        print(word)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"______\\n\",\n    \"**Use range() to print all the even numbers from 0 to 10.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 2, 4, 6, 8, 10]\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(range(0,11,2))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"**Use List comprehension to create a list of all numbers between 1 and 50 that are divisible by 3.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48]\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"[x for x in range(1,51) if x%3 == 0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"_____\\n\",\n    \"**Go through the string below and if the length of a word is even print \\\"even!\\\"**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"st = 'Print every word in this sentence that has an even number of letters'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"word <-- has an even length!\\n\",\n      \"in <-- has an even length!\\n\",\n      \"this <-- has an even length!\\n\",\n      \"sentence <-- has an even length!\\n\",\n      \"that <-- has an even length!\\n\",\n      \"an <-- has an even length!\\n\",\n      \"even <-- has an even length!\\n\",\n      \"number <-- has an even length!\\n\",\n      \"of <-- has an even length!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for word in st.split():\\n\",\n    \"    if len(word)%2 == 0:\\n\",\n    \"        print(word+\\\" <-- has an even length!\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a program that prints the integers from 1 to 100. But for multiples of three print \\\"Fizz\\\" instead of the number, and for the multiples of five print \\\"Buzz\\\". For numbers which are multiples of both three and five print \\\"FizzBuzz\\\".**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"for num in range(1,101):\\n\",\n    \"    if num % 3 == 0 and num % 5 == 0:\\n\",\n    \"        print(\\\"FizzBuzz\\\")\\n\",\n    \"    elif num % 3 == 0:\\n\",\n    \"        print(\\\"Fizz\\\")\\n\",\n    \"    elif num % 5 == 0:\\n\",\n    \"        print(\\\"Buzz\\\")\\n\",\n    \"    else:\\n\",\n    \"        print(num)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Use a List Comprehension to create a list of the first letters of every word in the string below:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"st = 'Create a list of the first letters of every word in this string'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['C', 'a', 'l', 'o', 't', 'f', 'l', 'o', 'e', 'w', 'i', 't', 's']\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"[word[0] for word in st.split()]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "02-Python Statements/.ipynb_checkpoints/09-Guessing Game Challenge-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Guessing Game Challenge\\n\",\n    \"\\n\",\n    \"Let's use `while` loops to create a guessing game.\\n\",\n    \"\\n\",\n    \"The Challenge:\\n\",\n    \"\\n\",\n    \"Write a program that picks a random integer from 1 to 100, and has players guess the number. The rules are:\\n\",\n    \"\\n\",\n    \"1. If a player's guess is less than 1 or greater than 100, say \\\"OUT OF BOUNDS\\\"\\n\",\n    \"2. On a player's first turn, if their guess is\\n\",\n    \" * within 10 of the number, return \\\"WARM!\\\"\\n\",\n    \" * further than 10 away from the number, return \\\"COLD!\\\"\\n\",\n    \"3. On all subsequent turns, if a guess is \\n\",\n    \" * closer to the number than the previous guess return \\\"WARMER!\\\"\\n\",\n    \" * farther from the number than the previous guess, return \\\"COLDER!\\\"\\n\",\n    \"4. When the player's guess equals the number, tell them they've guessed correctly *and* how many guesses it took!\\n\",\n    \"\\n\",\n    \"You can try this from scratch, or follow the steps outlined below. A separate Solution notebook has been provided. Good luck!\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### First, pick a random integer from 1 to 100 using the random module and assign it to a variable\\n\",\n    \"\\n\",\n    \"Note: `random.randint(a,b)` returns a random integer in range `[a, b]`, including both end points.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Next, print an introduction to the game and explain the rules\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Create a list to store guesses\\n\",\n    \"\\n\",\n    \"Hint: zero is a good placeholder value. It's useful because it evaluates to \\\"False\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Write a `while` loop that asks for a valid guess. Test it a few times to make sure it works.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"while True:\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Write a `while` loop that compares the player's guess to our number. If the player guesses correctly, break from the loop. Otherwise, tell the player if they're warmer or colder, and continue asking for guesses.\\n\",\n    \"\\n\",\n    \"Some hints:\\n\",\n    \"* it may help to sketch out all possible combinations on paper first!\\n\",\n    \"* you can use the `abs()` function to find the positive difference between two numbers\\n\",\n    \"* if you append all new guesses to the list, then the previous guess is given as `guesses[-2]`\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"while True:\\n\",\n    \"\\n\",\n    \"    # we can copy the code from above to take an input\\n\",\n    \"\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"That's it! You've just programmed your first game!\\n\",\n    \"\\n\",\n    \"In the next section we'll learn how to turn some of these repetitive actions into *functions* that can be called whenever we need them.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Good Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "02-Python Statements/.ipynb_checkpoints/10-Guessing Game Challenge - Solution-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Guessing Game Challenge - Solution\\n\",\n    \"\\n\",\n    \"Let's use `while` loops to create a guessing game.\\n\",\n    \"\\n\",\n    \"The Challenge:\\n\",\n    \"\\n\",\n    \"Write a program that picks a random integer from 1 to 100, and has players guess the number. The rules are:\\n\",\n    \"\\n\",\n    \"1. If a player's guess is less than 1 or greater than 100, say \\\"OUT OF BOUNDS\\\"\\n\",\n    \"2. On a player's first turn, if their guess is\\n\",\n    \" * within 10 of the number, return \\\"WARM!\\\"\\n\",\n    \" * further than 10 away from the number, return \\\"COLD!\\\"\\n\",\n    \"3. On all subsequent turns, if a guess is \\n\",\n    \" * closer to the number than the previous guess return \\\"WARMER!\\\"\\n\",\n    \" * farther from the number than the previous guess, return \\\"COLDER!\\\"\\n\",\n    \"4. When the player's guess equals the number, tell them they've guessed correctly *and* how many guesses it took!\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### First, pick a random integer from 1 to 100 using the random module and assign it to a variable\\n\",\n    \"\\n\",\n    \"Note: `random.randint(a,b)` returns a random integer in range `[a, b]`, including both end points.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import random\\n\",\n    \"\\n\",\n    \"num = random.randint(1,100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Next, print an introduction to the game and explain the rules\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"WELCOME TO GUESS ME!\\n\",\n      \"I'm thinking of a number between 1 and 100\\n\",\n      \"If your guess is more than 10 away from my number, I'll tell you you're COLD\\n\",\n      \"If your guess is within 10 of my number, I'll tell you you're WARM\\n\",\n      \"If your guess is farther than your most recent guess, I'll say you're getting COLDER\\n\",\n      \"If your guess is closer than your most recent guess, I'll say you're getting WARMER\\n\",\n      \"LET'S PLAY!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(\\\"WELCOME TO GUESS ME!\\\")\\n\",\n    \"print(\\\"I'm thinking of a number between 1 and 100\\\")\\n\",\n    \"print(\\\"If your guess is more than 10 away from my number, I'll tell you you're COLD\\\")\\n\",\n    \"print(\\\"If your guess is within 10 of my number, I'll tell you you're WARM\\\")\\n\",\n    \"print(\\\"If your guess is farther than your most recent guess, I'll say you're getting COLDER\\\")\\n\",\n    \"print(\\\"If your guess is closer than your most recent guess, I'll say you're getting WARMER\\\")\\n\",\n    \"print(\\\"LET'S PLAY!\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Create a list to store guesses\\n\",\n    \"\\n\",\n    \"Hint: zero is a good placeholder value. It's useful because it evaluates to \\\"False\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"guesses = [0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Write a `while` loop that asks for a valid guess. Test it a few times to make sure it works.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"I'm thinking of a number between 1 and 100.\\n\",\n      \"  What is your guess? 500\\n\",\n      \"OUT OF BOUNDS! Please try again: \\n\",\n      \"I'm thinking of a number between 1 and 100.\\n\",\n      \"  What is your guess? 50\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"while True:\\n\",\n    \"    \\n\",\n    \"    guess = int(input(\\\"I'm thinking of a number between 1 and 100.\\\\n  What is your guess? \\\"))\\n\",\n    \"    \\n\",\n    \"    if guess < 1 or guess > 100:\\n\",\n    \"        print('OUT OF BOUNDS! Please try again: ')\\n\",\n    \"        continue\\n\",\n    \"        \\n\",\n    \"    break\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Write a `while` loop that compares the player's guess to our number. If the player guesses correctly, break from the loop. Otherwise, tell the player if they're warmer or colder, and continue asking for guesses.\\n\",\n    \"\\n\",\n    \"Some hints:\\n\",\n    \"* it may help to sketch out all possible combinations on paper first!\\n\",\n    \"* you can use the `abs()` function to find the positive difference between two numbers\\n\",\n    \"* if you append all new guesses to the list, then the previous guess is given as `guesses[-2]`\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"I'm thinking of a number between 1 and 100.\\n\",\n      \"  What is your guess? 50\\n\",\n      \"COLD!\\n\",\n      \"I'm thinking of a number between 1 and 100.\\n\",\n      \"  What is your guess? 75\\n\",\n      \"WARMER!\\n\",\n      \"I'm thinking of a number between 1 and 100.\\n\",\n      \"  What is your guess? 85\\n\",\n      \"WARMER!\\n\",\n      \"I'm thinking of a number between 1 and 100.\\n\",\n      \"  What is your guess? 92\\n\",\n      \"COLDER!\\n\",\n      \"I'm thinking of a number between 1 and 100.\\n\",\n      \"  What is your guess? 80\\n\",\n      \"WARMER!\\n\",\n      \"I'm thinking of a number between 1 and 100.\\n\",\n      \"  What is your guess? 78\\n\",\n      \"COLDER!\\n\",\n      \"I'm thinking of a number between 1 and 100.\\n\",\n      \"  What is your guess? 82\\n\",\n      \"WARMER!\\n\",\n      \"I'm thinking of a number between 1 and 100.\\n\",\n      \"  What is your guess? 83\\n\",\n      \"COLDER!\\n\",\n      \"I'm thinking of a number between 1 and 100.\\n\",\n      \"  What is your guess? 81\\n\",\n      \"CONGRATULATIONS, YOU GUESSED IT IN ONLY 9 GUESSES!!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"while True:\\n\",\n    \"\\n\",\n    \"    # we can copy the code from above to take an input\\n\",\n    \"    guess = int(input(\\\"I'm thinking of a number between 1 and 100.\\\\n  What is your guess? \\\"))\\n\",\n    \"    \\n\",\n    \"    if guess < 1 or guess > 100:\\n\",\n    \"        print('OUT OF BOUNDS! Please try again: ')\\n\",\n    \"        continue\\n\",\n    \"    \\n\",\n    \"    # here we compare the player's guess to our number\\n\",\n    \"    if guess == num:\\n\",\n    \"        print(f'CONGRATULATIONS, YOU GUESSED IT IN ONLY {len(guesses)} GUESSES!!')\\n\",\n    \"        break\\n\",\n    \"        \\n\",\n    \"    # if guess is incorrect, add guess to the list\\n\",\n    \"    guesses.append(guess)\\n\",\n    \"    \\n\",\n    \"    # when testing the first guess, guesses[-2]==0, which evaluates to False\\n\",\n    \"    # and brings us down to the second section\\n\",\n    \"    \\n\",\n    \"    if guesses[-2]:  \\n\",\n    \"        if abs(num-guess) < abs(num-guesses[-2]):\\n\",\n    \"            print('WARMER!')\\n\",\n    \"        else:\\n\",\n    \"            print('COLDER!')\\n\",\n    \"   \\n\",\n    \"    else:\\n\",\n    \"        if abs(num-guess) <= 10:\\n\",\n    \"            print('WARM!')\\n\",\n    \"        else:\\n\",\n    \"            print('COLD!')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"That's it! You've just programmed your first game!\\n\",\n    \"\\n\",\n    \"In the next section we'll learn how to turn some of these repetitive actions into *functions* that can be called whenever we need them.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Good Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "02-Python Statements/01-Introduction to Python Statements.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"# Introduction to Python Statements\\n\",\n    \"\\n\",\n    \"In this lecture we will be doing a quick overview of Python Statements. This lecture will emphasize differences between Python and other languages such as C++. \\n\",\n    \"\\n\",\n    \"There are two reasons we take this approach for learning the context of Python Statements:\\n\",\n    \"\\n\",\n    \"    1.) If you are coming from a different language this will rapidly accelerate your understanding of Python.\\n\",\n    \"    2.) Learning about statements will allow you to be able to read other languages more easily in the future.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"## Python vs Other Languages\\n\",\n    \"\\n\",\n    \"Let's create a simple statement that says:\\n\",\n    \"\\\"If a is greater than b, assign 2 to a and 4 to b\\\"\\n\",\n    \"\\n\",\n    \"Take a look at these two if statements (we will learn about building out if statements soon).\\n\",\n    \"\\n\",\n    \"**Version 1 (Other Languages)**\\n\",\n    \"\\n\",\n    \"    if (a>b){\\n\",\n    \"        a = 2;\\n\",\n    \"        b = 4;\\n\",\n    \"    }\\n\",\n    \"                        \\n\",\n    \"**Version 2 (Python)**   \\n\",\n    \"\\n\",\n    \"    if a>b:\\n\",\n    \"        a = 2\\n\",\n    \"        b = 4\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You'll notice that Python is less cluttered and much more readable than the first version. How does Python manage this?\\n\",\n    \"\\n\",\n    \"Let's walk through the main differences:\\n\",\n    \"\\n\",\n    \"Python gets rid of () and {} by incorporating two main factors: a *colon* and *whitespace*. The statement is ended with a colon, and whitespace is used (indentation) to describe what takes place in case of the statement.\\n\",\n    \"\\n\",\n    \"Another major difference is the lack of semicolons in Python. Semicolons are used to denote statement endings in many other languages, but in Python, the end of a line is the same as the end of a statement.\\n\",\n    \"\\n\",\n    \"Lastly, to end this brief overview of differences, let's take a closer look at indentation syntax in Python vs other languages:\\n\",\n    \"\\n\",\n    \"## Indentation\\n\",\n    \"\\n\",\n    \"Here is some pseudo-code to indicate the use of whitespace and indentation in Python:\\n\",\n    \"\\n\",\n    \"**Other Languages**\\n\",\n    \"\\n\",\n    \"    if (x)\\n\",\n    \"        if(y)\\n\",\n    \"            code-statement;\\n\",\n    \"    else\\n\",\n    \"        another-code-statement;\\n\",\n    \"        \\n\",\n    \"**Python**\\n\",\n    \"    \\n\",\n    \"    if x:\\n\",\n    \"        if y:\\n\",\n    \"            code-statement\\n\",\n    \"    else:\\n\",\n    \"        another-code-statement\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how Python is so heavily driven by code indentation and whitespace. This means that code readability is a core part of the design of the Python language.\\n\",\n    \"\\n\",\n    \"Now let's start diving deeper by coding these sort of statements in Python!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## Time to code!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "02-Python Statements/02-if, elif, and else Statements.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# if, elif, else Statements\\n\",\n    \"\\n\",\n    \"<code>if</code> Statements in Python allows us to tell the computer to perform alternative actions based on a certain set of results.\\n\",\n    \"\\n\",\n    \"Verbally, we can imagine we are telling the computer:\\n\",\n    \"\\n\",\n    \"\\\"Hey if this case happens, perform some action\\\"\\n\",\n    \"\\n\",\n    \"We can then expand the idea further with <code>elif</code> and <code>else</code> statements, which allow us to tell the computer:\\n\",\n    \"\\n\",\n    \"\\\"Hey if this case happens, perform some action. Else, if another case happens, perform some other action. Else, if *none* of the above cases happened, perform this action.\\\"\\n\",\n    \"\\n\",\n    \"Let's go ahead and look at the syntax format for <code>if</code> statements to get a better idea of this:\\n\",\n    \"\\n\",\n    \"    if case1:\\n\",\n    \"        perform action1\\n\",\n    \"    elif case2:\\n\",\n    \"        perform action2\\n\",\n    \"    else: \\n\",\n    \"        perform action3\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## First Example\\n\",\n    \"\\n\",\n    \"Let's see a quick example of this:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"It was true!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"if True:\\n\",\n    \"    print('It was true!')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's add in some else logic:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"I will be printed in any case where x is not true\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = False\\n\",\n    \"\\n\",\n    \"if x:\\n\",\n    \"    print('x was True!')\\n\",\n    \"else:\\n\",\n    \"    print('I will be printed in any case where x is not true')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Multiple Branches\\n\",\n    \"\\n\",\n    \"Let's get a fuller picture of how far <code>if</code>, <code>elif</code>, and <code>else</code> can take us!\\n\",\n    \"\\n\",\n    \"We write this out in a nested structure. Take note of how the <code>if</code>, <code>elif</code>, and <code>else</code> line up in the code. This can help you see what <code>if</code> is related to what <code>elif</code> or <code>else</code> statements.\\n\",\n    \"\\n\",\n    \"We'll reintroduce a comparison syntax for Python.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Welcome to the bank!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"loc = 'Bank'\\n\",\n    \"\\n\",\n    \"if loc == 'Auto Shop':\\n\",\n    \"    print('Welcome to the Auto Shop!')\\n\",\n    \"elif loc == 'Bank':\\n\",\n    \"    print('Welcome to the bank!')\\n\",\n    \"else:\\n\",\n    \"    print('Where are you?')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how the nested <code>if</code> statements are each checked until a True boolean causes the nested code below it to run. You should also note that you can put in as many <code>elif</code> statements as you want before you close off with an <code>else</code>.\\n\",\n    \"\\n\",\n    \"Let's create two more simple examples for the <code>if</code>, <code>elif</code>, and <code>else</code> statements:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Welcome Sammy!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"person = 'Sammy'\\n\",\n    \"\\n\",\n    \"if person == 'Sammy':\\n\",\n    \"    print('Welcome Sammy!')\\n\",\n    \"else:\\n\",\n    \"    print(\\\"Welcome, what's your name?\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Welcome George!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"person = 'George'\\n\",\n    \"\\n\",\n    \"if person == 'Sammy':\\n\",\n    \"    print('Welcome Sammy!')\\n\",\n    \"elif person =='George':\\n\",\n    \"    print('Welcome George!')\\n\",\n    \"else:\\n\",\n    \"    print(\\\"Welcome, what's your name?\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Indentation\\n\",\n    \"\\n\",\n    \"It is important to keep a good understanding of how indentation works in Python to maintain the structure and order of your code. We will touch on this topic again when we start building out functions!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "02-Python Statements/03-for Loops.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# for Loops\\n\",\n    \"\\n\",\n    \"A <code>for</code> loop acts as an iterator in Python; it goes through items that are in a *sequence* or any other iterable item. Objects that we've learned about that we can iterate over include strings, lists, tuples, and even built-in iterables for dictionaries, such as keys or values.\\n\",\n    \"\\n\",\n    \"We've already seen the <code>for</code> statement a little bit in past lectures but now let's formalize our understanding.\\n\",\n    \"\\n\",\n    \"Here's the general format for a <code>for</code> loop in Python:\\n\",\n    \"\\n\",\n    \"    for item in object:\\n\",\n    \"        statements to do stuff\\n\",\n    \"    \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The variable name used for the item is completely up to the coder, so use your best judgment for choosing a name that makes sense and you will be able to understand when revisiting your code. This item name can then be referenced inside your loop, for example if you wanted to use <code>if</code> statements to perform checks.\\n\",\n    \"\\n\",\n    \"Let's go ahead and work through several example of <code>for</code> loops using a variety of data object types. We'll start simple and build more complexity later on.\\n\",\n    \"\\n\",\n    \"## Example 1\\n\",\n    \"Iterating through a list\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# We'll learn how to automate this sort of list in the next lecture\\n\",\n    \"list1 = [1,2,3,4,5,6,7,8,9,10]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"1\\n\",\n      \"2\\n\",\n      \"3\\n\",\n      \"4\\n\",\n      \"5\\n\",\n      \"6\\n\",\n      \"7\\n\",\n      \"8\\n\",\n      \"9\\n\",\n      \"10\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for num in list1:\\n\",\n    \"    print(num)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Hopefully this makes sense. Now let's add an <code>if</code> statement to check for even numbers. We'll first introduce a new concept here--the modulo.\\n\",\n    \"### Modulo\\n\",\n    \"The modulo allows us to get the remainder in a division and uses the % symbol. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"17 % 5\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This makes sense since 17 divided by 5 is 3 remainder 2. Let's see a few more quick examples:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# 3 Remainder 1\\n\",\n    \"10 % 3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# 2 Remainder 4\\n\",\n    \"18 % 7\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# 2 no remainder\\n\",\n    \"4 % 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice that if a number is fully divisible with no remainder, the result of the modulo call is 0. We can use this to test for even numbers, since if a number modulo 2 is equal to 0, that means it is an even number!\\n\",\n    \"\\n\",\n    \"Back to the <code>for</code> loops!\\n\",\n    \"\\n\",\n    \"## Example 2\\n\",\n    \"Let's print only the even numbers from that list!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"2\\n\",\n      \"4\\n\",\n      \"6\\n\",\n      \"8\\n\",\n      \"10\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for num in list1:\\n\",\n    \"    if num % 2 == 0:\\n\",\n    \"        print(num)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We could have also put an <code>else</code> statement in there:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Odd number\\n\",\n      \"2\\n\",\n      \"Odd number\\n\",\n      \"4\\n\",\n      \"Odd number\\n\",\n      \"6\\n\",\n      \"Odd number\\n\",\n      \"8\\n\",\n      \"Odd number\\n\",\n      \"10\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for num in list1:\\n\",\n    \"    if num % 2 == 0:\\n\",\n    \"        print(num)\\n\",\n    \"    else:\\n\",\n    \"        print('Odd number')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example 3\\n\",\n    \"Another common idea during a <code>for</code> loop is keeping some sort of running tally during multiple loops. For example, let's create a <code>for</code> loop that sums up the list:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"55\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Start sum at zero\\n\",\n    \"list_sum = 0 \\n\",\n    \"\\n\",\n    \"for num in list1:\\n\",\n    \"    list_sum = list_sum + num\\n\",\n    \"\\n\",\n    \"print(list_sum)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Read over the above cell and make sure you understand fully what is going on. Also we could have implemented a <code>+=</code> to perform the addition towards the sum. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"55\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Start sum at zero\\n\",\n    \"list_sum = 0 \\n\",\n    \"\\n\",\n    \"for num in list1:\\n\",\n    \"    list_sum += num\\n\",\n    \"\\n\",\n    \"print(list_sum)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example 4\\n\",\n    \"We've used <code>for</code> loops with lists, how about with strings? Remember strings are a sequence so when we iterate through them we will be accessing each item in that string.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"T\\n\",\n      \"h\\n\",\n      \"i\\n\",\n      \"s\\n\",\n      \" \\n\",\n      \"i\\n\",\n      \"s\\n\",\n      \" \\n\",\n      \"a\\n\",\n      \" \\n\",\n      \"s\\n\",\n      \"t\\n\",\n      \"r\\n\",\n      \"i\\n\",\n      \"n\\n\",\n      \"g\\n\",\n      \".\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for letter in 'This is a string.':\\n\",\n    \"    print(letter)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example 5\\n\",\n    \"Let's now look at how a <code>for</code> loop can be used with a tuple:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"1\\n\",\n      \"2\\n\",\n      \"3\\n\",\n      \"4\\n\",\n      \"5\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"tup = (1,2,3,4,5)\\n\",\n    \"\\n\",\n    \"for t in tup:\\n\",\n    \"    print(t)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example 6\\n\",\n    \"Tuples have a special quality when it comes to <code>for</code> loops. If you are iterating through a sequence that contains tuples, the item can actually be the tuple itself, this is an example of *tuple unpacking*. During the <code>for</code> loop we will be unpacking the tuple inside of a sequence and we can access the individual items inside that tuple!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"list2 = [(2,4),(6,8),(10,12)]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"(2, 4)\\n\",\n      \"(6, 8)\\n\",\n      \"(10, 12)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for tup in list2:\\n\",\n    \"    print(tup)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"2\\n\",\n      \"6\\n\",\n      \"10\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Now with unpacking!\\n\",\n    \"for (t1,t2) in list2:\\n\",\n    \"    print(t1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Cool! With tuples in a sequence we can access the items inside of them through unpacking! The reason this is important is because many objects will deliver their iterables through tuples. Let's start exploring iterating through Dictionaries to explore this further!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example 7\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"d = {'k1':1,'k2':2,'k3':3}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"k1\\n\",\n      \"k2\\n\",\n      \"k3\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for item in d:\\n\",\n    \"    print(item)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice how this produces only the keys. So how can we get the values? Or both the keys and the values? \\n\",\n    \"\\n\",\n    \"We're going to introduce three new Dictionary methods: **.keys()**, **.values()** and **.items()**\\n\",\n    \"\\n\",\n    \"In Python each of these methods return a *dictionary view object*. It supports operations like membership test and iteration, but its contents are not independent of the original dictionary – it is only a view. Let's see it in action:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"dict_items([('k1', 1), ('k2', 2), ('k3', 3)])\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Create a dictionary view object\\n\",\n    \"d.items()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Since the .items() method supports iteration, we can perform *dictionary unpacking* to separate keys and values just as we did in the previous examples.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"k1\\n\",\n      \"1\\n\",\n      \"k2\\n\",\n      \"2\\n\",\n      \"k3\\n\",\n      \"3\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Dictionary unpacking\\n\",\n    \"for k,v in d.items():\\n\",\n    \"    print(k)\\n\",\n    \"    print(v) \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you want to obtain a true list of keys, values, or key/value tuples, you can *cast* the view as a list:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['k1', 'k2', 'k3']\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(d.keys())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Remember that dictionaries are unordered, and that keys and values come back in arbitrary order. You can obtain a sorted list using sorted():\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 3]\"\n      ]\n     },\n     \"execution_count\": 21,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sorted(d.values())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Conclusion\\n\",\n    \"\\n\",\n    \"We've learned how to use for loops to iterate through tuples, lists, strings, and dictionaries. It will be an important tool for us, so make sure you know it well and understood the above examples.\\n\",\n    \"\\n\",\n    \"[More resources](http://www.tutorialspoint.com/python/python_for_loop.htm)\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "02-Python Statements/04-while Loops.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# while Loops\\n\",\n    \"\\n\",\n    \"The <code>while</code> statement in Python is one of most general ways to perform iteration. A <code>while</code> statement will repeatedly execute a single statement or group of statements as long as the condition is true. The reason it is called a 'loop' is because the code statements are looped through over and over again until the condition is no longer met.\\n\",\n    \"\\n\",\n    \"The general format of a while loop is:\\n\",\n    \"\\n\",\n    \"    while test:\\n\",\n    \"        code statements\\n\",\n    \"    else:\\n\",\n    \"        final code statements\\n\",\n    \"\\n\",\n    \"Let’s look at a few simple <code>while</code> loops in action. \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"x is currently:  0\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  1\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  2\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  3\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  4\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  5\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  6\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  7\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  8\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  9\\n\",\n      \" x is still less than 10, adding 1 to x\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = 0\\n\",\n    \"\\n\",\n    \"while x < 10:\\n\",\n    \"    print('x is currently: ',x)\\n\",\n    \"    print(' x is still less than 10, adding 1 to x')\\n\",\n    \"    x+=1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice how many times the print statements occurred and how the <code>while</code> loop kept going until the True condition was met, which occurred once x==10. It's important to note that once this occurred the code stopped. Let's see how we could add an <code>else</code> statement:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"x is currently:  0\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  1\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  2\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  3\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  4\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  5\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  6\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  7\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  8\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x is currently:  9\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"All Done!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = 0\\n\",\n    \"\\n\",\n    \"while x < 10:\\n\",\n    \"    print('x is currently: ',x)\\n\",\n    \"    print(' x is still less than 10, adding 1 to x')\\n\",\n    \"    x+=1\\n\",\n    \"    \\n\",\n    \"else:\\n\",\n    \"    print('All Done!')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# break, continue, pass\\n\",\n    \"\\n\",\n    \"We can use <code>break</code>, <code>continue</code>, and <code>pass</code> statements in our loops to add additional functionality for various cases. The three statements are defined by:\\n\",\n    \"\\n\",\n    \"    break: Breaks out of the current closest enclosing loop.\\n\",\n    \"    continue: Goes to the top of the closest enclosing loop.\\n\",\n    \"    pass: Does nothing at all.\\n\",\n    \"    \\n\",\n    \"    \\n\",\n    \"Thinking about <code>break</code> and <code>continue</code> statements, the general format of the <code>while</code> loop looks like this:\\n\",\n    \"\\n\",\n    \"    while test: \\n\",\n    \"        code statement\\n\",\n    \"        if test: \\n\",\n    \"            break\\n\",\n    \"        if test: \\n\",\n    \"            continue \\n\",\n    \"    else:\\n\",\n    \"\\n\",\n    \"<code>break</code> and <code>continue</code> statements can appear anywhere inside the loop’s body, but we will usually put them further nested in conjunction with an <code>if</code> statement to perform an action based on some condition.\\n\",\n    \"\\n\",\n    \"Let's go ahead and look at some examples!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"x is currently:  0\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"continuing...\\n\",\n      \"x is currently:  1\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"continuing...\\n\",\n      \"x is currently:  2\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"x==3\\n\",\n      \"x is currently:  3\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"continuing...\\n\",\n      \"x is currently:  4\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"continuing...\\n\",\n      \"x is currently:  5\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"continuing...\\n\",\n      \"x is currently:  6\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"continuing...\\n\",\n      \"x is currently:  7\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"continuing...\\n\",\n      \"x is currently:  8\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"continuing...\\n\",\n      \"x is currently:  9\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"continuing...\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = 0\\n\",\n    \"\\n\",\n    \"while x < 10:\\n\",\n    \"    print('x is currently: ',x)\\n\",\n    \"    print(' x is still less than 10, adding 1 to x')\\n\",\n    \"    x+=1\\n\",\n    \"    if x==3:\\n\",\n    \"        print('x==3')\\n\",\n    \"    else:\\n\",\n    \"        print('continuing...')\\n\",\n    \"        continue\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how we have a printed statement when x==3, and a continue being printed out as we continue through the outer while loop. Let's put in a break once x ==3 and see if the result makes sense:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"x is currently:  0\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"continuing...\\n\",\n      \"x is currently:  1\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"continuing...\\n\",\n      \"x is currently:  2\\n\",\n      \" x is still less than 10, adding 1 to x\\n\",\n      \"Breaking because x==3\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = 0\\n\",\n    \"\\n\",\n    \"while x < 10:\\n\",\n    \"    print('x is currently: ',x)\\n\",\n    \"    print(' x is still less than 10, adding 1 to x')\\n\",\n    \"    x+=1\\n\",\n    \"    if x==3:\\n\",\n    \"        print('Breaking because x==3')\\n\",\n    \"        break\\n\",\n    \"    else:\\n\",\n    \"        print('continuing...')\\n\",\n    \"        continue\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how the other <code>else</code> statement wasn't reached and continuing was never printed!\\n\",\n    \"\\n\",\n    \"After these brief but simple examples, you should feel comfortable using <code>while</code> statements in your code.\\n\",\n    \"\\n\",\n    \"**A word of caution however! It is possible to create an infinitely running loop with <code>while</code> statements. For example:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# DO NOT RUN THIS CODE!!!! \\n\",\n    \"while True:\\n\",\n    \"    print(\\\"I'm stuck in an infinite loop!\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"A quick note: If you *did* run the above cell, click on the Kernel menu above to restart the kernel!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "02-Python Statements/05-Useful-Operators.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Useful Operators\\n\",\n    \"\\n\",\n    \"There are a few built-in functions and \\\"operators\\\" in Python that don't fit well into any category, so we will go over them in this lecture, let's begin!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## range\\n\",\n    \"\\n\",\n    \"The range function allows you to quickly *generate* a list of integers, this comes in handy a lot, so take note of how to use it! There are 3 parameters you can pass, a start, a stop, and a step size. Let's see some examples:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"range(0, 11)\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"range(0,11)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note that this is a **generator** function, so to actually get a list out of it, we need to cast it to a list with **list()**. What is a generator? Its a special type of function that will generate information and not need to save it to memory. We haven't talked about functions or generators yet, so just keep this in your notes for now, we will discuss this in much more detail in later on in your training!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Notice how 11 is not included, up to but not including 11, just like slice notation!\\n\",\n    \"list(range(0,11))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(range(0,12))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 2, 4, 6, 8, 10]\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Third parameter is step size!\\n\",\n    \"# step size just means how big of a jump/leap/step you \\n\",\n    \"# take from the starting number to get to the next number.\\n\",\n    \"\\n\",\n    \"list(range(0,11,2))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(range(0,101,10))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## enumerate\\n\",\n    \"\\n\",\n    \"enumerate is a very useful function to use with for loops. Let's imagine the following situation:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"At index 0 the letter is a\\n\",\n      \"At index 1 the letter is b\\n\",\n      \"At index 2 the letter is c\\n\",\n      \"At index 3 the letter is d\\n\",\n      \"At index 4 the letter is e\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"index_count = 0\\n\",\n    \"\\n\",\n    \"for letter in 'abcde':\\n\",\n    \"    print(\\\"At index {} the letter is {}\\\".format(index_count,letter))\\n\",\n    \"    index_count += 1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Keeping track of how many loops you've gone through is so common, that enumerate was created so you don't need to worry about creating and updating this index_count or loop_count variable\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"At index 0 the letter is a\\n\",\n      \"At index 1 the letter is b\\n\",\n      \"At index 2 the letter is c\\n\",\n      \"At index 3 the letter is d\\n\",\n      \"At index 4 the letter is e\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Notice the tuple unpacking!\\n\",\n    \"\\n\",\n    \"for i,letter in enumerate('abcde'):\\n\",\n    \"    print(\\\"At index {} the letter is {}\\\".format(i,letter))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## zip\\n\",\n    \"\\n\",\n    \"Notice the format enumerate actually returns, let's take a look by transforming it to a list()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e')]\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(enumerate('abcde'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"It was a list of tuples, meaning we could use tuple unpacking during our for loop. This data structure is actually very common in Python , especially when working with outside libraries. You can use the **zip()** function to quickly create a list of tuples by \\\"zipping\\\" up together two lists.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"mylist1 = [1,2,3,4,5]\\n\",\n    \"mylist2 = ['a','b','c','d','e']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<zip at 0x1d205086f08>\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# This one is also a generator! We will explain this later, but for now let's transform it to a list\\n\",\n    \"zip(mylist1,mylist2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e')]\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(zip(mylist1,mylist2))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"To use the generator, we could just use a for loop\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"For this tuple, first item was 1 and second item was a\\n\",\n      \"For this tuple, first item was 2 and second item was b\\n\",\n      \"For this tuple, first item was 3 and second item was c\\n\",\n      \"For this tuple, first item was 4 and second item was d\\n\",\n      \"For this tuple, first item was 5 and second item was e\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for item1, item2 in zip(mylist1,mylist2):\\n\",\n    \"    print('For this tuple, first item was {} and second item was {}'.format(item1,item2))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## in operator\\n\",\n    \"\\n\",\n    \"We've already seen the **in** keyword during the for loop, but we can also use it to quickly check if an object is in a list\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 21,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"'x' in ['x','y','z']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"'x' in [1,2,3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## not in\\n\",\n    \"\\n\",\n    \"We can combine **in** with a **not** operator, to check if some object or variable is not present in a list.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"'x' not in ['x','y','z']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"'x' not in [1,2,3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## min and max\\n\",\n    \"\\n\",\n    \"Quickly check the minimum or maximum of a list with these functions.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"mylist = [10,20,30,40,100]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10\"\n      ]\n     },\n     \"execution_count\": 27,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"min(mylist)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 44,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"100\"\n      ]\n     },\n     \"execution_count\": 44,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"max(mylist)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## random\\n\",\n    \"\\n\",\n    \"Python comes with a built in random library. There are a lot of functions included in this random library, so we will only show you two useful functions for now.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from random import shuffle\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# This shuffles the list \\\"in-place\\\" meaning it won't return\\n\",\n    \"# anything, instead it will effect the list passed\\n\",\n    \"shuffle(mylist)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[40, 10, 100, 30, 20]\"\n      ]\n     },\n     \"execution_count\": 36,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mylist\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from random import randint\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"25\"\n      ]\n     },\n     \"execution_count\": 41,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Return random integer in range [a, b], including both end points.\\n\",\n    \"randint(0,100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 42,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"91\"\n      ]\n     },\n     \"execution_count\": 42,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Return random integer in range [a, b], including both end points.\\n\",\n    \"randint(0,100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## input\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 43,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Enter Something into this box: great job!\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'great job!'\"\n      ]\n     },\n     \"execution_count\": 43,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"input('Enter Something into this box: ')\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "02-Python Statements/06-List Comprehensions.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# List Comprehensions\\n\",\n    \"\\n\",\n    \"In addition to sequence operations and list methods, Python includes a more advanced operation called a list comprehension.\\n\",\n    \"\\n\",\n    \"List comprehensions allow us to build out lists using a different notation. You can think of it as essentially a one line <code>for</code> loop built inside of brackets. For a simple example:\\n\",\n    \"## Example 1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Grab every letter in string\\n\",\n    \"lst = [x for x in 'word']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['w', 'o', 'r', 'd']\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"lst\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This is the basic idea of a list comprehension. If you're familiar with mathematical notation this format should feel familiar for example: x^2 : x in { 0,1,2...10 } \\n\",\n    \"\\n\",\n    \"Let's see a few more examples of list comprehensions in Python:\\n\",\n    \"## Example 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Square numbers in range and turn into list\\n\",\n    \"lst = [x**2 for x in range(0,11)]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lst\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example 3\\n\",\n    \"Let's see how to add in <code>if</code> statements:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check for even numbers in a range\\n\",\n    \"lst = [x for x in range(11) if x % 2 == 0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 2, 4, 6, 8, 10]\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lst\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example 4\\n\",\n    \"Can also do more complicated arithmetic:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[32.0, 50.0, 68.18, 94.1]\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Convert Celsius to Fahrenheit\\n\",\n    \"celsius = [0,10,20.1,34.5]\\n\",\n    \"\\n\",\n    \"fahrenheit = [((9/5)*temp + 32) for temp in celsius ]\\n\",\n    \"\\n\",\n    \"fahrenheit\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example 5\\n\",\n    \"We can also perform nested list comprehensions, for example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 1, 16, 81, 256, 625, 1296, 2401, 4096, 6561, 10000]\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lst = [ x**2 for x in [x**2 for x in range(11)]]\\n\",\n    \"lst\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Later on in the course we will learn about generator comprehensions. After this lecture you should feel comfortable reading and writing basic list comprehensions.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "02-Python Statements/07-Statements Assessment Test.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# Statements Assessment Test\\n\",\n    \"Let's test your knowledge!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"_____\\n\",\n    \"**Use <code>for</code>, .split(), and <code>if</code> to create a Statement that will print out words that start with 's':**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"st = 'Print only the words that start with s in this sentence'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#Code here\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"______\\n\",\n    \"**Use range() to print all the even numbers from 0 to 10.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#Code Here\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"**Use a List Comprehension to create a list of all numbers between 1 and 50 that are divisible by 3.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#Code in this cell\\n\",\n    \"[]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"_____\\n\",\n    \"**Go through the string below and if the length of a word is even print \\\"even!\\\"**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"st = 'Print every word in this sentence that has an even number of letters'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#Code in this cell\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a program that prints the integers from 1 to 100. But for multiples of three print \\\"Fizz\\\" instead of the number, and for the multiples of five print \\\"Buzz\\\". For numbers which are multiples of both three and five print \\\"FizzBuzz\\\".**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#Code in this cell\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Use List Comprehension to create a list of the first letters of every word in the string below:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"st = 'Create a list of the first letters of every word in this string'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#Code in this cell\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "02-Python Statements/08-Statements Assessment Test - Solutions.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# Statements Assessment Solutions\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"_____\\n\",\n    \"**Use <code>for</code>, .split(), and <code>if</code> to create a Statement that will print out words that start with 's':**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"st = 'Print only the words that start with s in this sentence'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"start\\n\",\n      \"s\\n\",\n      \"sentence\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for word in st.split():\\n\",\n    \"    if word[0] == 's':\\n\",\n    \"        print(word)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"______\\n\",\n    \"**Use range() to print all the even numbers from 0 to 10.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 2, 4, 6, 8, 10]\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(range(0,11,2))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"**Use List comprehension to create a list of all numbers between 1 and 50 that are divisible by 3.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48]\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"[x for x in range(1,51) if x%3 == 0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"_____\\n\",\n    \"**Go through the string below and if the length of a word is even print \\\"even!\\\"**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"st = 'Print every word in this sentence that has an even number of letters'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"word <-- has an even length!\\n\",\n      \"in <-- has an even length!\\n\",\n      \"this <-- has an even length!\\n\",\n      \"sentence <-- has an even length!\\n\",\n      \"that <-- has an even length!\\n\",\n      \"an <-- has an even length!\\n\",\n      \"even <-- has an even length!\\n\",\n      \"number <-- has an even length!\\n\",\n      \"of <-- has an even length!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for word in st.split():\\n\",\n    \"    if len(word)%2 == 0:\\n\",\n    \"        print(word+\\\" <-- has an even length!\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a program that prints the integers from 1 to 100. But for multiples of three print \\\"Fizz\\\" instead of the number, and for the multiples of five print \\\"Buzz\\\". For numbers which are multiples of both three and five print \\\"FizzBuzz\\\".**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"for num in range(1,101):\\n\",\n    \"    if num % 3 == 0 and num % 5 == 0:\\n\",\n    \"        print(\\\"FizzBuzz\\\")\\n\",\n    \"    elif num % 3 == 0:\\n\",\n    \"        print(\\\"Fizz\\\")\\n\",\n    \"    elif num % 5 == 0:\\n\",\n    \"        print(\\\"Buzz\\\")\\n\",\n    \"    else:\\n\",\n    \"        print(num)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Use a List Comprehension to create a list of the first letters of every word in the string below:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"st = 'Create a list of the first letters of every word in this string'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['C', 'a', 'l', 'o', 't', 'f', 'l', 'o', 'e', 'w', 'i', 't', 's']\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"[word[0] for word in st.split()]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "02-Python Statements/09-Guessing Game Challenge.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Guessing Game Challenge\\n\",\n    \"\\n\",\n    \"Let's use `while` loops to create a guessing game.\\n\",\n    \"\\n\",\n    \"The Challenge:\\n\",\n    \"\\n\",\n    \"Write a program that picks a random integer from 1 to 100, and has players guess the number. The rules are:\\n\",\n    \"\\n\",\n    \"1. If a player's guess is less than 1 or greater than 100, say \\\"OUT OF BOUNDS\\\"\\n\",\n    \"2. On a player's first turn, if their guess is\\n\",\n    \" * within 10 of the number, return \\\"WARM!\\\"\\n\",\n    \" * further than 10 away from the number, return \\\"COLD!\\\"\\n\",\n    \"3. On all subsequent turns, if a guess is \\n\",\n    \" * closer to the number than the previous guess return \\\"WARMER!\\\"\\n\",\n    \" * farther from the number than the previous guess, return \\\"COLDER!\\\"\\n\",\n    \"4. When the player's guess equals the number, tell them they've guessed correctly *and* how many guesses it took!\\n\",\n    \"\\n\",\n    \"You can try this from scratch, or follow the steps outlined below. A separate Solution notebook has been provided. Good luck!\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### First, pick a random integer from 1 to 100 using the random module and assign it to a variable\\n\",\n    \"\\n\",\n    \"Note: `random.randint(a,b)` returns a random integer in range `[a, b]`, including both end points.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Next, print an introduction to the game and explain the rules\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Create a list to store guesses\\n\",\n    \"\\n\",\n    \"Hint: zero is a good placeholder value. It's useful because it evaluates to \\\"False\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Write a `while` loop that asks for a valid guess. Test it a few times to make sure it works.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"while True:\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Write a `while` loop that compares the player's guess to our number. If the player guesses correctly, break from the loop. Otherwise, tell the player if they're warmer or colder, and continue asking for guesses.\\n\",\n    \"\\n\",\n    \"Some hints:\\n\",\n    \"* it may help to sketch out all possible combinations on paper first!\\n\",\n    \"* you can use the `abs()` function to find the positive difference between two numbers\\n\",\n    \"* if you append all new guesses to the list, then the previous guess is given as `guesses[-2]`\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"while True:\\n\",\n    \"\\n\",\n    \"    # we can copy the code from above to take an input\\n\",\n    \"\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"That's it! You've just programmed your first game!\\n\",\n    \"\\n\",\n    \"In the next section we'll learn how to turn some of these repetitive actions into *functions* that can be called whenever we need them.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Good Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "02-Python Statements/10-Guessing Game Challenge - Solution.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Guessing Game Challenge - Solution\\n\",\n    \"\\n\",\n    \"Let's use `while` loops to create a guessing game.\\n\",\n    \"\\n\",\n    \"The Challenge:\\n\",\n    \"\\n\",\n    \"Write a program that picks a random integer from 1 to 100, and has players guess the number. The rules are:\\n\",\n    \"\\n\",\n    \"1. If a player's guess is less than 1 or greater than 100, say \\\"OUT OF BOUNDS\\\"\\n\",\n    \"2. On a player's first turn, if their guess is\\n\",\n    \" * within 10 of the number, return \\\"WARM!\\\"\\n\",\n    \" * further than 10 away from the number, return \\\"COLD!\\\"\\n\",\n    \"3. On all subsequent turns, if a guess is \\n\",\n    \" * closer to the number than the previous guess return \\\"WARMER!\\\"\\n\",\n    \" * farther from the number than the previous guess, return \\\"COLDER!\\\"\\n\",\n    \"4. When the player's guess equals the number, tell them they've guessed correctly *and* how many guesses it took!\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### First, pick a random integer from 1 to 100 using the random module and assign it to a variable\\n\",\n    \"\\n\",\n    \"Note: `random.randint(a,b)` returns a random integer in range `[a, b]`, including both end points.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import random\\n\",\n    \"\\n\",\n    \"num = random.randint(1,100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Next, print an introduction to the game and explain the rules\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"WELCOME TO GUESS ME!\\n\",\n      \"I'm thinking of a number between 1 and 100\\n\",\n      \"If your guess is more than 10 away from my number, I'll tell you you're COLD\\n\",\n      \"If your guess is within 10 of my number, I'll tell you you're WARM\\n\",\n      \"If your guess is farther than your most recent guess, I'll say you're getting COLDER\\n\",\n      \"If your guess is closer than your most recent guess, I'll say you're getting WARMER\\n\",\n      \"LET'S PLAY!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(\\\"WELCOME TO GUESS ME!\\\")\\n\",\n    \"print(\\\"I'm thinking of a number between 1 and 100\\\")\\n\",\n    \"print(\\\"If your guess is more than 10 away from my number, I'll tell you you're COLD\\\")\\n\",\n    \"print(\\\"If your guess is within 10 of my number, I'll tell you you're WARM\\\")\\n\",\n    \"print(\\\"If your guess is farther than your most recent guess, I'll say you're getting COLDER\\\")\\n\",\n    \"print(\\\"If your guess is closer than your most recent guess, I'll say you're getting WARMER\\\")\\n\",\n    \"print(\\\"LET'S PLAY!\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Create a list to store guesses\\n\",\n    \"\\n\",\n    \"Hint: zero is a good placeholder value. It's useful because it evaluates to \\\"False\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"guesses = [0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Write a `while` loop that asks for a valid guess. Test it a few times to make sure it works.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"I'm thinking of a number between 1 and 100.\\n\",\n      \"  What is your guess? 500\\n\",\n      \"OUT OF BOUNDS! Please try again: \\n\",\n      \"I'm thinking of a number between 1 and 100.\\n\",\n      \"  What is your guess? 50\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"while True:\\n\",\n    \"    \\n\",\n    \"    guess = int(input(\\\"I'm thinking of a number between 1 and 100.\\\\n  What is your guess? \\\"))\\n\",\n    \"    \\n\",\n    \"    if guess < 1 or guess > 100:\\n\",\n    \"        print('OUT OF BOUNDS! Please try again: ')\\n\",\n    \"        continue\\n\",\n    \"        \\n\",\n    \"    break\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Write a `while` loop that compares the player's guess to our number. If the player guesses correctly, break from the loop. Otherwise, tell the player if they're warmer or colder, and continue asking for guesses.\\n\",\n    \"\\n\",\n    \"Some hints:\\n\",\n    \"* it may help to sketch out all possible combinations on paper first!\\n\",\n    \"* you can use the `abs()` function to find the positive difference between two numbers\\n\",\n    \"* if you append all new guesses to the list, then the previous guess is given as `guesses[-2]`\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"I'm thinking of a number between 1 and 100.\\n\",\n      \"  What is your guess? 50\\n\",\n      \"COLD!\\n\",\n      \"I'm thinking of a number between 1 and 100.\\n\",\n      \"  What is your guess? 75\\n\",\n      \"WARMER!\\n\",\n      \"I'm thinking of a number between 1 and 100.\\n\",\n      \"  What is your guess? 85\\n\",\n      \"WARMER!\\n\",\n      \"I'm thinking of a number between 1 and 100.\\n\",\n      \"  What is your guess? 92\\n\",\n      \"COLDER!\\n\",\n      \"I'm thinking of a number between 1 and 100.\\n\",\n      \"  What is your guess? 80\\n\",\n      \"WARMER!\\n\",\n      \"I'm thinking of a number between 1 and 100.\\n\",\n      \"  What is your guess? 78\\n\",\n      \"COLDER!\\n\",\n      \"I'm thinking of a number between 1 and 100.\\n\",\n      \"  What is your guess? 82\\n\",\n      \"WARMER!\\n\",\n      \"I'm thinking of a number between 1 and 100.\\n\",\n      \"  What is your guess? 83\\n\",\n      \"COLDER!\\n\",\n      \"I'm thinking of a number between 1 and 100.\\n\",\n      \"  What is your guess? 81\\n\",\n      \"CONGRATULATIONS, YOU GUESSED IT IN ONLY 9 GUESSES!!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"while True:\\n\",\n    \"\\n\",\n    \"    # we can copy the code from above to take an input\\n\",\n    \"    guess = int(input(\\\"I'm thinking of a number between 1 and 100.\\\\n  What is your guess? \\\"))\\n\",\n    \"    \\n\",\n    \"    if guess < 1 or guess > 100:\\n\",\n    \"        print('OUT OF BOUNDS! Please try again: ')\\n\",\n    \"        continue\\n\",\n    \"    \\n\",\n    \"    # here we compare the player's guess to our number\\n\",\n    \"    if guess == num:\\n\",\n    \"        print(f'CONGRATULATIONS, YOU GUESSED IT IN ONLY {len(guesses)} GUESSES!!')\\n\",\n    \"        break\\n\",\n    \"        \\n\",\n    \"    # if guess is incorrect, add guess to the list\\n\",\n    \"    guesses.append(guess)\\n\",\n    \"    \\n\",\n    \"    # when testing the first guess, guesses[-2]==0, which evaluates to False\\n\",\n    \"    # and brings us down to the second section\\n\",\n    \"    \\n\",\n    \"    if guesses[-2]:  \\n\",\n    \"        if abs(num-guess) < abs(num-guesses[-2]):\\n\",\n    \"            print('WARMER!')\\n\",\n    \"        else:\\n\",\n    \"            print('COLDER!')\\n\",\n    \"   \\n\",\n    \"    else:\\n\",\n    \"        if abs(num-guess) <= 10:\\n\",\n    \"            print('WARM!')\\n\",\n    \"        else:\\n\",\n    \"            print('COLD!')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"That's it! You've just programmed your first game!\\n\",\n    \"\\n\",\n    \"In the next section we'll learn how to turn some of these repetitive actions into *functions* that can be called whenever we need them.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Good Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "03-Methods and Functions/.ipynb_checkpoints/01-Methods-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Methods\\n\",\n    \"\\n\",\n    \"We've already seen a few example of methods when learning about Object and Data Structure Types in Python. Methods are essentially functions built into objects. Later on in the course we will learn about how to create our own objects and methods using Object Oriented Programming (OOP) and classes.\\n\",\n    \"\\n\",\n    \"Methods perform specific actions on an object and can also take arguments, just like a function. This lecture will serve as just a brief introduction to methods and get you thinking about overall design methods that we will touch back upon when we reach OOP in the course.\\n\",\n    \"\\n\",\n    \"Methods are in the form:\\n\",\n    \"\\n\",\n    \"    object.method(arg1,arg2,etc...)\\n\",\n    \"    \\n\",\n    \"You'll later see that we can think of methods as having an argument 'self' referring to the object itself. You can't see this argument but we will be using it later on in the course during the OOP lectures.\\n\",\n    \"\\n\",\n    \"Let's take a quick look at what an example of the various methods a list has:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Create a simple list\\n\",\n    \"lst = [1,2,3,4,5]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Fortunately, with iPython and the Jupyter Notebook we can quickly see all the possible methods using the tab key. The methods for a list are:\\n\",\n    \"\\n\",\n    \"* append\\n\",\n    \"* count\\n\",\n    \"* extend\\n\",\n    \"* insert\\n\",\n    \"* pop\\n\",\n    \"* remove\\n\",\n    \"* reverse\\n\",\n    \"* sort\\n\",\n    \"\\n\",\n    \"Let's try out a few of them:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"append() allows us to add elements to the end of a list:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"lst.append(6)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 3, 4, 5, 6]\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lst\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now how about count()? The count() method will count the number of occurrences of an element in a list.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check how many times 2 shows up in the list\\n\",\n    \"lst.count(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can always use Shift+Tab in the Jupyter Notebook to get more help about the method. In general Python you can use the help() function: \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Help on built-in function count:\\n\",\n      \"\\n\",\n      \"count(...) method of builtins.list instance\\n\",\n      \"    L.count(value) -> integer -- return number of occurrences of value\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"help(lst.count)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Feel free to play around with the rest of the methods for a list. Later on in this section your quiz will involve using help and Google searching for methods of different types of objects!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! By this lecture you should feel comfortable calling methods of objects in Python!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "03-Methods and Functions/.ipynb_checkpoints/02-Functions-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Functions\\n\",\n    \"\\n\",\n    \"## Introduction to Functions\\n\",\n    \"\\n\",\n    \"This lecture will consist of explaining what a function is in Python and how to create one. Functions will be one of our main building blocks when we construct larger and larger amounts of code to solve problems.\\n\",\n    \"\\n\",\n    \"### What is a function?\\n\",\n    \"\\n\",\n    \"Formally, a function is a useful device that groups together a set of statements so they can be run more than once. They can also let us specify parameters that can serve as inputs to the functions.\\n\",\n    \"\\n\",\n    \"On a more fundamental level, functions allow us to not have to repeatedly write the same code again and again. If you remember back to the lessons on strings and lists, remember that we used a function len() to get the length of a string. Since checking the length of a sequence is a common task you would want to write a function that can do this repeatedly at command.\\n\",\n    \"\\n\",\n    \"Functions will be one of most basic levels of reusing code in Python, and it will also allow us to start thinking of program design (we will dive much deeper into the ideas of design when we learn about Object Oriented Programming).\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Why even use functions?\\n\",\n    \"\\n\",\n    \"Put simply, you should use functions when you plan on using a block of code multiple times. The function will allow you to call the same block of code without having to write it multiple times. This in turn will allow you to create more complex Python scripts. To really understand this though, we should actually write our own functions! \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Function Topics\\n\",\n    \"* def keyword\\n\",\n    \"* simple example of a function\\n\",\n    \"* calling a function with ()\\n\",\n    \"* accepting parameters\\n\",\n    \"* print versus return\\n\",\n    \"* adding in logic inside a function\\n\",\n    \"* multiple returns inside a function\\n\",\n    \"* adding in loops inside a function\\n\",\n    \"* tuple unpacking\\n\",\n    \"* interactions between functions\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### def keyword\\n\",\n    \"\\n\",\n    \"Let's see how to build out a function's syntax in Python. It has the following form:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def name_of_function(arg1,arg2):\\n\",\n    \"    '''\\n\",\n    \"    This is where the function's Document String (docstring) goes.\\n\",\n    \"    When you call help() on your function it will be printed out.\\n\",\n    \"    '''\\n\",\n    \"    # Do stuff here\\n\",\n    \"    # Return desired result\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We begin with <code>def</code> then a space followed by the name of the function. Try to keep names relevant, for example len() is a good name for a length() function. Also be careful with names, you wouldn't want to call a function the same name as a [built-in function in Python](https://docs.python.org/3/library/functions.html) (such as len).\\n\",\n    \"\\n\",\n    \"Next come a pair of parentheses with a number of arguments separated by a comma. These arguments are the inputs for your function. You'll be able to use these inputs in your function and reference them. After this you put a colon.\\n\",\n    \"\\n\",\n    \"Now here is the important step, you must indent to begin the code inside your function correctly. Python makes use of *whitespace* to organize code. Lots of other programing languages do not do this, so keep that in mind.\\n\",\n    \"\\n\",\n    \"Next you'll see the docstring, this is where you write a basic description of the function. Using Jupyter and Jupyter Notebooks, you'll be able to read these docstrings by pressing Shift+Tab after a function name. Docstrings are not necessary for simple functions, but it's good practice to put them in so you or other people can easily understand the code you write.\\n\",\n    \"\\n\",\n    \"After all this you begin writing the code you wish to execute.\\n\",\n    \"\\n\",\n    \"The best way to learn functions is by going through examples. So let's try to go through examples that relate back to the various objects and data structures we learned about before.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Simple example of a function\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def say_hello():\\n\",\n    \"    print('hello')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Calling a function with ()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Call the function:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"hello\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"say_hello()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you forget the parenthesis (), it will simply display the fact that say_hello is a function. Later on we will learn we can actually pass in functions into other functions! But for now, simply remember to call functions with ().\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<function __main__.say_hello>\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"say_hello\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Accepting parameters (arguments)\\n\",\n    \"Let's write a function that greets people with their name.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def greeting(name):\\n\",\n    \"    print(f'Hello {name}')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Hello Jose\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"greeting('Jose')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Using return\\n\",\n    \"So far we've only seen print() used, but if we actually want to save the resulting variable we need to use the **return** keyword.\\n\",\n    \"\\n\",\n    \"Let's see some example that use a <code>return</code> statement. <code>return</code> allows a function to *return* a result that can then be stored as a variable, or used in whatever manner a user wants.\\n\",\n    \"\\n\",\n    \"### Example: Addition function\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def add_num(num1,num2):\\n\",\n    \"    return num1+num2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"9\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"add_num(4,5)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Can also save as variable due to return\\n\",\n    \"result = add_num(4,5)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"9\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(result)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What happens if we input two strings?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'onetwo'\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"add_num('one','two')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Very Common Question: \\\"What is the difference between *return* and *print*?\\\"\\n\",\n    \"\\n\",\n    \"**The return keyword allows you to actually save the result of the output of a function as a variable. The print() function simply displays the output to you, but doesn't save it for future use. Let's explore this in more detail**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def print_result(a,b):\\n\",\n    \"    print(a+b)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def return_result(a,b):\\n\",\n    \"    return a+b\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"15\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print_result(10,5)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"15\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# You won't see any output if you run this in a .py script\\n\",\n    \"return_result(10,5)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**But what happens if we actually want to save this result for later use?**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"40\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"my_result = print_result(20,20)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_result\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"NoneType\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"type(my_result)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Be careful! Notice how print_result() doesn't let you actually save the result to a variable! It only prints it out, with print() returning None for the assignment!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_result = return_result(20,20)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"40\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"my_result\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"80\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"my_result + my_result\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Adding Logic to Internal Function Operations\\n\",\n    \"\\n\",\n    \"So far we know quite a bit about constructing logical statements with Python, such as if/else/elif statements, for and while loops, checking if an item is **in** a list or **not in** a list (Useful Operators Lecture). Let's now see how we can perform these operations within a function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Check if a number is even \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Recall the mod operator % which returns the remainder after division, if a number is even then mod 2 (% 2) should be == to zero.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 % 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"20 % 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"21 % 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"20 % 2 == 0\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"21 % 2 == 0\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"** Let's use this to construct a function. Notice how we simply return the boolean check.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def even_check(number):\\n\",\n    \"    return number % 2 == 0\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"even_check(20)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 21,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"even_check(21)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Check if any number in  a list is even\\n\",\n    \"\\n\",\n    \"Let's return a boolean indicating if **any** number in a list is even. Notice here how **return** breaks out of the loop and exits the function\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def check_even_list(num_list):\\n\",\n    \"    # Go through each number\\n\",\n    \"    for number in num_list:\\n\",\n    \"        # Once we get a \\\"hit\\\" on an even number, we return True\\n\",\n    \"        if number % 2 == 0:\\n\",\n    \"            return True\\n\",\n    \"        # Otherwise we don't do anything\\n\",\n    \"        else:\\n\",\n    \"            pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"** Is this enough? NO! We're not returning anything if they are all odds!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"check_even_list([1,2,3])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"check_even_list([1,1,1])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"** VERY COMMON MISTAKE!! LET'S SEE A COMMON LOGIC ERROR, NOTE THIS IS WRONG!!!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def check_even_list(num_list):\\n\",\n    \"    # Go through each number\\n\",\n    \"    for number in num_list:\\n\",\n    \"        # Once we get a \\\"hit\\\" on an even number, we return True\\n\",\n    \"        if number % 2 == 0:\\n\",\n    \"            return True\\n\",\n    \"        # This is WRONG! This returns False at the very first odd number!\\n\",\n    \"        # It doesn't end up checking the other numbers in the list!\\n\",\n    \"        else:\\n\",\n    \"            return False\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 30,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# UH OH! It is returning False after hitting the first 1\\n\",\n    \"check_even_list([1,2,3])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"** Correct Approach: We need to initiate a return False AFTER running through the entire loop**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def check_even_list(num_list):\\n\",\n    \"    # Go through each number\\n\",\n    \"    for number in num_list:\\n\",\n    \"        # Once we get a \\\"hit\\\" on an even number, we return True\\n\",\n    \"        if number % 2 == 0:\\n\",\n    \"            return True\\n\",\n    \"        # Don't do anything if its not even\\n\",\n    \"        else:\\n\",\n    \"            pass\\n\",\n    \"    # Notice the indentation! This ensures we run through the entire for loop    \\n\",\n    \"    return False\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 32,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"check_even_list([1,2,3])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 34,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"check_even_list([1,3,5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Return all even numbers in a list\\n\",\n    \"\\n\",\n    \"Let's add more complexity, we now will return all the even numbers in a list, otherwise return an empty list.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def check_even_list(num_list):\\n\",\n    \"    \\n\",\n    \"    even_numbers = []\\n\",\n    \"    \\n\",\n    \"    # Go through each number\\n\",\n    \"    for number in num_list:\\n\",\n    \"        # Once we get a \\\"hit\\\" on an even number, we append the even number\\n\",\n    \"        if number % 2 == 0:\\n\",\n    \"            even_numbers.append(number)\\n\",\n    \"        # Don't do anything if its not even\\n\",\n    \"        else:\\n\",\n    \"            pass\\n\",\n    \"    # Notice the indentation! This ensures we run through the entire for loop    \\n\",\n    \"    return even_numbers\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[2, 4, 6]\"\n      ]\n     },\n     \"execution_count\": 36,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"check_even_list([1,2,3,4,5,6])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[]\"\n      ]\n     },\n     \"execution_count\": 37,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"check_even_list([1,3,5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Returning Tuples for Unpacking\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"** Recall we can loop through a list of tuples and \\\"unpack\\\" the values within them**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 38,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"stock_prices = [('AAPL',200),('GOOG',300),('MSFT',400)]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"('AAPL', 200)\\n\",\n      \"('GOOG', 300)\\n\",\n      \"('MSFT', 400)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for item in stock_prices:\\n\",\n    \"    print(item)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"AAPL\\n\",\n      \"GOOG\\n\",\n      \"MSFT\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for stock,price in stock_prices:\\n\",\n    \"    print(stock)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 42,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"200\\n\",\n      \"300\\n\",\n      \"400\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for stock,price in stock_prices:\\n\",\n    \"    print(price)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Similarly, functions often return tuples, to easily return multiple results for later use.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's imagine the following list:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 46,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"work_hours = [('Abby',100),('Billy',400),('Cassie',800)]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The employee of the month function will return both the name and number of hours worked for the top performer (judged by number of hours worked).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 47,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def employee_check(work_hours):\\n\",\n    \"    \\n\",\n    \"    # Set some max value to intially beat, like zero hours\\n\",\n    \"    current_max = 0\\n\",\n    \"    # Set some empty value before the loop\\n\",\n    \"    employee_of_month = ''\\n\",\n    \"    \\n\",\n    \"    for employee,hours in work_hours:\\n\",\n    \"        if hours > current_max:\\n\",\n    \"            current_max = hours\\n\",\n    \"            employee_of_month = employee\\n\",\n    \"        else:\\n\",\n    \"            pass\\n\",\n    \"    \\n\",\n    \"    # Notice the indentation here\\n\",\n    \"    return (employee_of_month,current_max)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 48,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"('Cassie', 800)\"\n      ]\n     },\n     \"execution_count\": 48,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"employee_check(work_hours)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Interactions between functions\\n\",\n    \"\\n\",\n    \"Functions often use results from other functions, let's see a simple example through a guessing game. There will be 3 positions in the list, one of which is an 'O', a function will shuffle the list, another will take a player's guess, and finally another will check to see if it is correct. This is based on the classic carnival game of guessing which cup a red ball is under.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**How to shuffle a list in Python**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"example = [1,2,3,4,5]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from random import shuffle\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Note shuffle is in-place\\n\",\n    \"shuffle(example)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[3, 1, 4, 5, 2]\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"example\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**OK, let's create our simple game**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"mylist = [' ','O',' ']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def shuffle_list(mylist):\\n\",\n    \"    # Take in list, and returned shuffle versioned\\n\",\n    \"    shuffle(mylist)\\n\",\n    \"    \\n\",\n    \"    return mylist\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[' ', 'O', ' ']\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mylist \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[' ', ' ', 'O']\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"shuffle_list(mylist)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def player_guess():\\n\",\n    \"    \\n\",\n    \"    guess = ''\\n\",\n    \"    \\n\",\n    \"    while guess not in ['0','1','2']:\\n\",\n    \"        \\n\",\n    \"        # Recall input() returns a string\\n\",\n    \"        guess = input(\\\"Pick a number: 0, 1, or 2:  \\\")\\n\",\n    \"    \\n\",\n    \"    return int(guess)    \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Pick a number: 0, 1, or 2:  1\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"player_guess()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we will check the user's guess. Notice we only print here, since we have no need to save a user's guess or the shuffled list.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def check_guess(mylist,guess):\\n\",\n    \"    if mylist[guess] == 'O':\\n\",\n    \"        print('Correct Guess!')\\n\",\n    \"    else:\\n\",\n    \"        print('Wrong! Better luck next time')\\n\",\n    \"        print(mylist)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we create a little setup logic to run all the functions. Notice how they interact with each other!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Pick a number: 0, 1, or 2:  1\\n\",\n      \"Wrong! Better luck next time\\n\",\n      \"[' ', ' ', 'O']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Initial List\\n\",\n    \"mylist = [' ','O',' ']\\n\",\n    \"\\n\",\n    \"# Shuffle It\\n\",\n    \"mixedup_list = shuffle_list(mylist)\\n\",\n    \"\\n\",\n    \"# Get User's Guess\\n\",\n    \"guess = player_guess()\\n\",\n    \"\\n\",\n    \"# Check User's Guess\\n\",\n    \"#------------------------\\n\",\n    \"# Notice how this function takes in the input \\n\",\n    \"# based on the output of other functions!\\n\",\n    \"check_guess(mixedup_list,guess)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! You should now have a basic understanding of creating your own functions to save yourself from repeatedly writing code!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "03-Methods and Functions/.ipynb_checkpoints/03-Function Practice Exercises-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Function Practice Exercises\\n\",\n    \"\\n\",\n    \"Problems are arranged in increasing difficulty:\\n\",\n    \"* Warmup - these can be solved using basic comparisons and methods\\n\",\n    \"* Level 1 - these may involve if/then conditional statements and simple methods\\n\",\n    \"* Level 2 - these may require iterating over sequences, usually with some kind of loop\\n\",\n    \"* Challenging - these will take some creativity to solve\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## WARMUP SECTION:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### LESSER OF TWO EVENS: Write a function that returns the lesser of two given numbers *if* both numbers are even, but returns the greater if one or both numbers are odd\\n\",\n    \"    lesser_of_two_evens(2,4) --> 2\\n\",\n    \"    lesser_of_two_evens(2,5) --> 5\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def lesser_of_two_evens(a,b):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"lesser_of_two_evens(2,4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"lesser_of_two_evens(2,5)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### ANIMAL CRACKERS: Write a function takes a two-word string and returns True if both words begin with same letter\\n\",\n    \"    animal_crackers('Levelheaded Llama') --> True\\n\",\n    \"    animal_crackers('Crazy Kangaroo') --> False\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def animal_crackers(text):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"animal_crackers('Levelheaded Llama')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"animal_crackers('Crazy Kangaroo')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### MAKES TWENTY: Given two integers, return True if the sum of the integers is 20 *or* if one of the integers is 20. If not, return False\\n\",\n    \"\\n\",\n    \"    makes_twenty(20,10) --> True\\n\",\n    \"    makes_twenty(12,8) --> True\\n\",\n    \"    makes_twenty(2,3) --> False\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def makes_twenty(n1,n2):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"makes_twenty(20,10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"makes_twenty(2,3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# LEVEL 1 PROBLEMS\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### OLD MACDONALD: Write a function that capitalizes the first and fourth letters of a name\\n\",\n    \"     \\n\",\n    \"    old_macdonald('macdonald') --> MacDonald\\n\",\n    \"    \\n\",\n    \"Note: `'macdonald'.capitalize()` returns `'Macdonald'`\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def old_macdonald(name):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"old_macdonald('macdonald')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### MASTER YODA: Given a sentence, return a sentence with the words reversed\\n\",\n    \"\\n\",\n    \"    master_yoda('I am home') --> 'home am I'\\n\",\n    \"    master_yoda('We are ready') --> 'ready are We'\\n\",\n    \"    \\n\",\n    \"Note: The .join() method may be useful here. The .join() method allows you to join together strings in a list with some connector string. For example, some uses of the .join() method:\\n\",\n    \"\\n\",\n    \"    >>> \\\"--\\\".join(['a','b','c'])\\n\",\n    \"    >>> 'a--b--c'\\n\",\n    \"\\n\",\n    \"This means if you had a list of words you wanted to turn back into a sentence, you could just join them with a single space string:\\n\",\n    \"\\n\",\n    \"    >>> \\\" \\\".join(['Hello','world'])\\n\",\n    \"    >>> \\\"Hello world\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def master_yoda(text):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"master_yoda('I am home')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"master_yoda('We are ready')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### ALMOST THERE: Given an integer n, return True if n is within 10 of either 100 or 200\\n\",\n    \"\\n\",\n    \"    almost_there(90) --> True\\n\",\n    \"    almost_there(104) --> True\\n\",\n    \"    almost_there(150) --> False\\n\",\n    \"    almost_there(209) --> True\\n\",\n    \"    \\n\",\n    \"NOTE: `abs(num)` returns the absolute value of a number\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def almost_there(n):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"almost_there(104)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"almost_there(150)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"almost_there(209)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# LEVEL 2 PROBLEMS\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### FIND 33: \\n\",\n    \"\\n\",\n    \"Given a list of ints, return True if the array contains a 3 next to a 3 somewhere.\\n\",\n    \"\\n\",\n    \"    has_33([1, 3, 3]) → True\\n\",\n    \"    has_33([1, 3, 1, 3]) → False\\n\",\n    \"    has_33([3, 1, 3]) → False\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def has_33(nums):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"has_33([1, 3, 3])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"has_33([1, 3, 1, 3])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"has_33([3, 1, 3])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### PAPER DOLL: Given a string, return a string where for every character in the original there are three characters\\n\",\n    \"    paper_doll('Hello') --> 'HHHeeellllllooo'\\n\",\n    \"    paper_doll('Mississippi') --> 'MMMiiissssssiiippppppiii'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def paper_doll(text):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"paper_doll('Hello')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"paper_doll('Mississippi')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### BLACKJACK: Given three integers between 1 and 11, if their sum is less than or equal to 21, return their sum. If their sum exceeds 21 *and* there's an eleven, reduce the total sum by 10. Finally, if the sum (even after adjustment) exceeds 21, return 'BUST'\\n\",\n    \"    blackjack(5,6,7) --> 18\\n\",\n    \"    blackjack(9,9,9) --> 'BUST'\\n\",\n    \"    blackjack(9,9,11) --> 19\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def blackjack(a,b,c):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"blackjack(5,6,7)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"blackjack(9,9,9)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"blackjack(9,9,11)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### SUMMER OF '69: Return the sum of the numbers in the array, except ignore sections of numbers starting with a 6 and extending to the next 9 (every 6 will be followed by at least one 9). Return 0 for no numbers.\\n\",\n    \" \\n\",\n    \"    summer_69([1, 3, 5]) --> 9\\n\",\n    \"    summer_69([4, 5, 6, 7, 8, 9]) --> 9\\n\",\n    \"    summer_69([2, 1, 6, 9, 11]) --> 14\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def summer_69(arr):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"summer_69([1, 3, 5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"summer_69([4, 5, 6, 7, 8, 9])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"summer_69([2, 1, 6, 9, 11])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# CHALLENGING PROBLEMS\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### SPY GAME: Write a function that takes in a list of integers and returns True if it contains 007 in order\\n\",\n    \"\\n\",\n    \"     spy_game([1,2,4,0,0,7,5]) --> True\\n\",\n    \"     spy_game([1,0,2,4,0,5,7]) --> True\\n\",\n    \"     spy_game([1,7,2,0,4,5,0]) --> False\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def spy_game(nums):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"spy_game([1,2,4,0,0,7,5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"spy_game([1,0,2,4,0,5,7])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"spy_game([1,7,2,0,4,5,0])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### COUNT PRIMES: Write a function that returns the *number* of prime numbers that exist up to and including a given number\\n\",\n    \"    count_primes(100) --> 25\\n\",\n    \"\\n\",\n    \"By convention, 0 and 1 are not prime.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def count_primes(num):\\n\",\n    \"    pass\\n\",\n    \"                \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"count_primes(100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Just for fun:\\n\",\n    \"#### PRINT BIG: Write a function that takes in a single letter, and returns a 5x5 representation of that letter\\n\",\n    \"    print_big('a')\\n\",\n    \"    \\n\",\n    \"    out:   *  \\n\",\n    \"          * *\\n\",\n    \"         *****\\n\",\n    \"         *   *\\n\",\n    \"         *   *\\n\",\n    \"HINT: Consider making a dictionary of possible patterns, and mapping the alphabet to specific 5-line combinations of patterns. <br>For purposes of this exercise, it's ok if your dictionary stops at \\\"E\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def print_big(letter):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"print_big('a')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "03-Methods and Functions/.ipynb_checkpoints/03-Lambda expressions-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# lambda expressions\\n\",\n    \"\\n\",\n    \"One of Python's most useful (and for beginners, confusing) tools is the lambda expression. lambda expressions allow us to create \\\"anonymous\\\" functions. This basically means we can quickly make ad-hoc functions without needing to properly define a function using <code>def</code>.\\n\",\n    \"\\n\",\n    \"Function objects returned by running lambda expressions work exactly the same as those created and assigned by <code>def</code>s. There is a key difference that makes lambda useful in specialized roles:\\n\",\n    \"\\n\",\n    \"**A lambda's body is a single expression, not a block of statements.**\\n\",\n    \"\\n\",\n    \"* The lambda's body is similar to what we would put in a <code>def</code> body's return statement. We simply type the result as an expression instead of explicitly returning it. Because it is limited to an expression, a lambda is less general than a <code>def</code>. We can only squeeze design, to limit program nesting. lambda is designed for coding simple functions, and <code>def</code> handles the larger tasks.\\n\",\n    \"\\n\",\n    \"Let's slowly break down a lambda expression by deconstructing a function:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def square(num):\\n\",\n    \"    result = num**2\\n\",\n    \"    return result\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"square(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Continuing the breakdown:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def square(num):\\n\",\n    \"    return num**2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"square(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can actually write this in one line (although it would be bad style to do so)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def square(num): return num**2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"square(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This is the form that a lambda expression intends to replicate. A lambda expression can then be written as:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<function __main__.<lambda>>\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lambda num: num**2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how we get a function back. We can assign this function to a label:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"square = lambda num: num**2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"square(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"And there you have it! The breakdown of a function into a lambda expression!\\n\",\n    \"Lets see a few more examples:\\n\",\n    \"\\n\",\n    \"## Example 1\\n\",\n    \"Check that a number is even:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"even = lambda x: x%2==0\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"even(3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"even(4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example 2\\n\",\n    \"Grab first character of a string:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"first = lambda s: s[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'h'\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"first('hello')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example 3\\n\",\n    \"Reverse a string:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"rev = lambda s: s[::-1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'olleh'\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"rev('hello')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example 4\\n\",\n    \"Just like a normal function, we can accept more than one argument into a lambda expression:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"adder = lambda x,y : x+y\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"5\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"adder(2,3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"lambda expressions really shine when used in conjunction with **map()**, **filter()** and **reduce()**. Each of those functions has its own lecture, so feel free to explore them if you're very interested in lambda.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"I highly recommend reading this blog post at [Python Conquers the Universe](https://pythonconquerstheuniverse.wordpress.com/2011/08/29/lambda_tutorial/) for a great breakdown on lambda expressions and some explanations of common confusions! \"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "03-Methods and Functions/.ipynb_checkpoints/04-Function Practice Exercises - Solutions-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Function Practice Exercises - Solutions\\n\",\n    \"\\n\",\n    \"Problems are arranged in increasing difficulty:\\n\",\n    \"* Warmup - these can be solved using basic comparisons and methods\\n\",\n    \"* Level 1 - these may involve if/then conditional statements and simple methods\\n\",\n    \"* Level 2 - these may require iterating over sequences, usually with some kind of loop\\n\",\n    \"* Challenging - these will take some creativity to solve\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## WARMUP SECTION:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### LESSER OF TWO EVENS: Write a function that returns the lesser of two given numbers *if* both numbers are even, but returns the greater if one or both numbers are odd\\n\",\n    \"    lesser_of_two_evens(2,4) --> 2\\n\",\n    \"    lesser_of_two_evens(2,5) --> 5\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def lesser_of_two_evens(a,b):\\n\",\n    \"    if a%2 == 0 and b%2 == 0:\\n\",\n    \"        return min(a,b)\\n\",\n    \"    else:\\n\",\n    \"        return max(a,b)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"lesser_of_two_evens(2,4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"5\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"lesser_of_two_evens(2,5)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### ANIMAL CRACKERS: Write a function takes a two-word string and returns True if both words begin with same letter\\n\",\n    \"    animal_crackers('Levelheaded Llama') --> True\\n\",\n    \"    animal_crackers('Crazy Kangaroo') --> False\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def animal_crackers(text):\\n\",\n    \"    wordlist = text.split()\\n\",\n    \"    return wordlist[0][0] == wordlist[1][0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"animal_crackers('Levelheaded Llama')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"animal_crackers('Crazy Kangaroo')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### MAKES TWENTY: Given two integers, return True if the sum of the integers is 20 *or* if one of the integers is 20. If not, return False\\n\",\n    \"\\n\",\n    \"    makes_twenty(20,10) --> True\\n\",\n    \"    makes_twenty(12,8) --> True\\n\",\n    \"    makes_twenty(2,3) --> False\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def makes_twenty(n1,n2):\\n\",\n    \"    return (n1+n2)==20 or n1==20 or n2==20\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"makes_twenty(20,10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"makes_twenty(12,8)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#Check\\n\",\n    \"makes_twenty(2,3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# LEVEL 1 PROBLEMS\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### OLD MACDONALD: Write a function that capitalizes the first and fourth letters of a name\\n\",\n    \"     \\n\",\n    \"    old_macdonald('macdonald') --> MacDonald\\n\",\n    \"    \\n\",\n    \"Note: `'macdonald'.capitalize()` returns `'Macdonald'`\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def old_macdonald(name):\\n\",\n    \"    if len(name) > 3:\\n\",\n    \"        return name[:3].capitalize() + name[3:].capitalize()\\n\",\n    \"    else:\\n\",\n    \"        return 'Name is too short!'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'MacDonald'\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"old_macdonald('macdonald')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### MASTER YODA: Given a sentence, return a sentence with the words reversed\\n\",\n    \"\\n\",\n    \"    master_yoda('I am home') --> 'home am I'\\n\",\n    \"    master_yoda('We are ready') --> 'ready are We'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def master_yoda(text):\\n\",\n    \"    return ' '.join(text.split()[::-1])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'home am I'\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"master_yoda('I am home')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'ready are We'\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"master_yoda('We are ready')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### ALMOST THERE: Given an integer n, return True if n is within 10 of either 100 or 200\\n\",\n    \"\\n\",\n    \"    almost_there(90) --> True\\n\",\n    \"    almost_there(104) --> True\\n\",\n    \"    almost_there(150) --> False\\n\",\n    \"    almost_there(209) --> True\\n\",\n    \"    \\n\",\n    \"NOTE: `abs(num)` returns the absolute value of a number\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def almost_there(n):\\n\",\n    \"    return ((abs(100 - n) <= 10) or (abs(200 - n) <= 10))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"almost_there(90)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"almost_there(104)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"almost_there(150)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"almost_there(209)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# LEVEL 2 PROBLEMS\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### FIND 33: \\n\",\n    \"\\n\",\n    \"Given a list of ints, return True if the array contains a 3 next to a 3 somewhere.\\n\",\n    \"\\n\",\n    \"    has_33([1, 3, 3]) → True\\n\",\n    \"    has_33([1, 3, 1, 3]) → False\\n\",\n    \"    has_33([3, 1, 3]) → False\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def has_33(nums):\\n\",\n    \"    for i in range(0, len(nums)-1):\\n\",\n    \"      \\n\",\n    \"        # nicer looking alternative in commented code\\n\",\n    \"        #if nums[i] == 3 and nums[i+1] == 3:\\n\",\n    \"    \\n\",\n    \"        if nums[i:i+2] == [3,3]:\\n\",\n    \"            return True  \\n\",\n    \"    \\n\",\n    \"    return False\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"has_33([1, 3, 3])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 23,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"has_33([1, 3, 1, 3])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"has_33([3, 1, 3])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### PAPER DOLL: Given a string, return a string where for every character in the original there are three characters\\n\",\n    \"    paper_doll('Hello') --> 'HHHeeellllllooo'\\n\",\n    \"    paper_doll('Mississippi') --> 'MMMiiissssssiiippppppiii'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def paper_doll(text):\\n\",\n    \"    result = ''\\n\",\n    \"    for char in text:\\n\",\n    \"        result += char * 3\\n\",\n    \"    return result\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'HHHeeellllllooo'\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"paper_doll('Hello')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'MMMiiissssssiiissssssiiippppppiii'\"\n      ]\n     },\n     \"execution_count\": 27,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"paper_doll('Mississippi')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### BLACKJACK: Given three integers between 1 and 11, if their sum is less than or equal to 21, return their sum. If their sum exceeds 21 *and* there's an eleven, reduce the total sum by 10. Finally, if the sum (even after adjustment) exceeds 21, return 'BUST'\\n\",\n    \"    blackjack(5,6,7) --> 18\\n\",\n    \"    blackjack(9,9,9) --> 'BUST'\\n\",\n    \"    blackjack(9,9,11) --> 19\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def blackjack(a,b,c):\\n\",\n    \"    \\n\",\n    \"    if sum((a,b,c)) <= 21:\\n\",\n    \"        return sum((a,b,c))\\n\",\n    \"    elif sum((a,b,c)) <=31 and 11 in (a,b,c):\\n\",\n    \"        return sum((a,b,c)) - 10\\n\",\n    \"    else:\\n\",\n    \"        return 'BUST'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"18\"\n      ]\n     },\n     \"execution_count\": 29,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"blackjack(5,6,7)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'BUST'\"\n      ]\n     },\n     \"execution_count\": 30,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"blackjack(9,9,9)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"19\"\n      ]\n     },\n     \"execution_count\": 31,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"blackjack(9,9,11)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### SUMMER OF '69: Return the sum of the numbers in the array, except ignore sections of numbers starting with a 6 and extending to the next 9 (every 6 will be followed by at least one 9). Return 0 for no numbers.\\n\",\n    \" \\n\",\n    \"    summer_69([1, 3, 5]) --> 9\\n\",\n    \"    summer_69([4, 5, 6, 7, 8, 9]) --> 9\\n\",\n    \"    summer_69([2, 1, 6, 9, 11]) --> 14\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def summer_69(arr):\\n\",\n    \"    total = 0\\n\",\n    \"    add = True\\n\",\n    \"    for num in arr:\\n\",\n    \"        while add:\\n\",\n    \"            if num != 6:\\n\",\n    \"                total += num\\n\",\n    \"                break\\n\",\n    \"            else:\\n\",\n    \"                add = False\\n\",\n    \"        while not add:\\n\",\n    \"            if num != 9:\\n\",\n    \"                break\\n\",\n    \"            else:\\n\",\n    \"                add = True\\n\",\n    \"                break\\n\",\n    \"    return total\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"9\"\n      ]\n     },\n     \"execution_count\": 33,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"summer_69([1, 3, 5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"9\"\n      ]\n     },\n     \"execution_count\": 34,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"summer_69([4, 5, 6, 7, 8, 9])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"14\"\n      ]\n     },\n     \"execution_count\": 35,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"summer_69([2, 1, 6, 9, 11])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# CHALLENGING PROBLEMS\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### SPY GAME: Write a function that takes in a list of integers and returns True if it contains 007 in order\\n\",\n    \"\\n\",\n    \"     spy_game([1,2,4,0,0,7,5]) --> True\\n\",\n    \"     spy_game([1,0,2,4,0,5,7]) --> True\\n\",\n    \"     spy_game([1,7,2,0,4,5,0]) --> False\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def spy_game(nums):\\n\",\n    \"\\n\",\n    \"    code = [0,0,7,'x']\\n\",\n    \"    \\n\",\n    \"    for num in nums:\\n\",\n    \"        if num == code[0]:\\n\",\n    \"            code.pop(0)   # code.remove(num) also works\\n\",\n    \"       \\n\",\n    \"    return len(code) == 1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 37,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"spy_game([1,2,4,0,0,7,5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 38,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 38,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"spy_game([1,0,2,4,0,5,7])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 39,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"spy_game([1,7,2,0,4,5,0])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### COUNT PRIMES: Write a function that returns the *number* of prime numbers that exist up to and including a given number\\n\",\n    \"    count_primes(100) --> 25\\n\",\n    \"\\n\",\n    \"By convention, 0 and 1 are not prime.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 40,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def count_primes(num):\\n\",\n    \"    primes = [2]\\n\",\n    \"    x = 3\\n\",\n    \"    if num < 2:  # for the case of num = 0 or 1\\n\",\n    \"        return 0\\n\",\n    \"    while x <= num:\\n\",\n    \"        for y in range(3,x,2):  # test all odd factors up to x-1\\n\",\n    \"            if x%y == 0:\\n\",\n    \"                x += 2\\n\",\n    \"                break\\n\",\n    \"        else:\\n\",\n    \"            primes.append(x)\\n\",\n    \"            x += 2\\n\",\n    \"    print(primes)\\n\",\n    \"    return len(primes)\\n\",\n    \"                \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"25\"\n      ]\n     },\n     \"execution_count\": 41,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"count_primes(100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"BONUS: Here's a faster version that makes use of the prime numbers we're collecting as we go!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 42,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def count_primes2(num):\\n\",\n    \"    primes = [2]\\n\",\n    \"    x = 3\\n\",\n    \"    if num < 2:\\n\",\n    \"        return 0\\n\",\n    \"    while x <= num:\\n\",\n    \"        for y in primes:  # use the primes list!\\n\",\n    \"            if x%y == 0:\\n\",\n    \"                x += 2\\n\",\n    \"                break\\n\",\n    \"        else:\\n\",\n    \"            primes.append(x)\\n\",\n    \"            x += 2\\n\",\n    \"    print(primes)\\n\",\n    \"    return len(primes)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 43,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"25\"\n      ]\n     },\n     \"execution_count\": 43,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"count_primes2(100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"-----\\n\",\n    \"### Just for fun, not a real problem :)\\n\",\n    \"\\n\",\n    \"#### PRINT BIG: Write a function that takes in a single letter, and returns a 5x5 representation of that letter\\n\",\n    \"    print_big('a')\\n\",\n    \"    \\n\",\n    \"    out:   *  \\n\",\n    \"          * *\\n\",\n    \"         *****\\n\",\n    \"         *   *\\n\",\n    \"         *   *\\n\",\n    \"HINT: Consider making a dictionary of possible patterns, and mapping the alphabet to specific 5-line combinations of patterns. <br>For purposes of this exercise, it's ok if your dictionary stops at \\\"E\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 44,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def print_big(letter):\\n\",\n    \"    patterns = {1:'  *  ',2:' * * ',3:'*   *',4:'*****',5:'**** ',6:'   * ',7:' *   ',8:'*   * ',9:'*    '}\\n\",\n    \"    alphabet = {'A':[1,2,4,3,3],'B':[5,3,5,3,5],'C':[4,9,9,9,4],'D':[5,3,3,3,5],'E':[4,9,4,9,4]}\\n\",\n    \"    for pattern in alphabet[letter.upper()]:\\n\",\n    \"        print(patterns[pattern])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 45,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"  *  \\n\",\n      \" * * \\n\",\n      \"*****\\n\",\n      \"*   *\\n\",\n      \"*   *\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print_big('a')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "03-Methods and Functions/.ipynb_checkpoints/04-Nested Statements and Scope-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Nested Statements and Scope \\n\",\n    \"\\n\",\n    \"Now that we have gone over writing our own functions, it's important to understand how Python deals with the variable names you assign. When you create a variable name in Python the name is stored in a *name-space*. Variable names also have a *scope*, the scope determines the visibility of that variable name to other parts of your code.\\n\",\n    \"\\n\",\n    \"Let's start with a quick thought experiment; imagine the following code:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"x = 25\\n\",\n    \"\\n\",\n    \"def printer():\\n\",\n    \"    x = 50\\n\",\n    \"    return x\\n\",\n    \"\\n\",\n    \"# print(x)\\n\",\n    \"# print(printer())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What do you imagine the output of printer() is? 25 or 50? What is the output of print x? 25 or 50?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"25\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"50\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(printer())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Interesting! But how does Python know which **x** you're referring to in your code? This is where the idea of scope comes in. Python has a set of rules it follows to decide what variables (such as **x** in this case) you are referencing in your code. Lets break down the rules:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"This idea of scope in your code is very important to understand in order to properly assign and call variable names. \\n\",\n    \"\\n\",\n    \"In simple terms, the idea of scope can be described by 3 general rules:\\n\",\n    \"\\n\",\n    \"1. Name assignments will create or change local names by default.\\n\",\n    \"2. Name references search (at most) four scopes, these are:\\n\",\n    \"    * local\\n\",\n    \"    * enclosing functions\\n\",\n    \"    * global\\n\",\n    \"    * built-in\\n\",\n    \"3. Names declared in global and nonlocal statements map assigned names to enclosing module and function scopes.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"The statement in #2 above can be defined by the LEGB rule.\\n\",\n    \"\\n\",\n    \"**LEGB Rule:**\\n\",\n    \"\\n\",\n    \"L: Local — Names assigned in any way within a function (def or lambda), and not declared global in that function.\\n\",\n    \"\\n\",\n    \"E: Enclosing function locals — Names in the local scope of any and all enclosing functions (def or lambda), from inner to outer.\\n\",\n    \"\\n\",\n    \"G: Global (module) — Names assigned at the top-level of a module file, or declared global in a def within the file.\\n\",\n    \"\\n\",\n    \"B: Built-in (Python) — Names preassigned in the built-in names module : open, range, SyntaxError,...\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Quick examples of LEGB\\n\",\n    \"\\n\",\n    \"### Local\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# x is local here:\\n\",\n    \"f = lambda x:x**2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Enclosing function locals\\n\",\n    \"This occurs when we have a function inside a function (nested functions)\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Hello Sammy\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"name = 'This is a global name'\\n\",\n    \"\\n\",\n    \"def greet():\\n\",\n    \"    # Enclosing function\\n\",\n    \"    name = 'Sammy'\\n\",\n    \"    \\n\",\n    \"    def hello():\\n\",\n    \"        print('Hello '+name)\\n\",\n    \"    \\n\",\n    \"    hello()\\n\",\n    \"\\n\",\n    \"greet()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how Sammy was used, because the hello() function was enclosed inside of the greet function!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Global\\n\",\n    \"Luckily in Jupyter a quick way to test for global variables is to see if another cell recognizes the variable!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"This is a global name\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(name)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Built-in\\n\",\n    \"These are the built-in function names in Python (don't overwrite these!)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<function len>\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Local Variables\\n\",\n    \"When you declare variables inside a function definition, they are not related in any way to other variables with the same names used outside the function - i.e. variable names are local to the function. This is called the scope of the variable. All variables have the scope of the block they are declared in starting from the point of definition of the name.\\n\",\n    \"\\n\",\n    \"Example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"x is 50\\n\",\n      \"Changed local x to 2\\n\",\n      \"x is still 50\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = 50\\n\",\n    \"\\n\",\n    \"def func(x):\\n\",\n    \"    print('x is', x)\\n\",\n    \"    x = 2\\n\",\n    \"    print('Changed local x to', x)\\n\",\n    \"\\n\",\n    \"func(x)\\n\",\n    \"print('x is still', x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The first time that we print the value of the name **x** with the first line in the function’s body, Python uses the value of the parameter declared in the main block, above the function definition.\\n\",\n    \"\\n\",\n    \"Next, we assign the value 2 to **x**. The name **x** is local to our function. So, when we change the value of **x** in the function, the **x** defined in the main block remains unaffected.\\n\",\n    \"\\n\",\n    \"With the last print statement, we display the value of **x** as defined in the main block, thereby confirming that it is actually unaffected by the local assignment within the previously called function.\\n\",\n    \"\\n\",\n    \"## The <code>global</code> statement\\n\",\n    \"If you want to assign a value to a name defined at the top level of the program (i.e. not inside any kind of scope such as functions or classes), then you have to tell Python that the name is not local, but it is global. We do this using the <code>global</code> statement. It is impossible to assign a value to a variable defined outside a function without the global statement.\\n\",\n    \"\\n\",\n    \"You can use the values of such variables defined outside the function (assuming there is no variable with the same name within the function). However, this is not encouraged and should be avoided since it becomes unclear to the reader of the program as to where that variable’s definition is. Using the <code>global</code> statement makes it amply clear that the variable is defined in an outermost block.\\n\",\n    \"\\n\",\n    \"Example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Before calling func(), x is:  50\\n\",\n      \"This function is now using the global x!\\n\",\n      \"Because of global x is:  50\\n\",\n      \"Ran func(), changed global x to 2\\n\",\n      \"Value of x (outside of func()) is:  2\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = 50\\n\",\n    \"\\n\",\n    \"def func():\\n\",\n    \"    global x\\n\",\n    \"    print('This function is now using the global x!')\\n\",\n    \"    print('Because of global x is: ', x)\\n\",\n    \"    x = 2\\n\",\n    \"    print('Ran func(), changed global x to', x)\\n\",\n    \"\\n\",\n    \"print('Before calling func(), x is: ', x)\\n\",\n    \"func()\\n\",\n    \"print('Value of x (outside of func()) is: ', x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"The <code>global</code> statement is used to declare that **x** is a global variable - hence, when we assign a value to **x** inside the function, that change is reflected when we use the value of **x** in the main block.\\n\",\n    \"\\n\",\n    \"You can specify more than one global variable using the same global statement e.g. <code>global x, y, z</code>.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## Conclusion\\n\",\n    \"You should now have a good understanding of Scope (you may have already intuitively felt right about Scope which is great!) One last mention is that you can use the **globals()** and **locals()** functions to check what are your current local and global variables.\\n\",\n    \"\\n\",\n    \"Another thing to keep in mind is that everything in Python is an object! I can assign variables to functions just like I can with numbers! We will go over this again in the decorator section of the course!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "03-Methods and Functions/.ipynb_checkpoints/05-Functions and Methods Homework-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Functions and Methods Homework \\n\",\n    \"\\n\",\n    \"Complete the following questions:\\n\",\n    \"____\\n\",\n    \"**Write a function that computes the volume of a sphere given its radius.**\\n\",\n    \"<p>The volume of a sphere is given as $$\\\\frac{4}{3} πr^3$$</p>\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def vol(rad):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"33.49333333333333\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"vol(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"**Write a function that checks whether a number is in a given range (inclusive of high and low)**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def ran_check(num,low,high):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"5 is in the range between 2 and 7\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"ran_check(5,2,7)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you only wanted to return a boolean:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def ran_bool(num,low,high):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"ran_bool(3,1,10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function that accepts a string and calculates the number of upper case letters and lower case letters.**\\n\",\n    \"\\n\",\n    \"    Sample String : 'Hello Mr. Rogers, how are you this fine Tuesday?'\\n\",\n    \"    Expected Output : \\n\",\n    \"    No. of Upper case characters : 4\\n\",\n    \"    No. of Lower case Characters : 33\\n\",\n    \"\\n\",\n    \"HINT: Two string methods that might prove useful: **.isupper()** and **.islower()**\\n\",\n    \"\\n\",\n    \"If you feel ambitious, explore the Collections module to solve this problem!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def up_low(s):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Original String :  Hello Mr. Rogers, how are you this fine Tuesday?\\n\",\n      \"No. of Upper case characters :  4\\n\",\n      \"No. of Lower case Characters :  33\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"s = 'Hello Mr. Rogers, how are you this fine Tuesday?'\\n\",\n    \"up_low(s)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function that takes a list and returns a new list with unique elements of the first list.**\\n\",\n    \"\\n\",\n    \"    Sample List : [1,1,1,1,2,2,3,3,3,3,4,5]\\n\",\n    \"    Unique List : [1, 2, 3, 4, 5]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def unique_list(lst):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 3, 4, 5]\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"unique_list([1,1,1,1,2,2,3,3,3,3,4,5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function to multiply all the numbers in a list.**\\n\",\n    \"\\n\",\n    \"    Sample List : [1, 2, 3, -4]\\n\",\n    \"    Expected Output : -24\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def multiply(numbers):  \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"-24\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"multiply([1,2,3,-4])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function that checks whether a passed in string is palindrome or not.**\\n\",\n    \"\\n\",\n    \"Note: A palindrome is word, phrase, or sequence that reads the same backward as forward, e.g., madam or nurses run.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def palindrome(s):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"palindrome('helleh')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"#### Hard:\\n\",\n    \"\\n\",\n    \"**Write a Python function to check whether a string is pangram or not.**\\n\",\n    \"\\n\",\n    \"    Note : Pangrams are words or sentences containing every letter of the alphabet at least once.\\n\",\n    \"    For example : \\\"The quick brown fox jumps over the lazy dog\\\"\\n\",\n    \"\\n\",\n    \"Hint: Look at the string module\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import string\\n\",\n    \"\\n\",\n    \"def ispangram(str1, alphabet=string.ascii_lowercase):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"ispangram(\\\"The quick brown fox jumps over the lazy dog\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'abcdefghijklmnopqrstuvwxyz'\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"string.ascii_lowercase\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"#### Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "03-Methods and Functions/.ipynb_checkpoints/05-Lambda-Expressions-Map-and-Filter-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Lambda Expressions, Map, and Filter\\n\",\n    \"\\n\",\n    \"Now its time to quickly learn about two built in functions, filter and map. Once we learn about how these operate, we can learn about the lambda expression, which will come in handy when you begin to develop your skills further!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## map function\\n\",\n    \"\\n\",\n    \"The **map** function allows you to \\\"map\\\" a function to an iterable object. That is to say you can quickly call the same function to every item in an iterable, such as a list. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def square(num):\\n\",\n    \"    return num**2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_nums = [1,2,3,4,5]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<map at 0x205baec21d0>\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"map(square,my_nums)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 4, 9, 16, 25]\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# To get the results, either iterate through map() \\n\",\n    \"# or just cast to a list\\n\",\n    \"list(map(square,my_nums))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The functions can also be more complex\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def splicer(mystring):\\n\",\n    \"    if len(mystring) % 2 == 0:\\n\",\n    \"        return 'even'\\n\",\n    \"    else:\\n\",\n    \"        return mystring[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"mynames = ['John','Cindy','Sarah','Kelly','Mike']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['even', 'C', 'S', 'K', 'even']\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(map(splicer,mynames))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## filter function\\n\",\n    \"\\n\",\n    \"The filter function returns an iterator yielding those items of iterable for which function(item)\\n\",\n    \"is true. Meaning you need to filter by a function that returns either True or False. Then passing that into filter (along with your iterable) and you will get back only the results that would return True when passed to the function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def check_even(num):\\n\",\n    \"    return num % 2 == 0 \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"nums = [0,1,2,3,4,5,6,7,8,9,10]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<filter at 0x205baed4710>\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"filter(check_even,nums)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 2, 4, 6, 8, 10]\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(filter(check_even,nums))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## lambda expression\\n\",\n    \"\\n\",\n    \"One of Pythons most useful (and for beginners, confusing) tools is the lambda expression. lambda expressions allow us to create \\\"anonymous\\\" functions. This basically means we can quickly make ad-hoc functions without needing to properly define a function using def.\\n\",\n    \"\\n\",\n    \"Function objects returned by running lambda expressions work exactly the same as those created and assigned by defs. There is key difference that makes lambda useful in specialized roles:\\n\",\n    \"\\n\",\n    \"**lambda's body is a single expression, not a block of statements.**\\n\",\n    \"\\n\",\n    \"* The lambda's body is similar to what we would put in a def body's return statement. We simply type the result as an expression instead of explicitly returning it. Because it is limited to an expression, a lambda is less general that a def. We can only squeeze design, to limit program nesting. lambda is designed for coding simple functions, and def handles the larger tasks.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Lets slowly break down a lambda expression by deconstructing a function:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def square(num):\\n\",\n    \"    result = num**2\\n\",\n    \"    return result\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"square(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We could simplify it:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def square(num):\\n\",\n    \"    return num**2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"square(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We could actually even write this all on one line.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def square(num): return num**2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"square(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This is the form a function that a lambda expression intends to replicate. A lambda expression can then be written as:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<function __main__.<lambda>>\"\n      ]\n     },\n     \"execution_count\": 23,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lambda num: num ** 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# You wouldn't usually assign a name to a lambda expression, this is just for demonstration!\\n\",\n    \"square = lambda num: num **2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"square(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"So why would use this? Many function calls need a function passed in, such as map and filter. Often you only need to use the function you are passing in once, so instead of formally defining it, you just use the lambda expression. Let's repeat some of the examples from above with a lambda expression\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 4, 9, 16, 25]\"\n      ]\n     },\n     \"execution_count\": 29,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(map(lambda num: num ** 2, my_nums))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 2, 4, 6, 8, 10]\"\n      ]\n     },\n     \"execution_count\": 30,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(filter(lambda n: n % 2 == 0,nums))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Here are a few more examples, keep in mind the more comples a function is, the harder it is to translate into a lambda expression, meaning sometimes its just easier (and often the only way) to create the def keyword function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"** Lambda expression for grabbing the first character of a string: **\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<function __main__.<lambda>>\"\n      ]\n     },\n     \"execution_count\": 31,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lambda s: s[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"** Lambda expression for reversing a string: **\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<function __main__.<lambda>>\"\n      ]\n     },\n     \"execution_count\": 32,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lambda s: s[::-1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can even pass in multiple arguments into a lambda expression. Again, keep in mind that not every function can be translated into a lambda expression.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<function __main__.<lambda>>\"\n      ]\n     },\n     \"execution_count\": 34,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lambda x,y : x + y\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You will find yourself using lambda expressions often with certain non-built-in libraries, for example the pandas library for data analysis works very well with lambda expressions.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "03-Methods and Functions/.ipynb_checkpoints/06-Functions and Methods Homework - Solutions-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Functions and Methods Homework Solutions\\n\",\n    \"____\\n\",\n    \"**Write a function that computes the volume of a sphere given its radius.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def vol(rad):\\n\",\n    \"    return (4/3)*(3.14)*(rad**3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"33.49333333333333\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"vol(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"**Write a function that checks whether a number is in a given range (inclusive of high and low)**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def ran_check(num,low,high):\\n\",\n    \"    #Check if num is between low and high (including low and high)\\n\",\n    \"    if num in range(low,high+1):\\n\",\n    \"        print('{} is in the range between {} and {}'.format(num,low,high))\\n\",\n    \"    else:\\n\",\n    \"        print('The number is outside the range.')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"5 is in the range between 2 and 7\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"ran_check(5,2,7)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you only wanted to return a boolean:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def ran_bool(num,low,high):\\n\",\n    \"    return num in range(low,high+1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"ran_bool(3,1,10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function that accepts a string and calculates the number of upper case letters and lower case letters.**\\n\",\n    \"\\n\",\n    \"    Sample String : 'Hello Mr. Rogers, how are you this fine Tuesday?'\\n\",\n    \"    Expected Output : \\n\",\n    \"    No. of Upper case characters : 4\\n\",\n    \"    No. of Lower case Characters : 33\\n\",\n    \"\\n\",\n    \"If you feel ambitious, explore the Collections module to solve this problem!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def up_low(s):\\n\",\n    \"    d={\\\"upper\\\":0, \\\"lower\\\":0}\\n\",\n    \"    for c in s:\\n\",\n    \"        if c.isupper():\\n\",\n    \"            d[\\\"upper\\\"]+=1\\n\",\n    \"        elif c.islower():\\n\",\n    \"            d[\\\"lower\\\"]+=1\\n\",\n    \"        else:\\n\",\n    \"            pass\\n\",\n    \"    print(\\\"Original String : \\\", s)\\n\",\n    \"    print(\\\"No. of Upper case characters : \\\", d[\\\"upper\\\"])\\n\",\n    \"    print(\\\"No. of Lower case Characters : \\\", d[\\\"lower\\\"])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Original String :  Hello Mr. Rogers, how are you this fine Tuesday?\\n\",\n      \"No. of Upper case characters :  4\\n\",\n      \"No. of Lower case Characters :  33\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"s = 'Hello Mr. Rogers, how are you this fine Tuesday?'\\n\",\n    \"up_low(s)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function that takes a list and returns a new list with unique elements of the first list.**\\n\",\n    \"\\n\",\n    \"    Sample List : [1,1,1,1,2,2,3,3,3,3,4,5]\\n\",\n    \"    Unique List : [1, 2, 3, 4, 5]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def unique_list(lst):\\n\",\n    \"    # Also possible to use list(set())\\n\",\n    \"    x = []\\n\",\n    \"    for a in lst:\\n\",\n    \"        if a not in x:\\n\",\n    \"            x.append(a)\\n\",\n    \"    return x\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 3, 4, 5]\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"unique_list([1,1,1,1,2,2,3,3,3,3,4,5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function to multiply all the numbers in a list.**\\n\",\n    \"\\n\",\n    \"    Sample List : [1, 2, 3, -4]\\n\",\n    \"    Expected Output : -24\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def multiply(numbers):\\n\",\n    \"    total = 1\\n\",\n    \"    for x in numbers:\\n\",\n    \"        total *= x\\n\",\n    \"    return total\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"-24\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"multiply([1,2,3,-4])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function that checks whether a passed string is palindrome or not.**\\n\",\n    \"\\n\",\n    \"Note: A palindrome is word, phrase, or sequence that reads the same backward as forward, e.g., madam or nurses run.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def palindrome(s):\\n\",\n    \"    \\n\",\n    \"    s = s.replace(' ','') # This replaces all spaces ' ' with no space ''. (Fixes issues with strings that have spaces)\\n\",\n    \"    return s == s[::-1]   # Check through slicing\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"palindrome('nurses run')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"palindrome('abcba')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Hard**:\\n\",\n    \"\\n\",\n    \"Write a Python function to check whether a string is pangram or not.\\n\",\n    \"\\n\",\n    \"    Note : Pangrams are words or sentences containing every letter of the alphabet at least once.\\n\",\n    \"    For example : \\\"The quick brown fox jumps over the lazy dog\\\"\\n\",\n    \"\\n\",\n    \"Hint: Look at the string module\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import string\\n\",\n    \"\\n\",\n    \"def ispangram(str1, alphabet=string.ascii_lowercase):  \\n\",\n    \"    alphaset = set(alphabet)  \\n\",\n    \"    return alphaset <= set(str1.lower())  \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"ispangram(\\\"The quick brown fox jumps over the lazy dog\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'abcdefghijklmnopqrstuvwxyz'\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"string.ascii_lowercase\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "03-Methods and Functions/.ipynb_checkpoints/06-Nested Statements and Scope-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Nested Statements and Scope \\n\",\n    \"\\n\",\n    \"Now that we have gone over writing our own functions, it's important to understand how Python deals with the variable names you assign. When you create a variable name in Python the name is stored in a *name-space*. Variable names also have a *scope*, the scope determines the visibility of that variable name to other parts of your code.\\n\",\n    \"\\n\",\n    \"Let's start with a quick thought experiment; imagine the following code:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"x = 25\\n\",\n    \"\\n\",\n    \"def printer():\\n\",\n    \"    x = 50\\n\",\n    \"    return x\\n\",\n    \"\\n\",\n    \"# print(x)\\n\",\n    \"# print(printer())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What do you imagine the output of printer() is? 25 or 50? What is the output of print x? 25 or 50?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"25\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"50\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(printer())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Interesting! But how does Python know which **x** you're referring to in your code? This is where the idea of scope comes in. Python has a set of rules it follows to decide what variables (such as **x** in this case) you are referencing in your code. Lets break down the rules:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"This idea of scope in your code is very important to understand in order to properly assign and call variable names. \\n\",\n    \"\\n\",\n    \"In simple terms, the idea of scope can be described by 3 general rules:\\n\",\n    \"\\n\",\n    \"1. Name assignments will create or change local names by default.\\n\",\n    \"2. Name references search (at most) four scopes, these are:\\n\",\n    \"    * local\\n\",\n    \"    * enclosing functions\\n\",\n    \"    * global\\n\",\n    \"    * built-in\\n\",\n    \"3. Names declared in global and nonlocal statements map assigned names to enclosing module and function scopes.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"The statement in #2 above can be defined by the LEGB rule.\\n\",\n    \"\\n\",\n    \"**LEGB Rule:**\\n\",\n    \"\\n\",\n    \"L: Local — Names assigned in any way within a function (def or lambda), and not declared global in that function.\\n\",\n    \"\\n\",\n    \"E: Enclosing function locals — Names in the local scope of any and all enclosing functions (def or lambda), from inner to outer.\\n\",\n    \"\\n\",\n    \"G: Global (module) — Names assigned at the top-level of a module file, or declared global in a def within the file.\\n\",\n    \"\\n\",\n    \"B: Built-in (Python) — Names preassigned in the built-in names module : open, range, SyntaxError,...\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Quick examples of LEGB\\n\",\n    \"\\n\",\n    \"### Local\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# x is local here:\\n\",\n    \"f = lambda x:x**2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Enclosing function locals\\n\",\n    \"This occurs when we have a function inside a function (nested functions)\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Hello Sammy\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"name = 'This is a global name'\\n\",\n    \"\\n\",\n    \"def greet():\\n\",\n    \"    # Enclosing function\\n\",\n    \"    name = 'Sammy'\\n\",\n    \"    \\n\",\n    \"    def hello():\\n\",\n    \"        print('Hello '+name)\\n\",\n    \"    \\n\",\n    \"    hello()\\n\",\n    \"\\n\",\n    \"greet()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how Sammy was used, because the hello() function was enclosed inside of the greet function!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Global\\n\",\n    \"Luckily in Jupyter a quick way to test for global variables is to see if another cell recognizes the variable!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"This is a global name\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(name)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Built-in\\n\",\n    \"These are the built-in function names in Python (don't overwrite these!)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<function len>\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Local Variables\\n\",\n    \"When you declare variables inside a function definition, they are not related in any way to other variables with the same names used outside the function - i.e. variable names are local to the function. This is called the scope of the variable. All variables have the scope of the block they are declared in starting from the point of definition of the name.\\n\",\n    \"\\n\",\n    \"Example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"x is 50\\n\",\n      \"Changed local x to 2\\n\",\n      \"x is still 50\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = 50\\n\",\n    \"\\n\",\n    \"def func(x):\\n\",\n    \"    print('x is', x)\\n\",\n    \"    x = 2\\n\",\n    \"    print('Changed local x to', x)\\n\",\n    \"\\n\",\n    \"func(x)\\n\",\n    \"print('x is still', x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The first time that we print the value of the name **x** with the first line in the function’s body, Python uses the value of the parameter declared in the main block, above the function definition.\\n\",\n    \"\\n\",\n    \"Next, we assign the value 2 to **x**. The name **x** is local to our function. So, when we change the value of **x** in the function, the **x** defined in the main block remains unaffected.\\n\",\n    \"\\n\",\n    \"With the last print statement, we display the value of **x** as defined in the main block, thereby confirming that it is actually unaffected by the local assignment within the previously called function.\\n\",\n    \"\\n\",\n    \"## The <code>global</code> statement\\n\",\n    \"If you want to assign a value to a name defined at the top level of the program (i.e. not inside any kind of scope such as functions or classes), then you have to tell Python that the name is not local, but it is global. We do this using the <code>global</code> statement. It is impossible to assign a value to a variable defined outside a function without the global statement.\\n\",\n    \"\\n\",\n    \"You can use the values of such variables defined outside the function (assuming there is no variable with the same name within the function). However, this is not encouraged and should be avoided since it becomes unclear to the reader of the program as to where that variable’s definition is. Using the <code>global</code> statement makes it amply clear that the variable is defined in an outermost block.\\n\",\n    \"\\n\",\n    \"Example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Before calling func(), x is:  50\\n\",\n      \"This function is now using the global x!\\n\",\n      \"Because of global x is:  50\\n\",\n      \"Ran func(), changed global x to 2\\n\",\n      \"Value of x (outside of func()) is:  2\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = 50\\n\",\n    \"\\n\",\n    \"def func():\\n\",\n    \"    global x\\n\",\n    \"    print('This function is now using the global x!')\\n\",\n    \"    print('Because of global x is: ', x)\\n\",\n    \"    x = 2\\n\",\n    \"    print('Ran func(), changed global x to', x)\\n\",\n    \"\\n\",\n    \"print('Before calling func(), x is: ', x)\\n\",\n    \"func()\\n\",\n    \"print('Value of x (outside of func()) is: ', x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"The <code>global</code> statement is used to declare that **x** is a global variable - hence, when we assign a value to **x** inside the function, that change is reflected when we use the value of **x** in the main block.\\n\",\n    \"\\n\",\n    \"You can specify more than one global variable using the same global statement e.g. <code>global x, y, z</code>.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## Conclusion\\n\",\n    \"You should now have a good understanding of Scope (you may have already intuitively felt right about Scope which is great!) One last mention is that you can use the **globals()** and **locals()** functions to check what are your current local and global variables.\\n\",\n    \"\\n\",\n    \"Another thing to keep in mind is that everything in Python is an object! I can assign variables to functions just like I can with numbers! We will go over this again in the decorator section of the course!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "03-Methods and Functions/.ipynb_checkpoints/07-args and kwargs-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# `*args` and `**kwargs`\\n\",\n    \"\\n\",\n    \"Work with Python long enough, and eventually you will encounter `*args` and `**kwargs`. These strange terms show up as parameters in function definitions. What do they do? Let's review a simple function:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"5.0\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"def myfunc(a,b):\\n\",\n    \"    return sum((a,b))*.05\\n\",\n    \"\\n\",\n    \"myfunc(40,60)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This function returns 5% of the sum of **a** and **b**. In this example, **a** and **b** are *positional* arguments; that is, 40 is assigned to **a** because it is the first argument, and 60 to **b**. Notice also that to work with multiple positional arguments in the `sum()` function we had to pass them in as a tuple.\\n\",\n    \"\\n\",\n    \"What if we want to work with more than two numbers? One way would be to assign a *lot* of parameters, and give each one a default value.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"6.0\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"def myfunc(a=0,b=0,c=0,d=0,e=0):\\n\",\n    \"    return sum((a,b,c,d,e))*.05\\n\",\n    \"\\n\",\n    \"myfunc(40,60,20)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Obviously this is not a very efficient solution, and that's where `*args` comes in.\\n\",\n    \"\\n\",\n    \"## `*args`\\n\",\n    \"\\n\",\n    \"When a function parameter starts with an asterisk, it allows for an *arbitrary number* of arguments, and the function takes them in as a tuple of values. Rewriting the above function:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"6.0\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"def myfunc(*args):\\n\",\n    \"    return sum(args)*.05\\n\",\n    \"\\n\",\n    \"myfunc(40,60,20)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice how passing the keyword \\\"args\\\" into the `sum()` function did the same thing as a tuple of arguments.\\n\",\n    \"\\n\",\n    \"It is worth noting that the word \\\"args\\\" is itself arbitrary - any word will do so long as it's preceded by an asterisk. To demonstrate this:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"6.0\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"def myfunc(*spam):\\n\",\n    \"    return sum(spam)*.05\\n\",\n    \"\\n\",\n    \"myfunc(40,60,20)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## `**kwargs`\\n\",\n    \"\\n\",\n    \"Similarly, Python offers a way to handle arbitrary numbers of *keyworded* arguments. Instead of creating a tuple of values, `**kwargs` builds a dictionary of key/value pairs. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"My favorite fruit is pineapple\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"def myfunc(**kwargs):\\n\",\n    \"    if 'fruit' in kwargs:\\n\",\n    \"        print(f\\\"My favorite fruit is {kwargs['fruit']}\\\")  # review String Formatting and f-strings if this syntax is unfamiliar\\n\",\n    \"    else:\\n\",\n    \"        print(\\\"I don't like fruit\\\")\\n\",\n    \"        \\n\",\n    \"myfunc(fruit='pineapple')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"I don't like fruit\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"myfunc()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## `*args` and `**kwargs` combined\\n\",\n    \"\\n\",\n    \"You can pass `*args` and `**kwargs` into the same function, but `*args` have to appear before `**kwargs`\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"I like eggs and spam and my favorite fruit is cherries\\n\",\n      \"May I have some orange juice?\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"def myfunc(*args, **kwargs):\\n\",\n    \"    if 'fruit' and 'juice' in kwargs:\\n\",\n    \"        print(f\\\"I like {' and '.join(args)} and my favorite fruit is {kwargs['fruit']}\\\")\\n\",\n    \"        print(f\\\"May I have some {kwargs['juice']} juice?\\\")\\n\",\n    \"    else:\\n\",\n    \"        pass\\n\",\n    \"        \\n\",\n    \"myfunc('eggs','spam',fruit='cherries',juice='orange')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Placing keyworded arguments ahead of positional arguments raises an exception:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"SyntaxError\",\n     \"evalue\": \"positional argument follows keyword argument (<ipython-input-8-fc6ff65addcc>, line 1)\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;36m  File \\u001b[1;32m\\\"<ipython-input-8-fc6ff65addcc>\\\"\\u001b[1;36m, line \\u001b[1;32m1\\u001b[0m\\n\\u001b[1;33m    myfunc(fruit='cherries',juice='orange','eggs','spam')\\u001b[0m\\n\\u001b[1;37m                                          ^\\u001b[0m\\n\\u001b[1;31mSyntaxError\\u001b[0m\\u001b[1;31m:\\u001b[0m positional argument follows keyword argument\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"myfunc(fruit='cherries',juice='orange','eggs','spam')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"As with \\\"args\\\", you can use any name you'd like for keyworded arguments - \\\"kwargs\\\" is just a popular convention.\\n\",\n    \"\\n\",\n    \"That's it! Now you should understand how `*args` and `**kwargs` provide the flexibilty to work with arbitrary numbers of arguments!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "03-Methods and Functions/.ipynb_checkpoints/08-Function Practice Exercises-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Function Practice Exercises\\n\",\n    \"\\n\",\n    \"Problems are arranged in increasing difficulty:\\n\",\n    \"* Warmup - these can be solved using basic comparisons and methods\\n\",\n    \"* Level 1 - these may involve if/then conditional statements and simple methods\\n\",\n    \"* Level 2 - these may require iterating over sequences, usually with some kind of loop\\n\",\n    \"* Challenging - these will take some creativity to solve\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## WARMUP SECTION:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### LESSER OF TWO EVENS: Write a function that returns the lesser of two given numbers *if* both numbers are even, but returns the greater if one or both numbers are odd\\n\",\n    \"    lesser_of_two_evens(2,4) --> 2\\n\",\n    \"    lesser_of_two_evens(2,5) --> 5\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def lesser_of_two_evens(a,b):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"lesser_of_two_evens(2,4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"lesser_of_two_evens(2,5)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### ANIMAL CRACKERS: Write a function takes a two-word string and returns True if both words begin with same letter\\n\",\n    \"    animal_crackers('Levelheaded Llama') --> True\\n\",\n    \"    animal_crackers('Crazy Kangaroo') --> False\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def animal_crackers(text):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"animal_crackers('Levelheaded Llama')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"animal_crackers('Crazy Kangaroo')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### THE OTHER SIDE OF SEVEN: Given a value, return a value that is twice as far away on the other side of 7\\n\",\n    \"\\n\",\n    \"    other_side_of_seven(4) --> 13\\n\",\n    \"    other_side_of_seven(12) --> -3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def other_side_of_seven(num):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"other_side_of_seven(4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"other_side_of_seven(12)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# LEVEL 1 PROBLEMS\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### OLD MACDONALD: Write a function that capitalizes the first and fourth letters of a name\\n\",\n    \"     \\n\",\n    \"    old_macdonald('macdonald') --> MacDonald\\n\",\n    \"    \\n\",\n    \"Note: `'macdonald'.capitalize()` returns `'Macdonald'`\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def old_macdonald(name):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"old_macdonald('macdonald')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### MASTER YODA: Given a sentence, return a sentence with the words reversed\\n\",\n    \"\\n\",\n    \"    master_yoda('I am home') --> 'home am I'\\n\",\n    \"    master_yoda('We are ready') --> 'ready are We'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def master_yoda(text):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"master_yoda('I am home')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"master_yoda('We are ready')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### ALMOST THERE: Given an integer n, return True if n is within 10 of either 100 or 200\\n\",\n    \"\\n\",\n    \"    almost_there(90) --> True\\n\",\n    \"    almost_there(104) --> True\\n\",\n    \"    almost_there(150) --> False\\n\",\n    \"    almost_there(209) --> True\\n\",\n    \"    \\n\",\n    \"NOTE: `abs(num)` returns the absolute value of a number\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def almost_there(n):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"almost_there(104)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"almost_there(150)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"almost_there(209)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# LEVEL 2 PROBLEMS\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### LAUGHTER: Write a function that counts the number of times a given pattern appears in a string, *including overlap*\\n\",\n    \"\\n\",\n    \"    laughter('hah','hahahah') --> 3\\n\",\n    \"\\n\",\n    \"Note that `'hahahah'.count('hah')` only returns 2.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def laughter(pattern,text):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"laughter('hah','hahahah')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### PAPER DOLL: Given a string, return a string where for every character in the original there are three characters\\n\",\n    \"    paper_doll('Hello') --> 'HHHeeellllllooo'\\n\",\n    \"    paper_doll('Mississippi') --> 'MMMiiissssssiiippppppiii'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def paper_doll(text):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"paper_doll('Hello')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"paper_doll('Mississippi')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### BLACKJACK: Given three integers between 1 and 11, if their sum is less than or equal to 21, return their sum. If their sum exceeds 21 *and* there's an eleven, reduce the total sum by 10. Finally, if the sum (even after adjustment) exceeds 21, return 'BUST'\\n\",\n    \"    blackjack(5,6,7) --> 18\\n\",\n    \"    blackjack(9,9,9) --> 'BUST'\\n\",\n    \"    blackjack(9,9,11) --> 19\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def blackjack(a,b,c):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"blackjack(5,6,7)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"blackjack(9,9,9)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"blackjack(9,9,11)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### SUMMER OF '69: Return the sum of the numbers in the array, except ignore sections of numbers starting with a 6 and extending to the next 9 (every 6 will be followed by at least one 9). Return 0 for no numbers.\\n\",\n    \" \\n\",\n    \"    summer_69([1, 3, 5]) --> 9\\n\",\n    \"    summer_69([4, 5, 6, 7, 8, 9]) --> 9\\n\",\n    \"    summer_69([2, 1, 6, 9, 11]) --> 14\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def summer_69(arr):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"summer_69([1, 3, 5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"summer_69([4, 5, 6, 7, 8, 9])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"summer_69([2, 1, 6, 9, 11])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# CHALLENGING PROBLEMS\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### SPY GAME: Write a function that takes in a list of integers and returns True if it contains 007 in order\\n\",\n    \"\\n\",\n    \"     spy_game([1,2,4,0,0,7,5]) --> True\\n\",\n    \"     spy_game([1,0,2,4,0,5,7]) --> True\\n\",\n    \"     spy_game([1,7,2,0,4,5,0]) --> False\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def spy_game(nums):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"spy_game([1,2,4,0,0,7,5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"spy_game([1,0,2,4,0,5,7])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"spy_game([1,7,2,0,4,5,0])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### COUNT PRIMES: Write a function that returns the *number* of prime numbers that exist up to and including a given number\\n\",\n    \"    count_primes(100) --> 25\\n\",\n    \"\\n\",\n    \"By convention, 0 and 1 are not prime.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def count_primes(num):\\n\",\n    \"    pass\\n\",\n    \"                \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"count_primes(100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Just for fun:\\n\",\n    \"#### PRINT BIG: Write a function that takes in a single letter, and returns a 5x5 representation of that letter\\n\",\n    \"    print_big('a')\\n\",\n    \"    \\n\",\n    \"    out:   *  \\n\",\n    \"          * *\\n\",\n    \"         *****\\n\",\n    \"         *   *\\n\",\n    \"         *   *\\n\",\n    \"HINT: Consider making a dictionary of possible patterns, and mapping the alphabet to specific 5-line combinations of patterns. <br>For purposes of this exercise, it's ok if your dictionary stops at \\\"E\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def print_big(letter):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"print_big('a')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "03-Methods and Functions/.ipynb_checkpoints/08-Functions and Methods Homework-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Functions and Methods Homework \\n\",\n    \"\\n\",\n    \"Complete the following questions:\\n\",\n    \"____\\n\",\n    \"**Write a function that computes the volume of a sphere given its radius.**\\n\",\n    \"<p>The volume of a sphere is given as $$\\\\frac{4}{3} πr^3$$</p>\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def vol(rad):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"33.49333333333333\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"vol(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"**Write a function that checks whether a number is in a given range (inclusive of high and low)**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def ran_check(num,low,high):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"5 is in the range between 2 and 7\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"ran_check(5,2,7)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you only wanted to return a boolean:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def ran_bool(num,low,high):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"ran_bool(3,1,10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function that accepts a string and calculates the number of upper case letters and lower case letters.**\\n\",\n    \"\\n\",\n    \"    Sample String : 'Hello Mr. Rogers, how are you this fine Tuesday?'\\n\",\n    \"    Expected Output : \\n\",\n    \"    No. of Upper case characters : 4\\n\",\n    \"    No. of Lower case Characters : 33\\n\",\n    \"\\n\",\n    \"HINT: Two string methods that might prove useful: **.isupper()** and **.islower()**\\n\",\n    \"\\n\",\n    \"If you feel ambitious, explore the Collections module to solve this problem!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def up_low(s):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Original String :  Hello Mr. Rogers, how are you this fine Tuesday?\\n\",\n      \"No. of Upper case characters :  4\\n\",\n      \"No. of Lower case Characters :  33\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"s = 'Hello Mr. Rogers, how are you this fine Tuesday?'\\n\",\n    \"up_low(s)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function that takes a list and returns a new list with unique elements of the first list.**\\n\",\n    \"\\n\",\n    \"    Sample List : [1,1,1,1,2,2,3,3,3,3,4,5]\\n\",\n    \"    Unique List : [1, 2, 3, 4, 5]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def unique_list(lst):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 3, 4, 5]\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"unique_list([1,1,1,1,2,2,3,3,3,3,4,5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function to multiply all the numbers in a list.**\\n\",\n    \"\\n\",\n    \"    Sample List : [1, 2, 3, -4]\\n\",\n    \"    Expected Output : -24\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def multiply(numbers):  \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"-24\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"multiply([1,2,3,-4])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function that checks whether a word or phrase is palindrome or not.**\\n\",\n    \"\\n\",\n    \"Note: A palindrome is word, phrase, or sequence that reads the same backward as forward, e.g., madam,kayak,racecar, or a phrase \\\"nurses run\\\". Hint: You may want to check out the .replace() method in a string to help out with dealing with spaces. Also google search how to reverse a string in Python, there are some clever ways to do it with slicing notation.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def palindrome(s):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"palindrome('helleh')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"#### Hard:\\n\",\n    \"\\n\",\n    \"**Write a Python function to check whether a string is pangram or not. (Assume the string passed in does not have any punctuation)**\\n\",\n    \"\\n\",\n    \"    Note : Pangrams are words or sentences containing every letter of the alphabet at least once.\\n\",\n    \"    For example : \\\"The quick brown fox jumps over the lazy dog\\\"\\n\",\n    \"\\n\",\n    \"Hint: You may want to use .replace() method to get rid of spaces.\\n\",\n    \"\\n\",\n    \"Hint: Look at the [string module](https://stackoverflow.com/questions/16060899/alphabet-range-in-python)\\n\",\n    \"\\n\",\n    \"Hint: In case you want to use [set comparisons](https://medium.com/better-programming/a-visual-guide-to-set-comparisons-in-python-6ab7edb9ec41)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import string\\n\",\n    \"\\n\",\n    \"def ispangram(str1, alphabet=string.ascii_lowercase):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"ispangram(\\\"The quick brown fox jumps over the lazy dog\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'abcdefghijklmnopqrstuvwxyz'\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"string.ascii_lowercase\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"#### Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "03-Methods and Functions/.ipynb_checkpoints/09-Function Practice Exercises - Solutions-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Function Practice Exercises - Solutions\\n\",\n    \"\\n\",\n    \"Problems are arranged in increasing difficulty:\\n\",\n    \"* Warmup - these can be solved using basic comparisons and methods\\n\",\n    \"* Level 1 - these may involve if/then conditional statements and simple methods\\n\",\n    \"* Level 2 - these may require iterating over sequences, usually with some kind of loop\\n\",\n    \"* Challenging - these will take some creativity to solve\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## WARMUP SECTION:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### LESSER OF TWO EVENS: Write a function that returns the lesser of two given numbers *if* both numbers are even, but returns the greater if one or both numbers are odd\\n\",\n    \"    lesser_of_two_evens(2,4) --> 2\\n\",\n    \"    lesser_of_two_evens(2,5) --> 5\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def lesser_of_two_evens(a,b):\\n\",\n    \"    if a%2 == 0 and b%2 == 0:\\n\",\n    \"        return min(a,b)\\n\",\n    \"    else:\\n\",\n    \"        return max(a,b)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"lesser_of_two_evens(2,4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"5\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"lesser_of_two_evens(2,5)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### ANIMAL CRACKERS: Write a function takes a two-word string and returns True if both words begin with same letter\\n\",\n    \"    animal_crackers('Levelheaded Llama') --> True\\n\",\n    \"    animal_crackers('Crazy Kangaroo') --> False\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def animal_crackers(text):\\n\",\n    \"    wordlist = text.split()\\n\",\n    \"    return wordlist[0][0] == wordlist[1][0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"animal_crackers('Levelheaded Llama')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"animal_crackers('Crazy Kangaroo')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### THE OTHER SIDE OF SEVEN: Given a value, return a value that is twice as far away on the other side of 7\\n\",\n    \"\\n\",\n    \"    other_side_of_seven(4) --> 13\\n\",\n    \"    other_side_of_seven(12) --> -3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def other_side_of_seven(num):\\n\",\n    \"    return 7 - 2*(num-7)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"13\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"other_side_of_seven(4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"-3\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"other_side_of_seven(12)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# LEVEL 1 PROBLEMS\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### OLD MACDONALD: Write a function that capitalizes the first and fourth letters of a name\\n\",\n    \"     \\n\",\n    \"    old_macdonald('macdonald') --> MacDonald\\n\",\n    \"    \\n\",\n    \"Note: `'macdonald'.capitalize()` returns `'Macdonald'`\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def old_macdonald(name):\\n\",\n    \"    if len(name) > 3:\\n\",\n    \"        return name[:3].capitalize() + name[3:].capitalize()\\n\",\n    \"    else:\\n\",\n    \"        return 'Name is too short!'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'MacDonald'\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"old_macdonald('macdonald')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### MASTER YODA: Given a sentence, return a sentence with the words reversed\\n\",\n    \"\\n\",\n    \"    master_yoda('I am home') --> 'home am I'\\n\",\n    \"    master_yoda('We are ready') --> 'ready are We'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def master_yoda(text):\\n\",\n    \"    return ' '.join(text.split()[::-1])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'home am I'\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"master_yoda('I am home')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'ready are We'\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"master_yoda('We are ready')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### ALMOST THERE: Given an integer n, return True if n is within 10 of either 100 or 200\\n\",\n    \"\\n\",\n    \"    almost_there(90) --> True\\n\",\n    \"    almost_there(104) --> True\\n\",\n    \"    almost_there(150) --> False\\n\",\n    \"    almost_there(209) --> True\\n\",\n    \"    \\n\",\n    \"NOTE: `abs(num)` returns the absolute value of a number\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def almost_there(n):\\n\",\n    \"    return ((abs(100 - n) <= 10) or (abs(200 - n) <= 10))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"almost_there(104)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"almost_there(150)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"almost_there(209)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# LEVEL 2 PROBLEMS\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### LAUGHTER: Write a function that counts the number of times a given pattern appears in a string, *including overlap*\\n\",\n    \"\\n\",\n    \"    laughter('hah','hahahah') --> 3\\n\",\n    \"\\n\",\n    \"Note that `'hahahah'.count('hah')` only returns 2.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def laughter(pattern,text):\\n\",\n    \"    out = 0\\n\",\n    \"    for x in range(len(text)-2):\\n\",\n    \"        if text[x:x+len(pattern)] == pattern:\\n\",\n    \"            out += 1\\n\",\n    \"    return out\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"laughter('hah','hahahah')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### PAPER DOLL: Given a string, return a string where for every character in the original there are three characters\\n\",\n    \"    paper_doll('Hello') --> 'HHHeeellllllooo'\\n\",\n    \"    paper_doll('Mississippi') --> 'MMMiiissssssiiippppppiii'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def paper_doll(text):\\n\",\n    \"    result = ''\\n\",\n    \"    for char in text:\\n\",\n    \"        result += char * 3\\n\",\n    \"    return result\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'HHHeeellllllooo'\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"paper_doll('Hello')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'MMMiiissssssiiissssssiiippppppiii'\"\n      ]\n     },\n     \"execution_count\": 23,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"paper_doll('Mississippi')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### BLACKJACK: Given three integers between 1 and 11, if their sum is less than or equal to 21, return their sum. If their sum exceeds 21 *and* there's an eleven, reduce the total sum by 10. Finally, if the sum (even after adjustment) exceeds 21, return 'BUST'\\n\",\n    \"    blackjack(5,6,7) --> 18\\n\",\n    \"    blackjack(9,9,9) --> 'BUST'\\n\",\n    \"    blackjack(9,9,11) --> 19\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def blackjack(a,b,c):\\n\",\n    \"    \\n\",\n    \"    if sum((a,b,c)) <= 21:\\n\",\n    \"        return sum((a,b,c))\\n\",\n    \"    elif sum((a,b,c)) <=31 and 11 in (a,b,c):\\n\",\n    \"        return sum((a,b,c)) - 10\\n\",\n    \"    else:\\n\",\n    \"        return 'BUST'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"18\"\n      ]\n     },\n     \"execution_count\": 25,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"blackjack(5,6,7)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'BUST'\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"blackjack(9,9,9)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"19\"\n      ]\n     },\n     \"execution_count\": 27,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"blackjack(9,9,11)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### SUMMER OF '69: Return the sum of the numbers in the array, except ignore sections of numbers starting with a 6 and extending to the next 9 (every 6 will be followed by at least one 9). Return 0 for no numbers.\\n\",\n    \" \\n\",\n    \"    summer_69([1, 3, 5]) --> 9\\n\",\n    \"    summer_69([4, 5, 6, 7, 8, 9]) --> 9\\n\",\n    \"    summer_69([2, 1, 6, 9, 11]) --> 14\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def summer_69(arr):\\n\",\n    \"    total = 0\\n\",\n    \"    add = True\\n\",\n    \"    for num in arr:\\n\",\n    \"        while add:\\n\",\n    \"            if num != 6:\\n\",\n    \"                total += num\\n\",\n    \"                break\\n\",\n    \"            else:\\n\",\n    \"                add = False\\n\",\n    \"        while not add:\\n\",\n    \"            if num != 9:\\n\",\n    \"                break\\n\",\n    \"            else:\\n\",\n    \"                add = True\\n\",\n    \"                break\\n\",\n    \"    return total\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"9\"\n      ]\n     },\n     \"execution_count\": 29,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"summer_69([1, 3, 5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"9\"\n      ]\n     },\n     \"execution_count\": 30,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"summer_69([4, 5, 6, 7, 8, 9])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"14\"\n      ]\n     },\n     \"execution_count\": 31,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"summer_69([2, 1, 6, 9, 11])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# CHALLENGING PROBLEMS\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### SPY GAME: Write a function that takes in a list of integers and returns True if it contains 007 in order\\n\",\n    \"\\n\",\n    \"     spy_game([1,2,4,0,0,7,5]) --> True\\n\",\n    \"     spy_game([1,0,2,4,0,5,7]) --> True\\n\",\n    \"     spy_game([1,7,2,0,4,5,0]) --> False\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def spy_game(nums):\\n\",\n    \"\\n\",\n    \"    code = [0,0,7,'x']\\n\",\n    \"    \\n\",\n    \"    for num in nums:\\n\",\n    \"        if num == code[0]:\\n\",\n    \"            code.pop(0)   # code.remove(num) also works\\n\",\n    \"       \\n\",\n    \"    return len(code) == 1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 33,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"spy_game([1,2,4,0,0,7,5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 34,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"spy_game([1,0,2,4,0,5,7])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 35,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"spy_game([1,7,2,0,4,5,0])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### COUNT PRIMES: Write a function that returns the *number* of prime numbers that exist up to and including a given number\\n\",\n    \"    count_primes(100) --> 25\\n\",\n    \"\\n\",\n    \"By convention, 0 and 1 are not prime.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def count_primes(num):\\n\",\n    \"    primes = [2]\\n\",\n    \"    x = 3\\n\",\n    \"    if num < 2:  # for the case of num = 0 or 1\\n\",\n    \"        return 0\\n\",\n    \"    while x <= num:\\n\",\n    \"        for y in range(3,x,2):  # test all odd factors up to x-1\\n\",\n    \"            if x%y == 0:\\n\",\n    \"                x += 2\\n\",\n    \"                break\\n\",\n    \"        else:\\n\",\n    \"            primes.append(x)\\n\",\n    \"            x += 2\\n\",\n    \"    print(primes)\\n\",\n    \"    return len(primes)\\n\",\n    \"                \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"25\"\n      ]\n     },\n     \"execution_count\": 37,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"count_primes(100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"BONUS: Here's a faster version that makes use of the prime numbers we're collecting as we go!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 38,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def count_primes2(num):\\n\",\n    \"    primes = [2]\\n\",\n    \"    x = 3\\n\",\n    \"    if num < 2:\\n\",\n    \"        return 0\\n\",\n    \"    while x <= num:\\n\",\n    \"        for y in primes:  # use the primes list!\\n\",\n    \"            if x%y == 0:\\n\",\n    \"                x += 2\\n\",\n    \"                break\\n\",\n    \"        else:\\n\",\n    \"            primes.append(x)\\n\",\n    \"            x += 2\\n\",\n    \"    print(primes)\\n\",\n    \"    return len(primes)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"25\"\n      ]\n     },\n     \"execution_count\": 39,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"count_primes2(100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Just for fun:\\n\",\n    \"#### PRINT BIG: Write a function that takes in a single letter, and returns a 5x5 representation of that letter\\n\",\n    \"    print_big('a')\\n\",\n    \"    \\n\",\n    \"    out:   *  \\n\",\n    \"          * *\\n\",\n    \"         *****\\n\",\n    \"         *   *\\n\",\n    \"         *   *\\n\",\n    \"HINT: Consider making a dictionary of possible patterns, and mapping the alphabet to specific 5-line combinations of patterns. <br>For purposes of this exercise, it's ok if your dictionary stops at \\\"E\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 42,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def print_big(letter):\\n\",\n    \"    patterns = {1:'  *  ',2:' * * ',3:'*   *',4:'*****',5:'**** ',6:'   * ',7:' *   ',8:'*   * ',9:'*    '}\\n\",\n    \"    alphabet = {'A':[1,2,4,3,3],'B':[5,3,5,3,5],'C':[4,9,9,9,4],'D':[5,3,3,3,5],'E':[4,9,4,9,4]}\\n\",\n    \"    for pattern in alphabet[letter.upper()]:\\n\",\n    \"        print(patterns[pattern])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 43,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"  *  \\n\",\n      \" * * \\n\",\n      \"*****\\n\",\n      \"*   *\\n\",\n      \"*   *\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print_big('a')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "03-Methods and Functions/.ipynb_checkpoints/09-Functions and Methods Homework - Solutions-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Functions and Methods Homework Solutions\\n\",\n    \"____\\n\",\n    \"**Write a function that computes the volume of a sphere given its radius.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def vol(rad):\\n\",\n    \"    return (4/3)*(3.14)*(rad**3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"33.49333333333333\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"vol(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"**Write a function that checks whether a number is in a given range (inclusive of high and low)**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def ran_check(num,low,high):\\n\",\n    \"    #Check if num is between low and high (including low and high)\\n\",\n    \"    if num in range(low,high+1):\\n\",\n    \"        print('{} is in the range between {} and {}'.format(num,low,high))\\n\",\n    \"    else:\\n\",\n    \"        print('The number is outside the range.')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"5 is in the range between 2 and 7\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"ran_check(5,2,7)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you only wanted to return a boolean:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def ran_bool(num,low,high):\\n\",\n    \"    return num in range(low,high+1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"ran_bool(3,1,10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function that accepts a string and calculates the number of upper case letters and lower case letters.**\\n\",\n    \"\\n\",\n    \"    Sample String : 'Hello Mr. Rogers, how are you this fine Tuesday?'\\n\",\n    \"    Expected Output : \\n\",\n    \"    No. of Upper case characters : 4\\n\",\n    \"    No. of Lower case Characters : 33\\n\",\n    \"\\n\",\n    \"If you feel ambitious, explore the Collections module to solve this problem!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def up_low(s):\\n\",\n    \"    d={\\\"upper\\\":0, \\\"lower\\\":0}\\n\",\n    \"    for c in s:\\n\",\n    \"        if c.isupper():\\n\",\n    \"            d[\\\"upper\\\"]+=1\\n\",\n    \"        elif c.islower():\\n\",\n    \"            d[\\\"lower\\\"]+=1\\n\",\n    \"        else:\\n\",\n    \"            pass\\n\",\n    \"    print(\\\"Original String : \\\", s)\\n\",\n    \"    print(\\\"No. of Upper case characters : \\\", d[\\\"upper\\\"])\\n\",\n    \"    print(\\\"No. of Lower case Characters : \\\", d[\\\"lower\\\"])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Original String :  Hello Mr. Rogers, how are you this fine Tuesday?\\n\",\n      \"No. of Upper case characters :  4\\n\",\n      \"No. of Lower case Characters :  33\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"s = 'Hello Mr. Rogers, how are you this fine Tuesday?'\\n\",\n    \"up_low(s)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function that takes a list and returns a new list with unique elements of the first list.**\\n\",\n    \"\\n\",\n    \"    Sample List : [1,1,1,1,2,2,3,3,3,3,4,5]\\n\",\n    \"    Unique List : [1, 2, 3, 4, 5]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def unique_list(lst):\\n\",\n    \"    # Also possible to use list(set())\\n\",\n    \"    x = []\\n\",\n    \"    for a in lst:\\n\",\n    \"        if a not in x:\\n\",\n    \"            x.append(a)\\n\",\n    \"    return x\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 3, 4, 5]\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"unique_list([1,1,1,1,2,2,3,3,3,3,4,5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function to multiply all the numbers in a list.**\\n\",\n    \"\\n\",\n    \"    Sample List : [1, 2, 3, -4]\\n\",\n    \"    Expected Output : -24\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def multiply(numbers):\\n\",\n    \"    total = 1\\n\",\n    \"    for x in numbers:\\n\",\n    \"        total *= x\\n\",\n    \"    return total\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"-24\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"multiply([1,2,3,-4])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function that checks whether a word or phrase is palindrome or not.**\\n\",\n    \"\\n\",\n    \"Note: A palindrome is word, phrase, or sequence that reads the same backward as forward, e.g., madam,kayak,racecar, or a phrase \\\"nurses run\\\". Hint: You may want to check out the .replace() method in a string to help out with dealing with spaces. Also google search how to reverse a string in Python, there are some clever ways to do it with slicing notation.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def palindrome(s):\\n\",\n    \"    \\n\",\n    \"    s = s.replace(' ','') # This replaces all spaces ' ' with no space ''. (Fixes issues with strings that have spaces)\\n\",\n    \"    return s == s[::-1]   # Check through slicing\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"palindrome('nurses run')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"palindrome('abcba')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"#### Hard:\\n\",\n    \"\\n\",\n    \"**Write a Python function to check whether a string is pangram or not. (Assume the string passed in does not have any punctuation)**\\n\",\n    \"\\n\",\n    \"    Note : Pangrams are words or sentences containing every letter of the alphabet at least once.\\n\",\n    \"    For example : \\\"The quick brown fox jumps over the lazy dog\\\"\\n\",\n    \"\\n\",\n    \"Hint: You may want to use .replace() method to get rid of spaces.\\n\",\n    \"\\n\",\n    \"Hint: Look at the [string module](https://stackoverflow.com/questions/16060899/alphabet-range-in-python)\\n\",\n    \"\\n\",\n    \"Hint: In case you want to use [set comparisons](https://medium.com/better-programming/a-visual-guide-to-set-comparisons-in-python-6ab7edb9ec41)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import string\\n\",\n    \"\\n\",\n    \"def ispangram(str1, alphabet=string.ascii_lowercase): \\n\",\n    \"    # Create a set of the alphabet\\n\",\n    \"    alphaset = set(alphabet)  \\n\",\n    \"    \\n\",\n    \"    # Remove spaces from str1\\n\",\n    \"    str1 = str1.replace(\\\" \\\",'')\\n\",\n    \"    \\n\",\n    \"    # Lowercase all strings in the passed in string\\n\",\n    \"    # Recall we assume no punctuation \\n\",\n    \"    str1 = str1.lower()\\n\",\n    \"    \\n\",\n    \"    # Grab all unique letters in the string as a set\\n\",\n    \"    str1 = set(str1)\\n\",\n    \"    \\n\",\n    \"    # Now check that the alpahbet set is same as string set\\n\",\n    \"    return str1 == alphaset\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"ispangram(\\\"The quick brown fox jumps over the lazy dog\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'abcdefghijklmnopqrstuvwxyz'\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"string.ascii_lowercase\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "03-Methods and Functions/01-Methods.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Methods\\n\",\n    \"\\n\",\n    \"We've already seen a few example of methods when learning about Object and Data Structure Types in Python. Methods are essentially functions built into objects. Later on in the course we will learn about how to create our own objects and methods using Object Oriented Programming (OOP) and classes.\\n\",\n    \"\\n\",\n    \"Methods perform specific actions on an object and can also take arguments, just like a function. This lecture will serve as just a brief introduction to methods and get you thinking about overall design methods that we will touch back upon when we reach OOP in the course.\\n\",\n    \"\\n\",\n    \"Methods are in the form:\\n\",\n    \"\\n\",\n    \"    object.method(arg1,arg2,etc...)\\n\",\n    \"    \\n\",\n    \"You'll later see that we can think of methods as having an argument 'self' referring to the object itself. You can't see this argument but we will be using it later on in the course during the OOP lectures.\\n\",\n    \"\\n\",\n    \"Let's take a quick look at what an example of the various methods a list has:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Create a simple list\\n\",\n    \"lst = [1,2,3,4,5]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Fortunately, with iPython and the Jupyter Notebook we can quickly see all the possible methods using the tab key. The methods for a list are:\\n\",\n    \"\\n\",\n    \"* append\\n\",\n    \"* count\\n\",\n    \"* extend\\n\",\n    \"* insert\\n\",\n    \"* pop\\n\",\n    \"* remove\\n\",\n    \"* reverse\\n\",\n    \"* sort\\n\",\n    \"\\n\",\n    \"Let's try out a few of them:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"append() allows us to add elements to the end of a list:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"lst.append(6)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 3, 4, 5, 6]\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lst\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now how about count()? The count() method will count the number of occurrences of an element in a list.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check how many times 2 shows up in the list\\n\",\n    \"lst.count(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can always use Shift+Tab in the Jupyter Notebook to get more help about the method. In general Python you can use the help() function: \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Help on built-in function count:\\n\",\n      \"\\n\",\n      \"count(...) method of builtins.list instance\\n\",\n      \"    L.count(value) -> integer -- return number of occurrences of value\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"help(lst.count)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Feel free to play around with the rest of the methods for a list. Later on in this section your quiz will involve using help and Google searching for methods of different types of objects!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! By this lecture you should feel comfortable calling methods of objects in Python!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "03-Methods and Functions/02-Functions.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Functions\\n\",\n    \"\\n\",\n    \"## Introduction to Functions\\n\",\n    \"\\n\",\n    \"This lecture will consist of explaining what a function is in Python and how to create one. Functions will be one of our main building blocks when we construct larger and larger amounts of code to solve problems.\\n\",\n    \"\\n\",\n    \"### What is a function?\\n\",\n    \"\\n\",\n    \"Formally, a function is a useful device that groups together a set of statements so they can be run more than once. They can also let us specify parameters that can serve as inputs to the functions.\\n\",\n    \"\\n\",\n    \"On a more fundamental level, functions allow us to not have to repeatedly write the same code again and again. If you remember back to the lessons on strings and lists, remember that we used a function len() to get the length of a string. Since checking the length of a sequence is a common task you would want to write a function that can do this repeatedly at command.\\n\",\n    \"\\n\",\n    \"Functions will be one of most basic levels of reusing code in Python, and it will also allow us to start thinking of program design (we will dive much deeper into the ideas of design when we learn about Object Oriented Programming).\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Why even use functions?\\n\",\n    \"\\n\",\n    \"Put simply, you should use functions when you plan on using a block of code multiple times. The function will allow you to call the same block of code without having to write it multiple times. This in turn will allow you to create more complex Python scripts. To really understand this though, we should actually write our own functions! \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Function Topics\\n\",\n    \"* def keyword\\n\",\n    \"* simple example of a function\\n\",\n    \"* calling a function with ()\\n\",\n    \"* accepting parameters\\n\",\n    \"* print versus return\\n\",\n    \"* adding in logic inside a function\\n\",\n    \"* multiple returns inside a function\\n\",\n    \"* adding in loops inside a function\\n\",\n    \"* tuple unpacking\\n\",\n    \"* interactions between functions\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### def keyword\\n\",\n    \"\\n\",\n    \"Let's see how to build out a function's syntax in Python. It has the following form:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def name_of_function(arg1,arg2):\\n\",\n    \"    '''\\n\",\n    \"    This is where the function's Document String (docstring) goes.\\n\",\n    \"    When you call help() on your function it will be printed out.\\n\",\n    \"    '''\\n\",\n    \"    # Do stuff here\\n\",\n    \"    # Return desired result\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We begin with <code>def</code> then a space followed by the name of the function. Try to keep names relevant, for example len() is a good name for a length() function. Also be careful with names, you wouldn't want to call a function the same name as a [built-in function in Python](https://docs.python.org/3/library/functions.html) (such as len).\\n\",\n    \"\\n\",\n    \"Next come a pair of parentheses with a number of arguments separated by a comma. These arguments are the inputs for your function. You'll be able to use these inputs in your function and reference them. After this you put a colon.\\n\",\n    \"\\n\",\n    \"Now here is the important step, you must indent to begin the code inside your function correctly. Python makes use of *whitespace* to organize code. Lots of other programing languages do not do this, so keep that in mind.\\n\",\n    \"\\n\",\n    \"Next you'll see the docstring, this is where you write a basic description of the function. Using Jupyter and Jupyter Notebooks, you'll be able to read these docstrings by pressing Shift+Tab after a function name. Docstrings are not necessary for simple functions, but it's good practice to put them in so you or other people can easily understand the code you write.\\n\",\n    \"\\n\",\n    \"After all this you begin writing the code you wish to execute.\\n\",\n    \"\\n\",\n    \"The best way to learn functions is by going through examples. So let's try to go through examples that relate back to the various objects and data structures we learned about before.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Simple example of a function\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def say_hello():\\n\",\n    \"    print('hello')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Calling a function with ()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Call the function:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"hello\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"say_hello()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you forget the parenthesis (), it will simply display the fact that say_hello is a function. Later on we will learn we can actually pass in functions into other functions! But for now, simply remember to call functions with ().\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<function __main__.say_hello>\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"say_hello\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Accepting parameters (arguments)\\n\",\n    \"Let's write a function that greets people with their name.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def greeting(name):\\n\",\n    \"    print(f'Hello {name}')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Hello Jose\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"greeting('Jose')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Using return\\n\",\n    \"So far we've only seen print() used, but if we actually want to save the resulting variable we need to use the **return** keyword.\\n\",\n    \"\\n\",\n    \"Let's see some example that use a <code>return</code> statement. <code>return</code> allows a function to *return* a result that can then be stored as a variable, or used in whatever manner a user wants.\\n\",\n    \"\\n\",\n    \"### Example: Addition function\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def add_num(num1,num2):\\n\",\n    \"    return num1+num2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"9\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"add_num(4,5)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Can also save as variable due to return\\n\",\n    \"result = add_num(4,5)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"9\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(result)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What happens if we input two strings?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'onetwo'\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"add_num('one','two')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Very Common Question: \\\"What is the difference between *return* and *print*?\\\"\\n\",\n    \"\\n\",\n    \"**The return keyword allows you to actually save the result of the output of a function as a variable. The print() function simply displays the output to you, but doesn't save it for future use. Let's explore this in more detail**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def print_result(a,b):\\n\",\n    \"    print(a+b)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def return_result(a,b):\\n\",\n    \"    return a+b\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"15\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print_result(10,5)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"15\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# You won't see any output if you run this in a .py script\\n\",\n    \"return_result(10,5)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**But what happens if we actually want to save this result for later use?**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"40\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"my_result = print_result(20,20)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_result\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"NoneType\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"type(my_result)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Be careful! Notice how print_result() doesn't let you actually save the result to a variable! It only prints it out, with print() returning None for the assignment!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_result = return_result(20,20)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"40\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"my_result\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"80\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"my_result + my_result\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Adding Logic to Internal Function Operations\\n\",\n    \"\\n\",\n    \"So far we know quite a bit about constructing logical statements with Python, such as if/else/elif statements, for and while loops, checking if an item is **in** a list or **not in** a list (Useful Operators Lecture). Let's now see how we can perform these operations within a function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Check if a number is even \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Recall the mod operator % which returns the remainder after division, if a number is even then mod 2 (% 2) should be == to zero.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"2 % 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"20 % 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"21 % 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"20 % 2 == 0\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"21 % 2 == 0\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"** Let's use this to construct a function. Notice how we simply return the boolean check.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def even_check(number):\\n\",\n    \"    return number % 2 == 0\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"even_check(20)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 21,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"even_check(21)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Check if any number in  a list is even\\n\",\n    \"\\n\",\n    \"Let's return a boolean indicating if **any** number in a list is even. Notice here how **return** breaks out of the loop and exits the function\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def check_even_list(num_list):\\n\",\n    \"    # Go through each number\\n\",\n    \"    for number in num_list:\\n\",\n    \"        # Once we get a \\\"hit\\\" on an even number, we return True\\n\",\n    \"        if number % 2 == 0:\\n\",\n    \"            return True\\n\",\n    \"        # Otherwise we don't do anything\\n\",\n    \"        else:\\n\",\n    \"            pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"** Is this enough? NO! We're not returning anything if they are all odds!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"check_even_list([1,2,3])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"check_even_list([1,1,1])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"** VERY COMMON MISTAKE!! LET'S SEE A COMMON LOGIC ERROR, NOTE THIS IS WRONG!!!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def check_even_list(num_list):\\n\",\n    \"    # Go through each number\\n\",\n    \"    for number in num_list:\\n\",\n    \"        # Once we get a \\\"hit\\\" on an even number, we return True\\n\",\n    \"        if number % 2 == 0:\\n\",\n    \"            return True\\n\",\n    \"        # This is WRONG! This returns False at the very first odd number!\\n\",\n    \"        # It doesn't end up checking the other numbers in the list!\\n\",\n    \"        else:\\n\",\n    \"            return False\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 30,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# UH OH! It is returning False after hitting the first 1\\n\",\n    \"check_even_list([1,2,3])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"** Correct Approach: We need to initiate a return False AFTER running through the entire loop**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def check_even_list(num_list):\\n\",\n    \"    # Go through each number\\n\",\n    \"    for number in num_list:\\n\",\n    \"        # Once we get a \\\"hit\\\" on an even number, we return True\\n\",\n    \"        if number % 2 == 0:\\n\",\n    \"            return True\\n\",\n    \"        # Don't do anything if its not even\\n\",\n    \"        else:\\n\",\n    \"            pass\\n\",\n    \"    # Notice the indentation! This ensures we run through the entire for loop    \\n\",\n    \"    return False\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 32,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"check_even_list([1,2,3])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 34,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"check_even_list([1,3,5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Return all even numbers in a list\\n\",\n    \"\\n\",\n    \"Let's add more complexity, we now will return all the even numbers in a list, otherwise return an empty list.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def check_even_list(num_list):\\n\",\n    \"    \\n\",\n    \"    even_numbers = []\\n\",\n    \"    \\n\",\n    \"    # Go through each number\\n\",\n    \"    for number in num_list:\\n\",\n    \"        # Once we get a \\\"hit\\\" on an even number, we append the even number\\n\",\n    \"        if number % 2 == 0:\\n\",\n    \"            even_numbers.append(number)\\n\",\n    \"        # Don't do anything if its not even\\n\",\n    \"        else:\\n\",\n    \"            pass\\n\",\n    \"    # Notice the indentation! This ensures we run through the entire for loop    \\n\",\n    \"    return even_numbers\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[2, 4, 6]\"\n      ]\n     },\n     \"execution_count\": 36,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"check_even_list([1,2,3,4,5,6])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[]\"\n      ]\n     },\n     \"execution_count\": 37,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"check_even_list([1,3,5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Returning Tuples for Unpacking\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"** Recall we can loop through a list of tuples and \\\"unpack\\\" the values within them**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 38,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"stock_prices = [('AAPL',200),('GOOG',300),('MSFT',400)]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"('AAPL', 200)\\n\",\n      \"('GOOG', 300)\\n\",\n      \"('MSFT', 400)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for item in stock_prices:\\n\",\n    \"    print(item)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"AAPL\\n\",\n      \"GOOG\\n\",\n      \"MSFT\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for stock,price in stock_prices:\\n\",\n    \"    print(stock)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 42,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"200\\n\",\n      \"300\\n\",\n      \"400\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for stock,price in stock_prices:\\n\",\n    \"    print(price)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Similarly, functions often return tuples, to easily return multiple results for later use.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's imagine the following list:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 46,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"work_hours = [('Abby',100),('Billy',400),('Cassie',800)]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The employee of the month function will return both the name and number of hours worked for the top performer (judged by number of hours worked).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 47,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def employee_check(work_hours):\\n\",\n    \"    \\n\",\n    \"    # Set some max value to intially beat, like zero hours\\n\",\n    \"    current_max = 0\\n\",\n    \"    # Set some empty value before the loop\\n\",\n    \"    employee_of_month = ''\\n\",\n    \"    \\n\",\n    \"    for employee,hours in work_hours:\\n\",\n    \"        if hours > current_max:\\n\",\n    \"            current_max = hours\\n\",\n    \"            employee_of_month = employee\\n\",\n    \"        else:\\n\",\n    \"            pass\\n\",\n    \"    \\n\",\n    \"    # Notice the indentation here\\n\",\n    \"    return (employee_of_month,current_max)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 48,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"('Cassie', 800)\"\n      ]\n     },\n     \"execution_count\": 48,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"employee_check(work_hours)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Interactions between functions\\n\",\n    \"\\n\",\n    \"Functions often use results from other functions, let's see a simple example through a guessing game. There will be 3 positions in the list, one of which is an 'O', a function will shuffle the list, another will take a player's guess, and finally another will check to see if it is correct. This is based on the classic carnival game of guessing which cup a red ball is under.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**How to shuffle a list in Python**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"example = [1,2,3,4,5]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from random import shuffle\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Note shuffle is in-place\\n\",\n    \"shuffle(example)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[3, 1, 4, 5, 2]\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"example\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**OK, let's create our simple game**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"mylist = [' ','O',' ']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def shuffle_list(mylist):\\n\",\n    \"    # Take in list, and returned shuffle versioned\\n\",\n    \"    shuffle(mylist)\\n\",\n    \"    \\n\",\n    \"    return mylist\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[' ', 'O', ' ']\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mylist \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[' ', ' ', 'O']\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"shuffle_list(mylist)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def player_guess():\\n\",\n    \"    \\n\",\n    \"    guess = ''\\n\",\n    \"    \\n\",\n    \"    while guess not in ['0','1','2']:\\n\",\n    \"        \\n\",\n    \"        # Recall input() returns a string\\n\",\n    \"        guess = input(\\\"Pick a number: 0, 1, or 2:  \\\")\\n\",\n    \"    \\n\",\n    \"    return int(guess)    \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Pick a number: 0, 1, or 2:  1\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"player_guess()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we will check the user's guess. Notice we only print here, since we have no need to save a user's guess or the shuffled list.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def check_guess(mylist,guess):\\n\",\n    \"    if mylist[guess] == 'O':\\n\",\n    \"        print('Correct Guess!')\\n\",\n    \"    else:\\n\",\n    \"        print('Wrong! Better luck next time')\\n\",\n    \"        print(mylist)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we create a little setup logic to run all the functions. Notice how they interact with each other!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Pick a number: 0, 1, or 2:  1\\n\",\n      \"Wrong! Better luck next time\\n\",\n      \"[' ', ' ', 'O']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Initial List\\n\",\n    \"mylist = [' ','O',' ']\\n\",\n    \"\\n\",\n    \"# Shuffle It\\n\",\n    \"mixedup_list = shuffle_list(mylist)\\n\",\n    \"\\n\",\n    \"# Get User's Guess\\n\",\n    \"guess = player_guess()\\n\",\n    \"\\n\",\n    \"# Check User's Guess\\n\",\n    \"#------------------------\\n\",\n    \"# Notice how this function takes in the input \\n\",\n    \"# based on the output of other functions!\\n\",\n    \"check_guess(mixedup_list,guess)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! You should now have a basic understanding of creating your own functions to save yourself from repeatedly writing code!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "03-Methods and Functions/03-Function Practice Exercises.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Function Practice Exercises\\n\",\n    \"\\n\",\n    \"Problems are arranged in increasing difficulty:\\n\",\n    \"* Warmup - these can be solved using basic comparisons and methods\\n\",\n    \"* Level 1 - these may involve if/then conditional statements and simple methods\\n\",\n    \"* Level 2 - these may require iterating over sequences, usually with some kind of loop\\n\",\n    \"* Challenging - these will take some creativity to solve\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## WARMUP SECTION:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### LESSER OF TWO EVENS: Write a function that returns the lesser of two given numbers *if* both numbers are even, but returns the greater if one or both numbers are odd\\n\",\n    \"    lesser_of_two_evens(2,4) --> 2\\n\",\n    \"    lesser_of_two_evens(2,5) --> 5\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def lesser_of_two_evens(a,b):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"lesser_of_two_evens(2,4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"lesser_of_two_evens(2,5)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### ANIMAL CRACKERS: Write a function takes a two-word string and returns True if both words begin with same letter\\n\",\n    \"    animal_crackers('Levelheaded Llama') --> True\\n\",\n    \"    animal_crackers('Crazy Kangaroo') --> False\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def animal_crackers(text):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"animal_crackers('Levelheaded Llama')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"animal_crackers('Crazy Kangaroo')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### MAKES TWENTY: Given two integers, return True if the sum of the integers is 20 *or* if one of the integers is 20. If not, return False\\n\",\n    \"\\n\",\n    \"    makes_twenty(20,10) --> True\\n\",\n    \"    makes_twenty(12,8) --> True\\n\",\n    \"    makes_twenty(2,3) --> False\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def makes_twenty(n1,n2):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"makes_twenty(20,10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"makes_twenty(2,3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# LEVEL 1 PROBLEMS\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### OLD MACDONALD: Write a function that capitalizes the first and fourth letters of a name\\n\",\n    \"     \\n\",\n    \"    old_macdonald('macdonald') --> MacDonald\\n\",\n    \"    \\n\",\n    \"Note: `'macdonald'.capitalize()` returns `'Macdonald'`\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def old_macdonald(name):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"old_macdonald('macdonald')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### MASTER YODA: Given a sentence, return a sentence with the words reversed\\n\",\n    \"\\n\",\n    \"    master_yoda('I am home') --> 'home am I'\\n\",\n    \"    master_yoda('We are ready') --> 'ready are We'\\n\",\n    \"    \\n\",\n    \"Note: The .join() method may be useful here. The .join() method allows you to join together strings in a list with some connector string. For example, some uses of the .join() method:\\n\",\n    \"\\n\",\n    \"    >>> \\\"--\\\".join(['a','b','c'])\\n\",\n    \"    >>> 'a--b--c'\\n\",\n    \"\\n\",\n    \"This means if you had a list of words you wanted to turn back into a sentence, you could just join them with a single space string:\\n\",\n    \"\\n\",\n    \"    >>> \\\" \\\".join(['Hello','world'])\\n\",\n    \"    >>> \\\"Hello world\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def master_yoda(text):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"master_yoda('I am home')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"master_yoda('We are ready')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### ALMOST THERE: Given an integer n, return True if n is within 10 of either 100 or 200\\n\",\n    \"\\n\",\n    \"    almost_there(90) --> True\\n\",\n    \"    almost_there(104) --> True\\n\",\n    \"    almost_there(150) --> False\\n\",\n    \"    almost_there(209) --> True\\n\",\n    \"    \\n\",\n    \"NOTE: `abs(num)` returns the absolute value of a number\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def almost_there(n):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"almost_there(104)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"almost_there(150)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"almost_there(209)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# LEVEL 2 PROBLEMS\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### FIND 33: \\n\",\n    \"\\n\",\n    \"Given a list of ints, return True if the array contains a 3 next to a 3 somewhere.\\n\",\n    \"\\n\",\n    \"    has_33([1, 3, 3]) → True\\n\",\n    \"    has_33([1, 3, 1, 3]) → False\\n\",\n    \"    has_33([3, 1, 3]) → False\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def has_33(nums):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"has_33([1, 3, 3])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"has_33([1, 3, 1, 3])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"has_33([3, 1, 3])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### PAPER DOLL: Given a string, return a string where for every character in the original there are three characters\\n\",\n    \"    paper_doll('Hello') --> 'HHHeeellllllooo'\\n\",\n    \"    paper_doll('Mississippi') --> 'MMMiiissssssiiippppppiii'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def paper_doll(text):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"paper_doll('Hello')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"paper_doll('Mississippi')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### BLACKJACK: Given three integers between 1 and 11, if their sum is less than or equal to 21, return their sum. If their sum exceeds 21 *and* there's an eleven, reduce the total sum by 10. Finally, if the sum (even after adjustment) exceeds 21, return 'BUST'\\n\",\n    \"    blackjack(5,6,7) --> 18\\n\",\n    \"    blackjack(9,9,9) --> 'BUST'\\n\",\n    \"    blackjack(9,9,11) --> 19\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def blackjack(a,b,c):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"blackjack(5,6,7)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"blackjack(9,9,9)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"blackjack(9,9,11)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### SUMMER OF '69: Return the sum of the numbers in the array, except ignore sections of numbers starting with a 6 and extending to the next 9 (every 6 will be followed by at least one 9). Return 0 for no numbers.\\n\",\n    \" \\n\",\n    \"    summer_69([1, 3, 5]) --> 9\\n\",\n    \"    summer_69([4, 5, 6, 7, 8, 9]) --> 9\\n\",\n    \"    summer_69([2, 1, 6, 9, 11]) --> 14\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def summer_69(arr):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"summer_69([1, 3, 5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"summer_69([4, 5, 6, 7, 8, 9])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"summer_69([2, 1, 6, 9, 11])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# CHALLENGING PROBLEMS\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### SPY GAME: Write a function that takes in a list of integers and returns True if it contains 007 in order\\n\",\n    \"\\n\",\n    \"     spy_game([1,2,4,0,0,7,5]) --> True\\n\",\n    \"     spy_game([1,0,2,4,0,5,7]) --> True\\n\",\n    \"     spy_game([1,7,2,0,4,5,0]) --> False\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def spy_game(nums):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"spy_game([1,2,4,0,0,7,5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"spy_game([1,0,2,4,0,5,7])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"spy_game([1,7,2,0,4,5,0])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### COUNT PRIMES: Write a function that returns the *number* of prime numbers that exist up to and including a given number\\n\",\n    \"    count_primes(100) --> 25\\n\",\n    \"\\n\",\n    \"By convention, 0 and 1 are not prime.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def count_primes(num):\\n\",\n    \"    pass\\n\",\n    \"                \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Check\\n\",\n    \"count_primes(100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Just for fun:\\n\",\n    \"#### PRINT BIG: Write a function that takes in a single letter, and returns a 5x5 representation of that letter\\n\",\n    \"    print_big('a')\\n\",\n    \"    \\n\",\n    \"    out:   *  \\n\",\n    \"          * *\\n\",\n    \"         *****\\n\",\n    \"         *   *\\n\",\n    \"         *   *\\n\",\n    \"HINT: Consider making a dictionary of possible patterns, and mapping the alphabet to specific 5-line combinations of patterns. <br>For purposes of this exercise, it's ok if your dictionary stops at \\\"E\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def print_big(letter):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"print_big('a')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "03-Methods and Functions/04-Function Practice Exercises - Solutions.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Function Practice Exercises - Solutions\\n\",\n    \"\\n\",\n    \"Problems are arranged in increasing difficulty:\\n\",\n    \"* Warmup - these can be solved using basic comparisons and methods\\n\",\n    \"* Level 1 - these may involve if/then conditional statements and simple methods\\n\",\n    \"* Level 2 - these may require iterating over sequences, usually with some kind of loop\\n\",\n    \"* Challenging - these will take some creativity to solve\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## WARMUP SECTION:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### LESSER OF TWO EVENS: Write a function that returns the lesser of two given numbers *if* both numbers are even, but returns the greater if one or both numbers are odd\\n\",\n    \"    lesser_of_two_evens(2,4) --> 2\\n\",\n    \"    lesser_of_two_evens(2,5) --> 5\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def lesser_of_two_evens(a,b):\\n\",\n    \"    if a%2 == 0 and b%2 == 0:\\n\",\n    \"        return min(a,b)\\n\",\n    \"    else:\\n\",\n    \"        return max(a,b)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"lesser_of_two_evens(2,4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"5\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"lesser_of_two_evens(2,5)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### ANIMAL CRACKERS: Write a function takes a two-word string and returns True if both words begin with same letter\\n\",\n    \"    animal_crackers('Levelheaded Llama') --> True\\n\",\n    \"    animal_crackers('Crazy Kangaroo') --> False\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def animal_crackers(text):\\n\",\n    \"    wordlist = text.split()\\n\",\n    \"    return wordlist[0][0] == wordlist[1][0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"animal_crackers('Levelheaded Llama')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"animal_crackers('Crazy Kangaroo')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### MAKES TWENTY: Given two integers, return True if the sum of the integers is 20 *or* if one of the integers is 20. If not, return False\\n\",\n    \"\\n\",\n    \"    makes_twenty(20,10) --> True\\n\",\n    \"    makes_twenty(12,8) --> True\\n\",\n    \"    makes_twenty(2,3) --> False\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def makes_twenty(n1,n2):\\n\",\n    \"    return (n1+n2)==20 or n1==20 or n2==20\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"makes_twenty(20,10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"makes_twenty(12,8)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#Check\\n\",\n    \"makes_twenty(2,3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# LEVEL 1 PROBLEMS\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### OLD MACDONALD: Write a function that capitalizes the first and fourth letters of a name\\n\",\n    \"     \\n\",\n    \"    old_macdonald('macdonald') --> MacDonald\\n\",\n    \"    \\n\",\n    \"Note: `'macdonald'.capitalize()` returns `'Macdonald'`\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def old_macdonald(name):\\n\",\n    \"    if len(name) > 3:\\n\",\n    \"        return name[:3].capitalize() + name[3:].capitalize()\\n\",\n    \"    else:\\n\",\n    \"        return 'Name is too short!'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'MacDonald'\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"old_macdonald('macdonald')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### MASTER YODA: Given a sentence, return a sentence with the words reversed\\n\",\n    \"\\n\",\n    \"    master_yoda('I am home') --> 'home am I'\\n\",\n    \"    master_yoda('We are ready') --> 'ready are We'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def master_yoda(text):\\n\",\n    \"    return ' '.join(text.split()[::-1])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'home am I'\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"master_yoda('I am home')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'ready are We'\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"master_yoda('We are ready')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### ALMOST THERE: Given an integer n, return True if n is within 10 of either 100 or 200\\n\",\n    \"\\n\",\n    \"    almost_there(90) --> True\\n\",\n    \"    almost_there(104) --> True\\n\",\n    \"    almost_there(150) --> False\\n\",\n    \"    almost_there(209) --> True\\n\",\n    \"    \\n\",\n    \"NOTE: `abs(num)` returns the absolute value of a number\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def almost_there(n):\\n\",\n    \"    return ((abs(100 - n) <= 10) or (abs(200 - n) <= 10))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"almost_there(90)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"almost_there(104)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"almost_there(150)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"almost_there(209)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# LEVEL 2 PROBLEMS\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### FIND 33: \\n\",\n    \"\\n\",\n    \"Given a list of ints, return True if the array contains a 3 next to a 3 somewhere.\\n\",\n    \"\\n\",\n    \"    has_33([1, 3, 3]) → True\\n\",\n    \"    has_33([1, 3, 1, 3]) → False\\n\",\n    \"    has_33([3, 1, 3]) → False\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def has_33(nums):\\n\",\n    \"    for i in range(0, len(nums)-1):\\n\",\n    \"      \\n\",\n    \"        # nicer looking alternative in commented code\\n\",\n    \"        #if nums[i] == 3 and nums[i+1] == 3:\\n\",\n    \"    \\n\",\n    \"        if nums[i:i+2] == [3,3]:\\n\",\n    \"            return True  \\n\",\n    \"    \\n\",\n    \"    return False\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"has_33([1, 3, 3])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 23,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"has_33([1, 3, 1, 3])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"has_33([3, 1, 3])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### PAPER DOLL: Given a string, return a string where for every character in the original there are three characters\\n\",\n    \"    paper_doll('Hello') --> 'HHHeeellllllooo'\\n\",\n    \"    paper_doll('Mississippi') --> 'MMMiiissssssiiippppppiii'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def paper_doll(text):\\n\",\n    \"    result = ''\\n\",\n    \"    for char in text:\\n\",\n    \"        result += char * 3\\n\",\n    \"    return result\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'HHHeeellllllooo'\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"paper_doll('Hello')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'MMMiiissssssiiissssssiiippppppiii'\"\n      ]\n     },\n     \"execution_count\": 27,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"paper_doll('Mississippi')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### BLACKJACK: Given three integers between 1 and 11, if their sum is less than or equal to 21, return their sum. If their sum exceeds 21 *and* there's an eleven, reduce the total sum by 10. Finally, if the sum (even after adjustment) exceeds 21, return 'BUST'\\n\",\n    \"    blackjack(5,6,7) --> 18\\n\",\n    \"    blackjack(9,9,9) --> 'BUST'\\n\",\n    \"    blackjack(9,9,11) --> 19\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def blackjack(a,b,c):\\n\",\n    \"    \\n\",\n    \"    if sum((a,b,c)) <= 21:\\n\",\n    \"        return sum((a,b,c))\\n\",\n    \"    elif sum((a,b,c)) <=31 and 11 in (a,b,c):\\n\",\n    \"        return sum((a,b,c)) - 10\\n\",\n    \"    else:\\n\",\n    \"        return 'BUST'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"18\"\n      ]\n     },\n     \"execution_count\": 29,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"blackjack(5,6,7)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'BUST'\"\n      ]\n     },\n     \"execution_count\": 30,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"blackjack(9,9,9)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"19\"\n      ]\n     },\n     \"execution_count\": 31,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"blackjack(9,9,11)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### SUMMER OF '69: Return the sum of the numbers in the array, except ignore sections of numbers starting with a 6 and extending to the next 9 (every 6 will be followed by at least one 9). Return 0 for no numbers.\\n\",\n    \" \\n\",\n    \"    summer_69([1, 3, 5]) --> 9\\n\",\n    \"    summer_69([4, 5, 6, 7, 8, 9]) --> 9\\n\",\n    \"    summer_69([2, 1, 6, 9, 11]) --> 14\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def summer_69(arr):\\n\",\n    \"    total = 0\\n\",\n    \"    add = True\\n\",\n    \"    for num in arr:\\n\",\n    \"        while add:\\n\",\n    \"            if num != 6:\\n\",\n    \"                total += num\\n\",\n    \"                break\\n\",\n    \"            else:\\n\",\n    \"                add = False\\n\",\n    \"        while not add:\\n\",\n    \"            if num != 9:\\n\",\n    \"                break\\n\",\n    \"            else:\\n\",\n    \"                add = True\\n\",\n    \"                break\\n\",\n    \"    return total\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"9\"\n      ]\n     },\n     \"execution_count\": 33,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"summer_69([1, 3, 5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"9\"\n      ]\n     },\n     \"execution_count\": 34,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"summer_69([4, 5, 6, 7, 8, 9])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"14\"\n      ]\n     },\n     \"execution_count\": 35,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"summer_69([2, 1, 6, 9, 11])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# CHALLENGING PROBLEMS\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### SPY GAME: Write a function that takes in a list of integers and returns True if it contains 007 in order\\n\",\n    \"\\n\",\n    \"     spy_game([1,2,4,0,0,7,5]) --> True\\n\",\n    \"     spy_game([1,0,2,4,0,5,7]) --> True\\n\",\n    \"     spy_game([1,7,2,0,4,5,0]) --> False\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def spy_game(nums):\\n\",\n    \"\\n\",\n    \"    code = [0,0,7,'x']\\n\",\n    \"    \\n\",\n    \"    for num in nums:\\n\",\n    \"        if num == code[0]:\\n\",\n    \"            code.pop(0)   # code.remove(num) also works\\n\",\n    \"       \\n\",\n    \"    return len(code) == 1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 37,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"spy_game([1,2,4,0,0,7,5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 38,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 38,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"spy_game([1,0,2,4,0,5,7])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 39,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"spy_game([1,7,2,0,4,5,0])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### COUNT PRIMES: Write a function that returns the *number* of prime numbers that exist up to and including a given number\\n\",\n    \"    count_primes(100) --> 25\\n\",\n    \"\\n\",\n    \"By convention, 0 and 1 are not prime.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 40,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def count_primes(num):\\n\",\n    \"    primes = [2]\\n\",\n    \"    x = 3\\n\",\n    \"    if num < 2:  # for the case of num = 0 or 1\\n\",\n    \"        return 0\\n\",\n    \"    while x <= num:\\n\",\n    \"        for y in range(3,x,2):  # test all odd factors up to x-1\\n\",\n    \"            if x%y == 0:\\n\",\n    \"                x += 2\\n\",\n    \"                break\\n\",\n    \"        else:\\n\",\n    \"            primes.append(x)\\n\",\n    \"            x += 2\\n\",\n    \"    print(primes)\\n\",\n    \"    return len(primes)\\n\",\n    \"                \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"25\"\n      ]\n     },\n     \"execution_count\": 41,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"count_primes(100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"BONUS: Here's a faster version that makes use of the prime numbers we're collecting as we go!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 42,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def count_primes2(num):\\n\",\n    \"    primes = [2]\\n\",\n    \"    x = 3\\n\",\n    \"    if num < 2:\\n\",\n    \"        return 0\\n\",\n    \"    while x <= num:\\n\",\n    \"        for y in primes:  # use the primes list!\\n\",\n    \"            if x%y == 0:\\n\",\n    \"                x += 2\\n\",\n    \"                break\\n\",\n    \"        else:\\n\",\n    \"            primes.append(x)\\n\",\n    \"            x += 2\\n\",\n    \"    print(primes)\\n\",\n    \"    return len(primes)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 43,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"25\"\n      ]\n     },\n     \"execution_count\": 43,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"count_primes2(100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"-----\\n\",\n    \"### Just for fun, not a real problem :)\\n\",\n    \"\\n\",\n    \"#### PRINT BIG: Write a function that takes in a single letter, and returns a 5x5 representation of that letter\\n\",\n    \"    print_big('a')\\n\",\n    \"    \\n\",\n    \"    out:   *  \\n\",\n    \"          * *\\n\",\n    \"         *****\\n\",\n    \"         *   *\\n\",\n    \"         *   *\\n\",\n    \"HINT: Consider making a dictionary of possible patterns, and mapping the alphabet to specific 5-line combinations of patterns. <br>For purposes of this exercise, it's ok if your dictionary stops at \\\"E\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 44,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def print_big(letter):\\n\",\n    \"    patterns = {1:'  *  ',2:' * * ',3:'*   *',4:'*****',5:'**** ',6:'   * ',7:' *   ',8:'*   * ',9:'*    '}\\n\",\n    \"    alphabet = {'A':[1,2,4,3,3],'B':[5,3,5,3,5],'C':[4,9,9,9,4],'D':[5,3,3,3,5],'E':[4,9,4,9,4]}\\n\",\n    \"    for pattern in alphabet[letter.upper()]:\\n\",\n    \"        print(patterns[pattern])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 45,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"  *  \\n\",\n      \" * * \\n\",\n      \"*****\\n\",\n      \"*   *\\n\",\n      \"*   *\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print_big('a')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "03-Methods and Functions/05-Lambda-Expressions-Map-and-Filter.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Lambda Expressions, Map, and Filter\\n\",\n    \"\\n\",\n    \"Now its time to quickly learn about two built in functions, filter and map. Once we learn about how these operate, we can learn about the lambda expression, which will come in handy when you begin to develop your skills further!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## map function\\n\",\n    \"\\n\",\n    \"The **map** function allows you to \\\"map\\\" a function to an iterable object. That is to say you can quickly call the same function to every item in an iterable, such as a list. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def square(num):\\n\",\n    \"    return num**2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_nums = [1,2,3,4,5]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<map at 0x205baec21d0>\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"map(square,my_nums)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 4, 9, 16, 25]\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# To get the results, either iterate through map() \\n\",\n    \"# or just cast to a list\\n\",\n    \"list(map(square,my_nums))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The functions can also be more complex\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def splicer(mystring):\\n\",\n    \"    if len(mystring) % 2 == 0:\\n\",\n    \"        return 'even'\\n\",\n    \"    else:\\n\",\n    \"        return mystring[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"mynames = ['John','Cindy','Sarah','Kelly','Mike']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['even', 'C', 'S', 'K', 'even']\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(map(splicer,mynames))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## filter function\\n\",\n    \"\\n\",\n    \"The filter function returns an iterator yielding those items of iterable for which function(item)\\n\",\n    \"is true. Meaning you need to filter by a function that returns either True or False. Then passing that into filter (along with your iterable) and you will get back only the results that would return True when passed to the function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def check_even(num):\\n\",\n    \"    return num % 2 == 0 \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"nums = [0,1,2,3,4,5,6,7,8,9,10]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<filter at 0x205baed4710>\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"filter(check_even,nums)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 2, 4, 6, 8, 10]\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(filter(check_even,nums))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## lambda expression\\n\",\n    \"\\n\",\n    \"One of Pythons most useful (and for beginners, confusing) tools is the lambda expression. lambda expressions allow us to create \\\"anonymous\\\" functions. This basically means we can quickly make ad-hoc functions without needing to properly define a function using def.\\n\",\n    \"\\n\",\n    \"Function objects returned by running lambda expressions work exactly the same as those created and assigned by defs. There is key difference that makes lambda useful in specialized roles:\\n\",\n    \"\\n\",\n    \"**lambda's body is a single expression, not a block of statements.**\\n\",\n    \"\\n\",\n    \"* The lambda's body is similar to what we would put in a def body's return statement. We simply type the result as an expression instead of explicitly returning it. Because it is limited to an expression, a lambda is less general that a def. We can only squeeze design, to limit program nesting. lambda is designed for coding simple functions, and def handles the larger tasks.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Lets slowly break down a lambda expression by deconstructing a function:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def square(num):\\n\",\n    \"    result = num**2\\n\",\n    \"    return result\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"square(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We could simplify it:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def square(num):\\n\",\n    \"    return num**2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"square(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We could actually even write this all on one line.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def square(num): return num**2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"square(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This is the form a function that a lambda expression intends to replicate. A lambda expression can then be written as:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<function __main__.<lambda>>\"\n      ]\n     },\n     \"execution_count\": 23,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lambda num: num ** 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# You wouldn't usually assign a name to a lambda expression, this is just for demonstration!\\n\",\n    \"square = lambda num: num **2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"square(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"So why would use this? Many function calls need a function passed in, such as map and filter. Often you only need to use the function you are passing in once, so instead of formally defining it, you just use the lambda expression. Let's repeat some of the examples from above with a lambda expression\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 4, 9, 16, 25]\"\n      ]\n     },\n     \"execution_count\": 29,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(map(lambda num: num ** 2, my_nums))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 2, 4, 6, 8, 10]\"\n      ]\n     },\n     \"execution_count\": 30,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(filter(lambda n: n % 2 == 0,nums))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Here are a few more examples, keep in mind the more comples a function is, the harder it is to translate into a lambda expression, meaning sometimes its just easier (and often the only way) to create the def keyword function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"** Lambda expression for grabbing the first character of a string: **\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<function __main__.<lambda>>\"\n      ]\n     },\n     \"execution_count\": 31,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lambda s: s[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"** Lambda expression for reversing a string: **\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<function __main__.<lambda>>\"\n      ]\n     },\n     \"execution_count\": 32,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lambda s: s[::-1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can even pass in multiple arguments into a lambda expression. Again, keep in mind that not every function can be translated into a lambda expression.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<function __main__.<lambda>>\"\n      ]\n     },\n     \"execution_count\": 34,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lambda x,y : x + y\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You will find yourself using lambda expressions often with certain non-built-in libraries, for example the pandas library for data analysis works very well with lambda expressions.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "03-Methods and Functions/06-Nested Statements and Scope.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Nested Statements and Scope \\n\",\n    \"\\n\",\n    \"Now that we have gone over writing our own functions, it's important to understand how Python deals with the variable names you assign. When you create a variable name in Python the name is stored in a *name-space*. Variable names also have a *scope*, the scope determines the visibility of that variable name to other parts of your code.\\n\",\n    \"\\n\",\n    \"Let's start with a quick thought experiment; imagine the following code:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"x = 25\\n\",\n    \"\\n\",\n    \"def printer():\\n\",\n    \"    x = 50\\n\",\n    \"    return x\\n\",\n    \"\\n\",\n    \"# print(x)\\n\",\n    \"# print(printer())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What do you imagine the output of printer() is? 25 or 50? What is the output of print x? 25 or 50?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"25\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"50\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(printer())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Interesting! But how does Python know which **x** you're referring to in your code? This is where the idea of scope comes in. Python has a set of rules it follows to decide what variables (such as **x** in this case) you are referencing in your code. Lets break down the rules:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"This idea of scope in your code is very important to understand in order to properly assign and call variable names. \\n\",\n    \"\\n\",\n    \"In simple terms, the idea of scope can be described by 3 general rules:\\n\",\n    \"\\n\",\n    \"1. Name assignments will create or change local names by default.\\n\",\n    \"2. Name references search (at most) four scopes, these are:\\n\",\n    \"    * local\\n\",\n    \"    * enclosing functions\\n\",\n    \"    * global\\n\",\n    \"    * built-in\\n\",\n    \"3. Names declared in global and nonlocal statements map assigned names to enclosing module and function scopes.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"The statement in #2 above can be defined by the LEGB rule.\\n\",\n    \"\\n\",\n    \"**LEGB Rule:**\\n\",\n    \"\\n\",\n    \"L: Local — Names assigned in any way within a function (def or lambda), and not declared global in that function.\\n\",\n    \"\\n\",\n    \"E: Enclosing function locals — Names in the local scope of any and all enclosing functions (def or lambda), from inner to outer.\\n\",\n    \"\\n\",\n    \"G: Global (module) — Names assigned at the top-level of a module file, or declared global in a def within the file.\\n\",\n    \"\\n\",\n    \"B: Built-in (Python) — Names preassigned in the built-in names module : open, range, SyntaxError,...\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Quick examples of LEGB\\n\",\n    \"\\n\",\n    \"### Local\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# x is local here:\\n\",\n    \"f = lambda x:x**2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Enclosing function locals\\n\",\n    \"This occurs when we have a function inside a function (nested functions)\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Hello Sammy\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"name = 'This is a global name'\\n\",\n    \"\\n\",\n    \"def greet():\\n\",\n    \"    # Enclosing function\\n\",\n    \"    name = 'Sammy'\\n\",\n    \"    \\n\",\n    \"    def hello():\\n\",\n    \"        print('Hello '+name)\\n\",\n    \"    \\n\",\n    \"    hello()\\n\",\n    \"\\n\",\n    \"greet()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how Sammy was used, because the hello() function was enclosed inside of the greet function!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Global\\n\",\n    \"Luckily in Jupyter a quick way to test for global variables is to see if another cell recognizes the variable!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"This is a global name\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(name)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Built-in\\n\",\n    \"These are the built-in function names in Python (don't overwrite these!)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<function len>\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Local Variables\\n\",\n    \"When you declare variables inside a function definition, they are not related in any way to other variables with the same names used outside the function - i.e. variable names are local to the function. This is called the scope of the variable. All variables have the scope of the block they are declared in starting from the point of definition of the name.\\n\",\n    \"\\n\",\n    \"Example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"x is 50\\n\",\n      \"Changed local x to 2\\n\",\n      \"x is still 50\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = 50\\n\",\n    \"\\n\",\n    \"def func(x):\\n\",\n    \"    print('x is', x)\\n\",\n    \"    x = 2\\n\",\n    \"    print('Changed local x to', x)\\n\",\n    \"\\n\",\n    \"func(x)\\n\",\n    \"print('x is still', x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The first time that we print the value of the name **x** with the first line in the function’s body, Python uses the value of the parameter declared in the main block, above the function definition.\\n\",\n    \"\\n\",\n    \"Next, we assign the value 2 to **x**. The name **x** is local to our function. So, when we change the value of **x** in the function, the **x** defined in the main block remains unaffected.\\n\",\n    \"\\n\",\n    \"With the last print statement, we display the value of **x** as defined in the main block, thereby confirming that it is actually unaffected by the local assignment within the previously called function.\\n\",\n    \"\\n\",\n    \"## The <code>global</code> statement\\n\",\n    \"If you want to assign a value to a name defined at the top level of the program (i.e. not inside any kind of scope such as functions or classes), then you have to tell Python that the name is not local, but it is global. We do this using the <code>global</code> statement. It is impossible to assign a value to a variable defined outside a function without the global statement.\\n\",\n    \"\\n\",\n    \"You can use the values of such variables defined outside the function (assuming there is no variable with the same name within the function). However, this is not encouraged and should be avoided since it becomes unclear to the reader of the program as to where that variable’s definition is. Using the <code>global</code> statement makes it amply clear that the variable is defined in an outermost block.\\n\",\n    \"\\n\",\n    \"Example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Before calling func(), x is:  50\\n\",\n      \"This function is now using the global x!\\n\",\n      \"Because of global x is:  50\\n\",\n      \"Ran func(), changed global x to 2\\n\",\n      \"Value of x (outside of func()) is:  2\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = 50\\n\",\n    \"\\n\",\n    \"def func():\\n\",\n    \"    global x\\n\",\n    \"    print('This function is now using the global x!')\\n\",\n    \"    print('Because of global x is: ', x)\\n\",\n    \"    x = 2\\n\",\n    \"    print('Ran func(), changed global x to', x)\\n\",\n    \"\\n\",\n    \"print('Before calling func(), x is: ', x)\\n\",\n    \"func()\\n\",\n    \"print('Value of x (outside of func()) is: ', x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"The <code>global</code> statement is used to declare that **x** is a global variable - hence, when we assign a value to **x** inside the function, that change is reflected when we use the value of **x** in the main block.\\n\",\n    \"\\n\",\n    \"You can specify more than one global variable using the same global statement e.g. <code>global x, y, z</code>.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## Conclusion\\n\",\n    \"You should now have a good understanding of Scope (you may have already intuitively felt right about Scope which is great!) One last mention is that you can use the **globals()** and **locals()** functions to check what are your current local and global variables.\\n\",\n    \"\\n\",\n    \"Another thing to keep in mind is that everything in Python is an object! I can assign variables to functions just like I can with numbers! We will go over this again in the decorator section of the course!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "03-Methods and Functions/07-args and kwargs.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# `*args` and `**kwargs`\\n\",\n    \"\\n\",\n    \"Work with Python long enough, and eventually you will encounter `*args` and `**kwargs`. These strange terms show up as parameters in function definitions. What do they do? Let's review a simple function:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"5.0\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"def myfunc(a,b):\\n\",\n    \"    return sum((a,b))*.05\\n\",\n    \"\\n\",\n    \"myfunc(40,60)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This function returns 5% of the sum of **a** and **b**. In this example, **a** and **b** are *positional* arguments; that is, 40 is assigned to **a** because it is the first argument, and 60 to **b**. Notice also that to work with multiple positional arguments in the `sum()` function we had to pass them in as a tuple.\\n\",\n    \"\\n\",\n    \"What if we want to work with more than two numbers? One way would be to assign a *lot* of parameters, and give each one a default value.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"6.0\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"def myfunc(a=0,b=0,c=0,d=0,e=0):\\n\",\n    \"    return sum((a,b,c,d,e))*.05\\n\",\n    \"\\n\",\n    \"myfunc(40,60,20)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Obviously this is not a very efficient solution, and that's where `*args` comes in.\\n\",\n    \"\\n\",\n    \"## `*args`\\n\",\n    \"\\n\",\n    \"When a function parameter starts with an asterisk, it allows for an *arbitrary number* of arguments, and the function takes them in as a tuple of values. Rewriting the above function:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"6.0\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"def myfunc(*args):\\n\",\n    \"    return sum(args)*.05\\n\",\n    \"\\n\",\n    \"myfunc(40,60,20)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice how passing the keyword \\\"args\\\" into the `sum()` function did the same thing as a tuple of arguments.\\n\",\n    \"\\n\",\n    \"It is worth noting that the word \\\"args\\\" is itself arbitrary - any word will do so long as it's preceded by an asterisk. To demonstrate this:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"6.0\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"def myfunc(*spam):\\n\",\n    \"    return sum(spam)*.05\\n\",\n    \"\\n\",\n    \"myfunc(40,60,20)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## `**kwargs`\\n\",\n    \"\\n\",\n    \"Similarly, Python offers a way to handle arbitrary numbers of *keyworded* arguments. Instead of creating a tuple of values, `**kwargs` builds a dictionary of key/value pairs. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"My favorite fruit is pineapple\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"def myfunc(**kwargs):\\n\",\n    \"    if 'fruit' in kwargs:\\n\",\n    \"        print(f\\\"My favorite fruit is {kwargs['fruit']}\\\")  # review String Formatting and f-strings if this syntax is unfamiliar\\n\",\n    \"    else:\\n\",\n    \"        print(\\\"I don't like fruit\\\")\\n\",\n    \"        \\n\",\n    \"myfunc(fruit='pineapple')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"I don't like fruit\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"myfunc()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## `*args` and `**kwargs` combined\\n\",\n    \"\\n\",\n    \"You can pass `*args` and `**kwargs` into the same function, but `*args` have to appear before `**kwargs`\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"I like eggs and spam and my favorite fruit is cherries\\n\",\n      \"May I have some orange juice?\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"def myfunc(*args, **kwargs):\\n\",\n    \"    if 'fruit' and 'juice' in kwargs:\\n\",\n    \"        print(f\\\"I like {' and '.join(args)} and my favorite fruit is {kwargs['fruit']}\\\")\\n\",\n    \"        print(f\\\"May I have some {kwargs['juice']} juice?\\\")\\n\",\n    \"    else:\\n\",\n    \"        pass\\n\",\n    \"        \\n\",\n    \"myfunc('eggs','spam',fruit='cherries',juice='orange')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Placing keyworded arguments ahead of positional arguments raises an exception:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"SyntaxError\",\n     \"evalue\": \"positional argument follows keyword argument (<ipython-input-8-fc6ff65addcc>, line 1)\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;36m  File \\u001b[1;32m\\\"<ipython-input-8-fc6ff65addcc>\\\"\\u001b[1;36m, line \\u001b[1;32m1\\u001b[0m\\n\\u001b[1;33m    myfunc(fruit='cherries',juice='orange','eggs','spam')\\u001b[0m\\n\\u001b[1;37m                                          ^\\u001b[0m\\n\\u001b[1;31mSyntaxError\\u001b[0m\\u001b[1;31m:\\u001b[0m positional argument follows keyword argument\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"myfunc(fruit='cherries',juice='orange','eggs','spam')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"As with \\\"args\\\", you can use any name you'd like for keyworded arguments - \\\"kwargs\\\" is just a popular convention.\\n\",\n    \"\\n\",\n    \"That's it! Now you should understand how `*args` and `**kwargs` provide the flexibilty to work with arbitrary numbers of arguments!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "03-Methods and Functions/08-Functions and Methods Homework.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Functions and Methods Homework \\n\",\n    \"\\n\",\n    \"Complete the following questions:\\n\",\n    \"____\\n\",\n    \"**Write a function that computes the volume of a sphere given its radius.**\\n\",\n    \"<p>The volume of a sphere is given as $$\\\\frac{4}{3} πr^3$$</p>\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def vol(rad):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"33.49333333333333\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"vol(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"**Write a function that checks whether a number is in a given range (inclusive of high and low)**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def ran_check(num,low,high):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"5 is in the range between 2 and 7\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"ran_check(5,2,7)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you only wanted to return a boolean:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def ran_bool(num,low,high):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"ran_bool(3,1,10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function that accepts a string and calculates the number of upper case letters and lower case letters.**\\n\",\n    \"\\n\",\n    \"    Sample String : 'Hello Mr. Rogers, how are you this fine Tuesday?'\\n\",\n    \"    Expected Output : \\n\",\n    \"    No. of Upper case characters : 4\\n\",\n    \"    No. of Lower case Characters : 33\\n\",\n    \"\\n\",\n    \"HINT: Two string methods that might prove useful: **.isupper()** and **.islower()**\\n\",\n    \"\\n\",\n    \"If you feel ambitious, explore the Collections module to solve this problem!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def up_low(s):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Original String :  Hello Mr. Rogers, how are you this fine Tuesday?\\n\",\n      \"No. of Upper case characters :  4\\n\",\n      \"No. of Lower case Characters :  33\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"s = 'Hello Mr. Rogers, how are you this fine Tuesday?'\\n\",\n    \"up_low(s)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function that takes a list and returns a new list with unique elements of the first list.**\\n\",\n    \"\\n\",\n    \"    Sample List : [1,1,1,1,2,2,3,3,3,3,4,5]\\n\",\n    \"    Unique List : [1, 2, 3, 4, 5]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def unique_list(lst):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 3, 4, 5]\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"unique_list([1,1,1,1,2,2,3,3,3,3,4,5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function to multiply all the numbers in a list.**\\n\",\n    \"\\n\",\n    \"    Sample List : [1, 2, 3, -4]\\n\",\n    \"    Expected Output : -24\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def multiply(numbers):  \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"-24\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"multiply([1,2,3,-4])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function that checks whether a word or phrase is palindrome or not.**\\n\",\n    \"\\n\",\n    \"Note: A palindrome is word, phrase, or sequence that reads the same backward as forward, e.g., madam,kayak,racecar, or a phrase \\\"nurses run\\\". Hint: You may want to check out the .replace() method in a string to help out with dealing with spaces. Also google search how to reverse a string in Python, there are some clever ways to do it with slicing notation.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def palindrome(s):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"palindrome('helleh')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"#### Hard:\\n\",\n    \"\\n\",\n    \"**Write a Python function to check whether a string is pangram or not. (Assume the string passed in does not have any punctuation)**\\n\",\n    \"\\n\",\n    \"    Note : Pangrams are words or sentences containing every letter of the alphabet at least once.\\n\",\n    \"    For example : \\\"The quick brown fox jumps over the lazy dog\\\"\\n\",\n    \"\\n\",\n    \"Hint: You may want to use .replace() method to get rid of spaces.\\n\",\n    \"\\n\",\n    \"Hint: Look at the [string module](https://stackoverflow.com/questions/16060899/alphabet-range-in-python)\\n\",\n    \"\\n\",\n    \"Hint: In case you want to use [set comparisons](https://medium.com/better-programming/a-visual-guide-to-set-comparisons-in-python-6ab7edb9ec41)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import string\\n\",\n    \"\\n\",\n    \"def ispangram(str1, alphabet=string.ascii_lowercase):\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"ispangram(\\\"The quick brown fox jumps over the lazy dog\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'abcdefghijklmnopqrstuvwxyz'\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"string.ascii_lowercase\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"#### Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "03-Methods and Functions/09-Functions and Methods Homework - Solutions.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Functions and Methods Homework Solutions\\n\",\n    \"____\\n\",\n    \"**Write a function that computes the volume of a sphere given its radius.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def vol(rad):\\n\",\n    \"    return (4/3)*(3.14)*(rad**3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"33.49333333333333\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"vol(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"**Write a function that checks whether a number is in a given range (inclusive of high and low)**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def ran_check(num,low,high):\\n\",\n    \"    #Check if num is between low and high (including low and high)\\n\",\n    \"    if num in range(low,high+1):\\n\",\n    \"        print('{} is in the range between {} and {}'.format(num,low,high))\\n\",\n    \"    else:\\n\",\n    \"        print('The number is outside the range.')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"5 is in the range between 2 and 7\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Check\\n\",\n    \"ran_check(5,2,7)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you only wanted to return a boolean:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def ran_bool(num,low,high):\\n\",\n    \"    return num in range(low,high+1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"ran_bool(3,1,10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function that accepts a string and calculates the number of upper case letters and lower case letters.**\\n\",\n    \"\\n\",\n    \"    Sample String : 'Hello Mr. Rogers, how are you this fine Tuesday?'\\n\",\n    \"    Expected Output : \\n\",\n    \"    No. of Upper case characters : 4\\n\",\n    \"    No. of Lower case Characters : 33\\n\",\n    \"\\n\",\n    \"If you feel ambitious, explore the Collections module to solve this problem!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def up_low(s):\\n\",\n    \"    d={\\\"upper\\\":0, \\\"lower\\\":0}\\n\",\n    \"    for c in s:\\n\",\n    \"        if c.isupper():\\n\",\n    \"            d[\\\"upper\\\"]+=1\\n\",\n    \"        elif c.islower():\\n\",\n    \"            d[\\\"lower\\\"]+=1\\n\",\n    \"        else:\\n\",\n    \"            pass\\n\",\n    \"    print(\\\"Original String : \\\", s)\\n\",\n    \"    print(\\\"No. of Upper case characters : \\\", d[\\\"upper\\\"])\\n\",\n    \"    print(\\\"No. of Lower case Characters : \\\", d[\\\"lower\\\"])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Original String :  Hello Mr. Rogers, how are you this fine Tuesday?\\n\",\n      \"No. of Upper case characters :  4\\n\",\n      \"No. of Lower case Characters :  33\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"s = 'Hello Mr. Rogers, how are you this fine Tuesday?'\\n\",\n    \"up_low(s)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function that takes a list and returns a new list with unique elements of the first list.**\\n\",\n    \"\\n\",\n    \"    Sample List : [1,1,1,1,2,2,3,3,3,3,4,5]\\n\",\n    \"    Unique List : [1, 2, 3, 4, 5]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def unique_list(lst):\\n\",\n    \"    # Also possible to use list(set())\\n\",\n    \"    x = []\\n\",\n    \"    for a in lst:\\n\",\n    \"        if a not in x:\\n\",\n    \"            x.append(a)\\n\",\n    \"    return x\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 3, 4, 5]\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"unique_list([1,1,1,1,2,2,3,3,3,3,4,5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function to multiply all the numbers in a list.**\\n\",\n    \"\\n\",\n    \"    Sample List : [1, 2, 3, -4]\\n\",\n    \"    Expected Output : -24\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def multiply(numbers):\\n\",\n    \"    total = 1\\n\",\n    \"    for x in numbers:\\n\",\n    \"        total *= x\\n\",\n    \"    return total\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"-24\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"multiply([1,2,3,-4])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Write a Python function that checks whether a word or phrase is palindrome or not.**\\n\",\n    \"\\n\",\n    \"Note: A palindrome is word, phrase, or sequence that reads the same backward as forward, e.g., madam,kayak,racecar, or a phrase \\\"nurses run\\\". Hint: You may want to check out the .replace() method in a string to help out with dealing with spaces. Also google search how to reverse a string in Python, there are some clever ways to do it with slicing notation.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def palindrome(s):\\n\",\n    \"    \\n\",\n    \"    s = s.replace(' ','') # This replaces all spaces ' ' with no space ''. (Fixes issues with strings that have spaces)\\n\",\n    \"    return s == s[::-1]   # Check through slicing\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"palindrome('nurses run')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"palindrome('abcba')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"#### Hard:\\n\",\n    \"\\n\",\n    \"**Write a Python function to check whether a string is pangram or not. (Assume the string passed in does not have any punctuation)**\\n\",\n    \"\\n\",\n    \"    Note : Pangrams are words or sentences containing every letter of the alphabet at least once.\\n\",\n    \"    For example : \\\"The quick brown fox jumps over the lazy dog\\\"\\n\",\n    \"\\n\",\n    \"Hint: You may want to use .replace() method to get rid of spaces.\\n\",\n    \"\\n\",\n    \"Hint: Look at the [string module](https://stackoverflow.com/questions/16060899/alphabet-range-in-python)\\n\",\n    \"\\n\",\n    \"Hint: In case you want to use [set comparisons](https://medium.com/better-programming/a-visual-guide-to-set-comparisons-in-python-6ab7edb9ec41)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import string\\n\",\n    \"\\n\",\n    \"def ispangram(str1, alphabet=string.ascii_lowercase): \\n\",\n    \"    # Create a set of the alphabet\\n\",\n    \"    alphaset = set(alphabet)  \\n\",\n    \"    \\n\",\n    \"    # Remove spaces from str1\\n\",\n    \"    str1 = str1.replace(\\\" \\\",'')\\n\",\n    \"    \\n\",\n    \"    # Lowercase all strings in the passed in string\\n\",\n    \"    # Recall we assume no punctuation \\n\",\n    \"    str1 = str1.lower()\\n\",\n    \"    \\n\",\n    \"    # Grab all unique letters in the string as a set\\n\",\n    \"    str1 = set(str1)\\n\",\n    \"    \\n\",\n    \"    # Now check that the alpahbet set is same as string set\\n\",\n    \"    return str1 == alphaset\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"ispangram(\\\"The quick brown fox jumps over the lazy dog\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'abcdefghijklmnopqrstuvwxyz'\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"string.ascii_lowercase\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "04-Milestone Project - 1/.ipynb_checkpoints/00-Warm-Up-Project-Exercises-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Warm Up Project Exercises\\n\",\n    \"\\n\",\n    \"It is time to get you to put together all your skills to start building usable projects! Before you jump into our full milestone project, we will go through some warm-up component exercises, to get you comfortable with a few key ideas we use in the milestone project and larger projects in general, specifically:\\n\",\n    \"\\n\",\n    \"* Getting User Input\\n\",\n    \"* Creating Functions that edit variables based on user input\\n\",\n    \"* Generating output\\n\",\n    \"* Joining User Inputs and Logic Flow\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Function to Display Information\\n\",\n    \"\\n\",\n    \"**Creating a function that displays a list for the user**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def display_list(mylist):\\n\",\n    \"    print(mylist)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"mylist = [0,1,2,3,4,5,6,7,8,9,10]\\n\",\n    \"display_list(mylist)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Accepting User Input\\n\",\n    \"\\n\",\n    \"**Creating function that takes in an input from user and returns the result in the correct data type. Be careful when using the input() function, running that cell twice without providing an input value will cause python to get hung up waiting for the initial value on the first run. You will notice an In[*\\\\] next to the cell if it gets stuck, in which case, simply restart the kernel and re-run any necessary cells.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please enter a value: 2\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'2'\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"input('Please enter a value: ')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please enter a number: 2\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"result = input(\\\"Please enter a number: \\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'2'\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"result\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"str\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"type(result)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"int(result)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please enter a number: 2\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"result = int(input(\\\"Please enter a number: \\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"int\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"type(result)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please enter a number: two\\n\"\n     ]\n    },\n    {\n     \"ename\": \"ValueError\",\n     \"evalue\": \"invalid literal for int() with base 10: 'two'\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mValueError\\u001b[0m                                Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-19-202dd8101f66>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      1\\u001b[0m \\u001b[1;31m# Example of an error!\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m----> 2\\u001b[1;33m \\u001b[0mresult\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[0mint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0minput\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;34m\\\"Please enter a number: \\\"\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mValueError\\u001b[0m: invalid literal for int() with base 10: 'two'\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Example of an error!\\n\",\n    \"result = int(input(\\\"Please enter a number: \\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"** Creating a function to hold this logic: **\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def user_choice():\\n\",\n    \"    '''\\n\",\n    \"    User inputs a number (0-10) and we return this in integer form.\\n\",\n    \"    No parameter is passed when calling this function.\\n\",\n    \"    '''\\n\",\n    \"    choice = input(\\\"Please input a number (0-10)\\\")\\n\",\n    \"    \\n\",\n    \"    return int(choice)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please input a number (0-10)2\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 21,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"user_choice()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please input a number (0-10)2\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"result = user_choice()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 23,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"result\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"int\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"type(result)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Validating User Input\\n\",\n    \"\\n\",\n    \"** Check that input is valid before attempting to convert.** \\n\",\n    \"\\n\",\n    \"We'll use a simple method here.\\n\",\n    \"\\n\",\n    \"As you get more advanced, you can start looking at other ways of doing this (these methods will make more sense later on in the course, so don't worry about them for now).\\n\",\n    \"\\n\",\n    \"* [Various Posts on This](https://www.google.com/search?q=python+check+if+input+is+number)\\n\",\n    \"* [StackOverflow Post 1](https://stackoverflow.com/questions/5424716/how-to-check-if-string-input-is-a-number)\\n\",\n    \"* [StackOverflow Post 2](https://stackoverflow.com/questions/1265665/how-can-i-check-if-a-string-represents-an-int-without-using-try-except)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"some_input = '10'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 32,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Lot's of .is methods availble on string\\n\",\n    \"some_input.isdigit()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"** Edit the function to confirm against an acceptable value or type **\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def user_choice():\\n\",\n    \"    \\n\",\n    \"    # This original choice value can be anything that isn't an integer\\n\",\n    \"    choice = 'wrong'\\n\",\n    \"    \\n\",\n    \"    # While the choice is not a digit, keep asking for input.\\n\",\n    \"    while choice.isdigit() == False:\\n\",\n    \"        \\n\",\n    \"        # we shouldn't convert here, otherwise we get an error on a wrong input\\n\",\n    \"        choice = input(\\\"Choose a number: \\\")\\n\",\n    \"    \\n\",\n    \"    # We can convert once the while loop above has confirmed we have a digit.\\n\",\n    \"    return int(choice)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 38,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Choose a number: hello\\n\",\n      \"Choose a number: two\\n\",\n      \"Choose a number: 2\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 38,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"user_choice()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Let's try adding an error message within the while loop!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def user_choice():\\n\",\n    \"    \\n\",\n    \"    # This original choice value can be anything that isn't an integer\\n\",\n    \"    choice = 'wrong'\\n\",\n    \"    \\n\",\n    \"    # While the choice is not a digit, keep asking for input.\\n\",\n    \"    while choice.isdigit() == False:\\n\",\n    \"        \\n\",\n    \"        # we shouldn't convert here, otherwise we get an error on a wrong input\\n\",\n    \"        choice = input(\\\"Choose a number: \\\")\\n\",\n    \"        \\n\",\n    \"        # Error Message Check\\n\",\n    \"        if choice.isdigit() == False:\\n\",\n    \"            print(\\\"Sorry, but you did not enter an integer. Please try again.\\\")\\n\",\n    \"    \\n\",\n    \"    # We can convert once the while loop above has confirmed we have a digit.\\n\",\n    \"    return int(choice)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 40,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Choose a number: two\\n\",\n      \"Sorry, but you did not enter an integer. Please try again.\\n\",\n      \"Choose a number: 2\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 40,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"user_choice()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Now let's explore how to \\\"clear\\\" the output, that way we don't see the history of the \\\"Choose a number\\\" statements.**\\n\",\n    \"\\n\",\n    \"**NOTE: Jupyter Notebook users will use the IPython method shown here. Other IDE users (PyCharm, VS, etc..) will use **\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from IPython.display import clear_output\\n\",\n    \"clear_output()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def user_choice():\\n\",\n    \"    \\n\",\n    \"    # This original choice value can be anything that isn't an integer\\n\",\n    \"    choice = 'wrong'\\n\",\n    \"    \\n\",\n    \"    # While the choice is not a digit, keep asking for input.\\n\",\n    \"    while choice.isdigit() == False:\\n\",\n    \"        \\n\",\n    \"        # we shouldn't convert here, otherwise we get an error on a wrong input\\n\",\n    \"        choice = input(\\\"Choose a number: \\\")\\n\",\n    \"        \\n\",\n    \"        if choice.isdigit() == False:\\n\",\n    \"            # THIS CLEARS THE CURRENT OUTPUT BELOW THE CELL\\n\",\n    \"            clear_output()\\n\",\n    \"            \\n\",\n    \"            print(\\\"Sorry, but you did not enter an integer. Please try again.\\\")\\n\",\n    \"            \\n\",\n    \"    \\n\",\n    \"    # Optionally you can clear everything after running the function\\n\",\n    \"    # clear_output()\\n\",\n    \"    \\n\",\n    \"    # We can convert once the while loop above has confirmed we have a digit.\\n\",\n    \"    return int(choice)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Choose a number: 2\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"user_choice()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Checking Against Multiple Possible Values**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"result = 'wrong value'\\n\",\n    \"acceptable_values = ['0','1','2']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"result in acceptable_values\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"result not in acceptable_values\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from IPython.display import clear_output\\n\",\n    \"clear_output()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def user_choice():\\n\",\n    \"    \\n\",\n    \"    # This original choice value can be anything that isn't an integer\\n\",\n    \"    choice = 'wrong'\\n\",\n    \"    \\n\",\n    \"    # While the choice is not a digit, keep asking for input.\\n\",\n    \"    while choice not in ['0','1','2']:\\n\",\n    \"        \\n\",\n    \"        # we shouldn't convert here, otherwise we get an error on a wrong input\\n\",\n    \"        choice = input(\\\"Choose one of these numbers (0,1,2): \\\")\\n\",\n    \"        \\n\",\n    \"        if choice not in ['0','1','2']:\\n\",\n    \"            # THIS CLEARS THE CURRENT OUTPUT BELOW THE CELL\\n\",\n    \"            clear_output()\\n\",\n    \"            \\n\",\n    \"            print(\\\"Sorry, but you did not choose a value in the correct range (0,1,2)\\\")\\n\",\n    \"            \\n\",\n    \"    \\n\",\n    \"    # Optionally you can clear everything after running the function\\n\",\n    \"    # clear_output()\\n\",\n    \"    \\n\",\n    \"    # We can convert once the while loop above has confirmed we have a digit.\\n\",\n    \"    return int(choice)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"scrolled\": true\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Choose one of these numbers (0,1,2): 1\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"user_choice()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### More Flexible Example\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def user_choice():\\n\",\n    \"    \\n\",\n    \"    choice ='WRONG'\\n\",\n    \"    within_range = False\\n\",\n    \"    \\n\",\n    \"    while choice.isdigit() == False or within_range == False:\\n\",\n    \"        \\n\",\n    \"    \\n\",\n    \"    \\n\",\n    \"        choice = input(\\\"Please enter a number (0-10): \\\")\\n\",\n    \"        \\n\",\n    \"        if choice.isdigit() == False:\\n\",\n    \"            print(\\\"Sorry that is not a digit!\\\")\\n\",\n    \"            \\n\",\n    \"        if choice.isdigit() == True:\\n\",\n    \"            if int(choice) in range(0,10):\\n\",\n    \"                within_range = True\\n\",\n    \"            else:\\n\",\n    \"                within_range = False\\n\",\n    \"        \\n\",\n    \"    \\n\",\n    \"    return int(choice)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please enter a number (0-10): 12\\n\",\n      \"Please enter a number (0-10): 2\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"user_choice()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"-----\\n\",\n    \"## Simple User Interaction\\n\",\n    \"\\n\",\n    \"**Finally let's combine all of these ideas to create a small game where a user can choose a \\\"position\\\" in an existing list and replace it with a value of their choice.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"game_list = [0,1,2]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def display_game(game_list):\\n\",\n    \"    print(\\\"Here is the current list\\\")\\n\",\n    \"    print(game_list)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Here is the current list\\n\",\n      \"['hi', 'no', 2]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"display_game(game_list)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def position_choice():\\n\",\n    \"    \\n\",\n    \"    # This original choice value can be anything that isn't an integer\\n\",\n    \"    choice = 'wrong'\\n\",\n    \"    \\n\",\n    \"    # While the choice is not a digit, keep asking for input.\\n\",\n    \"    while choice not in ['0','1','2']:\\n\",\n    \"        \\n\",\n    \"        # we shouldn't convert here, otherwise we get an error on a wrong input\\n\",\n    \"        choice = input(\\\"Pick a position to replace (0,1,2): \\\")\\n\",\n    \"        \\n\",\n    \"        if choice not in ['0','1','2']:\\n\",\n    \"            # THIS CLEARS THE CURRENT OUTPUT BELOW THE CELL\\n\",\n    \"            clear_output()\\n\",\n    \"            \\n\",\n    \"            print(\\\"Sorry, but you did not choose a valid position (0,1,2)\\\")\\n\",\n    \"            \\n\",\n    \"    \\n\",\n    \"    # Optionally you can clear everything after running the function\\n\",\n    \"    # clear_output()\\n\",\n    \"    \\n\",\n    \"    # We can convert once the while loop above has confirmed we have a digit.\\n\",\n    \"    return int(choice)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def replacement_choice(game_list,position):\\n\",\n    \"    \\n\",\n    \"    user_placement = input(\\\"Type a string to place at the position\\\")\\n\",\n    \"    \\n\",\n    \"    game_list[position] = user_placement\\n\",\n    \"    \\n\",\n    \"    return game_list\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def gameon_choice():\\n\",\n    \"    \\n\",\n    \"    # This original choice value can be anything that isn't a Y or N\\n\",\n    \"    choice = 'wrong'\\n\",\n    \"    \\n\",\n    \"    # While the choice is not a digit, keep asking for input.\\n\",\n    \"    while choice not in ['Y','N']:\\n\",\n    \"        \\n\",\n    \"        # we shouldn't convert here, otherwise we get an error on a wrong input\\n\",\n    \"        choice = input(\\\"Would you like to keep playing? Y or N \\\")\\n\",\n    \"\\n\",\n    \"        \\n\",\n    \"        if choice not in ['Y','N']:\\n\",\n    \"            # THIS CLEARS THE CURRENT OUTPUT BELOW THE CELL\\n\",\n    \"            clear_output()\\n\",\n    \"            \\n\",\n    \"            print(\\\"Sorry, I didn't understand. Please make sure to choose Y or N.\\\")\\n\",\n    \"            \\n\",\n    \"    \\n\",\n    \"    # Optionally you can clear everything after running the function\\n\",\n    \"    # clear_output()\\n\",\n    \"    \\n\",\n    \"    if choice == \\\"Y\\\":\\n\",\n    \"        # Game is still on\\n\",\n    \"        return True\\n\",\n    \"    else:\\n\",\n    \"        # Game is over\\n\",\n    \"        return False\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Game Logic All Together**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Here is the current list\\n\",\n      \"['34', 1, 'new value']\\n\",\n      \"Would you like to keep playing? Y or N N\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Variable to keep game playing\\n\",\n    \"game_on = True\\n\",\n    \"\\n\",\n    \"# First Game List\\n\",\n    \"game_list = [0,1,2]\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"while game_on:\\n\",\n    \"    \\n\",\n    \"    # Clear any historical output and show the game list\\n\",\n    \"    clear_output()\\n\",\n    \"    display_game(game_list)\\n\",\n    \"    \\n\",\n    \"    # Have player choose position\\n\",\n    \"    position = position_choice()\\n\",\n    \"    \\n\",\n    \"    # Rewrite that position and update game_list\\n\",\n    \"    game_list = replacement_choice(game_list,position)\\n\",\n    \"    \\n\",\n    \"    # Clear Screen and show the updated game list\\n\",\n    \"    clear_output()\\n\",\n    \"    display_game(game_list)\\n\",\n    \"    \\n\",\n    \"    # Ask if you want to keep playing\\n\",\n    \"    game_on = gameon_choice()\\n\",\n    \"    \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Great work! You now have an understanding of bringing functions and loop logics together to build a simple game. This will be expanded upon in the Milestone project!**\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "04-Milestone Project - 1/.ipynb_checkpoints/01-Milestone Project 1 - Assignment-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Milestone Project 1\\n\",\n    \"## Congratulations on making it to your first milestone!\\n\",\n    \"You've already learned a ton and are ready to work on a real project.\\n\",\n    \"\\n\",\n    \"Your assignment: Create a Tic Tac Toe game. You are free to use any IDE you like.\\n\",\n    \"\\n\",\n    \"Here are the requirements:\\n\",\n    \"\\n\",\n    \"* 2 players should be able to play the game (both sitting at the same computer)\\n\",\n    \"* The board should be printed out every time a player makes a move\\n\",\n    \"* You should be able to accept input of the player position and then place a symbol on the board\\n\",\n    \"\\n\",\n    \"Feel free to use Google to help you figure anything out (but don't just Google \\\"Tic Tac Toe in Python\\\" otherwise you won't learn anything!) Keep in mind that this project can take anywhere between several hours to several days.\\n\",\n    \"\\n\",\n    \"There are 4 Jupyter Notebooks related to this assignment:\\n\",\n    \"\\n\",\n    \"* This Assignment Notebook\\n\",\n    \"* A \\\"Walkthrough Steps Workbook\\\" Notebook\\n\",\n    \"* A \\\"Complete Walkthrough Solution\\\" Notebook\\n\",\n    \"* An \\\"Advanced Solution\\\" Notebook\\n\",\n    \"\\n\",\n    \"I encourage you to just try to start the project on your own without referencing any of the notebooks. If you get stuck, check out the next lecture which is a text lecture with helpful hints and steps. If you're still stuck after that, then check out the Walkthrough Steps Workbook, which breaks up the project in steps for you to solve. Still stuck? Then check out the Complete Walkthrough Solution video for more help on approaching the project!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There are parts of this that will be a struggle...and that is good! I have complete faith that if you have made it this far through the course you have all the tools and knowledge to tackle this project. Remember, it's totally open book, so take your time, do a little research, and remember:\\n\",\n    \"\\n\",\n    \"## HAVE FUN!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "04-Milestone Project - 1/.ipynb_checkpoints/02-Milestone Project 1 - Walkthrough Steps Workbook-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Milestone Project 1: Walkthrough Steps Workbook\\n\",\n    \"\\n\",\n    \"Below is a set of steps for you to follow to try to create the Tic Tac Toe Milestone Project game!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Some suggested tools before you get started:\\n\",\n    \"To take input from a user:\\n\",\n    \"\\n\",\n    \"    player1 = input(\\\"Please pick a marker 'X' or 'O'\\\")\\n\",\n    \"    \\n\",\n    \"Note that input() takes in a string. If you need an integer value, use\\n\",\n    \"\\n\",\n    \"    position = int(input('Please enter a number'))\\n\",\n    \"    \\n\",\n    \"<br>To clear the screen between moves:\\n\",\n    \"\\n\",\n    \"    from IPython.display import clear_output\\n\",\n    \"    clear_output()\\n\",\n    \"    \\n\",\n    \"Note that clear_output() will only work in jupyter. To clear the screen in other IDEs, consider:\\n\",\n    \"\\n\",\n    \"    print('\\\\n'*100)\\n\",\n    \"    \\n\",\n    \"This scrolls the previous board up out of view. Now on to the program!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 1: Write a function that can print out a board. Set up your board as a list, where each index 1-9 corresponds with a number on a number pad, so you get a 3 by 3 board representation.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from IPython.display import clear_output\\n\",\n    \"\\n\",\n    \"def display_board(board):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TEST Step 1:** run your function on a test version of the board list, and make adjustments as necessary\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"test_board = ['#','X','O','X','O','X','O','X','O','X']\\n\",\n    \"display_board(test_board)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 2: Write a function that can take in a player input and assign their marker as 'X' or 'O'. Think about using *while* loops to continually ask until you get a correct answer.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def player_input():\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TEST Step 2:** run the function to make sure it returns the desired output\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"player_input()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 3: Write a function that takes in the board list object, a marker ('X' or 'O'), and a desired position (number 1-9) and assigns it to the board.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def place_marker(board, marker, position):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TEST Step 3:** run the place marker function using test parameters and display the modified board\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"place_marker(test_board,'$',8)\\n\",\n    \"display_board(test_board)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 4: Write a function that takes in a board and a mark (X or O) and then checks to see if that mark has won. **\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def win_check(board, mark):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TEST Step 4:** run the win_check function against our test_board - it should return True\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"win_check(test_board,'X')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 5: Write a function that uses the random module to randomly decide which player goes first. You may want to lookup random.randint() Return a string of which player went first.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import random\\n\",\n    \"\\n\",\n    \"def choose_first():\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 6: Write a function that returns a boolean indicating whether a space on the board is freely available.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def space_check(board, position):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 7: Write a function that checks if the board is full and returns a boolean value. True if full, False otherwise.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def full_board_check(board):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 8: Write a function that asks for a player's next position (as a number 1-9) and then uses the function from step 6 to check if it's a free position. If it is, then return the position for later use.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def player_choice(board):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 9: Write a function that asks the player if they want to play again and returns a boolean True if they do want to play again.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def replay():\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"**Step 10: Here comes the hard part! Use while loops and the functions you've made to run the game!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"print('Welcome to Tic Tac Toe!')\\n\",\n    \"\\n\",\n    \"#while True:\\n\",\n    \"    # Set the game up here\\n\",\n    \"    #pass\\n\",\n    \"\\n\",\n    \"    #while game_on:\\n\",\n    \"        #Player 1 Turn\\n\",\n    \"        \\n\",\n    \"        \\n\",\n    \"        # Player2's turn.\\n\",\n    \"            \\n\",\n    \"            #pass\\n\",\n    \"\\n\",\n    \"    #if not replay():\\n\",\n    \"        #break\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## Good Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "04-Milestone Project - 1/.ipynb_checkpoints/03-Milestone Project 1 - Complete Walkthrough Solution-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Milestone Project 1: Full Walk-through Code Solution\\n\",\n    \"\\n\",\n    \"Below is the filled in code that goes along with the complete walk-through video. Check out the corresponding lecture videos for more information on this code!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 1: Write a function that can print out a board. Set up your board as a list, where each index 1-9 corresponds with a number on a number pad, so you get a 3 by 3 board representation.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from IPython.display import clear_output\\n\",\n    \"\\n\",\n    \"def display_board(board):\\n\",\n    \"    clear_output()  # Remember, this only works in jupyter!\\n\",\n    \"    \\n\",\n    \"    print('   |   |')\\n\",\n    \"    print(' ' + board[7] + ' | ' + board[8] + ' | ' + board[9])\\n\",\n    \"    print('   |   |')\\n\",\n    \"    print('-----------')\\n\",\n    \"    print('   |   |')\\n\",\n    \"    print(' ' + board[4] + ' | ' + board[5] + ' | ' + board[6])\\n\",\n    \"    print('   |   |')\\n\",\n    \"    print('-----------')\\n\",\n    \"    print('   |   |')\\n\",\n    \"    print(' ' + board[1] + ' | ' + board[2] + ' | ' + board[3])\\n\",\n    \"    print('   |   |')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TEST Step 1:** run your function on a test version of the board list, and make adjustments as necessary\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"   |   |\\n\",\n      \" X | O | X\\n\",\n      \"   |   |\\n\",\n      \"-----------\\n\",\n      \"   |   |\\n\",\n      \" O | X | O\\n\",\n      \"   |   |\\n\",\n      \"-----------\\n\",\n      \"   |   |\\n\",\n      \" X | O | X\\n\",\n      \"   |   |\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"test_board = ['#','X','O','X','O','X','O','X','O','X']\\n\",\n    \"display_board(test_board)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 2: Write a function that can take in a player input and assign their marker as 'X' or 'O'. Think about using *while* loops to continually ask until you get a correct answer.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def player_input():\\n\",\n    \"    marker = ''\\n\",\n    \"    \\n\",\n    \"    while not (marker == 'X' or marker == 'O'):\\n\",\n    \"        marker = input('Player 1: Do you want to be X or O? ').upper()\\n\",\n    \"\\n\",\n    \"    if marker == 'X':\\n\",\n    \"        return ('X', 'O')\\n\",\n    \"    else:\\n\",\n    \"        return ('O', 'X')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TEST Step 2:** run the function to make sure it returns the desired output\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Player 1: Do you want to be X or O? X\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"('X', 'O')\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"player_input()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 3: Write a function that takes in the board list object, a marker ('X' or 'O'), and a desired position (number 1-9) and assigns it to the board.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def place_marker(board, marker, position):\\n\",\n    \"    board[position] = marker\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TEST Step 3:** run the place marker function using test parameters and display the modified board\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"   |   |\\n\",\n      \" X | $ | X\\n\",\n      \"   |   |\\n\",\n      \"-----------\\n\",\n      \"   |   |\\n\",\n      \" O | X | O\\n\",\n      \"   |   |\\n\",\n      \"-----------\\n\",\n      \"   |   |\\n\",\n      \" X | O | X\\n\",\n      \"   |   |\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"place_marker(test_board,'$',8)\\n\",\n    \"display_board(test_board)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 4: Write a function that takes in a board and checks to see if someone has won. **\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def win_check(board,mark):\\n\",\n    \"    \\n\",\n    \"    return ((board[7] == mark and board[8] == mark and board[9] == mark) or # across the top\\n\",\n    \"    (board[4] == mark and board[5] == mark and board[6] == mark) or # across the middle\\n\",\n    \"    (board[1] == mark and board[2] == mark and board[3] == mark) or # across the bottom\\n\",\n    \"    (board[7] == mark and board[4] == mark and board[1] == mark) or # down the middle\\n\",\n    \"    (board[8] == mark and board[5] == mark and board[2] == mark) or # down the middle\\n\",\n    \"    (board[9] == mark and board[6] == mark and board[3] == mark) or # down the right side\\n\",\n    \"    (board[7] == mark and board[5] == mark and board[3] == mark) or # diagonal\\n\",\n    \"    (board[9] == mark and board[5] == mark and board[1] == mark)) # diagonal\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TEST Step 4:** run the win_check function against our test_board - it should return True\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"win_check(test_board,'X')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 5: Write a function that uses the random module to randomly decide which player goes first. You may want to lookup random.randint() Return a string of which player went first.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import random\\n\",\n    \"\\n\",\n    \"def choose_first():\\n\",\n    \"    if random.randint(0, 1) == 0:\\n\",\n    \"        return 'Player 2'\\n\",\n    \"    else:\\n\",\n    \"        return 'Player 1'\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 6: Write a function that returns a boolean indicating whether a space on the board is freely available.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def space_check(board, position):\\n\",\n    \"    \\n\",\n    \"    return board[position] == ' '\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 7: Write a function that checks if the board is full and returns a boolean value. True if full, False otherwise.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def full_board_check(board):\\n\",\n    \"    for i in range(1,10):\\n\",\n    \"        if space_check(board, i):\\n\",\n    \"            return False\\n\",\n    \"    return True\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 8: Write a function that asks for a player's next position (as a number 1-9) and then uses the function from step 6 to check if its a free position. If it is, then return the position for later use. **\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def player_choice(board):\\n\",\n    \"    position = 0\\n\",\n    \"    \\n\",\n    \"    while position not in [1,2,3,4,5,6,7,8,9] or not space_check(board, position):\\n\",\n    \"        position = int(input('Choose your next position: (1-9) '))\\n\",\n    \"        \\n\",\n    \"    return position\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 9: Write a function that asks the player if they want to play again and returns a boolean True if they do want to play again.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def replay():\\n\",\n    \"    \\n\",\n    \"    return input('Do you want to play again? Enter Yes or No: ').lower().startswith('y')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"**Step 10: Here comes the hard part! Use while loops and the functions you've made to run the game!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"   |   |\\n\",\n      \"   | O | O\\n\",\n      \"   |   |\\n\",\n      \"-----------\\n\",\n      \"   |   |\\n\",\n      \"   |   |  \\n\",\n      \"   |   |\\n\",\n      \"-----------\\n\",\n      \"   |   |\\n\",\n      \" X | X | X\\n\",\n      \"   |   |\\n\",\n      \"Congratulations! You have won the game!\\n\",\n      \"Do you want to play again? Enter Yes or No: No\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('Welcome to Tic Tac Toe!')\\n\",\n    \"\\n\",\n    \"while True:\\n\",\n    \"    # Reset the board\\n\",\n    \"    theBoard = [' '] * 10\\n\",\n    \"    player1_marker, player2_marker = player_input()\\n\",\n    \"    turn = choose_first()\\n\",\n    \"    print(turn + ' will go first.')\\n\",\n    \"    \\n\",\n    \"    play_game = input('Are you ready to play? Enter Yes or No.')\\n\",\n    \"    \\n\",\n    \"    if play_game.lower()[0] == 'y':\\n\",\n    \"        game_on = True\\n\",\n    \"    else:\\n\",\n    \"        game_on = False\\n\",\n    \"\\n\",\n    \"    while game_on:\\n\",\n    \"        if turn == 'Player 1':\\n\",\n    \"            # Player1's turn.\\n\",\n    \"            \\n\",\n    \"            display_board(theBoard)\\n\",\n    \"            position = player_choice(theBoard)\\n\",\n    \"            place_marker(theBoard, player1_marker, position)\\n\",\n    \"\\n\",\n    \"            if win_check(theBoard, player1_marker):\\n\",\n    \"                display_board(theBoard)\\n\",\n    \"                print('Congratulations! You have won the game!')\\n\",\n    \"                game_on = False\\n\",\n    \"            else:\\n\",\n    \"                if full_board_check(theBoard):\\n\",\n    \"                    display_board(theBoard)\\n\",\n    \"                    print('The game is a draw!')\\n\",\n    \"                    break\\n\",\n    \"                else:\\n\",\n    \"                    turn = 'Player 2'\\n\",\n    \"\\n\",\n    \"        else:\\n\",\n    \"            # Player2's turn.\\n\",\n    \"            \\n\",\n    \"            display_board(theBoard)\\n\",\n    \"            position = player_choice(theBoard)\\n\",\n    \"            place_marker(theBoard, player2_marker, position)\\n\",\n    \"\\n\",\n    \"            if win_check(theBoard, player2_marker):\\n\",\n    \"                display_board(theBoard)\\n\",\n    \"                print('Player 2 has won!')\\n\",\n    \"                game_on = False\\n\",\n    \"            else:\\n\",\n    \"                if full_board_check(theBoard):\\n\",\n    \"                    display_board(theBoard)\\n\",\n    \"                    print('The game is a draw!')\\n\",\n    \"                    break\\n\",\n    \"                else:\\n\",\n    \"                    turn = 'Player 1'\\n\",\n    \"\\n\",\n    \"    if not replay():\\n\",\n    \"        break\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## Good Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"anaconda-cloud\": {},\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "04-Milestone Project - 1/00-Warm-Up-Project-Exercises.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Warm Up Project Exercises\\n\",\n    \"\\n\",\n    \"It is time to get you to put together all your skills to start building usable projects! Before you jump into our full milestone project, we will go through some warm-up component exercises, to get you comfortable with a few key ideas we use in the milestone project and larger projects in general, specifically:\\n\",\n    \"\\n\",\n    \"* Getting User Input\\n\",\n    \"* Creating Functions that edit variables based on user input\\n\",\n    \"* Generating output\\n\",\n    \"* Joining User Inputs and Logic Flow\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Function to Display Information\\n\",\n    \"\\n\",\n    \"**Creating a function that displays a list for the user**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def display_list(mylist):\\n\",\n    \"    print(mylist)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"mylist = [0,1,2,3,4,5,6,7,8,9,10]\\n\",\n    \"display_list(mylist)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Accepting User Input\\n\",\n    \"\\n\",\n    \"**Creating function that takes in an input from user and returns the result in the correct data type. Be careful when using the input() function, running that cell twice without providing an input value will cause python to get hung up waiting for the initial value on the first run. You will notice an In[*\\\\] next to the cell if it gets stuck, in which case, simply restart the kernel and re-run any necessary cells.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please enter a value: 2\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'2'\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"input('Please enter a value: ')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please enter a number: 2\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"result = input(\\\"Please enter a number: \\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'2'\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"result\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"str\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"type(result)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"int(result)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please enter a number: 2\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"result = int(input(\\\"Please enter a number: \\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"int\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"type(result)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please enter a number: two\\n\"\n     ]\n    },\n    {\n     \"ename\": \"ValueError\",\n     \"evalue\": \"invalid literal for int() with base 10: 'two'\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mValueError\\u001b[0m                                Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-19-202dd8101f66>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      1\\u001b[0m \\u001b[1;31m# Example of an error!\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m----> 2\\u001b[1;33m \\u001b[0mresult\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[0mint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0minput\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;34m\\\"Please enter a number: \\\"\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mValueError\\u001b[0m: invalid literal for int() with base 10: 'two'\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Example of an error!\\n\",\n    \"result = int(input(\\\"Please enter a number: \\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"** Creating a function to hold this logic: **\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def user_choice():\\n\",\n    \"    '''\\n\",\n    \"    User inputs a number (0-10) and we return this in integer form.\\n\",\n    \"    No parameter is passed when calling this function.\\n\",\n    \"    '''\\n\",\n    \"    choice = input(\\\"Please input a number (0-10)\\\")\\n\",\n    \"    \\n\",\n    \"    return int(choice)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please input a number (0-10)2\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 21,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"user_choice()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please input a number (0-10)2\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"result = user_choice()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 23,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"result\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"int\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"type(result)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Validating User Input\\n\",\n    \"\\n\",\n    \"** Check that input is valid before attempting to convert.** \\n\",\n    \"\\n\",\n    \"We'll use a simple method here.\\n\",\n    \"\\n\",\n    \"As you get more advanced, you can start looking at other ways of doing this (these methods will make more sense later on in the course, so don't worry about them for now).\\n\",\n    \"\\n\",\n    \"* [Various Posts on This](https://www.google.com/search?q=python+check+if+input+is+number)\\n\",\n    \"* [StackOverflow Post 1](https://stackoverflow.com/questions/5424716/how-to-check-if-string-input-is-a-number)\\n\",\n    \"* [StackOverflow Post 2](https://stackoverflow.com/questions/1265665/how-can-i-check-if-a-string-represents-an-int-without-using-try-except)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"some_input = '10'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 32,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Lot's of .is methods availble on string\\n\",\n    \"some_input.isdigit()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"** Edit the function to confirm against an acceptable value or type **\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def user_choice():\\n\",\n    \"    \\n\",\n    \"    # This original choice value can be anything that isn't an integer\\n\",\n    \"    choice = 'wrong'\\n\",\n    \"    \\n\",\n    \"    # While the choice is not a digit, keep asking for input.\\n\",\n    \"    while choice.isdigit() == False:\\n\",\n    \"        \\n\",\n    \"        # we shouldn't convert here, otherwise we get an error on a wrong input\\n\",\n    \"        choice = input(\\\"Choose a number: \\\")\\n\",\n    \"    \\n\",\n    \"    # We can convert once the while loop above has confirmed we have a digit.\\n\",\n    \"    return int(choice)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 38,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Choose a number: hello\\n\",\n      \"Choose a number: two\\n\",\n      \"Choose a number: 2\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 38,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"user_choice()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Let's try adding an error message within the while loop!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def user_choice():\\n\",\n    \"    \\n\",\n    \"    # This original choice value can be anything that isn't an integer\\n\",\n    \"    choice = 'wrong'\\n\",\n    \"    \\n\",\n    \"    # While the choice is not a digit, keep asking for input.\\n\",\n    \"    while choice.isdigit() == False:\\n\",\n    \"        \\n\",\n    \"        # we shouldn't convert here, otherwise we get an error on a wrong input\\n\",\n    \"        choice = input(\\\"Choose a number: \\\")\\n\",\n    \"        \\n\",\n    \"        # Error Message Check\\n\",\n    \"        if choice.isdigit() == False:\\n\",\n    \"            print(\\\"Sorry, but you did not enter an integer. Please try again.\\\")\\n\",\n    \"    \\n\",\n    \"    # We can convert once the while loop above has confirmed we have a digit.\\n\",\n    \"    return int(choice)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 40,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Choose a number: two\\n\",\n      \"Sorry, but you did not enter an integer. Please try again.\\n\",\n      \"Choose a number: 2\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 40,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"user_choice()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Now let's explore how to \\\"clear\\\" the output, that way we don't see the history of the \\\"Choose a number\\\" statements.**\\n\",\n    \"\\n\",\n    \"**NOTE: Jupyter Notebook users will use the IPython method shown here. Other IDE users (PyCharm, VS, etc..) will use **\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from IPython.display import clear_output\\n\",\n    \"clear_output()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def user_choice():\\n\",\n    \"    \\n\",\n    \"    # This original choice value can be anything that isn't an integer\\n\",\n    \"    choice = 'wrong'\\n\",\n    \"    \\n\",\n    \"    # While the choice is not a digit, keep asking for input.\\n\",\n    \"    while choice.isdigit() == False:\\n\",\n    \"        \\n\",\n    \"        # we shouldn't convert here, otherwise we get an error on a wrong input\\n\",\n    \"        choice = input(\\\"Choose a number: \\\")\\n\",\n    \"        \\n\",\n    \"        if choice.isdigit() == False:\\n\",\n    \"            # THIS CLEARS THE CURRENT OUTPUT BELOW THE CELL\\n\",\n    \"            clear_output()\\n\",\n    \"            \\n\",\n    \"            print(\\\"Sorry, but you did not enter an integer. Please try again.\\\")\\n\",\n    \"            \\n\",\n    \"    \\n\",\n    \"    # Optionally you can clear everything after running the function\\n\",\n    \"    # clear_output()\\n\",\n    \"    \\n\",\n    \"    # We can convert once the while loop above has confirmed we have a digit.\\n\",\n    \"    return int(choice)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Choose a number: 2\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"user_choice()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Checking Against Multiple Possible Values**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"result = 'wrong value'\\n\",\n    \"acceptable_values = ['0','1','2']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"result in acceptable_values\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"result not in acceptable_values\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from IPython.display import clear_output\\n\",\n    \"clear_output()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def user_choice():\\n\",\n    \"    \\n\",\n    \"    # This original choice value can be anything that isn't an integer\\n\",\n    \"    choice = 'wrong'\\n\",\n    \"    \\n\",\n    \"    # While the choice is not a digit, keep asking for input.\\n\",\n    \"    while choice not in ['0','1','2']:\\n\",\n    \"        \\n\",\n    \"        # we shouldn't convert here, otherwise we get an error on a wrong input\\n\",\n    \"        choice = input(\\\"Choose one of these numbers (0,1,2): \\\")\\n\",\n    \"        \\n\",\n    \"        if choice not in ['0','1','2']:\\n\",\n    \"            # THIS CLEARS THE CURRENT OUTPUT BELOW THE CELL\\n\",\n    \"            clear_output()\\n\",\n    \"            \\n\",\n    \"            print(\\\"Sorry, but you did not choose a value in the correct range (0,1,2)\\\")\\n\",\n    \"            \\n\",\n    \"    \\n\",\n    \"    # Optionally you can clear everything after running the function\\n\",\n    \"    # clear_output()\\n\",\n    \"    \\n\",\n    \"    # We can convert once the while loop above has confirmed we have a digit.\\n\",\n    \"    return int(choice)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"scrolled\": true\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Choose one of these numbers (0,1,2): 1\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"user_choice()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### More Flexible Example\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def user_choice():\\n\",\n    \"    \\n\",\n    \"    choice ='WRONG'\\n\",\n    \"    within_range = False\\n\",\n    \"    \\n\",\n    \"    while choice.isdigit() == False or within_range == False:\\n\",\n    \"        \\n\",\n    \"    \\n\",\n    \"    \\n\",\n    \"        choice = input(\\\"Please enter a number (0-10): \\\")\\n\",\n    \"        \\n\",\n    \"        if choice.isdigit() == False:\\n\",\n    \"            print(\\\"Sorry that is not a digit!\\\")\\n\",\n    \"            \\n\",\n    \"        if choice.isdigit() == True:\\n\",\n    \"            if int(choice) in range(0,10):\\n\",\n    \"                within_range = True\\n\",\n    \"            else:\\n\",\n    \"                within_range = False\\n\",\n    \"        \\n\",\n    \"    \\n\",\n    \"    return int(choice)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please enter a number (0-10): 12\\n\",\n      \"Please enter a number (0-10): 2\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"user_choice()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"-----\\n\",\n    \"## Simple User Interaction\\n\",\n    \"\\n\",\n    \"**Finally let's combine all of these ideas to create a small game where a user can choose a \\\"position\\\" in an existing list and replace it with a value of their choice.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"game_list = [0,1,2]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def display_game(game_list):\\n\",\n    \"    print(\\\"Here is the current list\\\")\\n\",\n    \"    print(game_list)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Here is the current list\\n\",\n      \"['hi', 'no', 2]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"display_game(game_list)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def position_choice():\\n\",\n    \"    \\n\",\n    \"    # This original choice value can be anything that isn't an integer\\n\",\n    \"    choice = 'wrong'\\n\",\n    \"    \\n\",\n    \"    # While the choice is not a digit, keep asking for input.\\n\",\n    \"    while choice not in ['0','1','2']:\\n\",\n    \"        \\n\",\n    \"        # we shouldn't convert here, otherwise we get an error on a wrong input\\n\",\n    \"        choice = input(\\\"Pick a position to replace (0,1,2): \\\")\\n\",\n    \"        \\n\",\n    \"        if choice not in ['0','1','2']:\\n\",\n    \"            # THIS CLEARS THE CURRENT OUTPUT BELOW THE CELL\\n\",\n    \"            clear_output()\\n\",\n    \"            \\n\",\n    \"            print(\\\"Sorry, but you did not choose a valid position (0,1,2)\\\")\\n\",\n    \"            \\n\",\n    \"    \\n\",\n    \"    # Optionally you can clear everything after running the function\\n\",\n    \"    # clear_output()\\n\",\n    \"    \\n\",\n    \"    # We can convert once the while loop above has confirmed we have a digit.\\n\",\n    \"    return int(choice)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def replacement_choice(game_list,position):\\n\",\n    \"    \\n\",\n    \"    user_placement = input(\\\"Type a string to place at the position\\\")\\n\",\n    \"    \\n\",\n    \"    game_list[position] = user_placement\\n\",\n    \"    \\n\",\n    \"    return game_list\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def gameon_choice():\\n\",\n    \"    \\n\",\n    \"    # This original choice value can be anything that isn't a Y or N\\n\",\n    \"    choice = 'wrong'\\n\",\n    \"    \\n\",\n    \"    # While the choice is not a digit, keep asking for input.\\n\",\n    \"    while choice not in ['Y','N']:\\n\",\n    \"        \\n\",\n    \"        # we shouldn't convert here, otherwise we get an error on a wrong input\\n\",\n    \"        choice = input(\\\"Would you like to keep playing? Y or N \\\")\\n\",\n    \"\\n\",\n    \"        \\n\",\n    \"        if choice not in ['Y','N']:\\n\",\n    \"            # THIS CLEARS THE CURRENT OUTPUT BELOW THE CELL\\n\",\n    \"            clear_output()\\n\",\n    \"            \\n\",\n    \"            print(\\\"Sorry, I didn't understand. Please make sure to choose Y or N.\\\")\\n\",\n    \"            \\n\",\n    \"    \\n\",\n    \"    # Optionally you can clear everything after running the function\\n\",\n    \"    # clear_output()\\n\",\n    \"    \\n\",\n    \"    if choice == \\\"Y\\\":\\n\",\n    \"        # Game is still on\\n\",\n    \"        return True\\n\",\n    \"    else:\\n\",\n    \"        # Game is over\\n\",\n    \"        return False\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Game Logic All Together**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Here is the current list\\n\",\n      \"['34', 1, 'new value']\\n\",\n      \"Would you like to keep playing? Y or N N\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Variable to keep game playing\\n\",\n    \"game_on = True\\n\",\n    \"\\n\",\n    \"# First Game List\\n\",\n    \"game_list = [0,1,2]\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"while game_on:\\n\",\n    \"    \\n\",\n    \"    # Clear any historical output and show the game list\\n\",\n    \"    clear_output()\\n\",\n    \"    display_game(game_list)\\n\",\n    \"    \\n\",\n    \"    # Have player choose position\\n\",\n    \"    position = position_choice()\\n\",\n    \"    \\n\",\n    \"    # Rewrite that position and update game_list\\n\",\n    \"    game_list = replacement_choice(game_list,position)\\n\",\n    \"    \\n\",\n    \"    # Clear Screen and show the updated game list\\n\",\n    \"    clear_output()\\n\",\n    \"    display_game(game_list)\\n\",\n    \"    \\n\",\n    \"    # Ask if you want to keep playing\\n\",\n    \"    game_on = gameon_choice()\\n\",\n    \"    \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Great work! You now have an understanding of bringing functions and loop logics together to build a simple game. This will be expanded upon in the Milestone project!**\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "04-Milestone Project - 1/01-Milestone Project 1 - Assignment.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Milestone Project 1\\n\",\n    \"## Congratulations on making it to your first milestone!\\n\",\n    \"You've already learned a ton and are ready to work on a real project.\\n\",\n    \"\\n\",\n    \"Your assignment: Create a Tic Tac Toe game. You are free to use any IDE you like.\\n\",\n    \"\\n\",\n    \"Here are the requirements:\\n\",\n    \"\\n\",\n    \"* 2 players should be able to play the game (both sitting at the same computer)\\n\",\n    \"* The board should be printed out every time a player makes a move\\n\",\n    \"* You should be able to accept input of the player position and then place a symbol on the board\\n\",\n    \"\\n\",\n    \"Feel free to use Google or any chatbot to help you figure anything out (but don't just ask \\\"Tic Tac Toe in Python\\\" otherwise you won't learn anything!) Keep in mind that this project can take anywhere between several hours to several days.\\n\",\n    \"\\n\",\n    \"There are 4 Jupyter Notebooks related to this assignment:\\n\",\n    \"\\n\",\n    \"* This Assignment Notebook\\n\",\n    \"* A \\\"Walkthrough Steps Workbook\\\" Notebook\\n\",\n    \"* A \\\"Complete Walkthrough Solution\\\" Notebook\\n\",\n    \"* An \\\"Advanced Solution\\\" Notebook\\n\",\n    \"\\n\",\n    \"I encourage you to just try to start the project on your own without referencing any of the notebooks. If you get stuck, check out the next lecture which is a text lecture with helpful hints and steps. If you're still stuck after that, then check out the Walkthrough Steps Workbook, which breaks up the project in steps for you to solve. Still stuck? Then check out the Complete Walkthrough Solution video for more help on approaching the project!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There are parts of this that will be a struggle...and that is good! I have complete faith that if you have made it this far through the course you have all the tools and knowledge to tackle this project. Remember, it's totally open book, so take your time, do a little research, and remember:\\n\",\n    \"\\n\",\n    \"## HAVE FUN!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python [conda env:base] *\",\n   \"language\": \"python\",\n   \"name\": \"conda-base-py\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.12.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "04-Milestone Project - 1/02-Milestone Project 1 - Walkthrough Steps Workbook.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Milestone Project 1: Walkthrough Steps Workbook\\n\",\n    \"\\n\",\n    \"Below is a set of steps for you to follow to try to create the Tic Tac Toe Milestone Project game!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Some suggested tools before you get started:\\n\",\n    \"To take input from a user:\\n\",\n    \"\\n\",\n    \"    player1 = input(\\\"Please pick a marker 'X' or 'O'\\\")\\n\",\n    \"    \\n\",\n    \"Note that input() takes in a string. If you need an integer value, use\\n\",\n    \"\\n\",\n    \"    position = int(input('Please enter a number'))\\n\",\n    \"    \\n\",\n    \"<br>To clear the screen between moves:\\n\",\n    \"\\n\",\n    \"    from IPython.display import clear_output\\n\",\n    \"    clear_output()\\n\",\n    \"    \\n\",\n    \"Note that clear_output() will only work in jupyter. To clear the screen in other IDEs, consider:\\n\",\n    \"\\n\",\n    \"    print('\\\\n'*100)\\n\",\n    \"    \\n\",\n    \"This scrolls the previous board up out of view. Now on to the program!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 1: Write a function that can print out a board. Set up your board as a list, where each index 1-9 corresponds with a number on a number pad, so you get a 3 by 3 board representation.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from IPython.display import clear_output\\n\",\n    \"\\n\",\n    \"def display_board(board):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TEST Step 1:** run your function on a test version of the board list, and make adjustments as necessary\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"test_board = ['#','X','O','X','O','X','O','X','O','X']\\n\",\n    \"display_board(test_board)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 2: Write a function that can take in a player input and assign their marker as 'X' or 'O'. Think about using *while* loops to continually ask until you get a correct answer.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def player_input():\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TEST Step 2:** run the function to make sure it returns the desired output\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"player_input()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 3: Write a function that takes in the board list object, a marker ('X' or 'O'), and a desired position (number 1-9) and assigns it to the board.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def place_marker(board, marker, position):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TEST Step 3:** run the place marker function using test parameters and display the modified board\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"place_marker(test_board,'$',8)\\n\",\n    \"display_board(test_board)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 4: Write a function that takes in a board and a mark (X or O) and then checks to see if that mark has won. **\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def win_check(board, mark):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TEST Step 4:** run the win_check function against our test_board - it should return True\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"win_check(test_board,'X')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 5: Write a function that uses the random module to randomly decide which player goes first. You may want to lookup random.randint() Return a string of which player went first.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import random\\n\",\n    \"\\n\",\n    \"def choose_first():\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 6: Write a function that returns a boolean indicating whether a space on the board is freely available.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def space_check(board, position):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 7: Write a function that checks if the board is full and returns a boolean value. True if full, False otherwise.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def full_board_check(board):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 8: Write a function that asks for a player's next position (as a number 1-9) and then uses the function from step 6 to check if it's a free position. If it is, then return the position for later use.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def player_choice(board):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 9: Write a function that asks the player if they want to play again and returns a boolean True if they do want to play again.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def replay():\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"**Step 10: Here comes the hard part! Use while loops and the functions you've made to run the game!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"print('Welcome to Tic Tac Toe!')\\n\",\n    \"\\n\",\n    \"#while True:\\n\",\n    \"    # Set the game up here\\n\",\n    \"    #pass\\n\",\n    \"\\n\",\n    \"    #while game_on:\\n\",\n    \"        #Player 1 Turn\\n\",\n    \"        \\n\",\n    \"        \\n\",\n    \"        # Player2's turn.\\n\",\n    \"            \\n\",\n    \"            #pass\\n\",\n    \"\\n\",\n    \"    #if not replay():\\n\",\n    \"        #break\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## Good Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "04-Milestone Project - 1/03-Milestone Project 1 - Complete Walkthrough Solution.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Milestone Project 1: Full Walk-through Code Solution\\n\",\n    \"\\n\",\n    \"Below is the filled in code that goes along with the complete walk-through video. Check out the corresponding lecture videos for more information on this code!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 1: Write a function that can print out a board. Set up your board as a list, where each index 1-9 corresponds with a number on a number pad, so you get a 3 by 3 board representation.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from IPython.display import clear_output\\n\",\n    \"\\n\",\n    \"def display_board(board):\\n\",\n    \"    clear_output()  # Remember, this only works in jupyter!\\n\",\n    \"    \\n\",\n    \"    print('   |   |')\\n\",\n    \"    print(' ' + board[7] + ' | ' + board[8] + ' | ' + board[9])\\n\",\n    \"    print('   |   |')\\n\",\n    \"    print('-----------')\\n\",\n    \"    print('   |   |')\\n\",\n    \"    print(' ' + board[4] + ' | ' + board[5] + ' | ' + board[6])\\n\",\n    \"    print('   |   |')\\n\",\n    \"    print('-----------')\\n\",\n    \"    print('   |   |')\\n\",\n    \"    print(' ' + board[1] + ' | ' + board[2] + ' | ' + board[3])\\n\",\n    \"    print('   |   |')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TEST Step 1:** run your function on a test version of the board list, and make adjustments as necessary\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"   |   |\\n\",\n      \" X | O | X\\n\",\n      \"   |   |\\n\",\n      \"-----------\\n\",\n      \"   |   |\\n\",\n      \" O | X | O\\n\",\n      \"   |   |\\n\",\n      \"-----------\\n\",\n      \"   |   |\\n\",\n      \" X | O | X\\n\",\n      \"   |   |\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"test_board = ['#','X','O','X','O','X','O','X','O','X']\\n\",\n    \"display_board(test_board)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 2: Write a function that can take in a player input and assign their marker as 'X' or 'O'. Think about using *while* loops to continually ask until you get a correct answer.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def player_input():\\n\",\n    \"    marker = ''\\n\",\n    \"    \\n\",\n    \"    while not (marker == 'X' or marker == 'O'):\\n\",\n    \"        marker = input('Player 1: Do you want to be X or O? ').upper()\\n\",\n    \"\\n\",\n    \"    if marker == 'X':\\n\",\n    \"        return ('X', 'O')\\n\",\n    \"    else:\\n\",\n    \"        return ('O', 'X')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TEST Step 2:** run the function to make sure it returns the desired output\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Player 1: Do you want to be X or O? X\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"('X', 'O')\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"player_input()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 3: Write a function that takes in the board list object, a marker ('X' or 'O'), and a desired position (number 1-9) and assigns it to the board.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def place_marker(board, marker, position):\\n\",\n    \"    board[position] = marker\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TEST Step 3:** run the place marker function using test parameters and display the modified board\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"   |   |\\n\",\n      \" X | $ | X\\n\",\n      \"   |   |\\n\",\n      \"-----------\\n\",\n      \"   |   |\\n\",\n      \" O | X | O\\n\",\n      \"   |   |\\n\",\n      \"-----------\\n\",\n      \"   |   |\\n\",\n      \" X | O | X\\n\",\n      \"   |   |\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"place_marker(test_board,'$',8)\\n\",\n    \"display_board(test_board)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 4: Write a function that takes in a board and checks to see if someone has won. **\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def win_check(board,mark):\\n\",\n    \"    \\n\",\n    \"    return ((board[7] == mark and board[8] == mark and board[9] == mark) or # across the top\\n\",\n    \"    (board[4] == mark and board[5] == mark and board[6] == mark) or # across the middle\\n\",\n    \"    (board[1] == mark and board[2] == mark and board[3] == mark) or # across the bottom\\n\",\n    \"    (board[7] == mark and board[4] == mark and board[1] == mark) or # down the middle\\n\",\n    \"    (board[8] == mark and board[5] == mark and board[2] == mark) or # down the middle\\n\",\n    \"    (board[9] == mark and board[6] == mark and board[3] == mark) or # down the right side\\n\",\n    \"    (board[7] == mark and board[5] == mark and board[3] == mark) or # diagonal\\n\",\n    \"    (board[9] == mark and board[5] == mark and board[1] == mark)) # diagonal\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TEST Step 4:** run the win_check function against our test_board - it should return True\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"win_check(test_board,'X')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 5: Write a function that uses the random module to randomly decide which player goes first. You may want to lookup random.randint() Return a string of which player went first.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import random\\n\",\n    \"\\n\",\n    \"def choose_first():\\n\",\n    \"    if random.randint(0, 1) == 0:\\n\",\n    \"        return 'Player 2'\\n\",\n    \"    else:\\n\",\n    \"        return 'Player 1'\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 6: Write a function that returns a boolean indicating whether a space on the board is freely available.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def space_check(board, position):\\n\",\n    \"    \\n\",\n    \"    return board[position] == ' '\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 7: Write a function that checks if the board is full and returns a boolean value. True if full, False otherwise.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def full_board_check(board):\\n\",\n    \"    for i in range(1,10):\\n\",\n    \"        if space_check(board, i):\\n\",\n    \"            return False\\n\",\n    \"    return True\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 8: Write a function that asks for a player's next position (as a number 1-9) and then uses the function from step 6 to check if its a free position. If it is, then return the position for later use. **\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def player_choice(board):\\n\",\n    \"    position = 0\\n\",\n    \"    \\n\",\n    \"    while position not in [1,2,3,4,5,6,7,8,9] or not space_check(board, position):\\n\",\n    \"        position = int(input('Choose your next position: (1-9) '))\\n\",\n    \"        \\n\",\n    \"    return position\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 9: Write a function that asks the player if they want to play again and returns a boolean True if they do want to play again.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def replay():\\n\",\n    \"    \\n\",\n    \"    return input('Do you want to play again? Enter Yes or No: ').lower().startswith('y')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"**Step 10: Here comes the hard part! Use while loops and the functions you've made to run the game!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"   |   |\\n\",\n      \"   | O | O\\n\",\n      \"   |   |\\n\",\n      \"-----------\\n\",\n      \"   |   |\\n\",\n      \"   |   |  \\n\",\n      \"   |   |\\n\",\n      \"-----------\\n\",\n      \"   |   |\\n\",\n      \" X | X | X\\n\",\n      \"   |   |\\n\",\n      \"Congratulations! You have won the game!\\n\",\n      \"Do you want to play again? Enter Yes or No: No\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('Welcome to Tic Tac Toe!')\\n\",\n    \"\\n\",\n    \"while True:\\n\",\n    \"    # Reset the board\\n\",\n    \"    theBoard = [' '] * 10\\n\",\n    \"    player1_marker, player2_marker = player_input()\\n\",\n    \"    turn = choose_first()\\n\",\n    \"    print(turn + ' will go first.')\\n\",\n    \"    \\n\",\n    \"    play_game = input('Are you ready to play? Enter Yes or No.')\\n\",\n    \"    \\n\",\n    \"    if play_game.lower()[0] == 'y':\\n\",\n    \"        game_on = True\\n\",\n    \"    else:\\n\",\n    \"        game_on = False\\n\",\n    \"\\n\",\n    \"    while game_on:\\n\",\n    \"        if turn == 'Player 1':\\n\",\n    \"            # Player1's turn.\\n\",\n    \"            \\n\",\n    \"            display_board(theBoard)\\n\",\n    \"            position = player_choice(theBoard)\\n\",\n    \"            place_marker(theBoard, player1_marker, position)\\n\",\n    \"\\n\",\n    \"            if win_check(theBoard, player1_marker):\\n\",\n    \"                display_board(theBoard)\\n\",\n    \"                print('Congratulations! You have won the game!')\\n\",\n    \"                game_on = False\\n\",\n    \"            else:\\n\",\n    \"                if full_board_check(theBoard):\\n\",\n    \"                    display_board(theBoard)\\n\",\n    \"                    print('The game is a draw!')\\n\",\n    \"                    break\\n\",\n    \"                else:\\n\",\n    \"                    turn = 'Player 2'\\n\",\n    \"\\n\",\n    \"        else:\\n\",\n    \"            # Player2's turn.\\n\",\n    \"            \\n\",\n    \"            display_board(theBoard)\\n\",\n    \"            position = player_choice(theBoard)\\n\",\n    \"            place_marker(theBoard, player2_marker, position)\\n\",\n    \"\\n\",\n    \"            if win_check(theBoard, player2_marker):\\n\",\n    \"                display_board(theBoard)\\n\",\n    \"                print('Player 2 has won!')\\n\",\n    \"                game_on = False\\n\",\n    \"            else:\\n\",\n    \"                if full_board_check(theBoard):\\n\",\n    \"                    display_board(theBoard)\\n\",\n    \"                    print('The game is a draw!')\\n\",\n    \"                    break\\n\",\n    \"                else:\\n\",\n    \"                    turn = 'Player 1'\\n\",\n    \"\\n\",\n    \"    if not replay():\\n\",\n    \"        break\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## Good Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"anaconda-cloud\": {},\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "05-Object Oriented Programming/.ipynb_checkpoints/01-Object Oriented Programming-Copy1-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# Object Oriented Programming\\n\",\n    \"\\n\",\n    \"Object Oriented Programming (OOP) tends to be one of the major obstacles for beginners when they are first starting to learn Python.\\n\",\n    \"\\n\",\n    \"There are many, many tutorials and lessons covering OOP so feel free to Google search other lessons, and I have also put some links to other useful tutorials online at the bottom of this Notebook.\\n\",\n    \"\\n\",\n    \"For this lesson we will construct our knowledge of OOP in Python by building on the following topics:\\n\",\n    \"\\n\",\n    \"* Objects\\n\",\n    \"* Using the *class* keyword\\n\",\n    \"* Creating class attributes\\n\",\n    \"* Creating methods in a class\\n\",\n    \"* Learning about Inheritance\\n\",\n    \"* Learning about Special Methods for classes\\n\",\n    \"\\n\",\n    \"Lets start the lesson by remembering about the Basic Python Objects. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"lst = [1,2,3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Remember how we could call methods on a list?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lst.count(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What we will basically be doing in this lecture is exploring how we could create an Object type like a list. We've already learned about how to create functions. So let's explore Objects in general:\\n\",\n    \"\\n\",\n    \"## Objects\\n\",\n    \"In Python, *everything is an object*. Remember from previous lectures we can use type() to check the type of object something is:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<class 'int'>\\n\",\n      \"<class 'list'>\\n\",\n      \"<class 'tuple'>\\n\",\n      \"<class 'dict'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(type(1))\\n\",\n    \"print(type([]))\\n\",\n    \"print(type(()))\\n\",\n    \"print(type({}))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"So we know all these things are objects, so how can we create our own Object types? That is where the <code>class</code> keyword comes in.\\n\",\n    \"## class\\n\",\n    \"User defined objects are created using the <code>class</code> keyword. The class is a blueprint that defines the nature of a future object. From classes we can construct instances. An instance is a specific object created from a particular class. For example, above we created the object <code>lst</code> which was an instance of a list object. \\n\",\n    \"\\n\",\n    \"Let see how we can use <code>class</code>:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<class '__main__.Sample'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Create a new object type called Sample\\n\",\n    \"class Sample:\\n\",\n    \"    pass\\n\",\n    \"\\n\",\n    \"# Instance of Sample\\n\",\n    \"x = Sample()\\n\",\n    \"\\n\",\n    \"print(type(x))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"By convention we give classes a name that starts with a capital letter. Note how <code>x</code> is now the reference to our new instance of a Sample class. In other words, we **instantiate** the Sample class.\\n\",\n    \"\\n\",\n    \"Inside of the class we currently just have pass. But we can define class attributes and methods.\\n\",\n    \"\\n\",\n    \"An **attribute** is a characteristic of an object.\\n\",\n    \"A **method** is an operation we can perform with the object.\\n\",\n    \"\\n\",\n    \"For example, we can create a class called Dog. An attribute of a dog may be its breed or its name, while a method of a dog may be defined by a .bark() method which returns a sound.\\n\",\n    \"\\n\",\n    \"Let's get a better understanding of attributes through an example.\\n\",\n    \"\\n\",\n    \"## Attributes\\n\",\n    \"The syntax for creating an attribute is:\\n\",\n    \"    \\n\",\n    \"    self.attribute = something\\n\",\n    \"    \\n\",\n    \"There is a special method called:\\n\",\n    \"\\n\",\n    \"    __init__()\\n\",\n    \"\\n\",\n    \"This method is used to initialize the attributes of an object. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"class Dog:\\n\",\n    \"    def __init__(self,breed):\\n\",\n    \"        self.breed = breed\\n\",\n    \"        \\n\",\n    \"sam = Dog(breed='Lab')\\n\",\n    \"frank = Dog(breed='Huskie')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Lets break down what we have above.The special method \\n\",\n    \"\\n\",\n    \"    __init__() \\n\",\n    \"is called automatically right after the object has been created:\\n\",\n    \"\\n\",\n    \"    def __init__(self, breed):\\n\",\n    \"Each attribute in a class definition begins with a reference to the instance object. It is by convention named self. The breed is the argument. The value is passed during the class instantiation.\\n\",\n    \"\\n\",\n    \"     self.breed = breed\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we have created two instances of the Dog class. With two breed types, we can then access these attributes like this:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Lab'\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sam.breed\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Huskie'\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"frank.breed\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how we don't have any parentheses after breed; this is because it is an attribute and doesn't take any arguments.\\n\",\n    \"\\n\",\n    \"In Python there are also *class object attributes*. These Class Object Attributes are the same for any instance of the class. For example, we could create the attribute *species* for the Dog class. Dogs, regardless of their breed, name, or other attributes, will always be mammals. We apply this logic in the following manner:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"class Dog:\\n\",\n    \"    \\n\",\n    \"    # Class Object Attribute\\n\",\n    \"    species = 'mammal'\\n\",\n    \"    \\n\",\n    \"    def __init__(self,breed,name):\\n\",\n    \"        self.breed = breed\\n\",\n    \"        self.name = name\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"sam = Dog('Lab','Sam')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Sam'\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sam.name\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note that the Class Object Attribute is defined outside of any methods in the class. Also by convention, we place them first before the init.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'mammal'\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sam.species\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Methods\\n\",\n    \"\\n\",\n    \"Methods are functions defined inside the body of a class. They are used to perform operations with the attributes of our objects. Methods are a key concept of the OOP paradigm. They are essential to dividing responsibilities in programming, especially in large applications.\\n\",\n    \"\\n\",\n    \"You can basically think of methods as functions acting on an Object that take the Object itself into account through its *self* argument.\\n\",\n    \"\\n\",\n    \"Let's go through an example of creating a Circle class:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Radius is:  1\\n\",\n      \"Area is:  3.14\\n\",\n      \"Circumference is:  6.28\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"class Circle:\\n\",\n    \"    pi = 3.14\\n\",\n    \"\\n\",\n    \"    # Circle gets instantiated with a radius (default is 1)\\n\",\n    \"    def __init__(self, radius=1):\\n\",\n    \"        self.radius = radius \\n\",\n    \"        self.area = radius * radius * Circle.pi\\n\",\n    \"\\n\",\n    \"    # Method for resetting Radius\\n\",\n    \"    def setRadius(self, new_radius):\\n\",\n    \"        self.radius = new_radius\\n\",\n    \"        self.area = new_radius * new_radius * self.pi\\n\",\n    \"\\n\",\n    \"    # Method for getting Circumference\\n\",\n    \"    def getCircumference(self):\\n\",\n    \"        return self.radius * self.pi * 2\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"c = Circle()\\n\",\n    \"\\n\",\n    \"print('Radius is: ',c.radius)\\n\",\n    \"print('Area is: ',c.area)\\n\",\n    \"print('Circumference is: ',c.getCircumference())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In the \\\\__init__ method above, in order to calculate the area attribute, we had to call Circle.pi. This is because the object does not yet have its own .pi attribute, so we call the Class Object Attribute pi instead.<br>\\n\",\n    \"In the setRadius method, however, we'll be working with an existing Circle object that does have its own pi attribute. Here we can use either Circle.pi or self.pi.<br><br>\\n\",\n    \"Now let's change the radius and see how that affects our Circle object:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Radius is:  2\\n\",\n      \"Area is:  12.56\\n\",\n      \"Circumference is:  12.56\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"c.setRadius(2)\\n\",\n    \"\\n\",\n    \"print('Radius is: ',c.radius)\\n\",\n    \"print('Area is: ',c.area)\\n\",\n    \"print('Circumference is: ',c.getCircumference())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Notice how we used self. notation to reference attributes of the class within the method calls. Review how the code above works and try creating your own method.\\n\",\n    \"\\n\",\n    \"## Inheritance\\n\",\n    \"\\n\",\n    \"Inheritance is a way to form new classes using classes that have already been defined. The newly formed classes are called derived classes, the classes that we derive from are called base classes. Important benefits of inheritance are code reuse and reduction of complexity of a program. The derived classes (descendants) override or extend the functionality of base classes (ancestors).\\n\",\n    \"\\n\",\n    \"Let's see an example by incorporating our previous work on the Dog class:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"class Animal:\\n\",\n    \"    def __init__(self):\\n\",\n    \"        print(\\\"Animal created\\\")\\n\",\n    \"\\n\",\n    \"    def whoAmI(self):\\n\",\n    \"        print(\\\"Animal\\\")\\n\",\n    \"\\n\",\n    \"    def eat(self):\\n\",\n    \"        print(\\\"Eating\\\")\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"class Dog(Animal):\\n\",\n    \"    def __init__(self):\\n\",\n    \"        Animal.__init__(self)\\n\",\n    \"        print(\\\"Dog created\\\")\\n\",\n    \"\\n\",\n    \"    def whoAmI(self):\\n\",\n    \"        print(\\\"Dog\\\")\\n\",\n    \"\\n\",\n    \"    def bark(self):\\n\",\n    \"        print(\\\"Woof!\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Animal created\\n\",\n      \"Dog created\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"d = Dog()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Dog\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"d.whoAmI()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Eating\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"d.eat()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Woof!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"d.bark()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In this example, we have two classes: Animal and Dog. The Animal is the base class, the Dog is the derived class. \\n\",\n    \"\\n\",\n    \"The derived class inherits the functionality of the base class. \\n\",\n    \"\\n\",\n    \"* It is shown by the eat() method. \\n\",\n    \"\\n\",\n    \"The derived class modifies existing behavior of the base class.\\n\",\n    \"\\n\",\n    \"* shown by the whoAmI() method. \\n\",\n    \"\\n\",\n    \"Finally, the derived class extends the functionality of the base class, by defining a new bark() method.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Polymorphism\\n\",\n    \"\\n\",\n    \"We've learned that while functions can take in different arguments, methods belong to the objects they act on. In Python, *polymorphism* refers to the way in which different object classes can share the same method name, and those methods can be called from the same place even though a variety of different objects might be passed in. The best way to explain this is by example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Niko says Woof!\\n\",\n      \"Felix says Meow!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"class Dog:\\n\",\n    \"    def __init__(self, name):\\n\",\n    \"        self.name = name\\n\",\n    \"\\n\",\n    \"    def speak(self):\\n\",\n    \"        return self.name+' says Woof!'\\n\",\n    \"    \\n\",\n    \"class Cat:\\n\",\n    \"    def __init__(self, name):\\n\",\n    \"        self.name = name\\n\",\n    \"\\n\",\n    \"    def speak(self):\\n\",\n    \"        return self.name+' says Meow!' \\n\",\n    \"    \\n\",\n    \"niko = Dog('Niko')\\n\",\n    \"felix = Cat('Felix')\\n\",\n    \"\\n\",\n    \"print(niko.speak())\\n\",\n    \"print(felix.speak())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Here we have a Dog class and a Cat class, and each has a `.speak()` method. When called, each object's `.speak()` method returns a result unique to the object.\\n\",\n    \"\\n\",\n    \"There a few different ways to demonstrate polymorphism. First, with a for loop:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Niko says Woof!\\n\",\n      \"Felix says Meow!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for pet in [niko,felix]:\\n\",\n    \"    print(pet.speak())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Another is with functions:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Niko says Woof!\\n\",\n      \"Felix says Meow!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"def pet_speak(pet):\\n\",\n    \"    print(pet.speak())\\n\",\n    \"\\n\",\n    \"pet_speak(niko)\\n\",\n    \"pet_speak(felix)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"In both cases we were able to pass in different object types, and we obtained object-specific results from the same mechanism.\\n\",\n    \"\\n\",\n    \"A more common practice is to use abstract classes and inheritance. An abstract class is one that never expects to be instantiated. For example, we will never have an Animal object, only Dog and Cat objects, although Dogs and Cats are derived from Animals:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Fido says Woof!\\n\",\n      \"Isis says Meow!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"class Animal:\\n\",\n    \"    def __init__(self, name):    # Constructor of the class\\n\",\n    \"        self.name = name\\n\",\n    \"\\n\",\n    \"    def speak(self):              # Abstract method, defined by convention only\\n\",\n    \"        raise NotImplementedError(\\\"Subclass must implement abstract method\\\")\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"class Dog(Animal):\\n\",\n    \"    \\n\",\n    \"    def speak(self):\\n\",\n    \"        return self.name+' says Woof!'\\n\",\n    \"    \\n\",\n    \"class Cat(Animal):\\n\",\n    \"\\n\",\n    \"    def speak(self):\\n\",\n    \"        return self.name+' says Meow!'\\n\",\n    \"    \\n\",\n    \"fido = Dog('Fido')\\n\",\n    \"isis = Cat('Isis')\\n\",\n    \"\\n\",\n    \"print(fido.speak())\\n\",\n    \"print(isis.speak())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Real life examples of polymorphism include:\\n\",\n    \"* opening different file types - different tools are needed to display Word, pdf and Excel files\\n\",\n    \"* adding different objects - the `+` operator performs arithmetic and concatenation\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Special Methods\\n\",\n    \"Finally let's go over special methods. Classes in Python can implement certain operations with special method names. These methods are not actually called directly but by Python specific language syntax. For example let's create a Book class:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"class Book:\\n\",\n    \"    def __init__(self, title, author, pages):\\n\",\n    \"        print(\\\"A book is created\\\")\\n\",\n    \"        self.title = title\\n\",\n    \"        self.author = author\\n\",\n    \"        self.pages = pages\\n\",\n    \"\\n\",\n    \"    def __str__(self):\\n\",\n    \"        return \\\"Title: %s, author: %s, pages: %s\\\" %(self.title, self.author, self.pages)\\n\",\n    \"\\n\",\n    \"    def __len__(self):\\n\",\n    \"        return self.pages\\n\",\n    \"\\n\",\n    \"    def __del__(self):\\n\",\n    \"        print(\\\"A book is destroyed\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"A book is created\\n\",\n      \"Title: Python Rocks!, author: Jose Portilla, pages: 159\\n\",\n      \"159\\n\",\n      \"A book is destroyed\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"book = Book(\\\"Python Rocks!\\\", \\\"Jose Portilla\\\", 159)\\n\",\n    \"\\n\",\n    \"#Special Methods\\n\",\n    \"print(book)\\n\",\n    \"print(len(book))\\n\",\n    \"del book\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"    The __init__(), __str__(), __len__() and __del__() methods\\n\",\n    \"These special methods are defined by their use of underscores. They allow us to use Python specific functions on objects created through our class.\\n\",\n    \"\\n\",\n    \"**Great! After this lecture you should have a basic understanding of how to create your own objects with class in Python. You will be utilizing this heavily in your next milestone project!**\\n\",\n    \"\\n\",\n    \"For more great resources on this topic, check out:\\n\",\n    \"\\n\",\n    \"[Mozilla's Post](https://developer.mozilla.org/en-US/Learn/Python/Quickly_Learn_Object_Oriented_Programming)\\n\",\n    \"\\n\",\n    \"[Tutorial's Point](http://www.tutorialspoint.com/python/python_classes_objects.htm)\\n\",\n    \"\\n\",\n    \"[Official Documentation](https://docs.python.org/3/tutorial/classes.html)\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "05-Object Oriented Programming/.ipynb_checkpoints/01-Object Oriented Programming-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# Object Oriented Programming\\n\",\n    \"\\n\",\n    \"Object Oriented Programming (OOP) tends to be one of the major obstacles for beginners when they are first starting to learn Python.\\n\",\n    \"\\n\",\n    \"There are many, many tutorials and lessons covering OOP so feel free to Google search other lessons, and I have also put some links to other useful tutorials online at the bottom of this Notebook.\\n\",\n    \"\\n\",\n    \"For this lesson we will construct our knowledge of OOP in Python by building on the following topics:\\n\",\n    \"\\n\",\n    \"* Objects\\n\",\n    \"* Using the *class* keyword\\n\",\n    \"* Creating class attributes\\n\",\n    \"* Creating methods in a class\\n\",\n    \"* Learning about Inheritance\\n\",\n    \"* Learning about Polymorphism\\n\",\n    \"* Learning about Special Methods for classes\\n\",\n    \"\\n\",\n    \"Lets start the lesson by remembering about the Basic Python Objects. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"lst = [1,2,3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Remember how we could call methods on a list?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lst.count(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What we will basically be doing in this lecture is exploring how we could create an Object type like a list. We've already learned about how to create functions. So let's explore Objects in general:\\n\",\n    \"\\n\",\n    \"## Objects\\n\",\n    \"In Python, *everything is an object*. Remember from previous lectures we can use type() to check the type of object something is:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<class 'int'>\\n\",\n      \"<class 'list'>\\n\",\n      \"<class 'tuple'>\\n\",\n      \"<class 'dict'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(type(1))\\n\",\n    \"print(type([]))\\n\",\n    \"print(type(()))\\n\",\n    \"print(type({}))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"So we know all these things are objects, so how can we create our own Object types? That is where the <code>class</code> keyword comes in.\\n\",\n    \"## class\\n\",\n    \"User defined objects are created using the <code>class</code> keyword. The class is a blueprint that defines the nature of a future object. From classes we can construct instances. An instance is a specific object created from a particular class. For example, above we created the object <code>lst</code> which was an instance of a list object. \\n\",\n    \"\\n\",\n    \"Let see how we can use <code>class</code>:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<class '__main__.Sample'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Create a new object type called Sample\\n\",\n    \"class Sample:\\n\",\n    \"    pass\\n\",\n    \"\\n\",\n    \"# Instance of Sample\\n\",\n    \"x = Sample()\\n\",\n    \"\\n\",\n    \"print(type(x))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"By convention we give classes a name that starts with a capital letter. Note how <code>x</code> is now the reference to our new instance of a Sample class. In other words, we **instantiate** the Sample class.\\n\",\n    \"\\n\",\n    \"Inside of the class we currently just have pass. But we can define class attributes and methods.\\n\",\n    \"\\n\",\n    \"An **attribute** is a characteristic of an object.\\n\",\n    \"A **method** is an operation we can perform with the object.\\n\",\n    \"\\n\",\n    \"For example, we can create a class called Dog. An attribute of a dog may be its breed or its name, while a method of a dog may be defined by a .bark() method which returns a sound.\\n\",\n    \"\\n\",\n    \"Let's get a better understanding of attributes through an example.\\n\",\n    \"\\n\",\n    \"## Attributes\\n\",\n    \"The syntax for creating an attribute is:\\n\",\n    \"    \\n\",\n    \"    self.attribute = something\\n\",\n    \"    \\n\",\n    \"There is a special method called:\\n\",\n    \"\\n\",\n    \"    __init__()\\n\",\n    \"\\n\",\n    \"This method is used to initialize the attributes of an object. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Dog:\\n\",\n    \"    def __init__(self,breed):\\n\",\n    \"        self.breed = breed\\n\",\n    \"        \\n\",\n    \"sam = Dog(breed='Lab')\\n\",\n    \"frank = Dog(breed='Huskie')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Lets break down what we have above.The special method \\n\",\n    \"\\n\",\n    \"    __init__() \\n\",\n    \"is called automatically right after the object has been created:\\n\",\n    \"\\n\",\n    \"    def __init__(self, breed):\\n\",\n    \"Each attribute in a class definition begins with a reference to the instance object. It is by convention named self. The breed is the argument. The value is passed during the class instantiation.\\n\",\n    \"\\n\",\n    \"     self.breed = breed\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we have created two instances of the Dog class. With two breed types, we can then access these attributes like this:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Lab'\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sam.breed\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Huskie'\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"frank.breed\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how we don't have any parentheses after breed; this is because it is an attribute and doesn't take any arguments.\\n\",\n    \"\\n\",\n    \"In Python there are also *class object attributes*. These Class Object Attributes are the same for any instance of the class. For example, we could create the attribute *species* for the Dog class. Dogs, regardless of their breed, name, or other attributes, will always be mammals. We apply this logic in the following manner:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Dog:\\n\",\n    \"    \\n\",\n    \"    # Class Object Attribute\\n\",\n    \"    species = 'mammal'\\n\",\n    \"    \\n\",\n    \"    def __init__(self,breed,name):\\n\",\n    \"        self.breed = breed\\n\",\n    \"        self.name = name\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"sam = Dog('Lab','Sam')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Sam'\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sam.name\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note that the Class Object Attribute is defined outside of any methods in the class. Also by convention, we place them first before the init.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'mammal'\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sam.species\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Methods\\n\",\n    \"\\n\",\n    \"Methods are functions defined inside the body of a class. They are used to perform operations with the attributes of our objects. Methods are a key concept of the OOP paradigm. They are essential to dividing responsibilities in programming, especially in large applications.\\n\",\n    \"\\n\",\n    \"You can basically think of methods as functions acting on an Object that take the Object itself into account through its *self* argument.\\n\",\n    \"\\n\",\n    \"Let's go through an example of creating a Circle class:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Radius is:  1\\n\",\n      \"Area is:  3.14\\n\",\n      \"Circumference is:  6.28\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"class Circle:\\n\",\n    \"    pi = 3.14\\n\",\n    \"\\n\",\n    \"    # Circle gets instantiated with a radius (default is 1)\\n\",\n    \"    def __init__(self, radius=1):\\n\",\n    \"        self.radius = radius \\n\",\n    \"        self.area = radius * radius * Circle.pi\\n\",\n    \"\\n\",\n    \"    # Method for resetting Radius\\n\",\n    \"    def setRadius(self, new_radius):\\n\",\n    \"        self.radius = new_radius\\n\",\n    \"        self.area = new_radius * new_radius * self.pi\\n\",\n    \"\\n\",\n    \"    # Method for getting Circumference\\n\",\n    \"    def getCircumference(self):\\n\",\n    \"        return self.radius * self.pi * 2\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"c = Circle()\\n\",\n    \"\\n\",\n    \"print('Radius is: ',c.radius)\\n\",\n    \"print('Area is: ',c.area)\\n\",\n    \"print('Circumference is: ',c.getCircumference())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In the \\\\__init__ method above, in order to calculate the area attribute, we had to call Circle.pi. This is because the object does not yet have its own .pi attribute, so we call the Class Object Attribute pi instead.<br>\\n\",\n    \"In the setRadius method, however, we'll be working with an existing Circle object that does have its own pi attribute. Here we can use either Circle.pi or self.pi.<br><br>\\n\",\n    \"Now let's change the radius and see how that affects our Circle object:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Radius is:  2\\n\",\n      \"Area is:  12.56\\n\",\n      \"Circumference is:  12.56\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"c.setRadius(2)\\n\",\n    \"\\n\",\n    \"print('Radius is: ',c.radius)\\n\",\n    \"print('Area is: ',c.area)\\n\",\n    \"print('Circumference is: ',c.getCircumference())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Notice how we used self. notation to reference attributes of the class within the method calls. Review how the code above works and try creating your own method.\\n\",\n    \"\\n\",\n    \"## Inheritance\\n\",\n    \"\\n\",\n    \"Inheritance is a way to form new classes using classes that have already been defined. The newly formed classes are called derived classes, the classes that we derive from are called base classes. Important benefits of inheritance are code reuse and reduction of complexity of a program. The derived classes (descendants) override or extend the functionality of base classes (ancestors).\\n\",\n    \"\\n\",\n    \"Let's see an example by incorporating our previous work on the Dog class:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Animal:\\n\",\n    \"    def __init__(self):\\n\",\n    \"        print(\\\"Animal created\\\")\\n\",\n    \"\\n\",\n    \"    def whoAmI(self):\\n\",\n    \"        print(\\\"Animal\\\")\\n\",\n    \"\\n\",\n    \"    def eat(self):\\n\",\n    \"        print(\\\"Eating\\\")\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"class Dog(Animal):\\n\",\n    \"    def __init__(self):\\n\",\n    \"        Animal.__init__(self)\\n\",\n    \"        print(\\\"Dog created\\\")\\n\",\n    \"\\n\",\n    \"    def whoAmI(self):\\n\",\n    \"        print(\\\"Dog\\\")\\n\",\n    \"\\n\",\n    \"    def bark(self):\\n\",\n    \"        print(\\\"Woof!\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Animal created\\n\",\n      \"Dog created\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"d = Dog()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Dog\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"d.whoAmI()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Eating\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"d.eat()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Woof!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"d.bark()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In this example, we have two classes: Animal and Dog. The Animal is the base class, the Dog is the derived class. \\n\",\n    \"\\n\",\n    \"The derived class inherits the functionality of the base class. \\n\",\n    \"\\n\",\n    \"* It is shown by the eat() method. \\n\",\n    \"\\n\",\n    \"The derived class modifies existing behavior of the base class.\\n\",\n    \"\\n\",\n    \"* shown by the whoAmI() method. \\n\",\n    \"\\n\",\n    \"Finally, the derived class extends the functionality of the base class, by defining a new bark() method.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Polymorphism\\n\",\n    \"\\n\",\n    \"We've learned that while functions can take in different arguments, methods belong to the objects they act on. In Python, *polymorphism* refers to the way in which different object classes can share the same method name, and those methods can be called from the same place even though a variety of different objects might be passed in. The best way to explain this is by example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Niko says Woof!\\n\",\n      \"Felix says Meow!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"class Dog:\\n\",\n    \"    def __init__(self, name):\\n\",\n    \"        self.name = name\\n\",\n    \"\\n\",\n    \"    def speak(self):\\n\",\n    \"        return self.name+' says Woof!'\\n\",\n    \"    \\n\",\n    \"class Cat:\\n\",\n    \"    def __init__(self, name):\\n\",\n    \"        self.name = name\\n\",\n    \"\\n\",\n    \"    def speak(self):\\n\",\n    \"        return self.name+' says Meow!' \\n\",\n    \"    \\n\",\n    \"niko = Dog('Niko')\\n\",\n    \"felix = Cat('Felix')\\n\",\n    \"\\n\",\n    \"print(niko.speak())\\n\",\n    \"print(felix.speak())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Here we have a Dog class and a Cat class, and each has a `.speak()` method. When called, each object's `.speak()` method returns a result unique to the object.\\n\",\n    \"\\n\",\n    \"There a few different ways to demonstrate polymorphism. First, with a for loop:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Niko says Woof!\\n\",\n      \"Felix says Meow!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for pet in [niko,felix]:\\n\",\n    \"    print(pet.speak())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Another is with functions:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Niko says Woof!\\n\",\n      \"Felix says Meow!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"def pet_speak(pet):\\n\",\n    \"    print(pet.speak())\\n\",\n    \"\\n\",\n    \"pet_speak(niko)\\n\",\n    \"pet_speak(felix)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"In both cases we were able to pass in different object types, and we obtained object-specific results from the same mechanism.\\n\",\n    \"\\n\",\n    \"A more common practice is to use abstract classes and inheritance. An abstract class is one that never expects to be instantiated. For example, we will never have an Animal object, only Dog and Cat objects, although Dogs and Cats are derived from Animals:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Fido says Woof!\\n\",\n      \"Isis says Meow!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"class Animal:\\n\",\n    \"    def __init__(self, name):    # Constructor of the class\\n\",\n    \"        self.name = name\\n\",\n    \"\\n\",\n    \"    def speak(self):              # Abstract method, defined by convention only\\n\",\n    \"        raise NotImplementedError(\\\"Subclass must implement abstract method\\\")\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"class Dog(Animal):\\n\",\n    \"    \\n\",\n    \"    def speak(self):\\n\",\n    \"        return self.name+' says Woof!'\\n\",\n    \"    \\n\",\n    \"class Cat(Animal):\\n\",\n    \"\\n\",\n    \"    def speak(self):\\n\",\n    \"        return self.name+' says Meow!'\\n\",\n    \"    \\n\",\n    \"fido = Dog('Fido')\\n\",\n    \"isis = Cat('Isis')\\n\",\n    \"\\n\",\n    \"print(fido.speak())\\n\",\n    \"print(isis.speak())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Real life examples of polymorphism include:\\n\",\n    \"* opening different file types - different tools are needed to display Word, pdf and Excel files\\n\",\n    \"* adding different objects - the `+` operator performs arithmetic and concatenation\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Special Methods\\n\",\n    \"Finally let's go over special methods. Classes in Python can implement certain operations with special method names. These methods are not actually called directly but by Python specific language syntax. For example let's create a Book class:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Book:\\n\",\n    \"    def __init__(self, title, author, pages):\\n\",\n    \"        print(\\\"A book is created\\\")\\n\",\n    \"        self.title = title\\n\",\n    \"        self.author = author\\n\",\n    \"        self.pages = pages\\n\",\n    \"\\n\",\n    \"    def __str__(self):\\n\",\n    \"        return \\\"Title: %s, author: %s, pages: %s\\\" %(self.title, self.author, self.pages)\\n\",\n    \"\\n\",\n    \"    def __len__(self):\\n\",\n    \"        return self.pages\\n\",\n    \"\\n\",\n    \"    def __del__(self):\\n\",\n    \"        print(\\\"A book is destroyed\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"A book is created\\n\",\n      \"Title: Python Rocks!, author: Jose Portilla, pages: 159\\n\",\n      \"159\\n\",\n      \"A book is destroyed\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"book = Book(\\\"Python Rocks!\\\", \\\"Jose Portilla\\\", 159)\\n\",\n    \"\\n\",\n    \"#Special Methods\\n\",\n    \"print(book)\\n\",\n    \"print(len(book))\\n\",\n    \"del book\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"    The __init__(), __str__(), __len__() and __del__() methods\\n\",\n    \"These special methods are defined by their use of underscores. They allow us to use Python specific functions on objects created through our class.\\n\",\n    \"\\n\",\n    \"**Great! After this lecture you should have a basic understanding of how to create your own objects with class in Python. You will be utilizing this heavily in your next milestone project!**\\n\",\n    \"\\n\",\n    \"For more great resources on this topic, check out:\\n\",\n    \"\\n\",\n    \"[Jeff Knupp's Post](https://jeffknupp.com/blog/2014/06/18/improve-your-python-python-classes-and-object-oriented-programming/)\\n\",\n    \"\\n\",\n    \"[Mozilla's Post](https://developer.mozilla.org/en-US/Learn/Python/Quickly_Learn_Object_Oriented_Programming)\\n\",\n    \"\\n\",\n    \"[Tutorial's Point](http://www.tutorialspoint.com/python/python_classes_objects.htm)\\n\",\n    \"\\n\",\n    \"[Official Documentation](https://docs.python.org/3/tutorial/classes.html)\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "05-Object Oriented Programming/.ipynb_checkpoints/02-Object Oriented Programming Homework-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Object Oriented Programming\\n\",\n    \"## Homework Assignment\\n\",\n    \"\\n\",\n    \"#### Problem 1\\n\",\n    \"Fill in the Line class methods to accept coordinates as a pair of tuples and return the slope and distance of the line.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Line:\\n\",\n    \"    \\n\",\n    \"    def __init__(self,coor1,coor2):\\n\",\n    \"        pass\\n\",\n    \"    \\n\",\n    \"    def distance(self):\\n\",\n    \"        pass\\n\",\n    \"    \\n\",\n    \"    def slope(self):\\n\",\n    \"        pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# EXAMPLE OUTPUT\\n\",\n    \"\\n\",\n    \"coordinate1 = (3,2)\\n\",\n    \"coordinate2 = (8,10)\\n\",\n    \"\\n\",\n    \"li = Line(coordinate1,coordinate2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"9.433981132056603\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"li.distance()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1.6\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"li.slope()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"________\\n\",\n    \"#### Problem 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Fill in the class \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Cylinder:\\n\",\n    \"    \\n\",\n    \"    def __init__(self,height=1,radius=1):\\n\",\n    \"        pass\\n\",\n    \"        \\n\",\n    \"    def volume(self):\\n\",\n    \"        pass\\n\",\n    \"    \\n\",\n    \"    def surface_area(self):\\n\",\n    \"        pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# EXAMPLE OUTPUT\\n\",\n    \"c = Cylinder(2,3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"56.52\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"c.volume()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"94.2\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"c.surface_area()\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "05-Object Oriented Programming/.ipynb_checkpoints/03-Object Oriented Programming Homework - Solution-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Object Oriented Programming\\n\",\n    \"## Homework Assignment\\n\",\n    \"\\n\",\n    \"#### Problem 1\\n\",\n    \"Fill in the Line class methods to accept coordinates as a pair of tuples and return the slope and distance of the line.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Line(object):\\n\",\n    \"    \\n\",\n    \"    def __init__(self,coor1,coor2):\\n\",\n    \"        self.coor1 = coor1\\n\",\n    \"        self.coor2 = coor2\\n\",\n    \"    \\n\",\n    \"    def distance(self):\\n\",\n    \"        x1,y1 = self.coor1\\n\",\n    \"        x2,y2 = self.coor2\\n\",\n    \"        return ((x2-x1)**2 + (y2-y1)**2)**0.5\\n\",\n    \"    \\n\",\n    \"    def slope(self):\\n\",\n    \"        x1,y1 = self.coor1\\n\",\n    \"        x2,y2 = self.coor2\\n\",\n    \"        return (y2-y1)/(x2-x1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"coordinate1 = (3,2)\\n\",\n    \"coordinate2 = (8,10)\\n\",\n    \"\\n\",\n    \"li = Line(coordinate1,coordinate2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"9.433981132056603\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"li.distance()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1.6\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"li.slope()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"________\\n\",\n    \"#### Problem 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Fill in the class \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Cylinder:\\n\",\n    \"    \\n\",\n    \"    def __init__(self,height=1,radius=1):\\n\",\n    \"        self.height = height\\n\",\n    \"        self.radius = radius\\n\",\n    \"        \\n\",\n    \"    def volume(self):\\n\",\n    \"        return self.height*3.14*(self.radius)**2\\n\",\n    \"    \\n\",\n    \"    def surface_area(self):\\n\",\n    \"        top = 3.14 * (self.radius)**2\\n\",\n    \"        return (2*top) + (2*3.14*self.radius*self.height)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"c = Cylinder(2,3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"56.52\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"c.volume()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"94.2\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"c.surface_area()\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "05-Object Oriented Programming/.ipynb_checkpoints/04-OOP Challenge-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Object Oriented Programming Challenge\\n\",\n    \"\\n\",\n    \"For this challenge, create a bank account class that has two attributes:\\n\",\n    \"\\n\",\n    \"* owner\\n\",\n    \"* balance\\n\",\n    \"\\n\",\n    \"and two methods:\\n\",\n    \"\\n\",\n    \"* deposit\\n\",\n    \"* withdraw\\n\",\n    \"\\n\",\n    \"As an added requirement, withdrawals may not exceed the available balance.\\n\",\n    \"\\n\",\n    \"Instantiate your class, make several deposits and withdrawals, and test to make sure the account can't be overdrawn.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Account:\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# 1. Instantiate the class\\n\",\n    \"acct1 = Account('Jose',100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Account owner:   Jose\\n\",\n      \"Account balance: $100\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# 2. Print the object\\n\",\n    \"print(acct1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Jose'\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# 3. Show the account owner attribute\\n\",\n    \"acct1.owner\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"100\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# 4. Show the account balance attribute\\n\",\n    \"acct1.balance\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Deposit Accepted\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# 5. Make a series of deposits and withdrawals\\n\",\n    \"acct1.deposit(50)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Withdrawal Accepted\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"acct1.withdraw(75)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Funds Unavailable!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# 6. Make a withdrawal that exceeds the available balance\\n\",\n    \"acct1.withdraw(500)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Good job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "05-Object Oriented Programming/.ipynb_checkpoints/05-OOP Challenge - Solution-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Object Oriented Programming Challenge - Solution\\n\",\n    \"\\n\",\n    \"For this challenge, create a bank account class that has two attributes:\\n\",\n    \"\\n\",\n    \"* owner\\n\",\n    \"* balance\\n\",\n    \"\\n\",\n    \"and two methods:\\n\",\n    \"\\n\",\n    \"* deposit\\n\",\n    \"* withdraw\\n\",\n    \"\\n\",\n    \"As an added requirement, withdrawals may not exceed the available balance.\\n\",\n    \"\\n\",\n    \"Instantiate your class, make several deposits and withdrawals, and test to make sure the account can't be overdrawn.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Account:\\n\",\n    \"    def __init__(self,owner,balance=0):\\n\",\n    \"        self.owner = owner\\n\",\n    \"        self.balance = balance\\n\",\n    \"        \\n\",\n    \"    def __str__(self):\\n\",\n    \"        return f'Account owner:   {self.owner}\\\\nAccount balance: ${self.balance}'\\n\",\n    \"        \\n\",\n    \"    def deposit(self,dep_amt):\\n\",\n    \"        self.balance += dep_amt\\n\",\n    \"        print('Deposit Accepted')\\n\",\n    \"        \\n\",\n    \"    def withdraw(self,wd_amt):\\n\",\n    \"        if self.balance >= wd_amt:\\n\",\n    \"            self.balance -= wd_amt\\n\",\n    \"            print('Withdrawal Accepted')\\n\",\n    \"        else:\\n\",\n    \"            print('Funds Unavailable!')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# 1. Instantiate the class\\n\",\n    \"acct1 = Account('Jose',100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Account owner:   Jose\\n\",\n      \"Account balance: $100\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# 2. Print the object\\n\",\n    \"print(acct1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Jose'\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# 3. Show the account owner attribute\\n\",\n    \"acct1.owner\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"100\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# 4. Show the account balance attribute\\n\",\n    \"acct1.balance\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Deposit Accepted\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# 5. Make a series of deposits and withdrawals\\n\",\n    \"acct1.deposit(50)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Withdrawal Accepted\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"acct1.withdraw(75)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Funds Unavailable!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# 6. Make a withdrawal that exceeds the available balance\\n\",\n    \"acct1.withdraw(500)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Good job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "05-Object Oriented Programming/01-Object Oriented Programming.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"source\": [\n    \"# Object Oriented Programming\\n\",\n    \"\\n\",\n    \"Object Oriented Programming (OOP) tends to be one of the major obstacles for beginners when they are first starting to learn Python.\\n\",\n    \"\\n\",\n    \"There are many, many tutorials and lessons covering OOP so feel free to Google search other lessons, and I have also put some links to other useful tutorials online at the bottom of this Notebook.\\n\",\n    \"\\n\",\n    \"For this lesson we will construct our knowledge of OOP in Python by building on the following topics:\\n\",\n    \"\\n\",\n    \"* Objects\\n\",\n    \"* Using the *class* keyword\\n\",\n    \"* Creating class attributes\\n\",\n    \"* Creating methods in a class\\n\",\n    \"* Learning about Inheritance\\n\",\n    \"* Learning about Polymorphism\\n\",\n    \"* Learning about Special Methods for classes\\n\",\n    \"\\n\",\n    \"Lets start the lesson by remembering about the Basic Python Objects. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"lst = [1,2,3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Remember how we could call methods on a list?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lst.count(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What we will basically be doing in this lecture is exploring how we could create an Object type like a list. We've already learned about how to create functions. So let's explore Objects in general:\\n\",\n    \"\\n\",\n    \"## Objects\\n\",\n    \"In Python, *everything is an object*. Remember from previous lectures we can use type() to check the type of object something is:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<class 'int'>\\n\",\n      \"<class 'list'>\\n\",\n      \"<class 'tuple'>\\n\",\n      \"<class 'dict'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(type(1))\\n\",\n    \"print(type([]))\\n\",\n    \"print(type(()))\\n\",\n    \"print(type({}))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"So we know all these things are objects, so how can we create our own Object types? That is where the <code>class</code> keyword comes in.\\n\",\n    \"## class\\n\",\n    \"User defined objects are created using the <code>class</code> keyword. The class is a blueprint that defines the nature of a future object. From classes we can construct instances. An instance is a specific object created from a particular class. For example, above we created the object <code>lst</code> which was an instance of a list object. \\n\",\n    \"\\n\",\n    \"Let see how we can use <code>class</code>:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<class '__main__.Sample'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Create a new object type called Sample\\n\",\n    \"class Sample:\\n\",\n    \"    pass\\n\",\n    \"\\n\",\n    \"# Instance of Sample\\n\",\n    \"x = Sample()\\n\",\n    \"\\n\",\n    \"print(type(x))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"By convention we give classes a name that starts with a capital letter. Note how <code>x</code> is now the reference to our new instance of a Sample class. In other words, we **instantiate** the Sample class.\\n\",\n    \"\\n\",\n    \"Inside of the class we currently just have pass. But we can define class attributes and methods.\\n\",\n    \"\\n\",\n    \"An **attribute** is a characteristic of an object.\\n\",\n    \"A **method** is an operation we can perform with the object.\\n\",\n    \"\\n\",\n    \"For example, we can create a class called Dog. An attribute of a dog may be its breed or its name, while a method of a dog may be defined by a .bark() method which returns a sound.\\n\",\n    \"\\n\",\n    \"Let's get a better understanding of attributes through an example.\\n\",\n    \"\\n\",\n    \"## Attributes\\n\",\n    \"The syntax for creating an attribute is:\\n\",\n    \"    \\n\",\n    \"    self.attribute = something\\n\",\n    \"    \\n\",\n    \"There is a special method called:\\n\",\n    \"\\n\",\n    \"    __init__()\\n\",\n    \"\\n\",\n    \"This method is used to initialize the attributes of an object. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Dog:\\n\",\n    \"    def __init__(self,breed):\\n\",\n    \"        self.breed = breed\\n\",\n    \"        \\n\",\n    \"sam = Dog(breed='Lab')\\n\",\n    \"frank = Dog(breed='Huskie')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Lets break down what we have above.The special method \\n\",\n    \"\\n\",\n    \"    __init__() \\n\",\n    \"is called automatically right after the object has been created:\\n\",\n    \"\\n\",\n    \"    def __init__(self, breed):\\n\",\n    \"Each attribute in a class definition begins with a reference to the instance object. It is by convention named self. The breed is the argument. The value is passed during the class instantiation.\\n\",\n    \"\\n\",\n    \"     self.breed = breed\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we have created two instances of the Dog class. With two breed types, we can then access these attributes like this:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Lab'\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sam.breed\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Huskie'\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"frank.breed\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how we don't have any parentheses after breed; this is because it is an attribute and doesn't take any arguments.\\n\",\n    \"\\n\",\n    \"In Python there are also *class object attributes*. These Class Object Attributes are the same for any instance of the class. For example, we could create the attribute *species* for the Dog class. Dogs, regardless of their breed, name, or other attributes, will always be mammals. We apply this logic in the following manner:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Dog:\\n\",\n    \"    \\n\",\n    \"    # Class Object Attribute\\n\",\n    \"    species = 'mammal'\\n\",\n    \"    \\n\",\n    \"    def __init__(self,breed,name):\\n\",\n    \"        self.breed = breed\\n\",\n    \"        self.name = name\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"sam = Dog('Lab','Sam')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Sam'\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sam.name\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note that the Class Object Attribute is defined outside of any methods in the class. Also by convention, we place them first before the init.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'mammal'\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sam.species\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Methods\\n\",\n    \"\\n\",\n    \"Methods are functions defined inside the body of a class. They are used to perform operations with the attributes of our objects. Methods are a key concept of the OOP paradigm. They are essential to dividing responsibilities in programming, especially in large applications.\\n\",\n    \"\\n\",\n    \"You can basically think of methods as functions acting on an Object that take the Object itself into account through its *self* argument.\\n\",\n    \"\\n\",\n    \"Let's go through an example of creating a Circle class:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Radius is:  1\\n\",\n      \"Area is:  3.14\\n\",\n      \"Circumference is:  6.28\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"class Circle:\\n\",\n    \"    pi = 3.14\\n\",\n    \"\\n\",\n    \"    # Circle gets instantiated with a radius (default is 1)\\n\",\n    \"    def __init__(self, radius=1):\\n\",\n    \"        self.radius = radius \\n\",\n    \"        self.area = radius * radius * Circle.pi\\n\",\n    \"\\n\",\n    \"    # Method for resetting Radius\\n\",\n    \"    def setRadius(self, new_radius):\\n\",\n    \"        self.radius = new_radius\\n\",\n    \"        self.area = new_radius * new_radius * self.pi\\n\",\n    \"\\n\",\n    \"    # Method for getting Circumference\\n\",\n    \"    def getCircumference(self):\\n\",\n    \"        return self.radius * self.pi * 2\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"c = Circle()\\n\",\n    \"\\n\",\n    \"print('Radius is: ',c.radius)\\n\",\n    \"print('Area is: ',c.area)\\n\",\n    \"print('Circumference is: ',c.getCircumference())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In the \\\\__init__ method above, in order to calculate the area attribute, we had to call Circle.pi. This is because the object does not yet have its own .pi attribute, so we call the Class Object Attribute pi instead.<br>\\n\",\n    \"In the setRadius method, however, we'll be working with an existing Circle object that does have its own pi attribute. Here we can use either Circle.pi or self.pi.<br><br>\\n\",\n    \"Now let's change the radius and see how that affects our Circle object:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Radius is:  2\\n\",\n      \"Area is:  12.56\\n\",\n      \"Circumference is:  12.56\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"c.setRadius(2)\\n\",\n    \"\\n\",\n    \"print('Radius is: ',c.radius)\\n\",\n    \"print('Area is: ',c.area)\\n\",\n    \"print('Circumference is: ',c.getCircumference())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Notice how we used self. notation to reference attributes of the class within the method calls. Review how the code above works and try creating your own method.\\n\",\n    \"\\n\",\n    \"## Inheritance\\n\",\n    \"\\n\",\n    \"Inheritance is a way to form new classes using classes that have already been defined. The newly formed classes are called derived classes, the classes that we derive from are called base classes. Important benefits of inheritance are code reuse and reduction of complexity of a program. The derived classes (descendants) override or extend the functionality of base classes (ancestors).\\n\",\n    \"\\n\",\n    \"Let's see an example by incorporating our previous work on the Dog class:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Animal:\\n\",\n    \"    def __init__(self):\\n\",\n    \"        print(\\\"Animal created\\\")\\n\",\n    \"\\n\",\n    \"    def whoAmI(self):\\n\",\n    \"        print(\\\"Animal\\\")\\n\",\n    \"\\n\",\n    \"    def eat(self):\\n\",\n    \"        print(\\\"Eating\\\")\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"class Dog(Animal):\\n\",\n    \"    def __init__(self):\\n\",\n    \"        Animal.__init__(self)\\n\",\n    \"        print(\\\"Dog created\\\")\\n\",\n    \"\\n\",\n    \"    def whoAmI(self):\\n\",\n    \"        print(\\\"Dog\\\")\\n\",\n    \"\\n\",\n    \"    def bark(self):\\n\",\n    \"        print(\\\"Woof!\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Animal created\\n\",\n      \"Dog created\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"d = Dog()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Dog\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"d.whoAmI()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Eating\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"d.eat()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Woof!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"d.bark()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In this example, we have two classes: Animal and Dog. The Animal is the base class, the Dog is the derived class. \\n\",\n    \"\\n\",\n    \"The derived class inherits the functionality of the base class. \\n\",\n    \"\\n\",\n    \"* It is shown by the eat() method. \\n\",\n    \"\\n\",\n    \"The derived class modifies existing behavior of the base class.\\n\",\n    \"\\n\",\n    \"* shown by the whoAmI() method. \\n\",\n    \"\\n\",\n    \"Finally, the derived class extends the functionality of the base class, by defining a new bark() method.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Polymorphism\\n\",\n    \"\\n\",\n    \"We've learned that while functions can take in different arguments, methods belong to the objects they act on. In Python, *polymorphism* refers to the way in which different object classes can share the same method name, and those methods can be called from the same place even though a variety of different objects might be passed in. The best way to explain this is by example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Niko says Woof!\\n\",\n      \"Felix says Meow!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"class Dog:\\n\",\n    \"    def __init__(self, name):\\n\",\n    \"        self.name = name\\n\",\n    \"\\n\",\n    \"    def speak(self):\\n\",\n    \"        return self.name+' says Woof!'\\n\",\n    \"    \\n\",\n    \"class Cat:\\n\",\n    \"    def __init__(self, name):\\n\",\n    \"        self.name = name\\n\",\n    \"\\n\",\n    \"    def speak(self):\\n\",\n    \"        return self.name+' says Meow!' \\n\",\n    \"    \\n\",\n    \"niko = Dog('Niko')\\n\",\n    \"felix = Cat('Felix')\\n\",\n    \"\\n\",\n    \"print(niko.speak())\\n\",\n    \"print(felix.speak())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Here we have a Dog class and a Cat class, and each has a `.speak()` method. When called, each object's `.speak()` method returns a result unique to the object.\\n\",\n    \"\\n\",\n    \"There a few different ways to demonstrate polymorphism. First, with a for loop:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Niko says Woof!\\n\",\n      \"Felix says Meow!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for pet in [niko,felix]:\\n\",\n    \"    print(pet.speak())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Another is with functions:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Niko says Woof!\\n\",\n      \"Felix says Meow!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"def pet_speak(pet):\\n\",\n    \"    print(pet.speak())\\n\",\n    \"\\n\",\n    \"pet_speak(niko)\\n\",\n    \"pet_speak(felix)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"In both cases we were able to pass in different object types, and we obtained object-specific results from the same mechanism.\\n\",\n    \"\\n\",\n    \"A more common practice is to use abstract classes and inheritance. An abstract class is one that never expects to be instantiated. For example, we will never have an Animal object, only Dog and Cat objects, although Dogs and Cats are derived from Animals:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Fido says Woof!\\n\",\n      \"Isis says Meow!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"class Animal:\\n\",\n    \"    def __init__(self, name):    # Constructor of the class\\n\",\n    \"        self.name = name\\n\",\n    \"\\n\",\n    \"    def speak(self):              # Abstract method, defined by convention only\\n\",\n    \"        raise NotImplementedError(\\\"Subclass must implement abstract method\\\")\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"class Dog(Animal):\\n\",\n    \"    \\n\",\n    \"    def speak(self):\\n\",\n    \"        return self.name+' says Woof!'\\n\",\n    \"    \\n\",\n    \"class Cat(Animal):\\n\",\n    \"\\n\",\n    \"    def speak(self):\\n\",\n    \"        return self.name+' says Meow!'\\n\",\n    \"    \\n\",\n    \"fido = Dog('Fido')\\n\",\n    \"isis = Cat('Isis')\\n\",\n    \"\\n\",\n    \"print(fido.speak())\\n\",\n    \"print(isis.speak())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Real life examples of polymorphism include:\\n\",\n    \"* opening different file types - different tools are needed to display Word, pdf and Excel files\\n\",\n    \"* adding different objects - the `+` operator performs arithmetic and concatenation\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Special Methods\\n\",\n    \"Finally let's go over special methods. Classes in Python can implement certain operations with special method names. These methods are not actually called directly but by Python specific language syntax. For example let's create a Book class:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Book:\\n\",\n    \"    def __init__(self, title, author, pages):\\n\",\n    \"        print(\\\"A book is created\\\")\\n\",\n    \"        self.title = title\\n\",\n    \"        self.author = author\\n\",\n    \"        self.pages = pages\\n\",\n    \"\\n\",\n    \"    def __str__(self):\\n\",\n    \"        return \\\"Title: %s, author: %s, pages: %s\\\" %(self.title, self.author, self.pages)\\n\",\n    \"\\n\",\n    \"    def __len__(self):\\n\",\n    \"        return self.pages\\n\",\n    \"\\n\",\n    \"    def __del__(self):\\n\",\n    \"        print(\\\"A book is destroyed\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"A book is created\\n\",\n      \"Title: Python Rocks!, author: Jose Portilla, pages: 159\\n\",\n      \"159\\n\",\n      \"A book is destroyed\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"book = Book(\\\"Python Rocks!\\\", \\\"Jose Portilla\\\", 159)\\n\",\n    \"\\n\",\n    \"#Special Methods\\n\",\n    \"print(book)\\n\",\n    \"print(len(book))\\n\",\n    \"del book\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"    The __init__(), __str__(), __len__() and __del__() methods\\n\",\n    \"These special methods are defined by their use of underscores. They allow us to use Python specific functions on objects created through our class.\\n\",\n    \"\\n\",\n    \"**Great! After this lecture you should have a basic understanding of how to create your own objects with class in Python. You will be utilizing this heavily in your next milestone project!**\\n\",\n    \"\\n\",\n    \"For more great resources on this topic, check out:\\n\",\n    \"\\n\",\n    \"[Tutorial's Point](http://www.tutorialspoint.com/python/python_classes_objects.htm)\\n\",\n    \"\\n\",\n    \"[Official Documentation](https://docs.python.org/3/tutorial/classes.html)\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "05-Object Oriented Programming/02-Object Oriented Programming Homework.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Object Oriented Programming\\n\",\n    \"## Homework Assignment\\n\",\n    \"\\n\",\n    \"#### Problem 1\\n\",\n    \"Fill in the Line class methods to accept coordinates as a pair of tuples and return the slope and distance of the line.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Line:\\n\",\n    \"    \\n\",\n    \"    def __init__(self,coor1,coor2):\\n\",\n    \"        pass\\n\",\n    \"    \\n\",\n    \"    def distance(self):\\n\",\n    \"        pass\\n\",\n    \"    \\n\",\n    \"    def slope(self):\\n\",\n    \"        pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# EXAMPLE OUTPUT\\n\",\n    \"\\n\",\n    \"coordinate1 = (3,2)\\n\",\n    \"coordinate2 = (8,10)\\n\",\n    \"\\n\",\n    \"li = Line(coordinate1,coordinate2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"9.433981132056603\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"li.distance()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1.6\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"li.slope()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"________\\n\",\n    \"#### Problem 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Fill in the class \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Cylinder:\\n\",\n    \"    \\n\",\n    \"    def __init__(self,height=1,radius=1):\\n\",\n    \"        pass\\n\",\n    \"        \\n\",\n    \"    def volume(self):\\n\",\n    \"        pass\\n\",\n    \"    \\n\",\n    \"    def surface_area(self):\\n\",\n    \"        pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# EXAMPLE OUTPUT\\n\",\n    \"c = Cylinder(2,3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"56.52\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"c.volume()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"94.2\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"c.surface_area()\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "05-Object Oriented Programming/03-Object Oriented Programming Homework - Solution.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Object Oriented Programming\\n\",\n    \"## Homework Assignment\\n\",\n    \"\\n\",\n    \"#### Problem 1\\n\",\n    \"Fill in the Line class methods to accept coordinates as a pair of tuples and return the slope and distance of the line.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Line(object):\\n\",\n    \"    \\n\",\n    \"    def __init__(self,coor1,coor2):\\n\",\n    \"        self.coor1 = coor1\\n\",\n    \"        self.coor2 = coor2\\n\",\n    \"    \\n\",\n    \"    def distance(self):\\n\",\n    \"        x1,y1 = self.coor1\\n\",\n    \"        x2,y2 = self.coor2\\n\",\n    \"        return ((x2-x1)**2 + (y2-y1)**2)**0.5\\n\",\n    \"    \\n\",\n    \"    def slope(self):\\n\",\n    \"        x1,y1 = self.coor1\\n\",\n    \"        x2,y2 = self.coor2\\n\",\n    \"        return (y2-y1)/(x2-x1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"coordinate1 = (3,2)\\n\",\n    \"coordinate2 = (8,10)\\n\",\n    \"\\n\",\n    \"li = Line(coordinate1,coordinate2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"9.433981132056603\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"li.distance()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1.6\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"li.slope()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"________\\n\",\n    \"#### Problem 2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Fill in the class \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Cylinder:\\n\",\n    \"    \\n\",\n    \"    def __init__(self,height=1,radius=1):\\n\",\n    \"        self.height = height\\n\",\n    \"        self.radius = radius\\n\",\n    \"        \\n\",\n    \"    def volume(self):\\n\",\n    \"        return self.height*3.14*(self.radius)**2\\n\",\n    \"    \\n\",\n    \"    def surface_area(self):\\n\",\n    \"        top = 3.14 * (self.radius)**2\\n\",\n    \"        return (2*top) + (2*3.14*self.radius*self.height)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"c = Cylinder(2,3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"56.52\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"c.volume()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"94.2\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"c.surface_area()\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "05-Object Oriented Programming/04-OOP Challenge.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Object Oriented Programming Challenge\\n\",\n    \"\\n\",\n    \"For this challenge, create a bank account class that has two attributes:\\n\",\n    \"\\n\",\n    \"* owner\\n\",\n    \"* balance\\n\",\n    \"\\n\",\n    \"and two methods:\\n\",\n    \"\\n\",\n    \"* deposit\\n\",\n    \"* withdraw\\n\",\n    \"\\n\",\n    \"As an added requirement, withdrawals may not exceed the available balance.\\n\",\n    \"\\n\",\n    \"Instantiate your class, make several deposits and withdrawals, and test to make sure the account can't be overdrawn.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Account:\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# 1. Instantiate the class\\n\",\n    \"acct1 = Account('Jose',100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Account owner:   Jose\\n\",\n      \"Account balance: $100\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# 2. Print the object\\n\",\n    \"print(acct1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Jose'\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# 3. Show the account owner attribute\\n\",\n    \"acct1.owner\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"100\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# 4. Show the account balance attribute\\n\",\n    \"acct1.balance\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Deposit Accepted\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# 5. Make a series of deposits and withdrawals\\n\",\n    \"acct1.deposit(50)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Withdrawal Accepted\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"acct1.withdraw(75)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Funds Unavailable!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# 6. Make a withdrawal that exceeds the available balance\\n\",\n    \"acct1.withdraw(500)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Good job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "05-Object Oriented Programming/05-OOP Challenge - Solution.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Object Oriented Programming Challenge - Solution\\n\",\n    \"\\n\",\n    \"For this challenge, create a bank account class that has two attributes:\\n\",\n    \"\\n\",\n    \"* owner\\n\",\n    \"* balance\\n\",\n    \"\\n\",\n    \"and two methods:\\n\",\n    \"\\n\",\n    \"* deposit\\n\",\n    \"* withdraw\\n\",\n    \"\\n\",\n    \"As an added requirement, withdrawals may not exceed the available balance.\\n\",\n    \"\\n\",\n    \"Instantiate your class, make several deposits and withdrawals, and test to make sure the account can't be overdrawn.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Account:\\n\",\n    \"    def __init__(self,owner,balance=0):\\n\",\n    \"        self.owner = owner\\n\",\n    \"        self.balance = balance\\n\",\n    \"        \\n\",\n    \"    def __str__(self):\\n\",\n    \"        return f'Account owner:   {self.owner}\\\\nAccount balance: ${self.balance}'\\n\",\n    \"        \\n\",\n    \"    def deposit(self,dep_amt):\\n\",\n    \"        self.balance += dep_amt\\n\",\n    \"        print('Deposit Accepted')\\n\",\n    \"        \\n\",\n    \"    def withdraw(self,wd_amt):\\n\",\n    \"        if self.balance >= wd_amt:\\n\",\n    \"            self.balance -= wd_amt\\n\",\n    \"            print('Withdrawal Accepted')\\n\",\n    \"        else:\\n\",\n    \"            print('Funds Unavailable!')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# 1. Instantiate the class\\n\",\n    \"acct1 = Account('Jose',100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Account owner:   Jose\\n\",\n      \"Account balance: $100\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# 2. Print the object\\n\",\n    \"print(acct1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Jose'\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# 3. Show the account owner attribute\\n\",\n    \"acct1.owner\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"100\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# 4. Show the account balance attribute\\n\",\n    \"acct1.balance\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Deposit Accepted\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# 5. Make a series of deposits and withdrawals\\n\",\n    \"acct1.deposit(50)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Withdrawal Accepted\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"acct1.withdraw(75)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Funds Unavailable!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# 6. Make a withdrawal that exceeds the available balance\\n\",\n    \"acct1.withdraw(500)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Good job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "06-Modules and Packages/.ipynb_checkpoints/01-Modules and Packages-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Modules and Packages\\n\",\n    \"\\n\",\n    \"There's no code here because it didn't really make sense for the section. Check out the video lectures for more info and the resources for this.\\n\",\n    \"\\n\",\n    \"Here is the best source the official docs!\\n\",\n    \"https://docs.python.org/3/tutorial/modules.html#packages\\n\",\n    \"\\n\",\n    \"But I really like the info here: https://python4astronomers.github.io/installation/packages.html\\n\",\n    \"\\n\",\n    \"Here's some extra info to help:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Modules in Python are simply Python files with the .py extension, which implement a set of functions. Modules are imported from other modules using the <code>import</code> command.\\n\",\n    \"\\n\",\n    \"To import a module, we use the <code>import</code> command. Check out the full list of built-in modules in the Python standard library [here](https://docs.python.org/3/py-modindex.html).\\n\",\n    \"\\n\",\n    \"The first time a module is loaded into a running Python script, it is initialized by executing the code in the module once. If another module in your code imports the same module again, it will not be loaded twice but once only - so local variables inside the module act as a \\\"singleton\\\" - they are initialized only once.\\n\",\n    \"\\n\",\n    \"If we want to import the math module, we simply import the name of the module:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# import the library\\n\",\n    \"import math\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# use it (ceiling rounding)\\n\",\n    \"math.ceil(2.4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Exploring built-in modules\\n\",\n    \"Two very important functions come in handy when exploring modules in Python - the <code>dir</code> and <code>help</code> functions.\\n\",\n    \"\\n\",\n    \"We can look for which functions are implemented in each module by using the <code>dir</code> function:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(dir(math))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"When we find the function in the module we want to use, we can read about it more using the <code>help</code> function, inside the Python interpreter:\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Help on built-in function ceil in module math:\\n\",\n      \"\\n\",\n      \"ceil(...)\\n\",\n      \"    ceil(x)\\n\",\n      \"    \\n\",\n      \"    Return the ceiling of x as an Integral.\\n\",\n      \"    This is the smallest integer >= x.\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"help(math.ceil)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Writing modules\\n\",\n    \"Writing Python modules is very simple. To create a module of your own, simply create a new .py file with the module name, and then import it using the Python file name (without the .py extension) using the import command.\\n\",\n    \"\\n\",\n    \"## Writing packages\\n\",\n    \"Packages are name-spaces which contain multiple packages and modules themselves. They are simply directories, but with a twist.\\n\",\n    \"\\n\",\n    \"Each package in Python is a directory which MUST contain a special file called **\\\\__init\\\\__.py**. This file can be empty, and it indicates that the directory it contains is a Python package, so it can be imported the same way a module can be imported.\\n\",\n    \"\\n\",\n    \"If we create a directory called foo, which marks the package name, we can then create a module inside that package called bar. We also must not forget to add the **\\\\__init\\\\__.py** file inside the foo directory.\\n\",\n    \"\\n\",\n    \"To use the module bar, we can import it in two ways:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Just an example, this won't work\\n\",\n    \"import foo.bar\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# OR could do it this way\\n\",\n    \"from foo import bar\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In the first method, we must use the foo prefix whenever we access the module bar. In the second method, we don't, because we import the module to our module's name-space.\\n\",\n    \"\\n\",\n    \"The **\\\\__init\\\\__.py** file can also decide which modules the package exports as the API, while keeping other modules internal, by overriding the **\\\\__all\\\\__** variable, like so:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"__init__.py:\\n\",\n    \"\\n\",\n    \"__all__ = [\\\"bar\\\"]\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "06-Modules and Packages/.ipynb_checkpoints/Useful_Info_Notebook-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Modules and Packages\\n\",\n    \"\\n\",\n    \"There's no code here because it didn't really make sense for the section. Check out the video lectures for more info and the resources for this.\\n\",\n    \"\\n\",\n    \"Here is the best source the official docs!\\n\",\n    \"https://docs.python.org/3/tutorial/modules.html#packages\\n\",\n    \"\\n\",\n    \"But I really like the info here: https://python4astronomers.github.io/installation/packages.html\\n\",\n    \"\\n\",\n    \"Here's some extra info to help:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Modules in Python are simply Python files with the .py extension, which implement a set of functions. Modules are imported from other modules using the <code>import</code> command.\\n\",\n    \"\\n\",\n    \"To import a module, we use the <code>import</code> command. Check out the full list of built-in modules in the Python standard library [here](https://docs.python.org/3/py-modindex.html).\\n\",\n    \"\\n\",\n    \"The first time a module is loaded into a running Python script, it is initialized by executing the code in the module once. If another module in your code imports the same module again, it will not be loaded twice but once only - so local variables inside the module act as a \\\"singleton\\\" - they are initialized only once.\\n\",\n    \"\\n\",\n    \"If we want to import the math module, we simply import the name of the module:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# import the library\\n\",\n    \"import math\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# use it (ceiling rounding)\\n\",\n    \"math.ceil(2.4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Exploring built-in modules\\n\",\n    \"Two very important functions come in handy when exploring modules in Python - the <code>dir</code> and <code>help</code> functions.\\n\",\n    \"\\n\",\n    \"We can look for which functions are implemented in each module by using the <code>dir</code> function:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(dir(math))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"When we find the function in the module we want to use, we can read about it more using the <code>help</code> function, inside the Python interpreter:\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Help on built-in function ceil in module math:\\n\",\n      \"\\n\",\n      \"ceil(...)\\n\",\n      \"    ceil(x)\\n\",\n      \"    \\n\",\n      \"    Return the ceiling of x as an Integral.\\n\",\n      \"    This is the smallest integer >= x.\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"help(math.ceil)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Writing modules\\n\",\n    \"Writing Python modules is very simple. To create a module of your own, simply create a new .py file with the module name, and then import it using the Python file name (without the .py extension) using the import command.\\n\",\n    \"\\n\",\n    \"## Writing packages\\n\",\n    \"Packages are name-spaces which contain multiple packages and modules themselves. They are simply directories, but with a twist.\\n\",\n    \"\\n\",\n    \"Each package in Python is a directory which MUST contain a special file called **\\\\__init\\\\__.py**. This file can be empty, and it indicates that the directory it contains is a Python package, so it can be imported the same way a module can be imported.\\n\",\n    \"\\n\",\n    \"If we create a directory called foo, which marks the package name, we can then create a module inside that package called bar. We also must not forget to add the **\\\\__init\\\\__.py** file inside the foo directory.\\n\",\n    \"\\n\",\n    \"To use the module bar, we can import it in two ways:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Just an example, this won't work\\n\",\n    \"import foo.bar\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# OR could do it this way\\n\",\n    \"from foo import bar\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In the first method, we must use the foo prefix whenever we access the module bar. In the second method, we don't, because we import the module to our module's name-space.\\n\",\n    \"\\n\",\n    \"The **\\\\__init\\\\__.py** file can also decide which modules the package exports as the API, while keeping other modules internal, by overriding the **\\\\__all\\\\__** variable, like so:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"__init__.py:\\n\",\n    \"\\n\",\n    \"__all__ = [\\\"bar\\\"]\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "06-Modules and Packages/00-Modules_and_Packages/MyMainPackage/SubPackage/__init__.py",
    "content": ""
  },
  {
    "path": "06-Modules and Packages/00-Modules_and_Packages/MyMainPackage/SubPackage/mysubscript.py",
    "content": "def sub_report():\n\tprint(\"Hey Im a function inside mysubscript\")"
  },
  {
    "path": "06-Modules and Packages/00-Modules_and_Packages/MyMainPackage/__init__.py",
    "content": ""
  },
  {
    "path": "06-Modules and Packages/00-Modules_and_Packages/MyMainPackage/some_main_script.py",
    "content": "def report_main():\n\tprint(\"Hey I am in some_main_script in main package.\")"
  },
  {
    "path": "06-Modules and Packages/00-Modules_and_Packages/mymodule.py",
    "content": "def my_func():\n\tprint(\"Hey I am in mymodule.py\")"
  },
  {
    "path": "06-Modules and Packages/00-Modules_and_Packages/myprogram.py",
    "content": "from MyMainPackage.some_main_script import report_main\nfrom MyMainPackage.SubPackage import mysubscript\n\nreport_main()\n\nmysubscript.sub_report()\n"
  },
  {
    "path": "06-Modules and Packages/01-Name_and_Main/Explanation.txt",
    "content": "Sometimes when you are importing from a module, you would like to know whether\na modules function is being used as an import, or if you are using the original\n.py file of that module. In this case we can use the:\n\n      if __name__ == \"__main__\":\n\nline to determine this. For example:\n\nWhen your script is run by passing it as a command to the Python interpreter:\n\n    python myscript.py\n\nall of the code that is at indentation level 0 gets executed. Functions and\nclasses that are defined are, well, defined, but none of their code gets ran.\nUnlike other languages, there's no main() function that gets run automatically\n- the main() function is implicitly all the code at the top level.\n\nIn this case, the top-level code is an if block.  __name__ is a built-in variable\n which evaluate to the name of the current module. However, if a module is being\n run directly (as in myscript.py above), then __name__ instead is set to the\n string \"__main__\". Thus, you can test whether your script is being run directly\n  or being imported by something else by testing\n\n    if __name__ == \"__main__\":\n        ...\n\nIf that code is being imported into another module, the various function and\nclass definitions will be imported, but the main() code won't get run. As a\nbasic example, consider the following two scripts:\n\n    # file one.py\n    def func():\n        print(\"func() in one.py\")\n\n    print(\"top-level in one.py\")\n\n    if __name__ == \"__main__\":\n        print(\"one.py is being run directly\")\n    else:\n        print(\"one.py is being imported into another module\")\n\nand then:\n\n    # file two.py\n    import one\n\n    print(\"top-level in two.py\")\n    one.func()\n\n    if __name__ == \"__main__\":\n        print(\"two.py is being run directly\")\n    else:\n        print(\"two.py is being imported into another module\")\n\nNow, if you invoke the interpreter as\n\n    python one.py\n\nThe output will be\n\n    top-level in one.py\n\none.py is being run directly\nIf you run two.py instead:\n\n    python two.py\n\nYou get\n\n  top-level in one.py\n  one.py is being imported into another module\n  top-level in two.py\n  func() in one.py\n  two.py is being run directly\n  \nThus, when module one gets loaded, its __name__ equals \"one\" instead of __main__.\n"
  },
  {
    "path": "06-Modules and Packages/01-Name_and_Main/one.py",
    "content": "def func():\n    print(\"func() ran in one.py\")\n\nprint(\"top-level print inside of one.py\")\n\nif __name__ == \"__main__\":\n    print(\"one.py is being run directly\")\nelse:\n    print(\"one.py is being imported into another module\")\n"
  },
  {
    "path": "06-Modules and Packages/01-Name_and_Main/two.py",
    "content": "import one\n\nprint(\"top-level in two.py\")\n\none.func()\n\nif __name__ == \"__main__\":\n    print(\"two.py is being run directly\")\nelse:\n    print(\"two.py is being imported into another module\")\n"
  },
  {
    "path": "06-Modules and Packages/Useful_Info_Notebook.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Modules and Packages\\n\",\n    \"\\n\",\n    \"There's no code here because it didn't really make sense for the section. Check out the video lectures for more info and the resources for this.\\n\",\n    \"\\n\",\n    \"Here is the best source the official docs!\\n\",\n    \"https://docs.python.org/3/tutorial/modules.html#packages\\n\",\n    \"\\n\",\n    \"But I really like the info here: https://python4astronomers.github.io/installation/packages.html\\n\",\n    \"\\n\",\n    \"Here's some extra info to help:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Modules in Python are simply Python files with the .py extension, which implement a set of functions. Modules are imported from other modules using the <code>import</code> command.\\n\",\n    \"\\n\",\n    \"To import a module, we use the <code>import</code> command. Check out the full list of built-in modules in the Python standard library [here](https://docs.python.org/3/py-modindex.html).\\n\",\n    \"\\n\",\n    \"The first time a module is loaded into a running Python script, it is initialized by executing the code in the module once. If another module in your code imports the same module again, it will not be loaded twice but once only - so local variables inside the module act as a \\\"singleton\\\" - they are initialized only once.\\n\",\n    \"\\n\",\n    \"If we want to import the math module, we simply import the name of the module:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# import the library\\n\",\n    \"import math\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# use it (ceiling rounding)\\n\",\n    \"math.ceil(2.4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Exploring built-in modules\\n\",\n    \"Two very important functions come in handy when exploring modules in Python - the <code>dir</code> and <code>help</code> functions.\\n\",\n    \"\\n\",\n    \"We can look for which functions are implemented in each module by using the <code>dir</code> function:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(dir(math))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"When we find the function in the module we want to use, we can read about it more using the <code>help</code> function, inside the Python interpreter:\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Help on built-in function ceil in module math:\\n\",\n      \"\\n\",\n      \"ceil(...)\\n\",\n      \"    ceil(x)\\n\",\n      \"    \\n\",\n      \"    Return the ceiling of x as an Integral.\\n\",\n      \"    This is the smallest integer >= x.\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"help(math.ceil)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Writing modules\\n\",\n    \"Writing Python modules is very simple. To create a module of your own, simply create a new .py file with the module name, and then import it using the Python file name (without the .py extension) using the import command.\\n\",\n    \"\\n\",\n    \"## Writing packages\\n\",\n    \"Packages are name-spaces which contain multiple packages and modules themselves. They are simply directories, but with a twist.\\n\",\n    \"\\n\",\n    \"Each package in Python is a directory which MUST contain a special file called **\\\\__init\\\\__.py**. This file can be empty, and it indicates that the directory it contains is a Python package, so it can be imported the same way a module can be imported.\\n\",\n    \"\\n\",\n    \"If we create a directory called foo, which marks the package name, we can then create a module inside that package called bar. We also must not forget to add the **\\\\__init\\\\__.py** file inside the foo directory.\\n\",\n    \"\\n\",\n    \"To use the module bar, we can import it in two ways:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Just an example, this won't work\\n\",\n    \"import foo.bar\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# OR could do it this way\\n\",\n    \"from foo import bar\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In the first method, we must use the foo prefix whenever we access the module bar. In the second method, we don't, because we import the module to our module's name-space.\\n\",\n    \"\\n\",\n    \"The **\\\\__init\\\\__.py** file can also decide which modules the package exports as the API, while keeping other modules internal, by overriding the **\\\\__all\\\\__** variable, like so:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"__init__.py:\\n\",\n    \"\\n\",\n    \"__all__ = [\\\"bar\\\"]\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "07-Errors and Exception Handling/.ipynb_checkpoints/01-Errors and Exceptions Handling-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Errors and Exception Handling\\n\",\n    \"\\n\",\n    \"In this lecture we will learn about Errors and Exception Handling in Python. You've definitely already encountered errors by this point in the course. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"SyntaxError\",\n     \"evalue\": \"EOL while scanning string literal (<ipython-input-1-db8c9988558c>, line 1)\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;36m  File \\u001b[1;32m\\\"<ipython-input-1-db8c9988558c>\\\"\\u001b[1;36m, line \\u001b[1;32m1\\u001b[0m\\n\\u001b[1;33m    print('Hello)\\u001b[0m\\n\\u001b[1;37m                 ^\\u001b[0m\\n\\u001b[1;31mSyntaxError\\u001b[0m\\u001b[1;31m:\\u001b[0m EOL while scanning string literal\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('Hello)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how we get a SyntaxError, with the further description that it was an EOL (End of Line Error) while scanning the string literal. This is specific enough for us to see that we forgot a single quote at the end of the line. Understanding these various error types will help you debug your code much faster. \\n\",\n    \"\\n\",\n    \"This type of error and description is known as an Exception. Even if a statement or expression is syntactically correct, it may cause an error when an attempt is made to execute it. Errors detected during execution are called exceptions and are not unconditionally fatal.\\n\",\n    \"\\n\",\n    \"You can check out the full list of built-in exceptions [here](https://docs.python.org/3/library/exceptions.html). Now let's learn how to handle errors and exceptions in our own code.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## try and except\\n\",\n    \"\\n\",\n    \"The basic terminology and syntax used to handle errors in Python are the <code>try</code> and <code>except</code> statements. The code which can cause an exception to occur is put in the <code>try</code> block and the handling of the exception is then implemented in the <code>except</code> block of code. The syntax follows:\\n\",\n    \"\\n\",\n    \"    try:\\n\",\n    \"       You do your operations here...\\n\",\n    \"       ...\\n\",\n    \"    except ExceptionI:\\n\",\n    \"       If there is ExceptionI, then execute this block.\\n\",\n    \"    except ExceptionII:\\n\",\n    \"       If there is ExceptionII, then execute this block.\\n\",\n    \"       ...\\n\",\n    \"    else:\\n\",\n    \"       If there is no exception then execute this block. \\n\",\n    \"\\n\",\n    \"We can also just check for any exception with just using <code>except:</code> To get a better understanding of all this let's check out an example: We will look at some code that opens and writes a file:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Content written successfully\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"try:\\n\",\n    \"    f = open('testfile','w')\\n\",\n    \"    f.write('Test write this')\\n\",\n    \"except IOError:\\n\",\n    \"    # This will only check for an IOError exception and then execute this print statement\\n\",\n    \"    print(\\\"Error: Could not find file or read data\\\")\\n\",\n    \"else:\\n\",\n    \"    print(\\\"Content written successfully\\\")\\n\",\n    \"    f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now let's see what would happen if we did not have write permission (opening only with 'r'):\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Error: Could not find file or read data\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"try:\\n\",\n    \"    f = open('testfile','r')\\n\",\n    \"    f.write('Test write this')\\n\",\n    \"except IOError:\\n\",\n    \"    # This will only check for an IOError exception and then execute this print statement\\n\",\n    \"    print(\\\"Error: Could not find file or read data\\\")\\n\",\n    \"else:\\n\",\n    \"    print(\\\"Content written successfully\\\")\\n\",\n    \"    f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Notice how we only printed a statement! The code still ran and we were able to continue doing actions and running code blocks. This is extremely useful when you have to account for possible input errors in your code. You can be prepared for the error and keep running code, instead of your code just breaking as we saw above.\\n\",\n    \"\\n\",\n    \"We could have also just said <code>except:</code> if we weren't sure what exception would occur. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Error: Could not find file or read data\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"try:\\n\",\n    \"    f = open('testfile','r')\\n\",\n    \"    f.write('Test write this')\\n\",\n    \"except:\\n\",\n    \"    # This will check for any exception and then execute this print statement\\n\",\n    \"    print(\\\"Error: Could not find file or read data\\\")\\n\",\n    \"else:\\n\",\n    \"    print(\\\"Content written successfully\\\")\\n\",\n    \"    f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now we don't actually need to memorize that list of exception types! Now what if we kept wanting to run code after the exception occurred? This is where <code>finally</code> comes in.\\n\",\n    \"## finally\\n\",\n    \"The <code>finally:</code> block of code will always be run regardless if there was an exception in the <code>try</code> code block. The syntax is:\\n\",\n    \"\\n\",\n    \"    try:\\n\",\n    \"       Code block here\\n\",\n    \"       ...\\n\",\n    \"       Due to any exception, this code may be skipped!\\n\",\n    \"    finally:\\n\",\n    \"       This code block would always be executed.\\n\",\n    \"\\n\",\n    \"For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Always execute finally code blocks\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"try:\\n\",\n    \"    f = open(\\\"testfile\\\", \\\"w\\\")\\n\",\n    \"    f.write(\\\"Test write statement\\\")\\n\",\n    \"    f.close()\\n\",\n    \"finally:\\n\",\n    \"    print(\\\"Always execute finally code blocks\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can use this in conjunction with <code>except</code>. Let's see a new example that will take into account a user providing the wrong input:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def askint():\\n\",\n    \"    try:\\n\",\n    \"        val = int(input(\\\"Please enter an integer: \\\"))\\n\",\n    \"    except:\\n\",\n    \"        print(\\\"Looks like you did not enter an integer!\\\")\\n\",\n    \"\\n\",\n    \"    finally:\\n\",\n    \"        print(\\\"Finally, I executed!\\\")\\n\",\n    \"    print(val)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please enter an integer: 5\\n\",\n      \"Finally, I executed!\\n\",\n      \"5\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"askint()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please enter an integer: five\\n\",\n      \"Looks like you did not enter an integer!\\n\",\n      \"Finally, I executed!\\n\"\n     ]\n    },\n    {\n     \"ename\": \"UnboundLocalError\",\n     \"evalue\": \"local variable 'val' referenced before assignment\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mUnboundLocalError\\u001b[0m                         Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-8-cc291aa76c10>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0maskint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;32m<ipython-input-6-c97dd1c75d24>\\u001b[0m in \\u001b[0;36maskint\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      7\\u001b[0m     \\u001b[1;32mfinally\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m      8\\u001b[0m         \\u001b[0mprint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;34m\\\"Finally, I executed!\\\"\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m----> 9\\u001b[1;33m     \\u001b[0mprint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mval\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mUnboundLocalError\\u001b[0m: local variable 'val' referenced before assignment\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"askint()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice how we got an error when trying to print val (because it was never properly assigned). Let's remedy this by asking the user and checking to make sure the input type is an integer:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def askint():\\n\",\n    \"    try:\\n\",\n    \"        val = int(input(\\\"Please enter an integer: \\\"))\\n\",\n    \"    except:\\n\",\n    \"        print(\\\"Looks like you did not enter an integer!\\\")\\n\",\n    \"        val = int(input(\\\"Try again-Please enter an integer: \\\"))\\n\",\n    \"    finally:\\n\",\n    \"        print(\\\"Finally, I executed!\\\")\\n\",\n    \"    print(val)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please enter an integer: five\\n\",\n      \"Looks like you did not enter an integer!\\n\",\n      \"Try again-Please enter an integer: four\\n\",\n      \"Finally, I executed!\\n\"\n     ]\n    },\n    {\n     \"ename\": \"ValueError\",\n     \"evalue\": \"invalid literal for int() with base 10: 'four'\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mValueError\\u001b[0m                                Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-9-92b5f751eb01>\\u001b[0m in \\u001b[0;36maskint\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      2\\u001b[0m     \\u001b[1;32mtry\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m----> 3\\u001b[1;33m         \\u001b[0mval\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[0mint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0minput\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;34m\\\"Please enter an integer: \\\"\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[0;32m      4\\u001b[0m     \\u001b[1;32mexcept\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[1;31mValueError\\u001b[0m: invalid literal for int() with base 10: 'five'\",\n      \"\\nDuring handling of the above exception, another exception occurred:\\n\",\n      \"\\u001b[1;31mValueError\\u001b[0m                                Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-10-cc291aa76c10>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0maskint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;32m<ipython-input-9-92b5f751eb01>\\u001b[0m in \\u001b[0;36maskint\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      4\\u001b[0m     \\u001b[1;32mexcept\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m      5\\u001b[0m         \\u001b[0mprint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;34m\\\"Looks like you did not enter an integer!\\\"\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m----> 6\\u001b[1;33m         \\u001b[0mval\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[0mint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0minput\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;34m\\\"Try again-Please enter an integer: \\\"\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[0;32m      7\\u001b[0m     \\u001b[1;32mfinally\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m      8\\u001b[0m         \\u001b[0mprint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;34m\\\"Finally, I executed!\\\"\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[1;31mValueError\\u001b[0m: invalid literal for int() with base 10: 'four'\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"askint()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Hmmm...that only did one check. How can we continually keep checking? We can use a while loop!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def askint():\\n\",\n    \"    while True:\\n\",\n    \"        try:\\n\",\n    \"            val = int(input(\\\"Please enter an integer: \\\"))\\n\",\n    \"        except:\\n\",\n    \"            print(\\\"Looks like you did not enter an integer!\\\")\\n\",\n    \"            continue\\n\",\n    \"        else:\\n\",\n    \"            print(\\\"Yep that's an integer!\\\")\\n\",\n    \"            break\\n\",\n    \"        finally:\\n\",\n    \"            print(\\\"Finally, I executed!\\\")\\n\",\n    \"        print(val)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please enter an integer: five\\n\",\n      \"Looks like you did not enter an integer!\\n\",\n      \"Finally, I executed!\\n\",\n      \"Please enter an integer: four\\n\",\n      \"Looks like you did not enter an integer!\\n\",\n      \"Finally, I executed!\\n\",\n      \"Please enter an integer: 3\\n\",\n      \"Yep that's an integer!\\n\",\n      \"Finally, I executed!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"askint()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"So why did our function print \\\"Finally, I executed!\\\" after each trial, yet it never printed `val` itself? This is because with a try/except/finally clause, any <code>continue</code> or <code>break</code> statements are reserved until *after* the try clause is completed. This means that even though a successful input of **3** brought us to the <code>else:</code> block, and a <code>break</code> statement was thrown, the try clause continued through to <code>finally:</code> before breaking out of the while loop. And since <code>print(val)</code> was outside the try clause, the <code>break</code> statement prevented it from running.\\n\",\n    \"\\n\",\n    \"Let's make one final adjustment:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def askint():\\n\",\n    \"    while True:\\n\",\n    \"        try:\\n\",\n    \"            val = int(input(\\\"Please enter an integer: \\\"))\\n\",\n    \"        except:\\n\",\n    \"            print(\\\"Looks like you did not enter an integer!\\\")\\n\",\n    \"            continue\\n\",\n    \"        else:\\n\",\n    \"            print(\\\"Yep that's an integer!\\\")\\n\",\n    \"            print(val)\\n\",\n    \"            break\\n\",\n    \"        finally:\\n\",\n    \"            print(\\\"Finally, I executed!\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please enter an integer: six\\n\",\n      \"Looks like you did not enter an integer!\\n\",\n      \"Finally, I executed!\\n\",\n      \"Please enter an integer: 6\\n\",\n      \"Yep that's an integer!\\n\",\n      \"6\\n\",\n      \"Finally, I executed!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"askint()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Great! Now you know how to handle errors and exceptions in Python with the try, except, else, and finally notation!**\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "07-Errors and Exception Handling/.ipynb_checkpoints/02-Errors and Exceptions Homework-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Errors and Exceptions Homework\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 1\\n\",\n    \"Handle the exception thrown by the code below by using <code>try</code> and <code>except</code> blocks.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"TypeError\",\n     \"evalue\": \"unsupported operand type(s) for ** or pow(): 'str' and 'int'\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mTypeError\\u001b[0m                                 Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-1-c35f41ad7311>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      1\\u001b[0m \\u001b[1;32mfor\\u001b[0m \\u001b[0mi\\u001b[0m \\u001b[1;32min\\u001b[0m \\u001b[1;33m[\\u001b[0m\\u001b[1;34m'a'\\u001b[0m\\u001b[1;33m,\\u001b[0m\\u001b[1;34m'b'\\u001b[0m\\u001b[1;33m,\\u001b[0m\\u001b[1;34m'c'\\u001b[0m\\u001b[1;33m]\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m----> 2\\u001b[1;33m     \\u001b[0mprint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mi\\u001b[0m\\u001b[1;33m**\\u001b[0m\\u001b[1;36m2\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mTypeError\\u001b[0m: unsupported operand type(s) for ** or pow(): 'str' and 'int'\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for i in ['a','b','c']:\\n\",\n    \"    print(i**2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 2\\n\",\n    \"Handle the exception thrown by the code below by using <code>try</code> and <code>except</code> blocks. Then use a <code>finally</code> block to print 'All Done.'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"ZeroDivisionError\",\n     \"evalue\": \"division by zero\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mZeroDivisionError\\u001b[0m                         Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-2-6f985c4c80dd>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      2\\u001b[0m \\u001b[0my\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[1;36m0\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m      3\\u001b[0m \\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m----> 4\\u001b[1;33m \\u001b[0mz\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[0mx\\u001b[0m\\u001b[1;33m/\\u001b[0m\\u001b[0my\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mZeroDivisionError\\u001b[0m: division by zero\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = 5\\n\",\n    \"y = 0\\n\",\n    \"\\n\",\n    \"z = x/y\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 3\\n\",\n    \"Write a function that asks for an integer and prints the square of it. Use a <code>while</code> loop with a <code>try</code>, <code>except</code>, <code>else</code> block to account for incorrect inputs.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def ask():\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Input an integer: null\\n\",\n      \"An error occurred! Please try again!\\n\",\n      \"Input an integer: 2\\n\",\n      \"Thank you, your number squared is:  4\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"ask()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "07-Errors and Exception Handling/.ipynb_checkpoints/03-Errors and Exceptions Homework - Solution-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Errors and Exceptions Homework - Solution\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 1\\n\",\n    \"Handle the exception thrown by the code below by using <code>try</code> and <code>except</code> blocks.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"An error occurred!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"try:\\n\",\n    \"    for i in ['a','b','c']:\\n\",\n    \"        print(i**2)\\n\",\n    \"except:\\n\",\n    \"    print(\\\"An error occurred!\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 2\\n\",\n    \"Handle the exception thrown by the code below by using <code>try</code> and <code>except</code> blocks. Then use a <code>finally</code> block to print 'All Done.'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Can't divide by Zero!\\n\",\n      \"All Done!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = 5\\n\",\n    \"y = 0\\n\",\n    \"try:\\n\",\n    \"    z = x/y\\n\",\n    \"except ZeroDivisionError:\\n\",\n    \"    print(\\\"Can't divide by Zero!\\\")\\n\",\n    \"finally:\\n\",\n    \"    print('All Done!')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 3\\n\",\n    \"Write a function that asks for an integer and prints the square of it. Use a <code>while</code> loop with a <code>try</code>, <code>except</code>, <code>else</code> block to account for incorrect inputs.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def ask():\\n\",\n    \"    \\n\",\n    \"    while True:\\n\",\n    \"        try:\\n\",\n    \"            n = int(input('Input an integer: '))\\n\",\n    \"        except:\\n\",\n    \"            print('An error occurred! Please try again!')\\n\",\n    \"            continue\\n\",\n    \"        else:\\n\",\n    \"            break\\n\",\n    \"            \\n\",\n    \"        \\n\",\n    \"    print('Thank you, your number squared is: ',n**2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Input an integer: null\\n\",\n      \"An error occurred! Please try again!\\n\",\n      \"Input an integer: 2\\n\",\n      \"Thank you, your number squared is:  4\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"ask()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "07-Errors and Exception Handling/.ipynb_checkpoints/04-Unit Testing-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Unit Testing\\n\",\n    \"\\n\",\n    \"Equally important as writing good code is writing good tests. Better to find bugs yourself than have them reported to you by end users!\\n\",\n    \"\\n\",\n    \"For this section we'll be working with files outside the notebook. We'll save our code to a .py file, and then save our test script to another .py file. Normally we would code these files using a text editor like Brackets or Atom, or inside an IDE like Spyder or Pycharm. But, since we're here, let's use Jupyter!\\n\",\n    \"\\n\",\n    \"Recall that with some IPython magic we can write the contents of a cell to a file using `%%writefile`.<br>\\n\",\n    \"Something we haven't seen yet; you can run terminal commands from a jupyter cell using `!`\\n\",\n    \"\\n\",\n    \"## Testing tools\\n\",\n    \"\\n\",\n    \"There are dozens of good testing libraries out there. Most are third-party packages that require an install, such as:\\n\",\n    \"\\n\",\n    \"* [pylint](https://www.pylint.org/)\\n\",\n    \"* [pyflakes](https://pypi.python.org/pypi/pyflakes/)\\n\",\n    \"* [pep8](https://pypi.python.org/pypi/pep8)\\n\",\n    \"\\n\",\n    \"These are simple tools that merely look at your code, and they'll tell you if there are style issues or simple problems like variable names being called before assignment.\\n\",\n    \"\\n\",\n    \"A far better way to test your code is to write tests that send sample data to your program, and compare what's returned to a desired outcome.<br>Two such tools are available from the standard library:\\n\",\n    \"\\n\",\n    \"* [unittest](https://docs.python.org/3/library/unittest.html)\\n\",\n    \"* [doctest](https://docs.python.org/3/library/doctest.html)\\n\",\n    \"\\n\",\n    \"Let's look at pylint first, then we'll do some heavier lifting with unittest.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## `pylint`\\n\",\n    \"\\n\",\n    \"`pylint` tests for style as well as some very basic program logic.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"First, if you don't have it already (and you probably do, as it's part of the Anaconda distribution), you should install `pylint`.<br>Once that's done feel free to comment out the cell, you won't need it anymore.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"! pip install pylint\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's save a very simple script:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Overwriting simple1.py\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%writefile simple1.py\\n\",\n    \"a = 1\\n\",\n    \"b = 2\\n\",\n    \"print(a)\\n\",\n    \"print(B)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now let's check it using pylint\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"************* Module simple1\\n\",\n      \"C:  4, 0: Final newline missing (missing-final-newline)\\n\",\n      \"C:  1, 0: Missing module docstring (missing-docstring)\\n\",\n      \"C:  1, 0: Invalid constant name \\\"a\\\" (invalid-name)\\n\",\n      \"C:  2, 0: Invalid constant name \\\"b\\\" (invalid-name)\\n\",\n      \"E:  4, 6: Undefined variable 'B' (undefined-variable)\\n\",\n      \"\\n\",\n      \"---------------------------------------------------------------------\\n\",\n      \"\\n\",\n      \"Your code has been rated at -12.50/10 (previous run: 8.33/10, -20.83)\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"\\n\"\n     ]\n    },\n    {\n     \"name\": \"stderr\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"No config file found, using default configuration\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"! pylint simple1.py\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Pylint first lists some styling issues - it would like to see an extra newline at the end, modules and function definitions should have descriptive docstrings, and single characters are a poor choice for variable names.\\n\",\n    \"\\n\",\n    \"More importantly, however, pylint identified an error in the program - a variable called before assignment. This needs fixing.\\n\",\n    \"\\n\",\n    \"Note that pylint scored our program a negative 12.5 out of 10. Let's try to improve that!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Overwriting simple1.py\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%writefile simple1.py\\n\",\n    \"\\\"\\\"\\\"\\n\",\n    \"A very simple script.\\n\",\n    \"\\\"\\\"\\\"\\n\",\n    \"\\n\",\n    \"def myfunc():\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    An extremely simple function.\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    first = 1\\n\",\n    \"    second = 2\\n\",\n    \"    print(first)\\n\",\n    \"    print(second)\\n\",\n    \"\\n\",\n    \"myfunc()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"************* Module simple1\\n\",\n      \"C: 14, 0: Final newline missing (missing-final-newline)\\n\",\n      \"\\n\",\n      \"---------------------------------------------------------------------\\n\",\n      \"\\n\",\n      \"Your code has been rated at 8.33/10 (previous run: -12.50/10, +20.83)\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"\\n\"\n     ]\n    },\n    {\n     \"name\": \"stderr\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"No config file found, using default configuration\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"! pylint simple1.py\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Much better! Our score climbed to 8.33 out of 10. Unfortunately, the final newline has to do with how jupyter writes to a file, and there's not much we can do about that here. Still, pylint helped us troubleshoot some of our problems. But what if the problem was more complex?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Overwriting simple2.py\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%writefile simple2.py\\n\",\n    \"\\\"\\\"\\\"\\n\",\n    \"A very simple script.\\n\",\n    \"\\\"\\\"\\\"\\n\",\n    \"\\n\",\n    \"def myfunc():\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    An extremely simple function.\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    first = 1\\n\",\n    \"    second = 2\\n\",\n    \"    print(first)\\n\",\n    \"    print('second')\\n\",\n    \"\\n\",\n    \"myfunc()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"************* Module simple2\\n\",\n      \"C: 14, 0: Final newline missing (missing-final-newline)\\n\",\n      \"W: 10, 4: Unused variable 'second' (unused-variable)\\n\",\n      \"\\n\",\n      \"------------------------------------------------------------------\\n\",\n      \"\\n\",\n      \"Your code has been rated at 6.67/10 (previous run: 6.67/10, +0.00)\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"\\n\"\n     ]\n    },\n    {\n     \"name\": \"stderr\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"No config file found, using default configuration\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"! pylint simple2.py\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"pylint tells us there's an unused variable in line 10, but it doesn't know that we might get an unexpected output from line 12! For this we need a more robust set of tools. That's where `unittest` comes in.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## `unittest`\\n\",\n    \"`unittest` lets you write your own test programs. The goal is to send a specific set of data to your program, and analyze the returned results against an expected result. \\n\",\n    \"\\n\",\n    \"Let's generate a simple script that capitalizes words in a given string. We'll call it **cap.py**.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Overwriting cap.py\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%writefile cap.py\\n\",\n    \"def cap_text(text):\\n\",\n    \"    return text.capitalize()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we'll write a test script. We can call it whatever we want, but **test_cap.py** seems an obvious choice.\\n\",\n    \"\\n\",\n    \"When writing test functions, it's best to go from simple to complex, as each function will be run in order. Here we'll test simple, one-word strings, followed by a test of multiple word strings.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Overwriting test_cap.py\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%writefile test_cap.py\\n\",\n    \"import unittest\\n\",\n    \"import cap\\n\",\n    \"\\n\",\n    \"class TestCap(unittest.TestCase):\\n\",\n    \"    \\n\",\n    \"    def test_one_word(self):\\n\",\n    \"        text = 'python'\\n\",\n    \"        result = cap.cap_text(text)\\n\",\n    \"        self.assertEqual(result, 'Python')\\n\",\n    \"        \\n\",\n    \"    def test_multiple_words(self):\\n\",\n    \"        text = 'monty python'\\n\",\n    \"        result = cap.cap_text(text)\\n\",\n    \"        self.assertEqual(result, 'Monty Python')\\n\",\n    \"        \\n\",\n    \"if __name__ == '__main__':\\n\",\n    \"    unittest.main()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stderr\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"F.\\n\",\n      \"======================================================================\\n\",\n      \"FAIL: test_multiple_words (__main__.TestCap)\\n\",\n      \"----------------------------------------------------------------------\\n\",\n      \"Traceback (most recent call last):\\n\",\n      \"  File \\\"test_cap.py\\\", line 14, in test_multiple_words\\n\",\n      \"    self.assertEqual(result, 'Monty Python')\\n\",\n      \"AssertionError: 'Monty python' != 'Monty Python'\\n\",\n      \"- Monty python\\n\",\n      \"?       ^\\n\",\n      \"+ Monty Python\\n\",\n      \"?       ^\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"----------------------------------------------------------------------\\n\",\n      \"Ran 2 tests in 0.000s\\n\",\n      \"\\n\",\n      \"FAILED (failures=1)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"! python test_cap.py\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What happened? It turns out that the `.capitalize()` method only capitalizes the first letter of the first word in a string. Doing a little research on string methods, we find that `.title()` might give us what we want.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Overwriting cap.py\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%writefile cap.py\\n\",\n    \"def cap_text(text):\\n\",\n    \"    return text.title()  # replace .capitalize() with .title()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stderr\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"..\\n\",\n      \"----------------------------------------------------------------------\\n\",\n      \"Ran 2 tests in 0.000s\\n\",\n      \"\\n\",\n      \"OK\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"! python test_cap.py\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Hey, it passed! But have we tested all cases? Let's add another test to **test_cap.py** to see if it handles words with apostrophes, like *don't*.\\n\",\n    \"\\n\",\n    \"In a text editor this would be easy, but in Jupyter we have to start from scratch.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Overwriting test_cap.py\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%writefile test_cap.py\\n\",\n    \"import unittest\\n\",\n    \"import cap\\n\",\n    \"\\n\",\n    \"class TestCap(unittest.TestCase):\\n\",\n    \"    \\n\",\n    \"    def test_one_word(self):\\n\",\n    \"        text = 'python'\\n\",\n    \"        result = cap.cap_text(text)\\n\",\n    \"        self.assertEqual(result, 'Python')\\n\",\n    \"        \\n\",\n    \"    def test_multiple_words(self):\\n\",\n    \"        text = 'monty python'\\n\",\n    \"        result = cap.cap_text(text)\\n\",\n    \"        self.assertEqual(result, 'Monty Python')\\n\",\n    \"        \\n\",\n    \"    def test_with_apostrophes(self):\\n\",\n    \"        text = \\\"monty python's flying circus\\\"\\n\",\n    \"        result = cap.cap_text(text)\\n\",\n    \"        self.assertEqual(result, \\\"Monty Python's Flying Circus\\\")\\n\",\n    \"        \\n\",\n    \"if __name__ == '__main__':\\n\",\n    \"    unittest.main()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stderr\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"..F\\n\",\n      \"======================================================================\\n\",\n      \"FAIL: test_with_apostrophes (__main__.TestCap)\\n\",\n      \"----------------------------------------------------------------------\\n\",\n      \"Traceback (most recent call last):\\n\",\n      \"  File \\\"test_cap.py\\\", line 19, in test_with_apostrophes\\n\",\n      \"    self.assertEqual(result, \\\"Monty Python's Flying Circus\\\")\\n\",\n      \"AssertionError: \\\"Monty Python'S Flying Circus\\\" != \\\"Monty Python's Flying Circus\\\"\\n\",\n      \"- Monty Python'S Flying Circus\\n\",\n      \"?              ^\\n\",\n      \"+ Monty Python's Flying Circus\\n\",\n      \"?              ^\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"----------------------------------------------------------------------\\n\",\n      \"Ran 3 tests in 0.000s\\n\",\n      \"\\n\",\n      \"FAILED (failures=1)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"! python test_cap.py\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we have to find a solution that handles apostrophes! There is one (look up `capwords` from the `string` module) but we'll leave that as an exercise for the reader.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now you should have a basic understanding of unit testing!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "07-Errors and Exception Handling/01-Errors and Exceptions Handling.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Errors and Exception Handling\\n\",\n    \"\\n\",\n    \"In this lecture we will learn about Errors and Exception Handling in Python. You've definitely already encountered errors by this point in the course. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"SyntaxError\",\n     \"evalue\": \"EOL while scanning string literal (<ipython-input-1-db8c9988558c>, line 1)\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;36m  File \\u001b[1;32m\\\"<ipython-input-1-db8c9988558c>\\\"\\u001b[1;36m, line \\u001b[1;32m1\\u001b[0m\\n\\u001b[1;33m    print('Hello)\\u001b[0m\\n\\u001b[1;37m                 ^\\u001b[0m\\n\\u001b[1;31mSyntaxError\\u001b[0m\\u001b[1;31m:\\u001b[0m EOL while scanning string literal\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('Hello)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how we get a SyntaxError, with the further description that it was an EOL (End of Line Error) while scanning the string literal. This is specific enough for us to see that we forgot a single quote at the end of the line. Understanding these various error types will help you debug your code much faster. \\n\",\n    \"\\n\",\n    \"This type of error and description is known as an Exception. Even if a statement or expression is syntactically correct, it may cause an error when an attempt is made to execute it. Errors detected during execution are called exceptions and are not unconditionally fatal.\\n\",\n    \"\\n\",\n    \"You can check out the full list of built-in exceptions [here](https://docs.python.org/3/library/exceptions.html). Now let's learn how to handle errors and exceptions in our own code.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## try and except\\n\",\n    \"\\n\",\n    \"The basic terminology and syntax used to handle errors in Python are the <code>try</code> and <code>except</code> statements. The code which can cause an exception to occur is put in the <code>try</code> block and the handling of the exception is then implemented in the <code>except</code> block of code. The syntax follows:\\n\",\n    \"\\n\",\n    \"    try:\\n\",\n    \"       You do your operations here...\\n\",\n    \"       ...\\n\",\n    \"    except ExceptionI:\\n\",\n    \"       If there is ExceptionI, then execute this block.\\n\",\n    \"    except ExceptionII:\\n\",\n    \"       If there is ExceptionII, then execute this block.\\n\",\n    \"       ...\\n\",\n    \"    else:\\n\",\n    \"       If there is no exception then execute this block. \\n\",\n    \"\\n\",\n    \"We can also just check for any exception with just using <code>except:</code> To get a better understanding of all this let's check out an example: We will look at some code that opens and writes a file:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Content written successfully\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"try:\\n\",\n    \"    f = open('testfile','w')\\n\",\n    \"    f.write('Test write this')\\n\",\n    \"except IOError:\\n\",\n    \"    # This will only check for an IOError exception and then execute this print statement\\n\",\n    \"    print(\\\"Error: Could not find file or read data\\\")\\n\",\n    \"else:\\n\",\n    \"    print(\\\"Content written successfully\\\")\\n\",\n    \"    f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now let's see what would happen if we did not have write permission (opening only with 'r'):\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Error: Could not find file or read data\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"try:\\n\",\n    \"    f = open('testfile','r')\\n\",\n    \"    f.write('Test write this')\\n\",\n    \"except IOError:\\n\",\n    \"    # This will only check for an IOError exception and then execute this print statement\\n\",\n    \"    print(\\\"Error: Could not find file or read data\\\")\\n\",\n    \"else:\\n\",\n    \"    print(\\\"Content written successfully\\\")\\n\",\n    \"    f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Notice how we only printed a statement! The code still ran and we were able to continue doing actions and running code blocks. This is extremely useful when you have to account for possible input errors in your code. You can be prepared for the error and keep running code, instead of your code just breaking as we saw above.\\n\",\n    \"\\n\",\n    \"We could have also just said <code>except:</code> if we weren't sure what exception would occur. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Error: Could not find file or read data\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"try:\\n\",\n    \"    f = open('testfile','r')\\n\",\n    \"    f.write('Test write this')\\n\",\n    \"except:\\n\",\n    \"    # This will check for any exception and then execute this print statement\\n\",\n    \"    print(\\\"Error: Could not find file or read data\\\")\\n\",\n    \"else:\\n\",\n    \"    print(\\\"Content written successfully\\\")\\n\",\n    \"    f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now we don't actually need to memorize that list of exception types! Now what if we kept wanting to run code after the exception occurred? This is where <code>finally</code> comes in.\\n\",\n    \"## finally\\n\",\n    \"The <code>finally:</code> block of code will always be run regardless if there was an exception in the <code>try</code> code block. The syntax is:\\n\",\n    \"\\n\",\n    \"    try:\\n\",\n    \"       Code block here\\n\",\n    \"       ...\\n\",\n    \"       Due to any exception, this code may be skipped!\\n\",\n    \"    finally:\\n\",\n    \"       This code block would always be executed.\\n\",\n    \"\\n\",\n    \"For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Always execute finally code blocks\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"try:\\n\",\n    \"    f = open(\\\"testfile\\\", \\\"w\\\")\\n\",\n    \"    f.write(\\\"Test write statement\\\")\\n\",\n    \"    f.close()\\n\",\n    \"finally:\\n\",\n    \"    print(\\\"Always execute finally code blocks\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can use this in conjunction with <code>except</code>. Let's see a new example that will take into account a user providing the wrong input:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def askint():\\n\",\n    \"    try:\\n\",\n    \"        val = int(input(\\\"Please enter an integer: \\\"))\\n\",\n    \"    except:\\n\",\n    \"        print(\\\"Looks like you did not enter an integer!\\\")\\n\",\n    \"\\n\",\n    \"    finally:\\n\",\n    \"        print(\\\"Finally, I executed!\\\")\\n\",\n    \"    print(val)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please enter an integer: 5\\n\",\n      \"Finally, I executed!\\n\",\n      \"5\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"askint()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please enter an integer: five\\n\",\n      \"Looks like you did not enter an integer!\\n\",\n      \"Finally, I executed!\\n\"\n     ]\n    },\n    {\n     \"ename\": \"UnboundLocalError\",\n     \"evalue\": \"local variable 'val' referenced before assignment\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mUnboundLocalError\\u001b[0m                         Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-8-cc291aa76c10>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0maskint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;32m<ipython-input-6-c97dd1c75d24>\\u001b[0m in \\u001b[0;36maskint\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      7\\u001b[0m     \\u001b[1;32mfinally\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m      8\\u001b[0m         \\u001b[0mprint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;34m\\\"Finally, I executed!\\\"\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m----> 9\\u001b[1;33m     \\u001b[0mprint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mval\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mUnboundLocalError\\u001b[0m: local variable 'val' referenced before assignment\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"askint()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice how we got an error when trying to print val (because it was never properly assigned). Let's remedy this by asking the user and checking to make sure the input type is an integer:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def askint():\\n\",\n    \"    try:\\n\",\n    \"        val = int(input(\\\"Please enter an integer: \\\"))\\n\",\n    \"    except:\\n\",\n    \"        print(\\\"Looks like you did not enter an integer!\\\")\\n\",\n    \"        val = int(input(\\\"Try again-Please enter an integer: \\\"))\\n\",\n    \"    finally:\\n\",\n    \"        print(\\\"Finally, I executed!\\\")\\n\",\n    \"    print(val)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please enter an integer: five\\n\",\n      \"Looks like you did not enter an integer!\\n\",\n      \"Try again-Please enter an integer: four\\n\",\n      \"Finally, I executed!\\n\"\n     ]\n    },\n    {\n     \"ename\": \"ValueError\",\n     \"evalue\": \"invalid literal for int() with base 10: 'four'\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mValueError\\u001b[0m                                Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-9-92b5f751eb01>\\u001b[0m in \\u001b[0;36maskint\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      2\\u001b[0m     \\u001b[1;32mtry\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m----> 3\\u001b[1;33m         \\u001b[0mval\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[0mint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0minput\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;34m\\\"Please enter an integer: \\\"\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[0;32m      4\\u001b[0m     \\u001b[1;32mexcept\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[1;31mValueError\\u001b[0m: invalid literal for int() with base 10: 'five'\",\n      \"\\nDuring handling of the above exception, another exception occurred:\\n\",\n      \"\\u001b[1;31mValueError\\u001b[0m                                Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-10-cc291aa76c10>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0maskint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;32m<ipython-input-9-92b5f751eb01>\\u001b[0m in \\u001b[0;36maskint\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      4\\u001b[0m     \\u001b[1;32mexcept\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m      5\\u001b[0m         \\u001b[0mprint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;34m\\\"Looks like you did not enter an integer!\\\"\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m----> 6\\u001b[1;33m         \\u001b[0mval\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[0mint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0minput\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;34m\\\"Try again-Please enter an integer: \\\"\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[0;32m      7\\u001b[0m     \\u001b[1;32mfinally\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m      8\\u001b[0m         \\u001b[0mprint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;34m\\\"Finally, I executed!\\\"\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[1;31mValueError\\u001b[0m: invalid literal for int() with base 10: 'four'\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"askint()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Hmmm...that only did one check. How can we continually keep checking? We can use a while loop!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def askint():\\n\",\n    \"    while True:\\n\",\n    \"        try:\\n\",\n    \"            val = int(input(\\\"Please enter an integer: \\\"))\\n\",\n    \"        except:\\n\",\n    \"            print(\\\"Looks like you did not enter an integer!\\\")\\n\",\n    \"            continue\\n\",\n    \"        else:\\n\",\n    \"            print(\\\"Yep that's an integer!\\\")\\n\",\n    \"            break\\n\",\n    \"        finally:\\n\",\n    \"            print(\\\"Finally, I executed!\\\")\\n\",\n    \"        print(val)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please enter an integer: five\\n\",\n      \"Looks like you did not enter an integer!\\n\",\n      \"Finally, I executed!\\n\",\n      \"Please enter an integer: four\\n\",\n      \"Looks like you did not enter an integer!\\n\",\n      \"Finally, I executed!\\n\",\n      \"Please enter an integer: 3\\n\",\n      \"Yep that's an integer!\\n\",\n      \"Finally, I executed!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"askint()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"So why did our function print \\\"Finally, I executed!\\\" after each trial, yet it never printed `val` itself? This is because with a try/except/finally clause, any <code>continue</code> or <code>break</code> statements are reserved until *after* the try clause is completed. This means that even though a successful input of **3** brought us to the <code>else:</code> block, and a <code>break</code> statement was thrown, the try clause continued through to <code>finally:</code> before breaking out of the while loop. And since <code>print(val)</code> was outside the try clause, the <code>break</code> statement prevented it from running.\\n\",\n    \"\\n\",\n    \"Let's make one final adjustment:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def askint():\\n\",\n    \"    while True:\\n\",\n    \"        try:\\n\",\n    \"            val = int(input(\\\"Please enter an integer: \\\"))\\n\",\n    \"        except:\\n\",\n    \"            print(\\\"Looks like you did not enter an integer!\\\")\\n\",\n    \"            continue\\n\",\n    \"        else:\\n\",\n    \"            print(\\\"Yep that's an integer!\\\")\\n\",\n    \"            print(val)\\n\",\n    \"            break\\n\",\n    \"        finally:\\n\",\n    \"            print(\\\"Finally, I executed!\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Please enter an integer: six\\n\",\n      \"Looks like you did not enter an integer!\\n\",\n      \"Finally, I executed!\\n\",\n      \"Please enter an integer: 6\\n\",\n      \"Yep that's an integer!\\n\",\n      \"6\\n\",\n      \"Finally, I executed!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"askint()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Great! Now you know how to handle errors and exceptions in Python with the try, except, else, and finally notation!**\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "07-Errors and Exception Handling/02-Errors and Exceptions Homework.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Errors and Exceptions Homework\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 1\\n\",\n    \"Handle the exception thrown by the code below by using <code>try</code> and <code>except</code> blocks.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"TypeError\",\n     \"evalue\": \"unsupported operand type(s) for ** or pow(): 'str' and 'int'\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mTypeError\\u001b[0m                                 Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-1-c35f41ad7311>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      1\\u001b[0m \\u001b[1;32mfor\\u001b[0m \\u001b[0mi\\u001b[0m \\u001b[1;32min\\u001b[0m \\u001b[1;33m[\\u001b[0m\\u001b[1;34m'a'\\u001b[0m\\u001b[1;33m,\\u001b[0m\\u001b[1;34m'b'\\u001b[0m\\u001b[1;33m,\\u001b[0m\\u001b[1;34m'c'\\u001b[0m\\u001b[1;33m]\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m----> 2\\u001b[1;33m     \\u001b[0mprint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mi\\u001b[0m\\u001b[1;33m**\\u001b[0m\\u001b[1;36m2\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mTypeError\\u001b[0m: unsupported operand type(s) for ** or pow(): 'str' and 'int'\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for i in ['a','b','c']:\\n\",\n    \"    print(i**2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 2\\n\",\n    \"Handle the exception thrown by the code below by using <code>try</code> and <code>except</code> blocks. Then use a <code>finally</code> block to print 'All Done.'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"ZeroDivisionError\",\n     \"evalue\": \"division by zero\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mZeroDivisionError\\u001b[0m                         Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-2-6f985c4c80dd>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      2\\u001b[0m \\u001b[0my\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[1;36m0\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m      3\\u001b[0m \\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m----> 4\\u001b[1;33m \\u001b[0mz\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[0mx\\u001b[0m\\u001b[1;33m/\\u001b[0m\\u001b[0my\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mZeroDivisionError\\u001b[0m: division by zero\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = 5\\n\",\n    \"y = 0\\n\",\n    \"\\n\",\n    \"z = x/y\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 3\\n\",\n    \"Write a function that asks for an integer and prints the square of it. Use a <code>while</code> loop with a <code>try</code>, <code>except</code>, <code>else</code> block to account for incorrect inputs.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def ask():\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Input an integer: null\\n\",\n      \"An error occurred! Please try again!\\n\",\n      \"Input an integer: 2\\n\",\n      \"Thank you, your number squared is:  4\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"ask()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "07-Errors and Exception Handling/03-Errors and Exceptions Homework - Solution.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Errors and Exceptions Homework - Solution\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 1\\n\",\n    \"Handle the exception thrown by the code below by using <code>try</code> and <code>except</code> blocks.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"An error occurred!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"try:\\n\",\n    \"    for i in ['a','b','c']:\\n\",\n    \"        print(i**2)\\n\",\n    \"except:\\n\",\n    \"    print(\\\"An error occurred!\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 2\\n\",\n    \"Handle the exception thrown by the code below by using <code>try</code> and <code>except</code> blocks. Then use a <code>finally</code> block to print 'All Done.'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Can't divide by Zero!\\n\",\n      \"All Done!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = 5\\n\",\n    \"y = 0\\n\",\n    \"try:\\n\",\n    \"    z = x/y\\n\",\n    \"except ZeroDivisionError:\\n\",\n    \"    print(\\\"Can't divide by Zero!\\\")\\n\",\n    \"finally:\\n\",\n    \"    print('All Done!')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 3\\n\",\n    \"Write a function that asks for an integer and prints the square of it. Use a <code>while</code> loop with a <code>try</code>, <code>except</code>, <code>else</code> block to account for incorrect inputs.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def ask():\\n\",\n    \"    \\n\",\n    \"    while True:\\n\",\n    \"        try:\\n\",\n    \"            n = int(input('Input an integer: '))\\n\",\n    \"        except:\\n\",\n    \"            print('An error occurred! Please try again!')\\n\",\n    \"            continue\\n\",\n    \"        else:\\n\",\n    \"            break\\n\",\n    \"            \\n\",\n    \"        \\n\",\n    \"    print('Thank you, your number squared is: ',n**2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Input an integer: null\\n\",\n      \"An error occurred! Please try again!\\n\",\n      \"Input an integer: 2\\n\",\n      \"Thank you, your number squared is:  4\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"ask()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "07-Errors and Exception Handling/04-Unit Testing.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Unit Testing\\n\",\n    \"\\n\",\n    \"Equally important as writing good code is writing good tests. Better to find bugs yourself than have them reported to you by end users!\\n\",\n    \"\\n\",\n    \"For this section we'll be working with files outside the notebook. We'll save our code to a .py file, and then save our test script to another .py file. Normally we would code these files using a text editor like Brackets or Atom, or inside an IDE like Spyder or Pycharm. But, since we're here, let's use Jupyter!\\n\",\n    \"\\n\",\n    \"Recall that with some IPython magic we can write the contents of a cell to a file using `%%writefile`.<br>\\n\",\n    \"Something we haven't seen yet; you can run terminal commands from a jupyter cell using `!`\\n\",\n    \"\\n\",\n    \"## Testing tools\\n\",\n    \"\\n\",\n    \"There are dozens of good testing libraries out there. Most are third-party packages that require an install, such as:\\n\",\n    \"\\n\",\n    \"* [pylint](https://www.pylint.org/)\\n\",\n    \"* [pyflakes](https://pypi.python.org/pypi/pyflakes/)\\n\",\n    \"* [pep8](https://pypi.python.org/pypi/pep8)\\n\",\n    \"\\n\",\n    \"These are simple tools that merely look at your code, and they'll tell you if there are style issues or simple problems like variable names being called before assignment.\\n\",\n    \"\\n\",\n    \"A far better way to test your code is to write tests that send sample data to your program, and compare what's returned to a desired outcome.<br>Two such tools are available from the standard library:\\n\",\n    \"\\n\",\n    \"* [unittest](https://docs.python.org/3/library/unittest.html)\\n\",\n    \"* [doctest](https://docs.python.org/3/library/doctest.html)\\n\",\n    \"\\n\",\n    \"Let's look at pylint first, then we'll do some heavier lifting with unittest.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## `pylint`\\n\",\n    \"\\n\",\n    \"`pylint` tests for style as well as some very basic program logic.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"First, if you don't have it already (and you probably do, as it's part of the Anaconda distribution), you should install `pylint`.<br>Once that's done feel free to comment out the cell, you won't need it anymore.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"! pip install pylint\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's save a very simple script:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Overwriting simple1.py\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%writefile simple1.py\\n\",\n    \"a = 1\\n\",\n    \"b = 2\\n\",\n    \"print(a)\\n\",\n    \"print(B)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now let's check it using pylint\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"************* Module simple1\\n\",\n      \"simple1.py:1:0: C0114: Missing module docstring (missing-module-docstring)\\n\",\n      \"simple1.py:1:0: C0103: Constant name \\\"a\\\" doesn't conform to UPPER_CASE naming style (invalid-name)\\n\",\n      \"simple1.py:2:0: C0103: Constant name \\\"b\\\" doesn't conform to UPPER_CASE naming style (invalid-name)\\n\",\n      \"simple1.py:4:6: E0602: Undefined variable 'B' (undefined-variable)\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Report\\n\",\n      \"======\\n\",\n      \"4 statements analysed.\\n\",\n      \"\\n\",\n      \"Statistics by type\\n\",\n      \"------------------\\n\",\n      \"\\n\",\n      \"+---------+-------+-----------+-----------+------------+---------+\\n\",\n      \"|type     |number |old number |difference |%documented |%badname |\\n\",\n      \"+=========+=======+===========+===========+============+=========+\\n\",\n      \"|module   |1      |1          |=          |0.00        |0.00     |\\n\",\n      \"+---------+-------+-----------+-----------+------------+---------+\\n\",\n      \"|class    |0      |NC         |NC         |0           |0        |\\n\",\n      \"+---------+-------+-----------+-----------+------------+---------+\\n\",\n      \"|method   |0      |NC         |NC         |0           |0        |\\n\",\n      \"+---------+-------+-----------+-----------+------------+---------+\\n\",\n      \"|function |0      |1          |-1.00      |0           |0        |\\n\",\n      \"+---------+-------+-----------+-----------+------------+---------+\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"6 lines have been analyzed\\n\",\n      \"\\n\",\n      \"Raw metrics\\n\",\n      \"-----------\\n\",\n      \"\\n\",\n      \"+----------+-------+------+---------+-----------+\\n\",\n      \"|type      |number |%     |previous |difference |\\n\",\n      \"+==========+=======+======+=========+===========+\\n\",\n      \"|code      |5      |83.33 |NC       |NC         |\\n\",\n      \"+----------+-------+------+---------+-----------+\\n\",\n      \"|docstring |0      |0.00  |NC       |NC         |\\n\",\n      \"+----------+-------+------+---------+-----------+\\n\",\n      \"|comment   |0      |0.00  |NC       |NC         |\\n\",\n      \"+----------+-------+------+---------+-----------+\\n\",\n      \"|empty     |1      |16.67 |NC       |NC         |\\n\",\n      \"+----------+-------+------+---------+-----------+\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Duplication\\n\",\n      \"-----------\\n\",\n      \"\\n\",\n      \"+-------------------------+------+---------+-----------+\\n\",\n      \"|                         |now   |previous |difference |\\n\",\n      \"+=========================+======+=========+===========+\\n\",\n      \"|nb duplicated lines      |0     |0        |0          |\\n\",\n      \"+-------------------------+------+---------+-----------+\\n\",\n      \"|percent duplicated lines |0.000 |0.000    |=          |\\n\",\n      \"+-------------------------+------+---------+-----------+\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Messages by category\\n\",\n      \"--------------------\\n\",\n      \"\\n\",\n      \"+-----------+-------+---------+-----------+\\n\",\n      \"|type       |number |previous |difference |\\n\",\n      \"+===========+=======+=========+===========+\\n\",\n      \"|convention |3      |0        |0          |\\n\",\n      \"+-----------+-------+---------+-----------+\\n\",\n      \"|refactor   |0      |0        |0          |\\n\",\n      \"+-----------+-------+---------+-----------+\\n\",\n      \"|warning    |0      |0        |0          |\\n\",\n      \"+-----------+-------+---------+-----------+\\n\",\n      \"|error      |1      |0        |0          |\\n\",\n      \"+-----------+-------+---------+-----------+\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Messages\\n\",\n      \"--------\\n\",\n      \"\\n\",\n      \"+-------------------------+------------+\\n\",\n      \"|message id               |occurrences |\\n\",\n      \"+=========================+============+\\n\",\n      \"|invalid-name             |2           |\\n\",\n      \"+-------------------------+------------+\\n\",\n      \"|undefined-variable       |1           |\\n\",\n      \"+-------------------------+------------+\\n\",\n      \"|missing-module-docstring |1           |\\n\",\n      \"+-------------------------+------------+\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"--------------------------------------------------------------------\\n\",\n      \"Your code has been rated at 0.00/10 (previous run: 10.00/10, -10.00)\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"! pylint -r y simple1.py\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Pylint first lists some styling issues - modules and function definitions should have descriptive docstrings, and single characters are a poor choice for variable names.\\n\",\n    \"\\n\",\n    \"More importantly, however, pylint identified an error in the program - a variable called before assignment. This needs fixing.\\n\",\n    \"\\n\",\n    \"Note that pylint scored our program 0 out of 10. Let's try to improve that!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Overwriting simple1.py\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%writefile simple1.py\\n\",\n    \"\\\"\\\"\\\"\\n\",\n    \"A very simple script.\\n\",\n    \"\\\"\\\"\\\"\\n\",\n    \"\\n\",\n    \"def myfunc():\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    An extremely simple function.\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    first = 1\\n\",\n    \"    second = 2\\n\",\n    \"    print(first)\\n\",\n    \"    print(second)\\n\",\n    \"\\n\",\n    \"myfunc()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\n\",\n      \"\\n\",\n      \"Report\\n\",\n      \"======\\n\",\n      \"6 statements analysed.\\n\",\n      \"\\n\",\n      \"Statistics by type\\n\",\n      \"------------------\\n\",\n      \"\\n\",\n      \"+---------+-------+-----------+-----------+------------+---------+\\n\",\n      \"|type     |number |old number |difference |%documented |%badname |\\n\",\n      \"+=========+=======+===========+===========+============+=========+\\n\",\n      \"|module   |1      |1          |=          |100.00      |0.00     |\\n\",\n      \"+---------+-------+-----------+-----------+------------+---------+\\n\",\n      \"|class    |0      |NC         |NC         |0           |0        |\\n\",\n      \"+---------+-------+-----------+-----------+------------+---------+\\n\",\n      \"|method   |0      |NC         |NC         |0           |0        |\\n\",\n      \"+---------+-------+-----------+-----------+------------+---------+\\n\",\n      \"|function |1      |NC         |NC         |100.00      |0.00     |\\n\",\n      \"+---------+-------+-----------+-----------+------------+---------+\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"16 lines have been analyzed\\n\",\n      \"\\n\",\n      \"Raw metrics\\n\",\n      \"-----------\\n\",\n      \"\\n\",\n      \"+----------+-------+------+---------+-----------+\\n\",\n      \"|type      |number |%     |previous |difference |\\n\",\n      \"+==========+=======+======+=========+===========+\\n\",\n      \"|code      |7      |43.75 |5        |+2.00      |\\n\",\n      \"+----------+-------+------+---------+-----------+\\n\",\n      \"|docstring |6      |37.50 |NC       |NC         |\\n\",\n      \"+----------+-------+------+---------+-----------+\\n\",\n      \"|comment   |0      |0.00  |NC       |NC         |\\n\",\n      \"+----------+-------+------+---------+-----------+\\n\",\n      \"|empty     |3      |18.75 |1        |+2.00      |\\n\",\n      \"+----------+-------+------+---------+-----------+\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Duplication\\n\",\n      \"-----------\\n\",\n      \"\\n\",\n      \"+-------------------------+------+---------+-----------+\\n\",\n      \"|                         |now   |previous |difference |\\n\",\n      \"+=========================+======+=========+===========+\\n\",\n      \"|nb duplicated lines      |0     |0        |0          |\\n\",\n      \"+-------------------------+------+---------+-----------+\\n\",\n      \"|percent duplicated lines |0.000 |0.000    |=          |\\n\",\n      \"+-------------------------+------+---------+-----------+\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Messages by category\\n\",\n      \"--------------------\\n\",\n      \"\\n\",\n      \"+-----------+-------+---------+-----------+\\n\",\n      \"|type       |number |previous |difference |\\n\",\n      \"+===========+=======+=========+===========+\\n\",\n      \"|convention |0      |3        |3          |\\n\",\n      \"+-----------+-------+---------+-----------+\\n\",\n      \"|refactor   |0      |0        |0          |\\n\",\n      \"+-----------+-------+---------+-----------+\\n\",\n      \"|warning    |0      |0        |0          |\\n\",\n      \"+-----------+-------+---------+-----------+\\n\",\n      \"|error      |0      |1        |1          |\\n\",\n      \"+-----------+-------+---------+-----------+\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Messages\\n\",\n      \"--------\\n\",\n      \"\\n\",\n      \"+-----------+------------+\\n\",\n      \"|message id |occurrences |\\n\",\n      \"+===========+============+\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"--------------------------------------------------------------------\\n\",\n      \"Your code has been rated at 10.00/10 (previous run: 0.00/10, +10.00)\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"! pylint -r y simple1.py\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Excellent! Our score climbed to 10 out of 10. But what if the problem was more complex?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Overwriting simple2.py\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%writefile simple2.py\\n\",\n    \"\\\"\\\"\\\"\\n\",\n    \"A very simple script.\\n\",\n    \"\\\"\\\"\\\"\\n\",\n    \"\\n\",\n    \"def myfunc():\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    An extremely simple function.\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    first = 1\\n\",\n    \"    second = 2\\n\",\n    \"    print(first)\\n\",\n    \"    print('second')\\n\",\n    \"\\n\",\n    \"myfunc()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"************* Module simple2\\n\",\n      \"simple2.py:10:4: W0612: Unused variable 'second' (unused-variable)\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Report\\n\",\n      \"======\\n\",\n      \"6 statements analysed.\\n\",\n      \"\\n\",\n      \"Statistics by type\\n\",\n      \"------------------\\n\",\n      \"\\n\",\n      \"+---------+-------+-----------+-----------+------------+---------+\\n\",\n      \"|type     |number |old number |difference |%documented |%badname |\\n\",\n      \"+=========+=======+===========+===========+============+=========+\\n\",\n      \"|module   |1      |1          |=          |100.00      |0.00     |\\n\",\n      \"+---------+-------+-----------+-----------+------------+---------+\\n\",\n      \"|class    |0      |NC         |NC         |0           |0        |\\n\",\n      \"+---------+-------+-----------+-----------+------------+---------+\\n\",\n      \"|method   |0      |NC         |NC         |0           |0        |\\n\",\n      \"+---------+-------+-----------+-----------+------------+---------+\\n\",\n      \"|function |1      |1          |=          |100.00      |0.00     |\\n\",\n      \"+---------+-------+-----------+-----------+------------+---------+\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"16 lines have been analyzed\\n\",\n      \"\\n\",\n      \"Raw metrics\\n\",\n      \"-----------\\n\",\n      \"\\n\",\n      \"+----------+-------+------+---------+-----------+\\n\",\n      \"|type      |number |%     |previous |difference |\\n\",\n      \"+==========+=======+======+=========+===========+\\n\",\n      \"|code      |7      |43.75 |NC       |NC         |\\n\",\n      \"+----------+-------+------+---------+-----------+\\n\",\n      \"|docstring |6      |37.50 |NC       |NC         |\\n\",\n      \"+----------+-------+------+---------+-----------+\\n\",\n      \"|comment   |0      |0.00  |NC       |NC         |\\n\",\n      \"+----------+-------+------+---------+-----------+\\n\",\n      \"|empty     |3      |18.75 |NC       |NC         |\\n\",\n      \"+----------+-------+------+---------+-----------+\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Duplication\\n\",\n      \"-----------\\n\",\n      \"\\n\",\n      \"+-------------------------+------+---------+-----------+\\n\",\n      \"|                         |now   |previous |difference |\\n\",\n      \"+=========================+======+=========+===========+\\n\",\n      \"|nb duplicated lines      |0     |0        |0          |\\n\",\n      \"+-------------------------+------+---------+-----------+\\n\",\n      \"|percent duplicated lines |0.000 |0.000    |=          |\\n\",\n      \"+-------------------------+------+---------+-----------+\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Messages by category\\n\",\n      \"--------------------\\n\",\n      \"\\n\",\n      \"+-----------+-------+---------+-----------+\\n\",\n      \"|type       |number |previous |difference |\\n\",\n      \"+===========+=======+=========+===========+\\n\",\n      \"|convention |0      |0        |0          |\\n\",\n      \"+-----------+-------+---------+-----------+\\n\",\n      \"|refactor   |0      |0        |0          |\\n\",\n      \"+-----------+-------+---------+-----------+\\n\",\n      \"|warning    |1      |1        |1          |\\n\",\n      \"+-----------+-------+---------+-----------+\\n\",\n      \"|error      |0      |0        |0          |\\n\",\n      \"+-----------+-------+---------+-----------+\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Messages\\n\",\n      \"--------\\n\",\n      \"\\n\",\n      \"+----------------+------------+\\n\",\n      \"|message id      |occurrences |\\n\",\n      \"+================+============+\\n\",\n      \"|unused-variable |1           |\\n\",\n      \"+----------------+------------+\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"------------------------------------------------------------------\\n\",\n      \"Your code has been rated at 8.33/10 (previous run: 8.33/10, +0.00)\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"! pylint -r y simple2.py\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"pylint tells us there's an unused variable in line 10, but it doesn't know that we might get an unexpected output from line 12! For this we need a more robust set of tools. That's where `unittest` comes in.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## `unittest`\\n\",\n    \"`unittest` lets you write your own test programs. The goal is to send a specific set of data to your program, and analyze the returned results against an expected result. \\n\",\n    \"\\n\",\n    \"Let's generate a simple script that capitalizes words in a given string. We'll call it **cap.py**.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Overwriting cap.py\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%writefile cap.py\\n\",\n    \"def cap_text(text):\\n\",\n    \"    return text.capitalize()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we'll write a test script. We can call it whatever we want, but **test_cap.py** seems an obvious choice.\\n\",\n    \"\\n\",\n    \"When writing test functions, it's best to go from simple to complex, as each function will be run in order. Here we'll test simple, one-word strings, followed by a test of multiple word strings.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Overwriting test_cap.py\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%writefile test_cap.py\\n\",\n    \"import unittest\\n\",\n    \"import cap\\n\",\n    \"\\n\",\n    \"class TestCap(unittest.TestCase):\\n\",\n    \"    \\n\",\n    \"    def test_one_word(self):\\n\",\n    \"        text = 'python'\\n\",\n    \"        result = cap.cap_text(text)\\n\",\n    \"        self.assertEqual(result, 'Python')\\n\",\n    \"        \\n\",\n    \"    def test_multiple_words(self):\\n\",\n    \"        text = 'monty python'\\n\",\n    \"        result = cap.cap_text(text)\\n\",\n    \"        self.assertEqual(result, 'Monty Python')\\n\",\n    \"        \\n\",\n    \"if __name__ == '__main__':\\n\",\n    \"    unittest.main()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"F.\\n\",\n      \"======================================================================\\n\",\n      \"FAIL: test_multiple_words (__main__.TestCap.test_multiple_words)\\n\",\n      \"----------------------------------------------------------------------\\n\",\n      \"Traceback (most recent call last):\\n\",\n      \"  File \\\"/Users/marci/GIT/Udemy/Complete-Python-3-Bootcamp/07-Errors and Exception Handling/test_cap.py\\\", line 14, in test_multiple_words\\n\",\n      \"    self.assertEqual(result, 'Monty Python')\\n\",\n      \"AssertionError: 'Monty python' != 'Monty Python'\\n\",\n      \"- Monty python\\n\",\n      \"?       ^\\n\",\n      \"+ Monty Python\\n\",\n      \"?       ^\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"----------------------------------------------------------------------\\n\",\n      \"Ran 2 tests in 0.000s\\n\",\n      \"\\n\",\n      \"FAILED (failures=1)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"! python test_cap.py\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What happened? It turns out that the `.capitalize()` method only capitalizes the first letter of the first word in a string. Doing a little research on string methods, we find that `.title()` might give us what we want.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Overwriting cap.py\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%writefile cap.py\\n\",\n    \"def cap_text(text):\\n\",\n    \"    return text.title()  # replace .capitalize() with .title()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"..\\n\",\n      \"----------------------------------------------------------------------\\n\",\n      \"Ran 2 tests in 0.000s\\n\",\n      \"\\n\",\n      \"OK\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"! python test_cap.py\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Hey, it passed! But have we tested all cases? Let's add another test to **test_cap.py** to see if it handles words with apostrophes, like *don't*.\\n\",\n    \"\\n\",\n    \"In a text editor this would be easy, but in Jupyter we have to start from scratch.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Overwriting test_cap.py\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%writefile test_cap.py\\n\",\n    \"import unittest\\n\",\n    \"import cap\\n\",\n    \"\\n\",\n    \"class TestCap(unittest.TestCase):\\n\",\n    \"    \\n\",\n    \"    def test_one_word(self):\\n\",\n    \"        text = 'python'\\n\",\n    \"        result = cap.cap_text(text)\\n\",\n    \"        self.assertEqual(result, 'Python')\\n\",\n    \"        \\n\",\n    \"    def test_multiple_words(self):\\n\",\n    \"        text = 'monty python'\\n\",\n    \"        result = cap.cap_text(text)\\n\",\n    \"        self.assertEqual(result, 'Monty Python')\\n\",\n    \"        \\n\",\n    \"    def test_with_apostrophes(self):\\n\",\n    \"        text = \\\"monty python's flying circus\\\"\\n\",\n    \"        result = cap.cap_text(text)\\n\",\n    \"        self.assertEqual(result, \\\"Monty Python's Flying Circus\\\")\\n\",\n    \"        \\n\",\n    \"if __name__ == '__main__':\\n\",\n    \"    unittest.main()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"..F\\n\",\n      \"======================================================================\\n\",\n      \"FAIL: test_with_apostrophes (__main__.TestCap.test_with_apostrophes)\\n\",\n      \"----------------------------------------------------------------------\\n\",\n      \"Traceback (most recent call last):\\n\",\n      \"  File \\\"/Users/marci/GIT/Udemy/Complete-Python-3-Bootcamp/07-Errors and Exception Handling/test_cap.py\\\", line 19, in test_with_apostrophes\\n\",\n      \"    self.assertEqual(result, \\\"Monty Python's Flying Circus\\\")\\n\",\n      \"AssertionError: \\\"Monty Python'S Flying Circus\\\" != \\\"Monty Python's Flying Circus\\\"\\n\",\n      \"- Monty Python'S Flying Circus\\n\",\n      \"?              ^\\n\",\n      \"+ Monty Python's Flying Circus\\n\",\n      \"?              ^\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"----------------------------------------------------------------------\\n\",\n      \"Ran 3 tests in 0.000s\\n\",\n      \"\\n\",\n      \"FAILED (failures=1)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"! python test_cap.py\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we have to find a solution that handles apostrophes! There is one (look up `capwords` from the `string` module) but we'll leave that as an exercise for the reader.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now you should have a basic understanding of unit testing!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python [conda env:base] *\",\n   \"language\": \"python\",\n   \"name\": \"conda-base-py\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.12.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "07-Errors and Exception Handling/cap.py",
    "content": "def cap_text(text):\n    return text.title()  # replace .capitalize() with .title()"
  },
  {
    "path": "07-Errors and Exception Handling/simple1.py",
    "content": "\"\"\"\nA very simple script.\n\"\"\"\n\ndef myfunc():\n    \"\"\"\n    An extremely simple function.\n    \"\"\"\n    first = 1\n    second = 2\n    print(first)\n    print(second)\n\nmyfunc()"
  },
  {
    "path": "07-Errors and Exception Handling/simple2.py",
    "content": "\"\"\"\nA very simple script.\n\"\"\"\n\ndef myfunc():\n    \"\"\"\n    An extremely simple function.\n    \"\"\"\n    first = 1\n    second = 2\n    print(first)\n    print('second')\n\nmyfunc()"
  },
  {
    "path": "07-Errors and Exception Handling/test_cap.py",
    "content": "import unittest\nimport cap\n\nclass TestCap(unittest.TestCase):\n    \n    def test_one_word(self):\n        text = 'python'\n        result = cap.cap_text(text)\n        self.assertEqual(result, 'Python')\n        \n    def test_multiple_words(self):\n        text = 'monty python'\n        result = cap.cap_text(text)\n        self.assertEqual(result, 'Monty Python')\n        \n    def test_with_apostrophes(self):\n        text = \"monty python's flying circus\"\n        result = cap.cap_text(text)\n        self.assertEqual(result, \"Monty Python's Flying Circus\")\n        \nif __name__ == '__main__':\n    unittest.main()"
  },
  {
    "path": "07-Errors and Exception Handling/testfile",
    "content": "Test write statement"
  },
  {
    "path": "08-Milestone Project - 2/.ipynb_checkpoints/00-Milestone-2-Warmup-Project-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# Warmup Project Exercise\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Simple War Game\\n\",\n    \"\\n\",\n    \"Before we launch in to the OOP Milestone 2 Project, let's walk through together on using OOP for a more robust and complex application, such as a game. We will use Python OOP to simulate a simplified version of the game war. Two players will each start off with half the deck, then they each remove a card, compare which card has the highest value, and the player with the higher card wins both cards. In the event of a time\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Single Card Class\\n\",\n    \"\\n\",\n    \"### Creating a Card Class with outside variables\\n\",\n    \"\\n\",\n    \"Here we will use some outside variables that we know don't change regardless of the situation, such as a deck of cards. Regardless of what round,match, or game we're playing, we'll still need the same deck of cards.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# We'll use this later\\n\",\n    \"import random \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"suits = ('Hearts', 'Diamonds', 'Spades', 'Clubs')\\n\",\n    \"ranks = ('Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Jack', 'Queen', 'King', 'Ace')\\n\",\n    \"values = {'Two':2, 'Three':3, 'Four':4, 'Five':5, 'Six':6, 'Seven':7, 'Eight':8, \\n\",\n    \"            'Nine':9, 'Ten':10, 'Jack':11, 'Queen':12, 'King':13, 'Ace':14}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Card:\\n\",\n    \"    \\n\",\n    \"    def __init__(self,suit,rank):\\n\",\n    \"        self.suit = suit\\n\",\n    \"        self.rank = rank\\n\",\n    \"        self.value = values[rank]\\n\",\n    \"        \\n\",\n    \"    def __str__(self):\\n\",\n    \"        return self.rank + ' of ' + self.suit\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Create an example card\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hearts'\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"suits[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Two'\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"ranks[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"two_hearts = Card(suits[0],ranks[0])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<__main__.Card at 0x1dfaff6b898>\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"two_hearts\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Two of Hearts\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(two_hearts)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Two'\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"two_hearts.rank\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"two_hearts.value\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"values[two_hearts.rank]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Deck Class\\n\",\n    \"\\n\",\n    \"### Using a class within another class\\n\",\n    \"\\n\",\n    \"We just created a single card, but how can we create an entire Deck of cards? Let's explore doing this with a class that utilizes the Card class.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"A Deck will be made up of multiple Cards. Which mean's we will actually use the Card class within the \\\\_\\\\_init__ of the Deck class.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Deck:\\n\",\n    \"    \\n\",\n    \"    def __init__(self):\\n\",\n    \"        # Note this only happens once upon creation of a new Deck\\n\",\n    \"        self.all_cards = [] \\n\",\n    \"        for suit in suits:\\n\",\n    \"            for rank in ranks:\\n\",\n    \"                # This assumes the Card class has already been defined!\\n\",\n    \"                self.all_cards.append(Card(suit,rank))\\n\",\n    \"                \\n\",\n    \"    def shuffle(self):\\n\",\n    \"        # Note this doesn't return anything\\n\",\n    \"        random.shuffle(self.all_cards)\\n\",\n    \"        \\n\",\n    \"    def deal_one(self):\\n\",\n    \"        # Note we remove one card from the list of all_cards\\n\",\n    \"        return self.all_cards.pop()        \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Create a Deck\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"mydeck = Deck()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"52\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(mydeck.all_cards)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<__main__.Card at 0x1dfaff269e8>\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mydeck.all_cards[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Two of Hearts\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(mydeck.all_cards[0])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"mydeck.shuffle()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Five of Spades\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(mydeck.all_cards[0])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_card = mydeck.deal_one()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"King of Clubs\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(my_card)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Player Class\\n\",\n    \"\\n\",\n    \"Let's create a Player Class, a player should be able to hold instances of Cards, they should also be able to remove and add them from their hand. We want the Player class to be flexible enough to add one card, or many cards so we'll use a simple if check to keep it all in the same method.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We'll keep this all in mind as we create the methods for the Player class.\\n\",\n    \"\\n\",\n    \"### Player Class\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Player:\\n\",\n    \"    \\n\",\n    \"    def __init__(self,name):\\n\",\n    \"        self.name = name\\n\",\n    \"        # A new player has no cards\\n\",\n    \"        self.all_cards = [] \\n\",\n    \"        \\n\",\n    \"    def remove_one(self):\\n\",\n    \"        # Note we remove one card from the list of all_cards\\n\",\n    \"        # We state 0 to remove from the \\\"top\\\" of the deck\\n\",\n    \"        # We'll imagine index -1 as the bottom of the deck\\n\",\n    \"        return self.all_cards.pop(0)\\n\",\n    \"    \\n\",\n    \"    def add_cards(self,new_cards):\\n\",\n    \"        if type(new_cards) == type([]):\\n\",\n    \"            self.all_cards.extend(new_cards)\\n\",\n    \"        else:\\n\",\n    \"            self.all_cards.append(new_cards)\\n\",\n    \"    \\n\",\n    \"    \\n\",\n    \"    def __str__(self):\\n\",\n    \"        return f'Player {self.name} has {len(self.all_cards)} cards.'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"jose = Player(\\\"Jose\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<__main__.Player at 0x1dfaff8b940>\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"jose\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Player Jose has 0 cards.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(jose)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<__main__.Card at 0x1dfaff6b898>\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"two_hearts\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"jose.add_cards(two_hearts)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Player Jose has 1 cards.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(jose)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"jose.add_cards([two_hearts,two_hearts,two_hearts])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Player Jose has 4 cards.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(jose)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## War Game Logic\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"player_one = Player(\\\"One\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"player_two = Player(\\\"Two\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Setup New Game\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"new_deck = Deck()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"new_deck.shuffle()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Split the Deck between players\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"26.0\"\n      ]\n     },\n     \"execution_count\": 35,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(new_deck.all_cards)/2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"for x in range(26):\\n\",\n    \"    player_one.add_cards(new_deck.deal_one())\\n\",\n    \"    player_two.add_cards(new_deck.deal_one())\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0\"\n      ]\n     },\n     \"execution_count\": 37,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(new_deck.all_cards)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 38,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"26\"\n      ]\n     },\n     \"execution_count\": 38,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(player_one.all_cards)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"26\"\n      ]\n     },\n     \"execution_count\": 39,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(player_two.all_cards)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Play the Game\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 40,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import pdb\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"game_on = True\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 42,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Round 1\\n\",\n      \"Round 2\\n\",\n      \"Round 3\\n\",\n      \"Round 4\\n\",\n      \"Round 5\\n\",\n      \"Round 6\\n\",\n      \"Round 7\\n\",\n      \"Round 8\\n\",\n      \"Round 9\\n\",\n      \"Round 10\\n\",\n      \"Round 11\\n\",\n      \"Round 12\\n\",\n      \"Round 13\\n\",\n      \"Round 14\\n\",\n      \"Round 15\\n\",\n      \"Round 16\\n\",\n      \"Round 17\\n\",\n      \"Round 18\\n\",\n      \"Round 19\\n\",\n      \"Round 20\\n\",\n      \"Round 21\\n\",\n      \"Round 22\\n\",\n      \"Round 23\\n\",\n      \"Round 24\\n\",\n      \"Round 25\\n\",\n      \"Round 26\\n\",\n      \"Round 27\\n\",\n      \"Player One out of cards! Game Over\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"round_num = 0\\n\",\n    \"while game_on:\\n\",\n    \"    \\n\",\n    \"    round_num += 1\\n\",\n    \"    print(f\\\"Round {round_num}\\\")\\n\",\n    \"    \\n\",\n    \"    # Check to see if a player is out of cards:\\n\",\n    \"    if len(player_one.all_cards) == 0:\\n\",\n    \"        print(\\\"Player One out of cards! Game Over\\\")\\n\",\n    \"        print(\\\"Player Two Wins!\\\")\\n\",\n    \"        game_on = False\\n\",\n    \"        break\\n\",\n    \"        \\n\",\n    \"    if len(player_two.all_cards) == 0:\\n\",\n    \"        print(\\\"Player Two out of cards! Game Over\\\")\\n\",\n    \"        print(\\\"Player One Wins!\\\")\\n\",\n    \"        game_on = False\\n\",\n    \"        break\\n\",\n    \"    \\n\",\n    \"    # Otherwise, the game is still on!\\n\",\n    \"    \\n\",\n    \"    # Start a new round and reset current cards \\\"on the table\\\"\\n\",\n    \"    player_one_cards = []\\n\",\n    \"    player_one_cards.append(player_one.remove_one())\\n\",\n    \"    \\n\",\n    \"    player_two_cards = []\\n\",\n    \"    player_two_cards.append(player_two.remove_one())\\n\",\n    \"    \\n\",\n    \"    at_war = True\\n\",\n    \"\\n\",\n    \"    while at_war:\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"        if player_one_cards[-1].value > player_two_cards[-1].value:\\n\",\n    \"\\n\",\n    \"            # Player One gets the cards\\n\",\n    \"            player_one.add_cards(player_one_cards)\\n\",\n    \"            player_one.add_cards(player_two_cards)\\n\",\n    \"            \\n\",\n    \"            \\n\",\n    \"            # No Longer at \\\"war\\\" , time for next round\\n\",\n    \"            at_war = False\\n\",\n    \"        \\n\",\n    \"        # Player Two Has higher Card\\n\",\n    \"        elif player_one_cards[-1].value < player_two_cards[-1].value:\\n\",\n    \"\\n\",\n    \"            # Player Two gets the cards\\n\",\n    \"            player_two.add_cards(player_one_cards)\\n\",\n    \"            player_two.add_cards(player_two_cards)\\n\",\n    \"            \\n\",\n    \"            # No Longer at \\\"war\\\" , time for next round\\n\",\n    \"            at_war = False\\n\",\n    \"\\n\",\n    \"        else:\\n\",\n    \"            print('WAR!')\\n\",\n    \"            # This occurs when the cards are equal.\\n\",\n    \"            # We'll grab another card each and continue the current war.\\n\",\n    \"            \\n\",\n    \"            # First check to see if player has enough cards\\n\",\n    \"            \\n\",\n    \"            # Check to see if a player is out of cards:\\n\",\n    \"            if len(player_one.all_cards) < 5:\\n\",\n    \"                print(\\\"Player One unable to play war! Game Over at War\\\")\\n\",\n    \"                print(\\\"Player Two Wins! Player One Loses!\\\")\\n\",\n    \"                game_on = False\\n\",\n    \"                break\\n\",\n    \"\\n\",\n    \"            elif len(player_two.all_cards) < 5:\\n\",\n    \"                print(\\\"Player Two unable to play war! Game Over at War\\\")\\n\",\n    \"                print(\\\"Player One Wins! Player One Loses!\\\")\\n\",\n    \"                game_on = False\\n\",\n    \"                break\\n\",\n    \"            # Otherwise, we're still at war, so we'll add the next cards\\n\",\n    \"            else:\\n\",\n    \"                for num in range(5):\\n\",\n    \"                    player_one_cards.append(player_one.remove_one())\\n\",\n    \"                    player_two_cards.append(player_two.remove_one())\\n\",\n    \"        \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Game Setup in One Cell\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 62,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"player_one = Player(\\\"One\\\")\\n\",\n    \"player_two = Player(\\\"Two\\\")\\n\",\n    \"\\n\",\n    \"new_deck = Deck()\\n\",\n    \"new_deck.shuffle()\\n\",\n    \"\\n\",\n    \"for x in range(26):\\n\",\n    \"    player_one.add_cards(new_deck.deal_one())\\n\",\n    \"    player_two.add_cards(new_deck.deal_one())\\n\",\n    \"    \\n\",\n    \"game_on = True\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 63,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Round 1\\n\",\n      \"Round 2\\n\",\n      \"WAR!\\n\",\n      \"Round 3\\n\",\n      \"WAR!\\n\",\n      \"WAR!\\n\",\n      \"Round 4\\n\",\n      \"WAR!\\n\",\n      \"Round 5\\n\",\n      \"Round 6\\n\",\n      \"Round 7\\n\",\n      \"Round 8\\n\",\n      \"Round 9\\n\",\n      \"Round 10\\n\",\n      \"Round 11\\n\",\n      \"Round 12\\n\",\n      \"Round 13\\n\",\n      \"WAR!\\n\",\n      \"Round 14\\n\",\n      \"Round 15\\n\",\n      \"WAR!\\n\",\n      \"Round 16\\n\",\n      \"Round 17\\n\",\n      \"Round 18\\n\",\n      \"Round 19\\n\",\n      \"Round 20\\n\",\n      \"Round 21\\n\",\n      \"Round 22\\n\",\n      \"Round 23\\n\",\n      \"Round 24\\n\",\n      \"Round 25\\n\",\n      \"Round 26\\n\",\n      \"Round 27\\n\",\n      \"Round 28\\n\",\n      \"Round 29\\n\",\n      \"WAR!\\n\",\n      \"Round 30\\n\",\n      \"Round 31\\n\",\n      \"Round 32\\n\",\n      \"WAR!\\n\",\n      \"Round 33\\n\",\n      \"Round 34\\n\",\n      \"Round 35\\n\",\n      \"Round 36\\n\",\n      \"Round 37\\n\",\n      \"Round 38\\n\",\n      \"Round 39\\n\",\n      \"Round 40\\n\",\n      \"Round 41\\n\",\n      \"Round 42\\n\",\n      \"WAR!\\n\",\n      \"WAR!\\n\",\n      \"Round 43\\n\",\n      \"Round 44\\n\",\n      \"Round 45\\n\",\n      \"Round 46\\n\",\n      \"Round 47\\n\",\n      \"Round 48\\n\",\n      \"Round 49\\n\",\n      \"Round 50\\n\",\n      \"Round 51\\n\",\n      \"Round 52\\n\",\n      \"Round 53\\n\",\n      \"Round 54\\n\",\n      \"Round 55\\n\",\n      \"Round 56\\n\",\n      \"Round 57\\n\",\n      \"Round 58\\n\",\n      \"Round 59\\n\",\n      \"Round 60\\n\",\n      \"Round 61\\n\",\n      \"Round 62\\n\",\n      \"Round 63\\n\",\n      \"Round 64\\n\",\n      \"Round 65\\n\",\n      \"Round 66\\n\",\n      \"Round 67\\n\",\n      \"Round 68\\n\",\n      \"Round 69\\n\",\n      \"Round 70\\n\",\n      \"Round 71\\n\",\n      \"Round 72\\n\",\n      \"Round 73\\n\",\n      \"Round 74\\n\",\n      \"Round 75\\n\",\n      \"Round 76\\n\",\n      \"Round 77\\n\",\n      \"Round 78\\n\",\n      \"Round 79\\n\",\n      \"Round 80\\n\",\n      \"Round 81\\n\",\n      \"Round 82\\n\",\n      \"Round 83\\n\",\n      \"Round 84\\n\",\n      \"Round 85\\n\",\n      \"Round 86\\n\",\n      \"Round 87\\n\",\n      \"Round 88\\n\",\n      \"Round 89\\n\",\n      \"Round 90\\n\",\n      \"Round 91\\n\",\n      \"Round 92\\n\",\n      \"Round 93\\n\",\n      \"Round 94\\n\",\n      \"Round 95\\n\",\n      \"Round 96\\n\",\n      \"Round 97\\n\",\n      \"Round 98\\n\",\n      \"Round 99\\n\",\n      \"Round 100\\n\",\n      \"Round 101\\n\",\n      \"Round 102\\n\",\n      \"Round 103\\n\",\n      \"Round 104\\n\",\n      \"Round 105\\n\",\n      \"Round 106\\n\",\n      \"Round 107\\n\",\n      \"Round 108\\n\",\n      \"WAR!\\n\",\n      \"Round 109\\n\",\n      \"Round 110\\n\",\n      \"Round 111\\n\",\n      \"Round 112\\n\",\n      \"Round 113\\n\",\n      \"Round 114\\n\",\n      \"Round 115\\n\",\n      \"Round 116\\n\",\n      \"Round 117\\n\",\n      \"Round 118\\n\",\n      \"Round 119\\n\",\n      \"Round 120\\n\",\n      \"Round 121\\n\",\n      \"Round 122\\n\",\n      \"Round 123\\n\",\n      \"Round 124\\n\",\n      \"Round 125\\n\",\n      \"Round 126\\n\",\n      \"Round 127\\n\",\n      \"Round 128\\n\",\n      \"Round 129\\n\",\n      \"Round 130\\n\",\n      \"Round 131\\n\",\n      \"Round 132\\n\",\n      \"Round 133\\n\",\n      \"Round 134\\n\",\n      \"WAR!\\n\",\n      \"Round 135\\n\",\n      \"Round 136\\n\",\n      \"WAR!\\n\",\n      \"Round 137\\n\",\n      \"WAR!\\n\",\n      \"Round 138\\n\",\n      \"Round 139\\n\",\n      \"Round 140\\n\",\n      \"Round 141\\n\",\n      \"Round 142\\n\",\n      \"Round 143\\n\",\n      \"Round 144\\n\",\n      \"Round 145\\n\",\n      \"Round 146\\n\",\n      \"Round 147\\n\",\n      \"Round 148\\n\",\n      \"Round 149\\n\",\n      \"Round 150\\n\",\n      \"Round 151\\n\",\n      \"Round 152\\n\",\n      \"Round 153\\n\",\n      \"Round 154\\n\",\n      \"Round 155\\n\",\n      \"Round 156\\n\",\n      \"Round 157\\n\",\n      \"Round 158\\n\",\n      \"Round 159\\n\",\n      \"Round 160\\n\",\n      \"Round 161\\n\",\n      \"Round 162\\n\",\n      \"Round 163\\n\",\n      \"Round 164\\n\",\n      \"Round 165\\n\",\n      \"Round 166\\n\",\n      \"Round 167\\n\",\n      \"Round 168\\n\",\n      \"Round 169\\n\",\n      \"Round 170\\n\",\n      \"Round 171\\n\",\n      \"Round 172\\n\",\n      \"Round 173\\n\",\n      \"Round 174\\n\",\n      \"Round 175\\n\",\n      \"Round 176\\n\",\n      \"Round 177\\n\",\n      \"Round 178\\n\",\n      \"Round 179\\n\",\n      \"Round 180\\n\",\n      \"Round 181\\n\",\n      \"Round 182\\n\",\n      \"Round 183\\n\",\n      \"Round 184\\n\",\n      \"Round 185\\n\",\n      \"Round 186\\n\",\n      \"Round 187\\n\",\n      \"Round 188\\n\",\n      \"Round 189\\n\",\n      \"Round 190\\n\",\n      \"Round 191\\n\",\n      \"Round 192\\n\",\n      \"Round 193\\n\",\n      \"Round 194\\n\",\n      \"Round 195\\n\",\n      \"Round 196\\n\",\n      \"Round 197\\n\",\n      \"Round 198\\n\",\n      \"Round 199\\n\",\n      \"Round 200\\n\",\n      \"Round 201\\n\",\n      \"Round 202\\n\",\n      \"Round 203\\n\",\n      \"Round 204\\n\",\n      \"Round 205\\n\",\n      \"Round 206\\n\",\n      \"Round 207\\n\",\n      \"Round 208\\n\",\n      \"Round 209\\n\",\n      \"Round 210\\n\",\n      \"Round 211\\n\",\n      \"Round 212\\n\",\n      \"Round 213\\n\",\n      \"Round 214\\n\",\n      \"Round 215\\n\",\n      \"Round 216\\n\",\n      \"Round 217\\n\",\n      \"Round 218\\n\",\n      \"Round 219\\n\",\n      \"Round 220\\n\",\n      \"Round 221\\n\",\n      \"Round 222\\n\",\n      \"Round 223\\n\",\n      \"WAR!\\n\",\n      \"Round 224\\n\",\n      \"Round 225\\n\",\n      \"Round 226\\n\",\n      \"Round 227\\n\",\n      \"Round 228\\n\",\n      \"Round 229\\n\",\n      \"Round 230\\n\",\n      \"Round 231\\n\",\n      \"Round 232\\n\",\n      \"Round 233\\n\",\n      \"Round 234\\n\",\n      \"Round 235\\n\",\n      \"Round 236\\n\",\n      \"Round 237\\n\",\n      \"Round 238\\n\",\n      \"Round 239\\n\",\n      \"Round 240\\n\",\n      \"Round 241\\n\",\n      \"Round 242\\n\",\n      \"Round 243\\n\",\n      \"Round 244\\n\",\n      \"Round 245\\n\",\n      \"Round 246\\n\",\n      \"Round 247\\n\",\n      \"Round 248\\n\",\n      \"Round 249\\n\",\n      \"Round 250\\n\",\n      \"Round 251\\n\",\n      \"Round 252\\n\",\n      \"Round 253\\n\",\n      \"Round 254\\n\",\n      \"Round 255\\n\",\n      \"Round 256\\n\",\n      \"Round 257\\n\",\n      \"WAR!\\n\",\n      \"Round 258\\n\",\n      \"Round 259\\n\",\n      \"Round 260\\n\",\n      \"Round 261\\n\",\n      \"Round 262\\n\",\n      \"Round 263\\n\",\n      \"Round 264\\n\",\n      \"Round 265\\n\",\n      \"Round 266\\n\",\n      \"Round 267\\n\",\n      \"Round 268\\n\",\n      \"Round 269\\n\",\n      \"Round 270\\n\",\n      \"Round 271\\n\",\n      \"Round 272\\n\",\n      \"Round 273\\n\",\n      \"Round 274\\n\",\n      \"Round 275\\n\",\n      \"Round 276\\n\",\n      \"Round 277\\n\",\n      \"Round 278\\n\",\n      \"Round 279\\n\",\n      \"Round 280\\n\",\n      \"Round 281\\n\",\n      \"Round 282\\n\",\n      \"Round 283\\n\",\n      \"Round 284\\n\",\n      \"Round 285\\n\",\n      \"Round 286\\n\",\n      \"Round 287\\n\",\n      \"Round 288\\n\",\n      \"Round 289\\n\",\n      \"Round 290\\n\",\n      \"Round 291\\n\",\n      \"Round 292\\n\",\n      \"Round 293\\n\",\n      \"Round 294\\n\",\n      \"Round 295\\n\",\n      \"Round 296\\n\",\n      \"Round 297\\n\",\n      \"Round 298\\n\",\n      \"Round 299\\n\",\n      \"Round 300\\n\",\n      \"Round 301\\n\",\n      \"Round 302\\n\",\n      \"Round 303\\n\",\n      \"Round 304\\n\",\n      \"Round 305\\n\",\n      \"Round 306\\n\",\n      \"Round 307\\n\",\n      \"WAR!\\n\",\n      \"Round 308\\n\",\n      \"Round 309\\n\",\n      \"Round 310\\n\",\n      \"Round 311\\n\",\n      \"Round 312\\n\",\n      \"Round 313\\n\",\n      \"Round 314\\n\",\n      \"Round 315\\n\",\n      \"WAR!\\n\",\n      \"Round 316\\n\",\n      \"Round 317\\n\",\n      \"Round 318\\n\",\n      \"Round 319\\n\",\n      \"Round 320\\n\",\n      \"Round 321\\n\",\n      \"Round 322\\n\",\n      \"Round 323\\n\",\n      \"Round 324\\n\",\n      \"Round 325\\n\",\n      \"Round 326\\n\",\n      \"Round 327\\n\",\n      \"Round 328\\n\",\n      \"Round 329\\n\",\n      \"Round 330\\n\",\n      \"Round 331\\n\",\n      \"Round 332\\n\",\n      \"Round 333\\n\",\n      \"Round 334\\n\",\n      \"Round 335\\n\",\n      \"Round 336\\n\",\n      \"Round 337\\n\",\n      \"Round 338\\n\",\n      \"Round 339\\n\",\n      \"Round 340\\n\",\n      \"Round 341\\n\",\n      \"Round 342\\n\",\n      \"Round 343\\n\",\n      \"Round 344\\n\",\n      \"Round 345\\n\",\n      \"Round 346\\n\",\n      \"Round 347\\n\",\n      \"Round 348\\n\",\n      \"Round 349\\n\",\n      \"WAR!\\n\",\n      \"Round 350\\n\",\n      \"WAR!\\n\",\n      \"Player Two unable to play war! Game Over at War\\n\",\n      \"Player One Wins! Player One Loses!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"round_num = 0\\n\",\n    \"while game_on:\\n\",\n    \"    \\n\",\n    \"    round_num += 1\\n\",\n    \"    print(f\\\"Round {round_num}\\\")\\n\",\n    \"    \\n\",\n    \"    # Check to see if a player is out of cards:\\n\",\n    \"    if len(player_one.all_cards) == 0:\\n\",\n    \"        print(\\\"Player One out of cards! Game Over\\\")\\n\",\n    \"        print(\\\"Player Two Wins!\\\")\\n\",\n    \"        game_on = False\\n\",\n    \"        break\\n\",\n    \"        \\n\",\n    \"    if len(player_two.all_cards) == 0:\\n\",\n    \"        print(\\\"Player Two out of cards! Game Over\\\")\\n\",\n    \"        print(\\\"Player One Wins!\\\")\\n\",\n    \"        game_on = False\\n\",\n    \"        break\\n\",\n    \"    \\n\",\n    \"    # Otherwise, the game is still on!\\n\",\n    \"    \\n\",\n    \"    # Start a new round and reset current cards \\\"on the table\\\"\\n\",\n    \"    player_one_cards = []\\n\",\n    \"    player_one_cards.append(player_one.remove_one())\\n\",\n    \"    \\n\",\n    \"    player_two_cards = []\\n\",\n    \"    player_two_cards.append(player_two.remove_one())\\n\",\n    \"    \\n\",\n    \"    at_war = True\\n\",\n    \"\\n\",\n    \"    while at_war:\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"        if player_one_cards[-1].value > player_two_cards[-1].value:\\n\",\n    \"\\n\",\n    \"            # Player One gets the cards\\n\",\n    \"            player_one.add_cards(player_one_cards)\\n\",\n    \"            player_one.add_cards(player_two_cards)\\n\",\n    \"            \\n\",\n    \"            \\n\",\n    \"            # No Longer at \\\"war\\\" , time for next round\\n\",\n    \"            at_war = False\\n\",\n    \"        \\n\",\n    \"        # Player Two Has higher Card\\n\",\n    \"        elif player_one_cards[-1].value < player_two_cards[-1].value:\\n\",\n    \"\\n\",\n    \"            # Player Two gets the cards\\n\",\n    \"            player_two.add_cards(player_one_cards)\\n\",\n    \"            player_two.add_cards(player_two_cards)\\n\",\n    \"            \\n\",\n    \"            # No Longer at \\\"war\\\" , time for next round\\n\",\n    \"            at_war = False\\n\",\n    \"\\n\",\n    \"        else:\\n\",\n    \"            print('WAR!')\\n\",\n    \"            # This occurs when the cards are equal.\\n\",\n    \"            # We'll grab another card each and continue the current war.\\n\",\n    \"            \\n\",\n    \"            # First check to see if player has enough cards\\n\",\n    \"            \\n\",\n    \"            # Check to see if a player is out of cards:\\n\",\n    \"            if len(player_one.all_cards) < 5:\\n\",\n    \"                print(\\\"Player One unable to play war! Game Over at War\\\")\\n\",\n    \"                print(\\\"Player Two Wins! Player One Loses!\\\")\\n\",\n    \"                game_on = False\\n\",\n    \"                break\\n\",\n    \"\\n\",\n    \"            elif len(player_two.all_cards) < 5:\\n\",\n    \"                print(\\\"Player Two unable to play war! Game Over at War\\\")\\n\",\n    \"                print(\\\"Player One Wins! Player One Loses!\\\")\\n\",\n    \"                game_on = False\\n\",\n    \"                break\\n\",\n    \"            # Otherwise, we're still at war, so we'll add the next cards\\n\",\n    \"            else:\\n\",\n    \"                for num in range(5):\\n\",\n    \"                    player_one_cards.append(player_one.remove_one())\\n\",\n    \"                    player_two_cards.append(player_two.remove_one())\\n\",\n    \"\\n\",\n    \"        \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 56,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"27\"\n      ]\n     },\n     \"execution_count\": 56,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(player_one.all_cards)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 57,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"25\"\n      ]\n     },\n     \"execution_count\": 57,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(player_two.all_cards)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 59,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Ace of Diamonds\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(player_one_cards[-1])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 60,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Four of Hearts\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(player_two_cards[-1])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## Great Work!\\n\",\n    \"\\n\",\n    \"Other links that may interest you:\\n\",\n    \"* https://www.reddit.com/r/learnpython/comments/7ay83p/war_card_game/\\n\",\n    \"* https://codereview.stackexchange.com/questions/131174/war-card-game-using-classes\\n\",\n    \"* https://gist.github.com/damianesteban/6896120\\n\",\n    \"* https://lethain.com/war-card-game-in-python/\\n\",\n    \"* https://hectorpefo.github.io/2017-09-13-Card-Wars/\\n\",\n    \"* https://www.wimpyprogrammer.com/the-statistics-of-war-the-card-game\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "08-Milestone Project - 2/.ipynb_checkpoints/01-Milestone Project 2 - Assignment-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Milestone Project 2 - Blackjack Game\\n\",\n    \"In this milestone project you will be creating a Complete BlackJack Card Game in Python.\\n\",\n    \"\\n\",\n    \"Here are the requirements:\\n\",\n    \"\\n\",\n    \"* You need to create a simple text-based [BlackJack](https://en.wikipedia.org/wiki/Blackjack) game\\n\",\n    \"* The game needs to have one player versus an automated dealer.\\n\",\n    \"* The player can stand or hit.\\n\",\n    \"* The player must be able to pick their betting amount.\\n\",\n    \"* You need to keep track of the player's total money.\\n\",\n    \"* You need to alert the player of wins, losses, or busts, etc...\\n\",\n    \"\\n\",\n    \"And most importantly:\\n\",\n    \"\\n\",\n    \"* **You must use OOP and classes in some portion of your game. You can not just use functions in your game. Use classes to help you define the Deck and the Player's hand. There are many right ways to do this, so explore it well!**\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Feel free to expand this game. Try including multiple players. Try adding in Double-Down and card splits! Remember to you are free to use any resources you want and as always:\\n\",\n    \"\\n\",\n    \"# HAVE FUN!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "08-Milestone Project - 2/.ipynb_checkpoints/02-Milestone Project 2 - Walkthrough Steps Workbook-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# Milestone Project 2 - Walkthrough Steps Workbook\\n\",\n    \"Below is a set of steps for you to follow to try to create the Blackjack Milestone Project game!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Game Play\\n\",\n    \"To play a hand of Blackjack the following steps must be followed:\\n\",\n    \"1. Create a deck of 52 cards\\n\",\n    \"2. Shuffle the deck\\n\",\n    \"3. Ask the Player for their bet\\n\",\n    \"4. Make sure that the Player's bet does not exceed their available chips\\n\",\n    \"5. Deal two cards to the Dealer and two cards to the Player\\n\",\n    \"6. Show only one of the Dealer's cards, the other remains hidden\\n\",\n    \"7. Show both of the Player's cards\\n\",\n    \"8. Ask the Player if they wish to Hit, and take another card\\n\",\n    \"9. If the Player's hand doesn't Bust (go over 21), ask if they'd like to Hit again.\\n\",\n    \"10. If a Player Stands, play the Dealer's hand. The dealer will always Hit until the Dealer's value meets or exceeds 17\\n\",\n    \"11. Determine the winner and adjust the Player's chips accordingly\\n\",\n    \"12. Ask the Player if they'd like to play again\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Playing Cards\\n\",\n    \"A standard deck of playing cards has four suits (Hearts, Diamonds, Spades and Clubs) and thirteen ranks (2 through 10, then the face cards Jack, Queen, King and Ace) for a total of 52 cards per deck. Jacks, Queens and Kings all have a rank of 10. Aces have a rank of either 11 or 1 as needed to reach 21 without busting. As a starting point in your program, you may want to assign variables to store a list of suits, ranks, and then use a dictionary to map ranks to values.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## The Game\\n\",\n    \"### Imports and Global Variables\\n\",\n    \"** Step 1: Import the random module. This will be used to shuffle the deck prior to dealing. Then, declare variables to store suits, ranks and values. You can develop your own system, or copy ours below. Finally, declare a Boolean value to be used to control <code>while</code> loops. This is a common practice used to control the flow of the game.**\\n\",\n    \"\\n\",\n    \"    suits = ('Hearts', 'Diamonds', 'Spades', 'Clubs')\\n\",\n    \"    ranks = ('Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Jack', 'Queen', 'King', 'Ace')\\n\",\n    \"    values = {'Two':2, 'Three':3, 'Four':4, 'Five':5, 'Six':6, 'Seven':7, 'Eight':8, 'Nine':9, 'Ten':10, 'Jack':10,\\n\",\n    \"             'Queen':10, 'King':10, 'Ace':11}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import random\\n\",\n    \"\\n\",\n    \"suits = pass\\n\",\n    \"ranks = pass\\n\",\n    \"values = pass\\n\",\n    \"\\n\",\n    \"playing = True\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Class Definitions\\n\",\n    \"Consider making a Card class where each Card object has a suit and a rank, then a Deck class to hold all 52 Card objects, and can be shuffled, and finally a Hand class that holds those Cards that have been dealt to each player from the Deck.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 2: Create a Card Class**<br>\\n\",\n    \"A Card object really only needs two attributes: suit and rank. You might add an attribute for \\\"value\\\" - we chose to handle value later when developing our Hand class.<br>In addition to the Card's \\\\_\\\\_init\\\\_\\\\_ method, consider adding a \\\\_\\\\_str\\\\_\\\\_ method that, when asked to print a Card, returns a string in the form \\\"Two of Hearts\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Card:\\n\",\n    \"    \\n\",\n    \"    def __init__(self):\\n\",\n    \"        pass\\n\",\n    \"    \\n\",\n    \"    def __str__(self):\\n\",\n    \"        pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 3: Create a Deck Class**<br>\\n\",\n    \"Here we might store 52 card objects in a list that can later be shuffled. First, though, we need to *instantiate* all 52 unique card objects and add them to our list. So long as the Card class definition appears in our code, we can build Card objects inside our Deck \\\\_\\\\_init\\\\_\\\\_ method. Consider iterating over sequences of suits and ranks to build out each card. This might appear inside a Deck class \\\\_\\\\_init\\\\_\\\\_ method:\\n\",\n    \"\\n\",\n    \"    for suit in suits:\\n\",\n    \"        for rank in ranks:\\n\",\n    \"\\n\",\n    \"In addition to an \\\\_\\\\_init\\\\_\\\\_ method we'll want to add methods to shuffle our deck, and to deal out cards during gameplay.<br><br>\\n\",\n    \"OPTIONAL: We may never need to print the contents of the deck during gameplay, but having the ability to see the cards inside it may help troubleshoot any problems that occur during development. With this in mind, consider adding a \\\\_\\\\_str\\\\_\\\\_ method to the class definition.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Deck:\\n\",\n    \"    \\n\",\n    \"    def __init__(self):\\n\",\n    \"        self.deck = []  # start with an empty list\\n\",\n    \"        for suit in suits:\\n\",\n    \"            for rank in ranks:\\n\",\n    \"                pass\\n\",\n    \"    \\n\",\n    \"    def __str__(self):\\n\",\n    \"        pass\\n\",\n    \"\\n\",\n    \"    def shuffle(self):\\n\",\n    \"        random.shuffle(self.deck)\\n\",\n    \"        \\n\",\n    \"    def deal(self):\\n\",\n    \"        pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"TESTING: Just to see that everything works so far, let's see what our Deck looks like!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"test_deck = Deck()\\n\",\n    \"print(test_deck)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now let's move on to our Hand class.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 4: Create a Hand Class**<br>\\n\",\n    \"In addition to holding Card objects dealt from the Deck, the Hand class may be used to calculate the value of those cards using the values dictionary defined above. It may also need to adjust for the value of Aces when appropriate.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Hand:\\n\",\n    \"    def __init__(self):\\n\",\n    \"        self.cards = []  # start with an empty list as we did in the Deck class\\n\",\n    \"        self.value = 0   # start with zero value\\n\",\n    \"        self.aces = 0    # add an attribute to keep track of aces\\n\",\n    \"    \\n\",\n    \"    def add_card(self,card):\\n\",\n    \"        pass\\n\",\n    \"    \\n\",\n    \"    def adjust_for_ace(self):\\n\",\n    \"        pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 5: Create a Chips Class**<br>\\n\",\n    \"In addition to decks of cards and hands, we need to keep track of a Player's starting chips, bets, and ongoing winnings. This could be done using global variables, but in the spirit of object oriented programming, let's make a Chips class instead!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Chips:\\n\",\n    \"    \\n\",\n    \"    def __init__(self):\\n\",\n    \"        self.total = 100  # This can be set to a default value or supplied by a user input\\n\",\n    \"        self.bet = 0\\n\",\n    \"        \\n\",\n    \"    def win_bet(self):\\n\",\n    \"        pass\\n\",\n    \"    \\n\",\n    \"    def lose_bet(self):\\n\",\n    \"        pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Function Defintions\\n\",\n    \"A lot of steps are going to be repetitive. That's where functions come in! The following steps are guidelines - add or remove functions as needed in your own program.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 6: Write a function for taking bets**<br>\\n\",\n    \"Since we're asking the user for an integer value, this would be a good place to use <code>try</code>/<code>except</code>. Remember to check that a Player's bet can be covered by their available chips.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def take_bet():\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 7: Write a function for taking hits**<br>\\n\",\n    \"Either player can take hits until they bust. This function will be called during gameplay anytime a Player requests a hit, or a Dealer's hand is less than 17. It should take in Deck and Hand objects as arguments, and deal one card off the deck and add it to the Hand. You may want it to check for aces in the event that a player's hand exceeds 21.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def hit(deck,hand):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 8: Write a function prompting the Player to Hit or Stand**<br>\\n\",\n    \"This function should accept the deck and the player's hand as arguments, and assign playing as a global variable.<br>\\n\",\n    \"If the Player Hits, employ the hit() function above. If the Player Stands, set the playing variable to False - this will control the behavior of a <code>while</code> loop later on in our code.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def hit_or_stand(deck,hand):\\n\",\n    \"    global playing  # to control an upcoming while loop\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 9: Write functions to display cards**<br>\\n\",\n    \"When the game starts, and after each time Player takes a card, the dealer's first card is hidden and all of Player's cards are visible. At the end of the hand all cards are shown, and you may want to show each hand's total value. Write a function for each of these scenarios.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def show_some(player,dealer):\\n\",\n    \"    \\n\",\n    \"    pass\\n\",\n    \"    \\n\",\n    \"def show_all(player,dealer):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 10: Write functions to handle end of game scenarios**<br>\\n\",\n    \"Remember to pass player's hand, dealer's hand and chips as needed.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def player_busts():\\n\",\n    \"    pass\\n\",\n    \"\\n\",\n    \"def player_wins():\\n\",\n    \"    pass\\n\",\n    \"\\n\",\n    \"def dealer_busts():\\n\",\n    \"    pass\\n\",\n    \"    \\n\",\n    \"def dealer_wins():\\n\",\n    \"    pass\\n\",\n    \"    \\n\",\n    \"def push():\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### And now on to the game!!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"while True:\\n\",\n    \"    # Print an opening statement\\n\",\n    \"\\n\",\n    \"    \\n\",\n    \"    # Create & shuffle the deck, deal two cards to each player\\n\",\n    \"\\n\",\n    \"    \\n\",\n    \"        \\n\",\n    \"    # Set up the Player's chips\\n\",\n    \"    \\n\",\n    \"    \\n\",\n    \"    # Prompt the Player for their bet\\n\",\n    \"\\n\",\n    \"    \\n\",\n    \"    # Show cards (but keep one dealer card hidden)\\n\",\n    \"\\n\",\n    \"    \\n\",\n    \"    while playing:  # recall this variable from our hit_or_stand function\\n\",\n    \"        \\n\",\n    \"        # Prompt for Player to Hit or Stand\\n\",\n    \"        \\n\",\n    \"        \\n\",\n    \"        # Show cards (but keep one dealer card hidden)\\n\",\n    \" \\n\",\n    \"        \\n\",\n    \"        # If player's hand exceeds 21, run player_busts() and break out of loop\\n\",\n    \"        \\n\",\n    \"\\n\",\n    \"            break\\n\",\n    \"\\n\",\n    \"    # If Player hasn't busted, play Dealer's hand until Dealer reaches 17\\n\",\n    \"    \\n\",\n    \"    \\n\",\n    \"        # Show all cards\\n\",\n    \"    \\n\",\n    \"        # Run different winning scenarios\\n\",\n    \"        \\n\",\n    \"    \\n\",\n    \"    # Inform Player of their chips total \\n\",\n    \"    \\n\",\n    \"    # Ask to play again\\n\",\n    \"\\n\",\n    \"        break\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"And that's it! Remember, these steps may differ significantly from your own solution. That's OK! Keep working on different sections of your program until you get the desired results. It takes a lot of time and patience! As always, feel free to post questions and comments to the QA Forums.\\n\",\n    \"# Good job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "08-Milestone Project - 2/.ipynb_checkpoints/03-Milestone Project 2 - Complete Walkthrough Solution-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# Milestone Project 2 - Complete Walkthrough Solution\\n\",\n    \"This notebook walks through a proposed solution to the Blackjack Game milestone project. The approach to solving and the specific code used are only suggestions - there are many different ways to code this out, and yours is likely to be different!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Game Play\\n\",\n    \"To play a hand of Blackjack the following steps must be followed:\\n\",\n    \"1. Create a deck of 52 cards\\n\",\n    \"2. Shuffle the deck\\n\",\n    \"3. Ask the Player for their bet\\n\",\n    \"4. Make sure that the Player's bet does not exceed their available chips\\n\",\n    \"5. Deal two cards to the Dealer and two cards to the Player\\n\",\n    \"6. Show only one of the Dealer's cards, the other remains hidden\\n\",\n    \"7. Show both of the Player's cards\\n\",\n    \"8. Ask the Player if they wish to Hit, and take another card\\n\",\n    \"9. If the Player's hand doesn't Bust (go over 21), ask if they'd like to Hit again.\\n\",\n    \"10. If a Player Stands, play the Dealer's hand. The dealer will always Hit until the Dealer's value meets or exceeds 17\\n\",\n    \"11. Determine the winner and adjust the Player's chips accordingly\\n\",\n    \"12. Ask the Player if they'd like to play again\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Playing Cards\\n\",\n    \"A standard deck of playing cards has four suits (Hearts, Diamonds, Spades and Clubs) and thirteen ranks (2 through 10, then the face cards Jack, Queen, King and Ace) for a total of 52 cards per deck. Jacks, Queens and Kings all have a rank of 10. Aces have a rank of either 11 or 1 as needed to reach 21 without busting. As a starting point in your program, you may want to assign variables to store a list of suits, ranks, and then use a dictionary to map ranks to values.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## The Game\\n\",\n    \"### Imports and Global Variables\\n\",\n    \"** Step 1: Import the random module. This will be used to shuffle the deck prior to dealing. Then, declare variables to store suits, ranks and values. You can develop your own system, or copy ours below. Finally, declare a Boolean value to be used to control <code>while</code> loops. This is a common practice used to control the flow of the game.**\\n\",\n    \"\\n\",\n    \"    suits = ('Hearts', 'Diamonds', 'Spades', 'Clubs')\\n\",\n    \"    ranks = ('Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Jack', 'Queen', 'King', 'Ace')\\n\",\n    \"    values = {'Two':2, 'Three':3, 'Four':4, 'Five':5, 'Six':6, 'Seven':7, 'Eight':8, 'Nine':9, 'Ten':10, 'Jack':10,\\n\",\n    \"             'Queen':10, 'King':10, 'Ace':11}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import random\\n\",\n    \"\\n\",\n    \"suits = ('Hearts', 'Diamonds', 'Spades', 'Clubs')\\n\",\n    \"ranks = ('Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Jack', 'Queen', 'King', 'Ace')\\n\",\n    \"values = {'Two':2, 'Three':3, 'Four':4, 'Five':5, 'Six':6, 'Seven':7, 'Eight':8, 'Nine':9, 'Ten':10, 'Jack':10,\\n\",\n    \"         'Queen':10, 'King':10, 'Ace':11}\\n\",\n    \"\\n\",\n    \"playing = True\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Class Definitions\\n\",\n    \"Consider making a Card class where each Card object has a suit and a rank, then a Deck class to hold all 52 Card objects, and can be shuffled, and finally a Hand class that holds those Cards that have been dealt to each player from the Deck.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 2: Create a Card Class**<br>\\n\",\n    \"A Card object really only needs two attributes: suit and rank. You might add an attribute for \\\"value\\\" - we chose to handle value later when developing our Hand class.<br>In addition to the Card's \\\\_\\\\_init\\\\_\\\\_ method, consider adding a \\\\_\\\\_str\\\\_\\\\_ method that, when asked to print a Card, returns a string in the form \\\"Two of Hearts\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Card:\\n\",\n    \"\\n\",\n    \"    def __init__(self,suit,rank):\\n\",\n    \"        self.suit = suit\\n\",\n    \"        self.rank = rank\\n\",\n    \"        \\n\",\n    \"    def __str__(self):\\n\",\n    \"        return self.rank + ' of ' + self.suit\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 3: Create a Deck Class**<br>\\n\",\n    \"Here we might store 52 card objects in a list that can later be shuffled. First, though, we need to *instantiate* all 52 unique card objects and add them to our list. So long as the Card class definition appears in our code, we can build Card objects inside our Deck \\\\_\\\\_init\\\\_\\\\_ method. Consider iterating over sequences of suits and ranks to build out each card. This might appear inside a Deck class \\\\_\\\\_init\\\\_\\\\_ method:\\n\",\n    \"\\n\",\n    \"    for suit in suits:\\n\",\n    \"        for rank in ranks:\\n\",\n    \"\\n\",\n    \"In addition to an \\\\_\\\\_init\\\\_\\\\_ method we'll want to add methods to shuffle our deck, and to deal out cards during gameplay.<br><br>\\n\",\n    \"OPTIONAL: We may never need to print the contents of the deck during gameplay, but having the ability to see the cards inside it may help troubleshoot any problems that occur during development. With this in mind, consider adding a \\\\_\\\\_str\\\\_\\\\_ method to the class definition.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Deck:\\n\",\n    \"    \\n\",\n    \"    def __init__(self):\\n\",\n    \"        self.deck = []  # start with an empty list\\n\",\n    \"        for suit in suits:\\n\",\n    \"            for rank in ranks:\\n\",\n    \"                self.deck.append(Card(suit,rank))  # build Card objects and add them to the list\\n\",\n    \"    \\n\",\n    \"    def __str__(self):\\n\",\n    \"        deck_comp = ''  # start with an empty string\\n\",\n    \"        for card in self.deck:\\n\",\n    \"            deck_comp += '\\\\n '+card.__str__() # add each Card object's print string\\n\",\n    \"        return 'The deck has:' + deck_comp\\n\",\n    \"\\n\",\n    \"    def shuffle(self):\\n\",\n    \"        random.shuffle(self.deck)\\n\",\n    \"        \\n\",\n    \"    def deal(self):\\n\",\n    \"        single_card = self.deck.pop()\\n\",\n    \"        return single_card\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"TESTING: Just to see that everything works so far, let's see what our Deck looks like!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"The deck has:\\n\",\n      \" Two of Hearts\\n\",\n      \" Three of Hearts\\n\",\n      \" Four of Hearts\\n\",\n      \" Five of Hearts\\n\",\n      \" Six of Hearts\\n\",\n      \" Seven of Hearts\\n\",\n      \" Eight of Hearts\\n\",\n      \" Nine of Hearts\\n\",\n      \" Ten of Hearts\\n\",\n      \" Jack of Hearts\\n\",\n      \" Queen of Hearts\\n\",\n      \" King of Hearts\\n\",\n      \" Ace of Hearts\\n\",\n      \" Two of Diamonds\\n\",\n      \" Three of Diamonds\\n\",\n      \" Four of Diamonds\\n\",\n      \" Five of Diamonds\\n\",\n      \" Six of Diamonds\\n\",\n      \" Seven of Diamonds\\n\",\n      \" Eight of Diamonds\\n\",\n      \" Nine of Diamonds\\n\",\n      \" Ten of Diamonds\\n\",\n      \" Jack of Diamonds\\n\",\n      \" Queen of Diamonds\\n\",\n      \" King of Diamonds\\n\",\n      \" Ace of Diamonds\\n\",\n      \" Two of Spades\\n\",\n      \" Three of Spades\\n\",\n      \" Four of Spades\\n\",\n      \" Five of Spades\\n\",\n      \" Six of Spades\\n\",\n      \" Seven of Spades\\n\",\n      \" Eight of Spades\\n\",\n      \" Nine of Spades\\n\",\n      \" Ten of Spades\\n\",\n      \" Jack of Spades\\n\",\n      \" Queen of Spades\\n\",\n      \" King of Spades\\n\",\n      \" Ace of Spades\\n\",\n      \" Two of Clubs\\n\",\n      \" Three of Clubs\\n\",\n      \" Four of Clubs\\n\",\n      \" Five of Clubs\\n\",\n      \" Six of Clubs\\n\",\n      \" Seven of Clubs\\n\",\n      \" Eight of Clubs\\n\",\n      \" Nine of Clubs\\n\",\n      \" Ten of Clubs\\n\",\n      \" Jack of Clubs\\n\",\n      \" Queen of Clubs\\n\",\n      \" King of Clubs\\n\",\n      \" Ace of Clubs\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"test_deck = Deck()\\n\",\n    \"print(test_deck)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now let's move on to our Hand class.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 4: Create a Hand Class**<br>\\n\",\n    \"In addition to holding Card objects dealt from the Deck, the Hand class may be used to calculate the value of those cards using the values dictionary defined above. It may also need to adjust for the value of Aces when appropriate.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Hand:\\n\",\n    \"    def __init__(self):\\n\",\n    \"        self.cards = []  # start with an empty list as we did in the Deck class\\n\",\n    \"        self.value = 0   # start with zero value\\n\",\n    \"        self.aces = 0    # add an attribute to keep track of aces\\n\",\n    \"    \\n\",\n    \"    def add_card(self,card):\\n\",\n    \"        self.cards.append(card)\\n\",\n    \"        self.value += values[card.rank]\\n\",\n    \"    \\n\",\n    \"    def adjust_for_ace(self):\\n\",\n    \"        pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"TESTING: Before we tackle the issue of changing Aces, let's make sure we can add two cards to a player's hand and obtain their value:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"14\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"test_deck = Deck()\\n\",\n    \"test_deck.shuffle()\\n\",\n    \"test_player = Hand()\\n\",\n    \"test_player.add_card(test_deck.deal())\\n\",\n    \"test_player.add_card(test_deck.deal())\\n\",\n    \"test_player.value\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's see what these two cards are:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Nine of Hearts\\n\",\n      \"Five of Hearts\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for card in test_player.cards:\\n\",\n    \"    print(card)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now let's tackle the Aces issue. If a hand's value exceeds 21 but it contains an Ace, we can reduce the Ace's value from 11 to 1 and continue playing.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Hand:\\n\",\n    \"    \\n\",\n    \"    def __init__(self):\\n\",\n    \"        self.cards = []  # start with an empty list as we did in the Deck class\\n\",\n    \"        self.value = 0   # start with zero value\\n\",\n    \"        self.aces = 0    # add an attribute to keep track of aces\\n\",\n    \"    \\n\",\n    \"    def add_card(self,card):\\n\",\n    \"        self.cards.append(card)\\n\",\n    \"        self.value += values[card.rank]\\n\",\n    \"        if card.rank == 'Ace':\\n\",\n    \"            self.aces += 1  # add to self.aces\\n\",\n    \"    \\n\",\n    \"    def adjust_for_ace(self):\\n\",\n    \"        while self.value > 21 and self.aces:\\n\",\n    \"            self.value -= 10\\n\",\n    \"            self.aces -= 1 \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We added code to the add_card method to bump self.aces whenever an ace is brought into the hand, and added code to the adjust_for_aces method that decreases the number of aces any time we make an adjustment to stay under 21.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 5: Create a Chips Class**<br>\\n\",\n    \"In addition to decks of cards and hands, we need to keep track of a Player's starting chips, bets, and ongoing winnings. This could be done using global variables, but in the spirit of object oriented programming, let's make a Chips class instead!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Chips:\\n\",\n    \"    \\n\",\n    \"    def __init__(self):\\n\",\n    \"        self.total = 100  # This can be set to a default value or supplied by a user input\\n\",\n    \"        self.bet = 0\\n\",\n    \"        \\n\",\n    \"    def win_bet(self):\\n\",\n    \"        self.total += self.bet\\n\",\n    \"    \\n\",\n    \"    def lose_bet(self):\\n\",\n    \"        self.total -= self.bet\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"A NOTE ABOUT OUR DEFAULT TOTAL VALUE:<br>\\n\",\n    \"Alternatively, we could have passed a default total value as an parameter in the \\\\_\\\\_init\\\\_\\\\_. This would have let us pass in an override value at the time the object was created rather than wait until later to change it. The code would have looked like this:\\n\",\n    \"\\n\",\n    \"    def __init__(self,total=100):\\n\",\n    \"        self.total = total\\n\",\n    \"        self.bet = 0\\n\",\n    \"\\n\",\n    \"Either technique is fine, it only depends on how you plan to start your game parameters.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Function Defintions\\n\",\n    \"A lot of steps are going to be repetitive. That's where functions come in! The following steps are guidelines - add or remove functions as needed in your own program.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 6: Write a function for taking bets**<br>\\n\",\n    \"Since we're asking the user for an integer value, this would be a good place to use <code>try</code>/<code>except</code>. Remember to check that a Player's bet can be covered by their available chips.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def take_bet(chips):\\n\",\n    \"    \\n\",\n    \"    while True:\\n\",\n    \"        try:\\n\",\n    \"            chips.bet = int(input('How many chips would you like to bet? '))\\n\",\n    \"        except ValueError:\\n\",\n    \"            print('Sorry, a bet must be an integer!')\\n\",\n    \"        else:\\n\",\n    \"            if chips.bet > chips.total:\\n\",\n    \"                print(\\\"Sorry, your bet can't exceed\\\",chips.total)\\n\",\n    \"            else:\\n\",\n    \"                break\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We used a <code>while</code> loop here to continually prompt the user for input until we received an integer value that was within the Player's betting limit.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"A QUICK NOTE ABOUT FUNCTIONS:<br>\\n\",\n    \"If we knew in advance what we were going to call our Player's Chips object, we could have written the above function like this:\\n\",\n    \"\\n\",\n    \"    def take_bet():\\n\",\n    \"        while True:\\n\",\n    \"            try:\\n\",\n    \"                player_chips.bet = int(input('How many chips would you like to bet? '))\\n\",\n    \"            except ValueError:\\n\",\n    \"                print('Sorry, a bet must be an integer!')\\n\",\n    \"            else:\\n\",\n    \"                if player_chips.bet > player_chips.total:\\n\",\n    \"                    print(\\\"Sorry, your bet can't exceed\\\",player_chips.total)\\n\",\n    \"                else:\\n\",\n    \"                    break\\n\",\n    \"\\n\",\n    \"and then we could call the function without passing any arguments. This is generally not a good idea! It's better to have functions be self-contained, able to accept any incoming value than depend on some future naming convention. Also, this makes it easier to add players in future versions of our program!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 7: Write a function for taking hits**<br>\\n\",\n    \"Either player can take hits until they bust. This function will be called during gameplay anytime a Player requests a hit, or a Dealer's hand is less than 17. It should take in Deck and Hand objects as arguments, and deal one card off the deck and add it to the Hand. You may want it to check for aces in the event that a player's hand exceeds 21.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def hit(deck,hand):\\n\",\n    \"    \\n\",\n    \"    hand.add_card(deck.deal())\\n\",\n    \"    hand.adjust_for_ace()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 8: Write a function prompting the Player to Hit or Stand**<br>\\n\",\n    \"This function should accept the deck and the player's hand as arguments, and assign playing as a global variable.<br>\\n\",\n    \"If the Player Hits, employ the hit() function above. If the Player Stands, set the playing variable to False - this will control the behavior of a <code>while</code> loop later on in our code.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def hit_or_stand(deck,hand):\\n\",\n    \"    global playing  # to control an upcoming while loop\\n\",\n    \"    \\n\",\n    \"    while True:\\n\",\n    \"        x = input(\\\"Would you like to Hit or Stand? Enter 'h' or 's' \\\")\\n\",\n    \"        \\n\",\n    \"        if x[0].lower() == 'h':\\n\",\n    \"            hit(deck,hand)  # hit() function defined above\\n\",\n    \"\\n\",\n    \"        elif x[0].lower() == 's':\\n\",\n    \"            print(\\\"Player stands. Dealer is playing.\\\")\\n\",\n    \"            playing = False\\n\",\n    \"\\n\",\n    \"        else:\\n\",\n    \"            print(\\\"Sorry, please try again.\\\")\\n\",\n    \"            continue\\n\",\n    \"        break\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 9: Write functions to display cards**<br>\\n\",\n    \"When the game starts, and after each time Player takes a card, the dealer's first card is hidden and all of Player's cards are visible. At the end of the hand all cards are shown, and you may want to show each hand's total value. Write a function for each of these scenarios.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def show_some(player,dealer):\\n\",\n    \"    print(\\\"\\\\nDealer's Hand:\\\")\\n\",\n    \"    print(\\\" <card hidden>\\\")\\n\",\n    \"    print('',dealer.cards[1])  \\n\",\n    \"    print(\\\"\\\\nPlayer's Hand:\\\", *player.cards, sep='\\\\n ')\\n\",\n    \"    \\n\",\n    \"def show_all(player,dealer):\\n\",\n    \"    print(\\\"\\\\nDealer's Hand:\\\", *dealer.cards, sep='\\\\n ')\\n\",\n    \"    print(\\\"Dealer's Hand =\\\",dealer.value)\\n\",\n    \"    print(\\\"\\\\nPlayer's Hand:\\\", *player.cards, sep='\\\\n ')\\n\",\n    \"    print(\\\"Player's Hand =\\\",player.value)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"QUICK NOTES ABOUT PRINT STATEMENTS:<br>\\n\",\n    \"\\n\",\n    \"* The asterisk <code>*</code> symbol is used to print every item in a collection, and the <code>sep='\\\\n '</code> argument prints each item on a separate line.\\n\",\n    \"\\n\",\n    \"* In the fourth line where we have\\n\",\n    \"\\n\",\n    \"      print('',dealer.cards[1])\\n\",\n    \"    \\n\",\n    \"    the empty string and comma are there just to add a space.\\n\",\n    \"\\n\",\n    \"- Here we used commas to separate the objects being printed in each line. If you want to concatenate strings using the <code>+</code> symbol, then you have to call each Card object's \\\\_\\\\_str\\\\_\\\\_ method explicitly, as with\\n\",\n    \"\\n\",\n    \"      print(' ' + dealer.cards[1].__str__())\\n\",\n    \"    \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 10: Write functions to handle end of game scenarios**<br>\\n\",\n    \"Remember to pass player's hand, dealer's hand and chips as needed.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def player_busts(player,dealer,chips):\\n\",\n    \"    print(\\\"Player busts!\\\")\\n\",\n    \"    chips.lose_bet()\\n\",\n    \"\\n\",\n    \"def player_wins(player,dealer,chips):\\n\",\n    \"    print(\\\"Player wins!\\\")\\n\",\n    \"    chips.win_bet()\\n\",\n    \"\\n\",\n    \"def dealer_busts(player,dealer,chips):\\n\",\n    \"    print(\\\"Dealer busts!\\\")\\n\",\n    \"    chips.win_bet()\\n\",\n    \"    \\n\",\n    \"def dealer_wins(player,dealer,chips):\\n\",\n    \"    print(\\\"Dealer wins!\\\")\\n\",\n    \"    chips.lose_bet()\\n\",\n    \"    \\n\",\n    \"def push(player,dealer):\\n\",\n    \"    print(\\\"Dealer and Player tie! It's a push.\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### And now on to the game!!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Welcome to BlackJack! Get as close to 21 as you can without going over!\\n\",\n      \"    Dealer hits until she reaches 17. Aces count as 1 or 11.\\n\",\n      \"How many chips would you like to bet? 5\\n\",\n      \"\\n\",\n      \"Dealer's Hand:\\n\",\n      \" <card hidden>\\n\",\n      \" Seven of Spades\\n\",\n      \"\\n\",\n      \"Player's Hand:\\n\",\n      \" Queen of Spades\\n\",\n      \" Nine of Hearts\\n\",\n      \"\\n\",\n      \"Dealer's Hand:\\n\",\n      \" Ace of Clubs\\n\",\n      \" Seven of Spades\\n\",\n      \"Dealer's Hand = 18\\n\",\n      \"\\n\",\n      \"Player's Hand:\\n\",\n      \" Queen of Spades\\n\",\n      \" Nine of Hearts\\n\",\n      \"Player's Hand = 19\\n\",\n      \"Player wins!\\n\",\n      \"\\n\",\n      \"Player's winnings stand at 105\\n\",\n      \"Would you like to play another hand? Enter 'y' or 'n' y\\n\",\n      \"Welcome to BlackJack! Get as close to 21 as you can without going over!\\n\",\n      \"    Dealer hits until she reaches 17. Aces count as 1 or 11.\\n\",\n      \"How many chips would you like to bet? 5\\n\",\n      \"\\n\",\n      \"Dealer's Hand:\\n\",\n      \" <card hidden>\\n\",\n      \" Nine of Clubs\\n\",\n      \"\\n\",\n      \"Player's Hand:\\n\",\n      \" Queen of Diamonds\\n\",\n      \" Ace of Hearts\\n\",\n      \"Would you like to Hit or Stand? Enter 'h' or 's' s\\n\",\n      \"Player stands. Dealer is playing.\\n\",\n      \"\\n\",\n      \"Dealer's Hand:\\n\",\n      \" <card hidden>\\n\",\n      \" Nine of Clubs\\n\",\n      \"\\n\",\n      \"Player's Hand:\\n\",\n      \" Queen of Diamonds\\n\",\n      \" Ace of Hearts\\n\",\n      \"\\n\",\n      \"Dealer's Hand:\\n\",\n      \" Eight of Clubs\\n\",\n      \" Nine of Clubs\\n\",\n      \"Dealer's Hand = 17\\n\",\n      \"\\n\",\n      \"Player's Hand:\\n\",\n      \" Queen of Diamonds\\n\",\n      \" Ace of Hearts\\n\",\n      \"Player's Hand = 21\\n\",\n      \"Player wins!\\n\",\n      \"\\n\",\n      \"Player's winnings stand at 105\\n\",\n      \"Would you like to play another hand? Enter 'y' or 'n' y\\n\",\n      \"Welcome to BlackJack! Get as close to 21 as you can without going over!\\n\",\n      \"    Dealer hits until she reaches 17. Aces count as 1 or 11.\\n\",\n      \"How many chips would you like to bet? 65\\n\",\n      \"\\n\",\n      \"Dealer's Hand:\\n\",\n      \" <card hidden>\\n\",\n      \" Four of Spades\\n\",\n      \"\\n\",\n      \"Player's Hand:\\n\",\n      \" Queen of Clubs\\n\",\n      \" Four of Diamonds\\n\",\n      \"Would you like to Hit or Stand? Enter 'h' or 's' h\\n\",\n      \"\\n\",\n      \"Dealer's Hand:\\n\",\n      \" <card hidden>\\n\",\n      \" Four of Spades\\n\",\n      \"\\n\",\n      \"Player's Hand:\\n\",\n      \" Queen of Clubs\\n\",\n      \" Four of Diamonds\\n\",\n      \" Eight of Diamonds\\n\",\n      \"Player busts!\\n\",\n      \"\\n\",\n      \"Player's winnings stand at 35\\n\",\n      \"Would you like to play another hand? Enter 'y' or 'n' n\\n\",\n      \"Thanks for playing!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"while True:\\n\",\n    \"    # Print an opening statement\\n\",\n    \"    print('Welcome to BlackJack! Get as close to 21 as you can without going over!\\\\n\\\\\\n\",\n    \"    Dealer hits until she reaches 17. Aces count as 1 or 11.')\\n\",\n    \"    \\n\",\n    \"    # Create & shuffle the deck, deal two cards to each player\\n\",\n    \"    deck = Deck()\\n\",\n    \"    deck.shuffle()\\n\",\n    \"    \\n\",\n    \"    player_hand = Hand()\\n\",\n    \"    player_hand.add_card(deck.deal())\\n\",\n    \"    player_hand.add_card(deck.deal())\\n\",\n    \"    \\n\",\n    \"    dealer_hand = Hand()\\n\",\n    \"    dealer_hand.add_card(deck.deal())\\n\",\n    \"    dealer_hand.add_card(deck.deal())\\n\",\n    \"            \\n\",\n    \"    # Set up the Player's chips\\n\",\n    \"    player_chips = Chips()  # remember the default value is 100    \\n\",\n    \"    \\n\",\n    \"    # Prompt the Player for their bet\\n\",\n    \"    take_bet(player_chips)\\n\",\n    \"    \\n\",\n    \"    # Show cards (but keep one dealer card hidden)\\n\",\n    \"    show_some(player_hand,dealer_hand)\\n\",\n    \"    \\n\",\n    \"    while playing:  # recall this variable from our hit_or_stand function\\n\",\n    \"        \\n\",\n    \"        # Prompt for Player to Hit or Stand\\n\",\n    \"        hit_or_stand(deck,player_hand) \\n\",\n    \"        \\n\",\n    \"        # Show cards (but keep one dealer card hidden)\\n\",\n    \"        show_some(player_hand,dealer_hand)  \\n\",\n    \"        \\n\",\n    \"        # If player's hand exceeds 21, run player_busts() and break out of loop\\n\",\n    \"        if player_hand.value > 21:\\n\",\n    \"            player_busts(player_hand,dealer_hand,player_chips)\\n\",\n    \"            break        \\n\",\n    \"\\n\",\n    \"\\n\",\n    \"    # If Player hasn't busted, play Dealer's hand until Dealer reaches 17 \\n\",\n    \"    if player_hand.value <= 21:\\n\",\n    \"        \\n\",\n    \"        while dealer_hand.value < 17:\\n\",\n    \"            hit(deck,dealer_hand)    \\n\",\n    \"    \\n\",\n    \"        # Show all cards\\n\",\n    \"        show_all(player_hand,dealer_hand)\\n\",\n    \"        \\n\",\n    \"        # Run different winning scenarios\\n\",\n    \"        if dealer_hand.value > 21:\\n\",\n    \"            dealer_busts(player_hand,dealer_hand,player_chips)\\n\",\n    \"\\n\",\n    \"        elif dealer_hand.value > player_hand.value:\\n\",\n    \"            dealer_wins(player_hand,dealer_hand,player_chips)\\n\",\n    \"\\n\",\n    \"        elif dealer_hand.value < player_hand.value:\\n\",\n    \"            player_wins(player_hand,dealer_hand,player_chips)\\n\",\n    \"\\n\",\n    \"        else:\\n\",\n    \"            push(player_hand,dealer_hand)        \\n\",\n    \"    \\n\",\n    \"    # Inform Player of their chips total \\n\",\n    \"    print(\\\"\\\\nPlayer's winnings stand at\\\",player_chips.total)\\n\",\n    \"    \\n\",\n    \"    # Ask to play again\\n\",\n    \"    new_game = input(\\\"Would you like to play another hand? Enter 'y' or 'n' \\\")\\n\",\n    \"    \\n\",\n    \"    if new_game[0].lower()=='y':\\n\",\n    \"        playing=True\\n\",\n    \"        continue\\n\",\n    \"    else:\\n\",\n    \"        print(\\\"Thanks for playing!\\\")\\n\",\n    \"        break\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"And that's it! Remember, these steps may differ significantly from your own solution. That's OK! Keep working on different sections of your program until you get the desired results. It takes a lot of time and patience! As always, feel free to post questions and comments to the QA Forums.\\n\",\n    \"# Good job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "08-Milestone Project - 2/00-Milestone-2-Warmup-Project.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# Warmup Project Exercise\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Simple War Game\\n\",\n    \"\\n\",\n    \"Before we launch in to the OOP Milestone 2 Project, let's walk through together on using OOP for a more robust and complex application, such as a game. We will use Python OOP to simulate a simplified version of the game war. Two players will each start off with half the deck, then they each remove a card, compare which card has the highest value, and the player with the higher card wins both cards. In the event of a time\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Single Card Class\\n\",\n    \"\\n\",\n    \"### Creating a Card Class with outside variables\\n\",\n    \"\\n\",\n    \"Here we will use some outside variables that we know don't change regardless of the situation, such as a deck of cards. Regardless of what round,match, or game we're playing, we'll still need the same deck of cards.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# We'll use this later\\n\",\n    \"import random \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"suits = ('Hearts', 'Diamonds', 'Spades', 'Clubs')\\n\",\n    \"ranks = ('Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Jack', 'Queen', 'King', 'Ace')\\n\",\n    \"values = {'Two':2, 'Three':3, 'Four':4, 'Five':5, 'Six':6, 'Seven':7, 'Eight':8, \\n\",\n    \"            'Nine':9, 'Ten':10, 'Jack':11, 'Queen':12, 'King':13, 'Ace':14}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Card:\\n\",\n    \"    \\n\",\n    \"    def __init__(self,suit,rank):\\n\",\n    \"        self.suit = suit\\n\",\n    \"        self.rank = rank\\n\",\n    \"        self.value = values[rank]\\n\",\n    \"        \\n\",\n    \"    def __str__(self):\\n\",\n    \"        return self.rank + ' of ' + self.suit\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Create an example card\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hearts'\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"suits[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Two'\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"ranks[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"two_hearts = Card(suits[0],ranks[0])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<__main__.Card at 0x1dfaff6b898>\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"two_hearts\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Two of Hearts\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(two_hearts)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Two'\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"two_hearts.rank\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"two_hearts.value\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"values[two_hearts.rank]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Deck Class\\n\",\n    \"\\n\",\n    \"### Using a class within another class\\n\",\n    \"\\n\",\n    \"We just created a single card, but how can we create an entire Deck of cards? Let's explore doing this with a class that utilizes the Card class.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"A Deck will be made up of multiple Cards. Which mean's we will actually use the Card class within the \\\\_\\\\_init__ of the Deck class.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Deck:\\n\",\n    \"    \\n\",\n    \"    def __init__(self):\\n\",\n    \"        # Note this only happens once upon creation of a new Deck\\n\",\n    \"        self.all_cards = [] \\n\",\n    \"        for suit in suits:\\n\",\n    \"            for rank in ranks:\\n\",\n    \"                # This assumes the Card class has already been defined!\\n\",\n    \"                self.all_cards.append(Card(suit,rank))\\n\",\n    \"                \\n\",\n    \"    def shuffle(self):\\n\",\n    \"        # Note this doesn't return anything\\n\",\n    \"        random.shuffle(self.all_cards)\\n\",\n    \"        \\n\",\n    \"    def deal_one(self):\\n\",\n    \"        # Note we remove one card from the list of all_cards\\n\",\n    \"        return self.all_cards.pop()        \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Create a Deck\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"mydeck = Deck()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"52\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(mydeck.all_cards)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<__main__.Card at 0x1dfaff269e8>\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mydeck.all_cards[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Two of Hearts\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(mydeck.all_cards[0])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"mydeck.shuffle()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Five of Spades\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(mydeck.all_cards[0])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"my_card = mydeck.deal_one()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"King of Clubs\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(my_card)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Player Class\\n\",\n    \"\\n\",\n    \"Let's create a Player Class, a player should be able to hold instances of Cards, they should also be able to remove and add them from their hand. We want the Player class to be flexible enough to add one card, or many cards so we'll use a simple if check to keep it all in the same method.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We'll keep this all in mind as we create the methods for the Player class.\\n\",\n    \"\\n\",\n    \"### Player Class\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Player:\\n\",\n    \"    \\n\",\n    \"    def __init__(self,name):\\n\",\n    \"        self.name = name\\n\",\n    \"        # A new player has no cards\\n\",\n    \"        self.all_cards = [] \\n\",\n    \"        \\n\",\n    \"    def remove_one(self):\\n\",\n    \"        # Note we remove one card from the list of all_cards\\n\",\n    \"        # We state 0 to remove from the \\\"top\\\" of the deck\\n\",\n    \"        # We'll imagine index -1 as the bottom of the deck\\n\",\n    \"        return self.all_cards.pop(0)\\n\",\n    \"    \\n\",\n    \"    def add_cards(self,new_cards):\\n\",\n    \"        if type(new_cards) == type([]):\\n\",\n    \"            self.all_cards.extend(new_cards)\\n\",\n    \"        else:\\n\",\n    \"            self.all_cards.append(new_cards)\\n\",\n    \"    \\n\",\n    \"    \\n\",\n    \"    def __str__(self):\\n\",\n    \"        return f'Player {self.name} has {len(self.all_cards)} cards.'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"jose = Player(\\\"Jose\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<__main__.Player at 0x1dfaff8b940>\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"jose\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Player Jose has 0 cards.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(jose)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<__main__.Card at 0x1dfaff6b898>\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"two_hearts\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"jose.add_cards(two_hearts)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Player Jose has 1 cards.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(jose)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"jose.add_cards([two_hearts,two_hearts,two_hearts])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Player Jose has 4 cards.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(jose)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## War Game Logic\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"player_one = Player(\\\"One\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"player_two = Player(\\\"Two\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Setup New Game\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"new_deck = Deck()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"new_deck.shuffle()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Split the Deck between players\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"26.0\"\n      ]\n     },\n     \"execution_count\": 35,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(new_deck.all_cards)/2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"for x in range(26):\\n\",\n    \"    player_one.add_cards(new_deck.deal_one())\\n\",\n    \"    player_two.add_cards(new_deck.deal_one())\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0\"\n      ]\n     },\n     \"execution_count\": 37,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(new_deck.all_cards)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 38,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"26\"\n      ]\n     },\n     \"execution_count\": 38,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(player_one.all_cards)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"26\"\n      ]\n     },\n     \"execution_count\": 39,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(player_two.all_cards)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Play the Game\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 40,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import pdb\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"game_on = True\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 42,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Round 1\\n\",\n      \"Round 2\\n\",\n      \"Round 3\\n\",\n      \"Round 4\\n\",\n      \"Round 5\\n\",\n      \"Round 6\\n\",\n      \"Round 7\\n\",\n      \"Round 8\\n\",\n      \"Round 9\\n\",\n      \"Round 10\\n\",\n      \"Round 11\\n\",\n      \"Round 12\\n\",\n      \"Round 13\\n\",\n      \"Round 14\\n\",\n      \"Round 15\\n\",\n      \"Round 16\\n\",\n      \"Round 17\\n\",\n      \"Round 18\\n\",\n      \"Round 19\\n\",\n      \"Round 20\\n\",\n      \"Round 21\\n\",\n      \"Round 22\\n\",\n      \"Round 23\\n\",\n      \"Round 24\\n\",\n      \"Round 25\\n\",\n      \"Round 26\\n\",\n      \"Round 27\\n\",\n      \"Player One out of cards! Game Over\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"round_num = 0\\n\",\n    \"while game_on:\\n\",\n    \"    \\n\",\n    \"    round_num += 1\\n\",\n    \"    print(f\\\"Round {round_num}\\\")\\n\",\n    \"    \\n\",\n    \"    # Check to see if a player is out of cards:\\n\",\n    \"    if len(player_one.all_cards) == 0:\\n\",\n    \"        print(\\\"Player One out of cards! Game Over\\\")\\n\",\n    \"        print(\\\"Player Two Wins!\\\")\\n\",\n    \"        game_on = False\\n\",\n    \"        break\\n\",\n    \"        \\n\",\n    \"    if len(player_two.all_cards) == 0:\\n\",\n    \"        print(\\\"Player Two out of cards! Game Over\\\")\\n\",\n    \"        print(\\\"Player One Wins!\\\")\\n\",\n    \"        game_on = False\\n\",\n    \"        break\\n\",\n    \"    \\n\",\n    \"    # Otherwise, the game is still on!\\n\",\n    \"    \\n\",\n    \"    # Start a new round and reset current cards \\\"on the table\\\"\\n\",\n    \"    player_one_cards = []\\n\",\n    \"    player_one_cards.append(player_one.remove_one())\\n\",\n    \"    \\n\",\n    \"    player_two_cards = []\\n\",\n    \"    player_two_cards.append(player_two.remove_one())\\n\",\n    \"    \\n\",\n    \"    at_war = True\\n\",\n    \"\\n\",\n    \"    while at_war:\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"        if player_one_cards[-1].value > player_two_cards[-1].value:\\n\",\n    \"\\n\",\n    \"            # Player One gets the cards\\n\",\n    \"            player_one.add_cards(player_one_cards)\\n\",\n    \"            player_one.add_cards(player_two_cards)\\n\",\n    \"            \\n\",\n    \"            \\n\",\n    \"            # No Longer at \\\"war\\\" , time for next round\\n\",\n    \"            at_war = False\\n\",\n    \"        \\n\",\n    \"        # Player Two Has higher Card\\n\",\n    \"        elif player_one_cards[-1].value < player_two_cards[-1].value:\\n\",\n    \"\\n\",\n    \"            # Player Two gets the cards\\n\",\n    \"            player_two.add_cards(player_one_cards)\\n\",\n    \"            player_two.add_cards(player_two_cards)\\n\",\n    \"            \\n\",\n    \"            # No Longer at \\\"war\\\" , time for next round\\n\",\n    \"            at_war = False\\n\",\n    \"\\n\",\n    \"        else:\\n\",\n    \"            print('WAR!')\\n\",\n    \"            # This occurs when the cards are equal.\\n\",\n    \"            # We'll grab another card each and continue the current war.\\n\",\n    \"            \\n\",\n    \"            # First check to see if player has enough cards\\n\",\n    \"            \\n\",\n    \"            # Check to see if a player is out of cards:\\n\",\n    \"            if len(player_one.all_cards) < 5:\\n\",\n    \"                print(\\\"Player One unable to play war! Game Over at War\\\")\\n\",\n    \"                print(\\\"Player Two Wins! Player One Loses!\\\")\\n\",\n    \"                game_on = False\\n\",\n    \"                break\\n\",\n    \"\\n\",\n    \"            elif len(player_two.all_cards) < 5:\\n\",\n    \"                print(\\\"Player Two unable to play war! Game Over at War\\\")\\n\",\n    \"                print(\\\"Player One Wins! Player One Loses!\\\")\\n\",\n    \"                game_on = False\\n\",\n    \"                break\\n\",\n    \"            # Otherwise, we're still at war, so we'll add the next cards\\n\",\n    \"            else:\\n\",\n    \"                for num in range(5):\\n\",\n    \"                    player_one_cards.append(player_one.remove_one())\\n\",\n    \"                    player_two_cards.append(player_two.remove_one())\\n\",\n    \"        \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Game Setup in One Cell\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 62,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"player_one = Player(\\\"One\\\")\\n\",\n    \"player_two = Player(\\\"Two\\\")\\n\",\n    \"\\n\",\n    \"new_deck = Deck()\\n\",\n    \"new_deck.shuffle()\\n\",\n    \"\\n\",\n    \"for x in range(26):\\n\",\n    \"    player_one.add_cards(new_deck.deal_one())\\n\",\n    \"    player_two.add_cards(new_deck.deal_one())\\n\",\n    \"    \\n\",\n    \"game_on = True\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 63,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Round 1\\n\",\n      \"Round 2\\n\",\n      \"WAR!\\n\",\n      \"Round 3\\n\",\n      \"WAR!\\n\",\n      \"WAR!\\n\",\n      \"Round 4\\n\",\n      \"WAR!\\n\",\n      \"Round 5\\n\",\n      \"Round 6\\n\",\n      \"Round 7\\n\",\n      \"Round 8\\n\",\n      \"Round 9\\n\",\n      \"Round 10\\n\",\n      \"Round 11\\n\",\n      \"Round 12\\n\",\n      \"Round 13\\n\",\n      \"WAR!\\n\",\n      \"Round 14\\n\",\n      \"Round 15\\n\",\n      \"WAR!\\n\",\n      \"Round 16\\n\",\n      \"Round 17\\n\",\n      \"Round 18\\n\",\n      \"Round 19\\n\",\n      \"Round 20\\n\",\n      \"Round 21\\n\",\n      \"Round 22\\n\",\n      \"Round 23\\n\",\n      \"Round 24\\n\",\n      \"Round 25\\n\",\n      \"Round 26\\n\",\n      \"Round 27\\n\",\n      \"Round 28\\n\",\n      \"Round 29\\n\",\n      \"WAR!\\n\",\n      \"Round 30\\n\",\n      \"Round 31\\n\",\n      \"Round 32\\n\",\n      \"WAR!\\n\",\n      \"Round 33\\n\",\n      \"Round 34\\n\",\n      \"Round 35\\n\",\n      \"Round 36\\n\",\n      \"Round 37\\n\",\n      \"Round 38\\n\",\n      \"Round 39\\n\",\n      \"Round 40\\n\",\n      \"Round 41\\n\",\n      \"Round 42\\n\",\n      \"WAR!\\n\",\n      \"WAR!\\n\",\n      \"Round 43\\n\",\n      \"Round 44\\n\",\n      \"Round 45\\n\",\n      \"Round 46\\n\",\n      \"Round 47\\n\",\n      \"Round 48\\n\",\n      \"Round 49\\n\",\n      \"Round 50\\n\",\n      \"Round 51\\n\",\n      \"Round 52\\n\",\n      \"Round 53\\n\",\n      \"Round 54\\n\",\n      \"Round 55\\n\",\n      \"Round 56\\n\",\n      \"Round 57\\n\",\n      \"Round 58\\n\",\n      \"Round 59\\n\",\n      \"Round 60\\n\",\n      \"Round 61\\n\",\n      \"Round 62\\n\",\n      \"Round 63\\n\",\n      \"Round 64\\n\",\n      \"Round 65\\n\",\n      \"Round 66\\n\",\n      \"Round 67\\n\",\n      \"Round 68\\n\",\n      \"Round 69\\n\",\n      \"Round 70\\n\",\n      \"Round 71\\n\",\n      \"Round 72\\n\",\n      \"Round 73\\n\",\n      \"Round 74\\n\",\n      \"Round 75\\n\",\n      \"Round 76\\n\",\n      \"Round 77\\n\",\n      \"Round 78\\n\",\n      \"Round 79\\n\",\n      \"Round 80\\n\",\n      \"Round 81\\n\",\n      \"Round 82\\n\",\n      \"Round 83\\n\",\n      \"Round 84\\n\",\n      \"Round 85\\n\",\n      \"Round 86\\n\",\n      \"Round 87\\n\",\n      \"Round 88\\n\",\n      \"Round 89\\n\",\n      \"Round 90\\n\",\n      \"Round 91\\n\",\n      \"Round 92\\n\",\n      \"Round 93\\n\",\n      \"Round 94\\n\",\n      \"Round 95\\n\",\n      \"Round 96\\n\",\n      \"Round 97\\n\",\n      \"Round 98\\n\",\n      \"Round 99\\n\",\n      \"Round 100\\n\",\n      \"Round 101\\n\",\n      \"Round 102\\n\",\n      \"Round 103\\n\",\n      \"Round 104\\n\",\n      \"Round 105\\n\",\n      \"Round 106\\n\",\n      \"Round 107\\n\",\n      \"Round 108\\n\",\n      \"WAR!\\n\",\n      \"Round 109\\n\",\n      \"Round 110\\n\",\n      \"Round 111\\n\",\n      \"Round 112\\n\",\n      \"Round 113\\n\",\n      \"Round 114\\n\",\n      \"Round 115\\n\",\n      \"Round 116\\n\",\n      \"Round 117\\n\",\n      \"Round 118\\n\",\n      \"Round 119\\n\",\n      \"Round 120\\n\",\n      \"Round 121\\n\",\n      \"Round 122\\n\",\n      \"Round 123\\n\",\n      \"Round 124\\n\",\n      \"Round 125\\n\",\n      \"Round 126\\n\",\n      \"Round 127\\n\",\n      \"Round 128\\n\",\n      \"Round 129\\n\",\n      \"Round 130\\n\",\n      \"Round 131\\n\",\n      \"Round 132\\n\",\n      \"Round 133\\n\",\n      \"Round 134\\n\",\n      \"WAR!\\n\",\n      \"Round 135\\n\",\n      \"Round 136\\n\",\n      \"WAR!\\n\",\n      \"Round 137\\n\",\n      \"WAR!\\n\",\n      \"Round 138\\n\",\n      \"Round 139\\n\",\n      \"Round 140\\n\",\n      \"Round 141\\n\",\n      \"Round 142\\n\",\n      \"Round 143\\n\",\n      \"Round 144\\n\",\n      \"Round 145\\n\",\n      \"Round 146\\n\",\n      \"Round 147\\n\",\n      \"Round 148\\n\",\n      \"Round 149\\n\",\n      \"Round 150\\n\",\n      \"Round 151\\n\",\n      \"Round 152\\n\",\n      \"Round 153\\n\",\n      \"Round 154\\n\",\n      \"Round 155\\n\",\n      \"Round 156\\n\",\n      \"Round 157\\n\",\n      \"Round 158\\n\",\n      \"Round 159\\n\",\n      \"Round 160\\n\",\n      \"Round 161\\n\",\n      \"Round 162\\n\",\n      \"Round 163\\n\",\n      \"Round 164\\n\",\n      \"Round 165\\n\",\n      \"Round 166\\n\",\n      \"Round 167\\n\",\n      \"Round 168\\n\",\n      \"Round 169\\n\",\n      \"Round 170\\n\",\n      \"Round 171\\n\",\n      \"Round 172\\n\",\n      \"Round 173\\n\",\n      \"Round 174\\n\",\n      \"Round 175\\n\",\n      \"Round 176\\n\",\n      \"Round 177\\n\",\n      \"Round 178\\n\",\n      \"Round 179\\n\",\n      \"Round 180\\n\",\n      \"Round 181\\n\",\n      \"Round 182\\n\",\n      \"Round 183\\n\",\n      \"Round 184\\n\",\n      \"Round 185\\n\",\n      \"Round 186\\n\",\n      \"Round 187\\n\",\n      \"Round 188\\n\",\n      \"Round 189\\n\",\n      \"Round 190\\n\",\n      \"Round 191\\n\",\n      \"Round 192\\n\",\n      \"Round 193\\n\",\n      \"Round 194\\n\",\n      \"Round 195\\n\",\n      \"Round 196\\n\",\n      \"Round 197\\n\",\n      \"Round 198\\n\",\n      \"Round 199\\n\",\n      \"Round 200\\n\",\n      \"Round 201\\n\",\n      \"Round 202\\n\",\n      \"Round 203\\n\",\n      \"Round 204\\n\",\n      \"Round 205\\n\",\n      \"Round 206\\n\",\n      \"Round 207\\n\",\n      \"Round 208\\n\",\n      \"Round 209\\n\",\n      \"Round 210\\n\",\n      \"Round 211\\n\",\n      \"Round 212\\n\",\n      \"Round 213\\n\",\n      \"Round 214\\n\",\n      \"Round 215\\n\",\n      \"Round 216\\n\",\n      \"Round 217\\n\",\n      \"Round 218\\n\",\n      \"Round 219\\n\",\n      \"Round 220\\n\",\n      \"Round 221\\n\",\n      \"Round 222\\n\",\n      \"Round 223\\n\",\n      \"WAR!\\n\",\n      \"Round 224\\n\",\n      \"Round 225\\n\",\n      \"Round 226\\n\",\n      \"Round 227\\n\",\n      \"Round 228\\n\",\n      \"Round 229\\n\",\n      \"Round 230\\n\",\n      \"Round 231\\n\",\n      \"Round 232\\n\",\n      \"Round 233\\n\",\n      \"Round 234\\n\",\n      \"Round 235\\n\",\n      \"Round 236\\n\",\n      \"Round 237\\n\",\n      \"Round 238\\n\",\n      \"Round 239\\n\",\n      \"Round 240\\n\",\n      \"Round 241\\n\",\n      \"Round 242\\n\",\n      \"Round 243\\n\",\n      \"Round 244\\n\",\n      \"Round 245\\n\",\n      \"Round 246\\n\",\n      \"Round 247\\n\",\n      \"Round 248\\n\",\n      \"Round 249\\n\",\n      \"Round 250\\n\",\n      \"Round 251\\n\",\n      \"Round 252\\n\",\n      \"Round 253\\n\",\n      \"Round 254\\n\",\n      \"Round 255\\n\",\n      \"Round 256\\n\",\n      \"Round 257\\n\",\n      \"WAR!\\n\",\n      \"Round 258\\n\",\n      \"Round 259\\n\",\n      \"Round 260\\n\",\n      \"Round 261\\n\",\n      \"Round 262\\n\",\n      \"Round 263\\n\",\n      \"Round 264\\n\",\n      \"Round 265\\n\",\n      \"Round 266\\n\",\n      \"Round 267\\n\",\n      \"Round 268\\n\",\n      \"Round 269\\n\",\n      \"Round 270\\n\",\n      \"Round 271\\n\",\n      \"Round 272\\n\",\n      \"Round 273\\n\",\n      \"Round 274\\n\",\n      \"Round 275\\n\",\n      \"Round 276\\n\",\n      \"Round 277\\n\",\n      \"Round 278\\n\",\n      \"Round 279\\n\",\n      \"Round 280\\n\",\n      \"Round 281\\n\",\n      \"Round 282\\n\",\n      \"Round 283\\n\",\n      \"Round 284\\n\",\n      \"Round 285\\n\",\n      \"Round 286\\n\",\n      \"Round 287\\n\",\n      \"Round 288\\n\",\n      \"Round 289\\n\",\n      \"Round 290\\n\",\n      \"Round 291\\n\",\n      \"Round 292\\n\",\n      \"Round 293\\n\",\n      \"Round 294\\n\",\n      \"Round 295\\n\",\n      \"Round 296\\n\",\n      \"Round 297\\n\",\n      \"Round 298\\n\",\n      \"Round 299\\n\",\n      \"Round 300\\n\",\n      \"Round 301\\n\",\n      \"Round 302\\n\",\n      \"Round 303\\n\",\n      \"Round 304\\n\",\n      \"Round 305\\n\",\n      \"Round 306\\n\",\n      \"Round 307\\n\",\n      \"WAR!\\n\",\n      \"Round 308\\n\",\n      \"Round 309\\n\",\n      \"Round 310\\n\",\n      \"Round 311\\n\",\n      \"Round 312\\n\",\n      \"Round 313\\n\",\n      \"Round 314\\n\",\n      \"Round 315\\n\",\n      \"WAR!\\n\",\n      \"Round 316\\n\",\n      \"Round 317\\n\",\n      \"Round 318\\n\",\n      \"Round 319\\n\",\n      \"Round 320\\n\",\n      \"Round 321\\n\",\n      \"Round 322\\n\",\n      \"Round 323\\n\",\n      \"Round 324\\n\",\n      \"Round 325\\n\",\n      \"Round 326\\n\",\n      \"Round 327\\n\",\n      \"Round 328\\n\",\n      \"Round 329\\n\",\n      \"Round 330\\n\",\n      \"Round 331\\n\",\n      \"Round 332\\n\",\n      \"Round 333\\n\",\n      \"Round 334\\n\",\n      \"Round 335\\n\",\n      \"Round 336\\n\",\n      \"Round 337\\n\",\n      \"Round 338\\n\",\n      \"Round 339\\n\",\n      \"Round 340\\n\",\n      \"Round 341\\n\",\n      \"Round 342\\n\",\n      \"Round 343\\n\",\n      \"Round 344\\n\",\n      \"Round 345\\n\",\n      \"Round 346\\n\",\n      \"Round 347\\n\",\n      \"Round 348\\n\",\n      \"Round 349\\n\",\n      \"WAR!\\n\",\n      \"Round 350\\n\",\n      \"WAR!\\n\",\n      \"Player Two unable to play war! Game Over at War\\n\",\n      \"Player One Wins! Player One Loses!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"round_num = 0\\n\",\n    \"while game_on:\\n\",\n    \"    \\n\",\n    \"    round_num += 1\\n\",\n    \"    print(f\\\"Round {round_num}\\\")\\n\",\n    \"    \\n\",\n    \"    # Check to see if a player is out of cards:\\n\",\n    \"    if len(player_one.all_cards) == 0:\\n\",\n    \"        print(\\\"Player One out of cards! Game Over\\\")\\n\",\n    \"        print(\\\"Player Two Wins!\\\")\\n\",\n    \"        game_on = False\\n\",\n    \"        break\\n\",\n    \"        \\n\",\n    \"    if len(player_two.all_cards) == 0:\\n\",\n    \"        print(\\\"Player Two out of cards! Game Over\\\")\\n\",\n    \"        print(\\\"Player One Wins!\\\")\\n\",\n    \"        game_on = False\\n\",\n    \"        break\\n\",\n    \"    \\n\",\n    \"    # Otherwise, the game is still on!\\n\",\n    \"    \\n\",\n    \"    # Start a new round and reset current cards \\\"on the table\\\"\\n\",\n    \"    player_one_cards = []\\n\",\n    \"    player_one_cards.append(player_one.remove_one())\\n\",\n    \"    \\n\",\n    \"    player_two_cards = []\\n\",\n    \"    player_two_cards.append(player_two.remove_one())\\n\",\n    \"    \\n\",\n    \"    at_war = True\\n\",\n    \"\\n\",\n    \"    while at_war:\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"        if player_one_cards[-1].value > player_two_cards[-1].value:\\n\",\n    \"\\n\",\n    \"            # Player One gets the cards\\n\",\n    \"            player_one.add_cards(player_one_cards)\\n\",\n    \"            player_one.add_cards(player_two_cards)\\n\",\n    \"            \\n\",\n    \"            \\n\",\n    \"            # No Longer at \\\"war\\\" , time for next round\\n\",\n    \"            at_war = False\\n\",\n    \"        \\n\",\n    \"        # Player Two Has higher Card\\n\",\n    \"        elif player_one_cards[-1].value < player_two_cards[-1].value:\\n\",\n    \"\\n\",\n    \"            # Player Two gets the cards\\n\",\n    \"            player_two.add_cards(player_one_cards)\\n\",\n    \"            player_two.add_cards(player_two_cards)\\n\",\n    \"            \\n\",\n    \"            # No Longer at \\\"war\\\" , time for next round\\n\",\n    \"            at_war = False\\n\",\n    \"\\n\",\n    \"        else:\\n\",\n    \"            print('WAR!')\\n\",\n    \"            # This occurs when the cards are equal.\\n\",\n    \"            # We'll grab another card each and continue the current war.\\n\",\n    \"            \\n\",\n    \"            # First check to see if player has enough cards\\n\",\n    \"            \\n\",\n    \"            # Check to see if a player is out of cards:\\n\",\n    \"            if len(player_one.all_cards) < 5:\\n\",\n    \"                print(\\\"Player One unable to play war! Game Over at War\\\")\\n\",\n    \"                print(\\\"Player Two Wins! Player One Loses!\\\")\\n\",\n    \"                game_on = False\\n\",\n    \"                break\\n\",\n    \"\\n\",\n    \"            elif len(player_two.all_cards) < 5:\\n\",\n    \"                print(\\\"Player Two unable to play war! Game Over at War\\\")\\n\",\n    \"                print(\\\"Player One Wins! Player One Loses!\\\")\\n\",\n    \"                game_on = False\\n\",\n    \"                break\\n\",\n    \"            # Otherwise, we're still at war, so we'll add the next cards\\n\",\n    \"            else:\\n\",\n    \"                for num in range(5):\\n\",\n    \"                    player_one_cards.append(player_one.remove_one())\\n\",\n    \"                    player_two_cards.append(player_two.remove_one())\\n\",\n    \"\\n\",\n    \"        \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 56,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"27\"\n      ]\n     },\n     \"execution_count\": 56,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(player_one.all_cards)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 57,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"25\"\n      ]\n     },\n     \"execution_count\": 57,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(player_two.all_cards)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 59,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Ace of Diamonds\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(player_one_cards[-1])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 60,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Four of Hearts\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(player_two_cards[-1])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## Great Work!\\n\",\n    \"\\n\",\n    \"Other links that may interest you:\\n\",\n    \"* https://www.reddit.com/r/learnpython/comments/7ay83p/war_card_game/\\n\",\n    \"* https://codereview.stackexchange.com/questions/131174/war-card-game-using-classes\\n\",\n    \"* https://gist.github.com/damianesteban/6896120\\n\",\n    \"* https://lethain.com/war-card-game-in-python/\\n\",\n    \"* https://hectorpefo.github.io/2017-09-13-Card-Wars/\\n\",\n    \"* https://www.wimpyprogrammer.com/the-statistics-of-war-the-card-game\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "08-Milestone Project - 2/01-Milestone Project 2 - Assignment.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Milestone Project 2 - Blackjack Game\\n\",\n    \"In this milestone project you will be creating a Complete BlackJack Card Game in Python.\\n\",\n    \"\\n\",\n    \"Here are the requirements:\\n\",\n    \"\\n\",\n    \"* You need to create a simple text-based [BlackJack](https://en.wikipedia.org/wiki/Blackjack) game\\n\",\n    \"* The game needs to have one player versus an automated dealer.\\n\",\n    \"* The player can stand or hit.\\n\",\n    \"* The player must be able to pick their betting amount.\\n\",\n    \"* You need to keep track of the player's total money.\\n\",\n    \"* You need to alert the player of wins, losses, or busts, etc...\\n\",\n    \"\\n\",\n    \"And most importantly:\\n\",\n    \"\\n\",\n    \"* **You must use OOP and classes in some portion of your game. You can not just use functions in your game. Use classes to help you define the Deck and the Player's hand. There are many right ways to do this, so explore it well!**\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Feel free to expand this game. Try including multiple players. Try adding in Double-Down and card splits! Remember to you are free to use any resources you want and as always:\\n\",\n    \"\\n\",\n    \"# HAVE FUN!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "08-Milestone Project - 2/02-Milestone Project 2 - Walkthrough Steps Workbook.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# Milestone Project 2 - Walkthrough Steps Workbook\\n\",\n    \"Below is a set of steps for you to follow to try to create the Blackjack Milestone Project game!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Game Play\\n\",\n    \"To play a hand of Blackjack the following steps must be followed:\\n\",\n    \"1. Create a deck of 52 cards\\n\",\n    \"2. Shuffle the deck\\n\",\n    \"3. Ask the Player for their bet\\n\",\n    \"4. Make sure that the Player's bet does not exceed their available chips\\n\",\n    \"5. Deal two cards to the Dealer and two cards to the Player\\n\",\n    \"6. Show only one of the Dealer's cards, the other remains hidden\\n\",\n    \"7. Show both of the Player's cards\\n\",\n    \"8. Ask the Player if they wish to Hit, and take another card\\n\",\n    \"9. If the Player's hand doesn't Bust (go over 21), ask if they'd like to Hit again.\\n\",\n    \"10. If a Player Stands, play the Dealer's hand. The dealer will always Hit until the Dealer's value meets or exceeds 17\\n\",\n    \"11. Determine the winner and adjust the Player's chips accordingly\\n\",\n    \"12. Ask the Player if they'd like to play again\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Playing Cards\\n\",\n    \"A standard deck of playing cards has four suits (Hearts, Diamonds, Spades and Clubs) and thirteen ranks (2 through 10, then the face cards Jack, Queen, King and Ace) for a total of 52 cards per deck. Jacks, Queens and Kings all have a rank of 10. Aces have a rank of either 11 or 1 as needed to reach 21 without busting. As a starting point in your program, you may want to assign variables to store a list of suits, ranks, and then use a dictionary to map ranks to values.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## The Game\\n\",\n    \"### Imports and Global Variables\\n\",\n    \"** Step 1: Import the random module. This will be used to shuffle the deck prior to dealing. Then, declare variables to store suits, ranks and values. You can develop your own system, or copy ours below. Finally, declare a Boolean value to be used to control <code>while</code> loops. This is a common practice used to control the flow of the game.**\\n\",\n    \"\\n\",\n    \"    suits = ('Hearts', 'Diamonds', 'Spades', 'Clubs')\\n\",\n    \"    ranks = ('Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Jack', 'Queen', 'King', 'Ace')\\n\",\n    \"    values = {'Two':2, 'Three':3, 'Four':4, 'Five':5, 'Six':6, 'Seven':7, 'Eight':8, 'Nine':9, 'Ten':10, 'Jack':10,\\n\",\n    \"             'Queen':10, 'King':10, 'Ace':11}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import random\\n\",\n    \"\\n\",\n    \"suits = pass\\n\",\n    \"ranks = pass\\n\",\n    \"values = pass\\n\",\n    \"\\n\",\n    \"playing = True\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Class Definitions\\n\",\n    \"Consider making a Card class where each Card object has a suit and a rank, then a Deck class to hold all 52 Card objects, and can be shuffled, and finally a Hand class that holds those Cards that have been dealt to each player from the Deck.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 2: Create a Card Class**<br>\\n\",\n    \"A Card object really only needs two attributes: suit and rank. You might add an attribute for \\\"value\\\" - we chose to handle value later when developing our Hand class.<br>In addition to the Card's \\\\_\\\\_init\\\\_\\\\_ method, consider adding a \\\\_\\\\_str\\\\_\\\\_ method that, when asked to print a Card, returns a string in the form \\\"Two of Hearts\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Card:\\n\",\n    \"    \\n\",\n    \"    def __init__(self):\\n\",\n    \"        pass\\n\",\n    \"    \\n\",\n    \"    def __str__(self):\\n\",\n    \"        pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 3: Create a Deck Class**<br>\\n\",\n    \"Here we might store 52 card objects in a list that can later be shuffled. First, though, we need to *instantiate* all 52 unique card objects and add them to our list. So long as the Card class definition appears in our code, we can build Card objects inside our Deck \\\\_\\\\_init\\\\_\\\\_ method. Consider iterating over sequences of suits and ranks to build out each card. This might appear inside a Deck class \\\\_\\\\_init\\\\_\\\\_ method:\\n\",\n    \"\\n\",\n    \"    for suit in suits:\\n\",\n    \"        for rank in ranks:\\n\",\n    \"\\n\",\n    \"In addition to an \\\\_\\\\_init\\\\_\\\\_ method we'll want to add methods to shuffle our deck, and to deal out cards during gameplay.<br><br>\\n\",\n    \"OPTIONAL: We may never need to print the contents of the deck during gameplay, but having the ability to see the cards inside it may help troubleshoot any problems that occur during development. With this in mind, consider adding a \\\\_\\\\_str\\\\_\\\\_ method to the class definition.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Deck:\\n\",\n    \"    \\n\",\n    \"    def __init__(self):\\n\",\n    \"        self.deck = []  # start with an empty list\\n\",\n    \"        for suit in suits:\\n\",\n    \"            for rank in ranks:\\n\",\n    \"                pass\\n\",\n    \"    \\n\",\n    \"    def __str__(self):\\n\",\n    \"        pass\\n\",\n    \"\\n\",\n    \"    def shuffle(self):\\n\",\n    \"        random.shuffle(self.deck)\\n\",\n    \"        \\n\",\n    \"    def deal(self):\\n\",\n    \"        pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"TESTING: Just to see that everything works so far, let's see what our Deck looks like!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"test_deck = Deck()\\n\",\n    \"print(test_deck)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now let's move on to our Hand class.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 4: Create a Hand Class**<br>\\n\",\n    \"In addition to holding Card objects dealt from the Deck, the Hand class may be used to calculate the value of those cards using the values dictionary defined above. It may also need to adjust for the value of Aces when appropriate.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Hand:\\n\",\n    \"    def __init__(self):\\n\",\n    \"        self.cards = []  # start with an empty list as we did in the Deck class\\n\",\n    \"        self.value = 0   # start with zero value\\n\",\n    \"        self.aces = 0    # add an attribute to keep track of aces\\n\",\n    \"    \\n\",\n    \"    def add_card(self,card):\\n\",\n    \"        pass\\n\",\n    \"    \\n\",\n    \"    def adjust_for_ace(self):\\n\",\n    \"        pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 5: Create a Chips Class**<br>\\n\",\n    \"In addition to decks of cards and hands, we need to keep track of a Player's starting chips, bets, and ongoing winnings. This could be done using global variables, but in the spirit of object oriented programming, let's make a Chips class instead!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Chips:\\n\",\n    \"    \\n\",\n    \"    def __init__(self):\\n\",\n    \"        self.total = 100  # This can be set to a default value or supplied by a user input\\n\",\n    \"        self.bet = 0\\n\",\n    \"        \\n\",\n    \"    def win_bet(self):\\n\",\n    \"        pass\\n\",\n    \"    \\n\",\n    \"    def lose_bet(self):\\n\",\n    \"        pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Function Defintions\\n\",\n    \"A lot of steps are going to be repetitive. That's where functions come in! The following steps are guidelines - add or remove functions as needed in your own program.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 6: Write a function for taking bets**<br>\\n\",\n    \"Since we're asking the user for an integer value, this would be a good place to use <code>try</code>/<code>except</code>. Remember to check that a Player's bet can be covered by their available chips.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def take_bet():\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 7: Write a function for taking hits**<br>\\n\",\n    \"Either player can take hits until they bust. This function will be called during gameplay anytime a Player requests a hit, or a Dealer's hand is less than 17. It should take in Deck and Hand objects as arguments, and deal one card off the deck and add it to the Hand. You may want it to check for aces in the event that a player's hand exceeds 21.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def hit(deck,hand):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 8: Write a function prompting the Player to Hit or Stand**<br>\\n\",\n    \"This function should accept the deck and the player's hand as arguments, and assign playing as a global variable.<br>\\n\",\n    \"If the Player Hits, employ the hit() function above. If the Player Stands, set the playing variable to False - this will control the behavior of a <code>while</code> loop later on in our code.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def hit_or_stand(deck,hand):\\n\",\n    \"    global playing  # to control an upcoming while loop\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 9: Write functions to display cards**<br>\\n\",\n    \"When the game starts, and after each time Player takes a card, the dealer's first card is hidden and all of Player's cards are visible. At the end of the hand all cards are shown, and you may want to show each hand's total value. Write a function for each of these scenarios.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def show_some(player,dealer):\\n\",\n    \"    \\n\",\n    \"    pass\\n\",\n    \"    \\n\",\n    \"def show_all(player,dealer):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 10: Write functions to handle end of game scenarios**<br>\\n\",\n    \"Remember to pass player's hand, dealer's hand and chips as needed.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def player_busts():\\n\",\n    \"    pass\\n\",\n    \"\\n\",\n    \"def player_wins():\\n\",\n    \"    pass\\n\",\n    \"\\n\",\n    \"def dealer_busts():\\n\",\n    \"    pass\\n\",\n    \"    \\n\",\n    \"def dealer_wins():\\n\",\n    \"    pass\\n\",\n    \"    \\n\",\n    \"def push():\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### And now on to the game!!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"while True:\\n\",\n    \"    # Print an opening statement\\n\",\n    \"\\n\",\n    \"    \\n\",\n    \"    # Create & shuffle the deck, deal two cards to each player\\n\",\n    \"\\n\",\n    \"    \\n\",\n    \"        \\n\",\n    \"    # Set up the Player's chips\\n\",\n    \"    \\n\",\n    \"    \\n\",\n    \"    # Prompt the Player for their bet\\n\",\n    \"\\n\",\n    \"    \\n\",\n    \"    # Show cards (but keep one dealer card hidden)\\n\",\n    \"\\n\",\n    \"    \\n\",\n    \"    while playing:  # recall this variable from our hit_or_stand function\\n\",\n    \"        \\n\",\n    \"        # Prompt for Player to Hit or Stand\\n\",\n    \"        \\n\",\n    \"        \\n\",\n    \"        # Show cards (but keep one dealer card hidden)\\n\",\n    \" \\n\",\n    \"        \\n\",\n    \"        # If player's hand exceeds 21, run player_busts() and break out of loop\\n\",\n    \"        \\n\",\n    \"\\n\",\n    \"            break\\n\",\n    \"\\n\",\n    \"    # If Player hasn't busted, play Dealer's hand until Dealer reaches 17\\n\",\n    \"    \\n\",\n    \"    \\n\",\n    \"        # Show all cards\\n\",\n    \"    \\n\",\n    \"        # Run different winning scenarios\\n\",\n    \"        \\n\",\n    \"    \\n\",\n    \"    # Inform Player of their chips total \\n\",\n    \"    \\n\",\n    \"    # Ask to play again\\n\",\n    \"\\n\",\n    \"        break\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"And that's it! Remember, these steps may differ significantly from your own solution. That's OK! Keep working on different sections of your program until you get the desired results. It takes a lot of time and patience! As always, feel free to post questions and comments to the QA Forums.\\n\",\n    \"# Good job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "08-Milestone Project - 2/03-Milestone Project 2 - Complete Walkthrough Solution.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# Milestone Project 2 - Complete Walkthrough Solution\\n\",\n    \"This notebook walks through a proposed solution to the Blackjack Game milestone project. The approach to solving and the specific code used are only suggestions - there are many different ways to code this out, and yours is likely to be different!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Game Play\\n\",\n    \"To play a hand of Blackjack the following steps must be followed:\\n\",\n    \"1. Create a deck of 52 cards\\n\",\n    \"2. Shuffle the deck\\n\",\n    \"3. Ask the Player for their bet\\n\",\n    \"4. Make sure that the Player's bet does not exceed their available chips\\n\",\n    \"5. Deal two cards to the Dealer and two cards to the Player\\n\",\n    \"6. Show only one of the Dealer's cards, the other remains hidden\\n\",\n    \"7. Show both of the Player's cards\\n\",\n    \"8. Ask the Player if they wish to Hit, and take another card\\n\",\n    \"9. If the Player's hand doesn't Bust (go over 21), ask if they'd like to Hit again.\\n\",\n    \"10. If a Player Stands, play the Dealer's hand. The dealer will always Hit until the Dealer's value meets or exceeds 17\\n\",\n    \"11. Determine the winner and adjust the Player's chips accordingly\\n\",\n    \"12. Ask the Player if they'd like to play again\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Playing Cards\\n\",\n    \"A standard deck of playing cards has four suits (Hearts, Diamonds, Spades and Clubs) and thirteen ranks (2 through 10, then the face cards Jack, Queen, King and Ace) for a total of 52 cards per deck. Jacks, Queens and Kings all have a rank of 10. Aces have a rank of either 11 or 1 as needed to reach 21 without busting. As a starting point in your program, you may want to assign variables to store a list of suits, ranks, and then use a dictionary to map ranks to values.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## The Game\\n\",\n    \"### Imports and Global Variables\\n\",\n    \"** Step 1: Import the random module. This will be used to shuffle the deck prior to dealing. Then, declare variables to store suits, ranks and values. You can develop your own system, or copy ours below. Finally, declare a Boolean value to be used to control <code>while</code> loops. This is a common practice used to control the flow of the game.**\\n\",\n    \"\\n\",\n    \"    suits = ('Hearts', 'Diamonds', 'Spades', 'Clubs')\\n\",\n    \"    ranks = ('Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Jack', 'Queen', 'King', 'Ace')\\n\",\n    \"    values = {'Two':2, 'Three':3, 'Four':4, 'Five':5, 'Six':6, 'Seven':7, 'Eight':8, 'Nine':9, 'Ten':10, 'Jack':10,\\n\",\n    \"             'Queen':10, 'King':10, 'Ace':11}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import random\\n\",\n    \"\\n\",\n    \"suits = ('Hearts', 'Diamonds', 'Spades', 'Clubs')\\n\",\n    \"ranks = ('Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Jack', 'Queen', 'King', 'Ace')\\n\",\n    \"values = {'Two':2, 'Three':3, 'Four':4, 'Five':5, 'Six':6, 'Seven':7, 'Eight':8, 'Nine':9, 'Ten':10, 'Jack':10,\\n\",\n    \"         'Queen':10, 'King':10, 'Ace':11}\\n\",\n    \"\\n\",\n    \"playing = True\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Class Definitions\\n\",\n    \"Consider making a Card class where each Card object has a suit and a rank, then a Deck class to hold all 52 Card objects, and can be shuffled, and finally a Hand class that holds those Cards that have been dealt to each player from the Deck.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 2: Create a Card Class**<br>\\n\",\n    \"A Card object really only needs two attributes: suit and rank. You might add an attribute for \\\"value\\\" - we chose to handle value later when developing our Hand class.<br>In addition to the Card's \\\\_\\\\_init\\\\_\\\\_ method, consider adding a \\\\_\\\\_str\\\\_\\\\_ method that, when asked to print a Card, returns a string in the form \\\"Two of Hearts\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Card:\\n\",\n    \"\\n\",\n    \"    def __init__(self,suit,rank):\\n\",\n    \"        self.suit = suit\\n\",\n    \"        self.rank = rank\\n\",\n    \"        \\n\",\n    \"    def __str__(self):\\n\",\n    \"        return self.rank + ' of ' + self.suit\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 3: Create a Deck Class**<br>\\n\",\n    \"Here we might store 52 card objects in a list that can later be shuffled. First, though, we need to *instantiate* all 52 unique card objects and add them to our list. So long as the Card class definition appears in our code, we can build Card objects inside our Deck \\\\_\\\\_init\\\\_\\\\_ method. Consider iterating over sequences of suits and ranks to build out each card. This might appear inside a Deck class \\\\_\\\\_init\\\\_\\\\_ method:\\n\",\n    \"\\n\",\n    \"    for suit in suits:\\n\",\n    \"        for rank in ranks:\\n\",\n    \"\\n\",\n    \"In addition to an \\\\_\\\\_init\\\\_\\\\_ method we'll want to add methods to shuffle our deck, and to deal out cards during gameplay.<br><br>\\n\",\n    \"OPTIONAL: We may never need to print the contents of the deck during gameplay, but having the ability to see the cards inside it may help troubleshoot any problems that occur during development. With this in mind, consider adding a \\\\_\\\\_str\\\\_\\\\_ method to the class definition.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Deck:\\n\",\n    \"    \\n\",\n    \"    def __init__(self):\\n\",\n    \"        self.deck = []  # start with an empty list\\n\",\n    \"        for suit in suits:\\n\",\n    \"            for rank in ranks:\\n\",\n    \"                self.deck.append(Card(suit,rank))  # build Card objects and add them to the list\\n\",\n    \"    \\n\",\n    \"    def __str__(self):\\n\",\n    \"        deck_comp = ''  # start with an empty string\\n\",\n    \"        for card in self.deck:\\n\",\n    \"            deck_comp += '\\\\n '+card.__str__() # add each Card object's print string\\n\",\n    \"        return 'The deck has:' + deck_comp\\n\",\n    \"\\n\",\n    \"    def shuffle(self):\\n\",\n    \"        random.shuffle(self.deck)\\n\",\n    \"        \\n\",\n    \"    def deal(self):\\n\",\n    \"        single_card = self.deck.pop()\\n\",\n    \"        return single_card\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"TESTING: Just to see that everything works so far, let's see what our Deck looks like!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"The deck has:\\n\",\n      \" Two of Hearts\\n\",\n      \" Three of Hearts\\n\",\n      \" Four of Hearts\\n\",\n      \" Five of Hearts\\n\",\n      \" Six of Hearts\\n\",\n      \" Seven of Hearts\\n\",\n      \" Eight of Hearts\\n\",\n      \" Nine of Hearts\\n\",\n      \" Ten of Hearts\\n\",\n      \" Jack of Hearts\\n\",\n      \" Queen of Hearts\\n\",\n      \" King of Hearts\\n\",\n      \" Ace of Hearts\\n\",\n      \" Two of Diamonds\\n\",\n      \" Three of Diamonds\\n\",\n      \" Four of Diamonds\\n\",\n      \" Five of Diamonds\\n\",\n      \" Six of Diamonds\\n\",\n      \" Seven of Diamonds\\n\",\n      \" Eight of Diamonds\\n\",\n      \" Nine of Diamonds\\n\",\n      \" Ten of Diamonds\\n\",\n      \" Jack of Diamonds\\n\",\n      \" Queen of Diamonds\\n\",\n      \" King of Diamonds\\n\",\n      \" Ace of Diamonds\\n\",\n      \" Two of Spades\\n\",\n      \" Three of Spades\\n\",\n      \" Four of Spades\\n\",\n      \" Five of Spades\\n\",\n      \" Six of Spades\\n\",\n      \" Seven of Spades\\n\",\n      \" Eight of Spades\\n\",\n      \" Nine of Spades\\n\",\n      \" Ten of Spades\\n\",\n      \" Jack of Spades\\n\",\n      \" Queen of Spades\\n\",\n      \" King of Spades\\n\",\n      \" Ace of Spades\\n\",\n      \" Two of Clubs\\n\",\n      \" Three of Clubs\\n\",\n      \" Four of Clubs\\n\",\n      \" Five of Clubs\\n\",\n      \" Six of Clubs\\n\",\n      \" Seven of Clubs\\n\",\n      \" Eight of Clubs\\n\",\n      \" Nine of Clubs\\n\",\n      \" Ten of Clubs\\n\",\n      \" Jack of Clubs\\n\",\n      \" Queen of Clubs\\n\",\n      \" King of Clubs\\n\",\n      \" Ace of Clubs\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"test_deck = Deck()\\n\",\n    \"print(test_deck)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now let's move on to our Hand class.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 4: Create a Hand Class**<br>\\n\",\n    \"In addition to holding Card objects dealt from the Deck, the Hand class may be used to calculate the value of those cards using the values dictionary defined above. It may also need to adjust for the value of Aces when appropriate.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Hand:\\n\",\n    \"    def __init__(self):\\n\",\n    \"        self.cards = []  # start with an empty list as we did in the Deck class\\n\",\n    \"        self.value = 0   # start with zero value\\n\",\n    \"        self.aces = 0    # add an attribute to keep track of aces\\n\",\n    \"    \\n\",\n    \"    def add_card(self,card):\\n\",\n    \"        self.cards.append(card)\\n\",\n    \"        self.value += values[card.rank]\\n\",\n    \"    \\n\",\n    \"    def adjust_for_ace(self):\\n\",\n    \"        pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"TESTING: Before we tackle the issue of changing Aces, let's make sure we can add two cards to a player's hand and obtain their value:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"14\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"test_deck = Deck()\\n\",\n    \"test_deck.shuffle()\\n\",\n    \"test_player = Hand()\\n\",\n    \"test_player.add_card(test_deck.deal())\\n\",\n    \"test_player.add_card(test_deck.deal())\\n\",\n    \"test_player.value\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's see what these two cards are:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Nine of Hearts\\n\",\n      \"Five of Hearts\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for card in test_player.cards:\\n\",\n    \"    print(card)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now let's tackle the Aces issue. If a hand's value exceeds 21 but it contains an Ace, we can reduce the Ace's value from 11 to 1 and continue playing.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Hand:\\n\",\n    \"    \\n\",\n    \"    def __init__(self):\\n\",\n    \"        self.cards = []  # start with an empty list as we did in the Deck class\\n\",\n    \"        self.value = 0   # start with zero value\\n\",\n    \"        self.aces = 0    # add an attribute to keep track of aces\\n\",\n    \"    \\n\",\n    \"    def add_card(self,card):\\n\",\n    \"        self.cards.append(card)\\n\",\n    \"        self.value += values[card.rank]\\n\",\n    \"        if card.rank == 'Ace':\\n\",\n    \"            self.aces += 1  # add to self.aces\\n\",\n    \"    \\n\",\n    \"    def adjust_for_ace(self):\\n\",\n    \"        while self.value > 21 and self.aces:\\n\",\n    \"            self.value -= 10\\n\",\n    \"            self.aces -= 1 \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We added code to the add_card method to bump self.aces whenever an ace is brought into the hand, and added code to the adjust_for_aces method that decreases the number of aces any time we make an adjustment to stay under 21.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 5: Create a Chips Class**<br>\\n\",\n    \"In addition to decks of cards and hands, we need to keep track of a Player's starting chips, bets, and ongoing winnings. This could be done using global variables, but in the spirit of object oriented programming, let's make a Chips class instead!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Chips:\\n\",\n    \"    \\n\",\n    \"    def __init__(self):\\n\",\n    \"        self.total = 100  # This can be set to a default value or supplied by a user input\\n\",\n    \"        self.bet = 0\\n\",\n    \"        \\n\",\n    \"    def win_bet(self):\\n\",\n    \"        self.total += self.bet\\n\",\n    \"    \\n\",\n    \"    def lose_bet(self):\\n\",\n    \"        self.total -= self.bet\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"A NOTE ABOUT OUR DEFAULT TOTAL VALUE:<br>\\n\",\n    \"Alternatively, we could have passed a default total value as an parameter in the \\\\_\\\\_init\\\\_\\\\_. This would have let us pass in an override value at the time the object was created rather than wait until later to change it. The code would have looked like this:\\n\",\n    \"\\n\",\n    \"    def __init__(self,total=100):\\n\",\n    \"        self.total = total\\n\",\n    \"        self.bet = 0\\n\",\n    \"\\n\",\n    \"Either technique is fine, it only depends on how you plan to start your game parameters.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Function Defintions\\n\",\n    \"A lot of steps are going to be repetitive. That's where functions come in! The following steps are guidelines - add or remove functions as needed in your own program.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 6: Write a function for taking bets**<br>\\n\",\n    \"Since we're asking the user for an integer value, this would be a good place to use <code>try</code>/<code>except</code>. Remember to check that a Player's bet can be covered by their available chips.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def take_bet(chips):\\n\",\n    \"    \\n\",\n    \"    while True:\\n\",\n    \"        try:\\n\",\n    \"            chips.bet = int(input('How many chips would you like to bet? '))\\n\",\n    \"        except ValueError:\\n\",\n    \"            print('Sorry, a bet must be an integer!')\\n\",\n    \"        else:\\n\",\n    \"            if chips.bet > chips.total:\\n\",\n    \"                print(\\\"Sorry, your bet can't exceed\\\",chips.total)\\n\",\n    \"            else:\\n\",\n    \"                break\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We used a <code>while</code> loop here to continually prompt the user for input until we received an integer value that was within the Player's betting limit.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"A QUICK NOTE ABOUT FUNCTIONS:<br>\\n\",\n    \"If we knew in advance what we were going to call our Player's Chips object, we could have written the above function like this:\\n\",\n    \"\\n\",\n    \"    def take_bet():\\n\",\n    \"        while True:\\n\",\n    \"            try:\\n\",\n    \"                player_chips.bet = int(input('How many chips would you like to bet? '))\\n\",\n    \"            except ValueError:\\n\",\n    \"                print('Sorry, a bet must be an integer!')\\n\",\n    \"            else:\\n\",\n    \"                if player_chips.bet > player_chips.total:\\n\",\n    \"                    print(\\\"Sorry, your bet can't exceed\\\",player_chips.total)\\n\",\n    \"                else:\\n\",\n    \"                    break\\n\",\n    \"\\n\",\n    \"and then we could call the function without passing any arguments. This is generally not a good idea! It's better to have functions be self-contained, able to accept any incoming value than depend on some future naming convention. Also, this makes it easier to add players in future versions of our program!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 7: Write a function for taking hits**<br>\\n\",\n    \"Either player can take hits until they bust. This function will be called during gameplay anytime a Player requests a hit, or a Dealer's hand is less than 17. It should take in Deck and Hand objects as arguments, and deal one card off the deck and add it to the Hand. You may want it to check for aces in the event that a player's hand exceeds 21.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def hit(deck,hand):\\n\",\n    \"    \\n\",\n    \"    hand.add_card(deck.deal())\\n\",\n    \"    hand.adjust_for_ace()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 8: Write a function prompting the Player to Hit or Stand**<br>\\n\",\n    \"This function should accept the deck and the player's hand as arguments, and assign playing as a global variable.<br>\\n\",\n    \"If the Player Hits, employ the hit() function above. If the Player Stands, set the playing variable to False - this will control the behavior of a <code>while</code> loop later on in our code.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def hit_or_stand(deck,hand):\\n\",\n    \"    global playing  # to control an upcoming while loop\\n\",\n    \"    \\n\",\n    \"    while True:\\n\",\n    \"        x = input(\\\"Would you like to Hit or Stand? Enter 'h' or 's' \\\")\\n\",\n    \"        \\n\",\n    \"        if x[0].lower() == 'h':\\n\",\n    \"            hit(deck,hand)  # hit() function defined above\\n\",\n    \"\\n\",\n    \"        elif x[0].lower() == 's':\\n\",\n    \"            print(\\\"Player stands. Dealer is playing.\\\")\\n\",\n    \"            playing = False\\n\",\n    \"\\n\",\n    \"        else:\\n\",\n    \"            print(\\\"Sorry, please try again.\\\")\\n\",\n    \"            continue\\n\",\n    \"        break\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 9: Write functions to display cards**<br>\\n\",\n    \"When the game starts, and after each time Player takes a card, the dealer's first card is hidden and all of Player's cards are visible. At the end of the hand all cards are shown, and you may want to show each hand's total value. Write a function for each of these scenarios.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def show_some(player,dealer):\\n\",\n    \"    print(\\\"\\\\nDealer's Hand:\\\")\\n\",\n    \"    print(\\\" <card hidden>\\\")\\n\",\n    \"    print('',dealer.cards[1])  \\n\",\n    \"    print(\\\"\\\\nPlayer's Hand:\\\", *player.cards, sep='\\\\n ')\\n\",\n    \"    \\n\",\n    \"def show_all(player,dealer):\\n\",\n    \"    print(\\\"\\\\nDealer's Hand:\\\", *dealer.cards, sep='\\\\n ')\\n\",\n    \"    print(\\\"Dealer's Hand =\\\",dealer.value)\\n\",\n    \"    print(\\\"\\\\nPlayer's Hand:\\\", *player.cards, sep='\\\\n ')\\n\",\n    \"    print(\\\"Player's Hand =\\\",player.value)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"QUICK NOTES ABOUT PRINT STATEMENTS:<br>\\n\",\n    \"\\n\",\n    \"* The asterisk <code>*</code> symbol is used to print every item in a collection, and the <code>sep='\\\\n '</code> argument prints each item on a separate line.\\n\",\n    \"\\n\",\n    \"* In the fourth line where we have\\n\",\n    \"\\n\",\n    \"      print('',dealer.cards[1])\\n\",\n    \"    \\n\",\n    \"    the empty string and comma are there just to add a space.\\n\",\n    \"\\n\",\n    \"- Here we used commas to separate the objects being printed in each line. If you want to concatenate strings using the <code>+</code> symbol, then you have to call each Card object's \\\\_\\\\_str\\\\_\\\\_ method explicitly, as with\\n\",\n    \"\\n\",\n    \"      print(' ' + dealer.cards[1].__str__())\\n\",\n    \"    \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Step 10: Write functions to handle end of game scenarios**<br>\\n\",\n    \"Remember to pass player's hand, dealer's hand and chips as needed.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def player_busts(player,dealer,chips):\\n\",\n    \"    print(\\\"Player busts!\\\")\\n\",\n    \"    chips.lose_bet()\\n\",\n    \"\\n\",\n    \"def player_wins(player,dealer,chips):\\n\",\n    \"    print(\\\"Player wins!\\\")\\n\",\n    \"    chips.win_bet()\\n\",\n    \"\\n\",\n    \"def dealer_busts(player,dealer,chips):\\n\",\n    \"    print(\\\"Dealer busts!\\\")\\n\",\n    \"    chips.win_bet()\\n\",\n    \"    \\n\",\n    \"def dealer_wins(player,dealer,chips):\\n\",\n    \"    print(\\\"Dealer wins!\\\")\\n\",\n    \"    chips.lose_bet()\\n\",\n    \"    \\n\",\n    \"def push(player,dealer):\\n\",\n    \"    print(\\\"Dealer and Player tie! It's a push.\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### And now on to the game!!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Welcome to BlackJack! Get as close to 21 as you can without going over!\\n\",\n      \"    Dealer hits until she reaches 17. Aces count as 1 or 11.\\n\",\n      \"How many chips would you like to bet? 5\\n\",\n      \"\\n\",\n      \"Dealer's Hand:\\n\",\n      \" <card hidden>\\n\",\n      \" Seven of Spades\\n\",\n      \"\\n\",\n      \"Player's Hand:\\n\",\n      \" Queen of Spades\\n\",\n      \" Nine of Hearts\\n\",\n      \"\\n\",\n      \"Dealer's Hand:\\n\",\n      \" Ace of Clubs\\n\",\n      \" Seven of Spades\\n\",\n      \"Dealer's Hand = 18\\n\",\n      \"\\n\",\n      \"Player's Hand:\\n\",\n      \" Queen of Spades\\n\",\n      \" Nine of Hearts\\n\",\n      \"Player's Hand = 19\\n\",\n      \"Player wins!\\n\",\n      \"\\n\",\n      \"Player's winnings stand at 105\\n\",\n      \"Would you like to play another hand? Enter 'y' or 'n' y\\n\",\n      \"Welcome to BlackJack! Get as close to 21 as you can without going over!\\n\",\n      \"    Dealer hits until she reaches 17. Aces count as 1 or 11.\\n\",\n      \"How many chips would you like to bet? 5\\n\",\n      \"\\n\",\n      \"Dealer's Hand:\\n\",\n      \" <card hidden>\\n\",\n      \" Nine of Clubs\\n\",\n      \"\\n\",\n      \"Player's Hand:\\n\",\n      \" Queen of Diamonds\\n\",\n      \" Ace of Hearts\\n\",\n      \"Would you like to Hit or Stand? Enter 'h' or 's' s\\n\",\n      \"Player stands. Dealer is playing.\\n\",\n      \"\\n\",\n      \"Dealer's Hand:\\n\",\n      \" <card hidden>\\n\",\n      \" Nine of Clubs\\n\",\n      \"\\n\",\n      \"Player's Hand:\\n\",\n      \" Queen of Diamonds\\n\",\n      \" Ace of Hearts\\n\",\n      \"\\n\",\n      \"Dealer's Hand:\\n\",\n      \" Eight of Clubs\\n\",\n      \" Nine of Clubs\\n\",\n      \"Dealer's Hand = 17\\n\",\n      \"\\n\",\n      \"Player's Hand:\\n\",\n      \" Queen of Diamonds\\n\",\n      \" Ace of Hearts\\n\",\n      \"Player's Hand = 21\\n\",\n      \"Player wins!\\n\",\n      \"\\n\",\n      \"Player's winnings stand at 105\\n\",\n      \"Would you like to play another hand? Enter 'y' or 'n' y\\n\",\n      \"Welcome to BlackJack! Get as close to 21 as you can without going over!\\n\",\n      \"    Dealer hits until she reaches 17. Aces count as 1 or 11.\\n\",\n      \"How many chips would you like to bet? 65\\n\",\n      \"\\n\",\n      \"Dealer's Hand:\\n\",\n      \" <card hidden>\\n\",\n      \" Four of Spades\\n\",\n      \"\\n\",\n      \"Player's Hand:\\n\",\n      \" Queen of Clubs\\n\",\n      \" Four of Diamonds\\n\",\n      \"Would you like to Hit or Stand? Enter 'h' or 's' h\\n\",\n      \"\\n\",\n      \"Dealer's Hand:\\n\",\n      \" <card hidden>\\n\",\n      \" Four of Spades\\n\",\n      \"\\n\",\n      \"Player's Hand:\\n\",\n      \" Queen of Clubs\\n\",\n      \" Four of Diamonds\\n\",\n      \" Eight of Diamonds\\n\",\n      \"Player busts!\\n\",\n      \"\\n\",\n      \"Player's winnings stand at 35\\n\",\n      \"Would you like to play another hand? Enter 'y' or 'n' n\\n\",\n      \"Thanks for playing!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"while True:\\n\",\n    \"    # Print an opening statement\\n\",\n    \"    print('Welcome to BlackJack! Get as close to 21 as you can without going over!\\\\n\\\\\\n\",\n    \"    Dealer hits until she reaches 17. Aces count as 1 or 11.')\\n\",\n    \"    \\n\",\n    \"    # Create & shuffle the deck, deal two cards to each player\\n\",\n    \"    deck = Deck()\\n\",\n    \"    deck.shuffle()\\n\",\n    \"    \\n\",\n    \"    player_hand = Hand()\\n\",\n    \"    player_hand.add_card(deck.deal())\\n\",\n    \"    player_hand.add_card(deck.deal())\\n\",\n    \"    \\n\",\n    \"    dealer_hand = Hand()\\n\",\n    \"    dealer_hand.add_card(deck.deal())\\n\",\n    \"    dealer_hand.add_card(deck.deal())\\n\",\n    \"            \\n\",\n    \"    # Set up the Player's chips\\n\",\n    \"    player_chips = Chips()  # remember the default value is 100    \\n\",\n    \"    \\n\",\n    \"    # Prompt the Player for their bet\\n\",\n    \"    take_bet(player_chips)\\n\",\n    \"    \\n\",\n    \"    # Show cards (but keep one dealer card hidden)\\n\",\n    \"    show_some(player_hand,dealer_hand)\\n\",\n    \"    \\n\",\n    \"    while playing:  # recall this variable from our hit_or_stand function\\n\",\n    \"        \\n\",\n    \"        # Prompt for Player to Hit or Stand\\n\",\n    \"        hit_or_stand(deck,player_hand) \\n\",\n    \"        \\n\",\n    \"        # Show cards (but keep one dealer card hidden)\\n\",\n    \"        show_some(player_hand,dealer_hand)  \\n\",\n    \"        \\n\",\n    \"        # If player's hand exceeds 21, run player_busts() and break out of loop\\n\",\n    \"        if player_hand.value > 21:\\n\",\n    \"            player_busts(player_hand,dealer_hand,player_chips)\\n\",\n    \"            break        \\n\",\n    \"\\n\",\n    \"\\n\",\n    \"    # If Player hasn't busted, play Dealer's hand until Dealer reaches 17 \\n\",\n    \"    if player_hand.value <= 21:\\n\",\n    \"        \\n\",\n    \"        while dealer_hand.value < 17:\\n\",\n    \"            hit(deck,dealer_hand)    \\n\",\n    \"    \\n\",\n    \"        # Show all cards\\n\",\n    \"        show_all(player_hand,dealer_hand)\\n\",\n    \"        \\n\",\n    \"        # Run different winning scenarios\\n\",\n    \"        if dealer_hand.value > 21:\\n\",\n    \"            dealer_busts(player_hand,dealer_hand,player_chips)\\n\",\n    \"\\n\",\n    \"        elif dealer_hand.value > player_hand.value:\\n\",\n    \"            dealer_wins(player_hand,dealer_hand,player_chips)\\n\",\n    \"\\n\",\n    \"        elif dealer_hand.value < player_hand.value:\\n\",\n    \"            player_wins(player_hand,dealer_hand,player_chips)\\n\",\n    \"\\n\",\n    \"        else:\\n\",\n    \"            push(player_hand,dealer_hand)        \\n\",\n    \"    \\n\",\n    \"    # Inform Player of their chips total \\n\",\n    \"    print(\\\"\\\\nPlayer's winnings stand at\\\",player_chips.total)\\n\",\n    \"    \\n\",\n    \"    # Ask to play again\\n\",\n    \"    new_game = input(\\\"Would you like to play another hand? Enter 'y' or 'n' \\\")\\n\",\n    \"    \\n\",\n    \"    if new_game[0].lower()=='y':\\n\",\n    \"        playing=True\\n\",\n    \"        continue\\n\",\n    \"    else:\\n\",\n    \"        print(\\\"Thanks for playing!\\\")\\n\",\n    \"        break\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"And that's it! Remember, these steps may differ significantly from your own solution. That's OK! Keep working on different sections of your program until you get the desired results. It takes a lot of time and patience! As always, feel free to post questions and comments to the QA Forums.\\n\",\n    \"# Good job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "09-Empty-Section-Skip/.ipynb_checkpoints/01-Map-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# map()\\n\",\n    \"\\n\",\n    \"map() is a built-in Python function that takes in two or more arguments: a function and one or more iterables, in the form:\\n\",\n    \"\\n\",\n    \"    map(function, iterable, ...)\\n\",\n    \"    \\n\",\n    \"map() returns an *iterator* - that is, map() returns a special object that yields one result at a time as needed. We will learn more about iterators and generators in a future lecture. For now, since our examples are so small, we will cast map() as a list to see the results immediately.\\n\",\n    \"\\n\",\n    \"When we went over list comprehensions we created a small expression to convert Celsius to Fahrenheit. Let's do the same here but use map:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def fahrenheit(celsius):\\n\",\n    \"    return (9/5)*celsius + 32\\n\",\n    \"    \\n\",\n    \"temps = [0, 22.5, 40, 100]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now let's see map() in action:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[32.0, 72.5, 104.0, 212.0]\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"F_temps = map(fahrenheit, temps)\\n\",\n    \"\\n\",\n    \"#Show\\n\",\n    \"list(F_temps)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In the example above, map() applies the fahrenheit function to every item in temps. However, we don't have to define our functions beforehand; we can use a lambda expression instead:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[32.0, 72.5, 104.0, 212.0]\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(map(lambda x: (9/5)*x + 32, temps))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! We got the same result! Using map with lambda expressions is much more common since the entire purpose of map() is to save effort on having to create manual for loops.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### map() with multiple iterables\\n\",\n    \"map() can accept more than one iterable. The iterables should be the same length - in the event that they are not, map() will stop as soon as the shortest iterable is exhausted.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"For instance, if our function is trying to add two values **x** and **y**, we can pass a list of **x** values and another list of **y** values to map(). The function (or lambda) will be fed the 0th index from each list, and then the 1st index, and so on until the n-th index is reached.\\n\",\n    \"\\n\",\n    \"Let's see this in action with two and then three lists:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[6, 8, 10, 12]\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"a = [1,2,3,4]\\n\",\n    \"b = [5,6,7,8]\\n\",\n    \"c = [9,10,11,12]\\n\",\n    \"\\n\",\n    \"list(map(lambda x,y:x+y,a,b))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[15, 18, 21, 24]\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Now all three lists\\n\",\n    \"list(map(lambda x,y,z:x+y+z,a,b,c))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can see in the example above that the parameter **x** gets its values from the list **a**, while **y** gets its values from **b** and **z** from list **c**. Go ahead and play with your own example to make sure you fully understand mapping to more than one iterable.\\n\",\n    \"\\n\",\n    \"Great job! You should now have a basic understanding of the map() function.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "09-Empty-Section-Skip/.ipynb_checkpoints/02-Reduce-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# reduce()\\n\",\n    \"\\n\",\n    \"Many times students have difficulty understanding reduce() so pay careful attention to this lecture. The function reduce(function, sequence) continually applies the function to the sequence. It then returns a single value. \\n\",\n    \"\\n\",\n    \"If seq = [ s1, s2, s3, ... , sn ], calling reduce(function, sequence) works like this:\\n\",\n    \"\\n\",\n    \"* At first the first two elements of seq will be applied to function, i.e. func(s1,s2) \\n\",\n    \"* The list on which reduce() works looks now like this: [ function(s1, s2), s3, ... , sn ]\\n\",\n    \"* In the next step the function will be applied on the previous result and the third element of the list, i.e. function(function(s1, s2),s3)\\n\",\n    \"* The list looks like this now: [ function(function(s1, s2),s3), ... , sn ]\\n\",\n    \"* It continues like this until just one element is left and return this element as the result of reduce()\\n\",\n    \"\\n\",\n    \"Let's see an example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"113\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"from functools import reduce\\n\",\n    \"\\n\",\n    \"lst =[47,11,42,13]\\n\",\n    \"reduce(lambda x,y: x+y,lst)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Lets look at a diagram to get a better understanding of what is going on here:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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Hlxxz549Y8aMmTZtWr5SiCI/bCSh/WnFihVr166tWrVqsP6iAKme0DHkv//977Zt25o1a3bbbbeZrpJnS+bm5g4bNuzee+8NahxjzIuy4e7du999990BAwZUrlw5Xxnw6pNOqDmys7MXLly4bNmyjz/+GApaia2+z7fffrtkyZJPPvlkkSJFTFe5FEt26NChe/fut956qzFjHjROcnJy27ZtFyxYEBcXl99u8urvXBPqT7Gxse3atWvfvn2TJk127typq3hDrZk/21i/ZmZmjh071rKs559/Xrf0hfbiN/hre9q23b9//xYtWhjGyRvS0tJ69eo1b968uLi40E6UTyDy1Q0FefrkyZMzZszweDwDBw4MJsDy87C8evXqxYsXJyYmPvDAA6afXIraTUtLGzVqVJMmTR566CFjwzyYMS0tbciQId26datVq1Y+NSDnPxARMyPi+vXrExMT//jjj7N+lX/uU9/PrFmz+vTpk5qaGryYr+6zQCBotAEDBqxbty70isHftx4zP/nkkzt27Ah2lnxow/yldM4d97xe7wsvvHD77bc/88wzbrf7qieYQ/9dbbpXXnklLi4uPOb7r25bI2KbNm06dOjQrFkzMMs4L9Ihmdnj8Tz77LMvvvhiw4YN83VBUz7nb/1m9uzZffv23bZtW+j1q0XhwVElKSmpQ4cOK1asyM+jSv5vX/2anp7+/PPP6yY2GicPZvR4PAMGDNi8eXP+98P8qHTOpXAhxK5duz7++OOKFSt27979arF46LA8Y8aM3377rV+/fpUqVTJlspdoUiLq1q3b888/H8wcG8tcbBq0R48ejz76aIFIhOXfcxeChtP9vHr16qNGjXK73Y8//niQjEInj64Y4wBA165dc3JyJkyYUKlSpbPu1uDvd5WgSRs3bty/f/9bb73VWDIPBhRCJCYmtmzZUjNO/r95kf/v8izJs3HjxvHjx3fr1q1x48YOh+MK8HqowNmzZ8+nn35aq1atli1bmjH50q2ampr6+uuv9+zZs2bNmsaeeUiMCCGGDRvWqFGjxMTEgmJAwQXk4IXQxQTp6emLFy9es2bNtGnT/tHc7Vl8N2vWrN9///2pp56qXbu2SRtfOrKzs/v169e9e/d69eoZS+ZtFOzbt+/tt9/+5JNPFiCHLDCkc24Qe/Dgwfvvv3/ZsmV6AXcoO/wTZPf+++8f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\\n\",\n      \"text/plain\": [\n       \"<IPython.core.display.Image object>\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"from IPython.display import Image\\n\",\n    \"Image('http://www.python-course.eu/images/reduce_diagram.png')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how we keep reducing the sequence until a single final value is obtained. Lets see another example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#Find the maximum of a sequence (This already exists as max())\\n\",\n    \"max_find = lambda a,b: a if (a > b) else b\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"47\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#Find max\\n\",\n    \"reduce(max_find,lst)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Hopefully you can see how useful reduce can be in various situations. Keep it in mind as you think about your code projects!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "09-Empty-Section-Skip/.ipynb_checkpoints/03-Filter-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# filter\\n\",\n    \"\\n\",\n    \"The function filter(function, list) offers a convenient way to filter out all the elements of an iterable, for which the function returns True. \\n\",\n    \"\\n\",\n    \"The function filter(function,list) needs a function as its first argument. The function needs to return a Boolean value (either True or False). This function will be applied to every element of the iterable. Only if the function returns True will the element of the iterable be included in the result.\\n\",\n    \"\\n\",\n    \"Like map(), filter() returns an *iterator* - that is, filter yields one result at a time as needed. Iterators and generators will be covered in an upcoming lecture. For now, since our examples are so small, we will cast filter() as a list to see our results immediately.\\n\",\n    \"\\n\",\n    \"Let's see some examples:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#First let's make a function\\n\",\n    \"def even_check(num):\\n\",\n    \"    if num%2 ==0:\\n\",\n    \"        return True\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now let's filter a list of numbers. Note: putting the function into filter without any parentheses might feel strange, but keep in mind that functions are objects as well.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lst =range(20)\\n\",\n    \"\\n\",\n    \"list(filter(even_check,lst))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"filter() is more commonly used with lambda functions, because we usually use filter for a quick job where we don't want to write an entire function. Let's repeat the example above using a lambda expression:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(filter(lambda x: x%2==0,lst))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! You should now have a solid understanding of filter() and how to apply it to your code!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "09-Empty-Section-Skip/.ipynb_checkpoints/04-Zip-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# zip\\n\",\n    \"\\n\",\n    \"zip() makes an iterator that aggregates elements from each of the iterables.\\n\",\n    \"\\n\",\n    \"Returns an iterator of tuples, where the i-th tuple contains the i-th element from each of the argument sequences or iterables. The iterator stops when the shortest input iterable is exhausted. With a single iterable argument, it returns an iterator of 1-tuples. With no arguments, it returns an empty iterator. \\n\",\n    \"\\n\",\n    \"zip() is equivalent to:\\n\",\n    \"\\n\",\n    \"    def zip(*iterables):\\n\",\n    \"        # zip('ABCD', 'xy') --> Ax By\\n\",\n    \"        sentinel = object()\\n\",\n    \"        iterators = [iter(it) for it in iterables]\\n\",\n    \"        while iterators:\\n\",\n    \"            result = []\\n\",\n    \"            for it in iterators:\\n\",\n    \"                elem = next(it, sentinel)\\n\",\n    \"                if elem is sentinel:\\n\",\n    \"                    return\\n\",\n    \"                result.append(elem)\\n\",\n    \"            yield tuple(result)\\n\",\n    \"        \\n\",\n    \"\\n\",\n    \"zip() should only be used with unequal length inputs when you don’t care about trailing, unmatched values from the longer iterables. \\n\",\n    \"\\n\",\n    \"Let's see it in action in some examples:\\n\",\n    \"\\n\",\n    \"## Examples\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[(1, 4), (2, 5), (3, 6)]\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"x = [1,2,3]\\n\",\n    \"y = [4,5,6]\\n\",\n    \"\\n\",\n    \"# Zip the lists together\\n\",\n    \"list(zip(x,y))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how tuples are returned. What if one iterable is longer than the other?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[(1, 4), (2, 5), (3, 6)]\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"x = [1,2,3]\\n\",\n    \"y = [4,5,6,7,8]\\n\",\n    \"\\n\",\n    \"# Zip the lists together\\n\",\n    \"list(zip(x,y))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how the zip is defined by the shortest iterable length. Its generally advised not to zip unequal length iterables unless your very sure you only need partial tuple pairings.\\n\",\n    \"\\n\",\n    \"What happens if we try to zip together dictionaries?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[('a', 'c'), ('b', 'd')]\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d1 = {'a':1,'b':2}\\n\",\n    \"d2 = {'c':4,'d':5}\\n\",\n    \"\\n\",\n    \"list(zip(d1,d2))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This makes sense because simply iterating through the dictionaries will result in just the keys. We would have to call methods to mix keys and values:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[('c', 1), ('d', 2)]\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(zip(d2,d1.values()))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Finally lets use zip() to switch the keys and values of the two dictionaries:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def switcharoo(d1,d2):\\n\",\n    \"    dout = {}\\n\",\n    \"    \\n\",\n    \"    for d1key,d2val in zip(d1,d2.values()):\\n\",\n    \"        dout[d1key] = d2val\\n\",\n    \"    \\n\",\n    \"    return dout\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'a': 4, 'b': 5}\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"switcharoo(d1,d2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! You can use zip to save a lot of typing in many situations! You should now have a good understanding of zip() and some possible use cases.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "09-Empty-Section-Skip/.ipynb_checkpoints/05-Enumerate-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# enumerate()\\n\",\n    \"\\n\",\n    \"In this lecture we will learn about an extremely useful built-in function: enumerate(). Enumerate allows you to keep a count as you iterate through an object. It does this by returning a tuple in the form (count,element). The function itself is equivalent to:\\n\",\n    \"\\n\",\n    \"    def enumerate(sequence, start=0):\\n\",\n    \"        n = start\\n\",\n    \"        for elem in sequence:\\n\",\n    \"            yield n, elem\\n\",\n    \"            n += 1\\n\",\n    \"\\n\",\n    \"## Example\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"0\\n\",\n      \"a\\n\",\n      \"1\\n\",\n      \"b\\n\",\n      \"2\\n\",\n      \"c\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"lst = ['a','b','c']\\n\",\n    \"\\n\",\n    \"for number,item in enumerate(lst):\\n\",\n    \"    print(number)\\n\",\n    \"    print(item)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"enumerate() becomes particularly useful when you have a case where you need to have some sort of tracker. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"a\\n\",\n      \"b\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for count,item in enumerate(lst):\\n\",\n    \"    if count >= 2:\\n\",\n    \"        break\\n\",\n    \"    else:\\n\",\n    \"        print(item)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"enumerate() takes an optional \\\"start\\\" argument to override the default value of zero:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[(3, 'March'), (4, 'April'), (5, 'May'), (6, 'June')]\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"months = ['March','April','May','June']\\n\",\n    \"\\n\",\n    \"list(enumerate(months,start=3))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! You should now have a good understanding of enumerate and its potential use cases.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "09-Empty-Section-Skip/.ipynb_checkpoints/06-all() and any()-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# all() and any()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"all() and any() are built-in functions in Python that allow us to conveniently check for boolean matching in an iterable. all() will return True if all elements in an iterable are True. It is the same as this function code:\\n\",\n    \"\\n\",\n    \"    def all(iterable):\\n\",\n    \"        for element in iterable:\\n\",\n    \"            if not element:\\n\",\n    \"                return False\\n\",\n    \"        return True\\n\",\n    \"        \\n\",\n    \"any() will return True if any of the elements in the iterable are True. It is equivalent to the following function code:\\n\",\n    \"\\n\",\n    \"    def any(iterable):\\n\",\n    \"        for element in iterable:\\n\",\n    \"            if element:\\n\",\n    \"                return True\\n\",\n    \"        return False\\n\",\n    \"        \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's see a few examples of these functions. They should be fairly straightforward:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"lst = [True,True,False,True]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"all(lst)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Returns False because not all elements are True.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"any(lst)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Returns True because at least one of the elements in the list is True\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There you have it, you should have an understanding of how to use any() and all() in your code.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "09-Empty-Section-Skip/.ipynb_checkpoints/07-Complex-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# complex()\\n\",\n    \"\\n\",\n    \"complex() returns a complex number with the value real + imag*1j or converts a string or number to a complex number. \\n\",\n    \"\\n\",\n    \"If the first parameter is a string, it will be interpreted as a complex number and the function must be called without a second parameter. The second parameter can never be a string. Each argument may be any numeric type (including complex). If imag is omitted, it defaults to zero and the constructor serves as a numeric conversion like int and float. If both arguments are omitted, returns 0j.\\n\",\n    \"\\n\",\n    \"If you are doing math or engineering that requires complex numbers (such as dynamics, control systems, or impedance of a circuit) this is a useful tool to have in Python.\\n\",\n    \"\\n\",\n    \"Let's see some examples:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(2+3j)\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Create 2+3j\\n\",\n    \"complex(2,3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(10+1j)\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"complex(10,1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can also pass strings:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(12+2j)\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"complex('12+2j')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"That's really all there is to this useful function. Keep it in mind if you are ever dealing with complex numbers in Python!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "09-Empty-Section-Skip/.ipynb_checkpoints/08-Built-in Functions Assessment Test-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Built-in Functions Test \\n\",\n    \"\\n\",\n    \"### For this test, you should use built-in functions and be able to write the requested functions in one line.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 1\\n\",\n    \"\\n\",\n    \"Use map() to create a function which finds the length of each word in the phrase\\n\",\n    \"(broken by spaces) and returns the values in a list.\\n\",\n    \"\\n\",\n    \"The function will have an input of a string, and output a list of integers.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def word_lengths(phrase):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[3, 4, 3, 3, 5, 2, 4, 6]\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"word_lengths('How long are the words in this phrase')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 2 \\n\",\n    \"\\n\",\n    \"Use reduce() to take a list of digits and return the number that they\\n\",\n    \"correspond to. For example, \\\\[1, 2, 3] corresponds to one-hundred-twenty-three. <br>*Do not convert the integers to strings!* \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from functools import reduce\\n\",\n    \"\\n\",\n    \"def digits_to_num(digits):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"34321\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"digits_to_num([3,4,3,2,1])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 3\\n\",\n    \"\\n\",\n    \"Use filter to return the words from a list of words which start with a target letter.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def filter_words(word_list, letter):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['hello', 'ham', 'hi', 'heart']\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"l = ['hello','are','cat','dog','ham','hi','go','to','heart']\\n\",\n    \"filter_words(l,'h')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 4\\n\",\n    \"\\n\",\n    \"Use zip() and a list comprehension to return a list of the same length where each value is the two strings from\\n\",\n    \"L1 and L2 concatenated together with connector between them. Look at the example output below:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def concatenate(L1, L2, connector):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['A-a', 'B-b']\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"concatenate(['A','B'],['a','b'],'-')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 5\\n\",\n    \"\\n\",\n    \"Use enumerate() and other skills to return a dictionary which has the values of the list as keys and the index as the value. You may assume that a value will only appear once in the given list.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def d_list(L):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'a': 0, 'b': 1, 'c': 2}\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d_list(['a','b','c'])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 6\\n\",\n    \"\\n\",\n    \"Use enumerate() and other skills from above to return the count of the number of items in the list whose value equals its index.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def count_match_index(L):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"count_match_index([0,2,2,1,5,5,6,10])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "09-Empty-Section-Skip/.ipynb_checkpoints/09-Built-in Functions Assessment Test - Solution-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Built-in Functions Test Solutions\\n\",\n    \"\\n\",\n    \"### For this test, you should use built-in functions and be able to write the requested functions in one line.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 1\\n\",\n    \"\\n\",\n    \"Use map() to create a function which finds the length of each word in the phrase\\n\",\n    \"(broken by spaces) and return the values in a list.\\n\",\n    \"\\n\",\n    \"The function will have an input of a string, and output a list of integers.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def word_lengths(phrase):\\n\",\n    \"    \\n\",\n    \"    return list(map(len, phrase.split()))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[3, 4, 3, 3, 5, 2, 4, 6]\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"word_lengths('How long are the words in this phrase')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 2 \\n\",\n    \"\\n\",\n    \"Use reduce() to take a list of digits and return the number that they\\n\",\n    \"correspond to. For example, \\\\[1,2,3] corresponds to one-hundred-twenty-three. \\n\",\n    \"<br>*Do not convert the integers to strings!* \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from functools import reduce\\n\",\n    \"\\n\",\n    \"def digits_to_num(digits):\\n\",\n    \"    \\n\",\n    \"    return reduce(lambda x,y:x*10 + y,digits)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"34321\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"digits_to_num([3,4,3,2,1])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 3\\n\",\n    \"\\n\",\n    \"Use filter() to return the words from a list of words which start with a target letter.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def filter_words(word_list, letter):\\n\",\n    \"    \\n\",\n    \"    return list(filter(lambda word:word[0]==letter,word_list))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['hello', 'ham', 'hi', 'heart']\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"words = ['hello','are','cat','dog','ham','hi','go','to','heart']\\n\",\n    \"filter_words(words,'h')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 4\\n\",\n    \"\\n\",\n    \"Use zip() and a list comprehension to return a list of the same length where each value is the two strings from\\n\",\n    \"L1 and L2 concatenated together with a connector between them. Look at the example output below:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def concatenate(L1, L2, connector):\\n\",\n    \"    \\n\",\n    \"    return [word1+connector+word2 for (word1,word2) in zip(L1,L2)]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['A-a', 'B-b']\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"concatenate(['A','B'],['a','b'],'-')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 5\\n\",\n    \"\\n\",\n    \"Use enumerate() and other skills to return a dictionary which has the values of the list as keys and the index as the value. You may assume that a value will only appear once in the given list.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def d_list(L):\\n\",\n    \"    \\n\",\n    \"    return {key:value for value,key in enumerate(L)}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'a': 0, 'b': 1, 'c': 2}\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d_list(['a','b','c'])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 6\\n\",\n    \"\\n\",\n    \"Use enumerate() and other skills from above to return the count of the number of items in the list whose value equals its index.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def count_match_index(L):\\n\",\n    \"   \\n\",\n    \"    return len([num for count,num in enumerate(L) if num==count])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"count_match_index([0,2,2,1,5,5,6,10])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "09-Empty-Section-Skip/01-Map.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# map()\\n\",\n    \"\\n\",\n    \"map() is a built-in Python function that takes in two or more arguments: a function and one or more iterables, in the form:\\n\",\n    \"\\n\",\n    \"    map(function, iterable, ...)\\n\",\n    \"    \\n\",\n    \"map() returns an *iterator* - that is, map() returns a special object that yields one result at a time as needed. We will learn more about iterators and generators in a future lecture. For now, since our examples are so small, we will cast map() as a list to see the results immediately.\\n\",\n    \"\\n\",\n    \"When we went over list comprehensions we created a small expression to convert Celsius to Fahrenheit. Let's do the same here but use map:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def fahrenheit(celsius):\\n\",\n    \"    return (9/5)*celsius + 32\\n\",\n    \"    \\n\",\n    \"temps = [0, 22.5, 40, 100]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now let's see map() in action:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[32.0, 72.5, 104.0, 212.0]\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"F_temps = map(fahrenheit, temps)\\n\",\n    \"\\n\",\n    \"#Show\\n\",\n    \"list(F_temps)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In the example above, map() applies the fahrenheit function to every item in temps. However, we don't have to define our functions beforehand; we can use a lambda expression instead:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[32.0, 72.5, 104.0, 212.0]\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(map(lambda x: (9/5)*x + 32, temps))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! We got the same result! Using map with lambda expressions is much more common since the entire purpose of map() is to save effort on having to create manual for loops.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### map() with multiple iterables\\n\",\n    \"map() can accept more than one iterable. The iterables should be the same length - in the event that they are not, map() will stop as soon as the shortest iterable is exhausted.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"For instance, if our function is trying to add two values **x** and **y**, we can pass a list of **x** values and another list of **y** values to map(). The function (or lambda) will be fed the 0th index from each list, and then the 1st index, and so on until the n-th index is reached.\\n\",\n    \"\\n\",\n    \"Let's see this in action with two and then three lists:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[6, 8, 10, 12]\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"a = [1,2,3,4]\\n\",\n    \"b = [5,6,7,8]\\n\",\n    \"c = [9,10,11,12]\\n\",\n    \"\\n\",\n    \"list(map(lambda x,y:x+y,a,b))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[15, 18, 21, 24]\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Now all three lists\\n\",\n    \"list(map(lambda x,y,z:x+y+z,a,b,c))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can see in the example above that the parameter **x** gets its values from the list **a**, while **y** gets its values from **b** and **z** from list **c**. Go ahead and play with your own example to make sure you fully understand mapping to more than one iterable.\\n\",\n    \"\\n\",\n    \"Great job! You should now have a basic understanding of the map() function.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "09-Empty-Section-Skip/02-Reduce.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# reduce()\\n\",\n    \"\\n\",\n    \"Many times students have difficulty understanding reduce() so pay careful attention to this lecture. The function reduce(function, sequence) continually applies the function to the sequence. It then returns a single value. \\n\",\n    \"\\n\",\n    \"If seq = [ s1, s2, s3, ... , sn ], calling reduce(function, sequence) works like this:\\n\",\n    \"\\n\",\n    \"* At first the first two elements of seq will be applied to function, i.e. func(s1,s2) \\n\",\n    \"* The list on which reduce() works looks now like this: [ function(s1, s2), s3, ... , sn ]\\n\",\n    \"* In the next step the function will be applied on the previous result and the third element of the list, i.e. function(function(s1, s2),s3)\\n\",\n    \"* The list looks like this now: [ function(function(s1, s2),s3), ... , sn ]\\n\",\n    \"* It continues like this until just one element is left and return this element as the result of reduce()\\n\",\n    \"\\n\",\n    \"Let's see an example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"113\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"from functools import reduce\\n\",\n    \"\\n\",\n    \"lst =[47,11,42,13]\\n\",\n    \"reduce(lambda x,y: x+y,lst)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Lets look at a diagram to get a better understanding of what is going on here:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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Hlxxz549Y8aMmTZtWr5SiCI/bCSh/WnFihVr166tWrVqsP6iAKme0DHkv//977Zt25o1a3bbbbeZrpJnS+bm5g4bNuzee+8NahxjzIuy4e7du999990BAwZUrlw5Xxnw6pNOqDmys7MXLly4bNmyjz/+GApaia2+z7fffrtkyZJPPvlkkSJFTFe5FEt26NChe/fut956qzFjHjROcnJy27ZtFyxYEBcXl99u8urvXBPqT7Gxse3atWvfvn2TJk127typq3hDrZk/21i/ZmZmjh071rKs559/Xrf0hfbiN/hre9q23b9//xYtWhjGyRvS0tJ69eo1b968uLi40E6UTyDy1Q0FefrkyZMzZszweDwDBw4MJsDy87C8evXqxYsXJyYmPvDAA6afXIraTUtLGzVqVJMmTR566CFjwzyYMS0tbciQId26datVq1Y+NSDnPxARMyPi+vXrExMT//jjj7N+lX/uU9/PrFmz+vTpk5qaGryYr+6zQCBotAEDBqxbty70isHftx4zP/nkkzt27Ah2lnxow/yldM4d97xe7wsvvHD77bc/88wzbrf7qieYQ/9dbbpXXnklLi4uPOb7r25bI2KbNm06dOjQrFkzMMs4L9Ihmdnj8Tz77LMvvvhiw4YN83VBUz7nb/1m9uzZffv23bZtW+j1q0XhwVElKSmpQ4cOK1asyM+jSv5vX/2anp7+/PPP6yY2GicPZvR4PAMGDNi8eXP+98P8qHTOpXAhxK5duz7++OOKFSt27979arF46LA8Y8aM3377rV+/fpUqVTJlspdoUiLq1q3b888/H8wcG8tcbBq0R48ejz76aIFIhOXfcxeChtP9vHr16qNGjXK73Y8//niQjEInj64Y4wBA165dc3JyJkyYUKlSpbPu1uDvd5WgSRs3bty/f/9bb73VWDIPBhRCJCYmtmzZUjNO/r95kf/v8izJs3HjxvHjx3fr1q1x48YOh+MK8HqowNmzZ8+nn35aq1atli1bmjH50q2ampr6+uuv9+zZs2bNmsaeeUiMCCGGDRvWqFGjxMTEgmJAwQXk4IXQxQTp6emLFy9es2bNtGnT/tHc7Vl8N2vWrN9///2pp56qXbu2SRtfOrKzs/v169e9e/d69eoZS+ZtFOzbt+/tt9/+5JNPFiCHLDCkc24Qe/Dgwfvvv3/ZsmV6AXcoO/wTZPf+++8f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\\n\",\n      \"text/plain\": [\n       \"<IPython.core.display.Image object>\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"from IPython.display import Image\\n\",\n    \"Image('http://www.python-course.eu/images/reduce_diagram.png')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how we keep reducing the sequence until a single final value is obtained. Lets see another example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#Find the maximum of a sequence (This already exists as max())\\n\",\n    \"max_find = lambda a,b: a if (a > b) else b\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"47\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#Find max\\n\",\n    \"reduce(max_find,lst)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Hopefully you can see how useful reduce can be in various situations. Keep it in mind as you think about your code projects!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "09-Empty-Section-Skip/03-Filter.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# filter\\n\",\n    \"\\n\",\n    \"The function filter(function, list) offers a convenient way to filter out all the elements of an iterable, for which the function returns True. \\n\",\n    \"\\n\",\n    \"The function filter(function,list) needs a function as its first argument. The function needs to return a Boolean value (either True or False). This function will be applied to every element of the iterable. Only if the function returns True will the element of the iterable be included in the result.\\n\",\n    \"\\n\",\n    \"Like map(), filter() returns an *iterator* - that is, filter yields one result at a time as needed. Iterators and generators will be covered in an upcoming lecture. For now, since our examples are so small, we will cast filter() as a list to see our results immediately.\\n\",\n    \"\\n\",\n    \"Let's see some examples:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#First let's make a function\\n\",\n    \"def even_check(num):\\n\",\n    \"    if num%2 ==0:\\n\",\n    \"        return True\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now let's filter a list of numbers. Note: putting the function into filter without any parentheses might feel strange, but keep in mind that functions are objects as well.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lst =range(20)\\n\",\n    \"\\n\",\n    \"list(filter(even_check,lst))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"filter() is more commonly used with lambda functions, because we usually use filter for a quick job where we don't want to write an entire function. Let's repeat the example above using a lambda expression:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(filter(lambda x: x%2==0,lst))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! You should now have a solid understanding of filter() and how to apply it to your code!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "09-Empty-Section-Skip/04-Zip.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# zip\\n\",\n    \"\\n\",\n    \"zip() makes an iterator that aggregates elements from each of the iterables.\\n\",\n    \"\\n\",\n    \"Returns an iterator of tuples, where the i-th tuple contains the i-th element from each of the argument sequences or iterables. The iterator stops when the shortest input iterable is exhausted. With a single iterable argument, it returns an iterator of 1-tuples. With no arguments, it returns an empty iterator. \\n\",\n    \"\\n\",\n    \"zip() is equivalent to:\\n\",\n    \"\\n\",\n    \"    def zip(*iterables):\\n\",\n    \"        # zip('ABCD', 'xy') --> Ax By\\n\",\n    \"        sentinel = object()\\n\",\n    \"        iterators = [iter(it) for it in iterables]\\n\",\n    \"        while iterators:\\n\",\n    \"            result = []\\n\",\n    \"            for it in iterators:\\n\",\n    \"                elem = next(it, sentinel)\\n\",\n    \"                if elem is sentinel:\\n\",\n    \"                    return\\n\",\n    \"                result.append(elem)\\n\",\n    \"            yield tuple(result)\\n\",\n    \"        \\n\",\n    \"\\n\",\n    \"zip() should only be used with unequal length inputs when you don’t care about trailing, unmatched values from the longer iterables. \\n\",\n    \"\\n\",\n    \"Let's see it in action in some examples:\\n\",\n    \"\\n\",\n    \"## Examples\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[(1, 4), (2, 5), (3, 6)]\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"x = [1,2,3]\\n\",\n    \"y = [4,5,6]\\n\",\n    \"\\n\",\n    \"# Zip the lists together\\n\",\n    \"list(zip(x,y))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how tuples are returned. What if one iterable is longer than the other?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[(1, 4), (2, 5), (3, 6)]\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"x = [1,2,3]\\n\",\n    \"y = [4,5,6,7,8]\\n\",\n    \"\\n\",\n    \"# Zip the lists together\\n\",\n    \"list(zip(x,y))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how the zip is defined by the shortest iterable length. Its generally advised not to zip unequal length iterables unless your very sure you only need partial tuple pairings.\\n\",\n    \"\\n\",\n    \"What happens if we try to zip together dictionaries?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[('a', 'c'), ('b', 'd')]\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d1 = {'a':1,'b':2}\\n\",\n    \"d2 = {'c':4,'d':5}\\n\",\n    \"\\n\",\n    \"list(zip(d1,d2))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This makes sense because simply iterating through the dictionaries will result in just the keys. We would have to call methods to mix keys and values:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[('c', 1), ('d', 2)]\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(zip(d2,d1.values()))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Finally lets use zip() to switch the keys and values of the two dictionaries:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def switcharoo(d1,d2):\\n\",\n    \"    dout = {}\\n\",\n    \"    \\n\",\n    \"    for d1key,d2val in zip(d1,d2.values()):\\n\",\n    \"        dout[d1key] = d2val\\n\",\n    \"    \\n\",\n    \"    return dout\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'a': 4, 'b': 5}\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"switcharoo(d1,d2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! You can use zip to save a lot of typing in many situations! You should now have a good understanding of zip() and some possible use cases.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "09-Empty-Section-Skip/05-Enumerate.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# enumerate()\\n\",\n    \"\\n\",\n    \"In this lecture we will learn about an extremely useful built-in function: enumerate(). Enumerate allows you to keep a count as you iterate through an object. It does this by returning a tuple in the form (count,element). The function itself is equivalent to:\\n\",\n    \"\\n\",\n    \"    def enumerate(sequence, start=0):\\n\",\n    \"        n = start\\n\",\n    \"        for elem in sequence:\\n\",\n    \"            yield n, elem\\n\",\n    \"            n += 1\\n\",\n    \"\\n\",\n    \"## Example\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"0\\n\",\n      \"a\\n\",\n      \"1\\n\",\n      \"b\\n\",\n      \"2\\n\",\n      \"c\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"lst = ['a','b','c']\\n\",\n    \"\\n\",\n    \"for number,item in enumerate(lst):\\n\",\n    \"    print(number)\\n\",\n    \"    print(item)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"enumerate() becomes particularly useful when you have a case where you need to have some sort of tracker. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"a\\n\",\n      \"b\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for count,item in enumerate(lst):\\n\",\n    \"    if count >= 2:\\n\",\n    \"        break\\n\",\n    \"    else:\\n\",\n    \"        print(item)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"enumerate() takes an optional \\\"start\\\" argument to override the default value of zero:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[(3, 'March'), (4, 'April'), (5, 'May'), (6, 'June')]\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"months = ['March','April','May','June']\\n\",\n    \"\\n\",\n    \"list(enumerate(months,start=3))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! You should now have a good understanding of enumerate and its potential use cases.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "09-Empty-Section-Skip/06-all() and any().ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# all() and any()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"all() and any() are built-in functions in Python that allow us to conveniently check for boolean matching in an iterable. all() will return True if all elements in an iterable are True. It is the same as this function code:\\n\",\n    \"\\n\",\n    \"    def all(iterable):\\n\",\n    \"        for element in iterable:\\n\",\n    \"            if not element:\\n\",\n    \"                return False\\n\",\n    \"        return True\\n\",\n    \"        \\n\",\n    \"any() will return True if any of the elements in the iterable are True. It is equivalent to the following function code:\\n\",\n    \"\\n\",\n    \"    def any(iterable):\\n\",\n    \"        for element in iterable:\\n\",\n    \"            if element:\\n\",\n    \"                return True\\n\",\n    \"        return False\\n\",\n    \"        \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's see a few examples of these functions. They should be fairly straightforward:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"lst = [True,True,False,True]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"all(lst)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Returns False because not all elements are True.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"any(lst)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Returns True because at least one of the elements in the list is True\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There you have it, you should have an understanding of how to use any() and all() in your code.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "09-Empty-Section-Skip/07-Complex.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# complex()\\n\",\n    \"\\n\",\n    \"complex() returns a complex number with the value real + imag*1j or converts a string or number to a complex number. \\n\",\n    \"\\n\",\n    \"If the first parameter is a string, it will be interpreted as a complex number and the function must be called without a second parameter. The second parameter can never be a string. Each argument may be any numeric type (including complex). If imag is omitted, it defaults to zero and the constructor serves as a numeric conversion like int and float. If both arguments are omitted, returns 0j.\\n\",\n    \"\\n\",\n    \"If you are doing math or engineering that requires complex numbers (such as dynamics, control systems, or impedance of a circuit) this is a useful tool to have in Python.\\n\",\n    \"\\n\",\n    \"Let's see some examples:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(2+3j)\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Create 2+3j\\n\",\n    \"complex(2,3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(10+1j)\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"complex(10,1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can also pass strings:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(12+2j)\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"complex('12+2j')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"That's really all there is to this useful function. Keep it in mind if you are ever dealing with complex numbers in Python!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "09-Empty-Section-Skip/08-Built-in Functions Assessment Test.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Built-in Functions Test \\n\",\n    \"\\n\",\n    \"### For this test, you should use built-in functions and be able to write the requested functions in one line.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 1\\n\",\n    \"\\n\",\n    \"Use map() to create a function which finds the length of each word in the phrase\\n\",\n    \"(broken by spaces) and returns the values in a list.\\n\",\n    \"\\n\",\n    \"The function will have an input of a string, and output a list of integers.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def word_lengths(phrase):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[3, 4, 3, 3, 5, 2, 4, 6]\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"word_lengths('How long are the words in this phrase')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 2 \\n\",\n    \"\\n\",\n    \"Use reduce() to take a list of digits and return the number that they\\n\",\n    \"correspond to. For example, \\\\[1, 2, 3] corresponds to one-hundred-twenty-three. <br>*Do not convert the integers to strings!* \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from functools import reduce\\n\",\n    \"\\n\",\n    \"def digits_to_num(digits):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"34321\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"digits_to_num([3,4,3,2,1])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 3\\n\",\n    \"\\n\",\n    \"Use filter to return the words from a list of words which start with a target letter.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def filter_words(word_list, letter):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['hello', 'ham', 'hi', 'heart']\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"l = ['hello','are','cat','dog','ham','hi','go','to','heart']\\n\",\n    \"filter_words(l,'h')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 4\\n\",\n    \"\\n\",\n    \"Use zip() and a list comprehension to return a list of the same length where each value is the two strings from\\n\",\n    \"L1 and L2 concatenated together with connector between them. Look at the example output below:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def concatenate(L1, L2, connector):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['A-a', 'B-b']\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"concatenate(['A','B'],['a','b'],'-')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 5\\n\",\n    \"\\n\",\n    \"Use enumerate() and other skills to return a dictionary which has the values of the list as keys and the index as the value. You may assume that a value will only appear once in the given list.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def d_list(L):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'a': 0, 'b': 1, 'c': 2}\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d_list(['a','b','c'])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 6\\n\",\n    \"\\n\",\n    \"Use enumerate() and other skills from above to return the count of the number of items in the list whose value equals its index.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def count_match_index(L):\\n\",\n    \"    \\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"count_match_index([0,2,2,1,5,5,6,10])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "09-Empty-Section-Skip/09-Built-in Functions Assessment Test - Solution.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Built-in Functions Test Solutions\\n\",\n    \"\\n\",\n    \"### For this test, you should use built-in functions and be able to write the requested functions in one line.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 1\\n\",\n    \"\\n\",\n    \"Use map() to create a function which finds the length of each word in the phrase\\n\",\n    \"(broken by spaces) and return the values in a list.\\n\",\n    \"\\n\",\n    \"The function will have an input of a string, and output a list of integers.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def word_lengths(phrase):\\n\",\n    \"    \\n\",\n    \"    return list(map(len, phrase.split()))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[3, 4, 3, 3, 5, 2, 4, 6]\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"word_lengths('How long are the words in this phrase')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 2 \\n\",\n    \"\\n\",\n    \"Use reduce() to take a list of digits and return the number that they\\n\",\n    \"correspond to. For example, \\\\[1,2,3] corresponds to one-hundred-twenty-three. \\n\",\n    \"<br>*Do not convert the integers to strings!* \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from functools import reduce\\n\",\n    \"\\n\",\n    \"def digits_to_num(digits):\\n\",\n    \"    \\n\",\n    \"    return reduce(lambda x,y:x*10 + y,digits)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"34321\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"digits_to_num([3,4,3,2,1])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 3\\n\",\n    \"\\n\",\n    \"Use filter() to return the words from a list of words which start with a target letter.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def filter_words(word_list, letter):\\n\",\n    \"    \\n\",\n    \"    return list(filter(lambda word:word[0]==letter,word_list))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['hello', 'ham', 'hi', 'heart']\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"words = ['hello','are','cat','dog','ham','hi','go','to','heart']\\n\",\n    \"filter_words(words,'h')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 4\\n\",\n    \"\\n\",\n    \"Use zip() and a list comprehension to return a list of the same length where each value is the two strings from\\n\",\n    \"L1 and L2 concatenated together with a connector between them. Look at the example output below:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def concatenate(L1, L2, connector):\\n\",\n    \"    \\n\",\n    \"    return [word1+connector+word2 for (word1,word2) in zip(L1,L2)]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['A-a', 'B-b']\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"concatenate(['A','B'],['a','b'],'-')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 5\\n\",\n    \"\\n\",\n    \"Use enumerate() and other skills to return a dictionary which has the values of the list as keys and the index as the value. You may assume that a value will only appear once in the given list.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def d_list(L):\\n\",\n    \"    \\n\",\n    \"    return {key:value for value,key in enumerate(L)}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'a': 0, 'b': 1, 'c': 2}\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d_list(['a','b','c'])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 6\\n\",\n    \"\\n\",\n    \"Use enumerate() and other skills from above to return the count of the number of items in the list whose value equals its index.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def count_match_index(L):\\n\",\n    \"   \\n\",\n    \"    return len([num for count,num in enumerate(L) if num==count])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"count_match_index([0,2,2,1,5,5,6,10])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "10-Python Decorators/.ipynb_checkpoints/01-Decorators-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Decorators\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Decorators can be thought of as functions which modify the *functionality* of another function. They help to make your code shorter and more \\\"Pythonic\\\". \\n\",\n    \"\\n\",\n    \"To properly explain decorators we will slowly build up from functions. Make sure to run every cell in this Notebook for this lecture to look the same on your own computer.<br><br>So let's break down the steps:\\n\",\n    \"\\n\",\n    \"## Functions Review\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def func():\\n\",\n    \"    return 1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"func()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Scope Review\\n\",\n    \"Remember from the nested statements lecture that Python uses Scope to know what a label is referring to. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"s = 'Global Variable'\\n\",\n    \"\\n\",\n    \"def check_for_locals():\\n\",\n    \"    print(locals())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Remember that Python functions create a new scope, meaning the function has its own namespace to find variable names when they are mentioned within the function. We can check for local variables and global variables with the <code>locals()</code> and <code>globals()</code> functions. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"print(globals())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"Here we get back a dictionary of all the global variables, many of them are predefined in Python. So let's go ahead and look at the keys:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"print(globals().keys())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how **s** is there, the Global Variable we defined as a string:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"globals()['s']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now let's run our function to check for local variables that might exist inside our function (there shouldn't be any)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"check_for_locals()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now lets continue with building out the logic of what a decorator is. Remember that in Python **everything is an object**. That means functions are objects which can be assigned labels and passed into other functions. Lets start with some simple examples:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def hello(name='Jose'):\\n\",\n    \"    return 'Hello '+name\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello Jose'\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"hello()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Assign another label to the function. Note that we are not using parentheses here because we are not calling the function **hello**, instead we are just passing a function object to the **greet** variable.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"greet = hello\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<function __main__.hello>\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"greet\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello Jose'\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"greet()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"So what happens when we delete the name **hello**?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"del hello\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"NameError\",\n     \"evalue\": \"name 'hello' is not defined\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mNameError\\u001b[0m                                 Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-9-a75d7781aaeb>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mhello\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mNameError\\u001b[0m: name 'hello' is not defined\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"hello()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello Jose'\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"greet()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Even though we deleted the name **hello**, the name **greet** *still points to* our original function object. It is important to know that functions are objects that can be passed to other objects!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Functions within functions\\n\",\n    \"Great! So we've seen how we can treat functions as objects, now let's see how we can define functions inside of other functions:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def hello(name='Jose'):\\n\",\n    \"    print('The hello() function has been executed')\\n\",\n    \"    \\n\",\n    \"    def greet():\\n\",\n    \"        return '\\\\t This is inside the greet() function'\\n\",\n    \"    \\n\",\n    \"    def welcome():\\n\",\n    \"        return \\\"\\\\t This is inside the welcome() function\\\"\\n\",\n    \"    \\n\",\n    \"    print(greet())\\n\",\n    \"    print(welcome())\\n\",\n    \"    print(\\\"Now we are back inside the hello() function\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"The hello() function has been executed\\n\",\n      \"\\t This is inside the greet() function\\n\",\n      \"\\t This is inside the welcome() function\\n\",\n      \"Now we are back inside the hello() function\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"hello()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"NameError\",\n     \"evalue\": \"name 'welcome' is not defined\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mNameError\\u001b[0m                                 Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-13-a401d7101853>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mwelcome\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mNameError\\u001b[0m: name 'welcome' is not defined\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"welcome()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how due to scope, the welcome() function is not defined outside of the hello() function. Now lets learn about returning functions from within functions:\\n\",\n    \"## Returning Functions\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def hello(name='Jose'):\\n\",\n    \"    \\n\",\n    \"    def greet():\\n\",\n    \"        return '\\\\t This is inside the greet() function'\\n\",\n    \"    \\n\",\n    \"    def welcome():\\n\",\n    \"        return \\\"\\\\t This is inside the welcome() function\\\"\\n\",\n    \"    \\n\",\n    \"    if name == 'Jose':\\n\",\n    \"        return greet\\n\",\n    \"    else:\\n\",\n    \"        return welcome\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now let's see what function is returned if we set x = hello(), note how the empty parentheses means that name has been defined as Jose.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"x = hello()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<function __main__.hello.<locals>.greet>\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"x\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now we can see how x is pointing to the greet function inside of the hello function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\t This is inside the greet() function\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(x())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's take a quick look at the code again. \\n\",\n    \"\\n\",\n    \"In the <code>if</code>/<code>else</code> clause we are returning <code>greet</code> and <code>welcome</code>, not <code>greet()</code> and <code>welcome()</code>. \\n\",\n    \"\\n\",\n    \"This is because when you put a pair of parentheses after it, the function gets executed; whereas if you don’t put parentheses after it, then it can be passed around and can be assigned to other variables without executing it.\\n\",\n    \"\\n\",\n    \"When we write <code>x = hello()</code>, hello() gets executed and because the name is Jose by default, the function <code>greet</code> is returned. If we change the statement to <code>x = hello(name = \\\"Sam\\\")</code> then the <code>welcome</code> function will be returned. We can also do <code>print(hello()())</code> which outputs *This is inside the greet() function*.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Functions as Arguments\\n\",\n    \"Now let's see how we can pass functions as arguments into other functions:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def hello():\\n\",\n    \"    return 'Hi Jose!'\\n\",\n    \"\\n\",\n    \"def other(func):\\n\",\n    \"    print('Other code would go here')\\n\",\n    \"    print(func())\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Other code would go here\\n\",\n      \"Hi Jose!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"other(hello)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Note how we can pass the functions as objects and then use them within other functions. Now we can get started with writing our first decorator:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Creating a Decorator\\n\",\n    \"In the previous example we actually manually created a Decorator. Here we will modify it to make its use case clear:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def new_decorator(func):\\n\",\n    \"\\n\",\n    \"    def wrap_func():\\n\",\n    \"        print(\\\"Code would be here, before executing the func\\\")\\n\",\n    \"\\n\",\n    \"        func()\\n\",\n    \"\\n\",\n    \"        print(\\\"Code here will execute after the func()\\\")\\n\",\n    \"\\n\",\n    \"    return wrap_func\\n\",\n    \"\\n\",\n    \"def func_needs_decorator():\\n\",\n    \"    print(\\\"This function is in need of a Decorator\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"This function is in need of a Decorator\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"func_needs_decorator()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Reassign func_needs_decorator\\n\",\n    \"func_needs_decorator = new_decorator(func_needs_decorator)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Code would be here, before executing the func\\n\",\n      \"This function is in need of a Decorator\\n\",\n      \"Code here will execute after the func()\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"func_needs_decorator()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"So what just happened here? A decorator simply wrapped the function and modified its behavior. Now let's understand how we can rewrite this code using the @ symbol, which is what Python uses for Decorators:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"@new_decorator\\n\",\n    \"def func_needs_decorator():\\n\",\n    \"    print(\\\"This function is in need of a Decorator\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Code would be here, before executing the func\\n\",\n      \"This function is in need of a Decorator\\n\",\n      \"Code here will execute after the func()\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"func_needs_decorator()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Great! You've now built a Decorator manually and then saw how we can use the @ symbol in Python to automate this and clean our code. You'll run into Decorators a lot if you begin using Python for Web Development, such as Flask or Django!**\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "10-Python Decorators/.ipynb_checkpoints/02-Decorators Homework-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Decorators Homework (Optional)\\n\",\n    \"\\n\",\n    \"Since you won't run into decorators until further in your coding career, this homework is optional. Check out the Web Framework [Flask](http://flask.pocoo.org/). You can use Flask to create web pages with Python (as long as you know some HTML and CSS) and they use decorators a lot! Learn how they use [view decorators](http://flask.pocoo.org/docs/0.12/patterns/viewdecorators/). Don't worry if you don't completely understand everything about Flask, the main point of this optional homework is that you have an awareness of decorators in Web Frameworks. That way if you decide to become a \\\"Full-Stack\\\" Python Web Developer, you won't find yourself perplexed by decorators. You can also check out [Django](https://www.djangoproject.com/) another (and more popular) web framework for Python which is a bit more heavy duty.\\n\",\n    \"\\n\",\n    \"Also for some additional info:\\n\",\n    \"\\n\",\n    \"A framework is a type of software library that provides generic functionality which can be extended by the programmer to build applications. Flask and Django are good examples of frameworks intended for web development.\\n\",\n    \"\\n\",\n    \"A framework is distinguished from a simple library or API. An API is a piece of software that a developer can use in his or her application. A framework is more encompassing: your entire application is structured around the framework (i.e. it provides the framework around which you build your software).\\n\",\n    \"\\n\",\n    \"## Great job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "10-Python Decorators/01-Decorators.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Decorators\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Decorators can be thought of as functions which modify the *functionality* of another function. They help to make your code shorter and more \\\"Pythonic\\\". \\n\",\n    \"\\n\",\n    \"To properly explain decorators we will slowly build up from functions. Make sure to run every cell in this Notebook for this lecture to look the same on your own computer.<br><br>So let's break down the steps:\\n\",\n    \"\\n\",\n    \"## Functions Review\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def func():\\n\",\n    \"    return 1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"func()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Scope Review\\n\",\n    \"Remember from the nested statements lecture that Python uses Scope to know what a label is referring to. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"s = 'Global Variable'\\n\",\n    \"\\n\",\n    \"def check_for_locals():\\n\",\n    \"    print(locals())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Remember that Python functions create a new scope, meaning the function has its own namespace to find variable names when they are mentioned within the function. We can check for local variables and global variables with the <code>locals()</code> and <code>globals()</code> functions. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"print(globals())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"Here we get back a dictionary of all the global variables, many of them are predefined in Python. So let's go ahead and look at the keys:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"print(globals().keys())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how **s** is there, the Global Variable we defined as a string:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"globals()['s']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now let's run our function to check for local variables that might exist inside our function (there shouldn't be any)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"check_for_locals()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now lets continue with building out the logic of what a decorator is. Remember that in Python **everything is an object**. That means functions are objects which can be assigned labels and passed into other functions. Lets start with some simple examples:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def hello(name='Jose'):\\n\",\n    \"    return 'Hello '+name\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello Jose'\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"hello()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Assign another label to the function. Note that we are not using parentheses here because we are not calling the function **hello**, instead we are just passing a function object to the **greet** variable.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"greet = hello\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<function __main__.hello>\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"greet\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello Jose'\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"greet()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"So what happens when we delete the name **hello**?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"del hello\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"NameError\",\n     \"evalue\": \"name 'hello' is not defined\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mNameError\\u001b[0m                                 Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-9-a75d7781aaeb>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mhello\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mNameError\\u001b[0m: name 'hello' is not defined\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"hello()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello Jose'\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"greet()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Even though we deleted the name **hello**, the name **greet** *still points to* our original function object. It is important to know that functions are objects that can be passed to other objects!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Functions within functions\\n\",\n    \"Great! So we've seen how we can treat functions as objects, now let's see how we can define functions inside of other functions:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def hello(name='Jose'):\\n\",\n    \"    print('The hello() function has been executed')\\n\",\n    \"    \\n\",\n    \"    def greet():\\n\",\n    \"        return '\\\\t This is inside the greet() function'\\n\",\n    \"    \\n\",\n    \"    def welcome():\\n\",\n    \"        return \\\"\\\\t This is inside the welcome() function\\\"\\n\",\n    \"    \\n\",\n    \"    print(greet())\\n\",\n    \"    print(welcome())\\n\",\n    \"    print(\\\"Now we are back inside the hello() function\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"The hello() function has been executed\\n\",\n      \"\\t This is inside the greet() function\\n\",\n      \"\\t This is inside the welcome() function\\n\",\n      \"Now we are back inside the hello() function\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"hello()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"NameError\",\n     \"evalue\": \"name 'welcome' is not defined\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mNameError\\u001b[0m                                 Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-13-a401d7101853>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mwelcome\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mNameError\\u001b[0m: name 'welcome' is not defined\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"welcome()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how due to scope, the welcome() function is not defined outside of the hello() function. Now lets learn about returning functions from within functions:\\n\",\n    \"## Returning Functions\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def hello(name='Jose'):\\n\",\n    \"    \\n\",\n    \"    def greet():\\n\",\n    \"        return '\\\\t This is inside the greet() function'\\n\",\n    \"    \\n\",\n    \"    def welcome():\\n\",\n    \"        return \\\"\\\\t This is inside the welcome() function\\\"\\n\",\n    \"    \\n\",\n    \"    if name == 'Jose':\\n\",\n    \"        return greet\\n\",\n    \"    else:\\n\",\n    \"        return welcome\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now let's see what function is returned if we set x = hello(), note how the empty parentheses means that name has been defined as Jose.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"x = hello()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<function __main__.hello.<locals>.greet>\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"x\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now we can see how x is pointing to the greet function inside of the hello function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\t This is inside the greet() function\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(x())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's take a quick look at the code again. \\n\",\n    \"\\n\",\n    \"In the <code>if</code>/<code>else</code> clause we are returning <code>greet</code> and <code>welcome</code>, not <code>greet()</code> and <code>welcome()</code>. \\n\",\n    \"\\n\",\n    \"This is because when you put a pair of parentheses after it, the function gets executed; whereas if you don’t put parentheses after it, then it can be passed around and can be assigned to other variables without executing it.\\n\",\n    \"\\n\",\n    \"When we write <code>x = hello()</code>, hello() gets executed and because the name is Jose by default, the function <code>greet</code> is returned. If we change the statement to <code>x = hello(name = \\\"Sam\\\")</code> then the <code>welcome</code> function will be returned. We can also do <code>print(hello()())</code> which outputs *This is inside the greet() function*.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Functions as Arguments\\n\",\n    \"Now let's see how we can pass functions as arguments into other functions:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def hello():\\n\",\n    \"    return 'Hi Jose!'\\n\",\n    \"\\n\",\n    \"def other(func):\\n\",\n    \"    print('Other code would go here')\\n\",\n    \"    print(func())\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Other code would go here\\n\",\n      \"Hi Jose!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"other(hello)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Note how we can pass the functions as objects and then use them within other functions. Now we can get started with writing our first decorator:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Creating a Decorator\\n\",\n    \"In the previous example we actually manually created a Decorator. Here we will modify it to make its use case clear:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def new_decorator(func):\\n\",\n    \"\\n\",\n    \"    def wrap_func():\\n\",\n    \"        print(\\\"Code would be here, before executing the func\\\")\\n\",\n    \"\\n\",\n    \"        func()\\n\",\n    \"\\n\",\n    \"        print(\\\"Code here will execute after the func()\\\")\\n\",\n    \"\\n\",\n    \"    return wrap_func\\n\",\n    \"\\n\",\n    \"def func_needs_decorator():\\n\",\n    \"    print(\\\"This function is in need of a Decorator\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"This function is in need of a Decorator\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"func_needs_decorator()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Reassign func_needs_decorator\\n\",\n    \"func_needs_decorator = new_decorator(func_needs_decorator)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Code would be here, before executing the func\\n\",\n      \"This function is in need of a Decorator\\n\",\n      \"Code here will execute after the func()\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"func_needs_decorator()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"So what just happened here? A decorator simply wrapped the function and modified its behavior. Now let's understand how we can rewrite this code using the @ symbol, which is what Python uses for Decorators:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"@new_decorator\\n\",\n    \"def func_needs_decorator():\\n\",\n    \"    print(\\\"This function is in need of a Decorator\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Code would be here, before executing the func\\n\",\n      \"This function is in need of a Decorator\\n\",\n      \"Code here will execute after the func()\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"func_needs_decorator()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Great! You've now built a Decorator manually and then saw how we can use the @ symbol in Python to automate this and clean our code. You'll run into Decorators a lot if you begin using Python for Web Development, such as Flask or Django!**\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "10-Python Decorators/02-Decorators Homework.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Decorators Homework (Optional)\\n\",\n    \"\\n\",\n    \"Since you won't run into decorators until further in your coding career, this homework is optional. Check out the Web Framework [Flask](http://flask.pocoo.org/). You can use Flask to create web pages with Python (as long as you know some HTML and CSS) and they use decorators a lot! Learn how they use [view decorators](https://flask.palletsprojects.com/en/stable/patterns/viewdecorators/). Don't worry if you don't completely understand everything about Flask, the main point of this optional homework is that you have an awareness of decorators in Web Frameworks. That way if you decide to become a \\\"Full-Stack\\\" Python Web Developer, you won't find yourself perplexed by decorators. You can also check out [Django](https://www.djangoproject.com/) another (and more popular) web framework for Python which is a bit more heavy duty.\\n\",\n    \"\\n\",\n    \"Also for some additional info:\\n\",\n    \"\\n\",\n    \"A framework is a type of software library that provides generic functionality which can be extended by the programmer to build applications. Flask and Django are good examples of frameworks intended for web development.\\n\",\n    \"\\n\",\n    \"A framework is distinguished from a simple library or API. An API is a piece of software that a developer can use in his or her application. A framework is more encompassing: your entire application is structured around the framework (i.e. it provides the framework around which you build your software).\\n\",\n    \"\\n\",\n    \"## Great job!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "11-Python Generators/.ipynb_checkpoints/01-Iterators and Generators-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Iterators and Generators\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In this section of the course we will be learning the difference between iteration and generation in Python and how to construct our own Generators with the *yield* statement. Generators allow us to generate as we go along, instead of holding everything in memory. \\n\",\n    \"\\n\",\n    \"We've touched on this topic in the past when discussing certain built-in Python functions like **range()**, **map()** and **filter()**.\\n\",\n    \"\\n\",\n    \"Let's explore a little deeper. We've learned how to create functions with <code>def</code> and the <code>return</code> statement. Generator functions allow us to write a function that can send back a value and then later resume to pick up where it left off. This type of function is a generator in Python, allowing us to generate a sequence of values over time. The main difference in syntax will be the use of a <code>yield</code> statement.\\n\",\n    \"\\n\",\n    \"In most aspects, a generator function will appear very similar to a normal function. The main difference is when a generator function is compiled they become an object that supports an iteration protocol. That means when they are called in your code they don't actually return a value and then exit. Instead, generator functions will automatically suspend and resume their execution and state around the last point of value generation. The main advantage here is that instead of having to compute an entire series of values up front, the generator computes one value and then suspends its activity awaiting the next instruction. This feature is known as *state suspension*.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"￼￼To start getting a better understanding of generators, let's go ahead and see how we can create some.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Generator function for the cube of numbers (power of 3)\\n\",\n    \"def gencubes(n):\\n\",\n    \"    for num in range(n):\\n\",\n    \"        yield num**3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"0\\n\",\n      \"1\\n\",\n      \"8\\n\",\n      \"27\\n\",\n      \"64\\n\",\n      \"125\\n\",\n      \"216\\n\",\n      \"343\\n\",\n      \"512\\n\",\n      \"729\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for x in gencubes(10):\\n\",\n    \"    print(x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now since we have a generator function we don't have to keep track of every single cube we created.\\n\",\n    \"\\n\",\n    \"Generators are best for calculating large sets of results (particularly in calculations that involve loops themselves) in cases where we don’t want to allocate the memory for all of the results at the same time. \\n\",\n    \"\\n\",\n    \"Let's create another example generator which calculates [fibonacci](https://en.wikipedia.org/wiki/Fibonacci_number) numbers:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def genfibon(n):\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    Generate a fibonnaci sequence up to n\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    a = 1\\n\",\n    \"    b = 1\\n\",\n    \"    for i in range(n):\\n\",\n    \"        yield a\\n\",\n    \"        a,b = b,a+b\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"1\\n\",\n      \"1\\n\",\n      \"2\\n\",\n      \"3\\n\",\n      \"5\\n\",\n      \"8\\n\",\n      \"13\\n\",\n      \"21\\n\",\n      \"34\\n\",\n      \"55\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for num in genfibon(10):\\n\",\n    \"    print(num)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What if this was a normal function, what would it look like?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def fibon(n):\\n\",\n    \"    a = 1\\n\",\n    \"    b = 1\\n\",\n    \"    output = []\\n\",\n    \"    \\n\",\n    \"    for i in range(n):\\n\",\n    \"        output.append(a)\\n\",\n    \"        a,b = b,a+b\\n\",\n    \"        \\n\",\n    \"    return output\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"fibon(10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice that if we call some huge value of n (like 100000) the second function will have to keep track of every single result, when in our case we actually only care about the previous result to generate the next one!\\n\",\n    \"\\n\",\n    \"## next() and iter() built-in functions\\n\",\n    \"A key to fully understanding generators is the next() function and the iter() function.\\n\",\n    \"\\n\",\n    \"The next() function allows us to access the next element in a sequence. Lets check it out:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def simple_gen():\\n\",\n    \"    for x in range(3):\\n\",\n    \"        yield x\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Assign simple_gen \\n\",\n    \"g = simple_gen()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"0\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(next(g))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"1\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(next(g))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"2\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(next(g))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"StopIteration\",\n     \"evalue\": \"\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mStopIteration\\u001b[0m                             Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-12-1dfb29d6357e>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mprint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mnext\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mg\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mStopIteration\\u001b[0m: \"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(next(g))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"After yielding all the values next() caused a StopIteration error. What this error informs us of is that all the values have been yielded. \\n\",\n    \"\\n\",\n    \"You might be wondering that why don’t we get this error while using a for loop? A for loop automatically catches this error and stops calling next(). \\n\",\n    \"\\n\",\n    \"Let's go ahead and check out how to use iter(). You remember that strings are iterables:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"h\\n\",\n      \"e\\n\",\n      \"l\\n\",\n      \"l\\n\",\n      \"o\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"s = 'hello'\\n\",\n    \"\\n\",\n    \"#Iterate over string\\n\",\n    \"for let in s:\\n\",\n    \"    print(let)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"But that doesn't mean the string itself is an *iterator*! We can check this with the next() function:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"TypeError\",\n     \"evalue\": \"'str' object is not an iterator\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mTypeError\\u001b[0m                                 Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-14-61c30b5fe1d5>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mnext\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0ms\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mTypeError\\u001b[0m: 'str' object is not an iterator\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"next(s)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Interesting, this means that a string object supports iteration, but we can not directly iterate over it as we could with a generator function. The iter() function allows us to do just that!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"s_iter = iter(s)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'h'\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"next(s_iter)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'e'\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"next(s_iter)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now you know how to convert objects that are iterable into iterators themselves!\\n\",\n    \"\\n\",\n    \"The main takeaway from this lecture is that using the yield keyword at a function will cause the function to become a generator. This change can save you a lot of memory for large use cases. For more information on generators check out:\\n\",\n    \"\\n\",\n    \"[Stack Overflow Answer](http://stackoverflow.com/questions/1756096/understanding-generators-in-python)\\n\",\n    \"\\n\",\n    \"[Another StackOverflow Answer](http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python)\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "11-Python Generators/.ipynb_checkpoints/02-Iterators and Generators Homework-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Iterators and Generators Homework \\n\",\n    \"\\n\",\n    \"### Problem 1\\n\",\n    \"\\n\",\n    \"Create a generator that generates the squares of numbers up to some number N.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def gensquares(N):\\n\",\n    \"\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"0\\n\",\n      \"1\\n\",\n      \"4\\n\",\n      \"9\\n\",\n      \"16\\n\",\n      \"25\\n\",\n      \"36\\n\",\n      \"49\\n\",\n      \"64\\n\",\n      \"81\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for x in gensquares(10):\\n\",\n    \"    print(x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 2\\n\",\n    \"\\n\",\n    \"Create a generator that yields \\\"n\\\" random numbers between a low and high number (that are inputs). <br>Note: Use the random library. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"9\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"import random\\n\",\n    \"\\n\",\n    \"random.randint(1,10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def rand_num(low,high,n):\\n\",\n    \"\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"6\\n\",\n      \"1\\n\",\n      \"10\\n\",\n      \"5\\n\",\n      \"8\\n\",\n      \"2\\n\",\n      \"8\\n\",\n      \"5\\n\",\n      \"4\\n\",\n      \"5\\n\",\n      \"1\\n\",\n      \"4\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for num in rand_num(1,10,12):\\n\",\n    \"    print(num)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 3\\n\",\n    \"\\n\",\n    \"Use the iter() function to convert the string below into an iterator:\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"s = 'hello'\\n\",\n    \"\\n\",\n    \"#code here\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 4\\n\",\n    \"Explain a use case for a generator using a yield statement where you would not want to use a normal function with a return statement.<br><br><br><br><br><br>\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Extra Credit!\\n\",\n    \"Can you explain what *gencomp* is in the code below? (Note: We never covered this in lecture! You will have to do some Googling/Stack Overflowing!)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"4\\n\",\n      \"5\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"my_list = [1,2,3,4,5]\\n\",\n    \"\\n\",\n    \"gencomp = (item for item in my_list if item > 3)\\n\",\n    \"\\n\",\n    \"for item in gencomp:\\n\",\n    \"    print(item)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Hint: Google *generator comprehension*!\\n\",\n    \"\\n\",\n    \"# Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "11-Python Generators/.ipynb_checkpoints/03-Iterators and Generators Homework - Solution-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Iterators and Generators Homework - Solution\\n\",\n    \"\\n\",\n    \"### Problem 1\\n\",\n    \"\\n\",\n    \"Create a generator that generates the squares of numbers up to some number N.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def gensquares(N):\\n\",\n    \"    for i in range(N):\\n\",\n    \"        yield i**2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"0\\n\",\n      \"1\\n\",\n      \"4\\n\",\n      \"9\\n\",\n      \"16\\n\",\n      \"25\\n\",\n      \"36\\n\",\n      \"49\\n\",\n      \"64\\n\",\n      \"81\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for x in gensquares(10):\\n\",\n    \"    print(x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 2\\n\",\n    \"\\n\",\n    \"Create a generator that yields \\\"n\\\" random numbers between a low and high number (that are inputs).<br>Note: Use the random library. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"import random\\n\",\n    \"\\n\",\n    \"random.randint(1,10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def rand_num(low,high,n):\\n\",\n    \"    \\n\",\n    \"    for i in range(n):\\n\",\n    \"        yield random.randint(low, high)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"3\\n\",\n      \"9\\n\",\n      \"6\\n\",\n      \"10\\n\",\n      \"8\\n\",\n      \"4\\n\",\n      \"5\\n\",\n      \"5\\n\",\n      \"5\\n\",\n      \"3\\n\",\n      \"5\\n\",\n      \"8\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for num in rand_num(1,10,12):\\n\",\n    \"    print(num)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 3\\n\",\n    \"\\n\",\n    \"Use the iter() function to convert the string below into an iterator:\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"h\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"s = 'hello'\\n\",\n    \"\\n\",\n    \"s = iter(s)\\n\",\n    \"\\n\",\n    \"print(next(s))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 4\\n\",\n    \"Explain a use case for a generator using a yield statement where you would not want to use a normal function with a return statement.\\n\",\n    \"\\n\",\n    \"**If the output has the potential of taking up a large amount of memory and you only intend to iterate through it, you would want to use a generator. (Multiple answers are acceptable here!)**\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Extra Credit!\\n\",\n    \"Can you explain what *gencomp* is in the code below? (Note: We never covered this in lecture!)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"4\\n\",\n      \"5\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"my_list = [1,2,3,4,5]\\n\",\n    \"\\n\",\n    \"gencomp = (item for item in my_list if item > 3)\\n\",\n    \"\\n\",\n    \"for item in gencomp:\\n\",\n    \"    print(item)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Hint: Google *generator comprehension*!\\n\",\n    \"\\n\",\n    \"# Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "11-Python Generators/01-Iterators and Generators.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Iterators and Generators\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In this section of the course we will be learning the difference between iteration and generation in Python and how to construct our own Generators with the *yield* statement. Generators allow us to generate as we go along, instead of holding everything in memory. \\n\",\n    \"\\n\",\n    \"We've touched on this topic in the past when discussing certain built-in Python functions like **range()**, **map()** and **filter()**.\\n\",\n    \"\\n\",\n    \"Let's explore a little deeper. We've learned how to create functions with <code>def</code> and the <code>return</code> statement. Generator functions allow us to write a function that can send back a value and then later resume to pick up where it left off. This type of function is a generator in Python, allowing us to generate a sequence of values over time. The main difference in syntax will be the use of a <code>yield</code> statement.\\n\",\n    \"\\n\",\n    \"In most aspects, a generator function will appear very similar to a normal function. The main difference is when a generator function is compiled they become an object that supports an iteration protocol. That means when they are called in your code they don't actually return a value and then exit. Instead, generator functions will automatically suspend and resume their execution and state around the last point of value generation. The main advantage here is that instead of having to compute an entire series of values up front, the generator computes one value and then suspends its activity awaiting the next instruction. This feature is known as *state suspension*.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"￼￼To start getting a better understanding of generators, let's go ahead and see how we can create some.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Generator function for the cube of numbers (power of 3)\\n\",\n    \"def gencubes(n):\\n\",\n    \"    for num in range(n):\\n\",\n    \"        yield num**3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"0\\n\",\n      \"1\\n\",\n      \"8\\n\",\n      \"27\\n\",\n      \"64\\n\",\n      \"125\\n\",\n      \"216\\n\",\n      \"343\\n\",\n      \"512\\n\",\n      \"729\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for x in gencubes(10):\\n\",\n    \"    print(x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now since we have a generator function we don't have to keep track of every single cube we created.\\n\",\n    \"\\n\",\n    \"Generators are best for calculating large sets of results (particularly in calculations that involve loops themselves) in cases where we don’t want to allocate the memory for all of the results at the same time. \\n\",\n    \"\\n\",\n    \"Let's create another example generator which calculates [fibonacci](https://en.wikipedia.org/wiki/Fibonacci_number) numbers:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def genfibon(n):\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    Generate a fibonnaci sequence up to n\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    a = 1\\n\",\n    \"    b = 1\\n\",\n    \"    for i in range(n):\\n\",\n    \"        yield a\\n\",\n    \"        a,b = b,a+b\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"1\\n\",\n      \"1\\n\",\n      \"2\\n\",\n      \"3\\n\",\n      \"5\\n\",\n      \"8\\n\",\n      \"13\\n\",\n      \"21\\n\",\n      \"34\\n\",\n      \"55\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for num in genfibon(10):\\n\",\n    \"    print(num)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What if this was a normal function, what would it look like?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def fibon(n):\\n\",\n    \"    a = 1\\n\",\n    \"    b = 1\\n\",\n    \"    output = []\\n\",\n    \"    \\n\",\n    \"    for i in range(n):\\n\",\n    \"        output.append(a)\\n\",\n    \"        a,b = b,a+b\\n\",\n    \"        \\n\",\n    \"    return output\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"fibon(10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice that if we call some huge value of n (like 100000) the second function will have to keep track of every single result, when in our case we actually only care about the previous result to generate the next one!\\n\",\n    \"\\n\",\n    \"## next() and iter() built-in functions\\n\",\n    \"A key to fully understanding generators is the next() function and the iter() function.\\n\",\n    \"\\n\",\n    \"The next() function allows us to access the next element in a sequence. Lets check it out:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def simple_gen():\\n\",\n    \"    for x in range(3):\\n\",\n    \"        yield x\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Assign simple_gen \\n\",\n    \"g = simple_gen()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"0\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(next(g))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"1\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(next(g))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"2\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(next(g))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"StopIteration\",\n     \"evalue\": \"\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mStopIteration\\u001b[0m                             Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-12-1dfb29d6357e>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mprint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mnext\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mg\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mStopIteration\\u001b[0m: \"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(next(g))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"After yielding all the values next() caused a StopIteration error. What this error informs us of is that all the values have been yielded. \\n\",\n    \"\\n\",\n    \"You might be wondering that why don’t we get this error while using a for loop? A for loop automatically catches this error and stops calling next(). \\n\",\n    \"\\n\",\n    \"Let's go ahead and check out how to use iter(). You remember that strings are iterables:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"h\\n\",\n      \"e\\n\",\n      \"l\\n\",\n      \"l\\n\",\n      \"o\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"s = 'hello'\\n\",\n    \"\\n\",\n    \"#Iterate over string\\n\",\n    \"for let in s:\\n\",\n    \"    print(let)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"But that doesn't mean the string itself is an *iterator*! We can check this with the next() function:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"TypeError\",\n     \"evalue\": \"'str' object is not an iterator\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mTypeError\\u001b[0m                                 Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-14-61c30b5fe1d5>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mnext\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0ms\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mTypeError\\u001b[0m: 'str' object is not an iterator\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"next(s)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Interesting, this means that a string object supports iteration, but we can not directly iterate over it as we could with a generator function. The iter() function allows us to do just that!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"s_iter = iter(s)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'h'\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"next(s_iter)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'e'\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"next(s_iter)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now you know how to convert objects that are iterable into iterators themselves!\\n\",\n    \"\\n\",\n    \"The main takeaway from this lecture is that using the yield keyword at a function will cause the function to become a generator. This change can save you a lot of memory for large use cases. For more information on generators check out:\\n\",\n    \"\\n\",\n    \"[Stack Overflow Answer](http://stackoverflow.com/questions/1756096/understanding-generators-in-python)\\n\",\n    \"\\n\",\n    \"[Another StackOverflow Answer](http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python)\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "11-Python Generators/02-Iterators and Generators Homework.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Iterators and Generators Homework \\n\",\n    \"\\n\",\n    \"### Problem 1\\n\",\n    \"\\n\",\n    \"Create a generator that generates the squares of numbers up to some number N.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def gensquares(N):\\n\",\n    \"\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"0\\n\",\n      \"1\\n\",\n      \"4\\n\",\n      \"9\\n\",\n      \"16\\n\",\n      \"25\\n\",\n      \"36\\n\",\n      \"49\\n\",\n      \"64\\n\",\n      \"81\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for x in gensquares(10):\\n\",\n    \"    print(x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 2\\n\",\n    \"\\n\",\n    \"Create a generator that yields \\\"n\\\" random numbers between a low and high number (that are inputs). <br>Note: Use the random library. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"9\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"import random\\n\",\n    \"\\n\",\n    \"random.randint(1,10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def rand_num(low,high,n):\\n\",\n    \"\\n\",\n    \"    pass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"6\\n\",\n      \"1\\n\",\n      \"10\\n\",\n      \"5\\n\",\n      \"8\\n\",\n      \"2\\n\",\n      \"8\\n\",\n      \"5\\n\",\n      \"4\\n\",\n      \"5\\n\",\n      \"1\\n\",\n      \"4\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for num in rand_num(1,10,12):\\n\",\n    \"    print(num)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 3\\n\",\n    \"\\n\",\n    \"Use the iter() function to convert the string below into an iterator:\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"s = 'hello'\\n\",\n    \"\\n\",\n    \"#code here\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 4\\n\",\n    \"Explain a use case for a generator using a yield statement where you would not want to use a normal function with a return statement.<br><br><br><br><br><br>\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Extra Credit!\\n\",\n    \"Can you explain what *gencomp* is in the code below? (Note: We never covered this in lecture! You will have to do some Googling/Stack Overflowing!)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"4\\n\",\n      \"5\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"my_list = [1,2,3,4,5]\\n\",\n    \"\\n\",\n    \"gencomp = (item for item in my_list if item > 3)\\n\",\n    \"\\n\",\n    \"for item in gencomp:\\n\",\n    \"    print(item)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Hint: Google *generator comprehension*!\\n\",\n    \"\\n\",\n    \"# Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "11-Python Generators/03-Iterators and Generators Homework - Solution.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Iterators and Generators Homework - Solution\\n\",\n    \"\\n\",\n    \"### Problem 1\\n\",\n    \"\\n\",\n    \"Create a generator that generates the squares of numbers up to some number N.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def gensquares(N):\\n\",\n    \"    for i in range(N):\\n\",\n    \"        yield i**2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"0\\n\",\n      \"1\\n\",\n      \"4\\n\",\n      \"9\\n\",\n      \"16\\n\",\n      \"25\\n\",\n      \"36\\n\",\n      \"49\\n\",\n      \"64\\n\",\n      \"81\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for x in gensquares(10):\\n\",\n    \"    print(x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 2\\n\",\n    \"\\n\",\n    \"Create a generator that yields \\\"n\\\" random numbers between a low and high number (that are inputs).<br>Note: Use the random library. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"import random\\n\",\n    \"\\n\",\n    \"random.randint(1,10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def rand_num(low,high,n):\\n\",\n    \"    \\n\",\n    \"    for i in range(n):\\n\",\n    \"        yield random.randint(low, high)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"3\\n\",\n      \"9\\n\",\n      \"6\\n\",\n      \"10\\n\",\n      \"8\\n\",\n      \"4\\n\",\n      \"5\\n\",\n      \"5\\n\",\n      \"5\\n\",\n      \"3\\n\",\n      \"5\\n\",\n      \"8\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for num in rand_num(1,10,12):\\n\",\n    \"    print(num)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 3\\n\",\n    \"\\n\",\n    \"Use the iter() function to convert the string below into an iterator:\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"h\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"s = 'hello'\\n\",\n    \"\\n\",\n    \"s = iter(s)\\n\",\n    \"\\n\",\n    \"print(next(s))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Problem 4\\n\",\n    \"Explain a use case for a generator using a yield statement where you would not want to use a normal function with a return statement.\\n\",\n    \"\\n\",\n    \"**If the output has the potential of taking up a large amount of memory and you only intend to iterate through it, you would want to use a generator. (Multiple answers are acceptable here!)**\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Extra Credit!\\n\",\n    \"Can you explain what *gencomp* is in the code below? (Note: We never covered this in lecture!)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"4\\n\",\n      \"5\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"my_list = [1,2,3,4,5]\\n\",\n    \"\\n\",\n    \"gencomp = (item for item in my_list if item > 3)\\n\",\n    \"\\n\",\n    \"for item in gencomp:\\n\",\n    \"    print(item)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Hint: Google *generator comprehension*!\\n\",\n    \"\\n\",\n    \"# Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/.ipynb_checkpoints/00-Collections-Module-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Collections Module\\n\",\n    \"\\n\",\n    \"The collections module is a built-in module that implements specialized container data types providing alternatives to Python’s general purpose built-in containers. We've already gone over the basics: dict, list, set, and tuple.\\n\",\n    \"\\n\",\n    \"Now we'll learn about the alternatives that the collections module provides.\\n\",\n    \"\\n\",\n    \"## Counter\\n\",\n    \"\\n\",\n    \"*Counter* is a *dict* subclass which helps count hashable objects. Inside of it elements are stored as dictionary keys and the counts of the objects are stored as the value.\\n\",\n    \"\\n\",\n    \"Let's see how it can be used:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from collections import Counter\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Counter() with lists**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Counter({1: 6, 2: 6, 3: 4, 12: 1, 21: 1, 32: 1, 223: 1})\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lst = [1,2,2,2,2,3,3,3,1,2,1,12,3,2,32,1,21,1,223,1]\\n\",\n    \"\\n\",\n    \"Counter(lst)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Counter with strings**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Counter({'a': 2, 'b': 7, 'h': 3, 's': 6})\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"Counter('aabsbsbsbhshhbbsbs')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Counter with words in a sentence**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Counter({'How': 1,\\n\",\n       \"         'does': 1,\\n\",\n       \"         'each': 3,\\n\",\n       \"         'in': 1,\\n\",\n       \"         'many': 1,\\n\",\n       \"         'sentence': 1,\\n\",\n       \"         'show': 1,\\n\",\n       \"         'this': 1,\\n\",\n       \"         'times': 2,\\n\",\n       \"         'up': 1,\\n\",\n       \"         'word': 3})\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s = 'How many times does each word show up in this sentence word times each each word'\\n\",\n    \"\\n\",\n    \"words = s.split()\\n\",\n    \"\\n\",\n    \"Counter(words)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[('each', 3), ('word', 3)]\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Methods with Counter()\\n\",\n    \"c = Counter(words)\\n\",\n    \"\\n\",\n    \"c.most_common(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Common patterns when using the Counter() object\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"    sum(c.values())                 # total of all counts\\n\",\n    \"    c.clear()                       # reset all counts\\n\",\n    \"    list(c)                         # list unique elements\\n\",\n    \"    set(c)                          # convert to a set\\n\",\n    \"    dict(c)                         # convert to a regular dictionary\\n\",\n    \"    c.items()                       # convert to a list of (elem, cnt) pairs\\n\",\n    \"    Counter(dict(list_of_pairs))    # convert from a list of (elem, cnt) pairs\\n\",\n    \"    c.most_common()[:-n-1:-1]       # n least common elements\\n\",\n    \"    c += Counter()                  # remove zero and negative counts\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## defaultdict\\n\",\n    \"\\n\",\n    \"defaultdict is a dictionary-like object which provides all methods provided by a dictionary but takes a first argument (default_factory) as a default data type for the dictionary. Using defaultdict is faster than doing the same using dict.set_default method.\\n\",\n    \"\\n\",\n    \"**A defaultdict will never raise a KeyError. Any key that does not exist gets the value returned by the default factory.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from collections import defaultdict\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"d = {}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"KeyError\",\n     \"evalue\": \"'one'\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mKeyError\\u001b[0m                                  Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-8-07706fc5dc20>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0md\\u001b[0m\\u001b[1;33m[\\u001b[0m\\u001b[1;34m'one'\\u001b[0m\\u001b[1;33m]\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mKeyError\\u001b[0m: 'one'\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"d['one'] \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"d  = defaultdict(object)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<object at 0x216de27bcf0>\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d['one'] \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"one\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for item in d:\\n\",\n    \"    print(item)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Can also initialize with default values:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"d = defaultdict(lambda: 0)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d['one']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# namedtuple\\n\",\n    \"The standard tuple uses numerical indexes to access its members, for example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"t = (12,13,14)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"12\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"t[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"For simple use cases, this is usually enough. On the other hand, remembering which index should be used for each value can lead to errors, especially if the tuple has a lot of fields and is constructed far from where it is used. A namedtuple assigns names, as well as the numerical index, to each member. \\n\",\n    \"\\n\",\n    \"Each kind of namedtuple is represented by its own class, created by using the namedtuple() factory function. The arguments are the name of the new class and a string containing the names of the elements.\\n\",\n    \"\\n\",\n    \"You can basically think of namedtuples as a very quick way of creating a new object/class type with some attribute fields.\\n\",\n    \"For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from collections import namedtuple\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"Dog = namedtuple('Dog',['age','breed','name'])\\n\",\n    \"\\n\",\n    \"sam = Dog(age=2,breed='Lab',name='Sammy')\\n\",\n    \"\\n\",\n    \"frank = Dog(age=2,breed='Shepard',name=\\\"Frankie\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We construct the namedtuple by first passing the object type name (Dog) and then passing a string with the variety of fields as a string with spaces between the field names. We can then call on the various attributes:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Dog(age=2, breed='Lab', name='Sammy')\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sam\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 25,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sam.age\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Lab'\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sam.breed\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 27,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sam[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Conclusion\\n\",\n    \"\\n\",\n    \"Hopefully you now see how incredibly useful the collections module is in Python and it should be your go-to module for a variety of common tasks!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/.ipynb_checkpoints/01-Datetime-Module-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# datetime module\\n\",\n    \"\\n\",\n    \"Python has the datetime module to help deal with timestamps in your code. Time values are represented with the time class. Times have attributes for hour, minute, second, and microsecond. They can also include time zone information. The arguments to initialize a time instance are optional, but the default of 0 is unlikely to be what you want.\\n\",\n    \"\\n\",\n    \"## time\\n\",\n    \"Let's take a look at how we can extract time information from the datetime module. We can create a timestamp by specifying datetime.time(hour,minute,second,microsecond)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"04:20:01\\n\",\n      \"hour  : 4\\n\",\n      \"minute: 20\\n\",\n      \"second: 1\\n\",\n      \"microsecond: 0\\n\",\n      \"tzinfo: None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"import datetime\\n\",\n    \"\\n\",\n    \"t = datetime.time(4, 20, 1)\\n\",\n    \"\\n\",\n    \"# Let's show the different components\\n\",\n    \"print(t)\\n\",\n    \"print('hour  :', t.hour)\\n\",\n    \"print('minute:', t.minute)\\n\",\n    \"print('second:', t.second)\\n\",\n    \"print('microsecond:', t.microsecond)\\n\",\n    \"print('tzinfo:', t.tzinfo)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note: A time instance only holds values of time, and not a date associated with the time. \\n\",\n    \"\\n\",\n    \"We can also check the min and max values a time of day can have in the module:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Earliest  : 00:00:00\\n\",\n      \"Latest    : 23:59:59.999999\\n\",\n      \"Resolution: 0:00:00.000001\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('Earliest  :', datetime.time.min)\\n\",\n    \"print('Latest    :', datetime.time.max)\\n\",\n    \"print('Resolution:', datetime.time.resolution)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The min and max class attributes reflect the valid range of times in a single day.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Dates\\n\",\n    \"datetime (as you might suspect) also allows us to work with date timestamps. Calendar date values are represented with the date class. Instances have attributes for year, month, and day. It is easy to create a date representing today’s date using the today() class method.\\n\",\n    \"\\n\",\n    \"Let's see some examples:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"2020-06-10\\n\",\n      \"ctime: Wed Jun 10 00:00:00 2020\\n\",\n      \"tuple: time.struct_time(tm_year=2020, tm_mon=6, tm_mday=10, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=162, tm_isdst=-1)\\n\",\n      \"ordinal: 737586\\n\",\n      \"Year : 2020\\n\",\n      \"Month: 6\\n\",\n      \"Day  : 10\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"today = datetime.date.today()\\n\",\n    \"print(today)\\n\",\n    \"print('ctime:', today.ctime())\\n\",\n    \"print('tuple:', today.timetuple())\\n\",\n    \"print('ordinal:', today.toordinal())\\n\",\n    \"print('Year :', today.year)\\n\",\n    \"print('Month:', today.month)\\n\",\n    \"print('Day  :', today.day)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"As with time, the range of date values supported can be determined using the min and max attributes.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Earliest  : 0001-01-01\\n\",\n      \"Latest    : 9999-12-31\\n\",\n      \"Resolution: 1 day, 0:00:00\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('Earliest  :', datetime.date.min)\\n\",\n    \"print('Latest    :', datetime.date.max)\\n\",\n    \"print('Resolution:', datetime.date.resolution)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Another way to create new date instances uses the replace() method of an existing date. For example, you can change the year, leaving the day and month alone.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"d1: 2015-03-11\\n\",\n      \"d2: 1990-03-11\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"d1 = datetime.date(2015, 3, 11)\\n\",\n    \"print('d1:', d1)\\n\",\n    \"\\n\",\n    \"d2 = d1.replace(year=1990)\\n\",\n    \"print('d2:', d2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Arithmetic\\n\",\n    \"We can perform arithmetic on date objects to check for time differences. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"datetime.date(2015, 3, 11)\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"datetime.date(1990, 3, 11)\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"datetime.timedelta(9131)\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d1-d2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This gives us the difference in days between the two dates. You can use the timedelta method to specify various units of times (days, minutes, hours, etc.)\\n\",\n    \"\\n\",\n    \"Great! You should now have a basic understanding of how to use datetime with Python to work with timestamps in your code!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/.ipynb_checkpoints/01-Opening-and-Reading-Files-Folders-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Opening and Reading Files\\n\",\n    \"\\n\",\n    \"So far we've discussed how to open files manually, one by one. Let's explore how we can open files programatically. \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"_____\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Review: Understanding File Paths\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\12-Advanced Python Modules'\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"pwd\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Create Practice File\\n\",\n    \"\\n\",\n    \"We will begin by creating a practice text file that we will be using for demonstration.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"f = open('practice.txt','w+')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"f.write('test')\\n\",\n    \"f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Getting Directories\\n\",\n    \"\\n\",\n    \"Python has a built-in [os module](https://docs.python.org/3/library/os.html) that allows us to use operating system dependent functionality.\\n\",\n    \"\\n\",\n    \"You can get the current directory:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import os\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\12-Advanced Python Modules'\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"os.getcwd()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Listing Files in a Directory\\n\",\n    \"\\n\",\n    \"You can also use the os module to list directories.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['.ipynb_checkpoints',\\n\",\n       \" '00-Collections-Module.ipynb',\\n\",\n       \" '01-Datetime-Module.ipynb',\\n\",\n       \" '01-Opening-and-Reading-Files.ipynb',\\n\",\n       \" '02-Math-and-Random-Module.ipynb',\\n\",\n       \" '03-Python Debugger (pdb).ipynb',\\n\",\n       \" '04-Timing your code - timeit.ipynb',\\n\",\n       \" '05-Overview-of-Regular-Expressions.ipynb',\\n\",\n       \" '06-Unzipping-and-Zipping-Files.ipynb',\\n\",\n       \" '07-OS-Module.ipynb',\\n\",\n       \" '08-Advanced-Python-Module-Exercise',\\n\",\n       \" 'comp_file.zip',\\n\",\n       \" 'Example_Top_Level',\\n\",\n       \" 'extracted_content',\\n\",\n       \" 'new_file.txt',\\n\",\n       \" 'new_file2.txt',\\n\",\n       \" 'practice.txt']\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# In your current directory\\n\",\n    \"os.listdir()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['admin.DESKTOP-O64BPTC',\\n\",\n       \" 'All Users',\\n\",\n       \" 'Default',\\n\",\n       \" 'Default User',\\n\",\n       \" 'defaultuser0',\\n\",\n       \" 'desktop.ini',\\n\",\n       \" 'Marcial',\\n\",\n       \" 'Public']\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# In any directory you pass\\n\",\n    \"os.listdir(\\\"C:\\\\\\\\Users\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"### Moving Files \\n\",\n    \"\\n\",\n    \"You can use the built-in **shutil** module to to move files to different locations. Keep in mind, there are permission restrictions, for example if you are logged in a User A, you won't be able to make changes to the top level Users folder without the proper permissions, [more info](https://stackoverflow.com/questions/23253439/shutil-movescr-dst-gets-me-ioerror-errno-13-permission-denied-and-3-more-e)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import shutil\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\practice.txt'\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"shutil.move('practice.txt','C:\\\\\\\\Users\\\\\\\\Marcial')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['.ipynb_checkpoints',\\n\",\n       \" '00-Collections-Module.ipynb',\\n\",\n       \" '01-Datetime-Module.ipynb',\\n\",\n       \" '01-Opening-and-Reading-Files.ipynb',\\n\",\n       \" '02-Math-and-Random-Module.ipynb',\\n\",\n       \" '03-Python Debugger (pdb).ipynb',\\n\",\n       \" '04-Timing your code - timeit.ipynb',\\n\",\n       \" '05-Overview-of-Regular-Expressions.ipynb',\\n\",\n       \" '06-Unzipping-and-Zipping-Files.ipynb',\\n\",\n       \" '07-OS-Module.ipynb',\\n\",\n       \" '08-Advanced-Python-Module-Exercise',\\n\",\n       \" 'comp_file.zip',\\n\",\n       \" 'Example_Top_Level',\\n\",\n       \" 'extracted_content',\\n\",\n       \" 'new_file.txt',\\n\",\n       \" 'new_file2.txt']\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"os.listdir()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\12-Advanced Python Modules\\\\\\\\practice.txt'\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"shutil.move('C:\\\\\\\\Users\\\\\\\\Marcial\\\\practice.txt',os.getcwd())\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['.ipynb_checkpoints',\\n\",\n       \" '00-Collections-Module.ipynb',\\n\",\n       \" '01-Datetime-Module.ipynb',\\n\",\n       \" '01-Opening-and-Reading-Files.ipynb',\\n\",\n       \" '02-Math-and-Random-Module.ipynb',\\n\",\n       \" '03-Python Debugger (pdb).ipynb',\\n\",\n       \" '04-Timing your code - timeit.ipynb',\\n\",\n       \" '05-Overview-of-Regular-Expressions.ipynb',\\n\",\n       \" '06-Unzipping-and-Zipping-Files.ipynb',\\n\",\n       \" '07-OS-Module.ipynb',\\n\",\n       \" '08-Advanced-Python-Module-Exercise',\\n\",\n       \" 'comp_file.zip',\\n\",\n       \" 'Example_Top_Level',\\n\",\n       \" 'extracted_content',\\n\",\n       \" 'new_file.txt',\\n\",\n       \" 'new_file2.txt',\\n\",\n       \" 'practice.txt']\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"os.listdir()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Deleting Files\\n\",\n    \"____\\n\",\n    \"**NOTE: The os module provides 3 methods for deleting files:**\\n\",\n    \"* os.unlink(path) which deletes a file at the path your provide\\n\",\n    \"* os.rmdir(path) which deletes a folder (folder must be empty) at the path your provide\\n\",\n    \"* shutil.rmtree(path) this is the most dangerous, as it will remove all files and folders contained in the path.\\n\",\n    \"**All of these methods can not be reversed! Which means if you make a mistake you won't be able to recover the file. Instead we will use the send2trash module. A safer alternative that sends deleted files to the trash bin instead of permanent removal.**\\n\",\n    \"___\\n\",\n    \"\\n\",\n    \"Install the send2trash module with:\\n\",\n    \"\\n\",\n    \"    pip install send2trash\\n\",\n    \"    \\n\",\n    \"at your command line.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import send2trash\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['.ipynb_checkpoints',\\n\",\n       \" '00-Collections-Module.ipynb',\\n\",\n       \" '01-Datetime-Module.ipynb',\\n\",\n       \" '01-Opening-and-Reading-Files.ipynb',\\n\",\n       \" '02-Math-and-Random-Module.ipynb',\\n\",\n       \" '03-Python Debugger (pdb).ipynb',\\n\",\n       \" '04-Timing your code - timeit.ipynb',\\n\",\n       \" '05-Overview-of-Regular-Expressions.ipynb',\\n\",\n       \" '06-Unzipping-and-Zipping-Files.ipynb',\\n\",\n       \" '07-OS-Module.ipynb',\\n\",\n       \" '08-Advanced-Python-Module-Exercise',\\n\",\n       \" 'comp_file.zip',\\n\",\n       \" 'Example_Top_Level',\\n\",\n       \" 'extracted_content',\\n\",\n       \" 'new_file.txt',\\n\",\n       \" 'new_file2.txt',\\n\",\n       \" 'practice.txt']\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"os.listdir()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"send2trash.send2trash('practice.txt')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['.ipynb_checkpoints',\\n\",\n       \" '00-Collections-Module.ipynb',\\n\",\n       \" '01-Datetime-Module.ipynb',\\n\",\n       \" '01-Opening-and-Reading-Files.ipynb',\\n\",\n       \" '02-Math-and-Random-Module.ipynb',\\n\",\n       \" '03-Python Debugger (pdb).ipynb',\\n\",\n       \" '04-Timing your code - timeit.ipynb',\\n\",\n       \" '05-Overview-of-Regular-Expressions.ipynb',\\n\",\n       \" '06-Unzipping-and-Zipping-Files.ipynb',\\n\",\n       \" '07-OS-Module.ipynb',\\n\",\n       \" '08-Advanced-Python-Module-Exercise',\\n\",\n       \" 'comp_file.zip',\\n\",\n       \" 'Example_Top_Level',\\n\",\n       \" 'extracted_content',\\n\",\n       \" 'new_file.txt',\\n\",\n       \" 'new_file2.txt']\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"os.listdir()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Walking through a directory\\n\",\n    \"\\n\",\n    \"Often you will just need to \\\"walk\\\" through a directory, that is visit every file or folder and check to see if a file is in the directory, and then perhaps do something with that file. Usually recursively walking through every file and folder in a directory would be quite tricky to program, but luckily the os module has a direct method call for this called os.walk(). Let's explore how it works.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\12-Advanced Python Modules'\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"os.getcwd()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['.ipynb_checkpoints',\\n\",\n       \" '00-Collections-Module.ipynb',\\n\",\n       \" '01-Datetime-Module.ipynb',\\n\",\n       \" '01-Opening-and-Reading-Files.ipynb',\\n\",\n       \" '02-Math-and-Random-Module.ipynb',\\n\",\n       \" '03-Python Debugger (pdb).ipynb',\\n\",\n       \" '04-Timing your code - timeit.ipynb',\\n\",\n       \" '05-Overview-of-Regular-Expressions.ipynb',\\n\",\n       \" '06-Unzipping-and-Zipping-Files.ipynb',\\n\",\n       \" '07-OS-Module.ipynb',\\n\",\n       \" '08-Advanced-Python-Module-Exercise',\\n\",\n       \" 'comp_file.zip',\\n\",\n       \" 'Example_Top_Level',\\n\",\n       \" 'extracted_content',\\n\",\n       \" 'new_file.txt',\\n\",\n       \" 'new_file2.txt']\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"os.listdir()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Currently looking at folder: Example_Top_Level\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE SUBFOLDERS ARE: \\n\",\n      \"\\t Subfolder: Mid-Example-One\\n\",\n      \"\\t Subfolder: Mid-Example-Two\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE FILES ARE: \\n\",\n      \"\\t File: Mid-Example.txt\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Currently looking at folder: Example_Top_Level\\\\Mid-Example-One\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE SUBFOLDERS ARE: \\n\",\n      \"\\t Subfolder: Bottom-Level-One\\n\",\n      \"\\t Subfolder: Bottom-Level-Two\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE FILES ARE: \\n\",\n      \"\\t File: Mid-Level-Doc.txt\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Currently looking at folder: Example_Top_Level\\\\Mid-Example-One\\\\Bottom-Level-One\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE SUBFOLDERS ARE: \\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE FILES ARE: \\n\",\n      \"\\t File: One_Text.txt\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Currently looking at folder: Example_Top_Level\\\\Mid-Example-One\\\\Bottom-Level-Two\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE SUBFOLDERS ARE: \\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE FILES ARE: \\n\",\n      \"\\t File: Bottom-Text-Two.txt\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Currently looking at folder: Example_Top_Level\\\\Mid-Example-Two\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE SUBFOLDERS ARE: \\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE FILES ARE: \\n\",\n      \"\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for folder , sub_folders , files in os.walk(\\\"Example_Top_Level\\\"):\\n\",\n    \"    \\n\",\n    \"    print(\\\"Currently looking at folder: \\\"+ folder)\\n\",\n    \"    print('\\\\n')\\n\",\n    \"    print(\\\"THE SUBFOLDERS ARE: \\\")\\n\",\n    \"    for sub_fold in sub_folders:\\n\",\n    \"        print(\\\"\\\\t Subfolder: \\\"+sub_fold )\\n\",\n    \"    \\n\",\n    \"    print('\\\\n')\\n\",\n    \"    \\n\",\n    \"    print(\\\"THE FILES ARE: \\\")\\n\",\n    \"    for f in files:\\n\",\n    \"        print(\\\"\\\\t File: \\\"+f)\\n\",\n    \"    print('\\\\n')\\n\",\n    \"    \\n\",\n    \"    # Now look at subfolders\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"___\\n\",\n    \"Excellent, you should now be aware of how to work with a computer's files and folders in whichever directory they are in. Remember that the os module works for any oeprating system that supports Python, which means these commands will work across Linux,MacOs, or Windows without need for adjustment.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"anaconda-cloud\": {},\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/.ipynb_checkpoints/02-Datetime-Module-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# datetime module\\n\",\n    \"\\n\",\n    \"Python has the datetime module to help deal with timestamps in your code. Time values are represented with the time class. Times have attributes for hour, minute, second, and microsecond. They can also include time zone information. The arguments to initialize a time instance are optional, but the default of 0 is unlikely to be what you want.\\n\",\n    \"\\n\",\n    \"## time\\n\",\n    \"Let's take a look at how we can extract time information from the datetime module. We can create a timestamp by specifying datetime.time(hour,minute,second,microsecond)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"04:20:01\\n\",\n      \"hour  : 4\\n\",\n      \"minute: 20\\n\",\n      \"second: 1\\n\",\n      \"microsecond: 0\\n\",\n      \"tzinfo: None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"import datetime\\n\",\n    \"\\n\",\n    \"t = datetime.time(4, 20, 1)\\n\",\n    \"\\n\",\n    \"# Let's show the different components\\n\",\n    \"print(t)\\n\",\n    \"print('hour  :', t.hour)\\n\",\n    \"print('minute:', t.minute)\\n\",\n    \"print('second:', t.second)\\n\",\n    \"print('microsecond:', t.microsecond)\\n\",\n    \"print('tzinfo:', t.tzinfo)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note: A time instance only holds values of time, and not a date associated with the time. \\n\",\n    \"\\n\",\n    \"We can also check the min and max values a time of day can have in the module:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Earliest  : 00:00:00\\n\",\n      \"Latest    : 23:59:59.999999\\n\",\n      \"Resolution: 0:00:00.000001\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('Earliest  :', datetime.time.min)\\n\",\n    \"print('Latest    :', datetime.time.max)\\n\",\n    \"print('Resolution:', datetime.time.resolution)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The min and max class attributes reflect the valid range of times in a single day.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Dates\\n\",\n    \"datetime (as you might suspect) also allows us to work with date timestamps. Calendar date values are represented with the date class. Instances have attributes for year, month, and day. It is easy to create a date representing today’s date using the today() class method.\\n\",\n    \"\\n\",\n    \"Let's see some examples:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"2020-06-10\\n\",\n      \"ctime: Wed Jun 10 00:00:00 2020\\n\",\n      \"tuple: time.struct_time(tm_year=2020, tm_mon=6, tm_mday=10, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=162, tm_isdst=-1)\\n\",\n      \"ordinal: 737586\\n\",\n      \"Year : 2020\\n\",\n      \"Month: 6\\n\",\n      \"Day  : 10\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"today = datetime.date.today()\\n\",\n    \"print(today)\\n\",\n    \"print('ctime:', today.ctime())\\n\",\n    \"print('tuple:', today.timetuple())\\n\",\n    \"print('ordinal:', today.toordinal())\\n\",\n    \"print('Year :', today.year)\\n\",\n    \"print('Month:', today.month)\\n\",\n    \"print('Day  :', today.day)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"As with time, the range of date values supported can be determined using the min and max attributes.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Earliest  : 0001-01-01\\n\",\n      \"Latest    : 9999-12-31\\n\",\n      \"Resolution: 1 day, 0:00:00\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('Earliest  :', datetime.date.min)\\n\",\n    \"print('Latest    :', datetime.date.max)\\n\",\n    \"print('Resolution:', datetime.date.resolution)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Another way to create new date instances uses the replace() method of an existing date. For example, you can change the year, leaving the day and month alone.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"d1: 2015-03-11\\n\",\n      \"d2: 1990-03-11\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"d1 = datetime.date(2015, 3, 11)\\n\",\n    \"print('d1:', d1)\\n\",\n    \"\\n\",\n    \"d2 = d1.replace(year=1990)\\n\",\n    \"print('d2:', d2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Arithmetic\\n\",\n    \"We can perform arithmetic on date objects to check for time differences. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"datetime.date(2015, 3, 11)\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"datetime.date(1990, 3, 11)\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"datetime.timedelta(9131)\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d1-d2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This gives us the difference in days between the two dates. You can use the timedelta method to specify various units of times (days, minutes, hours, etc.)\\n\",\n    \"\\n\",\n    \"Great! You should now have a basic understanding of how to use datetime with Python to work with timestamps in your code!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/.ipynb_checkpoints/02-Math-and-Random-Module-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Math and Random Modules\\n\",\n    \"\\n\",\n    \"Python comes with a built in math module and random module. In this lecture we will give a brief tour of their capabilities. Usually you can simply look up the function call you are looking for in the online documentation.\\n\",\n    \"\\n\",\n    \"* [Math Module](https://docs.python.org/3/library/math.html)\\n\",\n    \"\\n\",\n    \"* [Random Module](https://docs.python.org/3/library/random.html)\\n\",\n    \"\\n\",\n    \"We won't go through every function available in these modules since there are so many, but we will show some useful ones.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Useful Math Functions\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import math\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Help on built-in module math:\\n\",\n      \"\\n\",\n      \"NAME\\n\",\n      \"    math\\n\",\n      \"\\n\",\n      \"DESCRIPTION\\n\",\n      \"    This module is always available.  It provides access to the\\n\",\n      \"    mathematical functions defined by the C standard.\\n\",\n      \"\\n\",\n      \"FUNCTIONS\\n\",\n      \"    acos(...)\\n\",\n      \"        acos(x)\\n\",\n      \"        \\n\",\n      \"        Return the arc cosine (measured in radians) of x.\\n\",\n      \"    \\n\",\n      \"    acosh(...)\\n\",\n      \"        acosh(x)\\n\",\n      \"        \\n\",\n      \"        Return the inverse hyperbolic cosine of x.\\n\",\n      \"    \\n\",\n      \"    asin(...)\\n\",\n      \"        asin(x)\\n\",\n      \"        \\n\",\n      \"        Return the arc sine (measured in radians) of x.\\n\",\n      \"    \\n\",\n      \"    asinh(...)\\n\",\n      \"        asinh(x)\\n\",\n      \"        \\n\",\n      \"        Return the inverse hyperbolic sine of x.\\n\",\n      \"    \\n\",\n      \"    atan(...)\\n\",\n      \"        atan(x)\\n\",\n      \"        \\n\",\n      \"        Return the arc tangent (measured in radians) of x.\\n\",\n      \"    \\n\",\n      \"    atan2(...)\\n\",\n      \"        atan2(y, x)\\n\",\n      \"        \\n\",\n      \"        Return the arc tangent (measured in radians) of y/x.\\n\",\n      \"        Unlike atan(y/x), the signs of both x and y are considered.\\n\",\n      \"    \\n\",\n      \"    atanh(...)\\n\",\n      \"        atanh(x)\\n\",\n      \"        \\n\",\n      \"        Return the inverse hyperbolic tangent of x.\\n\",\n      \"    \\n\",\n      \"    ceil(...)\\n\",\n      \"        ceil(x)\\n\",\n      \"        \\n\",\n      \"        Return the ceiling of x as an Integral.\\n\",\n      \"        This is the smallest integer >= x.\\n\",\n      \"    \\n\",\n      \"    copysign(...)\\n\",\n      \"        copysign(x, y)\\n\",\n      \"        \\n\",\n      \"        Return a float with the magnitude (absolute value) of x but the sign \\n\",\n      \"        of y. On platforms that support signed zeros, copysign(1.0, -0.0) \\n\",\n      \"        returns -1.0.\\n\",\n      \"    \\n\",\n      \"    cos(...)\\n\",\n      \"        cos(x)\\n\",\n      \"        \\n\",\n      \"        Return the cosine of x (measured in radians).\\n\",\n      \"    \\n\",\n      \"    cosh(...)\\n\",\n      \"        cosh(x)\\n\",\n      \"        \\n\",\n      \"        Return the hyperbolic cosine of x.\\n\",\n      \"    \\n\",\n      \"    degrees(...)\\n\",\n      \"        degrees(x)\\n\",\n      \"        \\n\",\n      \"        Convert angle x from radians to degrees.\\n\",\n      \"    \\n\",\n      \"    erf(...)\\n\",\n      \"        erf(x)\\n\",\n      \"        \\n\",\n      \"        Error function at x.\\n\",\n      \"    \\n\",\n      \"    erfc(...)\\n\",\n      \"        erfc(x)\\n\",\n      \"        \\n\",\n      \"        Complementary error function at x.\\n\",\n      \"    \\n\",\n      \"    exp(...)\\n\",\n      \"        exp(x)\\n\",\n      \"        \\n\",\n      \"        Return e raised to the power of x.\\n\",\n      \"    \\n\",\n      \"    expm1(...)\\n\",\n      \"        expm1(x)\\n\",\n      \"        \\n\",\n      \"        Return exp(x)-1.\\n\",\n      \"        This function avoids the loss of precision involved in the direct evaluation of exp(x)-1 for small x.\\n\",\n      \"    \\n\",\n      \"    fabs(...)\\n\",\n      \"        fabs(x)\\n\",\n      \"        \\n\",\n      \"        Return the absolute value of the float x.\\n\",\n      \"    \\n\",\n      \"    factorial(...)\\n\",\n      \"        factorial(x) -> Integral\\n\",\n      \"        \\n\",\n      \"        Find x!. Raise a ValueError if x is negative or non-integral.\\n\",\n      \"    \\n\",\n      \"    floor(...)\\n\",\n      \"        floor(x)\\n\",\n      \"        \\n\",\n      \"        Return the floor of x as an Integral.\\n\",\n      \"        This is the largest integer <= x.\\n\",\n      \"    \\n\",\n      \"    fmod(...)\\n\",\n      \"        fmod(x, y)\\n\",\n      \"        \\n\",\n      \"        Return fmod(x, y), according to platform C.  x % y may differ.\\n\",\n      \"    \\n\",\n      \"    frexp(...)\\n\",\n      \"        frexp(x)\\n\",\n      \"        \\n\",\n      \"        Return the mantissa and exponent of x, as pair (m, e).\\n\",\n      \"        m is a float and e is an int, such that x = m * 2.**e.\\n\",\n      \"        If x is 0, m and e are both 0.  Else 0.5 <= abs(m) < 1.0.\\n\",\n      \"    \\n\",\n      \"    fsum(...)\\n\",\n      \"        fsum(iterable)\\n\",\n      \"        \\n\",\n      \"        Return an accurate floating point sum of values in the iterable.\\n\",\n      \"        Assumes IEEE-754 floating point arithmetic.\\n\",\n      \"    \\n\",\n      \"    gamma(...)\\n\",\n      \"        gamma(x)\\n\",\n      \"        \\n\",\n      \"        Gamma function at x.\\n\",\n      \"    \\n\",\n      \"    gcd(...)\\n\",\n      \"        gcd(x, y) -> int\\n\",\n      \"        greatest common divisor of x and y\\n\",\n      \"    \\n\",\n      \"    hypot(...)\\n\",\n      \"        hypot(x, y)\\n\",\n      \"        \\n\",\n      \"        Return the Euclidean distance, sqrt(x*x + y*y).\\n\",\n      \"    \\n\",\n      \"    isclose(...)\\n\",\n      \"        isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0) -> bool\\n\",\n      \"        \\n\",\n      \"        Determine whether two floating point numbers are close in value.\\n\",\n      \"        \\n\",\n      \"           rel_tol\\n\",\n      \"               maximum difference for being considered \\\"close\\\", relative to the\\n\",\n      \"               magnitude of the input values\\n\",\n      \"            abs_tol\\n\",\n      \"               maximum difference for being considered \\\"close\\\", regardless of the\\n\",\n      \"               magnitude of the input values\\n\",\n      \"        \\n\",\n      \"        Return True if a is close in value to b, and False otherwise.\\n\",\n      \"        \\n\",\n      \"        For the values to be considered close, the difference between them\\n\",\n      \"        must be smaller than at least one of the tolerances.\\n\",\n      \"        \\n\",\n      \"        -inf, inf and NaN behave similarly to the IEEE 754 Standard.  That\\n\",\n      \"        is, NaN is not close to anything, even itself.  inf and -inf are\\n\",\n      \"        only close to themselves.\\n\",\n      \"    \\n\",\n      \"    isfinite(...)\\n\",\n      \"        isfinite(x) -> bool\\n\",\n      \"        \\n\",\n      \"        Return True if x is neither an infinity nor a NaN, and False otherwise.\\n\",\n      \"    \\n\",\n      \"    isinf(...)\\n\",\n      \"        isinf(x) -> bool\\n\",\n      \"        \\n\",\n      \"        Return True if x is a positive or negative infinity, and False otherwise.\\n\",\n      \"    \\n\",\n      \"    isnan(...)\\n\",\n      \"        isnan(x) -> bool\\n\",\n      \"        \\n\",\n      \"        Return True if x is a NaN (not a number), and False otherwise.\\n\",\n      \"    \\n\",\n      \"    ldexp(...)\\n\",\n      \"        ldexp(x, i)\\n\",\n      \"        \\n\",\n      \"        Return x * (2**i).\\n\",\n      \"    \\n\",\n      \"    lgamma(...)\\n\",\n      \"        lgamma(x)\\n\",\n      \"        \\n\",\n      \"        Natural logarithm of absolute value of Gamma function at x.\\n\",\n      \"    \\n\",\n      \"    log(...)\\n\",\n      \"        log(x[, base])\\n\",\n      \"        \\n\",\n      \"        Return the logarithm of x to the given base.\\n\",\n      \"        If the base not specified, returns the natural logarithm (base e) of x.\\n\",\n      \"    \\n\",\n      \"    log10(...)\\n\",\n      \"        log10(x)\\n\",\n      \"        \\n\",\n      \"        Return the base 10 logarithm of x.\\n\",\n      \"    \\n\",\n      \"    log1p(...)\\n\",\n      \"        log1p(x)\\n\",\n      \"        \\n\",\n      \"        Return the natural logarithm of 1+x (base e).\\n\",\n      \"        The result is computed in a way which is accurate for x near zero.\\n\",\n      \"    \\n\",\n      \"    log2(...)\\n\",\n      \"        log2(x)\\n\",\n      \"        \\n\",\n      \"        Return the base 2 logarithm of x.\\n\",\n      \"    \\n\",\n      \"    modf(...)\\n\",\n      \"        modf(x)\\n\",\n      \"        \\n\",\n      \"        Return the fractional and integer parts of x.  Both results carry the sign\\n\",\n      \"        of x and are floats.\\n\",\n      \"    \\n\",\n      \"    pow(...)\\n\",\n      \"        pow(x, y)\\n\",\n      \"        \\n\",\n      \"        Return x**y (x to the power of y).\\n\",\n      \"    \\n\",\n      \"    radians(...)\\n\",\n      \"        radians(x)\\n\",\n      \"        \\n\",\n      \"        Convert angle x from degrees to radians.\\n\",\n      \"    \\n\",\n      \"    sin(...)\\n\",\n      \"        sin(x)\\n\",\n      \"        \\n\",\n      \"        Return the sine of x (measured in radians).\\n\",\n      \"    \\n\",\n      \"    sinh(...)\\n\",\n      \"        sinh(x)\\n\",\n      \"        \\n\",\n      \"        Return the hyperbolic sine of x.\\n\",\n      \"    \\n\",\n      \"    sqrt(...)\\n\",\n      \"        sqrt(x)\\n\",\n      \"        \\n\",\n      \"        Return the square root of x.\\n\",\n      \"    \\n\",\n      \"    tan(...)\\n\",\n      \"        tan(x)\\n\",\n      \"        \\n\",\n      \"        Return the tangent of x (measured in radians).\\n\",\n      \"    \\n\",\n      \"    tanh(...)\\n\",\n      \"        tanh(x)\\n\",\n      \"        \\n\",\n      \"        Return the hyperbolic tangent of x.\\n\",\n      \"    \\n\",\n      \"    trunc(...)\\n\",\n      \"        trunc(x:Real) -> Integral\\n\",\n      \"        \\n\",\n      \"        Truncates x to the nearest Integral toward 0. Uses the __trunc__ magic method.\\n\",\n      \"\\n\",\n      \"DATA\\n\",\n      \"    e = 2.718281828459045\\n\",\n      \"    inf = inf\\n\",\n      \"    nan = nan\\n\",\n      \"    pi = 3.141592653589793\\n\",\n      \"    tau = 6.283185307179586\\n\",\n      \"\\n\",\n      \"FILE\\n\",\n      \"    (built-in)\\n\",\n      \"\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"help(math)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Rounding Numbers\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"value = 4.35\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.floor(value)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"5\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.ceil(value)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"round(value)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Mathematical Constants\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3.141592653589793\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.pi\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from math import pi\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3.141592653589793\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"pi\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2.718281828459045\"\n      ]\n     },\n     \"execution_count\": 23,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.e\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"6.283185307179586\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.tau\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"inf\"\n      ]\n     },\n     \"execution_count\": 25,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.inf\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"nan\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.nan\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Logarithmic Values\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2.718281828459045\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.e\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1.0\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Log Base e\\n\",\n    \"math.log(math.e)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"ValueError\",\n     \"evalue\": \"math domain error\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mValueError\\u001b[0m                                Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-12-7563e0a48092>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mmath\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mlog\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;36m0\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mValueError\\u001b[0m: math domain error\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Will produce an error if value does not exist mathmatically\\n\",\n    \"math.log(0)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2.302585092994046\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.log(10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10.000000000000002\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.e ** 2.302585092994046\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Custom Base\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2.0\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# math.log(x,base)\\n\",\n    \"math.log(100,10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"100\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"10**2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Trigonometrics Functions\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"-0.5440211108893698\"\n      ]\n     },\n     \"execution_count\": 30,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Radians\\n\",\n    \"math.sin(10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"90.0\"\n      ]\n     },\n     \"execution_count\": 31,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.degrees(pi/2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3.141592653589793\"\n      ]\n     },\n     \"execution_count\": 32,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.radians(180)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Random Module\\n\",\n    \"\\n\",\n    \"Random Module allows us to create random numbers. We can even set a seed to produce the same random set every time.\\n\",\n    \"\\n\",\n    \"The explanation of how a computer attempts to generate random numbers is beyond the scope of this course since it involves higher level mathmatics. But if you are interested in this topic check out:\\n\",\n    \"* https://en.wikipedia.org/wiki/Pseudorandom_number_generator\\n\",\n    \"* https://en.wikipedia.org/wiki/Random_seed\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Understanding a seed\\n\",\n    \"\\n\",\n    \"Setting a seed allows us to start from a seeded psuedorandom number generator, which means the same random numbers will show up in a series. Note, you need the seed to be in the same cell if your using jupyter to guarantee the same results each time. Getting a same set of random numbers can be important in situations where you will be trying different variations of functions and want to compare their performance on random values, but want to do it fairly (so you need the same set of random numbers each time).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import random\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"62\"\n      ]\n     },\n     \"execution_count\": 41,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.randint(0,100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 42,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10\"\n      ]\n     },\n     \"execution_count\": 42,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.randint(0,100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 45,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"74\"\n      ]\n     },\n     \"execution_count\": 45,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# The value 101 is completely arbitrary, you can pass in any number you want\\n\",\n    \"random.seed(101)\\n\",\n    \"# You can run this cell as many times as you want, it will always return the same number\\n\",\n    \"random.randint(0,100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 46,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"24\"\n      ]\n     },\n     \"execution_count\": 46,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.randint(0,100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 48,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"74\\n\",\n      \"24\\n\",\n      \"69\\n\",\n      \"45\\n\",\n      \"59\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# The value 101 is completely arbitrary, you can pass in any number you want\\n\",\n    \"random.seed(101)\\n\",\n    \"print(random.randint(0,100))\\n\",\n    \"print(random.randint(0,100))\\n\",\n    \"print(random.randint(0,100))\\n\",\n    \"print(random.randint(0,100))\\n\",\n    \"print(random.randint(0,100))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Random Integers\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 49,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"6\"\n      ]\n     },\n     \"execution_count\": 49,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.randint(0,100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Random with Sequences\\n\",\n    \"\\n\",\n    \"#### Grab a random item from a list\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 70,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"mylist = list(range(0,20))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 71,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]\"\n      ]\n     },\n     \"execution_count\": 71,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mylist\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 72,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"12\"\n      ]\n     },\n     \"execution_count\": 72,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.choice(mylist)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 73,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]\"\n      ]\n     },\n     \"execution_count\": 73,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mylist\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Sample with Replacement\\n\",\n    \"\\n\",\n    \"Take a sample size, allowing picking elements more than once. Imagine a bag of numbered lottery balls, you reach in to grab a random lotto ball, then after marking down the number, **you place it back in the bag**, then continue picking another one.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 77,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[15, 14, 17, 8, 17, 2, 19, 17, 6, 1]\"\n      ]\n     },\n     \"execution_count\": 77,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.choices(population=mylist,k=10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Sample without Replacement\\n\",\n    \"\\n\",\n    \"Once an item has been randomly picked, it can't be picked again. Imagine a bag of numbered lottery balls, you reach in to grab a random lotto ball, then after marking down the number, you **leave it out of the bag**, then continue picking another one.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 78,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[17, 19, 11, 14, 1, 3, 4, 10, 5, 15]\"\n      ]\n     },\n     \"execution_count\": 78,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.sample(population=mylist,k=10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Shuffle a list\\n\",\n    \"\\n\",\n    \"**Note: This effects the object in place!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 79,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Don't assign this to anything!\\n\",\n    \"random.shuffle(mylist)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 80,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[9, 11, 7, 12, 10, 16, 0, 2, 18, 13, 3, 5, 17, 1, 15, 6, 14, 19, 4, 8]\"\n      ]\n     },\n     \"execution_count\": 80,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mylist\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Random Distributions\\n\",\n    \"\\n\",\n    \"#### [Uniform Distribution](https://en.wikipedia.org/wiki/Uniform_distribution)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 82,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"23.852305703497635\"\n      ]\n     },\n     \"execution_count\": 82,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Continuous, random picks a value between a and b, each value has equal change of being picked.\\n\",\n    \"random.uniform(a=0,b=100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### [Normal/Gaussian Distribution](https://en.wikipedia.org/wiki/Normal_distribution)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 83,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"-0.21390381464435643\"\n      ]\n     },\n     \"execution_count\": 83,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.gauss(mu=0,sigma=1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Final Note: If you find yourself using these libraries a lot, take a look at the NumPy library for Python, covers all these capabilities with extreme efficiency. We cover this library and a lot more in our data science and machine learning courses.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/.ipynb_checkpoints/03-Math-and-Random-Module-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Math and Random Modules\\n\",\n    \"\\n\",\n    \"Python comes with a built in math module and random module. In this lecture we will give a brief tour of their capabilities. Usually you can simply look up the function call you are looking for in the online documentation.\\n\",\n    \"\\n\",\n    \"* [Math Module](https://docs.python.org/3/library/math.html)\\n\",\n    \"\\n\",\n    \"* [Random Module](https://docs.python.org/3/library/random.html)\\n\",\n    \"\\n\",\n    \"We won't go through every function available in these modules since there are so many, but we will show some useful ones.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Useful Math Functions\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import math\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Help on built-in module math:\\n\",\n      \"\\n\",\n      \"NAME\\n\",\n      \"    math\\n\",\n      \"\\n\",\n      \"DESCRIPTION\\n\",\n      \"    This module is always available.  It provides access to the\\n\",\n      \"    mathematical functions defined by the C standard.\\n\",\n      \"\\n\",\n      \"FUNCTIONS\\n\",\n      \"    acos(...)\\n\",\n      \"        acos(x)\\n\",\n      \"        \\n\",\n      \"        Return the arc cosine (measured in radians) of x.\\n\",\n      \"    \\n\",\n      \"    acosh(...)\\n\",\n      \"        acosh(x)\\n\",\n      \"        \\n\",\n      \"        Return the inverse hyperbolic cosine of x.\\n\",\n      \"    \\n\",\n      \"    asin(...)\\n\",\n      \"        asin(x)\\n\",\n      \"        \\n\",\n      \"        Return the arc sine (measured in radians) of x.\\n\",\n      \"    \\n\",\n      \"    asinh(...)\\n\",\n      \"        asinh(x)\\n\",\n      \"        \\n\",\n      \"        Return the inverse hyperbolic sine of x.\\n\",\n      \"    \\n\",\n      \"    atan(...)\\n\",\n      \"        atan(x)\\n\",\n      \"        \\n\",\n      \"        Return the arc tangent (measured in radians) of x.\\n\",\n      \"    \\n\",\n      \"    atan2(...)\\n\",\n      \"        atan2(y, x)\\n\",\n      \"        \\n\",\n      \"        Return the arc tangent (measured in radians) of y/x.\\n\",\n      \"        Unlike atan(y/x), the signs of both x and y are considered.\\n\",\n      \"    \\n\",\n      \"    atanh(...)\\n\",\n      \"        atanh(x)\\n\",\n      \"        \\n\",\n      \"        Return the inverse hyperbolic tangent of x.\\n\",\n      \"    \\n\",\n      \"    ceil(...)\\n\",\n      \"        ceil(x)\\n\",\n      \"        \\n\",\n      \"        Return the ceiling of x as an Integral.\\n\",\n      \"        This is the smallest integer >= x.\\n\",\n      \"    \\n\",\n      \"    copysign(...)\\n\",\n      \"        copysign(x, y)\\n\",\n      \"        \\n\",\n      \"        Return a float with the magnitude (absolute value) of x but the sign \\n\",\n      \"        of y. On platforms that support signed zeros, copysign(1.0, -0.0) \\n\",\n      \"        returns -1.0.\\n\",\n      \"    \\n\",\n      \"    cos(...)\\n\",\n      \"        cos(x)\\n\",\n      \"        \\n\",\n      \"        Return the cosine of x (measured in radians).\\n\",\n      \"    \\n\",\n      \"    cosh(...)\\n\",\n      \"        cosh(x)\\n\",\n      \"        \\n\",\n      \"        Return the hyperbolic cosine of x.\\n\",\n      \"    \\n\",\n      \"    degrees(...)\\n\",\n      \"        degrees(x)\\n\",\n      \"        \\n\",\n      \"        Convert angle x from radians to degrees.\\n\",\n      \"    \\n\",\n      \"    erf(...)\\n\",\n      \"        erf(x)\\n\",\n      \"        \\n\",\n      \"        Error function at x.\\n\",\n      \"    \\n\",\n      \"    erfc(...)\\n\",\n      \"        erfc(x)\\n\",\n      \"        \\n\",\n      \"        Complementary error function at x.\\n\",\n      \"    \\n\",\n      \"    exp(...)\\n\",\n      \"        exp(x)\\n\",\n      \"        \\n\",\n      \"        Return e raised to the power of x.\\n\",\n      \"    \\n\",\n      \"    expm1(...)\\n\",\n      \"        expm1(x)\\n\",\n      \"        \\n\",\n      \"        Return exp(x)-1.\\n\",\n      \"        This function avoids the loss of precision involved in the direct evaluation of exp(x)-1 for small x.\\n\",\n      \"    \\n\",\n      \"    fabs(...)\\n\",\n      \"        fabs(x)\\n\",\n      \"        \\n\",\n      \"        Return the absolute value of the float x.\\n\",\n      \"    \\n\",\n      \"    factorial(...)\\n\",\n      \"        factorial(x) -> Integral\\n\",\n      \"        \\n\",\n      \"        Find x!. Raise a ValueError if x is negative or non-integral.\\n\",\n      \"    \\n\",\n      \"    floor(...)\\n\",\n      \"        floor(x)\\n\",\n      \"        \\n\",\n      \"        Return the floor of x as an Integral.\\n\",\n      \"        This is the largest integer <= x.\\n\",\n      \"    \\n\",\n      \"    fmod(...)\\n\",\n      \"        fmod(x, y)\\n\",\n      \"        \\n\",\n      \"        Return fmod(x, y), according to platform C.  x % y may differ.\\n\",\n      \"    \\n\",\n      \"    frexp(...)\\n\",\n      \"        frexp(x)\\n\",\n      \"        \\n\",\n      \"        Return the mantissa and exponent of x, as pair (m, e).\\n\",\n      \"        m is a float and e is an int, such that x = m * 2.**e.\\n\",\n      \"        If x is 0, m and e are both 0.  Else 0.5 <= abs(m) < 1.0.\\n\",\n      \"    \\n\",\n      \"    fsum(...)\\n\",\n      \"        fsum(iterable)\\n\",\n      \"        \\n\",\n      \"        Return an accurate floating point sum of values in the iterable.\\n\",\n      \"        Assumes IEEE-754 floating point arithmetic.\\n\",\n      \"    \\n\",\n      \"    gamma(...)\\n\",\n      \"        gamma(x)\\n\",\n      \"        \\n\",\n      \"        Gamma function at x.\\n\",\n      \"    \\n\",\n      \"    gcd(...)\\n\",\n      \"        gcd(x, y) -> int\\n\",\n      \"        greatest common divisor of x and y\\n\",\n      \"    \\n\",\n      \"    hypot(...)\\n\",\n      \"        hypot(x, y)\\n\",\n      \"        \\n\",\n      \"        Return the Euclidean distance, sqrt(x*x + y*y).\\n\",\n      \"    \\n\",\n      \"    isclose(...)\\n\",\n      \"        isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0) -> bool\\n\",\n      \"        \\n\",\n      \"        Determine whether two floating point numbers are close in value.\\n\",\n      \"        \\n\",\n      \"           rel_tol\\n\",\n      \"               maximum difference for being considered \\\"close\\\", relative to the\\n\",\n      \"               magnitude of the input values\\n\",\n      \"            abs_tol\\n\",\n      \"               maximum difference for being considered \\\"close\\\", regardless of the\\n\",\n      \"               magnitude of the input values\\n\",\n      \"        \\n\",\n      \"        Return True if a is close in value to b, and False otherwise.\\n\",\n      \"        \\n\",\n      \"        For the values to be considered close, the difference between them\\n\",\n      \"        must be smaller than at least one of the tolerances.\\n\",\n      \"        \\n\",\n      \"        -inf, inf and NaN behave similarly to the IEEE 754 Standard.  That\\n\",\n      \"        is, NaN is not close to anything, even itself.  inf and -inf are\\n\",\n      \"        only close to themselves.\\n\",\n      \"    \\n\",\n      \"    isfinite(...)\\n\",\n      \"        isfinite(x) -> bool\\n\",\n      \"        \\n\",\n      \"        Return True if x is neither an infinity nor a NaN, and False otherwise.\\n\",\n      \"    \\n\",\n      \"    isinf(...)\\n\",\n      \"        isinf(x) -> bool\\n\",\n      \"        \\n\",\n      \"        Return True if x is a positive or negative infinity, and False otherwise.\\n\",\n      \"    \\n\",\n      \"    isnan(...)\\n\",\n      \"        isnan(x) -> bool\\n\",\n      \"        \\n\",\n      \"        Return True if x is a NaN (not a number), and False otherwise.\\n\",\n      \"    \\n\",\n      \"    ldexp(...)\\n\",\n      \"        ldexp(x, i)\\n\",\n      \"        \\n\",\n      \"        Return x * (2**i).\\n\",\n      \"    \\n\",\n      \"    lgamma(...)\\n\",\n      \"        lgamma(x)\\n\",\n      \"        \\n\",\n      \"        Natural logarithm of absolute value of Gamma function at x.\\n\",\n      \"    \\n\",\n      \"    log(...)\\n\",\n      \"        log(x[, base])\\n\",\n      \"        \\n\",\n      \"        Return the logarithm of x to the given base.\\n\",\n      \"        If the base not specified, returns the natural logarithm (base e) of x.\\n\",\n      \"    \\n\",\n      \"    log10(...)\\n\",\n      \"        log10(x)\\n\",\n      \"        \\n\",\n      \"        Return the base 10 logarithm of x.\\n\",\n      \"    \\n\",\n      \"    log1p(...)\\n\",\n      \"        log1p(x)\\n\",\n      \"        \\n\",\n      \"        Return the natural logarithm of 1+x (base e).\\n\",\n      \"        The result is computed in a way which is accurate for x near zero.\\n\",\n      \"    \\n\",\n      \"    log2(...)\\n\",\n      \"        log2(x)\\n\",\n      \"        \\n\",\n      \"        Return the base 2 logarithm of x.\\n\",\n      \"    \\n\",\n      \"    modf(...)\\n\",\n      \"        modf(x)\\n\",\n      \"        \\n\",\n      \"        Return the fractional and integer parts of x.  Both results carry the sign\\n\",\n      \"        of x and are floats.\\n\",\n      \"    \\n\",\n      \"    pow(...)\\n\",\n      \"        pow(x, y)\\n\",\n      \"        \\n\",\n      \"        Return x**y (x to the power of y).\\n\",\n      \"    \\n\",\n      \"    radians(...)\\n\",\n      \"        radians(x)\\n\",\n      \"        \\n\",\n      \"        Convert angle x from degrees to radians.\\n\",\n      \"    \\n\",\n      \"    sin(...)\\n\",\n      \"        sin(x)\\n\",\n      \"        \\n\",\n      \"        Return the sine of x (measured in radians).\\n\",\n      \"    \\n\",\n      \"    sinh(...)\\n\",\n      \"        sinh(x)\\n\",\n      \"        \\n\",\n      \"        Return the hyperbolic sine of x.\\n\",\n      \"    \\n\",\n      \"    sqrt(...)\\n\",\n      \"        sqrt(x)\\n\",\n      \"        \\n\",\n      \"        Return the square root of x.\\n\",\n      \"    \\n\",\n      \"    tan(...)\\n\",\n      \"        tan(x)\\n\",\n      \"        \\n\",\n      \"        Return the tangent of x (measured in radians).\\n\",\n      \"    \\n\",\n      \"    tanh(...)\\n\",\n      \"        tanh(x)\\n\",\n      \"        \\n\",\n      \"        Return the hyperbolic tangent of x.\\n\",\n      \"    \\n\",\n      \"    trunc(...)\\n\",\n      \"        trunc(x:Real) -> Integral\\n\",\n      \"        \\n\",\n      \"        Truncates x to the nearest Integral toward 0. Uses the __trunc__ magic method.\\n\",\n      \"\\n\",\n      \"DATA\\n\",\n      \"    e = 2.718281828459045\\n\",\n      \"    inf = inf\\n\",\n      \"    nan = nan\\n\",\n      \"    pi = 3.141592653589793\\n\",\n      \"    tau = 6.283185307179586\\n\",\n      \"\\n\",\n      \"FILE\\n\",\n      \"    (built-in)\\n\",\n      \"\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"help(math)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Rounding Numbers\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"value = 4.35\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.floor(value)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"5\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.ceil(value)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"round(value)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Mathematical Constants\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3.141592653589793\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.pi\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from math import pi\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3.141592653589793\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"pi\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2.718281828459045\"\n      ]\n     },\n     \"execution_count\": 23,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.e\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"6.283185307179586\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.tau\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"inf\"\n      ]\n     },\n     \"execution_count\": 25,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.inf\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"nan\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.nan\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Logarithmic Values\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2.718281828459045\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.e\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1.0\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Log Base e\\n\",\n    \"math.log(math.e)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"ValueError\",\n     \"evalue\": \"math domain error\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mValueError\\u001b[0m                                Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-12-7563e0a48092>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mmath\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mlog\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;36m0\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mValueError\\u001b[0m: math domain error\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Will produce an error if value does not exist mathmatically\\n\",\n    \"math.log(0)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2.302585092994046\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.log(10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10.000000000000002\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.e ** 2.302585092994046\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Custom Base\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2.0\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# math.log(x,base)\\n\",\n    \"math.log(100,10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"100\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"10**2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Trigonometrics Functions\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"-0.5440211108893698\"\n      ]\n     },\n     \"execution_count\": 30,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Radians\\n\",\n    \"math.sin(10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"90.0\"\n      ]\n     },\n     \"execution_count\": 31,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.degrees(pi/2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3.141592653589793\"\n      ]\n     },\n     \"execution_count\": 32,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.radians(180)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Random Module\\n\",\n    \"\\n\",\n    \"Random Module allows us to create random numbers. We can even set a seed to produce the same random set every time.\\n\",\n    \"\\n\",\n    \"The explanation of how a computer attempts to generate random numbers is beyond the scope of this course since it involves higher level mathmatics. But if you are interested in this topic check out:\\n\",\n    \"* https://en.wikipedia.org/wiki/Pseudorandom_number_generator\\n\",\n    \"* https://en.wikipedia.org/wiki/Random_seed\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Understanding a seed\\n\",\n    \"\\n\",\n    \"Setting a seed allows us to start from a seeded psuedorandom number generator, which means the same random numbers will show up in a series. Note, you need the seed to be in the same cell if your using jupyter to guarantee the same results each time. Getting a same set of random numbers can be important in situations where you will be trying different variations of functions and want to compare their performance on random values, but want to do it fairly (so you need the same set of random numbers each time).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import random\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"62\"\n      ]\n     },\n     \"execution_count\": 41,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.randint(0,100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 42,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10\"\n      ]\n     },\n     \"execution_count\": 42,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.randint(0,100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 45,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"74\"\n      ]\n     },\n     \"execution_count\": 45,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# The value 101 is completely arbitrary, you can pass in any number you want\\n\",\n    \"random.seed(101)\\n\",\n    \"# You can run this cell as many times as you want, it will always return the same number\\n\",\n    \"random.randint(0,100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 46,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"24\"\n      ]\n     },\n     \"execution_count\": 46,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.randint(0,100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 48,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"74\\n\",\n      \"24\\n\",\n      \"69\\n\",\n      \"45\\n\",\n      \"59\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# The value 101 is completely arbitrary, you can pass in any number you want\\n\",\n    \"random.seed(101)\\n\",\n    \"print(random.randint(0,100))\\n\",\n    \"print(random.randint(0,100))\\n\",\n    \"print(random.randint(0,100))\\n\",\n    \"print(random.randint(0,100))\\n\",\n    \"print(random.randint(0,100))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Random Integers\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 49,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"6\"\n      ]\n     },\n     \"execution_count\": 49,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.randint(0,100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Random with Sequences\\n\",\n    \"\\n\",\n    \"#### Grab a random item from a list\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 70,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"mylist = list(range(0,20))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 71,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]\"\n      ]\n     },\n     \"execution_count\": 71,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mylist\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 72,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"12\"\n      ]\n     },\n     \"execution_count\": 72,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.choice(mylist)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 73,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]\"\n      ]\n     },\n     \"execution_count\": 73,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mylist\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Sample with Replacement\\n\",\n    \"\\n\",\n    \"Take a sample size, allowing picking elements more than once. Imagine a bag of numbered lottery balls, you reach in to grab a random lotto ball, then after marking down the number, **you place it back in the bag**, then continue picking another one.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 77,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[15, 14, 17, 8, 17, 2, 19, 17, 6, 1]\"\n      ]\n     },\n     \"execution_count\": 77,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.choices(population=mylist,k=10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Sample without Replacement\\n\",\n    \"\\n\",\n    \"Once an item has been randomly picked, it can't be picked again. Imagine a bag of numbered lottery balls, you reach in to grab a random lotto ball, then after marking down the number, you **leave it out of the bag**, then continue picking another one.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 78,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[17, 19, 11, 14, 1, 3, 4, 10, 5, 15]\"\n      ]\n     },\n     \"execution_count\": 78,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.sample(population=mylist,k=10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Shuffle a list\\n\",\n    \"\\n\",\n    \"**Note: This effects the object in place!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 79,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Don't assign this to anything!\\n\",\n    \"random.shuffle(mylist)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 80,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[9, 11, 7, 12, 10, 16, 0, 2, 18, 13, 3, 5, 17, 1, 15, 6, 14, 19, 4, 8]\"\n      ]\n     },\n     \"execution_count\": 80,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mylist\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Random Distributions\\n\",\n    \"\\n\",\n    \"#### [Uniform Distribution](https://en.wikipedia.org/wiki/Uniform_distribution)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 82,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"23.852305703497635\"\n      ]\n     },\n     \"execution_count\": 82,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Continuous, random picks a value between a and b, each value has equal change of being picked.\\n\",\n    \"random.uniform(a=0,b=100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### [Normal/Gaussian Distribution](https://en.wikipedia.org/wiki/Normal_distribution)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 83,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"-0.21390381464435643\"\n      ]\n     },\n     \"execution_count\": 83,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.gauss(mu=0,sigma=1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Final Note: If you find yourself using these libraries a lot, take a look at the NumPy library for Python, covers all these capabilities with extreme efficiency. We cover this library and a lot more in our data science and machine learning courses.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/.ipynb_checkpoints/03-Python Debugger (pdb)-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Python Debugger\\n\",\n    \"\\n\",\n    \"You've probably used a variety of print statements to try to find errors in your code. A better way of doing this is by using Python's built-in debugger module (pdb). The pdb module implements an interactive debugging environment for Python programs. It includes features to let you pause your program, look at the values of variables, and watch program execution step-by-step, so you can understand what your program actually does and find bugs in the logic.\\n\",\n    \"\\n\",\n    \"This is a bit difficult to show since it requires creating an error on purpose, but hopefully this simple example illustrates the power of the pdb module. <br>*Note: Keep in mind it would be pretty unusual to use pdb in an Jupyter Notebook setting.*\\n\",\n    \"\\n\",\n    \"___\\n\",\n    \"Here we will create an error on purpose, trying to add a list to an integer\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"5\\n\"\n     ]\n    },\n    {\n     \"ename\": \"TypeError\",\n     \"evalue\": \"unsupported operand type(s) for +: 'int' and 'list'\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mTypeError\\u001b[0m                                 Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-1-905e8cfe6928>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      5\\u001b[0m \\u001b[0mresult\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[0my\\u001b[0m \\u001b[1;33m+\\u001b[0m \\u001b[0mz\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m      6\\u001b[0m \\u001b[0mprint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mresult\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m----> 7\\u001b[1;33m \\u001b[0mresult2\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[0my\\u001b[0m\\u001b[1;33m+\\u001b[0m\\u001b[0mx\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[0;32m      8\\u001b[0m \\u001b[0mprint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mresult2\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[1;31mTypeError\\u001b[0m: unsupported operand type(s) for +: 'int' and 'list'\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = [1,3,4]\\n\",\n    \"y = 2\\n\",\n    \"z = 3\\n\",\n    \"\\n\",\n    \"result = y + z\\n\",\n    \"print(result)\\n\",\n    \"result2 = y+x\\n\",\n    \"print(result2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Hmmm, looks like we get an error! Let's implement a set_trace() using the pdb module. This will allow us to basically pause the code at the point of the trace and check if anything is wrong.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"5\\n\",\n      \"--Return--\\n\",\n      \"> <ipython-input-2-1084246755fa>(11)<module>()->None\\n\",\n      \"-> pdb.set_trace()\\n\",\n      \"(Pdb) x\\n\",\n      \"[1, 3, 4]\\n\",\n      \"(Pdb) y\\n\",\n      \"2\\n\",\n      \"(Pdb) result2\\n\",\n      \"*** NameError: name 'result2' is not defined\\n\",\n      \"(Pdb) q\\n\"\n     ]\n    },\n    {\n     \"ename\": \"BdbQuit\",\n     \"evalue\": \"\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mBdbQuit\\u001b[0m                                   Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-2-1084246755fa>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      9\\u001b[0m \\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m     10\\u001b[0m \\u001b[1;31m# Set a trace using Python Debugger\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m---> 11\\u001b[1;33m \\u001b[0mpdb\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mset_trace\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[0;32m     12\\u001b[0m \\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m     13\\u001b[0m \\u001b[0mresult2\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[0my\\u001b[0m\\u001b[1;33m+\\u001b[0m\\u001b[0mx\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[1;32mC:\\\\Users\\\\Marcial\\\\Anaconda3\\\\lib\\\\bdb.py\\u001b[0m in \\u001b[0;36mtrace_dispatch\\u001b[1;34m(self, frame, event, arg)\\u001b[0m\\n\\u001b[0;32m     53\\u001b[0m             \\u001b[1;32mreturn\\u001b[0m \\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mdispatch_call\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mframe\\u001b[0m\\u001b[1;33m,\\u001b[0m \\u001b[0marg\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m     54\\u001b[0m         \\u001b[1;32mif\\u001b[0m \\u001b[0mevent\\u001b[0m \\u001b[1;33m==\\u001b[0m \\u001b[1;34m'return'\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m---> 55\\u001b[1;33m             \\u001b[1;32mreturn\\u001b[0m \\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mdispatch_return\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mframe\\u001b[0m\\u001b[1;33m,\\u001b[0m \\u001b[0marg\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[0;32m     56\\u001b[0m         \\u001b[1;32mif\\u001b[0m \\u001b[0mevent\\u001b[0m \\u001b[1;33m==\\u001b[0m \\u001b[1;34m'exception'\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m     57\\u001b[0m             \\u001b[1;32mreturn\\u001b[0m \\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mdispatch_exception\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mframe\\u001b[0m\\u001b[1;33m,\\u001b[0m \\u001b[0marg\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[1;32mC:\\\\Users\\\\Marcial\\\\Anaconda3\\\\lib\\\\bdb.py\\u001b[0m in \\u001b[0;36mdispatch_return\\u001b[1;34m(self, frame, arg)\\u001b[0m\\n\\u001b[0;32m     97\\u001b[0m             \\u001b[1;32mfinally\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m     98\\u001b[0m                 \\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mframe_returning\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[1;32mNone\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m---> 99\\u001b[1;33m             \\u001b[1;32mif\\u001b[0m \\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mquitting\\u001b[0m\\u001b[1;33m:\\u001b[0m \\u001b[1;32mraise\\u001b[0m \\u001b[0mBdbQuit\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[0;32m    100\\u001b[0m             \\u001b[1;31m# The user issued a 'next' or 'until' command.\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m    101\\u001b[0m             \\u001b[1;32mif\\u001b[0m \\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mstopframe\\u001b[0m \\u001b[1;32mis\\u001b[0m \\u001b[0mframe\\u001b[0m \\u001b[1;32mand\\u001b[0m \\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mstoplineno\\u001b[0m \\u001b[1;33m!=\\u001b[0m \\u001b[1;33m-\\u001b[0m\\u001b[1;36m1\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[1;31mBdbQuit\\u001b[0m: \"\n     ]\n    }\n   ],\n   \"source\": [\n    \"import pdb\\n\",\n    \"\\n\",\n    \"x = [1,3,4]\\n\",\n    \"y = 2\\n\",\n    \"z = 3\\n\",\n    \"\\n\",\n    \"result = y + z\\n\",\n    \"print(result)\\n\",\n    \"\\n\",\n    \"# Set a trace using Python Debugger\\n\",\n    \"pdb.set_trace()\\n\",\n    \"\\n\",\n    \"result2 = y+x\\n\",\n    \"print(result2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now we could check what the various variables were and check for errors. You can use 'q' to quit the debugger. For more information on general debugging techniques and more methods, check out the official documentation:\\n\",\n    \"https://docs.python.org/3/library/pdb.html\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/.ipynb_checkpoints/04-Python Debugger (pdb)-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Python Debugger\\n\",\n    \"\\n\",\n    \"You've probably used a variety of print statements to try to find errors in your code. A better way of doing this is by using Python's built-in debugger module (pdb). The pdb module implements an interactive debugging environment for Python programs. It includes features to let you pause your program, look at the values of variables, and watch program execution step-by-step, so you can understand what your program actually does and find bugs in the logic.\\n\",\n    \"\\n\",\n    \"This is a bit difficult to show since it requires creating an error on purpose, but hopefully this simple example illustrates the power of the pdb module. <br>*Note: Keep in mind it would be pretty unusual to use pdb in an Jupyter Notebook setting.*\\n\",\n    \"\\n\",\n    \"___\\n\",\n    \"Here we will create an error on purpose, trying to add a list to an integer\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"5\\n\"\n     ]\n    },\n    {\n     \"ename\": \"TypeError\",\n     \"evalue\": \"unsupported operand type(s) for +: 'int' and 'list'\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mTypeError\\u001b[0m                                 Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-1-905e8cfe6928>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      5\\u001b[0m \\u001b[0mresult\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[0my\\u001b[0m \\u001b[1;33m+\\u001b[0m \\u001b[0mz\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m      6\\u001b[0m \\u001b[0mprint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mresult\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m----> 7\\u001b[1;33m \\u001b[0mresult2\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[0my\\u001b[0m\\u001b[1;33m+\\u001b[0m\\u001b[0mx\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[0;32m      8\\u001b[0m \\u001b[0mprint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mresult2\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[1;31mTypeError\\u001b[0m: unsupported operand type(s) for +: 'int' and 'list'\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = [1,3,4]\\n\",\n    \"y = 2\\n\",\n    \"z = 3\\n\",\n    \"\\n\",\n    \"result = y + z\\n\",\n    \"print(result)\\n\",\n    \"result2 = y+x\\n\",\n    \"print(result2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Hmmm, looks like we get an error! Let's implement a set_trace() using the pdb module. This will allow us to basically pause the code at the point of the trace and check if anything is wrong.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"5\\n\",\n      \"--Return--\\n\",\n      \"> <ipython-input-2-1084246755fa>(11)<module>()->None\\n\",\n      \"-> pdb.set_trace()\\n\",\n      \"(Pdb) x\\n\",\n      \"[1, 3, 4]\\n\",\n      \"(Pdb) y\\n\",\n      \"2\\n\",\n      \"(Pdb) result2\\n\",\n      \"*** NameError: name 'result2' is not defined\\n\",\n      \"(Pdb) q\\n\"\n     ]\n    },\n    {\n     \"ename\": \"BdbQuit\",\n     \"evalue\": \"\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mBdbQuit\\u001b[0m                                   Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-2-1084246755fa>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      9\\u001b[0m \\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m     10\\u001b[0m \\u001b[1;31m# Set a trace using Python Debugger\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m---> 11\\u001b[1;33m \\u001b[0mpdb\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mset_trace\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[0;32m     12\\u001b[0m \\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m     13\\u001b[0m \\u001b[0mresult2\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[0my\\u001b[0m\\u001b[1;33m+\\u001b[0m\\u001b[0mx\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[1;32mC:\\\\Users\\\\Marcial\\\\Anaconda3\\\\lib\\\\bdb.py\\u001b[0m in \\u001b[0;36mtrace_dispatch\\u001b[1;34m(self, frame, event, arg)\\u001b[0m\\n\\u001b[0;32m     53\\u001b[0m             \\u001b[1;32mreturn\\u001b[0m \\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mdispatch_call\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mframe\\u001b[0m\\u001b[1;33m,\\u001b[0m \\u001b[0marg\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m     54\\u001b[0m         \\u001b[1;32mif\\u001b[0m \\u001b[0mevent\\u001b[0m \\u001b[1;33m==\\u001b[0m \\u001b[1;34m'return'\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m---> 55\\u001b[1;33m             \\u001b[1;32mreturn\\u001b[0m \\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mdispatch_return\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mframe\\u001b[0m\\u001b[1;33m,\\u001b[0m \\u001b[0marg\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[0;32m     56\\u001b[0m         \\u001b[1;32mif\\u001b[0m \\u001b[0mevent\\u001b[0m \\u001b[1;33m==\\u001b[0m \\u001b[1;34m'exception'\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m     57\\u001b[0m             \\u001b[1;32mreturn\\u001b[0m \\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mdispatch_exception\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mframe\\u001b[0m\\u001b[1;33m,\\u001b[0m \\u001b[0marg\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[1;32mC:\\\\Users\\\\Marcial\\\\Anaconda3\\\\lib\\\\bdb.py\\u001b[0m in \\u001b[0;36mdispatch_return\\u001b[1;34m(self, frame, arg)\\u001b[0m\\n\\u001b[0;32m     97\\u001b[0m             \\u001b[1;32mfinally\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m     98\\u001b[0m                 \\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mframe_returning\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[1;32mNone\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m---> 99\\u001b[1;33m             \\u001b[1;32mif\\u001b[0m \\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mquitting\\u001b[0m\\u001b[1;33m:\\u001b[0m \\u001b[1;32mraise\\u001b[0m \\u001b[0mBdbQuit\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[0;32m    100\\u001b[0m             \\u001b[1;31m# The user issued a 'next' or 'until' command.\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m    101\\u001b[0m             \\u001b[1;32mif\\u001b[0m \\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mstopframe\\u001b[0m \\u001b[1;32mis\\u001b[0m \\u001b[0mframe\\u001b[0m \\u001b[1;32mand\\u001b[0m \\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mstoplineno\\u001b[0m \\u001b[1;33m!=\\u001b[0m \\u001b[1;33m-\\u001b[0m\\u001b[1;36m1\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[1;31mBdbQuit\\u001b[0m: \"\n     ]\n    }\n   ],\n   \"source\": [\n    \"import pdb\\n\",\n    \"\\n\",\n    \"x = [1,3,4]\\n\",\n    \"y = 2\\n\",\n    \"z = 3\\n\",\n    \"\\n\",\n    \"result = y + z\\n\",\n    \"print(result)\\n\",\n    \"\\n\",\n    \"# Set a trace using Python Debugger\\n\",\n    \"pdb.set_trace()\\n\",\n    \"\\n\",\n    \"result2 = y+x\\n\",\n    \"print(result2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now we could check what the various variables were and check for errors. You can use 'q' to quit the debugger. For more information on general debugging techniques and more methods, check out the official documentation:\\n\",\n    \"https://docs.python.org/3/library/pdb.html\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/.ipynb_checkpoints/04-Timing your code - timeit-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Timing your code\\n\",\n    \"Sometimes it's important to know how long your code is taking to run, or at least know if a particular line of code is slowing down your entire project. Python has a built-in timing module to do this. \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example Function or Script\\n\",\n    \"\\n\",\n    \"Here we have two functions that do the same thing, but in different ways.\\n\",\n    \"How can we tell which one is more efficient? Let's time it!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def func_one(n):\\n\",\n    \"    '''\\n\",\n    \"    Given a number n, returns a list of string integers\\n\",\n    \"    ['0','1','2',...'n]\\n\",\n    \"    '''\\n\",\n    \"    return [str(num) for num in range(n)]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"func_one(10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def func_two(n):\\n\",\n    \"    '''\\n\",\n    \"    Given a number n, returns a list of string integers\\n\",\n    \"    ['0','1','2',...'n]\\n\",\n    \"    '''\\n\",\n    \"    return list(map(str,range(n)))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"func_two(10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Timing Start and Stop\\n\",\n    \"\\n\",\n    \"We can try using the time module to simply calculate the elapsed time for the code. Keep in mind, due to the time module's precision, the code needs to take **at least** 0.1 seconds to complete.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 57,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import time\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 58,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# STEP 1: Get start time\\n\",\n    \"start_time = time.time()\\n\",\n    \"# Step 2: Run your code you want to time\\n\",\n    \"result = func_one(1000000)\\n\",\n    \"# Step 3: Calculate total time elapsed\\n\",\n    \"end_time = time.time() - start_time\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 59,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.18550348281860352\"\n      ]\n     },\n     \"execution_count\": 59,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"end_time\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 60,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# STEP 1: Get start time\\n\",\n    \"start_time = time.time()\\n\",\n    \"# Step 2: Run your code you want to time\\n\",\n    \"result = func_two(1000000)\\n\",\n    \"# Step 3: Calculate total time elapsed\\n\",\n    \"end_time = time.time() - start_time\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 61,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.1496279239654541\"\n      ]\n     },\n     \"execution_count\": 61,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"end_time\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Timeit Module\\n\",\n    \"\\n\",\n    \"What if we have two blocks of code that are quite fast, the difference from the time.time() method may not be enough to tell which is fater. In this case, we can use the timeit module.\\n\",\n    \"\\n\",\n    \"The timeit module takes in two strings, a statement (stmt) and a setup. It then runs the setup code and runs the stmt code some n number of times and reports back average length of time it took.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import timeit\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The setup (anything that needs to be defined beforehand, such as def functions.)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"setup = '''\\n\",\n    \"def func_one(n):\\n\",\n    \"    return [str(num) for num in range(n)]\\n\",\n    \"'''\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 40,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"stmt = 'func_one(100)'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1.3161248000000114\"\n      ]\n     },\n     \"execution_count\": 41,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"timeit.timeit(stmt,setup,number=100000)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now let try running func_two 10,000 times and compare the length of time it took.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 42,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"setup2 = '''\\n\",\n    \"def func_two(n):\\n\",\n    \"    return list(map(str,range(n)))\\n\",\n    \"'''\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 43,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"stmt2 = 'func_two(100)'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 44,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1.0892171000000417\"\n      ]\n     },\n     \"execution_count\": 44,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"timeit.timeit(stmt2,setup2,number=100000)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"It looks like func_two is more efficient. You can specify more number of runs if you want to clarify the different for fast performing functions.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 45,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"13.129837899999984\"\n      ]\n     },\n     \"execution_count\": 45,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"timeit.timeit(stmt,setup,number=1000000)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 46,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10.894090699999992\"\n      ]\n     },\n     \"execution_count\": 46,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"timeit.timeit(stmt2,setup2,number=1000000)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Timing you code with Jupyter \\\"magic\\\" method\\n\",\n    \"\\n\",\n    \"**NOTE: This method is ONLY available in Jupyter and the magic command needs to be at the top of the cell with nothing above it (not even commented code)**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 63,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"100000 loops, best of 3: 13.4 µs per loop\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%timeit\\n\",\n    \"func_one(100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 64,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"100000 loops, best of 3: 10.9 µs per loop\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%timeit\\n\",\n    \"func_two(100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Check out the documentation for more information:\\n\",\n    \"https://docs.python.org/3/library/timeit.html\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/.ipynb_checkpoints/05-Overview-of-Regular-Expressions-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Overview of Regular Expressions\\n\",\n    \"\\n\",\n    \"Regular Expressions (sometimes called regex for short) allows a user to search for strings using almost any sort of rule they can come up. For example, finding all capital letters in a string, or finding a phone number in a document. \\n\",\n    \"\\n\",\n    \"Regular expressions are notorious for their seemingly strange syntax. This strange syntax is a byproduct of their flexibility. Regular expressions have to be able to filter out any string pattern you can imagine, which is why they have a complex string pattern format.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's begin by explaining how to search for basic patterns in a string!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Searching for Basic Patterns\\n\",\n    \"\\n\",\n    \"Let's imagine that we have the following string:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"text = \\\"The person's phone number is 408-555-1234. Call soon!\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We'll start off by trying to find out if the string \\\"phone\\\" is inside the text string. Now we could quickly do this with:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"'phone' in text\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"But let's show the format for regular expressions, because later on we will be searching for patterns that won't have such a simple solution.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import re\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pattern = 'phone'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<_sre.SRE_Match object; span=(13, 18), match='phone'>\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.search(pattern,text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pattern = \\\"NOT IN TEXT\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"re.search(pattern,text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we've seen that re.search() will take the pattern, scan the text, and then returns a Match object. If no pattern is found, a None is returned (in Jupyter Notebook this just means that nothing is output below the cell).\\n\",\n    \"\\n\",\n    \"Let's take a closer look at this Match object.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pattern = 'phone'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"match = re.search(pattern,text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<_sre.SRE_Match object; span=(13, 18), match='phone'>\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"match\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice the span, there is also a start and end index information.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(13, 18)\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"match.span()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"13\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"match.start()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"18\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"match.end()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"But what if the pattern occurs more than once?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"text = \\\"my phone is a new phone\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"match = re.search(\\\"phone\\\",text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(3, 8)\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"match.span()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice it only matches the first instance. If we wanted a list of all matches, we can use .findall() method:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"matches = re.findall(\\\"phone\\\",text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['phone', 'phone']\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"matches\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(matches)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"To get actual match objects, use the iterator:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"(3, 8)\\n\",\n      \"(18, 23)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for match in re.finditer(\\\"phone\\\",text):\\n\",\n    \"    print(match.span())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you wanted the actual text that matched, you can use the .group() method.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'phone'\"\n      ]\n     },\n     \"execution_count\": 21,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"match.group()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Patterns\\n\",\n    \"\\n\",\n    \"So far we've learned how to search for a basic string. What about more complex examples? Such as trying to find a telephone number in a large string of text? Or an email address?\\n\",\n    \"\\n\",\n    \"We could just use search method if we know the exact phone or email, but what if we don't know it? We may know the general format, and we can use that along with regular expressions to search the document for strings that match a particular pattern.\\n\",\n    \"\\n\",\n    \"This is where the syntax may appear strange at first, but take your time with this, often its just a matter of looking up the pattern code.\\n\",\n    \"\\n\",\n    \"Let' begin!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Identifiers for Characters in Patterns\\n\",\n    \"\\n\",\n    \"Characters such as a digit or a single string have different codes that represent them. You can use these to build up a pattern string. Notice how these make heavy use of the backwards slash \\\\ . Because of this when defining a pattern string for regular expression we use the format:\\n\",\n    \"\\n\",\n    \"    r'mypattern'\\n\",\n    \"    \\n\",\n    \"placing the r in front of the string allows python to understand that the \\\\ in the pattern string are not meant to be escape slashes.\\n\",\n    \"\\n\",\n    \"Below you can find a table of all the possible identifiers:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<table ><tr><th>Character</th><th>Description</th><th>Example Pattern Code</th><th >Exammple Match</th></tr>\\n\",\n    \"\\n\",\n    \"<tr ><td><span >\\\\d</span></td><td>A digit</td><td>file_\\\\d\\\\d</td><td>file_25</td></tr>\\n\",\n    \"\\n\",\n    \"<tr ><td><span >\\\\w</span></td><td>Alphanumeric</td><td>\\\\w-\\\\w\\\\w\\\\w</td><td>A-b_1</td></tr>\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"<tr ><td><span >\\\\s</span></td><td>White space</td><td>a\\\\sb\\\\sc</td><td>a b c</td></tr>\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"<tr ><td><span >\\\\D</span></td><td>A non digit</td><td>\\\\D\\\\D\\\\D</td><td>ABC</td></tr>\\n\",\n    \"\\n\",\n    \"<tr ><td><span >\\\\W</span></td><td>Non-alphanumeric</td><td>\\\\W\\\\W\\\\W\\\\W\\\\W</td><td>*-+=)</td></tr>\\n\",\n    \"\\n\",\n    \"<tr ><td><span >\\\\S</span></td><td>Non-whitespace</td><td>\\\\S\\\\S\\\\S\\\\S</td><td>Yoyo</td></tr></table>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"text = \\\"My telephone number is 408-555-1234\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"phone = re.search(r'\\\\d\\\\d\\\\d-\\\\d\\\\d\\\\d-\\\\d\\\\d\\\\d\\\\d',text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'408-555-1234'\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"phone.group()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice the repetition of \\\\d. That is a bit of an annoyance, especially if we are looking for very long strings of numbers. Let's explore the possible quantifiers.\\n\",\n    \"\\n\",\n    \"## Quantifiers\\n\",\n    \"\\n\",\n    \"Now that we know the special character designations, we can use them along with quantifiers to define how many we expect.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<table ><tr><th>Character</th><th>Description</th><th>Example Pattern Code</th><th >Exammple Match</th></tr>\\n\",\n    \"\\n\",\n    \"<tr ><td><span >+</span></td><td>Occurs one or more times</td><td>\\tVersion \\\\w-\\\\w+</td><td>Version A-b1_1</td></tr>\\n\",\n    \"\\n\",\n    \"<tr ><td><span >{3}</span></td><td>Occurs exactly 3 times</td><td>\\\\D{3}</td><td>abc</td></tr>\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"<tr ><td><span >{2,4}</span></td><td>Occurs 2 to 4 times</td><td>\\\\d{2,4}</td><td>123</td></tr>\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"<tr ><td><span >{3,}</span></td><td>Occurs 3 or more</td><td>\\\\w{3,}</td><td>anycharacters</td></tr>\\n\",\n    \"\\n\",\n    \"<tr ><td><span >\\\\*</span></td><td>Occurs zero or more times</td><td>A\\\\*B\\\\*C*</td><td>AAACC</td></tr>\\n\",\n    \"\\n\",\n    \"<tr ><td><span >?</span></td><td>Once or none</td><td>plurals?</td><td>plural</td></tr></table>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's rewrite our pattern using these quantifiers:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<_sre.SRE_Match object; span=(23, 35), match='408-555-1234'>\"\n      ]\n     },\n     \"execution_count\": 25,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.search(r'\\\\d{3}-\\\\d{3}-\\\\d{4}',text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Groups\\n\",\n    \"\\n\",\n    \"What if we wanted to do two tasks, find phone numbers, but also be able to quickly extract their area code (the first three digits). We can use groups for any general task that involves grouping together regular expressions (so that we can later break them down). \\n\",\n    \"\\n\",\n    \"Using the phone number example, we can separate groups of regular expressions using parenthesis:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"phone_pattern = re.compile(r'(\\\\d{3})-(\\\\d{3})-(\\\\d{4})')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"results = re.search(phone_pattern,text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'408-555-1234'\"\n      ]\n     },\n     \"execution_count\": 28,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# The entire result\\n\",\n    \"results.group()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'408'\"\n      ]\n     },\n     \"execution_count\": 29,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Can then also call by group position.\\n\",\n    \"# remember groups were separated by parenthesis ()\\n\",\n    \"# Something to note is that group ordering starts at 1. Passing in 0 returns everything\\n\",\n    \"results.group(1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'555'\"\n      ]\n     },\n     \"execution_count\": 30,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"results.group(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'1234'\"\n      ]\n     },\n     \"execution_count\": 31,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"results.group(3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"IndexError\",\n     \"evalue\": \"no such group\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mIndexError\\u001b[0m                                Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-32-866de7a94a57>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      1\\u001b[0m \\u001b[1;31m# We only had three groups of parenthesis\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m----> 2\\u001b[1;33m \\u001b[0mresults\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mgroup\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;36m4\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mIndexError\\u001b[0m: no such group\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# We only had three groups of parenthesis\\n\",\n    \"results.group(4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Additional Regex Syntax\\n\",\n    \"\\n\",\n    \"### Or operator |\\n\",\n    \"\\n\",\n    \"Use the pipe operator to have an **or** statment. For example\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<_sre.SRE_Match object; span=(5, 8), match='man'>\"\n      ]\n     },\n     \"execution_count\": 33,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.search(r\\\"man|woman\\\",\\\"This man was here.\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<_sre.SRE_Match object; span=(5, 10), match='woman'>\"\n      ]\n     },\n     \"execution_count\": 34,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.search(r\\\"man|woman\\\",\\\"This woman was here.\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### The Wildcard Character\\n\",\n    \"\\n\",\n    \"Use a \\\"wildcard\\\" as a placement that will match any character placed there. You can use a simple period **.** for this. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['cat', 'hat', 'sat']\"\n      ]\n     },\n     \"execution_count\": 35,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.findall(r\\\".at\\\",\\\"The cat in the hat sat here.\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['bat', 'lat']\"\n      ]\n     },\n     \"execution_count\": 36,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.findall(r\\\".at\\\",\\\"The bat went splat\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice how we only matched the first 3 letters, that is because we need a **.** for each wildcard letter. Or use the quantifiers described above to set its own rules.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['e bat', 'splat']\"\n      ]\n     },\n     \"execution_count\": 37,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.findall(r\\\"...at\\\",\\\"The bat went splat\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"However this still leads the problem to grabbing more beforehand. Really we only want words that end with \\\"at\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 38,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['bat', 'splat']\"\n      ]\n     },\n     \"execution_count\": 38,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# One or more non-whitespace that ends with 'at'\\n\",\n    \"re.findall(r'\\\\S+at',\\\"The bat went splat\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Starts with and Ends With\\n\",\n    \"\\n\",\n    \"We can use the **^** to signal starts with, and the **$** to signal ends with:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['2']\"\n      ]\n     },\n     \"execution_count\": 39,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Ends with a number\\n\",\n    \"re.findall(r'\\\\d$','This ends with a number 2')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 40,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['1']\"\n      ]\n     },\n     \"execution_count\": 40,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Starts with a number\\n\",\n    \"re.findall(r'^\\\\d','1 is the loneliest number.')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note that this is for the entire string, not individual words!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Exclusion\\n\",\n    \"\\n\",\n    \"To exclude characters, we can use the **^** symbol in conjunction with a set of brackets **[]**. Anything inside the brackets is excluded. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"phrase = \\\"there are 3 numbers 34 inside 5 this sentence.\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 42,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['t',\\n\",\n       \" 'h',\\n\",\n       \" 'e',\\n\",\n       \" 'r',\\n\",\n       \" 'e',\\n\",\n       \" ' ',\\n\",\n       \" 'a',\\n\",\n       \" 'r',\\n\",\n       \" 'e',\\n\",\n       \" ' ',\\n\",\n       \" ' ',\\n\",\n       \" 'n',\\n\",\n       \" 'u',\\n\",\n       \" 'm',\\n\",\n       \" 'b',\\n\",\n       \" 'e',\\n\",\n       \" 'r',\\n\",\n       \" 's',\\n\",\n       \" ' ',\\n\",\n       \" ' ',\\n\",\n       \" 'i',\\n\",\n       \" 'n',\\n\",\n       \" 's',\\n\",\n       \" 'i',\\n\",\n       \" 'd',\\n\",\n       \" 'e',\\n\",\n       \" ' ',\\n\",\n       \" ' ',\\n\",\n       \" 't',\\n\",\n       \" 'h',\\n\",\n       \" 'i',\\n\",\n       \" 's',\\n\",\n       \" ' ',\\n\",\n       \" 's',\\n\",\n       \" 'e',\\n\",\n       \" 'n',\\n\",\n       \" 't',\\n\",\n       \" 'e',\\n\",\n       \" 'n',\\n\",\n       \" 'c',\\n\",\n       \" 'e',\\n\",\n       \" '.']\"\n      ]\n     },\n     \"execution_count\": 42,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.findall(r'[^\\\\d]',phrase)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"To get the words back together, use a + sign \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 43,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['there are ', ' numbers ', ' inside ', ' this sentence.']\"\n      ]\n     },\n     \"execution_count\": 43,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.findall(r'[^\\\\d]+',phrase)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can use this to remove punctuation from a sentence.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 44,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"test_phrase = 'This is a string! But it has punctuation. How can we remove it?'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 45,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['This',\\n\",\n       \" 'is',\\n\",\n       \" 'a',\\n\",\n       \" 'string',\\n\",\n       \" 'But',\\n\",\n       \" 'it',\\n\",\n       \" 'has',\\n\",\n       \" 'punctuation',\\n\",\n       \" 'How',\\n\",\n       \" 'can',\\n\",\n       \" 'we',\\n\",\n       \" 'remove',\\n\",\n       \" 'it']\"\n      ]\n     },\n     \"execution_count\": 45,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.findall('[^!.? ]+',test_phrase)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 46,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"clean = ' '.join(re.findall('[^!.? ]+',test_phrase))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 47,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'This is a string But it has punctuation How can we remove it'\"\n      ]\n     },\n     \"execution_count\": 47,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"clean\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Brackets for Grouping\\n\",\n    \"\\n\",\n    \"As we showed above we can use brackets to group together options, for example if we wanted to find hyphenated words:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 48,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"text = 'Only find the hypen-words in this sentence. But you do not know how long-ish they are'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 49,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['hypen-words', 'long-ish']\"\n      ]\n     },\n     \"execution_count\": 49,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.findall(r'[\\\\w]+-[\\\\w]+',text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Parenthesis for Multiple Options\\n\",\n    \"\\n\",\n    \"If we have multiple options for matching, we can use parenthesis to list out these options. For Example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 50,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Find words that start with cat and end with one of these options: 'fish','nap', or 'claw'\\n\",\n    \"text = 'Hello, would you like some catfish?'\\n\",\n    \"texttwo = \\\"Hello, would you like to take a catnap?\\\"\\n\",\n    \"textthree = \\\"Hello, have you seen this caterpillar?\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 51,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<_sre.SRE_Match object; span=(27, 34), match='catfish'>\"\n      ]\n     },\n     \"execution_count\": 51,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.search(r'cat(fish|nap|claw)',text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 52,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<_sre.SRE_Match object; span=(32, 38), match='catnap'>\"\n      ]\n     },\n     \"execution_count\": 52,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.search(r'cat(fish|nap|claw)',texttwo)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 53,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# None returned\\n\",\n    \"re.search(r'cat(fish|nap|claw)',textthree)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Conclusion\\n\",\n    \"\\n\",\n    \"Excellent work! For full information on all possible patterns, check out: https://docs.python.org/3/howto/regex.html\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/.ipynb_checkpoints/06-Timing your code - timeit-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Timing your code\\n\",\n    \"Sometimes it's important to know how long your code is taking to run, or at least know if a particular line of code is slowing down your entire project. Python has a built-in timing module to do this. \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example Function or Script\\n\",\n    \"\\n\",\n    \"Here we have two functions that do the same thing, but in different ways.\\n\",\n    \"How can we tell which one is more efficient? Let's time it!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def func_one(n):\\n\",\n    \"    '''\\n\",\n    \"    Given a number n, returns a list of string integers\\n\",\n    \"    ['0','1','2',...'n]\\n\",\n    \"    '''\\n\",\n    \"    return [str(num) for num in range(n)]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"func_one(10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def func_two(n):\\n\",\n    \"    '''\\n\",\n    \"    Given a number n, returns a list of string integers\\n\",\n    \"    ['0','1','2',...'n]\\n\",\n    \"    '''\\n\",\n    \"    return list(map(str,range(n)))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"func_two(10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Timing Start and Stop\\n\",\n    \"\\n\",\n    \"We can try using the time module to simply calculate the elapsed time for the code. Keep in mind, due to the time module's precision, the code needs to take **at least** 0.1 seconds to complete.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 57,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import time\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 58,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# STEP 1: Get start time\\n\",\n    \"start_time = time.time()\\n\",\n    \"# Step 2: Run your code you want to time\\n\",\n    \"result = func_one(1000000)\\n\",\n    \"# Step 3: Calculate total time elapsed\\n\",\n    \"end_time = time.time() - start_time\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 59,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.18550348281860352\"\n      ]\n     },\n     \"execution_count\": 59,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"end_time\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 60,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# STEP 1: Get start time\\n\",\n    \"start_time = time.time()\\n\",\n    \"# Step 2: Run your code you want to time\\n\",\n    \"result = func_two(1000000)\\n\",\n    \"# Step 3: Calculate total time elapsed\\n\",\n    \"end_time = time.time() - start_time\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 61,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.1496279239654541\"\n      ]\n     },\n     \"execution_count\": 61,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"end_time\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Timeit Module\\n\",\n    \"\\n\",\n    \"What if we have two blocks of code that are quite fast, the difference from the time.time() method may not be enough to tell which is fater. In this case, we can use the timeit module.\\n\",\n    \"\\n\",\n    \"The timeit module takes in two strings, a statement (stmt) and a setup. It then runs the setup code and runs the stmt code some n number of times and reports back average length of time it took.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import timeit\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The setup (anything that needs to be defined beforehand, such as def functions.)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"setup = '''\\n\",\n    \"def func_one(n):\\n\",\n    \"    return [str(num) for num in range(n)]\\n\",\n    \"'''\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 40,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"stmt = 'func_one(100)'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1.3161248000000114\"\n      ]\n     },\n     \"execution_count\": 41,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"timeit.timeit(stmt,setup,number=100000)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now let try running func_two 10,000 times and compare the length of time it took.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 42,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"setup2 = '''\\n\",\n    \"def func_two(n):\\n\",\n    \"    return list(map(str,range(n)))\\n\",\n    \"'''\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 43,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"stmt2 = 'func_two(100)'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 44,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1.0892171000000417\"\n      ]\n     },\n     \"execution_count\": 44,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"timeit.timeit(stmt2,setup2,number=100000)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"It looks like func_two is more efficient. You can specify more number of runs if you want to clarify the different for fast performing functions.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 45,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"13.129837899999984\"\n      ]\n     },\n     \"execution_count\": 45,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"timeit.timeit(stmt,setup,number=1000000)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 46,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10.894090699999992\"\n      ]\n     },\n     \"execution_count\": 46,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"timeit.timeit(stmt2,setup2,number=1000000)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Timing you code with Jupyter \\\"magic\\\" method\\n\",\n    \"\\n\",\n    \"**NOTE: This method is ONLY available in Jupyter and the magic command needs to be at the top of the cell with nothing above it (not even commented code)**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 63,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"100000 loops, best of 3: 13.4 µs per loop\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%timeit\\n\",\n    \"func_one(100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 64,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"100000 loops, best of 3: 10.9 µs per loop\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%timeit\\n\",\n    \"func_two(100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Check out the documentation for more information:\\n\",\n    \"https://docs.python.org/3/library/timeit.html\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/.ipynb_checkpoints/06-Unzipping-and-Zipping-Files-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Unzipping and Zipping Files\\n\",\n    \"\\n\",\n    \"As you are probably aware, files can be compressed to a zip format. Often people use special programs on their computer to unzip these files, luckily for us, Python can do the same task with just a few simple lines of code.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Create Files to Compress\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# slashes may need to change for MacOS or Linux\\n\",\n    \"f = open(\\\"new_file.txt\\\",'w+')\\n\",\n    \"f.write(\\\"Here is some text\\\")\\n\",\n    \"f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# slashes may need to change for MacOS or Linux\\n\",\n    \"f = open(\\\"new_file2.txt\\\",'w+')\\n\",\n    \"f.write(\\\"Here is some text\\\")\\n\",\n    \"f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Zipping Files\\n\",\n    \"\\n\",\n    \"The [zipfile library](https://docs.python.org/3/library/zipfile.html) is built in to Python, we can use it to compress folders or files. To compress all files in a folder, just use the os.walk() method to iterate this process for all the files in a directory.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import zipfile\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \" Create Zip file first , then write to it (the write step compresses the files.)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"comp_file = zipfile.ZipFile('comp_file.zip','w')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"comp_file.write(\\\"new_file.txt\\\",compress_type=zipfile.ZIP_DEFLATED)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"comp_file.write('new_file2.txt',compress_type=zipfile.ZIP_DEFLATED)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"comp_file.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Extracting from Zip Files\\n\",\n    \"\\n\",\n    \"We can easily extract files with either the extractall() method to get all the files, or just using the extract() method to only grab individual files.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"zip_obj = zipfile.ZipFile('comp_file.zip','r')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"zip_obj.extractall(\\\"extracted_content\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"________\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Using shutil library\\n\",\n    \"\\n\",\n    \"Often you don't want to extract or archive individual files from a .zip, but instead archive everything at once. The shutil library that is built in to python has easy to use commands for this:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import shutil\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The shutil library can accept a format parameter, `format` is the archive format: one of \\\"zip\\\", \\\"tar\\\", \\\"gztar\\\", \\\"bztar\\\",\\n\",\n    \"or \\\"xztar\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\12-Advanced Python Modules'\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"pwd\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"directory_to_zip='C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\12-Advanced Python Modules'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\12-Advanced Python Modules\\\\\\\\example.zip'\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Creating a zip archive\\n\",\n    \"output_filename = 'example'\\n\",\n    \"# Just fill in the output_filename and the directory to zip\\n\",\n    \"# Note this won't run as is because the variable are undefined\\n\",\n    \"shutil.make_archive(output_filename,'zip',directory_to_zip)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Extracting a zip archive\\n\",\n    \"# Notice how the parameter/argument order is slightly different here\\n\",\n    \"shutil.unpack_archive(output_filename,dir_for_extract_result,'zip')\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/.ipynb_checkpoints/07-OS-Module-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# OS Module\\n\",\n    \"\\n\",\n    \"## Opening and Reading Files\\n\",\n    \"\\n\",\n    \"So far we've discussed how to open files manually, one by one. Let's explore how we can open files programatically. \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"_____\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Create Practice File\\n\",\n    \"\\n\",\n    \"We will begin by creating a practice text file that we will be using for demonstration.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"f = open('practice.txt','w+')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"f.write('test')\\n\",\n    \"f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Getting Directories\\n\",\n    \"\\n\",\n    \"Python has a built-in [os module](https://docs.python.org/3/library/os.html) that allows us to use operating system dependent functionality.\\n\",\n    \"\\n\",\n    \"You can get the current directory:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import os\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\12-Advanced Python Modules'\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"os.getcwd()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Listing Files in a Directory\\n\",\n    \"\\n\",\n    \"You can also use the os module to list directories.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['.ipynb_checkpoints',\\n\",\n       \" '00-Collections-Module.ipynb',\\n\",\n       \" '01-Datetime-Module.ipynb',\\n\",\n       \" '02-Math-Module.ipynb',\\n\",\n       \" '03-Python Debugger (pdb).ipynb',\\n\",\n       \" '04-Timing your code - timeit.ipynb',\\n\",\n       \" '05-Overview-of-Regular-Expressions.ipynb',\\n\",\n       \" '06-Unzipping-and-Zipping-Files.ipynb',\\n\",\n       \" '07-OS-Module.ipynb',\\n\",\n       \" 'comp_file.zip',\\n\",\n       \" 'extracted_content',\\n\",\n       \" 'new_file.txt',\\n\",\n       \" 'new_file2.txt',\\n\",\n       \" 'practice.txt']\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# In your current directory\\n\",\n    \"os.listdir()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['admin.DESKTOP-O64BPTC',\\n\",\n       \" 'All Users',\\n\",\n       \" 'Default',\\n\",\n       \" 'Default User',\\n\",\n       \" 'defaultuser0',\\n\",\n       \" 'desktop.ini',\\n\",\n       \" 'Marcial',\\n\",\n       \" 'Public']\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# In any directory you pass\\n\",\n    \"os.listdir(\\\"C:\\\\\\\\Users\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"### Moving Files \\n\",\n    \"\\n\",\n    \"You can use the built-in **shutil** module to to move files to different locations. Keep in mind, there are permission restrictions, for example if you are logged in a User A, you won't be able to make changes to the top level Users folder without the proper permissions, [more info](https://stackoverflow.com/questions/23253439/shutil-movescr-dst-gets-me-ioerror-errno-13-permission-denied-and-3-more-e)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import shutil\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\practice.txt'\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"shutil.move('practice.txt','C:\\\\\\\\Users\\\\\\\\Marcial')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['.ipynb_checkpoints',\\n\",\n       \" '00-Collections-Module.ipynb',\\n\",\n       \" '01-Datetime-Module.ipynb',\\n\",\n       \" '02-Math-Module.ipynb',\\n\",\n       \" '03-Python Debugger (pdb).ipynb',\\n\",\n       \" '04-Timing your code - timeit.ipynb',\\n\",\n       \" '05-Overview-of-Regular-Expressions.ipynb',\\n\",\n       \" '06-Unzipping-and-Zipping-Files.ipynb',\\n\",\n       \" '07-OS-Module.ipynb',\\n\",\n       \" 'comp_file.zip',\\n\",\n       \" 'extracted_content',\\n\",\n       \" 'new_file.txt',\\n\",\n       \" 'new_file2.txt']\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"os.listdir()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\12-Advanced Python Modules\\\\\\\\practice.txt'\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"shutil.move('C:\\\\\\\\Users\\\\\\\\Marcial\\\\practice.txt',os.getcwd())\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['.ipynb_checkpoints',\\n\",\n       \" '00-Collections-Module.ipynb',\\n\",\n       \" '01-Datetime-Module.ipynb',\\n\",\n       \" '02-Math-Module.ipynb',\\n\",\n       \" '03-Python Debugger (pdb).ipynb',\\n\",\n       \" '04-Timing your code - timeit.ipynb',\\n\",\n       \" '05-Overview-of-Regular-Expressions.ipynb',\\n\",\n       \" '06-Unzipping-and-Zipping-Files.ipynb',\\n\",\n       \" '07-OS-Module.ipynb',\\n\",\n       \" 'comp_file.zip',\\n\",\n       \" 'extracted_content',\\n\",\n       \" 'new_file.txt',\\n\",\n       \" 'new_file2.txt',\\n\",\n       \" 'practice.txt']\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"os.listdir()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Deleting Files\\n\",\n    \"____\\n\",\n    \"**NOTE: The os module provides 3 methods for deleting files:**\\n\",\n    \"* os.unlink(path) which deletes a file at the path your provide\\n\",\n    \"* os.rmdir(path) which deletes a folder (folder must be empty) at the path your provide\\n\",\n    \"* shutil.rmtree(path) this is the most dangerous, as it will remove all files and folders contained in the path.\\n\",\n    \"**All of these methods can not be reversed! Which means if you make a mistake you won't be able to recover the file. Instead we will use the send2trash module. A safer alternative that sends deleted files to the trash bin instead of permanent removal.**\\n\",\n    \"___\\n\",\n    \"\\n\",\n    \"Install the send2trash module with:\\n\",\n    \"\\n\",\n    \"    pip install send2trash\\n\",\n    \"    \\n\",\n    \"at your command line.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import send2trash\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['.ipynb_checkpoints',\\n\",\n       \" '00-Collections-Module.ipynb',\\n\",\n       \" '01-Datetime-Module.ipynb',\\n\",\n       \" '02-Math-Module.ipynb',\\n\",\n       \" '03-Python Debugger (pdb).ipynb',\\n\",\n       \" '04-Timing your code - timeit.ipynb',\\n\",\n       \" '05-Overview-of-Regular-Expressions.ipynb',\\n\",\n       \" '06-Unzipping-and-Zipping-Files.ipynb',\\n\",\n       \" '07-OS-Module.ipynb',\\n\",\n       \" 'comp_file.zip',\\n\",\n       \" 'extracted_content',\\n\",\n       \" 'new_file.txt',\\n\",\n       \" 'new_file2.txt',\\n\",\n       \" 'practice.txt']\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"os.listdir()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"send2trash.send2trash('practice.txt')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['.ipynb_checkpoints',\\n\",\n       \" '00-Collections-Module.ipynb',\\n\",\n       \" '01-Datetime-Module.ipynb',\\n\",\n       \" '02-Math-Module.ipynb',\\n\",\n       \" '03-Python Debugger (pdb).ipynb',\\n\",\n       \" '04-Timing your code - timeit.ipynb',\\n\",\n       \" '05-Overview-of-Regular-Expressions.ipynb',\\n\",\n       \" '06-Unzipping-and-Zipping-Files.ipynb',\\n\",\n       \" '07-OS-Module.ipynb',\\n\",\n       \" 'comp_file.zip',\\n\",\n       \" 'extracted_content',\\n\",\n       \" 'new_file.txt',\\n\",\n       \" 'new_file2.txt']\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"os.listdir()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Walking through a directory\\n\",\n    \"\\n\",\n    \"Often you will just need to \\\"walk\\\" through a directory, that is visit every file or folder and check to see if a file is in the directory, and then perhaps do something with that file. Usually recursively walking through every file and folder in a directory would be quite tricky to program, but luckily the os module has a direct method call for this called os.walk(). Let's explore how it works.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\12-Advanced Python Modules'\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"os.getcwd()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['.ipynb_checkpoints',\\n\",\n       \" '00-Collections-Module.ipynb',\\n\",\n       \" '01-Datetime-Module.ipynb',\\n\",\n       \" '02-Math-Module.ipynb',\\n\",\n       \" '03-Python Debugger (pdb).ipynb',\\n\",\n       \" '04-Timing your code - timeit.ipynb',\\n\",\n       \" '05-Overview-of-Regular-Expressions.ipynb',\\n\",\n       \" '06-Unzipping-and-Zipping-Files.ipynb',\\n\",\n       \" '07-OS-Module.ipynb',\\n\",\n       \" 'comp_file.zip',\\n\",\n       \" 'extracted_content',\\n\",\n       \" 'new_file.txt',\\n\",\n       \" 'new_file2.txt']\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"os.listdir()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Currently looking at folder: C:\\\\Users\\\\Marcial\\\\Pierian-Data-Courses\\\\Complete-Python-3-Bootcamp\\\\12-Advanced Python Modules\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE SUBFOLDERS ARE: \\n\",\n      \"\\t Subfolder: .ipynb_checkpoints\\n\",\n      \"\\t Subfolder: extracted_content\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE FILES ARE: \\n\",\n      \"\\t File: 00-Collections-Module.ipynb\\n\",\n      \"\\t File: 01-Datetime-Module.ipynb\\n\",\n      \"\\t File: 02-Math-Module.ipynb\\n\",\n      \"\\t File: 03-Python Debugger (pdb).ipynb\\n\",\n      \"\\t File: 04-Timing your code - timeit.ipynb\\n\",\n      \"\\t File: 05-Overview-of-Regular-Expressions.ipynb\\n\",\n      \"\\t File: 06-Unzipping-and-Zipping-Files.ipynb\\n\",\n      \"\\t File: 07-OS-Module.ipynb\\n\",\n      \"\\t File: comp_file.zip\\n\",\n      \"\\t File: new_file.txt\\n\",\n      \"\\t File: new_file2.txt\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Currently looking at folder: C:\\\\Users\\\\Marcial\\\\Pierian-Data-Courses\\\\Complete-Python-3-Bootcamp\\\\12-Advanced Python Modules\\\\.ipynb_checkpoints\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE SUBFOLDERS ARE: \\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE FILES ARE: \\n\",\n      \"\\t File: 00-Collections-Module-checkpoint.ipynb\\n\",\n      \"\\t File: 01-Datetime-Module-checkpoint.ipynb\\n\",\n      \"\\t File: 02-Math-Module-checkpoint.ipynb\\n\",\n      \"\\t File: 03-Python Debugger (pdb)-checkpoint.ipynb\\n\",\n      \"\\t File: 04-Timing your code - timeit-checkpoint.ipynb\\n\",\n      \"\\t File: 05-Overview-of-Regular-Expressions-checkpoint.ipynb\\n\",\n      \"\\t File: 06-Unzipping-and-Zipping-Files-checkpoint.ipynb\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Currently looking at folder: C:\\\\Users\\\\Marcial\\\\Pierian-Data-Courses\\\\Complete-Python-3-Bootcamp\\\\12-Advanced Python Modules\\\\extracted_content\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE SUBFOLDERS ARE: \\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE FILES ARE: \\n\",\n      \"\\t File: new_file.txt\\n\",\n      \"\\t File: new_file2.txt\\n\",\n      \"\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for folder , sub_folders , files in os.walk(os.getcwd()):\\n\",\n    \"    \\n\",\n    \"    print(\\\"Currently looking at folder: \\\"+ folder)\\n\",\n    \"    print('\\\\n')\\n\",\n    \"    print(\\\"THE SUBFOLDERS ARE: \\\")\\n\",\n    \"    for sub_fold in sub_folders:\\n\",\n    \"        print(\\\"\\\\t Subfolder: \\\"+sub_fold )\\n\",\n    \"    \\n\",\n    \"    print('\\\\n')\\n\",\n    \"    \\n\",\n    \"    print(\\\"THE FILES ARE: \\\")\\n\",\n    \"    for f in files:\\n\",\n    \"        print(\\\"\\\\t File: \\\"+f)\\n\",\n    \"    print('\\\\n')\\n\",\n    \"    \\n\",\n    \"    # Now look at subfolders\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"___\\n\",\n    \"Excellent, you should now be aware of how to work with a computer's files and folders in whichever directory they are in. Remember that the os module works for any oeprating system that supports Python, which means these commands will work across Linux,MacOs, or Windows without need for adjustment.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"anaconda-cloud\": {},\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/.ipynb_checkpoints/07-Unzipping-and-Zipping-Files-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Unzipping and Zipping Files\\n\",\n    \"\\n\",\n    \"As you are probably aware, files can be compressed to a zip format. Often people use special programs on their computer to unzip these files, luckily for us, Python can do the same task with just a few simple lines of code.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Create Files to Compress\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# slashes may need to change for MacOS or Linux\\n\",\n    \"f = open(\\\"new_file.txt\\\",'w+')\\n\",\n    \"f.write(\\\"Here is some text\\\")\\n\",\n    \"f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# slashes may need to change for MacOS or Linux\\n\",\n    \"f = open(\\\"new_file2.txt\\\",'w+')\\n\",\n    \"f.write(\\\"Here is some text\\\")\\n\",\n    \"f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Zipping Files\\n\",\n    \"\\n\",\n    \"The [zipfile library](https://docs.python.org/3/library/zipfile.html) is built in to Python, we can use it to compress folders or files. To compress all files in a folder, just use the os.walk() method to iterate this process for all the files in a directory.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import zipfile\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \" Create Zip file first , then write to it (the write step compresses the files.)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"comp_file = zipfile.ZipFile('comp_file.zip','w')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"comp_file.write(\\\"new_file.txt\\\",compress_type=zipfile.ZIP_DEFLATED)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"comp_file.write('new_file2.txt',compress_type=zipfile.ZIP_DEFLATED)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"comp_file.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Extracting from Zip Files\\n\",\n    \"\\n\",\n    \"We can easily extract files with either the extractall() method to get all the files, or just using the extract() method to only grab individual files.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"zip_obj = zipfile.ZipFile('comp_file.zip','r')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"zip_obj.extractall(\\\"extracted_content\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"________\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Using shutil library\\n\",\n    \"\\n\",\n    \"Often you don't want to extract or archive individual files from a .zip, but instead archive everything at once. The shutil library that is built in to python has easy to use commands for this:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import shutil\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The shutil library can accept a format parameter, `format` is the archive format: one of \\\"zip\\\", \\\"tar\\\", \\\"gztar\\\", \\\"bztar\\\",\\n\",\n    \"or \\\"xztar\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\12-Advanced Python Modules'\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"pwd\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"directory_to_zip='C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\12-Advanced Python Modules'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\12-Advanced Python Modules\\\\\\\\example.zip'\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Creating a zip archive\\n\",\n    \"output_filename = 'example'\\n\",\n    \"# Just fill in the output_filename and the directory to zip\\n\",\n    \"# Note this won't run as is because the variable are undefined\\n\",\n    \"shutil.make_archive(output_filename,'zip',directory_to_zip)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Extracting a zip archive\\n\",\n    \"# Notice how the parameter/argument order is slightly different here\\n\",\n    \"shutil.unpack_archive(output_filename,dir_for_extract_result,'zip')\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/.ipynb_checkpoints/09-Advanced-Modules-Exercise-Solutions-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Advanced Modules Exercise Solutions\\n\",\n    \"\\n\",\n    \"It's time to test your new skills, this project will combine multiple skills sets, including unzipping files with Python, using os module to automatically search through lots of files.\\n\",\n    \"\\n\",\n    \"## Your Goal\\n\",\n    \"\\n\",\n    \"There is a .zip file called\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Unzipping the File\\n\",\n    \"\\n\",\n    \"We can easily use the shutil library to extract and unzip the contents of the .zip file\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import shutil\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"shutil.unpack_archive('Mission_Orange_Files/unzip_me_for_instructions.zip','Mission_Orange_Files/extracted_content','zip')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Regular Expression to Find the Link\\n\",\n    \"\\n\",\n    \"There are many approaches to take here, but since we know we are looking for a website, there should be a www. somewhere in the string. So let's search for strings where the www. is somewhere there. Other approaches could have included searching for .coms, .orgs, or other endings, or trying to search for http or https. [More info on other possible regex patterns for domains](https://stackoverflow.com/questions/2490310/regular-expression-for-checking-website-url).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import re\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Any word that starts with https:// and for the rest of the word one or more, \\\\w dots, slashes, ? , =, _ or -\\n\",\n    \"pattern = r'https://[-?_=./\\\\w]+'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"test = \\\"here is a website https://drive.google.com/open?id=1tWJBFrSQL06qTZgkohs4t_a5Cu84AheLo and https://docs.google.com/document/d/Q-DcxM17nJm_El0aGsNnY7FajaogRviwja/edit let's see if we can find it.\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['https://drive.google.com/open?id=1tWJBFrSQL06qTZgkohs4t_a5Cu84AheLo',\\n\",\n       \" 'https://docs.google.com/document/d/Q-DcxM17nJm_El0aGsNnY7FajaogRviwja/edit']\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.findall(pattern,test)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def search(file,pattern= r'https://[-?_=./\\\\w]+'):\\n\",\n    \"    f = open(file,'r')\\n\",\n    \"    text = f.read()\\n\",\n    \"    \\n\",\n    \"    if re.search(pattern,text):\\n\",\n    \"        return re.search(pattern,text)\\n\",\n    \"    else:\\n\",\n    \"        return ''\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## OS Walk through the Files to Get the Link\\n\",\n    \"\\n\",\n    \"Now that we have a basic function to search through the text of the files, let's perform an os.walk through the unzipped directory to find the links hidden somewhere in one of the text files.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import os\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"results = []\\n\",\n    \"for folder , sub_folders , files in os.walk(os.getcwd()+\\\"\\\\\\\\Mission_Orange_Files\\\\\\\\extracted_content\\\"):\\n\",\n    \"    \\n\",\n    \"    for f in files:\\n\",\n    \"        full_path = folder+'\\\\\\\\'+f\\n\",\n    \"         \\n\",\n    \"        results.append(search(full_path)) \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"https://drive.google.com/open?id=1tWJBFrSQL06qTZgkohs4t_a5Cu84AheLo\\n\",\n      \"https://docs.google.com/document/d/1tWJBFrSQL06qTZgkohs4t_a5Cu84AheLocWTXQ-DcxM/edit?usp=sharing\\n\",\n      \"https://drive.google.com/file/d/17nJm_El0aGsNvaMZtnY7FajaogRviwja/view?usp=sharing\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for r in results:\\n\",\n    \"    if r != '':\\n\",\n    \"        print(r.group())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"Excellent work! More information on this phone number:\\n\",\n    \"* https://www.npr.org/2011/12/21/144069758/callin-oates-the-hotline-you-dont-need-but-might-call-anyway\\n\",\n    \"* https://twitter.com/CallinOates\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"anaconda-cloud\": {},\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/00-Collections-Module.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Collections Module\\n\",\n    \"\\n\",\n    \"The collections module is a built-in module that implements specialized container data types providing alternatives to Python’s general purpose built-in containers. We've already gone over the basics: dict, list, set, and tuple.\\n\",\n    \"\\n\",\n    \"Now we'll learn about the alternatives that the collections module provides.\\n\",\n    \"\\n\",\n    \"## Counter\\n\",\n    \"\\n\",\n    \"*Counter* is a *dict* subclass which helps count hashable objects. Inside of it elements are stored as dictionary keys and the counts of the objects are stored as the value.\\n\",\n    \"\\n\",\n    \"Let's see how it can be used:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from collections import Counter\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Counter() with lists**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Counter({1: 6, 2: 6, 3: 4, 12: 1, 21: 1, 32: 1, 223: 1})\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"lst = [1,2,2,2,2,3,3,3,1,2,1,12,3,2,32,1,21,1,223,1]\\n\",\n    \"\\n\",\n    \"Counter(lst)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Counter with strings**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Counter({'a': 2, 'b': 7, 'h': 3, 's': 6})\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"Counter('aabsbsbsbhshhbbsbs')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Counter with words in a sentence**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Counter({'How': 1,\\n\",\n       \"         'does': 1,\\n\",\n       \"         'each': 3,\\n\",\n       \"         'in': 1,\\n\",\n       \"         'many': 1,\\n\",\n       \"         'sentence': 1,\\n\",\n       \"         'show': 1,\\n\",\n       \"         'this': 1,\\n\",\n       \"         'times': 2,\\n\",\n       \"         'up': 1,\\n\",\n       \"         'word': 3})\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s = 'How many times does each word show up in this sentence word times each each word'\\n\",\n    \"\\n\",\n    \"words = s.split()\\n\",\n    \"\\n\",\n    \"Counter(words)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[('each', 3), ('word', 3)]\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Methods with Counter()\\n\",\n    \"c = Counter(words)\\n\",\n    \"\\n\",\n    \"c.most_common(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Common patterns when using the Counter() object\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"    sum(c.values())                 # total of all counts\\n\",\n    \"    c.clear()                       # reset all counts\\n\",\n    \"    list(c)                         # list unique elements\\n\",\n    \"    set(c)                          # convert to a set\\n\",\n    \"    dict(c)                         # convert to a regular dictionary\\n\",\n    \"    c.items()                       # convert to a list of (elem, cnt) pairs\\n\",\n    \"    Counter(dict(list_of_pairs))    # convert from a list of (elem, cnt) pairs\\n\",\n    \"    c.most_common()[:-n-1:-1]       # n least common elements\\n\",\n    \"    c += Counter()                  # remove zero and negative counts\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## defaultdict\\n\",\n    \"\\n\",\n    \"defaultdict is a dictionary-like object which provides all methods provided by a dictionary but takes a first argument (default_factory) as a default data type for the dictionary. Using defaultdict is faster than doing the same using dict.set_default method.\\n\",\n    \"\\n\",\n    \"**A defaultdict will never raise a KeyError. Any key that does not exist gets the value returned by the default factory.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from collections import defaultdict\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"d = {}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"KeyError\",\n     \"evalue\": \"'one'\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mKeyError\\u001b[0m                                  Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-8-07706fc5dc20>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0md\\u001b[0m\\u001b[1;33m[\\u001b[0m\\u001b[1;34m'one'\\u001b[0m\\u001b[1;33m]\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mKeyError\\u001b[0m: 'one'\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"d['one'] \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"d  = defaultdict(object)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<object at 0x216de27bcf0>\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d['one'] \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"one\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for item in d:\\n\",\n    \"    print(item)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Can also initialize with default values:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"d = defaultdict(lambda: 0)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d['one']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# namedtuple\\n\",\n    \"The standard tuple uses numerical indexes to access its members, for example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"t = (12,13,14)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"12\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"t[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"For simple use cases, this is usually enough. On the other hand, remembering which index should be used for each value can lead to errors, especially if the tuple has a lot of fields and is constructed far from where it is used. A namedtuple assigns names, as well as the numerical index, to each member. \\n\",\n    \"\\n\",\n    \"Each kind of namedtuple is represented by its own class, created by using the namedtuple() factory function. The arguments are the name of the new class and a string containing the names of the elements.\\n\",\n    \"\\n\",\n    \"You can basically think of namedtuples as a very quick way of creating a new object/class type with some attribute fields.\\n\",\n    \"For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from collections import namedtuple\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"Dog = namedtuple('Dog',['age','breed','name'])\\n\",\n    \"\\n\",\n    \"sam = Dog(age=2,breed='Lab',name='Sammy')\\n\",\n    \"\\n\",\n    \"frank = Dog(age=2,breed='Shepard',name=\\\"Frankie\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We construct the namedtuple by first passing the object type name (Dog) and then passing a string with the variety of fields as a string with spaces between the field names. We can then call on the various attributes:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Dog(age=2, breed='Lab', name='Sammy')\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sam\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 25,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sam.age\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Lab'\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sam.breed\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 27,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sam[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Conclusion\\n\",\n    \"\\n\",\n    \"Hopefully you now see how incredibly useful the collections module is in Python and it should be your go-to module for a variety of common tasks!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/01-Opening-and-Reading-Files-Folders.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Opening and Reading Files\\n\",\n    \"\\n\",\n    \"So far we've discussed how to open files manually, one by one. Let's explore how we can open files programatically. \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"_____\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Review: Understanding File Paths\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\12-Advanced Python Modules'\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"pwd\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Create Practice File\\n\",\n    \"\\n\",\n    \"We will begin by creating a practice text file that we will be using for demonstration.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"f = open('practice.txt','w+')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"f.write('test')\\n\",\n    \"f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Getting Directories\\n\",\n    \"\\n\",\n    \"Python has a built-in [os module](https://docs.python.org/3/library/os.html) that allows us to use operating system dependent functionality.\\n\",\n    \"\\n\",\n    \"You can get the current directory:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import os\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\12-Advanced Python Modules'\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"os.getcwd()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Listing Files in a Directory\\n\",\n    \"\\n\",\n    \"You can also use the os module to list directories.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['.ipynb_checkpoints',\\n\",\n       \" '00-Collections-Module.ipynb',\\n\",\n       \" '01-Datetime-Module.ipynb',\\n\",\n       \" '01-Opening-and-Reading-Files.ipynb',\\n\",\n       \" '02-Math-and-Random-Module.ipynb',\\n\",\n       \" '03-Python Debugger (pdb).ipynb',\\n\",\n       \" '04-Timing your code - timeit.ipynb',\\n\",\n       \" '05-Overview-of-Regular-Expressions.ipynb',\\n\",\n       \" '06-Unzipping-and-Zipping-Files.ipynb',\\n\",\n       \" '07-OS-Module.ipynb',\\n\",\n       \" '08-Advanced-Python-Module-Exercise',\\n\",\n       \" 'comp_file.zip',\\n\",\n       \" 'Example_Top_Level',\\n\",\n       \" 'extracted_content',\\n\",\n       \" 'new_file.txt',\\n\",\n       \" 'new_file2.txt',\\n\",\n       \" 'practice.txt']\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# In your current directory\\n\",\n    \"os.listdir()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['admin.DESKTOP-O64BPTC',\\n\",\n       \" 'All Users',\\n\",\n       \" 'Default',\\n\",\n       \" 'Default User',\\n\",\n       \" 'defaultuser0',\\n\",\n       \" 'desktop.ini',\\n\",\n       \" 'Marcial',\\n\",\n       \" 'Public']\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# In any directory you pass\\n\",\n    \"os.listdir(\\\"C:\\\\\\\\Users\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"### Moving Files \\n\",\n    \"\\n\",\n    \"You can use the built-in **shutil** module to to move files to different locations. Keep in mind, there are permission restrictions, for example if you are logged in a User A, you won't be able to make changes to the top level Users folder without the proper permissions, [more info](https://stackoverflow.com/questions/23253439/shutil-movescr-dst-gets-me-ioerror-errno-13-permission-denied-and-3-more-e)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import shutil\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\practice.txt'\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"shutil.move('practice.txt','C:\\\\\\\\Users\\\\\\\\Marcial')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['.ipynb_checkpoints',\\n\",\n       \" '00-Collections-Module.ipynb',\\n\",\n       \" '01-Datetime-Module.ipynb',\\n\",\n       \" '01-Opening-and-Reading-Files.ipynb',\\n\",\n       \" '02-Math-and-Random-Module.ipynb',\\n\",\n       \" '03-Python Debugger (pdb).ipynb',\\n\",\n       \" '04-Timing your code - timeit.ipynb',\\n\",\n       \" '05-Overview-of-Regular-Expressions.ipynb',\\n\",\n       \" '06-Unzipping-and-Zipping-Files.ipynb',\\n\",\n       \" '07-OS-Module.ipynb',\\n\",\n       \" '08-Advanced-Python-Module-Exercise',\\n\",\n       \" 'comp_file.zip',\\n\",\n       \" 'Example_Top_Level',\\n\",\n       \" 'extracted_content',\\n\",\n       \" 'new_file.txt',\\n\",\n       \" 'new_file2.txt']\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"os.listdir()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\12-Advanced Python Modules\\\\\\\\practice.txt'\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"shutil.move('C:\\\\\\\\Users\\\\\\\\Marcial\\\\practice.txt',os.getcwd())\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['.ipynb_checkpoints',\\n\",\n       \" '00-Collections-Module.ipynb',\\n\",\n       \" '01-Datetime-Module.ipynb',\\n\",\n       \" '01-Opening-and-Reading-Files.ipynb',\\n\",\n       \" '02-Math-and-Random-Module.ipynb',\\n\",\n       \" '03-Python Debugger (pdb).ipynb',\\n\",\n       \" '04-Timing your code - timeit.ipynb',\\n\",\n       \" '05-Overview-of-Regular-Expressions.ipynb',\\n\",\n       \" '06-Unzipping-and-Zipping-Files.ipynb',\\n\",\n       \" '07-OS-Module.ipynb',\\n\",\n       \" '08-Advanced-Python-Module-Exercise',\\n\",\n       \" 'comp_file.zip',\\n\",\n       \" 'Example_Top_Level',\\n\",\n       \" 'extracted_content',\\n\",\n       \" 'new_file.txt',\\n\",\n       \" 'new_file2.txt',\\n\",\n       \" 'practice.txt']\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"os.listdir()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Deleting Files\\n\",\n    \"____\\n\",\n    \"**NOTE: The os module provides 3 methods for deleting files:**\\n\",\n    \"* os.unlink(path) which deletes a file at the path your provide\\n\",\n    \"* os.rmdir(path) which deletes a folder (folder must be empty) at the path your provide\\n\",\n    \"* shutil.rmtree(path) this is the most dangerous, as it will remove all files and folders contained in the path.\\n\",\n    \"**All of these methods can not be reversed! Which means if you make a mistake you won't be able to recover the file. Instead we will use the send2trash module. A safer alternative that sends deleted files to the trash bin instead of permanent removal.**\\n\",\n    \"___\\n\",\n    \"\\n\",\n    \"Install the send2trash module with:\\n\",\n    \"\\n\",\n    \"    pip install send2trash\\n\",\n    \"    \\n\",\n    \"at your command line.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import send2trash\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['.ipynb_checkpoints',\\n\",\n       \" '00-Collections-Module.ipynb',\\n\",\n       \" '01-Datetime-Module.ipynb',\\n\",\n       \" '01-Opening-and-Reading-Files.ipynb',\\n\",\n       \" '02-Math-and-Random-Module.ipynb',\\n\",\n       \" '03-Python Debugger (pdb).ipynb',\\n\",\n       \" '04-Timing your code - timeit.ipynb',\\n\",\n       \" '05-Overview-of-Regular-Expressions.ipynb',\\n\",\n       \" '06-Unzipping-and-Zipping-Files.ipynb',\\n\",\n       \" '07-OS-Module.ipynb',\\n\",\n       \" '08-Advanced-Python-Module-Exercise',\\n\",\n       \" 'comp_file.zip',\\n\",\n       \" 'Example_Top_Level',\\n\",\n       \" 'extracted_content',\\n\",\n       \" 'new_file.txt',\\n\",\n       \" 'new_file2.txt',\\n\",\n       \" 'practice.txt']\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"os.listdir()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"send2trash.send2trash('practice.txt')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['.ipynb_checkpoints',\\n\",\n       \" '00-Collections-Module.ipynb',\\n\",\n       \" '01-Datetime-Module.ipynb',\\n\",\n       \" '01-Opening-and-Reading-Files.ipynb',\\n\",\n       \" '02-Math-and-Random-Module.ipynb',\\n\",\n       \" '03-Python Debugger (pdb).ipynb',\\n\",\n       \" '04-Timing your code - timeit.ipynb',\\n\",\n       \" '05-Overview-of-Regular-Expressions.ipynb',\\n\",\n       \" '06-Unzipping-and-Zipping-Files.ipynb',\\n\",\n       \" '07-OS-Module.ipynb',\\n\",\n       \" '08-Advanced-Python-Module-Exercise',\\n\",\n       \" 'comp_file.zip',\\n\",\n       \" 'Example_Top_Level',\\n\",\n       \" 'extracted_content',\\n\",\n       \" 'new_file.txt',\\n\",\n       \" 'new_file2.txt']\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"os.listdir()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Walking through a directory\\n\",\n    \"\\n\",\n    \"Often you will just need to \\\"walk\\\" through a directory, that is visit every file or folder and check to see if a file is in the directory, and then perhaps do something with that file. Usually recursively walking through every file and folder in a directory would be quite tricky to program, but luckily the os module has a direct method call for this called os.walk(). Let's explore how it works.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\12-Advanced Python Modules'\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"os.getcwd()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['.ipynb_checkpoints',\\n\",\n       \" '00-Collections-Module.ipynb',\\n\",\n       \" '01-Datetime-Module.ipynb',\\n\",\n       \" '01-Opening-and-Reading-Files.ipynb',\\n\",\n       \" '02-Math-and-Random-Module.ipynb',\\n\",\n       \" '03-Python Debugger (pdb).ipynb',\\n\",\n       \" '04-Timing your code - timeit.ipynb',\\n\",\n       \" '05-Overview-of-Regular-Expressions.ipynb',\\n\",\n       \" '06-Unzipping-and-Zipping-Files.ipynb',\\n\",\n       \" '07-OS-Module.ipynb',\\n\",\n       \" '08-Advanced-Python-Module-Exercise',\\n\",\n       \" 'comp_file.zip',\\n\",\n       \" 'Example_Top_Level',\\n\",\n       \" 'extracted_content',\\n\",\n       \" 'new_file.txt',\\n\",\n       \" 'new_file2.txt']\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"os.listdir()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Currently looking at folder: Example_Top_Level\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE SUBFOLDERS ARE: \\n\",\n      \"\\t Subfolder: Mid-Example-One\\n\",\n      \"\\t Subfolder: Mid-Example-Two\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE FILES ARE: \\n\",\n      \"\\t File: Mid-Example.txt\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Currently looking at folder: Example_Top_Level\\\\Mid-Example-One\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE SUBFOLDERS ARE: \\n\",\n      \"\\t Subfolder: Bottom-Level-One\\n\",\n      \"\\t Subfolder: Bottom-Level-Two\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE FILES ARE: \\n\",\n      \"\\t File: Mid-Level-Doc.txt\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Currently looking at folder: Example_Top_Level\\\\Mid-Example-One\\\\Bottom-Level-One\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE SUBFOLDERS ARE: \\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE FILES ARE: \\n\",\n      \"\\t File: One_Text.txt\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Currently looking at folder: Example_Top_Level\\\\Mid-Example-One\\\\Bottom-Level-Two\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE SUBFOLDERS ARE: \\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE FILES ARE: \\n\",\n      \"\\t File: Bottom-Text-Two.txt\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Currently looking at folder: Example_Top_Level\\\\Mid-Example-Two\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE SUBFOLDERS ARE: \\n\",\n      \"\\n\",\n      \"\\n\",\n      \"THE FILES ARE: \\n\",\n      \"\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for folder , sub_folders , files in os.walk(\\\"Example_Top_Level\\\"):\\n\",\n    \"    \\n\",\n    \"    print(\\\"Currently looking at folder: \\\"+ folder)\\n\",\n    \"    print('\\\\n')\\n\",\n    \"    print(\\\"THE SUBFOLDERS ARE: \\\")\\n\",\n    \"    for sub_fold in sub_folders:\\n\",\n    \"        print(\\\"\\\\t Subfolder: \\\"+sub_fold )\\n\",\n    \"    \\n\",\n    \"    print('\\\\n')\\n\",\n    \"    \\n\",\n    \"    print(\\\"THE FILES ARE: \\\")\\n\",\n    \"    for f in files:\\n\",\n    \"        print(\\\"\\\\t File: \\\"+f)\\n\",\n    \"    print('\\\\n')\\n\",\n    \"    \\n\",\n    \"    # Now look at subfolders\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"___\\n\",\n    \"Excellent, you should now be aware of how to work with a computer's files and folders in whichever directory they are in. Remember that the os module works for any oeprating system that supports Python, which means these commands will work across Linux,MacOs, or Windows without need for adjustment.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"anaconda-cloud\": {},\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/02-Datetime-Module.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# datetime module\\n\",\n    \"\\n\",\n    \"Python has the datetime module to help deal with timestamps in your code. Time values are represented with the time class. Times have attributes for hour, minute, second, and microsecond. They can also include time zone information. The arguments to initialize a time instance are optional, but the default of 0 is unlikely to be what you want.\\n\",\n    \"\\n\",\n    \"## time\\n\",\n    \"Let's take a look at how we can extract time information from the datetime module. We can create a timestamp by specifying datetime.time(hour,minute,second,microsecond)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"04:20:01\\n\",\n      \"hour  : 4\\n\",\n      \"minute: 20\\n\",\n      \"second: 1\\n\",\n      \"microsecond: 0\\n\",\n      \"tzinfo: None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"import datetime\\n\",\n    \"\\n\",\n    \"t = datetime.time(4, 20, 1)\\n\",\n    \"\\n\",\n    \"# Let's show the different components\\n\",\n    \"print(t)\\n\",\n    \"print('hour  :', t.hour)\\n\",\n    \"print('minute:', t.minute)\\n\",\n    \"print('second:', t.second)\\n\",\n    \"print('microsecond:', t.microsecond)\\n\",\n    \"print('tzinfo:', t.tzinfo)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note: A time instance only holds values of time, and not a date associated with the time. \\n\",\n    \"\\n\",\n    \"We can also check the min and max values a time of day can have in the module:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Earliest  : 00:00:00\\n\",\n      \"Latest    : 23:59:59.999999\\n\",\n      \"Resolution: 0:00:00.000001\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('Earliest  :', datetime.time.min)\\n\",\n    \"print('Latest    :', datetime.time.max)\\n\",\n    \"print('Resolution:', datetime.time.resolution)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The min and max class attributes reflect the valid range of times in a single day.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Dates\\n\",\n    \"datetime (as you might suspect) also allows us to work with date timestamps. Calendar date values are represented with the date class. Instances have attributes for year, month, and day. It is easy to create a date representing today’s date using the today() class method.\\n\",\n    \"\\n\",\n    \"Let's see some examples:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"2020-06-10\\n\",\n      \"ctime: Wed Jun 10 00:00:00 2020\\n\",\n      \"tuple: time.struct_time(tm_year=2020, tm_mon=6, tm_mday=10, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=162, tm_isdst=-1)\\n\",\n      \"ordinal: 737586\\n\",\n      \"Year : 2020\\n\",\n      \"Month: 6\\n\",\n      \"Day  : 10\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"today = datetime.date.today()\\n\",\n    \"print(today)\\n\",\n    \"print('ctime:', today.ctime())\\n\",\n    \"print('tuple:', today.timetuple())\\n\",\n    \"print('ordinal:', today.toordinal())\\n\",\n    \"print('Year :', today.year)\\n\",\n    \"print('Month:', today.month)\\n\",\n    \"print('Day  :', today.day)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"As with time, the range of date values supported can be determined using the min and max attributes.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Earliest  : 0001-01-01\\n\",\n      \"Latest    : 9999-12-31\\n\",\n      \"Resolution: 1 day, 0:00:00\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('Earliest  :', datetime.date.min)\\n\",\n    \"print('Latest    :', datetime.date.max)\\n\",\n    \"print('Resolution:', datetime.date.resolution)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Another way to create new date instances uses the replace() method of an existing date. For example, you can change the year, leaving the day and month alone.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"d1: 2015-03-11\\n\",\n      \"d2: 1990-03-11\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"d1 = datetime.date(2015, 3, 11)\\n\",\n    \"print('d1:', d1)\\n\",\n    \"\\n\",\n    \"d2 = d1.replace(year=1990)\\n\",\n    \"print('d2:', d2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Arithmetic\\n\",\n    \"We can perform arithmetic on date objects to check for time differences. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"datetime.date(2015, 3, 11)\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"datetime.date(1990, 3, 11)\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"datetime.timedelta(9131)\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d1-d2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This gives us the difference in days between the two dates. You can use the timedelta method to specify various units of times (days, minutes, hours, etc.)\\n\",\n    \"\\n\",\n    \"Great! You should now have a basic understanding of how to use datetime with Python to work with timestamps in your code!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/03-Math-and-Random-Module.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Math and Random Modules\\n\",\n    \"\\n\",\n    \"Python comes with a built in math module and random module. In this lecture we will give a brief tour of their capabilities. Usually you can simply look up the function call you are looking for in the online documentation.\\n\",\n    \"\\n\",\n    \"* [Math Module](https://docs.python.org/3/library/math.html)\\n\",\n    \"\\n\",\n    \"* [Random Module](https://docs.python.org/3/library/random.html)\\n\",\n    \"\\n\",\n    \"We won't go through every function available in these modules since there are so many, but we will show some useful ones.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Useful Math Functions\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import math\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Help on built-in module math:\\n\",\n      \"\\n\",\n      \"NAME\\n\",\n      \"    math\\n\",\n      \"\\n\",\n      \"DESCRIPTION\\n\",\n      \"    This module is always available.  It provides access to the\\n\",\n      \"    mathematical functions defined by the C standard.\\n\",\n      \"\\n\",\n      \"FUNCTIONS\\n\",\n      \"    acos(...)\\n\",\n      \"        acos(x)\\n\",\n      \"        \\n\",\n      \"        Return the arc cosine (measured in radians) of x.\\n\",\n      \"    \\n\",\n      \"    acosh(...)\\n\",\n      \"        acosh(x)\\n\",\n      \"        \\n\",\n      \"        Return the inverse hyperbolic cosine of x.\\n\",\n      \"    \\n\",\n      \"    asin(...)\\n\",\n      \"        asin(x)\\n\",\n      \"        \\n\",\n      \"        Return the arc sine (measured in radians) of x.\\n\",\n      \"    \\n\",\n      \"    asinh(...)\\n\",\n      \"        asinh(x)\\n\",\n      \"        \\n\",\n      \"        Return the inverse hyperbolic sine of x.\\n\",\n      \"    \\n\",\n      \"    atan(...)\\n\",\n      \"        atan(x)\\n\",\n      \"        \\n\",\n      \"        Return the arc tangent (measured in radians) of x.\\n\",\n      \"    \\n\",\n      \"    atan2(...)\\n\",\n      \"        atan2(y, x)\\n\",\n      \"        \\n\",\n      \"        Return the arc tangent (measured in radians) of y/x.\\n\",\n      \"        Unlike atan(y/x), the signs of both x and y are considered.\\n\",\n      \"    \\n\",\n      \"    atanh(...)\\n\",\n      \"        atanh(x)\\n\",\n      \"        \\n\",\n      \"        Return the inverse hyperbolic tangent of x.\\n\",\n      \"    \\n\",\n      \"    ceil(...)\\n\",\n      \"        ceil(x)\\n\",\n      \"        \\n\",\n      \"        Return the ceiling of x as an Integral.\\n\",\n      \"        This is the smallest integer >= x.\\n\",\n      \"    \\n\",\n      \"    copysign(...)\\n\",\n      \"        copysign(x, y)\\n\",\n      \"        \\n\",\n      \"        Return a float with the magnitude (absolute value) of x but the sign \\n\",\n      \"        of y. On platforms that support signed zeros, copysign(1.0, -0.0) \\n\",\n      \"        returns -1.0.\\n\",\n      \"    \\n\",\n      \"    cos(...)\\n\",\n      \"        cos(x)\\n\",\n      \"        \\n\",\n      \"        Return the cosine of x (measured in radians).\\n\",\n      \"    \\n\",\n      \"    cosh(...)\\n\",\n      \"        cosh(x)\\n\",\n      \"        \\n\",\n      \"        Return the hyperbolic cosine of x.\\n\",\n      \"    \\n\",\n      \"    degrees(...)\\n\",\n      \"        degrees(x)\\n\",\n      \"        \\n\",\n      \"        Convert angle x from radians to degrees.\\n\",\n      \"    \\n\",\n      \"    erf(...)\\n\",\n      \"        erf(x)\\n\",\n      \"        \\n\",\n      \"        Error function at x.\\n\",\n      \"    \\n\",\n      \"    erfc(...)\\n\",\n      \"        erfc(x)\\n\",\n      \"        \\n\",\n      \"        Complementary error function at x.\\n\",\n      \"    \\n\",\n      \"    exp(...)\\n\",\n      \"        exp(x)\\n\",\n      \"        \\n\",\n      \"        Return e raised to the power of x.\\n\",\n      \"    \\n\",\n      \"    expm1(...)\\n\",\n      \"        expm1(x)\\n\",\n      \"        \\n\",\n      \"        Return exp(x)-1.\\n\",\n      \"        This function avoids the loss of precision involved in the direct evaluation of exp(x)-1 for small x.\\n\",\n      \"    \\n\",\n      \"    fabs(...)\\n\",\n      \"        fabs(x)\\n\",\n      \"        \\n\",\n      \"        Return the absolute value of the float x.\\n\",\n      \"    \\n\",\n      \"    factorial(...)\\n\",\n      \"        factorial(x) -> Integral\\n\",\n      \"        \\n\",\n      \"        Find x!. Raise a ValueError if x is negative or non-integral.\\n\",\n      \"    \\n\",\n      \"    floor(...)\\n\",\n      \"        floor(x)\\n\",\n      \"        \\n\",\n      \"        Return the floor of x as an Integral.\\n\",\n      \"        This is the largest integer <= x.\\n\",\n      \"    \\n\",\n      \"    fmod(...)\\n\",\n      \"        fmod(x, y)\\n\",\n      \"        \\n\",\n      \"        Return fmod(x, y), according to platform C.  x % y may differ.\\n\",\n      \"    \\n\",\n      \"    frexp(...)\\n\",\n      \"        frexp(x)\\n\",\n      \"        \\n\",\n      \"        Return the mantissa and exponent of x, as pair (m, e).\\n\",\n      \"        m is a float and e is an int, such that x = m * 2.**e.\\n\",\n      \"        If x is 0, m and e are both 0.  Else 0.5 <= abs(m) < 1.0.\\n\",\n      \"    \\n\",\n      \"    fsum(...)\\n\",\n      \"        fsum(iterable)\\n\",\n      \"        \\n\",\n      \"        Return an accurate floating point sum of values in the iterable.\\n\",\n      \"        Assumes IEEE-754 floating point arithmetic.\\n\",\n      \"    \\n\",\n      \"    gamma(...)\\n\",\n      \"        gamma(x)\\n\",\n      \"        \\n\",\n      \"        Gamma function at x.\\n\",\n      \"    \\n\",\n      \"    gcd(...)\\n\",\n      \"        gcd(x, y) -> int\\n\",\n      \"        greatest common divisor of x and y\\n\",\n      \"    \\n\",\n      \"    hypot(...)\\n\",\n      \"        hypot(x, y)\\n\",\n      \"        \\n\",\n      \"        Return the Euclidean distance, sqrt(x*x + y*y).\\n\",\n      \"    \\n\",\n      \"    isclose(...)\\n\",\n      \"        isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0) -> bool\\n\",\n      \"        \\n\",\n      \"        Determine whether two floating point numbers are close in value.\\n\",\n      \"        \\n\",\n      \"           rel_tol\\n\",\n      \"               maximum difference for being considered \\\"close\\\", relative to the\\n\",\n      \"               magnitude of the input values\\n\",\n      \"            abs_tol\\n\",\n      \"               maximum difference for being considered \\\"close\\\", regardless of the\\n\",\n      \"               magnitude of the input values\\n\",\n      \"        \\n\",\n      \"        Return True if a is close in value to b, and False otherwise.\\n\",\n      \"        \\n\",\n      \"        For the values to be considered close, the difference between them\\n\",\n      \"        must be smaller than at least one of the tolerances.\\n\",\n      \"        \\n\",\n      \"        -inf, inf and NaN behave similarly to the IEEE 754 Standard.  That\\n\",\n      \"        is, NaN is not close to anything, even itself.  inf and -inf are\\n\",\n      \"        only close to themselves.\\n\",\n      \"    \\n\",\n      \"    isfinite(...)\\n\",\n      \"        isfinite(x) -> bool\\n\",\n      \"        \\n\",\n      \"        Return True if x is neither an infinity nor a NaN, and False otherwise.\\n\",\n      \"    \\n\",\n      \"    isinf(...)\\n\",\n      \"        isinf(x) -> bool\\n\",\n      \"        \\n\",\n      \"        Return True if x is a positive or negative infinity, and False otherwise.\\n\",\n      \"    \\n\",\n      \"    isnan(...)\\n\",\n      \"        isnan(x) -> bool\\n\",\n      \"        \\n\",\n      \"        Return True if x is a NaN (not a number), and False otherwise.\\n\",\n      \"    \\n\",\n      \"    ldexp(...)\\n\",\n      \"        ldexp(x, i)\\n\",\n      \"        \\n\",\n      \"        Return x * (2**i).\\n\",\n      \"    \\n\",\n      \"    lgamma(...)\\n\",\n      \"        lgamma(x)\\n\",\n      \"        \\n\",\n      \"        Natural logarithm of absolute value of Gamma function at x.\\n\",\n      \"    \\n\",\n      \"    log(...)\\n\",\n      \"        log(x[, base])\\n\",\n      \"        \\n\",\n      \"        Return the logarithm of x to the given base.\\n\",\n      \"        If the base not specified, returns the natural logarithm (base e) of x.\\n\",\n      \"    \\n\",\n      \"    log10(...)\\n\",\n      \"        log10(x)\\n\",\n      \"        \\n\",\n      \"        Return the base 10 logarithm of x.\\n\",\n      \"    \\n\",\n      \"    log1p(...)\\n\",\n      \"        log1p(x)\\n\",\n      \"        \\n\",\n      \"        Return the natural logarithm of 1+x (base e).\\n\",\n      \"        The result is computed in a way which is accurate for x near zero.\\n\",\n      \"    \\n\",\n      \"    log2(...)\\n\",\n      \"        log2(x)\\n\",\n      \"        \\n\",\n      \"        Return the base 2 logarithm of x.\\n\",\n      \"    \\n\",\n      \"    modf(...)\\n\",\n      \"        modf(x)\\n\",\n      \"        \\n\",\n      \"        Return the fractional and integer parts of x.  Both results carry the sign\\n\",\n      \"        of x and are floats.\\n\",\n      \"    \\n\",\n      \"    pow(...)\\n\",\n      \"        pow(x, y)\\n\",\n      \"        \\n\",\n      \"        Return x**y (x to the power of y).\\n\",\n      \"    \\n\",\n      \"    radians(...)\\n\",\n      \"        radians(x)\\n\",\n      \"        \\n\",\n      \"        Convert angle x from degrees to radians.\\n\",\n      \"    \\n\",\n      \"    sin(...)\\n\",\n      \"        sin(x)\\n\",\n      \"        \\n\",\n      \"        Return the sine of x (measured in radians).\\n\",\n      \"    \\n\",\n      \"    sinh(...)\\n\",\n      \"        sinh(x)\\n\",\n      \"        \\n\",\n      \"        Return the hyperbolic sine of x.\\n\",\n      \"    \\n\",\n      \"    sqrt(...)\\n\",\n      \"        sqrt(x)\\n\",\n      \"        \\n\",\n      \"        Return the square root of x.\\n\",\n      \"    \\n\",\n      \"    tan(...)\\n\",\n      \"        tan(x)\\n\",\n      \"        \\n\",\n      \"        Return the tangent of x (measured in radians).\\n\",\n      \"    \\n\",\n      \"    tanh(...)\\n\",\n      \"        tanh(x)\\n\",\n      \"        \\n\",\n      \"        Return the hyperbolic tangent of x.\\n\",\n      \"    \\n\",\n      \"    trunc(...)\\n\",\n      \"        trunc(x:Real) -> Integral\\n\",\n      \"        \\n\",\n      \"        Truncates x to the nearest Integral toward 0. Uses the __trunc__ magic method.\\n\",\n      \"\\n\",\n      \"DATA\\n\",\n      \"    e = 2.718281828459045\\n\",\n      \"    inf = inf\\n\",\n      \"    nan = nan\\n\",\n      \"    pi = 3.141592653589793\\n\",\n      \"    tau = 6.283185307179586\\n\",\n      \"\\n\",\n      \"FILE\\n\",\n      \"    (built-in)\\n\",\n      \"\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"help(math)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Rounding Numbers\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"value = 4.35\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.floor(value)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"5\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.ceil(value)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"round(value)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Mathematical Constants\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3.141592653589793\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.pi\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from math import pi\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3.141592653589793\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"pi\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2.718281828459045\"\n      ]\n     },\n     \"execution_count\": 23,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.e\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"6.283185307179586\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.tau\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"inf\"\n      ]\n     },\n     \"execution_count\": 25,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.inf\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"nan\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.nan\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Logarithmic Values\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2.718281828459045\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.e\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1.0\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Log Base e\\n\",\n    \"math.log(math.e)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"ValueError\",\n     \"evalue\": \"math domain error\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mValueError\\u001b[0m                                Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-12-7563e0a48092>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mmath\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mlog\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;36m0\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mValueError\\u001b[0m: math domain error\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Will produce an error if value does not exist mathmatically\\n\",\n    \"math.log(0)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2.302585092994046\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.log(10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10.000000000000002\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.e ** 2.302585092994046\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Custom Base\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2.0\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# math.log(x,base)\\n\",\n    \"math.log(100,10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"100\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"10**2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Trigonometrics Functions\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"-0.5440211108893698\"\n      ]\n     },\n     \"execution_count\": 30,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Radians\\n\",\n    \"math.sin(10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"90.0\"\n      ]\n     },\n     \"execution_count\": 31,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.degrees(pi/2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3.141592653589793\"\n      ]\n     },\n     \"execution_count\": 32,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"math.radians(180)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Random Module\\n\",\n    \"\\n\",\n    \"Random Module allows us to create random numbers. We can even set a seed to produce the same random set every time.\\n\",\n    \"\\n\",\n    \"The explanation of how a computer attempts to generate random numbers is beyond the scope of this course since it involves higher level mathmatics. But if you are interested in this topic check out:\\n\",\n    \"* https://en.wikipedia.org/wiki/Pseudorandom_number_generator\\n\",\n    \"* https://en.wikipedia.org/wiki/Random_seed\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Understanding a seed\\n\",\n    \"\\n\",\n    \"Setting a seed allows us to start from a seeded psuedorandom number generator, which means the same random numbers will show up in a series. Note, you need the seed to be in the same cell if your using jupyter to guarantee the same results each time. Getting a same set of random numbers can be important in situations where you will be trying different variations of functions and want to compare their performance on random values, but want to do it fairly (so you need the same set of random numbers each time).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import random\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"62\"\n      ]\n     },\n     \"execution_count\": 41,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.randint(0,100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 42,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10\"\n      ]\n     },\n     \"execution_count\": 42,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.randint(0,100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 45,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"74\"\n      ]\n     },\n     \"execution_count\": 45,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# The value 101 is completely arbitrary, you can pass in any number you want\\n\",\n    \"random.seed(101)\\n\",\n    \"# You can run this cell as many times as you want, it will always return the same number\\n\",\n    \"random.randint(0,100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 46,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"24\"\n      ]\n     },\n     \"execution_count\": 46,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.randint(0,100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 48,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"74\\n\",\n      \"24\\n\",\n      \"69\\n\",\n      \"45\\n\",\n      \"59\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# The value 101 is completely arbitrary, you can pass in any number you want\\n\",\n    \"random.seed(101)\\n\",\n    \"print(random.randint(0,100))\\n\",\n    \"print(random.randint(0,100))\\n\",\n    \"print(random.randint(0,100))\\n\",\n    \"print(random.randint(0,100))\\n\",\n    \"print(random.randint(0,100))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Random Integers\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 49,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"6\"\n      ]\n     },\n     \"execution_count\": 49,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.randint(0,100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Random with Sequences\\n\",\n    \"\\n\",\n    \"#### Grab a random item from a list\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 70,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"mylist = list(range(0,20))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 71,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]\"\n      ]\n     },\n     \"execution_count\": 71,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mylist\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 72,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"12\"\n      ]\n     },\n     \"execution_count\": 72,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.choice(mylist)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 73,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]\"\n      ]\n     },\n     \"execution_count\": 73,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mylist\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Sample with Replacement\\n\",\n    \"\\n\",\n    \"Take a sample size, allowing picking elements more than once. Imagine a bag of numbered lottery balls, you reach in to grab a random lotto ball, then after marking down the number, **you place it back in the bag**, then continue picking another one.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 77,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[15, 14, 17, 8, 17, 2, 19, 17, 6, 1]\"\n      ]\n     },\n     \"execution_count\": 77,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.choices(population=mylist,k=10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Sample without Replacement\\n\",\n    \"\\n\",\n    \"Once an item has been randomly picked, it can't be picked again. Imagine a bag of numbered lottery balls, you reach in to grab a random lotto ball, then after marking down the number, you **leave it out of the bag**, then continue picking another one.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 78,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[17, 19, 11, 14, 1, 3, 4, 10, 5, 15]\"\n      ]\n     },\n     \"execution_count\": 78,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.sample(population=mylist,k=10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Shuffle a list\\n\",\n    \"\\n\",\n    \"**Note: This effects the object in place!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 79,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Don't assign this to anything!\\n\",\n    \"random.shuffle(mylist)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 80,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[9, 11, 7, 12, 10, 16, 0, 2, 18, 13, 3, 5, 17, 1, 15, 6, 14, 19, 4, 8]\"\n      ]\n     },\n     \"execution_count\": 80,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mylist\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Random Distributions\\n\",\n    \"\\n\",\n    \"#### [Uniform Distribution](https://en.wikipedia.org/wiki/Uniform_distribution)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 82,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"23.852305703497635\"\n      ]\n     },\n     \"execution_count\": 82,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Continuous, random picks a value between a and b, each value has equal change of being picked.\\n\",\n    \"random.uniform(a=0,b=100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### [Normal/Gaussian Distribution](https://en.wikipedia.org/wiki/Normal_distribution)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 83,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"-0.21390381464435643\"\n      ]\n     },\n     \"execution_count\": 83,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"random.gauss(mu=0,sigma=1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Final Note: If you find yourself using these libraries a lot, take a look at the NumPy library for Python, covers all these capabilities with extreme efficiency. We cover this library and a lot more in our data science and machine learning courses.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/04-Python Debugger (pdb).ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Python Debugger\\n\",\n    \"\\n\",\n    \"You've probably used a variety of print statements to try to find errors in your code. A better way of doing this is by using Python's built-in debugger module (pdb). The pdb module implements an interactive debugging environment for Python programs. It includes features to let you pause your program, look at the values of variables, and watch program execution step-by-step, so you can understand what your program actually does and find bugs in the logic.\\n\",\n    \"\\n\",\n    \"This is a bit difficult to show since it requires creating an error on purpose, but hopefully this simple example illustrates the power of the pdb module. <br>*Note: Keep in mind it would be pretty unusual to use pdb in an Jupyter Notebook setting.*\\n\",\n    \"\\n\",\n    \"___\\n\",\n    \"Here we will create an error on purpose, trying to add a list to an integer\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"5\\n\"\n     ]\n    },\n    {\n     \"ename\": \"TypeError\",\n     \"evalue\": \"unsupported operand type(s) for +: 'int' and 'list'\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mTypeError\\u001b[0m                                 Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-1-905e8cfe6928>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      5\\u001b[0m \\u001b[0mresult\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[0my\\u001b[0m \\u001b[1;33m+\\u001b[0m \\u001b[0mz\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m      6\\u001b[0m \\u001b[0mprint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mresult\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m----> 7\\u001b[1;33m \\u001b[0mresult2\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[0my\\u001b[0m\\u001b[1;33m+\\u001b[0m\\u001b[0mx\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[0;32m      8\\u001b[0m \\u001b[0mprint\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mresult2\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[1;31mTypeError\\u001b[0m: unsupported operand type(s) for +: 'int' and 'list'\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = [1,3,4]\\n\",\n    \"y = 2\\n\",\n    \"z = 3\\n\",\n    \"\\n\",\n    \"result = y + z\\n\",\n    \"print(result)\\n\",\n    \"result2 = y+x\\n\",\n    \"print(result2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Hmmm, looks like we get an error! Let's implement a set_trace() using the pdb module. This will allow us to basically pause the code at the point of the trace and check if anything is wrong.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"5\\n\",\n      \"--Return--\\n\",\n      \"> <ipython-input-2-1084246755fa>(11)<module>()->None\\n\",\n      \"-> pdb.set_trace()\\n\",\n      \"(Pdb) x\\n\",\n      \"[1, 3, 4]\\n\",\n      \"(Pdb) y\\n\",\n      \"2\\n\",\n      \"(Pdb) result2\\n\",\n      \"*** NameError: name 'result2' is not defined\\n\",\n      \"(Pdb) q\\n\"\n     ]\n    },\n    {\n     \"ename\": \"BdbQuit\",\n     \"evalue\": \"\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mBdbQuit\\u001b[0m                                   Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-2-1084246755fa>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      9\\u001b[0m \\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m     10\\u001b[0m \\u001b[1;31m# Set a trace using Python Debugger\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m---> 11\\u001b[1;33m \\u001b[0mpdb\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mset_trace\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[0;32m     12\\u001b[0m \\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m     13\\u001b[0m \\u001b[0mresult2\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[0my\\u001b[0m\\u001b[1;33m+\\u001b[0m\\u001b[0mx\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[1;32mC:\\\\Users\\\\Marcial\\\\Anaconda3\\\\lib\\\\bdb.py\\u001b[0m in \\u001b[0;36mtrace_dispatch\\u001b[1;34m(self, frame, event, arg)\\u001b[0m\\n\\u001b[0;32m     53\\u001b[0m             \\u001b[1;32mreturn\\u001b[0m \\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mdispatch_call\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mframe\\u001b[0m\\u001b[1;33m,\\u001b[0m \\u001b[0marg\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m     54\\u001b[0m         \\u001b[1;32mif\\u001b[0m \\u001b[0mevent\\u001b[0m \\u001b[1;33m==\\u001b[0m \\u001b[1;34m'return'\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m---> 55\\u001b[1;33m             \\u001b[1;32mreturn\\u001b[0m \\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mdispatch_return\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mframe\\u001b[0m\\u001b[1;33m,\\u001b[0m \\u001b[0marg\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[0;32m     56\\u001b[0m         \\u001b[1;32mif\\u001b[0m \\u001b[0mevent\\u001b[0m \\u001b[1;33m==\\u001b[0m \\u001b[1;34m'exception'\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m     57\\u001b[0m             \\u001b[1;32mreturn\\u001b[0m \\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mdispatch_exception\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mframe\\u001b[0m\\u001b[1;33m,\\u001b[0m \\u001b[0marg\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[1;32mC:\\\\Users\\\\Marcial\\\\Anaconda3\\\\lib\\\\bdb.py\\u001b[0m in \\u001b[0;36mdispatch_return\\u001b[1;34m(self, frame, arg)\\u001b[0m\\n\\u001b[0;32m     97\\u001b[0m             \\u001b[1;32mfinally\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m     98\\u001b[0m                 \\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mframe_returning\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[1;32mNone\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m---> 99\\u001b[1;33m             \\u001b[1;32mif\\u001b[0m \\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mquitting\\u001b[0m\\u001b[1;33m:\\u001b[0m \\u001b[1;32mraise\\u001b[0m \\u001b[0mBdbQuit\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[0;32m    100\\u001b[0m             \\u001b[1;31m# The user issued a 'next' or 'until' command.\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m    101\\u001b[0m             \\u001b[1;32mif\\u001b[0m \\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mstopframe\\u001b[0m \\u001b[1;32mis\\u001b[0m \\u001b[0mframe\\u001b[0m \\u001b[1;32mand\\u001b[0m \\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mstoplineno\\u001b[0m \\u001b[1;33m!=\\u001b[0m \\u001b[1;33m-\\u001b[0m\\u001b[1;36m1\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[1;31mBdbQuit\\u001b[0m: \"\n     ]\n    }\n   ],\n   \"source\": [\n    \"import pdb\\n\",\n    \"\\n\",\n    \"x = [1,3,4]\\n\",\n    \"y = 2\\n\",\n    \"z = 3\\n\",\n    \"\\n\",\n    \"result = y + z\\n\",\n    \"print(result)\\n\",\n    \"\\n\",\n    \"# Set a trace using Python Debugger\\n\",\n    \"pdb.set_trace()\\n\",\n    \"\\n\",\n    \"result2 = y+x\\n\",\n    \"print(result2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Now we could check what the various variables were and check for errors. You can use 'q' to quit the debugger. For more information on general debugging techniques and more methods, check out the official documentation:\\n\",\n    \"https://docs.python.org/3/library/pdb.html\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/05-Overview-of-Regular-Expressions.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Overview of Regular Expressions\\n\",\n    \"\\n\",\n    \"Regular Expressions (sometimes called regex for short) allows a user to search for strings using almost any sort of rule they can come up. For example, finding all capital letters in a string, or finding a phone number in a document. \\n\",\n    \"\\n\",\n    \"Regular expressions are notorious for their seemingly strange syntax. This strange syntax is a byproduct of their flexibility. Regular expressions have to be able to filter out any string pattern you can imagine, which is why they have a complex string pattern format.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's begin by explaining how to search for basic patterns in a string!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Searching for Basic Patterns\\n\",\n    \"\\n\",\n    \"Let's imagine that we have the following string:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"text = \\\"The person's phone number is 408-555-1234. Call soon!\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We'll start off by trying to find out if the string \\\"phone\\\" is inside the text string. Now we could quickly do this with:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"'phone' in text\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"But let's show the format for regular expressions, because later on we will be searching for patterns that won't have such a simple solution.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import re\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pattern = 'phone'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<_sre.SRE_Match object; span=(13, 18), match='phone'>\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.search(pattern,text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pattern = \\\"NOT IN TEXT\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"re.search(pattern,text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we've seen that re.search() will take the pattern, scan the text, and then returns a Match object. If no pattern is found, a None is returned (in Jupyter Notebook this just means that nothing is output below the cell).\\n\",\n    \"\\n\",\n    \"Let's take a closer look at this Match object.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pattern = 'phone'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"match = re.search(pattern,text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<_sre.SRE_Match object; span=(13, 18), match='phone'>\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"match\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice the span, there is also a start and end index information.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(13, 18)\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"match.span()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"13\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"match.start()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"18\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"match.end()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"But what if the pattern occurs more than once?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"text = \\\"my phone is a new phone\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"match = re.search(\\\"phone\\\",text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(3, 8)\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"match.span()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice it only matches the first instance. If we wanted a list of all matches, we can use .findall() method:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"matches = re.findall(\\\"phone\\\",text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['phone', 'phone']\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"matches\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(matches)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"To get actual match objects, use the iterator:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"(3, 8)\\n\",\n      \"(18, 23)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for match in re.finditer(\\\"phone\\\",text):\\n\",\n    \"    print(match.span())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you wanted the actual text that matched, you can use the .group() method.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'phone'\"\n      ]\n     },\n     \"execution_count\": 21,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"match.group()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Patterns\\n\",\n    \"\\n\",\n    \"So far we've learned how to search for a basic string. What about more complex examples? Such as trying to find a telephone number in a large string of text? Or an email address?\\n\",\n    \"\\n\",\n    \"We could just use search method if we know the exact phone or email, but what if we don't know it? We may know the general format, and we can use that along with regular expressions to search the document for strings that match a particular pattern.\\n\",\n    \"\\n\",\n    \"This is where the syntax may appear strange at first, but take your time with this, often its just a matter of looking up the pattern code.\\n\",\n    \"\\n\",\n    \"Let' begin!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Identifiers for Characters in Patterns\\n\",\n    \"\\n\",\n    \"Characters such as a digit or a single string have different codes that represent them. You can use these to build up a pattern string. Notice how these make heavy use of the backwards slash \\\\ . Because of this when defining a pattern string for regular expression we use the format:\\n\",\n    \"\\n\",\n    \"    r'mypattern'\\n\",\n    \"    \\n\",\n    \"placing the r in front of the string allows python to understand that the \\\\ in the pattern string are not meant to be escape slashes.\\n\",\n    \"\\n\",\n    \"Below you can find a table of all the possible identifiers:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<table ><tr><th>Character</th><th>Description</th><th>Example Pattern Code</th><th >Exammple Match</th></tr>\\n\",\n    \"\\n\",\n    \"<tr ><td><span >\\\\d</span></td><td>A digit</td><td>file_\\\\d\\\\d</td><td>file_25</td></tr>\\n\",\n    \"\\n\",\n    \"<tr ><td><span >\\\\w</span></td><td>Alphanumeric</td><td>\\\\w-\\\\w\\\\w\\\\w</td><td>A-b_1</td></tr>\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"<tr ><td><span >\\\\s</span></td><td>White space</td><td>a\\\\sb\\\\sc</td><td>a b c</td></tr>\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"<tr ><td><span >\\\\D</span></td><td>A non digit</td><td>\\\\D\\\\D\\\\D</td><td>ABC</td></tr>\\n\",\n    \"\\n\",\n    \"<tr ><td><span >\\\\W</span></td><td>Non-alphanumeric</td><td>\\\\W\\\\W\\\\W\\\\W\\\\W</td><td>*-+=)</td></tr>\\n\",\n    \"\\n\",\n    \"<tr ><td><span >\\\\S</span></td><td>Non-whitespace</td><td>\\\\S\\\\S\\\\S\\\\S</td><td>Yoyo</td></tr></table>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"text = \\\"My telephone number is 408-555-1234\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"phone = re.search(r'\\\\d\\\\d\\\\d-\\\\d\\\\d\\\\d-\\\\d\\\\d\\\\d\\\\d',text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'408-555-1234'\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"phone.group()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice the repetition of \\\\d. That is a bit of an annoyance, especially if we are looking for very long strings of numbers. Let's explore the possible quantifiers.\\n\",\n    \"\\n\",\n    \"## Quantifiers\\n\",\n    \"\\n\",\n    \"Now that we know the special character designations, we can use them along with quantifiers to define how many we expect.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<table ><tr><th>Character</th><th>Description</th><th>Example Pattern Code</th><th >Exammple Match</th></tr>\\n\",\n    \"\\n\",\n    \"<tr ><td><span >+</span></td><td>Occurs one or more times</td><td>\\tVersion \\\\w-\\\\w+</td><td>Version A-b1_1</td></tr>\\n\",\n    \"\\n\",\n    \"<tr ><td><span >{3}</span></td><td>Occurs exactly 3 times</td><td>\\\\D{3}</td><td>abc</td></tr>\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"<tr ><td><span >{2,4}</span></td><td>Occurs 2 to 4 times</td><td>\\\\d{2,4}</td><td>123</td></tr>\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"<tr ><td><span >{3,}</span></td><td>Occurs 3 or more</td><td>\\\\w{3,}</td><td>anycharacters</td></tr>\\n\",\n    \"\\n\",\n    \"<tr ><td><span >\\\\*</span></td><td>Occurs zero or more times</td><td>A\\\\*B\\\\*C*</td><td>AAACC</td></tr>\\n\",\n    \"\\n\",\n    \"<tr ><td><span >?</span></td><td>Once or none</td><td>plurals?</td><td>plural</td></tr></table>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's rewrite our pattern using these quantifiers:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<_sre.SRE_Match object; span=(23, 35), match='408-555-1234'>\"\n      ]\n     },\n     \"execution_count\": 25,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.search(r'\\\\d{3}-\\\\d{3}-\\\\d{4}',text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Groups\\n\",\n    \"\\n\",\n    \"What if we wanted to do two tasks, find phone numbers, but also be able to quickly extract their area code (the first three digits). We can use groups for any general task that involves grouping together regular expressions (so that we can later break them down). \\n\",\n    \"\\n\",\n    \"Using the phone number example, we can separate groups of regular expressions using parenthesis:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"phone_pattern = re.compile(r'(\\\\d{3})-(\\\\d{3})-(\\\\d{4})')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"results = re.search(phone_pattern,text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'408-555-1234'\"\n      ]\n     },\n     \"execution_count\": 28,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# The entire result\\n\",\n    \"results.group()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'408'\"\n      ]\n     },\n     \"execution_count\": 29,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Can then also call by group position.\\n\",\n    \"# remember groups were separated by parenthesis ()\\n\",\n    \"# Something to note is that group ordering starts at 1. Passing in 0 returns everything\\n\",\n    \"results.group(1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'555'\"\n      ]\n     },\n     \"execution_count\": 30,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"results.group(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'1234'\"\n      ]\n     },\n     \"execution_count\": 31,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"results.group(3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"IndexError\",\n     \"evalue\": \"no such group\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mIndexError\\u001b[0m                                Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-32-866de7a94a57>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      1\\u001b[0m \\u001b[1;31m# We only had three groups of parenthesis\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m----> 2\\u001b[1;33m \\u001b[0mresults\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mgroup\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;36m4\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mIndexError\\u001b[0m: no such group\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# We only had three groups of parenthesis\\n\",\n    \"results.group(4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Additional Regex Syntax\\n\",\n    \"\\n\",\n    \"### Or operator |\\n\",\n    \"\\n\",\n    \"Use the pipe operator to have an **or** statment. For example\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<_sre.SRE_Match object; span=(5, 8), match='man'>\"\n      ]\n     },\n     \"execution_count\": 33,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.search(r\\\"man|woman\\\",\\\"This man was here.\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<_sre.SRE_Match object; span=(5, 10), match='woman'>\"\n      ]\n     },\n     \"execution_count\": 34,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.search(r\\\"man|woman\\\",\\\"This woman was here.\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### The Wildcard Character\\n\",\n    \"\\n\",\n    \"Use a \\\"wildcard\\\" as a placement that will match any character placed there. You can use a simple period **.** for this. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['cat', 'hat', 'sat']\"\n      ]\n     },\n     \"execution_count\": 35,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.findall(r\\\".at\\\",\\\"The cat in the hat sat here.\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['bat', 'lat']\"\n      ]\n     },\n     \"execution_count\": 36,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.findall(r\\\".at\\\",\\\"The bat went splat\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice how we only matched the first 3 letters, that is because we need a **.** for each wildcard letter. Or use the quantifiers described above to set its own rules.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['e bat', 'splat']\"\n      ]\n     },\n     \"execution_count\": 37,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.findall(r\\\"...at\\\",\\\"The bat went splat\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"However this still leads the problem to grabbing more beforehand. Really we only want words that end with \\\"at\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 38,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['bat', 'splat']\"\n      ]\n     },\n     \"execution_count\": 38,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# One or more non-whitespace that ends with 'at'\\n\",\n    \"re.findall(r'\\\\S+at',\\\"The bat went splat\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Starts with and Ends With\\n\",\n    \"\\n\",\n    \"We can use the **^** to signal starts with, and the **$** to signal ends with:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['2']\"\n      ]\n     },\n     \"execution_count\": 39,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Ends with a number\\n\",\n    \"re.findall(r'\\\\d$','This ends with a number 2')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 40,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['1']\"\n      ]\n     },\n     \"execution_count\": 40,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Starts with a number\\n\",\n    \"re.findall(r'^\\\\d','1 is the loneliest number.')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note that this is for the entire string, not individual words!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Exclusion\\n\",\n    \"\\n\",\n    \"To exclude characters, we can use the **^** symbol in conjunction with a set of brackets **[]**. Anything inside the brackets is excluded. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"phrase = \\\"there are 3 numbers 34 inside 5 this sentence.\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 42,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['t',\\n\",\n       \" 'h',\\n\",\n       \" 'e',\\n\",\n       \" 'r',\\n\",\n       \" 'e',\\n\",\n       \" ' ',\\n\",\n       \" 'a',\\n\",\n       \" 'r',\\n\",\n       \" 'e',\\n\",\n       \" ' ',\\n\",\n       \" ' ',\\n\",\n       \" 'n',\\n\",\n       \" 'u',\\n\",\n       \" 'm',\\n\",\n       \" 'b',\\n\",\n       \" 'e',\\n\",\n       \" 'r',\\n\",\n       \" 's',\\n\",\n       \" ' ',\\n\",\n       \" ' ',\\n\",\n       \" 'i',\\n\",\n       \" 'n',\\n\",\n       \" 's',\\n\",\n       \" 'i',\\n\",\n       \" 'd',\\n\",\n       \" 'e',\\n\",\n       \" ' ',\\n\",\n       \" ' ',\\n\",\n       \" 't',\\n\",\n       \" 'h',\\n\",\n       \" 'i',\\n\",\n       \" 's',\\n\",\n       \" ' ',\\n\",\n       \" 's',\\n\",\n       \" 'e',\\n\",\n       \" 'n',\\n\",\n       \" 't',\\n\",\n       \" 'e',\\n\",\n       \" 'n',\\n\",\n       \" 'c',\\n\",\n       \" 'e',\\n\",\n       \" '.']\"\n      ]\n     },\n     \"execution_count\": 42,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.findall(r'[^\\\\d]',phrase)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"To get the words back together, use a + sign \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 43,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['there are ', ' numbers ', ' inside ', ' this sentence.']\"\n      ]\n     },\n     \"execution_count\": 43,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.findall(r'[^\\\\d]+',phrase)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can use this to remove punctuation from a sentence.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 44,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"test_phrase = 'This is a string! But it has punctuation. How can we remove it?'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 45,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['This',\\n\",\n       \" 'is',\\n\",\n       \" 'a',\\n\",\n       \" 'string',\\n\",\n       \" 'But',\\n\",\n       \" 'it',\\n\",\n       \" 'has',\\n\",\n       \" 'punctuation',\\n\",\n       \" 'How',\\n\",\n       \" 'can',\\n\",\n       \" 'we',\\n\",\n       \" 'remove',\\n\",\n       \" 'it']\"\n      ]\n     },\n     \"execution_count\": 45,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.findall('[^!.? ]+',test_phrase)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 46,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"clean = ' '.join(re.findall('[^!.? ]+',test_phrase))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 47,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'This is a string But it has punctuation How can we remove it'\"\n      ]\n     },\n     \"execution_count\": 47,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"clean\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Brackets for Grouping\\n\",\n    \"\\n\",\n    \"As we showed above we can use brackets to group together options, for example if we wanted to find hyphenated words:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 48,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"text = 'Only find the hypen-words in this sentence. But you do not know how long-ish they are'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 49,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['hypen-words', 'long-ish']\"\n      ]\n     },\n     \"execution_count\": 49,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.findall(r'[\\\\w]+-[\\\\w]+',text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Parenthesis for Multiple Options\\n\",\n    \"\\n\",\n    \"If we have multiple options for matching, we can use parenthesis to list out these options. For Example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 50,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Find words that start with cat and end with one of these options: 'fish','nap', or 'claw'\\n\",\n    \"text = 'Hello, would you like some catfish?'\\n\",\n    \"texttwo = \\\"Hello, would you like to take a catnap?\\\"\\n\",\n    \"textthree = \\\"Hello, have you seen this caterpillar?\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 51,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<_sre.SRE_Match object; span=(27, 34), match='catfish'>\"\n      ]\n     },\n     \"execution_count\": 51,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.search(r'cat(fish|nap|claw)',text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 52,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<_sre.SRE_Match object; span=(32, 38), match='catnap'>\"\n      ]\n     },\n     \"execution_count\": 52,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.search(r'cat(fish|nap|claw)',texttwo)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 53,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# None returned\\n\",\n    \"re.search(r'cat(fish|nap|claw)',textthree)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Conclusion\\n\",\n    \"\\n\",\n    \"Excellent work! For full information on all possible patterns, check out: https://docs.python.org/3/howto/regex.html\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/06-Timing your code - timeit.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Timing your code\\n\",\n    \"Sometimes it's important to know how long your code is taking to run, or at least know if a particular line of code is slowing down your entire project. Python has a built-in timing module to do this. \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example Function or Script\\n\",\n    \"\\n\",\n    \"Here we have two functions that do the same thing, but in different ways.\\n\",\n    \"How can we tell which one is more efficient? Let's time it!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def func_one(n):\\n\",\n    \"    '''\\n\",\n    \"    Given a number n, returns a list of string integers\\n\",\n    \"    ['0','1','2',...'n]\\n\",\n    \"    '''\\n\",\n    \"    return [str(num) for num in range(n)]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"func_one(10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def func_two(n):\\n\",\n    \"    '''\\n\",\n    \"    Given a number n, returns a list of string integers\\n\",\n    \"    ['0','1','2',...'n]\\n\",\n    \"    '''\\n\",\n    \"    return list(map(str,range(n)))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"func_two(10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Timing Start and Stop\\n\",\n    \"\\n\",\n    \"We can try using the time module to simply calculate the elapsed time for the code. Keep in mind, due to the time module's precision, the code needs to take **at least** 0.1 seconds to complete.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 57,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import time\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 58,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# STEP 1: Get start time\\n\",\n    \"start_time = time.time()\\n\",\n    \"# Step 2: Run your code you want to time\\n\",\n    \"result = func_one(1000000)\\n\",\n    \"# Step 3: Calculate total time elapsed\\n\",\n    \"end_time = time.time() - start_time\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 59,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.18550348281860352\"\n      ]\n     },\n     \"execution_count\": 59,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"end_time\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 60,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# STEP 1: Get start time\\n\",\n    \"start_time = time.time()\\n\",\n    \"# Step 2: Run your code you want to time\\n\",\n    \"result = func_two(1000000)\\n\",\n    \"# Step 3: Calculate total time elapsed\\n\",\n    \"end_time = time.time() - start_time\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 61,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0.1496279239654541\"\n      ]\n     },\n     \"execution_count\": 61,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"end_time\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Timeit Module\\n\",\n    \"\\n\",\n    \"What if we have two blocks of code that are quite fast, the difference from the time.time() method may not be enough to tell which is fater. In this case, we can use the timeit module.\\n\",\n    \"\\n\",\n    \"The timeit module takes in two strings, a statement (stmt) and a setup. It then runs the setup code and runs the stmt code some n number of times and reports back average length of time it took.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import timeit\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The setup (anything that needs to be defined beforehand, such as def functions.)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"setup = '''\\n\",\n    \"def func_one(n):\\n\",\n    \"    return [str(num) for num in range(n)]\\n\",\n    \"'''\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 40,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"stmt = 'func_one(100)'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1.3161248000000114\"\n      ]\n     },\n     \"execution_count\": 41,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"timeit.timeit(stmt,setup,number=100000)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now let try running func_two 10,000 times and compare the length of time it took.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 42,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"setup2 = '''\\n\",\n    \"def func_two(n):\\n\",\n    \"    return list(map(str,range(n)))\\n\",\n    \"'''\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 43,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"stmt2 = 'func_two(100)'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 44,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1.0892171000000417\"\n      ]\n     },\n     \"execution_count\": 44,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"timeit.timeit(stmt2,setup2,number=100000)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"It looks like func_two is more efficient. You can specify more number of runs if you want to clarify the different for fast performing functions.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 45,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"13.129837899999984\"\n      ]\n     },\n     \"execution_count\": 45,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"timeit.timeit(stmt,setup,number=1000000)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 46,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"10.894090699999992\"\n      ]\n     },\n     \"execution_count\": 46,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"timeit.timeit(stmt2,setup2,number=1000000)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Timing you code with Jupyter \\\"magic\\\" method\\n\",\n    \"\\n\",\n    \"**NOTE: This method is ONLY available in Jupyter and the magic command needs to be at the top of the cell with nothing above it (not even commented code)**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 63,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"100000 loops, best of 3: 13.4 µs per loop\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%timeit\\n\",\n    \"func_one(100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 64,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"100000 loops, best of 3: 10.9 µs per loop\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%timeit\\n\",\n    \"func_two(100)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! Check out the documentation for more information:\\n\",\n    \"https://docs.python.org/3/library/timeit.html\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/07-Unzipping-and-Zipping-Files.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Unzipping and Zipping Files\\n\",\n    \"\\n\",\n    \"As you are probably aware, files can be compressed to a zip format. Often people use special programs on their computer to unzip these files, luckily for us, Python can do the same task with just a few simple lines of code.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Create Files to Compress\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# slashes may need to change for MacOS or Linux\\n\",\n    \"f = open(\\\"new_file.txt\\\",'w+')\\n\",\n    \"f.write(\\\"Here is some text\\\")\\n\",\n    \"f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# slashes may need to change for MacOS or Linux\\n\",\n    \"f = open(\\\"new_file2.txt\\\",'w+')\\n\",\n    \"f.write(\\\"Here is some text\\\")\\n\",\n    \"f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Zipping Files\\n\",\n    \"\\n\",\n    \"The [zipfile library](https://docs.python.org/3/library/zipfile.html) is built in to Python, we can use it to compress folders or files. To compress all files in a folder, just use the os.walk() method to iterate this process for all the files in a directory.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import zipfile\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \" Create Zip file first , then write to it (the write step compresses the files.)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"comp_file = zipfile.ZipFile('comp_file.zip','w')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"comp_file.write(\\\"new_file.txt\\\",compress_type=zipfile.ZIP_DEFLATED)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"comp_file.write('new_file2.txt',compress_type=zipfile.ZIP_DEFLATED)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"comp_file.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Extracting from Zip Files\\n\",\n    \"\\n\",\n    \"We can easily extract files with either the extractall() method to get all the files, or just using the extract() method to only grab individual files.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"zip_obj = zipfile.ZipFile('comp_file.zip','r')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"zip_obj.extractall(\\\"extracted_content\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"________\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Using shutil library\\n\",\n    \"\\n\",\n    \"Often you don't want to extract or archive individual files from a .zip, but instead archive everything at once. The shutil library that is built in to python has easy to use commands for this:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import shutil\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The shutil library can accept a format parameter, `format` is the archive format: one of \\\"zip\\\", \\\"tar\\\", \\\"gztar\\\", \\\"bztar\\\",\\n\",\n    \"or \\\"xztar\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\12-Advanced Python Modules'\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"pwd\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"directory_to_zip='C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\12-Advanced Python Modules'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\12-Advanced Python Modules\\\\\\\\example.zip'\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Creating a zip archive\\n\",\n    \"output_filename = 'example'\\n\",\n    \"# Just fill in the output_filename and the directory to zip\\n\",\n    \"# Note this won't run as is because the variable are undefined\\n\",\n    \"shutil.make_archive(output_filename,'zip',directory_to_zip)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Extracting a zip archive\\n\",\n    \"# Notice how the parameter/argument order is slightly different here\\n\",\n    \"dir_for_extract_result = 'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Extract' # Change to your desired path\\n\",\n    \"shutil.unpack_archive(output_filename,dir_for_extract_result,'zip')\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python [conda env:base] *\",\n   \"language\": \"python\",\n   \"name\": \"conda-base-py\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.12.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/.ipynb_checkpoints/07-Advanced-Modules-Exercise-Puzzle-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Advanced Modules Exercise Puzzle\\n\",\n    \"\\n\",\n    \"It's time to test your new skills, this puzzle project will combine multiple skills sets, including unzipping files with Python, using os module to automatically search through lots of files.\\n\",\n    \"\\n\",\n    \"## Your Goal\\n\",\n    \"\\n\",\n    \"This is a puzzle, so we don't want to give you too much guidance and instead have you figure out things on your own.\\n\",\n    \"\\n\",\n    \"There is a .zip file called 'unzip_me_for_instructions.zip', unzip it, open the .txt file with Python, read the instructions and see if you can figure out what you need to do!\\n\",\n    \"\\n\",\n    \"**If you get stuck or don't know where to start, here is a [guide/hints](https://docs.google.com/document/d/1JxydUr4n4fSR0EwwuwT-aHia-yPK6r-oTBuVT2sqheo/edit?usp=sharing)**\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"anaconda-cloud\": {},\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/.ipynb_checkpoints/08-Advanced-Modules-Exercise-Solutions-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Advanced Modules Exercise Solutions\\n\",\n    \"\\n\",\n    \"It's time to test your new skills, this puzzle project will combine multiple skills sets, including unzipping files with Python, using os module to automatically search through lots of files.\\n\",\n    \"\\n\",\n    \"## Your Goal\\n\",\n    \"\\n\",\n    \"This is a puzzle, so we don't want to give you too much guidance and instead have you figure out things on your own.\\n\",\n    \"\\n\",\n    \"There is a .zip file called 'unzip_me_for_instructions.zip', unzip it, open the .txt file with Python, read the instructions and see if you can figure out what you need to do!\\n\",\n    \"\\n\",\n    \"**If you get stuck or don't know where to start, here is a [guide/hints](https://docs.google.com/document/d/1JxydUr4n4fSR0EwwuwT-aHia-yPK6r-oTBuVT2sqheo/edit?usp=sharing)**\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Step 1: Unzipping the File\\n\",\n    \"\\n\",\n    \"We can easily use the shutil library to extract and unzip the contents of the .zip file\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import shutil\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"shutil.unpack_archive('unzip_me_for_instructions.zip','','zip')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Step 2: Read the instructions file\\n\",\n    \"\\n\",\n    \"Let's figure out what we need to do, open the instructions.txt file.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Good work on unzipping the file!\\n\",\n      \"You should now see 5 folders, each with a lot of random .txt files.\\n\",\n      \"Within one of these text files is a telephone number formated ###-###-#### \\n\",\n      \"Use the Python os module and regular expressions to iterate through each file, open it, and search for a telephone number.\\n\",\n      \"Good luck!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"with open('extracted_content/Instructions.txt') as f:\\n\",\n    \"    content = f.read()\\n\",\n    \"    print(content)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Step 3: Regular Expression to Find the Link\\n\",\n    \"\\n\",\n    \"There are many approaches to take here, but since we know we are looking for a phone number, there should be a digits in the form ###-###-####, so we can easily create a regex expression for this and test it. Once its tested and working, we can figure out how to run it through all the txt documents.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import re\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pattern = r'\\\\d{3}-\\\\d{3}-\\\\d{4}'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"test_string = \\\"here is a random number 1231231234 , here is phone number formatted 123-123-1234\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['123-123-1234']\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.findall(pattern,test_string)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Step 4: Create a function for regex\\n\",\n    \"\\n\",\n    \"Let's put this inside a function that applies it to the contents of a .txt file, this way we can apply this function to all the txt files in the extracted_content folder.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def search(file,pattern= r'\\\\d{3}-\\\\d{3}-\\\\d{4}'):\\n\",\n    \"    f = open(file,'r')\\n\",\n    \"    text = f.read()\\n\",\n    \"    \\n\",\n    \"    if re.search(pattern,text):\\n\",\n    \"        return re.search(pattern,text)\\n\",\n    \"    else:\\n\",\n    \"        return ''\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Step 5: OS Walk through the Files to Get the Link\\n\",\n    \"\\n\",\n    \"Now that we have a basic function to search through the text of the files, let's perform an os.walk through the unzipped directory to find the links hidden somewhere in one of the text files.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import os\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"results = []\\n\",\n    \"for folder , sub_folders , files in os.walk(os.getcwd()+\\\"\\\\\\\\extracted_content\\\"):\\n\",\n    \"    \\n\",\n    \"    for f in files:\\n\",\n    \"        full_path = folder+'\\\\\\\\'+f\\n\",\n    \"         \\n\",\n    \"        results.append(search(full_path)) \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"719-266-2837\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for r in results:\\n\",\n    \"    if r != '':\\n\",\n    \"        print(r.group())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"Excellent work! More information on this phone number:\\n\",\n    \"* https://www.npr.org/2011/12/21/144069758/callin-oates-the-hotline-you-dont-need-but-might-call-anyway\\n\",\n    \"* https://twitter.com/CallinOates\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"anaconda-cloud\": {},\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/07-Advanced-Modules-Exercise-Puzzle.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Advanced Modules Exercise Puzzle\\n\",\n    \"\\n\",\n    \"It's time to test your new skills, this puzzle project will combine multiple skills sets, including unzipping files with Python, using os module to automatically search through lots of files.\\n\",\n    \"\\n\",\n    \"## Your Goal\\n\",\n    \"\\n\",\n    \"This is a puzzle, so we don't want to give you too much guidance and instead have you figure out things on your own.\\n\",\n    \"\\n\",\n    \"There is a .zip file called 'unzip_me_for_instructions.zip', unzip it, open the .txt file with Python, read the instructions and see if you can figure out what you need to do!\\n\",\n    \"\\n\",\n    \"**If you get stuck or don't know where to start, here is a [guide/hints](https://docs.google.com/document/d/1JxydUr4n4fSR0EwwuwT-aHia-yPK6r-oTBuVT2sqheo/edit?usp=sharing)**\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"anaconda-cloud\": {},\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/08-Advanced-Modules-Exercise-Solutions.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Advanced Modules Exercise Solutions\\n\",\n    \"\\n\",\n    \"It's time to test your new skills, this puzzle project will combine multiple skills sets, including unzipping files with Python, using os module to automatically search through lots of files.\\n\",\n    \"\\n\",\n    \"## Your Goal\\n\",\n    \"\\n\",\n    \"This is a puzzle, so we don't want to give you too much guidance and instead have you figure out things on your own.\\n\",\n    \"\\n\",\n    \"There is a .zip file called 'unzip_me_for_instructions.zip', unzip it, open the .txt file with Python, read the instructions and see if you can figure out what you need to do!\\n\",\n    \"\\n\",\n    \"**If you get stuck or don't know where to start, here is a [guide/hints](https://docs.google.com/document/d/1JxydUr4n4fSR0EwwuwT-aHia-yPK6r-oTBuVT2sqheo/edit?usp=sharing)**\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Step 1: Unzipping the File\\n\",\n    \"\\n\",\n    \"We can easily use the shutil library to extract and unzip the contents of the .zip file\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import shutil\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"shutil.unpack_archive('unzip_me_for_instructions.zip','','zip')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Step 2: Read the instructions file\\n\",\n    \"\\n\",\n    \"Let's figure out what we need to do, open the instructions.txt file.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Good work on unzipping the file!\\n\",\n      \"You should now see 5 folders, each with a lot of random .txt files.\\n\",\n      \"Within one of these text files is a telephone number formated ###-###-#### \\n\",\n      \"Use the Python os module and regular expressions to iterate through each file, open it, and search for a telephone number.\\n\",\n      \"Good luck!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"with open('extracted_content/Instructions.txt') as f:  # Adjust path if necessary (Caution: Windows vs Unix)\\n\",\n    \"    content = f.read()\\n\",\n    \"    print(content)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Step 3: Regular Expression to Find the Link\\n\",\n    \"\\n\",\n    \"There are many approaches to take here, but since we know we are looking for a phone number, there should be a digits in the form ###-###-####, so we can easily create a regex expression for this and test it. Once its tested and working, we can figure out how to run it through all the txt documents.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import re\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pattern = r'\\\\d{3}-\\\\d{3}-\\\\d{4}'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"test_string = \\\"here is a random number 1231231234 , here is phone number formatted 123-123-1234\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['123-123-1234']\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"re.findall(pattern,test_string)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Step 4: Create a function for regex\\n\",\n    \"\\n\",\n    \"Let's put this inside a function that applies it to the contents of a .txt file, this way we can apply this function to all the txt files in the extracted_content folder.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def search(file,pattern= r'\\\\d{3}-\\\\d{3}-\\\\d{4}'):\\n\",\n    \"    f = open(file,'r')\\n\",\n    \"    text = f.read()\\n\",\n    \"    \\n\",\n    \"    if re.search(pattern,text):\\n\",\n    \"        return re.search(pattern,text)\\n\",\n    \"    else:\\n\",\n    \"        return ''\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Step 5: OS Walk through the Files to Get the Link\\n\",\n    \"\\n\",\n    \"Now that we have a basic function to search through the text of the files, let's perform an os.walk through the unzipped directory to find the links hidden somewhere in one of the text files.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import os\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"results = []\\n\",\n    \"for folder , sub_folders , files in os.walk(os.getcwd()+\\\"\\\\\\\\extracted_content\\\"): # Adjust path if necessary (Caution: Windows vs Unix)\\n\",\n    \"    \\n\",\n    \"    for f in files:\\n\",\n    \"        full_path = folder+'\\\\\\\\'+f # Replace \\\\\\\\ by / if using a Unix based OS\\n\",\n    \"         \\n\",\n    \"        results.append(search(full_path)) \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"719-266-2837\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for r in results:\\n\",\n    \"    if r != '':\\n\",\n    \"        print(r.group())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"Excellent work! More information on this phone number:\\n\",\n    \"* https://www.npr.org/2011/12/21/144069758/callin-oates-the-hotline-you-dont-need-but-might-call-anyway\\n\",\n    \"* https://twitter.com/CallinOates\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"anaconda-cloud\": {},\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/AEITMYIRQLP.txt",
    "content": "Eget potenti dictumstvivamus ullamcorper.Veniam nunc condimentum, dapibusnam zzril lacus sanctus venenatis mollis no nibh.Antesuspendisse vestibulum illum netus nullasuspendisse, labore consetetur eget.Accumsan sadipscing, libero metus habitant consequat est blandit fermentumfusce.Muspellentesque mus hac leo adipiscing enimnulla, justo nostra auctor convallis.Vestibulumnulla pulvinar libero.Leopraesent dictum lectusnullam, mollis sollicitudin scelerisque no.Sedfusce habitasse, mattis varius metusdonec habitant per.Venenatis magnis massa duo dapibusnam tristique.Imperdietaliquam dictum arcumorbi placerat, zzril imperdiet adipiscing massaphasellus hac dignissim.Nec invidunt tation.Leo blandit mauris ridiculus, dapibus eirmod sempermorbi ea malesuadanullam urnamorbi.Eum ametduis soluta.Erat turpis aaenean liberoduis montes, volutpatut vivamus libero.Sodalessed sagittis ultriciespellentesque, elitvivamus eum consectetuer nequeetiam accumsan nostra sadipscing imperdietaliquam.Ipsuminteger malesuada tortorvestibulum felis.Aliquam imperdiet dolore in, ullamcorper liberoduis nisised.Elitr pulvinarvestibulum consectetuer at, doming est cum nonumy maurisaenean in mi vulputate nullamauris.Arcu facilisi nonummy.Laoreet id auctor illum, veniam bibendum potenti ipsumcurabitur varius.Etiam interdumdonec massaphasellus eros eu pellentesque.Vel class auctormauris mollis liberoduis, litora aptent iriure justocras enimnulla semper quod.Esse accusam sodales vitae dapibusnam, nostra in justocras sagittis invidunt erat.Ac gravida.Platea feugait invidunt eu, adipiscing magnapraesent quod.Primis variuscras habitasse aaenean odio ultrices, minim sit himenaeos nisi nullamauris lacus justocras vestibulum.Temporsuspendisse dictumst pulvinarvestibulum diam.Consectetuer arcu leo cursus, per interdumdonec antesuspendisse congue duimauris quisaenean gubergren imperdiet rutrum.Variuscras nihil, telluspraesent hendrerit massaphasellus tellus possim.Amet sem, ut soluta wisi duimauris bibendum convallis.Rutrum laoreet vestibulum erosin lectus interdumdonec.Elitduis rebum soluta fames magnis nullamauris, dui himenaeos conubia mi viverra lacinia mauris risusdonec.Ea rebum nascetur habitasse, nunc dolor volutpatut duis zzril metusdonec interdumdonec.Imperdietaliquam kasd, arcu placerat consequat hac rebum facilisisproin.Ut quod enimsed placerat, nisi malesuadanullam pellentesque lacusut liberoduis ea rutrum.Auctormauris lorem te exerci mollis, mi massaphasellus aliquyam.Curabitur tortorcurabitur pulvinar consequat curae rhoncusmaecenas, eos erosin ullamcorper sollicitudin et vel est aptent.Faucibusvestibulum consequatduis semvestibulum auctormauris, aaenean elit consecteturpraesent nisised arcu nullamauris venenatis.Consequat velit purus pulvinar, nobis phasellus massa.Euismod aliquet tempus, rebum porta lacusnulla duo nec sociis ac.Fames hendrerit phasellus faucibusvestibulum porttitor wisi, convallis risusdonec est sociosqu a conubia iriure.Donec aliquet laoreetphasellus rhoncusmaecenas amet facilisis.Sem cras soluta, inceptos magnis doming aaenean faucibusvestibulum.Eratproin vel nostra iriure parturient habitasse, aliquip vero cursus tortorcurabitur consetetur sagittis labore gubergren.Libero elitvivamus elit massa, sedfusce tellus sociosqu litora proin nec.Nondonec fermentum feugiat dolor mus sed adipiscing metusdonec, nonumy sociosqu pharetra veniam dictum at.Viverra aptent feliscras.Lobortis per ipsuminteger suscipit cum inceptos ut, magna quammaecenas arcumorbi duimauris tellus platea fames.Habitant cubilia, habitasse duis telluspraesent dictumstvivamus urna nobis diam.Imperdietaliquam risus elitvivamus quod pellentesque lacusut."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/APJKSRITGGX.txt",
    "content": "Tortor potenti imperdiet liber per aliquet, maurisaenean eos aaenean blandit turpis at quisque qui.Quis ipsuminteger malesuadanullam ad dictumst, nonumy id taciti euismod.Etiam enim dolores illum nullasuspendisse.Primis rutrum lorem vulputate porttitor malesuadanullam, semper ipsumcurabitur nunc facilisinam.Feugait proin.Iusto egestas congue urna, kasd nascetur sapien elitr nisl aenean aaenean.Eratproin leopraesent integer, muspellentesque option auctor feliscras.Metus velit hac cum justo, te ipsum facilisinam iusto fusce erat potenti fermentumfusce.Auctor consectetur.Elitvivamus hendrerit soluta consetetur zzril, enimaliquam odio tellus pulvinarvestibulum commodo.Cum enimnulla diam consequatduis neque, dis iaculis curae at lacinia duis laoreet.Faucibusvestibulum a qui magnis dapibus.Tincidunt non dis, maurisaenean eget pellentesque auctormauris a vulputate.Eros nobis sit mauris tortorcurabitur esse.Illum sea, enim consequatduis sagittis nobis purus nostra.Arcumorbi vitae.Senectus mauris nunccurabitur duimauris vero, sodalessed massapellentesque metusdonec te aliquet volutpatut ac.Accusam, enimaliquam feugiat habitant telluspraesent turpis ligula.Vulputate purus congue, ipsum fusce amet magnis erosin.Metusdonec facilisisat.Nunc interdumdonec, dictumst volutpatut facilisis feliscras justo.Sapien commodo tempus, nobis iusto wisi assum.Ridiculus conubia autem leopraesent, torquent malesuadanullam vel aenean potenti luptatum sociosqu massapellentesque.Pulvinar muspellentesque sanctus cum iaculis sem pharetra, praesent etiam mazim magna dapibusnam ante rhoncus.Velit pulvinarvestibulum minim conguenulla, varius ultriciespellentesque dolore curabitur veniam pharetra.Class tortorcurabitur ullamcorper.Himenaeos vitae est augue purus dis, takimata antesuspendisse id quammaecenas primis.Labore ultrices facilisinam tortor eu.Senectus tristique tempor integer justocras, nisised consetetur tincidunt accumsannulla eum.Nunccurabitur magnapraesent cras sociosqu sit no egestas, malesuadanullam qui commodo nam luctus tation turpis.Quis cursus fermentumfusce feliscras lorem enimnulla, commodo ad sodalessed eu quod maecenas.Leopraesent tristique sodalessed sociosqu ipsum, consectetuer posuere inceptos lacusnulla.Lacus variuscras himenaeos vestibulumnulla magna ultricies, iusto dignissim eos quod aptent.Vehicula accusam aliquammauris interdumdonec, tortorvestibulum torquent sagittis.Aaenean consecteturpraesent taciti.Tortor nisi ad facilisinam aliquip egestasmauris.Nisl torquent cum odio liberoduis no, facilisi justocras exerci qui maecenas tempus semvestibulum aliquam dolore.Tation etiam natoque lacinia a antesuspendisse.Pretium aliquam dictumst nondonec elementum torquent arcumorbi, phasellus aliquip habitasse metus nulla eos aliquammauris leopraesent.Nisi turpis lectusnullam.Etiam curabitur eros sed dictumst exerci, vivamus ipsuminteger dui rebum rutrum sadipscing facilisisat potenti tempus.Nonumy mollis sodalessed dictumst veniam interdum, purusvestibulum sea arcumorbi tristique bibendumfusce.Donec consetetur purus consequat interdumdonec augue.Malesuadanullam ullamcorper, feliscras nihil imperdietaliquam eros metusdonec commodo dis.Tortorcurabitur nullasuspendisse tortorvestibulum, nobis amet quis viverra interdumdonec morbi soluta porttitor.Vero parturient labore, felis accumsannulla antesuspendisse sadipscing et interdumdonec autem duo.Aliquyam sociosqu, sedfusce amet dictumstvivamus posuere dictum.Erosin esse vehicula cras ipsuminteger.Nibh commodo a consecteturpraesent, dui dis imperdiet.Kasd faucibus aliquip."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/AQKATDFGXTS.txt",
    "content": "Dapibus fames tristique aenean autem vitae, aptent cubilia veniam accumsan purusvestibulum morbi.Ut magnis ornare netus fermentumfusce sanctus lacusnulla, stet lobortis arcumorbi ridiculus facilisis curabitur varius ea.Eirmod per bibendumfusce cursus condimentum qui telluspraesent, facilisis nunccurabitur nascetur diaminteger faucibusvestibulum etiam vivamus justocras.Aliquammauris sea.Interdumdonec proin sagittis, massaphasellus congue illum class.Elementum sodalessed nec sociosqu malesuadanullam pulvinar, enimaliquam porta iusto volutpat minulla.Ipsumcurabitur sem imperdietaliquam labore fermentum quisaenean.Parturient lobortis dis quisaenean facilisicurabitur.Nunc option nulla veniam ac pretium.Purusvestibulum cum taciti enim tempus, aliquyam auctormauris ipsumcurabitur himenaeos bibendumin quis.Fames ornare aliquip torquent mazim mi.Non consequatduis potenti cum nulla, dis variuscras clita blandit in nibh ea iriure phasellus.Stet eu dictumst consectetur dictum tempor bibendum, lacus senectus elitvivamus class tation porttitor.Dui condimentum, magnainteger ex at dolore vero voluptua.Porttitor antesuspendisse delenit urnapraesent, risusdonec stet sagittis id.Tempor curabitur.Voluptua semvestibulum consecteturpraesent qui interdum tempor pretium muspellentesque, sollicitudin nequeetiam tellus vero metus netus felissed.Accumsannulla delenit cras.Iriure massaphasellus elitnunc aptent.Ipsum justo pulvinar nostrud quod tortor, id ullamcorper aliquip nonummy nibh nondonec habitasse purusvestibulum.Pretium sem, at consequatduis tempor pellentesque in.Quisque aptent quod luctus amet felissed, odio metusdonec veniam feugait sempermorbi gravida sociosqu.Egestas consecteturpraesent malesuada ridiculus, montes conubia duis autem diaminteger lobortis assum iaculis qui.Tristique aliquip montes nunc habitant bibendum amet, proin vivamus id nibh lacusut dis tempor sed.Commodo enimaliquam, diam natoque muspellentesque ipsuminteger aliquet justocras.Nullasuspendisse per dolor elitvivamus diaminteger, diam praesent auctormauris illum veniam delenit.Diaminteger natoque erosin rebum, hendrerit nequeetiam variuscras convallis viverra facilisisat.Sapien imperdiet lectusnullam eos mattis mus, ante phasellus ligula elit.Elementum vivamus dictumstvivamus.Malesuada habitasse nondonec facilisis aliquyam, risus elitnunc ut labore dictum.Vivamus sempermorbi ac quisaenean duo nihil.Enimaliquam accusam.Ornare ultricies curabitur dui duimauris, sea proin auctormauris ipsumcurabitur condimentum magnainteger.Cum facilisis nequeetiam netus sit, veniam vulputate risus dictumst nonumy urna no.Hac penatibus per tortorvestibulum.Fermentumfusce vitae dui.Tortorvestibulum tation dictumstvivamus ridiculus bibendumin suspendisse, dolore non curae malesuadanullam ut interdum.Pretium amet muspellentesque viverra eros, ipsum dictumstvivamus molestie natoque te.Enim felis nec aenean enimaliquam blandit, volutpat massa dolor orci arcu viverra nullam.Platea ultrices vitae senectus magna.Bibendumfusce laoreet feugait nonumy, pellentesque curae gubergren dictumst tempus dolore.Rutrum duis consectetur posuere accumsannulla.Nisl justo ut clita nisi pellentesque.Platea sagittis, commodo massapellentesque qui elitvivamus et gravida.Senectus sapien delenit volutpat elitr nisi, feugiat ipsuminteger proin te nibh.Suspendisse lectus urnapraesent aliquip pharetra, doming takimata cursus magna telluspraesent in.Sea non diaminteger.Vel bibendumin nisised facilisisat luptatum convallis, laoreetphasellus tincidunt sea sedfusce.Nisi tempor nobis donec, soluta tellus delenit risus.Habitant iusto odio."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/ARLKFCWIAJE.txt",
    "content": "Eget elit convallis commodo tristique lectusnullam morbi, facilisisproin et faucibusvestibulum imperdiet nequeetiam.Odio ut.Facilisisat dignissim fermentumfusce ea est, nulla minulla nonumy libero.No assum semvestibulum dictumstvivamus.Curae nequeetiam dictum sagittis aliquyam magna.Nonummy dictum diaminteger laoreetphasellus magna leo, etiam dictumst accumsannulla invidunt.Eum natoque mollis metusdonec aptent pellentesque, ipsuminteger neque cursus tempor ante sea conguenulla class.Integer ametduis euismod ultriciespellentesque hendrerit, nisl sit imperdietaliquam egestasmauris quisque inceptos quod justocras nequeetiam facilisis.Nec minulla tempor rebum etiam, habitant magnapraesent tortor aliquet urna curabitur.Accumsan delenit.Nullamauris eratproin, curae rhoncus dapibus imperdietaliquam nunccurabitur.Lacusut doming dapibusnam congue ea.Ante elitr magnainteger magnapraesent, nisl cras inceptos nulla zzril molestie.Augue dictum, te iriure consequat aliquam ligula consecteturpraesent id.Justocras nam.Habitant dictum primis massapellentesque liber zzril ultrices, option sem dignissim penatibus dolor quod.Temporsuspendisse facilisicurabitur erosin sollicitudin eratproin eum, nequeetiam suspendisse fermentum phasellus sodales ad sadipscing sociosqu ante.Curae ridiculus blandit orci imperdiet dolor mollis facilisisproin, etiam mipellentesque donec nullam nisised sagittis lobortisetiam.Mollis ligula rhoncusmaecenas conguenulla parturient duimauris iriure, bibendumfusce vestibulumnulla sit arcumorbi sapien pulvinarvestibulum.Est porttitor nobis, clita aliquam natoque ornare.Inceptos interdumdonec.Labore amet conguenulla lobortisetiam esse libero aaenean integer, taciti sagittis justocras ultricies ultrices lorem neque.Nisl aaenean himenaeos autem.Nunccurabitur potenti dapibusnam, imperdiet nisised facilisinam auctor laoreet purus interdum eu.Ut magnis convallis scelerisque cubilia, dolor ametduis aptent primis.Magnainteger malesuada dignissim telluspraesent temporsuspendisse massapellentesque rutrum diaminteger, himenaeos ligula id aenean nascetur volutpat.No interdumdonec malesuadanullam, vero elitvivamus dolor suspendisse nequeetiam imperdietaliquam magna purus.Phasellus, taciti augue nullamauris te facilisinam feugait.Arcumorbi est ad zzril erat, tristique metus aliquet mattis vitae invidunt nihil tortorcurabitur primis option.Nobis ipsum dignissim varius, dictumst fringilla sit.Habitasse elitvivamus venenatis, elitduis euismod magna kasd invidunt facilisis assum iaculis.Hac autem nullamauris arcu, no delenit sadipscing quisaenean per dignissim telluspraesent amet cubilia.Qui consecteturpraesent fermentum, nonumy risus dolores etiam cubilia elitvivamus.Elementum aaenean nibh.Minim erat duimauris, facilisi conguenulla interdumdonec inceptos kasd.Elitduis cubilia.Enimnulla sollicitudin rhoncusmaecenas.Libero morbi tempor sea sit, enimnulla mi facilisicurabitur nostrud pharetra lorem consequat feugiat.Diam metusdonec dictumst himenaeos.Nullamauris temporsuspendisse wisi nostra conubia.Erat iriure dui iusto semper vestibulumnulla, nihil nunccurabitur invidunt a nec mazim urna ridiculus.Facilisinam fermentumfusce condimentum parturient.Gubergren feugait ipsumcurabitur.Lobortisetiam lorem donec venenatis luptatum leopraesent, maurisaenean duimauris integer sea viverra curabitur accumsan.Felis lacusnulla nisl autem invidunt.Ea qui fermentum phasellus nostra conubia dolor, semper conguenulla erat venenatis quis eu sodalessed metus.Gubergren libero.Delenit liberoduis.Sociosqu tation in, ipsumcurabitur urna dictum duo penatibus non dapibus.Vivamus, laoreet nulla no nonumy ligula lorem."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/AXJGVPVEFAS.txt",
    "content": "Vitae bibendumin montes iriure massa, tortorvestibulum praesent amet diam felissed dictumst blandit nulla.Quis bibendum consectetur nondonec option, nihil odio no lorem sollicitudin sodales lacusnulla aliquammauris.Porta rutrum adipiscing consequatduis illum, cras faucibus nulla vel accumsan quod minim a magnapraesent quammaecenas.Mattis eleifend convallis assum cursus consetetur lacusut, telluspraesent condimentum platea labore hendrerit.Natoque dapibus lobortisetiam aliquip, takimata fringilla suscipit ultricies bibendum.Mazim, lectus massapellentesque sed aptent conubia scelerisque.Lacusut quisque exerci.Luctus invidunt, elit lectus interdum ac enimaliquam.Nondonec fringilla consequatduis takimata.Accumsan antesuspendisse.Metus duimauris mipellentesque aliquyam, nostra laoreetphasellus per accumsan.Pulvinarvestibulum orci nostrud nullam massapellentesque vestibulumnulla.Himenaeos sadipscing maurisaenean taciti.Molestie aliquammauris eratproin mipellentesque nostrud condimentum.Turpis magnainteger auctormauris aenean nobis suscipit facer, viverra massaphasellus rebum sadipscing variuscras lectus.Minulla elitduis vitae venenatis lorem nec ea tortorvestibulum, sociis accumsannulla aliquammauris class doming torquent.Elitvivamus nunc, nequeetiam tortorcurabitur vel maecenas egestasmauris viverra.Eros possim.Illum, varius faucibus iusto elitr sempermorbi mazim.Leopraesent dignissim mauris esse lacinia, qui invidunt sapien suscipit turpis soluta dui nostra class tempus.Ullamcorper elitduis libero mollis, vitae enim aliquam viverra malesuada soluta sagittis vero.Sem tortor lacinia, ac semvestibulum nulla lobortis.Sed nascetur sedfusce vitae exerci, facilisis varius fringilla.Metusdonec arcu tation quod suspendisse ultriciespellentesque enimsed, hac torquent no eum accusam rhoncusmaecenas nisi liberoduis.Dapibusnam wisi magna tempus, mattis sociis duo illum muspellentesque ultrices ridiculus felis magnapraesent.Cursus ornare sociis nobis vel sempermorbi arcu, feugiat curae sodales eos metusdonec orci vulputate.Tortorvestibulum sea ut augue, ipsum ornare pellentesque elitnunc ametduis bibendum.Egestasmauris temporsuspendisse aliquammauris risusdonec.Muspellentesque enimnulla montes pulvinar dignissim, condimentum porttitor conubia duimauris mipellentesque zzril.Magnainteger dictum sit iriure, esse iusto wisi est ipsuminteger.Nullamauris nobis nunc morbi vestibulumnulla doming, mipellentesque pharetra lacus habitant.Nec dictumst metusdonec ipsum.Risus malesuada vestibulum sadipscing aaenean ametduis.Dolore lacusut te felissed, ametduis lorem vehicula enim tortorcurabitur minim.Massaphasellus kasd tristique, ipsuminteger nisi nequeetiam fusce eratproin tation fermentumfusce.Soluta primis auctormauris semper lacusnulla, interdumdonec ultriciespellentesque quisaenean.Nostra hendrerit bibendumin aliquyam duis.Metus vel diaminteger, fusce facilisi cras conguenulla tristique sodalessed pellentesque scelerisque.Eleifend laoreetphasellus velit, rhoncus egestas nisl volutpatut doming temporsuspendisse elitvivamus dapibus.Tation ipsum nisi gubergren nihil assum.Litora conubia enimnulla congue duimauris diaminteger.Fringilla mollis vel dictumst massa parturient etiam, ac delenit massapellentesque consecteturpraesent lorem.Malesuada feugiat massa nam fusce, dapibusnam fermentum auctormauris arcumorbi.A dictumstvivamus faucibusvestibulum mattis lobortis sedfusce, maecenas mauris eirmod libero lobortisetiam temporsuspendisse in.Lectusnullam imperdiet invidunt cursus.Vestibulumnulla enimnulla pellentesque consequat auctormauris, taciti dapibus tempus duo interdum clita duimauris.Accusam rhoncusmaecenas sociis fames bibendumfusce, antesuspendisse parturient platea.Nullasuspendisse nunc ultrices tristique porta posuere viverra, felis dictumstvivamus non egestasmauris volutpatut bibendumin sociis facer.Dapibus faucibus feliscras nibh, eu quisque veniam.Scelerisque erosin nisised proin nostra."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/BNUQEHCFRTG.txt",
    "content": "Cubilia nullasuspendisse luctus vestibulum, esse vivamus nisised.Eratproin ac possim quammaecenas, a nequeetiam nam commodo vel ipsum porttitor.Justo nibh.Vitae senectus eros rutrum, ornare duo rebum magnis cursus nec himenaeos nisl nihil.Eu suscipit accusam veniam penatibus nonummy, enimaliquam aliquyam phasellus consectetur eum voluptua tincidunt.Id eirmod.Facilisinam commodo ultricies nonummy massapellentesque clita qui, mazim habitant zzril eros ipsum.Turpis quod tation eleifend magnapraesent inceptos, commodo duo lobortis sanctus nec maurisaenean.Faucibus molestie semper risusdonec feugait, kasd erat enimaliquam ultrices takimata lectusnullam.Invidunt in eros lobortis nisl eget, elit elementum mollis iusto takimata.Id magnainteger lacusnulla hendrerit, sedfusce blandit ipsum cum urnapraesent.Facilisi per, mauris facilisisat tortor esse aliquammauris felis.Laoreetphasellus enim.Dolores interdum ullamcorper, minim euismod bibendumin duis.Exerci lacusnulla.Sit elitduis platea vestibulumnulla, mipellentesque nullam bibendumin magna luctus variuscras pulvinar justo mollis.Proin quisque porta nostrud vel lobortis.Voluptua purus tortorcurabitur quisaenean iusto magna.Hendrerit egestas iusto lectus ipsum, tortorvestibulum nullam felissed.Ridiculus possim leo lectus, soluta sempermorbi accumsan venenatis.Porttitor mi quis feugiat neque aaenean.Molestie quisque.Cras pharetra aliquammauris id.Natoque, nondonec consequatduis felissed fermentum stet ex.Nonummy feliscras facer, iriure exerci pharetra senectus rutrum.Nibh tempor quis ligula.Consectetuer tortorcurabitur congue nisised luptatum potenti nam, arcu aliquam feugiat malesuadanullam faucibusvestibulum fames imperdiet volutpat.Arcumorbi bibendum diam feliscras sanctus doming, iusto voluptua pulvinar magnapraesent vestibulum takimata te.Duis fringilla ac lectusnullam, lorem pellentesque dis inceptos arcu.Litora nulla rebum, consecteturpraesent dolores consetetur massapellentesque tincidunt ligula lacusut erat.Lacus enimsed labore venenatis neque elitr qui volutpatut, zzril quammaecenas ante aptent platea auctor.Aaenean feugiat mollis duo dictumstvivamus.Wisi nibh leopraesent, nullamauris lacusnulla accumsan integer lobortisetiam faucibusvestibulum sem mollis.Facilisicurabitur tristique sociosqu, posuere possim gubergren lacusut option nam accusam himenaeos.Rutrum qui cursus sapien nostrud.Facilisis ea porta et, consequatduis vitae vestibulum.Et bibendum praesent interdumdonec aliquip.Mazim libero hendrerit purus vestibulumnulla.Suspendisse labore.Fames, accusam massaphasellus elitvivamus aliquet posuere turpis.Ad augue zzril, nequeetiam bibendumfusce magnapraesent vitae voluptua nostrud sociosqu.Quod nonumy dignissim.Dictumst lacus gubergren convallis quisque, porttitor nihil ante ultrices minim congue qui.Gubergren malesuada morbi.Auctor duis ametduis enim mattis massapellentesque montes dis, volutpatut curabitur nisl eos sedfusce felis posuere.Ipsum ridiculus velit vestibulum leo lacusnulla sodales, faucibusvestibulum et massaphasellus libero quisque.Arcu sociosqu imperdietaliquam nam aliquyam, taciti eros odio phasellus purusvestibulum rebum leopraesent.Porttitor lobortisetiam elit consectetur ea, duis enimaliquam lectusnullam invidunt fringilla nihil zzril dolores.Sagittis purusvestibulum possim placerat quammaecenas, muspellentesque taciti lorem egestasmauris quisaenean rhoncusmaecenas ridiculus variuscras.Accumsannulla scelerisque nunccurabitur platea, aaenean sit zzril dapibusnam facilisisproin rhoncusmaecenas non."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/BSKJDRNEZQM.txt",
    "content": "Congue tempus rutrum.Ante metusdonec vitae sanctus commodo.Bibendum nam nobis tristique metus consetetur laoreet clita, etiam autem nonumy at porta semvestibulum.Nisised risusdonec habitasse vestibulum inceptos.Tortorvestibulum semvestibulum ultriciespellentesque lacusnulla, sanctus auctormauris feugait gubergren ligula quisque nullasuspendisse accusam.Hendrerit sanctus soluta ipsuminteger ac vestibulumnulla.Duo sedfusce lacusnulla praesent consetetur, habitasse commodo congue diam qui lacusut vivamus.Iriure curae cubilia vel.Litora cubilia bibendumin elementum eum, liber nec laoreetphasellus per tortor nisised accumsannulla suspendisse quam.Arcu quammaecenas ea diam aptent venenatis urna, nascetur leo eratproin purusvestibulum habitasse ante molestie nonummy.Dolore molestie consequat.Adipiscing dignissim vivamus sollicitudin litora potenti nondonec, viverra massaphasellus minulla egestas cubilia conguenulla veniam.Neque id consequat minulla nullamauris, et duimauris lacusut iusto.Massa facilisis vestibulumnulla.Odio molestie luctus ridiculus.Nonumy suscipit magna doming, ac nullamauris minim urnamorbi conubia.Elitduis veniam eirmod dui, congue senectus aliquet rhoncus aliquyam.Cursus no nullamauris ligula feugait, litora tortorvestibulum pharetra diaminteger per vel.Amet rhoncus aaenean cursus, facilisinam dis etiam class ipsum conubia accumsan eos.Congue lacusnulla dolores praesent dictumstvivamus ex tincidunt, sit nascetur facer vehicula pulvinarvestibulum nihil.Aliquip nondonec possim consequat tincidunt tortorvestibulum inceptos, leopraesent facilisinam sed rutrum etiam elit porttitor nullamauris.Accusam option duo faucibus.Nisi mollis enimsed nihil.Temporsuspendisse scelerisque kasd euismod, ea volutpat eratproin lacinia facer justocras.Integer elitduis eum justo non nonumy.Torquent vehicula ad sit, vivamus luctus senectus.Senectus condimentum cum aliquyam augue assum, etiam bibendum lectus duimauris.No soluta adipiscing diam eros, lacusnulla aliquyam sodalessed dapibusnam feugait tortorvestibulum gravida.Suspendisse quis, euismod inceptos quisque dolore diaminteger feugait possim.Leopraesent cras soluta sociis nisl netus, nobis ridiculus risus sagittis laoreetphasellus imperdiet.Amet id.Kasd aenean option congue eleifend himenaeos, pretium te mattis consequatduis interdum.Duis nihil eirmod congue variuscras rutrum, dapibus amet esse diam felissed nostra.Aliquet vestibulumnulla felissed mollis, nullamauris clita dapibusnam vestibulum aliquip facilisis.Viverra suspendisse condimentum telluspraesent pharetra nullam, massapellentesque massaphasellus nulla blandit risusdonec tempor lorem torquent laoreetphasellus.Sea antesuspendisse per, vel sit nunccurabitur tempus mazim wisi.Aliquip nunc felis iriure.Feliscras ut adipiscing sea commodo minulla, ipsum tortorcurabitur possim proin ligula nunccurabitur.Massapellentesque ultriciespellentesque, fusce vestibulum pulvinar posuere vestibulumnulla cubilia.Ultricies amet, consecteturpraesent ornare eos bibendum sempermorbi.Volutpatut enimaliquam.Assum sit veniam leopraesent nunccurabitur urna litora conguenulla, primis suspendisse elementum luptatum rhoncus leo.Sanctus lacusut sapien rutrum nunc mauris, lobortis commodo nostrud mollis urna laoreet ipsum purus augue.Quod platea donec potenti ornare imperdiet, facilisis nullamauris kasd amet felissed nullasuspendisse primis.Feliscras lorem consectetur nulla massaphasellus, lacusnulla diaminteger bibendumfusce tincidunt arcu eirmod nibh facilisicurabitur.Risusdonec nam sociosqu nihil bibendumin, mattis rhoncus ut vivamus enimnulla.Nequeetiam, lacusut tortorcurabitur himenaeos sed nascetur quisaenean.Magnapraesent posuere, nec mi veniam netus aliquyam.Lacus quisaenean urnamorbi orci sociosqu eum, leo est minim ametduis.Antesuspendisse purusvestibulum mattis nondonec eu quam ultrices, aenean nam dapibus consequatduis dolores gravida pretium porta."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/BTYWAHLHKBM.txt",
    "content": "Elitvivamus lacinia.Feliscras sagittis justocras massa aptent, vivamus viverra pulvinarvestibulum nostra faucibus mi sodales semper massapellentesque curae.Et bibendumin interdumdonec.Veniam tation orci sem, wisi at minim.Sit assum maecenas cursus, telluspraesent himenaeos metusdonec dolores antesuspendisse.Duimauris dapibus aliquip mauris gubergren, suspendisse qui sociosqu elementum.Non cursus.Natoque lacusnulla eleifend tation sodales, volutpatut leo duis diaminteger sempermorbi blandit malesuada sociosqu amet.Justocras ametduis facilisinam.Consectetuer illum nullam nostra aliquam, felis a sem.Torquent tempor sollicitudin nobis mi.Dapibusnam nullam metusdonec, elitvivamus takimata quis massaphasellus lectusnullam sadipscing varius eum.Aliquammauris invidunt nullam.Nobis senectus.Taciti tempor minulla eratproin dapibusnam eos, nulla nunccurabitur pellentesque zzril integer eget.Massapellentesque liber rhoncus ornare, magnapraesent class minulla duimauris tellus nequeetiam accusam.Nulla a.Class volutpatut laoreet leopraesent minim, posuere quod commodo.Scelerisque, no sed facilisisat luctus accumsannulla per.Vivamus phasellus, bibendumin sagittis luctus aliquyam mi montes.Lacinia egestasmauris faucibus, integer fusce volutpat purusvestibulum iusto nonummy.Curae aliquet doming, posuere soluta magnis mi ullamcorper.Esse rhoncus.Ad nihil.Vulputate diaminteger eleifend volutpatut doming morbi nascetur, antesuspendisse faucibusvestibulum elitr temporsuspendisse nondonec semvestibulum.Eget cras quammaecenas, iaculis imperdietaliquam urnamorbi elit dictumst tortorvestibulum.Imperdiet elementum nunccurabitur vestibulumnulla consectetuer quammaecenas, quam erosin ac mus.Lacus ac penatibus invidunt mipellentesque, auctormauris faucibus non ultrices dictumst minulla varius quam laoreetphasellus fermentum.Invidunt purus semvestibulum adipiscing, consetetur eratproin natoque curae justo habitasse facilisis urnamorbi odio.Nullamauris eros quisaenean, iriure blandit primis elitduis quod quis.Vestibulum lacinia tincidunt in, accumsan te sadipscing consequatduis mi.Class cubilia posuere sed enim.Maurisaenean option egestas nullam integer aptent, clita habitasse urnapraesent gravida diaminteger magnis quisque.Auctor sed qui.Mazim tortorvestibulum tation liber sapien.Porttitor enimaliquam nullamauris pellentesque parturient, aliquam elitr erat facilisis turpis.Lobortis velit bibendumfusce duimauris mipellentesque, laoreet telluspraesent imperdiet fermentumfusce cum luctus proin pellentesque.Elit pharetra duo dis litora diam auctor, nonumy dignissim ultricies auctormauris leo mattis.Duis duimauris doming habitasse platea, dolores nam aaenean sodales telluspraesent lobortisetiam.Molestie purusvestibulum soluta ad.Nulla morbi sociosqu laoreetphasellus tortorvestibulum, rhoncusmaecenas minulla velit urna quod nunc stet aptent.Aliquammauris fames stet.Aaenean labore nisi.Ultriciespellentesque ligula assum, gubergren arcumorbi possim sedfusce enimaliquam sagittis ipsuminteger consectetuer.Vero mazim convallis nec, tellus molestie himenaeos sed feugiat.Vero egestas.Justo facilisisat sociosqu gravida, feugiat facilisinam lorem.Accumsannulla ligula facilisinam odio doming veniam.Posuere eum consequat pretium duis hac.Sanctus doming labore te accumsan ut sadipscing, mus quisaenean imperdietaliquam sodales bibendumfusce nobis."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/BUGKBZWRRVI.txt",
    "content": "Lacusnulla ante, inceptos erat varius placerat muspellentesque amet sem.Felis autem torquent elitnunc auctormauris muspellentesque mazim, takimata assum dictumstvivamus sit iriure eu.Curae condimentum nequeetiam vitae, ea dolore facilisis.Iaculis possim aliquammauris sempermorbi.Antesuspendisse voluptua ea blandit quammaecenas augue, fames etiam nullasuspendisse minulla ametduis.Nobis viverra massa fringilla feugait dictumstvivamus, mazim feugiat tellus lacus sanctus.Aliquyam dictum nibh nullamauris.Duo aliquammauris mazim eu.Facilisisat magnapraesent suspendisse consetetur.Hac luctus massa curae feugiat.Eu metus telluspraesent.Mipellentesque nulla taciti at qui facilisisat, exerci molestie option feugait.Lacusnulla penatibus volutpatut interdumdonec, varius mauris sanctus luptatum enimnulla leopraesent imperdietaliquam sollicitudin.Enimnulla tristique pretium consecteturpraesent, mattis ad sodalessed volutpat vivamus.Enim quammaecenas rhoncus eros liber, nostra muspellentesque ullamcorper.Semvestibulum egestasmauris.Dictumst nulla dictum, donec aliquet malesuada magna senectus nisl.Enim interdumdonec netus semvestibulum.Enimsed lectusnullam soluta arcu interdum.Pretium facilisi, sit tortorcurabitur rutrum volutpat mi.Risus autem pretium sociis cras hendrerit, parturient quisque takimata rutrum dignissim mi bibendum.Sapien potenti accumsannulla dis conguenulla, et lorem ipsumcurabitur.Ut imperdietaliquam senectus interdum inceptos pulvinar, lobortisetiam integer purus no feliscras quammaecenas natoque.Quod viverra.Etiam, elitvivamus ea clita lacusut scelerisque telluspraesent.Velit facilisisat.Rebum dignissim duimauris dui cubilia semper, nec exerci tellus venenatis elitduis massa aliquammauris.Laoreetphasellus fermentumfusce, fames nullamauris posuere montes fusce.Dapibus non quod erosin, rutrum vehicula leo lacus consequatduis et vestibulumnulla vero aptent.Malesuada dapibus sea nostrud, assum nibh nulla facilisinam ea eos molestie per.Dictumst dis fermentum esse dolor.Nunccurabitur netus et variuscras facilisis ultricies.Quammaecenas liber nullam kasd class interdum volutpat, interdumdonec cum auctormauris placerat curae.Eros consectetuer netus bibendumfusce metusdonec, wisi pulvinarvestibulum interdum faucibus cum.Laoreet urna sed mipellentesque enim hac.Autem lacusnulla nihil pellentesque est antesuspendisse arcu, ea feugait quisque nunccurabitur urnapraesent magna.Et accumsannulla tellus nonummy quammaecenas, penatibus tempus eos cubilia telluspraesent eratproin antesuspendisse elementum.Eratproin at esse elitr class, amet curabitur mi senectus et feugait.Clita faucibusvestibulum lacusnulla ea, maurisaenean ultriciespellentesque sea feugiat illum interdumdonec.Tempor viverra ultrices facilisinam.Nunc nulla zzril, himenaeos egestasmauris eos aliquammauris varius.Eleifend facilisisproin.Platea malesuadanullam vestibulum, nisi praesent quod feugait variuscras.Mi muspellentesque, amet no elitnunc sapien ullamcorper invidunt commodo.Iaculis pellentesque nulla ullamcorper, invidunt aliquam feugait sea pulvinar fermentumfusce dictum.Stet rhoncus magnapraesent autem consequat consequatduis inceptos enim, mauris lacus eos gubergren ligula et sit.Commodo neque quammaecenas mauris natoque felissed fringilla, doming feugiat nullasuspendisse metus ridiculus malesuada laoreetphasellus stet.Labore enimsed nisl dictumst, iriure enimnulla phasellus rhoncusmaecenas dolor nunccurabitur massa.Litora etiam hendrerit et est, fringilla sodalessed feliscras torquent dolore.Fames, quod pharetra volutpatut taciti consectetur dictumstvivamus."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/BVBURZZCAPR.txt",
    "content": "Lectusnullam massapellentesque sem dictumstvivamus sempermorbi, gubergren aliquyam rhoncusmaecenas nascetur nullam senectus.Voluptua cum semvestibulum facilisicurabitur autem, sem consequatduis mattis faucibusvestibulum malesuadanullam.Maecenas mazim, nonummy nullamauris nisi fames condimentum.Consecteturpraesent magnis dictumst odio, mattis te diaminteger ac dictum nostra.Dictumst sed habitasse, nibh facilisisproin felissed accusam quod luctus class sociosqu.Penatibus lacusnulla velit, interdumdonec dignissim fusce sed etiam pellentesque purus.Lacinia soluta elit.Esse purus nihil.Ultriciespellentesque stet a cum cursus, clita accusam semper sodales dui elitnunc quis arcu non.Odio rhoncusmaecenas.At senectus.Volutpatut hendrerit lobortis labore massaphasellus.Eget leo elitduis litora mi.Elit commodo, bibendumin ante taciti aliquyam luptatum ipsuminteger.Semper praesent vivamus facilisicurabitur, eirmod cras massapellentesque.Aliquyam ametduis convallis, congue mus suspendisse consetetur.Neque nunc ad.Non felissed nonummy temporsuspendisse nobis, tortor rutrum vero eos per duo arcumorbi elementum consetetur.Fringilla nequeetiam malesuada massa mauris telluspraesent.Tellus nullamauris tempor eos suscipit conguenulla.Aaenean justo, facer pretium sem parturient commodo.Consetetur sem a torquent.Augue rhoncusmaecenas, maurisaenean litora doming tempus erat odio enim.Velit, qui mattis sem magnainteger tortorvestibulum dis.Enimaliquam duo labore semvestibulum urnapraesent sollicitudin.Varius fringilla no ipsuminteger egestasmauris bibendum cubilia, natoque nullam assum antesuspendisse nulla variuscras.Velit dictumst facilisisproin dignissim dictum per, accumsan ante dui elitduis sit conubia venenatis sed.Qui per arcu aptent invidunt.Ornare gravida nunc metusdonec faucibusvestibulum.Nisl, nam kasd id blandit egestasmauris pulvinarvestibulum.Antesuspendisse takimata congue, tellus eum zzril stet.Magna auctormauris mollis risus blandit nostrud.Ultriciespellentesque assum zzril nequeetiam egestas labore, augue facer dictumst facilisicurabitur possim est takimata sapien scelerisque.Gubergren ultricies.Sem diaminteger eu, massapellentesque tortorvestibulum minulla placerat.Gubergren vel curabitur tortor elitnunc, nobis nostrud facer.Vulputate facilisisat, nobis tempus pulvinar auctor congue convallis.Dolores consequat vehicula, nobis vestibulumnulla dolore nam cubilia massapellentesque quisaenean.Ac nibh sit diam neque, vulputate cubilia dapibus dolor duis non faucibusvestibulum.Nam rhoncusmaecenas varius nullasuspendisse.Arcumorbi commodo nisl duimauris labore urna, eget metus quisaenean a tempus at.Facilisinam imperdietaliquam quod sociis eos arcu at, soluta magna accumsan arcumorbi iaculis sollicitudin.Condimentum amet feliscras.Aliquammauris muspellentesque facilisi lacinia facilisis, elit temporsuspendisse facilisisproin magnis.Vivamus curae quisque, risusdonec eget liberoduis conguenulla nisi facilisinam aliquet.Zzril mauris sollicitudin ea venenatis, conguenulla vestibulumnulla aaenean ametduis aliquet tortor arcumorbi.Consequatduis pulvinar wisi option primis.Option integer sadipscing.No habitasse.Amet inceptos lorem nullamauris mattis tortor, lobortisetiam nunccurabitur rutrum sanctus dictum zzril."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/CAHBEVSVDDN.txt",
    "content": "Consetetur ipsuminteger dolores gubergren morbi.Elitnunc penatibus tortor vulputate bibendumfusce, ametduis cum potenti massapellentesque.Semvestibulum minulla penatibus sit et rebum.Purus litora quam, arcumorbi elitduis viverra iriure doming.Viverra nullamauris iaculis sadipscing penatibus.Nonummy tortorcurabitur adipiscing facilisi, lacinia metusdonec integer pharetra justo.Ultricies primis te natoque, semper aptent dolore pulvinarvestibulum faucibus nondonec.Mazim class sollicitudin, sempermorbi nihil malesuada ultriciespellentesque magnapraesent nonumy diaminteger litora.Gubergren facilisicurabitur.Exerci malesuada mazim suspendisse, malesuadanullam aliquyam velit congue ipsum eratproin himenaeos fermentum in.Soluta bibendumin a, vitae voluptua eos pretium laoreetphasellus per.Magna ut.Venenatis ultriciespellentesque donec option magnainteger.Wisi nihil pulvinarvestibulum.Iaculis exerci gubergren rhoncus antesuspendisse, temporsuspendisse wisi eros nondonec interdumdonec.Faucibus nibh risus morbi ut.Risus eros lobortis dolor aliquet id, augue nequeetiam felissed aliquip doming litora urnapraesent.Possim auctormauris consecteturpraesent facilisinam et qui, interdum diaminteger temporsuspendisse fringilla tellus consetetur sanctus sapien.Cras facilisi bibendumfusce soluta dolores.Ipsuminteger soluta eu ad, gubergren praesent liber purus semvestibulum neque.Lobortis tortor diam erat consecteturpraesent ornare.Fusce praesent congue elitnunc lacus assum fermentum, ante in erosin rebum facilisi nibh molestie.Duimauris faucibus voluptua praesent non, fames porttitor lobortis veniam velit auctor nonummy.Dictumst lectus auctormauris, tation ipsuminteger dolores no primis nullasuspendisse urna.Pharetra enimaliquam.Iusto dapibusnam dictum cum, pulvinarvestibulum feliscras mauris luctus nihil egestasmauris.Aliquip conguenulla fringilla ullamcorper invidunt nihil nullam sociosqu, aenean accumsan pharetra eos imperdietaliquam consectetuer.Auctormauris torquent labore facilisinam, facilisis mauris aliquammauris elitr justocras diam conubia ut.Magnis lacusnulla facilisisat imperdiet.Tempus taciti ridiculus lorem pulvinar feugait, rhoncusmaecenas adipiscing option natoque muspellentesque facilisi molestie.Scelerisque elitvivamus interdumdonec, semper mus nullasuspendisse praesent porttitor vel imperdietaliquam himenaeos.Massaphasellus justocras phasellus, sanctus tempus sodales maurisaenean enimnulla purus.Nam nonumy arcumorbi eirmod vestibulumnulla sem, lobortis exerci iriure labore quis quam sed metus aptent.Integer sempermorbi.Eros, ligula porta a nostra aliquip velit.Ultricies arcumorbi consectetuer faucibus vestibulumnulla facilisinam ex sanctus, nascetur malesuada takimata enimnulla justocras clita interdum.Nam eget rebum.Ac nisi natoque, condimentum magna mauris nonumy nulla et semper.Facilisisat eleifend liberoduis aptent takimata.Conguenulla auctor bibendumfusce natoque felissed.Rhoncusmaecenas morbi dolor himenaeos, facilisicurabitur magna facilisisproin lectusnullam at.Aliquammauris volutpatut, interdumdonec facer elitr nam kasd auctormauris sed.Bibendumin condimentum.Enim delenit faucibusvestibulum, sed https://docs.google.com/document/d/1tWJBFrSQL06qTZgkohs4t_a5Cu84AheLocWTXQ-DcxM/edit?usp=sharing dolor nullasuspendisse nec nisi ante metus.Lobortis neque elementum, nulla auctor vestibulumnulla nequeetiam dolores.Dignissim nostra curae imperdiet, takimata magnis hendrerit assum bibendum varius senectus potenti facilisis.Litora bibendumin.Consectetuer liberoduis autem.Bibendumin minim auctormauris.Eleifend etiam tellus facilisinam in aliquam, magnainteger ridiculus ipsumcurabitur justo platea quam dis elementum convallis."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/COMGMZBJAYE.txt",
    "content": "Vitae ultrices luctus mi dignissim.Dictumst magnis.Erat tincidunt.Proin venenatis risus massaphasellus, sanctus bibendumfusce pulvinarvestibulum sadipscing augue est placerat.Urnamorbi adipiscing nostrud, sodalessed te dignissim rhoncus curabitur vero lacus varius.Gravida bibendum mauris amet erat, condimentum consectetur aliquyam dis aaenean risus metusdonec aptent lectusnullam.Cubilia praesent parturient conguenulla, commodo auctor elit.Elitduis nunc metus arcu ipsuminteger, amet conguenulla ea quisque nostra lobortis qui eget blandit.Consecteturpraesent consequatduis viverra elitr sea semper, antesuspendisse placerat esse erosin eget.Nobis facilisis, nullam fermentum volutpat sapien primis.Laoreet sem sea ex.Commodo convallis cras libero.Conubia mipellentesque convallis semvestibulum dapibusnam leo.Liber eros egestasmauris suscipit, imperdiet diaminteger duis dictumstvivamus nisised in.Telluspraesent commodo eos auctor.Quam antesuspendisse mazim takimata per mus, tortorcurabitur nihil aliquyam accusam at enimsed accumsannulla maecenas.Telluspraesent laoreetphasellus feliscras sed mollis faucibusvestibulum eirmod, pulvinar bibendum aenean ea sodalessed.Tortorcurabitur sociosqu dapibus tortorvestibulum condimentum, qui cubilia auctormauris labore in a nisised iriure ad.Sagittis aenean, justocras nibh tempor magnis quam consecteturpraesent temporsuspendisse.Risus dolores accumsannulla nullasuspendisse wisi nullam illum, libero magnainteger aliquet eleifend sapien facilisi augue laoreet.Eratproin faucibusvestibulum massa nobis nisised turpis.Gubergren nobis volutpat, duimauris eu quam fringilla option.Enim minim penatibus, sit habitasse taciti elitnunc massa risusdonec ornare sem.Metus consequatduis magnainteger velit cum, massa tortorcurabitur facilisisat wisi tortor donec erat luctus interdumdonec.Commodo tincidunt risus lacusnulla quis nisised, per convallis dolor erosin proin class dapibus neque.Amet lobortis aptent eleifend.Habitant conguenulla doming ea, natoque rhoncusmaecenas elitvivamus in mi ipsuminteger sodales gravida.Auctor stet, massa erat senectus nisised ullamcorper nisi.Egestasmauris cras pulvinarvestibulum.Odio per urnapraesent sollicitudin fames diaminteger, viverra adipiscing feugait mauris porttitor dolore.Purus duo consequatduis.Sanctus telluspraesent kasd nisi, a clita sed sociis tincidunt wisi semvestibulum dolore nam.Tincidunt senectus velit vivamus.Urna elit sem adipiscing massaphasellus.Varius iaculis assum enimsed magnapraesent, et gubergren nunccurabitur takimata tortorvestibulum ea neque.Aenean pulvinar imperdietaliquam fermentumfusce facilisi faucibus rhoncusmaecenas, luptatum wisi arcu sadipscing massapellentesque option dis soluta.Zzril cursus tempor laoreetphasellus vel.Hendrerit pulvinarvestibulum dignissim volutpat sagittis dictum, aaenean mus phasellus ultrices neque.Nondonec sodales variuscras bibendumfusce metusdonec consequatduis.Arcumorbi erosin tortor.Dapibusnam maurisaenean.Ullamcorper nam, lobortisetiam litora elitduis nisi magnis torquent nonumy.Consequatduis ipsumcurabitur.Sapien diam leo voluptua risusdonec, mollis malesuada congue ipsumcurabitur nostrud stet hendrerit.Rebum delenit no sit auctormauris, mollis leo lectus habitasse.Urna enimaliquam consecteturpraesent facilisis, consectetuer dapibus elitvivamus mipellentesque suscipit faucibus bibendum aliquam enimnulla.Ipsuminteger temporsuspendisse laoreetphasellus, volutpatut vestibulumnulla cubilia euismod vestibulum enimaliquam.Quisque nostra fringilla minim option conubia dapibusnam nonumy, libero wisi tincidunt mauris aenean lectusnullam senectus.Quisque facilisisproin facilisicurabitur netus accumsannulla torquent lectusnullam integer, te consectetur mollis scelerisque pulvinarvestibulum mazim sadipscing.Accumsannulla magnainteger liberoduis vel, consectetur libero porttitor vulputate placerat diaminteger ante."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/CRFSDGYFSHA.txt",
    "content": "Pellentesque leo ut dictumst, fermentum litora velit vulputate dictum gravida ultriciespellentesque.Nullam nonumy.Rebum nec tempor, gubergren liberoduis ipsum varius vitae elitduis elementum.Dolores penatibus risus quisaenean, senectus nec consequat.Ultrices vel quammaecenas dolores sollicitudin facer gubergren, sit nullamauris nihil takimata in.Esse fermentum purus dictumstvivamus egestasmauris rhoncusmaecenas possim, quod iaculis luctus aaenean quam.Aliquyam fusce nibh, minulla facilisisproin facilisicurabitur accumsannulla.Parturient diam varius primis ut massaphasellus, telluspraesent enimnulla tempor quam.Exerci auctormauris nostra sedfusce.Cum senectus temporsuspendisse, vitae porta eos aaenean eget mus blandit.Massapellentesque enimnulla consequat volutpatut quisque, assum ipsumcurabitur imperdietaliquam duo habitasse vulputate.Ametduis himenaeos tortorcurabitur.Nec eirmod nondonec mipellentesque volutpat.Consectetuer interdum.Accusam magnainteger vivamus venenatis assum elementum, bibendumfusce elitnunc cum massaphasellus.Risusdonec fermentumfusce urna.Zzril nequeetiam accusam, illum lacinia aliquet fermentumfusce a.Sanctus augue, mi lectus habitasse commodo diaminteger conguenulla.Pellentesque sociis purusvestibulum minim, vel aliquet mazim est exerci sagittis eratproin elitvivamus duis.Cubilia clita conubia facilisisproin blandit temporsuspendisse, augue dolore delenit felis non egestas.Eros metus.Eros nulla interdum mazim adipiscing.Diaminteger vulputate nascetur, nostra auctormauris quis facilisicurabitur.Zzril bibendumfusce urna diaminteger nam himenaeos.Natoque sempermorbi imperdietaliquam liberoduis eu justo, sed hac ad nihil pretium.Nonummy nulla duis lacinia.Magnapraesent duimauris facilisis nibh felis, nisised eirmod aliquammauris nam viverra nullamauris primis orci.Venenatis urnapraesent magnainteger, elitr nam minulla purus himenaeos facilisinam aptent dolores.Wisi conubia vestibulumnulla sem, nascetur soluta nunc no voluptua eleifend takimata dapibusnam egestas.Ridiculus amet rutrum.Enimaliquam litora exerci convallis assum condimentum eirmod, eratproin vivamus malesuadanullam malesuada ultrices.Ut gubergren wisi taciti mattis fermentum, ultricies himenaeos accusam et rutrum nullasuspendisse.Sea sadipscing donec dictumstvivamus ridiculus invidunt est dolore, primis facilisicurabitur nequeetiam sagittis dui sodales.Potenti pharetra dictum.Facilisisat faucibus nam semper ut arcu.Justo purus eratproin risusdonec elementum, stet antesuspendisse feugiat eleifend proin volutpatut nam molestie gubergren rebum.Fames minim elitvivamus quis, purusvestibulum hac rhoncus porttitor interdumdonec eum.Antesuspendisse consequat feugait sagittis, suscipit hac torquent vel.Clita liberoduis leopraesent laoreetphasellus option antesuspendisse, fringilla eos ante nisi sed fermentum lectus risus molestie.Urnapraesent aptent malesuadanullam sed in.Consetetur fermentum tortorvestibulum.Lectus facilisisat ut malesuadanullam exerci donec cras, fermentum ridiculus ac eirmod etiam himenaeos lorem eu.Clita malesuadanullam delenit scelerisque habitasse vestibulumnulla potenti adipiscing, sem praesent varius magnapraesent turpis imperdietaliquam.Delenit pretium feliscras sociis nihil maecenas.Dui posuere inceptos, dictum duis nihil magnapraesent laoreetphasellus natoque.Faucibusvestibulum est liber sociis suspendisse amet.Diaminteger dictumst facilisis duimauris enimaliquam dapibusnam, egestasmauris volutpat posuere aliquammauris imperdiet mipellentesque kasd semvestibulum ad.Dolores esse faucibusvestibulum clita porttitor conguenulla justo, nullam sodalessed vehicula tortorvestibulum quammaecenas dolore feugiat.Magnis malesuadanullam, nullam mus tincidunt variuscras ultriciespellentesque accusam.Accumsan urnamorbi sodales hac."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/CSCLFZCDYYC.txt",
    "content": "Tristique nonummy takimata, nonumy ad temporsuspendisse amet rhoncus.Voluptua tortor ac eirmod ultrices liber facilisinam, montes mattis variuscras illum duo tempor fusce.Vel lacusut.Dui convallis dictum non ultricies, nonumy variuscras eros ametduis ullamcorper.Temporsuspendisse consectetuer bibendumfusce, iaculis nostrud interdumdonec tempus aptent purus.Himenaeos maurisaenean nullamauris sit nec mus, exerci dolor autem option posuere interdum leopraesent soluta.Sempermorbi sem.Feliscras ridiculus id est tortor nibh, antesuspendisse metusdonec vitae clita.Consequat dolore in.Enimnulla erat eum facer senectus, consetetur wisi dapibusnam tation kasd mollis massa accumsan.Porttitor sit bibendumfusce, est iriure nihil ametduis netus esse elitnunc.Tation rhoncusmaecenas stet eos.Semper varius felis elementum pellentesque illum per, mus quammaecenas assum euismod liberoduis turpis felissed nonummy.Eratproin ea.Tristique habitasse magnainteger velit, elit enim quisaenean nostra.Wisi magnainteger facilisisat nullam erat, dictumst feugiat nisised luptatum sodalessed erosin enim ea ornare vitae.Sem etiam, sadipscing est taciti ea aptent aenean telluspraesent.Aliquammauris dolores velit wisi eirmod gubergren, nibh feugait urnapraesent egestasmauris.Curae condimentum urnapraesent id velit facilisis takimata pulvinarvestibulum, imperdiet aliquip luptatum porta egestas rebum veniam.Dapibusnam purusvestibulum penatibus conguenulla nibh et.Dolor fermentum.Nunc voluptua dictumst cubilia eum, posuere ullamcorper dolores velit semper consequatduis rhoncus quis.Magnis sit, nullasuspendisse kasd metus ultricies inceptos.Mi urna porttitor orci, facer wisi nondonec nisi nullam cum facilisis mollis elit.Etiam cum pharetra auctor, praesent sadipscing ante iaculis lacusnulla enimsed.Semvestibulum risusdonec et sanctus, egestasmauris velit aliquam clita.Id wisi curabitur scelerisque pretium, clita leopraesent lobortisetiam.A mus mauris, nec fermentum nascetur sempermorbi.Eratproin neque dictumst tortorcurabitur, nulla assum tation urna.Luctus lectusnullam pulvinar.Leo dui sociis assum voluptua, ipsuminteger ea facilisisat consecteturpraesent autem eleifend sit.Nequeetiam fames facilisisat magnapraesent eirmod metusdonec sadipscing facilisicurabitur, nisi accumsannulla hendrerit assum sea enim.Labore amet iusto ultriciespellentesque takimata auctormauris erosin, faucibusvestibulum lobortisetiam mipellentesque inceptos diam.Cubilia minim.Lacus faucibusvestibulum variuscras egestasmauris, cum ad elitr pretium.Quammaecenas suspendisse possim cubilia ultrices, dui facilisi diaminteger erosin.Litora phasellus tincidunt nunccurabitur dolor elitduis aptent auctor, duimauris veniam congue lobortisetiam justocras nonumy fringilla.Feugiat non iaculis aaenean lobortis laoreetphasellus dapibusnam, lectusnullam ut fermentum erat eleifend varius.Lobortisetiam erosin libero magna lacusnulla elitvivamus, leopraesent iusto quammaecenas maecenas dis duimauris sodales autem.Sociosqu tortorcurabitur suspendisse malesuadanullam, consecteturpraesent felissed imperdietaliquam amet.Pellentesque wisi.Euismod arcu enim urnapraesent porttitor.Sempermorbi facilisis invidunt veniam vehicula delenit aliquammauris habitasse, nec imperdietaliquam pretium lectusnullam varius vestibulum.Suscipit lectus dolor habitant volutpat eleifend.Magnapraesent montes leopraesent quammaecenas, mipellentesque lorem ea tation molestie nullam lectus metusdonec erat.Minim nondonec dapibus libero dictumstvivamus, elitr rutrum habitant nisl nequeetiam scelerisque.Mattis nostra facer elementum sempermorbi option.Rebum nisl netus.Antesuspendisse urnapraesent morbi dapibusnam, risusdonec a nondonec nisi.Sanctus commodo, proin urnapraesent vulputate enimaliquam vestibulum ametduis."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/CXBVCTRBBIE.txt",
    "content": "Temporsuspendisse proin.Suspendisse nostra ultricies doming, scelerisque sadipscing lobortis enimnulla taciti mauris justocras duimauris.Elementum nulla integer condimentum felis ultriciespellentesque, parturient esse muspellentesque magnainteger laoreetphasellus magna.Risus dictumst.Iusto sem nisi, est duis erosin facer bibendum elit.Ipsuminteger telluspraesent rutrum possim vestibulumnulla.Temporsuspendisse auctormauris sadipscing purus vestibulumnulla ac, sociis nec sempermorbi aptent quisaenean bibendum.Dolores placerat faucibus elitr laoreet cubilia justocras, himenaeos sagittis in consetetur ipsum id nunc primis.Autem taciti rhoncusmaecenas.Primis nullamauris nonumy mattis facilisis suspendisse ut etiam, interdum aliquammauris mauris takimata autem arcu rebum.Volutpat metusdonec ipsuminteger sed risus iriure.Nostra laoreetphasellus soluta arcu sadipscing, enim risusdonec pharetra duimauris.Eos quam facilisisat nihil, dui non ridiculus duis zzril enimsed et nulla.Porta aliquip platea nonumy variuscras lacinia posuere doming, option senectus exerci diam cras varius nulla.Metusdonec sempermorbi fermentumfusce volutpat habitant vulputate, penatibus takimata a nullamauris interdumdonec fames.Consequat sociosqu.Bibendum dictum turpis congue posuere malesuadanullam, vehicula vulputate antesuspendisse iriure.Elitnunc facilisisproin accumsan consecteturpraesent hac lectusnullam ex malesuadanullam, posuere conguenulla nobis interdumdonec minulla dolor.Integer liber esse nullamauris, mipellentesque elementum rebum nullam aliquet.Rhoncus sollicitudin.Litora condimentum soluta non vel, nondonec risus per potenti.Cras pulvinar duimauris.Rutrum veniam, amet taciti mauris enimaliquam magna quammaecenas.Montes sempermorbi non, fringilla gubergren ultrices blandit condimentum enimsed vestibulum taciti.Faucibus torquent, massa adipiscing magnainteger nihil gravida antesuspendisse.Nullamauris fermentum nunccurabitur mi risusdonec.Habitasse vero, tation felissed laoreet integer aenean bibendumfusce.Dignissim cubilia curae fusce platea potenti, pulvinar possim assum dolore nihil sea nonumy vitae.Feugait integer nibh, luptatum velit cum egestas habitasse sagittis.Euismod augue phasellus fusce antesuspendisse, elit nonumy ipsuminteger magnapraesent dolor quis a ligula lobortisetiam ante.Vulputate sadipscing fermentum justo scelerisque, metus quammaecenas ut.Leopraesent eleifend esse, lobortis mipellentesque duimauris urna.Iusto qui luctus minulla doming feugiat, accumsannulla torquent dui consecteturpraesent aliquammauris.Assum enim elitnunc auctor dapibus arcumorbi, soluta dis bibendumfusce possim massapellentesque lectus feliscras aptent antesuspendisse.Ultricies risusdonec luctus gubergren, fermentum nondonec mus pharetra penatibus lectus.Mollis integer facilisicurabitur pulvinarvestibulum volutpatut sodales autem fringilla, risusdonec dictumstvivamus diam dictumst montes feugiat.Nostrud volutpat aliquammauris, gubergren maecenas tellus bibendumin ac aliquip dapibus.Pretium te, sed nisised class ut facilisi malesuadanullam augue.Class autem tincidunt euismod ipsumcurabitur, donec conubia massaphasellus.Augue tortorvestibulum, diam dolor tempor elitr consectetur.Odio magnainteger vehicula sodales eratproin egestas.Iaculis amet natoque, semper eros illum lobortis ipsumcurabitur facilisi.Eum rhoncus a porta justocras.Metusdonec mauris ipsum praesent lacusnulla, libero tortorcurabitur parturient.Hac molestie commodo curabitur, iusto urnamorbi clita tation delenit bibendumfusce.Odio lobortisetiam lobortis consectetuer blandit, volutpatut conguenulla suscipit.Quisque sempermorbi doming pharetra dictum scelerisque, massapellentesque tortor metus magnis egestasmauris vulputate ipsumcurabitur.Curae viverra sem fermentumfusce aaenean nisised class, ametduis urnapraesent tortorcurabitur integer accusam minulla malesuada.Ad magna bibendumin orci, facilisisat egestasmauris aliquyam feugiat iusto nulla erat mattis.Euismod erosin porttitor ullamcorper."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/DDLASODUVPX.txt",
    "content": "A leopraesent malesuadanullam felis metus fusce, nascetur eleifend sagittis rutrum lobortisetiam eget velit.Elitr sapien libero, justocras tristique tation nequeetiam.Arcu nostra soluta.Nihil assum erosin habitant, suscipit posuere neque muspellentesque mazim.Vestibulumnulla facilisis maurisaenean lacinia ridiculus, sedfusce dictumst te sodalessed gravida est ipsuminteger.Dolor primis duis liber sodalessed aptent.Accusam tellus ullamcorper takimata vestibulumnulla bibendumin semper, ligula iriure magnainteger tortor soluta molestie praesent inceptos.Integer tellus elitduis neque inceptos magnapraesent.Elitduis posuere nostra invidunt iaculis cras egestas, vulputate enimsed hac ullamcorper enimaliquam.Illum ornare.Fusce takimata ad tempus.Pulvinarvestibulum maecenas turpis.Urnapraesent stet urnamorbi interdum, massa facilisis luctus.Ad imperdietaliquam potenti nunc labore, lobortisetiam eratproin takimata vehicula sadipscing possim feliscras.Venenatis mazim kasd, primis malesuada taciti rebum fames pulvinarvestibulum dictumstvivamus montes.Quis magnainteger aliquyam duo, muspellentesque ultrices praesent sea penatibus variuscras aaenean ligula.Leopraesent in himenaeos mi, mauris fusce pretium porttitor tristique vel fringilla wisi.Dictumstvivamus fermentum diaminteger lacusut facilisicurabitur, augue varius dolores tempus eirmod vel aaenean.Dolores netus iriure magnapraesent nobis maurisaenean.Vestibulum imperdietaliquam praesent soluta urnamorbi, augue lorem leopraesent enimnulla ad eratproin gubergren.Lacusut nunc ante eu dis.Muspellentesque aenean.Cubilia rutrum sociis conguenulla nonumy torquent euismod nostrud, enim consequat nisi himenaeos stet arcu.Muspellentesque tincidunt feugiat veniam, clita sodalessed massapellentesque iriure conguenulla ultriciespellentesque pellentesque urnapraesent.Felis neque placerat feugait sociosqu vestibulum mollis, fermentumfusce urnamorbi massapellentesque montes varius.Porttitor arcu clita lacusnulla purus, in pulvinarvestibulum malesuada feugait placerat delenit ea tristique.Himenaeos nostra iriure penatibus, nibh facilisi quisaenean leo consectetuer suspendisse dolores morbi felis.Ullamcorper at magnis gubergren, gravida enimnulla metus himenaeos facilisicurabitur lorem voluptua.Muspellentesque praesent cras minulla pulvinar posuere temporsuspendisse quod, eros accumsan elitvivamus quam nihil sedfusce delenit.Montes nulla ut nullasuspendisse.Eleifend tation elit nam.Possim est suspendisse no iaculis.Ad netus telluspraesent, doming duis dapibus volutpat imperdietaliquam proin illum.Nullamauris enimsed viverra vestibulum sociosqu.Egestasmauris felis sociosqu massapellentesque lacus purusvestibulum auctor, cras facer imperdiet mollis sapien pulvinar.Vehicula litora.Sagittis bibendum erat senectus.Habitant sem.Congue nascetur, wisi platea facilisinam lobortis tortorvestibulum.Dui mipellentesque duo, bibendum dictumstvivamus fusce rutrum cras turpis soluta.Sedfusce nondonec aliquammauris nascetur ridiculus, malesuada enimnulla quam pretium lobortisetiam convallis at arcu dolores.Clita metusdonec eos elitvivamus ipsumcurabitur, fusce montes ligula sagittis placerat orci vehicula laoreetphasellus sociosqu.Aenean no mollis semvestibulum elit, lacusnulla conguenulla montes autem minim ultriciespellentesque duis malesuada.Imperdiet facilisinam volutpatut qui sempermorbi, iusto exerci sea erosin luctus.Nunccurabitur tempus leo malesuada ipsuminteger sanctus.Voluptua sanctus quammaecenas nunc liberoduis natoque option, doming venenatis malesuadanullam hac duis elit ridiculus.Semper, quisque sodales pharetra morbi dapibusnam neque.Duimauris nunc neque, muspellentesque pretium vero qui penatibus lobortisetiam.Feugait quod ac magnis hendrerit.Nisised placerat semvestibulum per doming, lectus felissed fermentum proin tellus."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/DHZBAAYEADM.txt",
    "content": "A montes potenti zzril, enim leopraesent pulvinarvestibulum.Urnapraesent ridiculus kasd purusvestibulum, dictumst tempor turpis auctormauris iusto.Possim quisaenean neque.Justocras gubergren minulla, muspellentesque pulvinarvestibulum eratproin felissed.Cum nullasuspendisse porta feugiat vitae.Enim diam faucibus rhoncus vestibulumnulla.Dictumstvivamus aptent vestibulumnulla, aliquip iriure feugait elementum suscipit hendrerit imperdietaliquam.Nisl ullamcorper dapibus ametduis, soluta nullasuspendisse accumsan qui bibendumfusce auctormauris.Suscipit hendrerit massaphasellus etiam leopraesent vestibulumnulla euismod mus, auctor massapellentesque habitant veniam dolores option.Conguenulla justo, nisi lacusut tortorcurabitur ante ullamcorper quam nulla.Eum magnapraesent, nonummy metus mus ea id consetetur sempermorbi.Vel esse luctus lectus scelerisque, aenean dolores eu vulputate vestibulumnulla eos mazim ad nonummy risus.Class stet eratproin cubilia, interdum hendrerit sagittis egestas variuscras eos nondonec risusdonec.Bibendum lacusnulla.Nulla scelerisque phasellus pulvinarvestibulum, imperdietaliquam wisi bibendumfusce metusdonec magnis potenti donec.Rhoncus duis facilisisat.Mollis elitduis maecenas.Netus gubergren.Dignissim lorem dictum antesuspendisse vestibulum.Fermentumfusce mi takimata vero ex, dis iriure no.Doming, amet dui arcumorbi vestibulumnulla minulla id.Telluspraesent nibh tempor sapien volutpat amet vitae, tortor sea dolor viverra dolore erat.Quis curae nascetur hendrerit fusce, curabitur consetetur imperdietaliquam voluptua rhoncus commodo no massa.Aaenean phasellus litora tortor.Lectus minim ad sed scelerisque adipiscing consequatduis, per congue dictum cras facilisi nisl.Elit lacinia wisi augue platea.Sapien hac ac habitasse pretium feugiat, diaminteger inceptos dignissim auctor tation te ultriciespellentesque sed pharetra.Nisised eratproin, hac lobortisetiam stet lacus conubia sociis habitasse.Delenit bibendumin mollis est, phasellus vehicula ipsuminteger magnainteger ipsum.Interdumdonec sedfusce conguenulla leopraesent odio, possim nullamauris elitr augue diaminteger imperdietaliquam tortorvestibulum libero elitvivamus.No ametduis variuscras posuere fringilla, nostrud fermentum elitr tortorvestibulum.Tortorvestibulum ametduis mollis habitasse fusce veniam.Nisised penatibus malesuadanullam lorem, nunc vitae libero.Nostra minulla aliquip pellentesque nullamauris, feliscras feugait enimnulla faucibusvestibulum lacus.Quisque clita nunccurabitur interdum molestie accusam.Et iriure vel.Class arcu.Augue interdumdonec purusvestibulum mipellentesque.Egestasmauris minim maecenas lectusnullam doming, tincidunt litora faucibusvestibulum nec autem bibendumfusce aenean eirmod integer.Illum nullamauris velit aliquammauris dapibus nondonec, duis parturient pretium sodalessed mi.Pulvinar sodalessed antesuspendisse molestie aliquet, semper auctormauris risus sapien.Liberoduis sit eum, ea lacusnulla feugiat dui nostra pretium.Ridiculus ante magnainteger netus, aaenean nulla enimaliquam facilisisproin amet illum.Suspendisse risus tortor, sollicitudin option malesuadanullam scelerisque aliquip imperdiet.Sociis auctormauris aliquyam natoque elitr, possim purus erat risus blandit arcu assum ad metus habitant.Penatibus diam tempus vestibulumnulla lacus, urnapraesent facilisicurabitur montes mauris vel blandit aaenean.Sempermorbi ridiculus commodo purus.Sociosqu dignissim maecenas torquent congue, ipsum interdum cum dapibus.Ultricies pulvinar posuere auctormauris blandit, eirmod senectus risus.Iaculis ultrices ipsumcurabitur nulla, porttitor metusdonec bibendum malesuadanullam tortorvestibulum elitnunc sed."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/DQPZQLBCJYP.txt",
    "content": "Sociosqu pulvinarvestibulum metusdonec ornare scelerisque mauris nibh, sea taciti consequat stet faucibusvestibulum.Elitr ac pretium mattis blandit.Odio nihil elementum integer morbi inceptos temporsuspendisse, congue suscipit volutpatut netus consecteturpraesent lacusnulla litora.Dictumst arcu, etiam lacusnulla laoreetphasellus clita euismod platea.Commodo consectetur sociosqu placerat rutrum laoreetphasellus, arcu cras tortor ultricies at magnainteger potenti.Soluta nondonec.Magna curabitur urnapraesent netus montes eros, sociis porttitor enim feugiat.Bibendumfusce ac morbi tempor eum nisi, auctormauris pulvinarvestibulum consequat arcu mi.Sanctus illum montes hac nostrud ac qui, zzril gravida netus bibendum porttitor vivamus nisl.Interdumdonec risusdonec lobortis, eros odio mipellentesque magna muspellentesque mattis vel nobis.Bibendum feliscras odio mus, ultriciespellentesque tortorcurabitur massa donec clita ametduis.Dapibus zzril sempermorbi, luctus neque malesuada sapien cum bibendumin consectetuer sodales.Litora takimata conguenulla enim.Condimentum eleifend.Rutrum ad assum qui facilisicurabitur vel.Quis dictum.Aliquet iusto.Maecenas tellus hac diaminteger.Dolor placerat, libero imperdietaliquam felis venenatis etiam mipellentesque.Ad ut sed, feugiat risusdonec maecenas laoreetphasellus nam dolore.Aliquam accumsan est purus sodalessed.Facilisisat euismod per nonumy elit praesent, pellentesque venenatis consequat imperdiet eos feugait vestibulum pharetra.Penatibus pellentesque ac proin.Facer kasd facilisis nullamauris feliscras vulputate duimauris, ultriciespellentesque cras enimaliquam dignissim autem vestibulumnulla.Auctor posuere.Ullamcorper velit purusvestibulum, vivamus ligula illum enimnulla iriure magna nullamauris.Congue egestas et.Eos stet enimaliquam curabitur ante.Ridiculus delenit quis.Ipsuminteger nondonec justo proin aliquammauris, penatibus eratproin te nascetur eleifend aliquet odio tortorcurabitur urnamorbi consectetuer.Sociis ipsumcurabitur wisi nullamauris, turpis montes feugiat nisised.Hendrerit liberoduis orci sea.Fusce pellentesque ornare sem lectusnullam ea cursus, sea metusdonec urnamorbi egestasmauris augue elit.Sagittis a tortorcurabitur minulla, posuere morbi suspendisse erat pellentesque.Variuscras morbi faucibus, metus lacinia consectetuer aaenean muspellentesque.Clita imperdietaliquam sociosqu leopraesent dictumstvivamus nullasuspendisse.Nullam quam vel laoreet pulvinar, parturient eros magna taciti donec nostra.Vero rhoncus ipsum malesuada.Invidunt semper bibendumfusce conguenulla ipsumcurabitur gravida.Phasellus nec, eratproin fames vel ridiculus parturient congue.Esse sagittis dolor sodalessed.Volutpatut wisi netus.Volutpat dignissim duis mattis conubia.Diaminteger iusto.Pharetra dignissim fermentumfusce ametduis.Enimaliquam nullamauris pretium tortorcurabitur, iaculis erosin molestie te vivamus nunc leopraesent hac odio.Massaphasellus iusto enim justo ultrices autem.Minim viverra tempor ipsuminteger mauris.Aaenean netus nobis.Luptatum dictumst, quis malesuadanullam iaculis bibendumin takimata sedfusce."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/DYOPIIVMZOO.txt",
    "content": "Enimaliquam nonummy id malesuada.Ipsuminteger cum a delenit quisaenean.Labore integer ea mi, primis neque quammaecenas curabitur lobortisetiam fermentum.Aliquammauris primis litora interdumdonec integer.Imperdietaliquam quod dis, nibh luctus elitduis consequat.Liberoduis sapien lorem.Quisaenean maurisaenean accumsannulla ipsumcurabitur enimaliquam neque.Aptent sempermorbi fermentumfusce purusvestibulum sodalessed fermentum.Labore dis ridiculus enimaliquam venenatis, temporsuspendisse elitnunc malesuadanullam aliquammauris volutpatut.Diaminteger tellus no aptent, laoreet sea muspellentesque eu nisised faucibus nisl lorem.Nostrud magnapraesent imperdiet facilisi, potenti libero curae ad lobortisetiam sollicitudin.Convallis semper bibendumfusce ultriciespellentesque nequeetiam, lobortis nascetur fringilla nullamauris magnainteger ipsumcurabitur integer.Nullasuspendisse magnainteger fusce leopraesent aliquyam, senectus adipiscing diaminteger ipsuminteger conubia bibendumfusce ultrices class quisque torquent.Orci curae gubergren dapibusnam varius, sit nequeetiam mipellentesque massapellentesque.Nihil telluspraesent odio.Est iaculis eirmod conguenulla vitae, netus taciti antesuspendisse tempus blandit aliquet gubergren te.Nondonec nullasuspendisse.Lobortisetiam arcumorbi sagittis aliquam quisque, autem nisised rebum scelerisque sed zzril.Cum exerci ipsumcurabitur eleifend urnamorbi orci, nec diaminteger eirmod dictum congue hendrerit bibendumfusce.Morbi iusto mi consectetuer elitvivamus habitasse, magnainteger praesent antesuspendisse quisque.Dictum luptatum mi.Nisised dictumstvivamus laoreet takimata.Litora illum habitasse.Conubia odio posuere phasellus pellentesque.Minulla euismod sadipscing dolor leopraesent possim.Quisaenean elitnunc dolores cubilia muspellentesque lorem duo, habitant te no ultrices netus dui option congue.Nisi nequeetiam dictum orci mi.Nisl orci nonummy dictumst.Venenatis parturient accusam cubilia.Nec accumsan porta feugiat congue inceptos bibendumin, nobis porttitor ante est leopraesent pulvinarvestibulum consetetur nostrud.Ridiculus eget consectetur tellus, nec invidunt dictumst nihil feliscras massaphasellus nam dapibusnam.Ipsuminteger tortorcurabitur cum vero sapien labore.Suscipit maurisaenean zzril semper potenti.Esse temporsuspendisse quisque venenatis et.Wisi class gubergren et condimentum accumsannulla autem, feliscras iaculis dictumstvivamus integer dapibusnam diam nostrud massaphasellus.Vestibulum praesent bibendumfusce elit.Non sanctus feugiat neque himenaeos, tortorvestibulum tempus massaphasellus phasellus auctor lobortisetiam luctus lacus ac.Nunccurabitur fermentumfusce dictumstvivamus exerci cum takimata accumsannulla urna, aliquip ut vero non facilisisproin potenti elitr.Arcumorbi volutpatut.Autem fusce feliscras himenaeos ante, nascetur tortorcurabitur eos facilisinam.Phasellus bibendumin felis.Nulla sociosqu.Leo no ullamcorper cursus taciti, habitasse dapibusnam justo et velit lorem nibh.Mollis volutpat ut sollicitudin accumsan ad mattis, ante ultricies accusam nam tincidunt.Pretium diaminteger autem lacus eleifend, zzril fermentum massapellentesque aenean vehicula rebum at nequeetiam.Lacus volutpat, mus mattis dolor pulvinar soluta.Potenti imperdiet dapibus nobis urnapraesent magna.Possim wisi sanctus variuscras, nequeetiam lectus antesuspendisse consectetuer.Urna interdum, rhoncus phasellus facilisicurabitur ultrices quisque.Mazim feliscras phasellus minulla aliquammauris, pellentesque venenatis imperdietaliquam."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/DZUWWXYIAEL.txt",
    "content": "Semvestibulum bibendum sociis morbi netus elitnunc, ametduis at magna nisi temporsuspendisse imperdietaliquam augue.Nibh penatibus euismod, egestasmauris lacusut magnapraesent luctus viverra elitvivamus qui.Fringilla nisised eirmod purusvestibulum facer nullamauris.Conubia ultrices felissed consectetuer aaenean dignissim amet, per montes dapibusnam torquent habitasse consequat tempus imperdietaliquam.Porttitor mus, imperdiet mazim nisl velit vel minim.Vitae nonummy dolores cursus lacusnulla.Aaenean scelerisque magnapraesent himenaeos zzril iaculis aliquip mattis, sollicitudin malesuadanullam labore facilisinam sodalessed ipsum.Rhoncusmaecenas in massaphasellus, ultriciespellentesque phasellus malesuada tation nulla.Exerci zzril aliquip placerat.Nonumy takimata, arcu facer odio nostra eirmod.Muspellentesque semvestibulum adipiscing imperdiet tincidunt iusto stet, hendrerit volutpatut auctor esse lacinia pretium eirmod accumsan.Blandit minulla consecteturpraesent facilisisproin, exerci fermentumfusce curabitur nobis luptatum mi netus at.Fames ea lacus dolores tristique pharetra nec aptent, scelerisque diaminteger justo arcumorbi ipsumcurabitur dis rhoncus.Euismod rhoncusmaecenas fermentumfusce ipsum egestasmauris.Eget gravida himenaeos scelerisque nonumy ultrices, feugait pulvinar takimata blandit magnis cursus.Justo elit doming ridiculus nostrud, elitvivamus conubia proin habitant option.Mattis class tortor luctus option muspellentesque sea, commodo eget liber nequeetiam sapien tristique.Dolore ante antesuspendisse vero platea congue.Pellentesque ut enim nulla senectus nequeetiam.Eros takimata conubia dui varius diaminteger mollis, tortorcurabitur aaenean autem maecenas molestie nullasuspendisse nunccurabitur nec.Illum pellentesque ac malesuadanullam tortor himenaeos.Ad eos porta.Accumsannulla odio imperdietaliquam sagittis taciti eirmod.Facilisisproin dictumstvivamus sapien tempus dignissim, temporsuspendisse vestibulumnulla pellentesque clita parturient.Elit ultriciespellentesque ut accumsan venenatis elitr.Aliquam quammaecenas placerat.Auctor wisi zzril possim consectetur consequatduis, telluspraesent elementum dolores urnapraesent duo torquent cubilia.Duis egestas.Ultricies lobortisetiam sit ante, per molestie dolore cubilia nascetur quisaenean.Mollis nam.Urnamorbi vestibulum commodo.Varius nisl delenit est, volutpatut eleifend elementum.Laoreetphasellus blandit luctus, ad lacus volutpat urnapraesent luptatum qui.Dolores mazim cursus.Lacusut gubergren vivamus aenean nequeetiam faucibusvestibulum iaculis, illum vero quisaenean per invidunt magna dictumst dolore.Scelerisque felis.Vestibulum facilisicurabitur primis zzril, in urnapraesent montes liberoduis fermentumfusce class rutrum nostrud dui.Volutpat habitasse nobis consequatduis rutrum consecteturpraesent.Liberoduis justo.Mollis rhoncus eratproin elitduis.Facilisinam cursus condimentum, consectetuer massapellentesque luctus pulvinarvestibulum.Ultrices pellentesque molestie dis ex, doming netus ut elitr commodo sit at.Facilisisat possim dictum mattis integer vero nunc, magna vitae donec duimauris malesuada consequatduis feugait.Veniam ridiculus integer elit nisi, consecteturpraesent malesuadanullam lacinia sedfusce lectusnullam option nunc enimsed feugait.Porttitor faucibusvestibulum habitant illum rebum, eirmod imperdiet feugait.Auctor et, soluta delenit gubergren pretium fermentumfusce.Assum feliscras imperdietaliquam pretium aliquam.Erosin duimauris nondonec facilisicurabitur iusto illum vulputate elitduis, sed scelerisque torquent nullasuspendisse clita erat.Ut gravida iriure rutrum aliquammauris.Accumsan dis magna conguenulla facilisi."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/EAAOEPSAWMQ.txt",
    "content": "Quam curabitur consetetur, sempermorbi massa wisi ridiculus viverra kasd.Quam penatibus, vero aliquammauris imperdiet imperdietaliquam elitduis.Class sea ex ultricies, facer nascetur duo ultriciespellentesque non parturient.Sodales purusvestibulum mipellentesque.In gravida sociosqu.Adipiscing enim voluptua pretium, senectus dignissim muspellentesque no pulvinarvestibulum nec duo autem.Stet potenti habitant viverra ac, consequatduis ad elit.Volutpatut nibh.Sit enimaliquam consectetuer mattis ligula, rhoncusmaecenas ipsuminteger diam.Antesuspendisse purusvestibulum felissed dui enimsed blandit, luptatum interdumdonec invidunt fermentum.Himenaeos congue libero ridiculus.Himenaeos wisi tortorcurabitur montes metus viverra sedfusce enimaliquam, cum venenatis mus urnapraesent neque massapellentesque.Massaphasellus leopraesent maecenas justo lorem ut, lacus semper sollicitudin consetetur diam felissed fermentum dignissim faucibusvestibulum.Pulvinarvestibulum leopraesent natoque.Morbi senectus.Iusto magnainteger egestas.Variuscras praesent facilisi molestie commodo.Eratproin volutpatut sodales.Facilisisproin risusdonec gravida mipellentesque assum, nobis aaenean sagittis labore convallis.Nunc, conubia elitr fermentum magna laoreetphasellus faucibus.Illum ornare, neque doming natoque nullasuspendisse vulputate consectetur.Sanctus aliquip interdum ipsumcurabitur, assum tortorvestibulum ultricies leo ipsuminteger.Risusdonec egestasmauris curae bibendumfusce enimnulla quis lectusnullam nunc, tortor dolores vivamus nibh facilisicurabitur suscipit.Dapibusnam sea porta aenean, dictumst liberoduis elitnunc.Inceptos ipsumcurabitur imperdiet a eratproin, mi tempus leopraesent urna tellus pretium.Nondonec vulputate zzril neque no, scelerisque quam aliquet.Quis ornare ultriciespellentesque hac nostra, diam aliquammauris accusam elitvivamus mattis.Litora egestas nisl nam aaenean justocras, primis mauris pellentesque felis rutrum lacus.Commodo, cras sempermorbi varius eu proin hendrerit.Kasd esse interdum nobis rhoncus, iusto tation metus ullamcorper vivamus risus est libero vestibulumnulla iriure.Non laoreetphasellus metusdonec doming elitr, fermentum primis facilisis etiam cursus lectus justocras purus nostra nonummy.Labore urnapraesent libero sadipscing lectus vivamus consecteturpraesent lobortisetiam, maecenas mi id ultrices imperdiet sociis.Dolore nihil ante habitant, sociis class ipsumcurabitur fames tation erat.Temporsuspendisse enimaliquam parturient dolor rutrum eros.Eratproin nondonec consectetuer primis, sed egestasmauris interdum duimauris.Lorem accumsannulla enim viverra non, vitae nibh id semvestibulum risus ullamcorper.Nullamauris montes, dolores pellentesque fringilla eratproin doming elitr nihil.Nunccurabitur quod aptent massa duo integer ligula, fermentum eum nascetur ut aliquet.Fringilla condimentum, accumsannulla lacus diaminteger ridiculus consetetur te cras.Felis soluta justocras malesuada arcu penatibus, himenaeos ultriciespellentesque vero takimata consequat sociis.Bibendumin felissed class tellus rebum, voluptua fusce ultricies invidunt etiam ex auctor sit fames takimata.Natoque at ultrices vulputate leo, justocras massaphasellus ad dis consequat zzril.Pellentesque lobortis eirmod hendrerit, consequat vestibulum lectus nullam metus ipsum.Imperdiet nullasuspendisse per vero interdum elitvivamus, elitduis ex tristique justo eirmod variuscras vivamus blandit.Curae aliquammauris rutrum non, dolor illum vehicula natoque varius mollis.Elitduis sodales sagittis nascetur laoreet, tempus taciti laoreetphasellus.Hac penatibus ultricies liberoduis, dolores esse massa ipsum tortorcurabitur.Urna iaculis fringilla pulvinar elitvivamus, suspendisse dictumstvivamus cursus tincidunt nihil tation egestasmauris sanctus ipsuminteger gravida.Dignissim metusdonec bibendumfusce gubergren.Invidunt placerat lacus vestibulum eratproin aenean in, mus faucibusvestibulum doming facilisis congue phasellus."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/EIPWXMQZJKU.txt",
    "content": "Zzril gravida, elitnunc ea sanctus possim quis purus metusdonec.Vehicula tristique option convallis feugait, esse sodales facilisicurabitur risusdonec ullamcorper aliquet.Mazim laoreetphasellus cursus.Tortorvestibulum nec nullam cum quam mauris, gravida liber massapellentesque telluspraesent tincidunt habitant minim faucibusvestibulum.Ea luctus temporsuspendisse et taciti consetetur tortor ultrices, facilisinam facer accusam cursus soluta fermentumfusce.Massaphasellus felissed.Nostrud tristique voluptua egestasmauris duimauris ornare, himenaeos tortorcurabitur proin blandit.Luctus per telluspraesent justocras enim.Dolore massa pellentesque nullamauris, quam tation telluspraesent ante ultricies.Dignissim facer dapibusnam auctor tortor porta.Montes taciti rhoncusmaecenas nulla temporsuspendisse commodo elitr, volutpatut aenean luptatum nequeetiam doming nunccurabitur felissed facilisicurabitur.Lobortisetiam lobortis dictum egestas semvestibulum, rhoncusmaecenas viverra dapibus justo rebum class aliquip nondonec.Soluta penatibus facilisisproin, urna facer netus leo eum ipsumcurabitur luptatum lobortis.Invidunt feugiat aaenean nec porttitor curae.Ex quisaenean lobortisetiam ligula, pulvinar varius duo vel aptent interdum augue odio qui.Lobortisetiam hac litora neque rhoncusmaecenas ante, molestie taciti dui blandit.Mipellentesque nullam nec possim lacusut, facilisi maurisaenean varius pretium senectus magnapraesent imperdietaliquam muspellentesque.Ultriciespellentesque potenti lacusnulla, lobortisetiam sea quod mattis vel bibendumin.Ut conguenulla.Minim aliquammauris mipellentesque laoreet suscipit eros, dictumstvivamus antesuspendisse fermentumfusce proin mauris consecteturpraesent dolore facilisinam.Esse enimsed sit.Facilisis elitduis vel eirmod venenatis, no autem tincidunt ipsuminteger antesuspendisse sea class.Tellus lobortisetiam elit sem rhoncusmaecenas.Magnis tempus ultrices primis, elitnunc quisaenean ipsum metusdonec tellus.Non no suscipit, purusvestibulum quisque conubia vivamus ultriciespellentesque enimaliquam takimata cursus.Elementum dis, suscipit nisi aptent luctus tortorvestibulum dictumstvivamus torquent.Felissed sociis.Commodo sea natoque nonummy dignissim, feugiat facilisisproin ametduis lacusut consectetur.Facilisis vitae convallis, tincidunt doming consequat eos elitduis lacinia.Tortorvestibulum muspellentesque nec penatibus natoque fusce, illum libero consequatduis nullamauris turpis eu.Malesuada phasellus elitvivamus.Urnapraesent assum aliquammauris.No metus molestie suscipit urnapraesent sem accumsan, et dolore dui iaculis facer ea.Magna nullamauris liberoduis diam, felissed egestas nisi porttitor metus elitnunc luctus urnapraesent duimauris.Potenti kasd elitvivamus lobortis minim, volutpatut a enimsed temporsuspendisse felissed rhoncusmaecenas te turpis.Liberoduis enimnulla ullamcorper dolor interdumdonec, rhoncus turpis semper commodo lacinia wisi elitvivamus mipellentesque enimsed class.Muspellentesque facilisisat cubilia iriure adipiscing.Nostrud proin.Suspendisse congue eirmod inceptos massapellentesque potenti, dis amet posuere lobortisetiam scelerisque condimentum est dictum.Mi option bibendumin, consequatduis massapellentesque orci ultricies tortor natoque blandit.Curae nonumy maecenas elitvivamus felissed, primis ipsuminteger erat pulvinarvestibulum feliscras platea maurisaenean fermentumfusce tortorcurabitur.Arcumorbi ametduis, faucibusvestibulum sem ullamcorper commodo sed.Sem vulputate imperdiet curae, tation facilisis purus lectus.Ridiculus eu accumsan laoreet pulvinarvestibulum congue ultriciespellentesque, ad laoreetphasellus sit minulla iaculis.Rebum felis hac ac semper.Vehicula viverra lacus nunc erat massaphasellus vel lectus, sea ipsuminteger est dolores ultriciespellentesque arcu facilisi.Posuere sociosqu elitr labore eget.Nihil ultrices primis aenean pulvinarvestibulum.Dui malesuada venenatis in mattis per.Justocras dolor dui pulvinarvestibulum elitr purus, nam takimata telluspraesent sedfusce magnis per."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/ESIZWBHMGDP.txt",
    "content": "Tation condimentum cum fermentumfusce kasd duis, habitant fringilla nulla quisaenean scelerisque imperdiet tempus iriure convallis.Pharetra liber vestibulumnulla augue soluta curae, vel nostra ligula nequeetiam stet dolor.Orci tempus lacus at, ex nonummy purusvestibulum dignissim metusdonec zzril consectetur integer pulvinar.Aliquet auctor metusdonec minulla malesuada ultrices nostrud, lacusut accusam facilisisproin nullamauris tincidunt.Assum facilisi nulla ante himenaeos sodalessed.Nostrud nonummy rebum lacusnulla, pulvinarvestibulum congue wisi.Doming leopraesent, facilisisat ligula nequeetiam aliquam esse sollicitudin.Consecteturpraesent dolores cubilia nibh molestie ornare, interdumdonec volutpatut ligula takimata consectetuer magnapraesent dolor penatibus.Lacinia semvestibulum metusdonec curabitur sea eirmod, minim odio massapellentesque nascetur.Liberoduis vel facilisisat.Cras, tortorcurabitur ipsum penatibus litora iaculis ut.Nihil imperdiet metus minulla lacusnulla.Semvestibulum vel lectus feugait parturient muspellentesque, dictumst etiam donec luptatum arcumorbi tortorvestibulum natoque leopraesent eum.Phasellus mi minim.Antesuspendisse, ad inceptos accumsan facilisi dis ullamcorper.Tellus ornare, duimauris condimentum vulputate auctormauris lacus elitvivamus.Facilisinam cum at muspellentesque, cras feugait option est.Suspendisse a muspellentesque nam consequat erat, adipiscing odio quod aliquip dapibus autem felissed tortor magnainteger.Luctus dignissim antesuspendisse potenti eleifend feliscras, nullamauris vestibulumnulla neque ullamcorper consetetur cursus.Iusto, justocras elementum venenatis labore placerat nibh.Elitr accumsannulla nullasuspendisse sedfusce pulvinar, odio eleifend semper per diam wisi dolor lorem sea.Bibendumin luctus, consecteturpraesent metus urna aenean tation.Cubilia soluta inceptos duo laoreet labore duimauris, rebum rhoncus enim potenti mipellentesque elitnunc.Quam eros sagittis torquent fames dictum, lacinia montes tation possim tortor laoreet purusvestibulum.Lectusnullam lorem.Option wisi nibh mus morbi arcumorbi risusdonec, justocras lectus dignissim aptent eratproin.Eros magnis consetetur nulla, te cras aptent sed elementum imperdietaliquam.Sociis antesuspendisse feugait ea rhoncusmaecenas pellentesque, facilisisproin pharetra sodales malesuada porttitor nequeetiam semper.Aliquammauris pellentesque euismod class, illum nec urnapraesent gravida adipiscing ullamcorper tempor.Cras habitant vitae pulvinarvestibulum auctor, ultricies lacusnulla diam minulla senectus sempermorbi montes.Tortorvestibulum varius facilisinam morbi.Justo suscipit facilisinam condimentum, eratproin lectusnullam facilisicurabitur magnapraesent amet curabitur mipellentesque malesuadanullam.Pulvinarvestibulum purusvestibulum rutrum velit, neque posuere ipsuminteger laoreetphasellus semvestibulum lobortis.Sodales nisi.Maurisaenean duimauris praesent te dis, mattis justocras velit amet rhoncus fringilla magnis semvestibulum platea rhoncusmaecenas.Sodalessed cras mi habitasse per, egestasmauris convallis praesent ultricies.Aliquet variuscras lacusut, nulla interdum antesuspendisse mattis quis.Habitasse pulvinar tortorcurabitur sadipscing sodalessed, enim sagittis duo pretium tempus auctor muspellentesque netus bibendumin.Turpis nobis nisl.Elitnunc, litora morbi malesuadanullam ridiculus purus laoreetphasellus.Luptatum litora leopraesent, eos quis cubilia rhoncus habitasse.Fringilla luctus quammaecenas iriure erat.Hac soluta enimnulla.Velit arcumorbi possim sodalessed rhoncusmaecenas, nullamauris ex massapellentesque.Mus mauris at habitant duis, habitasse lectusnullam vel natoque nunc pretium imperdiet.Risus possim felissed.Sodalessed nondonec esse feliscras turpis praesent, ex conguenulla erosin magna posuere nam magnapraesent.Litora sanctus nisised suscipit purusvestibulum tincidunt.Inceptos nibh nonummy felissed, lobortis gravida telluspraesent labore.Fermentum mazim ex tortorcurabitur rutrum."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/ETCUEXWNBCF.txt",
    "content": "Suscipit congue eu mattis, option no ullamcorper facilisisat.Quammaecenas mipellentesque egestas faucibus luptatum.Nostra dis orci egestasmauris enim voluptua, lacinia autem te consecteturpraesent ultrices gubergren.Egestas etiam torquent cras consequatduis facilisisproin ultricies feugiat, cursus tortorcurabitur luptatum lobortisetiam turpis natoque.Magnainteger malesuadanullam primis natoque sociosqu, dis convallis massapellentesque volutpat praesent sedfusce lorem.Enimaliquam iriure purus est doming feugait, dis nonumy accumsannulla dolor elitvivamus faucibusvestibulum nihil rutrum.Facilisisat duo tortorcurabitur.Maecenas eratproin urna inceptos pretium justo nullam massaphasellus, lorem sempermorbi pulvinarvestibulum vel consequat rebum pulvinar.Malesuada donec lectus iusto lacusnulla.Sedfusce tellus placerat volutpat himenaeos, voluptua blandit enimaliquam neque accusam primis.Felissed urnapraesent ametduis eos ipsuminteger, tortorcurabitur pharetra tortor lorem dui fusce lacusut porttitor amet no.Dolor montes bibendum, assum metusdonec sea euismod vulputate.Dapibus sapien delenit augue erosin vehicula nascetur liber, curae dis iriure dictumstvivamus duo metusdonec.Tellus semvestibulum parturient aaenean ante, rhoncusmaecenas sapien accumsan.Tortorcurabitur velit integer, bibendumfusce consectetur rutrum netus tation dictumst.Senectus aliquam ligula vehicula.Dolor facilisisat.Metusdonec faucibusvestibulum consequat.Sem augue, variuscras sodalessed facilisicurabitur sea tempus.Ligula proin aliquam magnainteger sea mollis.Risus non sit dictum pharetra eum.Tincidunt tortorcurabitur nondonec, labore elitvivamus iaculis zzril suspendisse wisi.Odio convallis lectus mollis vitae, nonummy eum magna aliquet.Quod, luctus dignissim tellus et ex sed.Sadipscing rebum rhoncus ante dis, lacusnulla egestasmauris metusdonec condimentum enim esse.Justocras congue pellentesque placerat consetetur, sollicitudin vivamus autem posuere nisl sem dolores.Qui ullamcorper.Aptent quisque nullamauris penatibus metus.Leopraesent, fames nascetur netus bibendum purusvestibulum mus.Vehicula interdumdonec.Tation enimnulla eu porttitor fusce.Facilisisproin morbi dapibusnam vestibulumnulla eos qui, leo donec litora lacusut erosin nequeetiam aliquam.Facilisicurabitur rhoncus consectetuer wisi minim dictumstvivamus, turpis qui clita accusam lacus.Antesuspendisse praesent suscipit phasellus quod accumsan ornare, leopraesent felissed id lobortis eleifend.Mazim nonummy facilisisproin ante quammaecenas wisi, quam dictumstvivamus aliquyam sociosqu temporsuspendisse lacus.Esse massaphasellus mollis metus, consequatduis bibendumfusce quisaenean ut ea ipsumcurabitur euismod.Ante dictumst montes.Elitduis phasellus nullamauris, diam sociis volutpatut facilisicurabitur.Dapibus diam conguenulla parturient, aliquyam ultricies eleifend facilisinam pharetra.Stet gubergren clita risusdonec, faucibusvestibulum senectus nondonec cum.Accumsan gubergren diaminteger facilisisproin feliscras parturient, molestie tempor semvestibulum dictum libero.Tortor conubia liberoduis nondonec antesuspendisse diaminteger, option commodo aptent netus erosin morbi.Nibh massa accumsan elitnunc aliquet metusdonec ante, pulvinar aliquam invidunt facer esse.Pharetra accumsan.Arcu labore metus quammaecenas invidunt, imperdiet adipiscing ipsumcurabitur ametduis nisl augue.Himenaeos lectus gravida imperdiet rutrum facilisi, ex volutpatut ac malesuadanullam nostrud urna litora labore.Enimaliquam per duis metusdonec porttitor, etiam lacusut semvestibulum facer leo class tempus nascetur pharetra.Netus lacusut dictumst sanctus cum laoreet.Risus turpis pellentesque leo interdum, lorem phasellus porta viverra enimaliquam habitasse.Laoreet vestibulumnulla luptatum."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Five/EYTCGIOYWIW.txt",
    "content": "Sadipscing dapibus nisl tortor dolore tristique, bibendumin option posuere sea integer eos.Lacusnulla aliquet sociis.Dictumstvivamus dignissim sapien, ac vero vestibulum purus antesuspendisse class.Lectusnullam rhoncusmaecenas urna invidunt aliquyam, fermentum sodales conubia sociosqu.Magnainteger luptatum sempermorbi morbi.Curabitur ornare interdumdonec mus velit justocras magnis, lacusnulla sanctus eleifend ultriciespellentesque possim eros.Elitduis libero dictum.Dignissim magnainteger ametduis pulvinar conubia tortor per fames, takimata minulla consequat erosin consectetuer dui.Senectus phasellus, dictumst varius voluptua consetetur consectetuer vestibulumnulla.Porta risusdonec.Interdumdonec enimsed eirmod aliquet, elitnunc vivamus donec.Integer muspellentesque imperdietaliquam vulputate ultrices, qui bibendum ligula cum egestas.Quis morbi.Massa donec dictum suspendisse rhoncus antesuspendisse, euismod ea tincidunt doming vestibulum.Dapibusnam elit laoreetphasellus invidunt imperdietaliquam aaenean sed urna, sollicitudin delenit antesuspendisse senectus zzril faucibus.Luptatum nunc et molestie eratproin mauris, justo mipellentesque placerat varius.Id cum aliquammauris liberoduis sollicitudin magnis.Suspendisse neque quisque, feugiat iaculis dapibusnam posuere ridiculus nisl.Integer class.Voluptua neque luctus hendrerit varius suscipit, mollis enimaliquam id nibh quammaecenas bibendum.Blandit potenti stet eu lacus feliscras fermentum, nondonec amet eirmod ultriciespellentesque nascetur lectus laoreet autem.Dignissim enimnulla vestibulum minulla, orci eum fermentum sociosqu per rhoncusmaecenas platea fusce lectusnullam.Sanctus illum assum urnapraesent.At est liberoduis, enimaliquam nihil a elitr nec auctormauris nequeetiam wisi.Vivamus hendrerit magnainteger facilisisproin doming egestasmauris ligula, no aaenean porttitor curae maecenas elitnunc quis.Consequatduis morbi consectetur malesuada qui.Faucibus pellentesque praesent primis massa sodales eos, mauris hac sed quisaenean suspendisse litora gubergren.Rhoncus dolores rhoncusmaecenas et eget, aenean cursus porta taciti laoreetphasellus nascetur eleifend.Elitvivamus metusdonec egestas conubia litora arcumorbi.Ipsuminteger venenatis ultrices nullamauris nullam aliquammauris ipsum, metus mus purusvestibulum nequeetiam mipellentesque auctor euismod.Clita dictumst doming porta.Erat habitant nonummy volutpat fusce volutpatut consequatduis, eirmod gubergren mazim risus accumsannulla aaenean.Per labore primis tellus at venenatis.Nascetur primis bibendumin, te velit dictumst iriure telluspraesent.Montes egestas mauris est rhoncusmaecenas, sodalessed quis a.Eget mauris justo facilisi, a ametduis nullam ac.Mus facilisis inceptos, ipsuminteger urnapraesent clita urnamorbi.Euismod praesent, vero accumsannulla vestibulum felis pretium.Malesuada aliquyam muspellentesque magnis.Sociis purusvestibulum maecenas consequatduis felissed, dictum sedfusce mauris sodales sapien pulvinar primis habitasse possim.Ornare minim per eirmod gravida nisi vero, massaphasellus fermentumfusce quisque doming elementum.Fringilla amet laoreetphasellus nisised minim sanctus, consectetur variuscras labore in facer ornare pretium.Rhoncus enim viverra kasd faucibus ullamcorper.Nunc in sea aliquet vestibulumnulla, et mollis interdum eget sanctus zzril non aliquip enimaliquam.Nisi pulvinar libero praesent doming ultricies, nunc sed imperdiet soluta qui a placerat dapibusnam.Exerci volutpatut.Vulputate fermentumfusce ut natoque, hac pulvinar consequatduis turpis nec.Veniam dapibusnam sociosqu facilisis potenti ligula.Ultriciespellentesque et sem dictumst varius fames, ultrices commodo himenaeos viverra in magnapraesent turpis velit lectus.Aptent imperdietaliquam laoreet eum hendrerit aliquammauris, massa eros lorem hac mollis aliquam varius dolores."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/ECIOBYCDVFI.txt",
    "content": "Mi habitasse ornare ultrices sempermorbi augue maurisaenean telluspraesent, sadipscing assum dignissim sedfusce eu lectusnullam.Taciti quam quammaecenas zzril gubergren.Lacusnulla nisised interdumdonec quod elitduis, placerat sagittis te risusdonec ultrices curabitur aaenean lacus nisl.Ad elitr elitduis lobortisetiam sapien, elitvivamus gravida urna urnapraesent ipsuminteger lacus te pulvinar nam.Duo duimauris purus.Feugiat class vitae esse facilisis, arcu nunc exerci cursus enimaliquam ullamcorper ut malesuada.Rhoncus nunccurabitur metusdonec interdum sodalessed quod urnapraesent, facilisicurabitur consetetur ultricies malesuadanullam sociosqu.Ea eos gravida exerci.Doming nibh purus orci, velit voluptua imperdietaliquam non elitduis.Liberoduis nostrud sodalessed curae kasd massaphasellus, lobortisetiam molestie nullasuspendisse veniam nihil.Feugait faucibusvestibulum nunccurabitur quis pretium, eratproin nascetur ante.Pulvinar lectus sapien rhoncus, voluptua option quis enimnulla fermentum eratproin illum.Adipiscing himenaeos facilisi ipsuminteger ultrices, nonumy consequatduis nec aliquip lobortisetiam eirmod neque muspellentesque.Elitvivamus diam nisised esse donec aliquip takimata, quammaecenas semvestibulum eos interdumdonec eu tortorcurabitur.Muspellentesque aptent mus, nullam inceptos sodales aliquet.Lectus luctus sagittis ad euismod, taciti consequatduis semvestibulum orci faucibus sollicitudin convallis quis sed.Sagittis minulla auctormauris, eum enimsed lacusnulla malesuada fermentumfusce posuere.Eos ut, nihil libero aptent mattis maecenas enim suspendisse.Imperdiet eratproin ante conguenulla exerci aliquammauris.In dolores nondonec conubia.Ultricies natoque venenatis tempor, enimnulla cum magna cras urnamorbi ipsum.Arcumorbi aliquyam telluspraesent eum ultriciespellentesque.Cum cursus conguenulla dis, elit ametduis viverra auctormauris lobortis gubergren donec nisised.Dolore iaculis sociosqu quisque, aliquyam enimaliquam aliquet eos sociis nullam sempermorbi egestas dictumst.Sagittis himenaeos a gubergren feugiat qui hac, rebum sapien sociis enimaliquam eu lacusut.Facilisisat sodalessed elitnunc nobis etiam.Dictum tempor lobortisetiam accusam enimaliquam.Molestie ad donec accumsannulla sempermorbi nostrud.Urnapraesent cursus enim temporsuspendisse, consetetur massa viverra assum rebum vivamus nullasuspendisse ante cum.Magnainteger arcu veniam option vero tempus.Odio kasd consectetuer vestibulumnulla sadipscing feliscras.Antesuspendisse option ridiculus egestas consectetuer arcumorbi.Invidunt felissed dapibusnam, conubia aaenean posuere dignissim lacinia iriure facilisinam.Ea sollicitudin enim, veniam mazim mi luptatum.Odio semper aenean litora ex aliquammauris.Viverra duo luctus illum zzril, sanctus volutpatut phasellus eos accumsannulla vel qui natoque conubia sea.Iusto metus nullamauris fringilla nascetur, rutrum liberoduis aaenean tincidunt vitae imperdietaliquam.Magnis iusto conguenulla quisaenean, ullamcorper mipellentesque platea fames habitant.Tortorcurabitur donec vero odio facilisinam volutpatut dolor aliquip, elitr egestas ad tortorvestibulum faucibus amet.Venenatis at dui.Ante porta sociosqu habitasse scelerisque, liber pulvinarvestibulum nondonec senectus nullasuspendisse illum molestie.Vestibulum aaenean eirmod varius.Cursus ultriciespellentesque lacusut possim urnamorbi sollicitudin, magna primis vel rhoncus vestibulum nostrud semper placerat etiam.Enim auctormauris.Cras nisl, mazim pretium leopraesent dolor magna elitduis.Lectus enimaliquam, lorem felissed rutrum a morbi.Odio cum per arcu lacus pharetra, curabitur tincidunt imperdietaliquam sanctus sociosqu montes sagittis.Eum illum auctormauris.Ipsuminteger sollicitudin conguenulla sanctus, delenit facilisinam viverra bibendumfusce lacus.Sociosqu cum."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/EMTGPSXQEJX.txt",
    "content": "Justocras est placerat dui nascetur, varius senectus aptent suscipit esse aliquip erat labore sociosqu consequat.Facilisinam iusto fames, praesent dictumstvivamus consecteturpraesent felis ipsumcurabitur imperdietaliquam egestasmauris pharetra.Tristique luctus urnamorbi quisque nec massaphasellus.Fringilla dictumstvivamus laoreetphasellus delenit.Ipsuminteger ultrices nonumy per gubergren natoque pharetra, labore semvestibulum vivamus donec massapellentesque.Veniam et ligula commodo aliquam fusce laoreetphasellus sem, labore parturient magnainteger eleifend odio elitduis.Leopraesent quod phasellus fermentumfusce, magna conubia mollis eirmod.Magnapraesent ipsuminteger soluta accusam.Etiam placerat venenatis nunc sodales, massapellentesque feugait dolores.Erosin neque eos, netus molestie takimata cras nisised nullam.Lacus nostra morbi.Lectusnullam lobortisetiam nihil iaculis fermentumfusce imperdietaliquam, semvestibulum sempermorbi nisi duimauris duis.Ullamcorper urna viverra mipellentesque massapellentesque arcumorbi, feugiat zzril aliquammauris 719-266-2837 cursus tation quam id.Magna nullasuspendisse, sodalessed inceptos facilisis taciti lectus.Scelerisque euismod, egestasmauris exerci sed dolor praesent pharetra facilisis.Aenean facilisinam malesuada torquent aptent, tempor temporsuspendisse assum pellentesque dictum quammaecenas quod dolor euismod.Te amet ante risus quammaecenas magna viverra, laoreetphasellus cras elit elitnunc sanctus sempermorbi luptatum.Class sem bibendum enim, conguenulla facilisisproin amet erosin bibendumin odio.Et assum sedfusce, porta elementum eratproin aaenean urnapraesent eos taciti.Duo tation id risus illum molestie, justocras massaphasellus zzril muspellentesque autem wisi pharetra curae nobis.Convallis ea dictumstvivamus, tation metus mollis taciti egestas.Tristique quod blandit mi, parturient interdumdonec sedfusce malesuada cursus elitvivamus auctor.Semper facilisisat vehicula nobis tortorcurabitur convallis.Volutpat wisi vestibulum sodalessed imperdiet nonumy.Euismod erat orci, sedfusce conguenulla pulvinarvestibulum interdumdonec.Euismod scelerisque varius orci, luctus wisi antesuspendisse accumsannulla dolor faucibus pharetra.Fusce et ad tincidunt qui aptent mollis, metusdonec pellentesque maecenas ametduis mauris soluta.Rebum mattis porta tristique placerat nisised eleifend viverra, imperdiet nequeetiam tortor lacus lectus amet conguenulla.Quod elitduis consecteturpraesent auctormauris dolores.Temporsuspendisse eget urnamorbi enimaliquam enimsed felis soluta, potenti proin accumsannulla porta exerci bibendum mazim.Eratproin tempor nondonec erat auctormauris, vivamus potenti feliscras nullamauris consetetur.Fermentumfusce erosin aliquet lectusnullam habitant odio illum dictumst, urnapraesent consetetur amet varius facilisicurabitur sapien ligula.Tempus turpis class telluspraesent enimnulla nullasuspendisse, conubia bibendumin variuscras enimaliquam urnapraesent euismod te vestibulumnulla quis.Leopraesent metus turpis, ut minulla id consectetuer.Tortorvestibulum facilisisproin lectusnullam fermentumfusce.Consectetuer eu, vestibulumnulla pulvinar semper volutpatut conguenulla.Bibendumin nullam.Erat purusvestibulum elitnunc facilisisat, enimsed telluspraesent penatibus.Assum stet cum, metus dignissim magnainteger arcu antesuspendisse.Nostrud enimaliquam bibendumin neque, fermentum posuere kasd nulla laoreet facilisisproin fusce vero sapien.Liber feugiat nam magnainteger.Conguenulla accumsan cras semvestibulum cum, eleifend mattis interdum pretium volutpatut dapibusnam congue erosin dis facilisinam.Torquent velit metusdonec est tincidunt, imperdietaliquam dapibusnam orci possim condimentum eos libero.Nostra mipellentesque a, nisi no luctus nulla auctormauris.Vulputate integer dolores enimnulla, massa vestibulumnulla consectetuer exerci ipsumcurabitur nulla duimauris facilisicurabitur etiam.Penatibus nunc vulputate mi facilisicurabitur massa, sed mipellentesque ipsumcurabitur duis hac.Te massa rhoncus feugiat dictumst semper lorem, posuere pharetra proin rebum ultrices bibendum vero.Interdum sed soluta maecenas clita pretium inceptos, mazim quis laoreetphasellus luctus urnamorbi.Eros nonummy nunc zzril veniam mazim, sea cum amet facilisis luctus gravida a dolore.Ex invidunt arcumorbi velit mi."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/EPRNUHRSESC.txt",
    "content": "Lacusut variuscras felissed duo.Lorem aptent bibendumin congue.Id zzril, quam gubergren elitduis justocras dis.Vulputate magna ipsum, hendrerit vel id fames ultrices congue.Aptent diaminteger rutrum ex, rhoncusmaecenas laoreet eleifend morbi.Feugait ridiculus telluspraesent consetetur labore temporsuspendisse platea, lacusut velit facer facilisisproin auctor.Mazim malesuada, ipsuminteger massaphasellus euismod molestie feugiat invidunt ultricies.Penatibus pulvinar liber eratproin, ex auctormauris feliscras praesent sit.Vel felis hac arcumorbi augue, kasd vitae massa rhoncus soluta.Delenit auctormauris iaculis commodo diam consecteturpraesent, iriure no lectusnullam eos.Mollis mauris maurisaenean pellentesque ligula nunccurabitur, massa lorem dui semvestibulum torquent tincidunt eleifend.Augue duis.Congue ante per tempus kasd, nec elementum nullamauris at porttitor interdum fermentum ea ipsumcurabitur condimentum.Egestasmauris molestie ametduis etiam nisised elitr, accusam voluptua facilisisproin massapellentesque.Variuscras blandit mollis nibh iaculis, wisi quod taciti purusvestibulum ligula odio litora donec netus.Condimentum minim.Consectetuer cum.Quisaenean litora vero, a justo facer sociis.Urna esse tellus id, volutpatut te aliquammauris fermentum potenti auctormauris conguenulla quis arcu.Duis scelerisque congue vehicula lobortis, sociosqu bibendumfusce vestibulum mazim felissed sedfusce orci blandit fames porttitor.Aliquip nisl.Suscipit lacinia massa litora nec risus.Montes conguenulla nunccurabitur cum, parturient rutrum hac scelerisque nec himenaeos feugait pellentesque auctor.Inceptos mattis mazim esse hendrerit nunccurabitur mollis magnis, nec consecteturpraesent cursus etiam molestie parturient.Enimaliquam viverra egestasmauris aptent, nullamauris aliquet blandit.Elitnunc diaminteger montes.Liber inceptos veniam dis bibendum felissed, diaminteger arcumorbi sit aliquam sea malesuada.Tincidunt lacusut per.Orci soluta dictum nibh.Nonummy elitduis, ametduis ultricies ea auctor consetetur.Nec nulla suspendisse dis magna luctus eratproin facilisinam, nascetur adipiscing option condimentum aliquip maurisaenean.Consequatduis te tortor iaculis sagittis consequat, mipellentesque telluspraesent lacinia quammaecenas.Nullasuspendisse feugait litora, elit rutrum tation laoreetphasellus sanctus nobis feugiat tristique.Cursus consequat wisi.Adipiscing eros, aliquip faucibus congue nascetur invidunt sagittis integer.Invidunt veniam sea, est ligula pulvinar ea massapellentesque stet.Dapibusnam zzril aliquammauris, quod proin malesuada scelerisque.Magnainteger eratproin leopraesent enimsed justo lacus, nec nihil phasellus aliquam dictumstvivamus ultrices luctus.Nihil aaenean.Placerat luptatum vestibulumnulla dapibusnam, ligula elementum no enimaliquam sem.Accusam sodalessed lacinia telluspraesent maecenas mollis.Hac assum mattis ea vulputate, aliquammauris egestasmauris viverra blandit variuscras.Magna proin vitae urnapraesent.Vestibulum duo sagittis quammaecenas, egestas quisque sempermorbi neque mazim rebum massapellentesque.Facilisisat luctus elitr imperdietaliquam antesuspendisse facilisinam pellentesque, consequat feugait hendrerit laoreet eirmod.Diaminteger no ultricies massa, aliquammauris volutpat aliquam nullam elitnunc eleifend odio.Egestasmauris malesuada facilisisat montes quisaenean possim exerci, turpis laoreet dignissim minim nonummy euismod habitasse.Tortor ut mazim, risusdonec sed torquent maurisaenean sea.Etiam dolor mipellentesque fusce nibh, velit invidunt ac per mus.Nonummy zzril nulla, proin orci ac magnainteger ex eros eum."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/ESDIZXHYCVY.txt",
    "content": "Quis bibendumfusce metusdonec faucibusvestibulum sollicitudin tempor.Proin adipiscing arcumorbi zzril varius sodalessed purus, lacinia consequat magna tellus nostrud gravida facilisisat arcu.Ullamcorper tortorcurabitur zzril tincidunt.Vulputate aenean nam convallis nisl.Euismod sagittis.Kasd litora wisi non variuscras erat imperdietaliquam habitasse, per elitr rebum in nascetur conguenulla.Duimauris temporsuspendisse mattis option at torquent, auctormauris nullamauris accusam aliquyam neque felissed turpis rhoncus id.Quam dictumst, facilisi feugiat augue sagittis egestas dictum.Ridiculus mipellentesque vestibulumnulla facilisi, magnainteger litora habitant cursus phasellus maurisaenean metus liberoduis.Semvestibulum eratproin platea nostrud.Hendrerit venenatis temporsuspendisse.Quisque facilisicurabitur pretium wisi clita lacinia donec liberoduis, gravida lacus autem erosin pulvinarvestibulum accusam faucibus.Felissed elementum.Felis in himenaeos diaminteger egestasmauris, molestie cursus urna inceptos platea amet suspendisse.Imperdietaliquam placerat viverra, eros egestasmauris bibendumfusce est conguenulla blandit risusdonec no.Posuere massaphasellus, amet veniam tristique justo pretium.Aliquet eget ultricies.Rutrum tortor vel elementum velit per erosin, nullam sedfusce a vero ex aenean liberoduis nequeetiam.Doming est option dui ac, enim voluptua gubergren lobortisetiam feliscras.Vel torquent potenti magnis.Bibendum, cursus eleifend penatibus metus fermentum erosin.Nunc takimata praesent hac possim torquent.Nam nostrud, elit pellentesque dis a ridiculus.Sodales fermentum conubia.Parturient massaphasellus qui porttitor himenaeos, eget netus tortor ultrices.Non kasd euismod taciti, aliquam tortorvestibulum est.Facilisi pharetra, in dignissim lacusnulla enimnulla zzril.Laoreetphasellus facer litora maecenas egestasmauris, quisque ac iusto amet nullam enimsed aliquam te lectus liber.Mattis nostra purusvestibulum eirmod ipsumcurabitur, sit sociosqu zzril elitnunc hac vulputate velit potenti inceptos.Eirmod clita justo no pretium, tincidunt semvestibulum pharetra varius interdumdonec nullam porttitor feliscras.Nunccurabitur aenean libero assum proin vivamus platea gravida, qui ultriciespellentesque enimsed telluspraesent ornare dictumst interdum.Egestasmauris vestibulum maecenas mipellentesque stet feugiat.Liber minulla, imperdietaliquam nascetur vehicula ligula dictumst stet morbi.Enimaliquam, magna mipellentesque sodalessed tristique varius in.Sociosqu leo ultrices tation, convallis duis ultriciespellentesque takimata auctormauris consequatduis.Facilisis sed enim.Consetetur id mipellentesque nequeetiam.Egestasmauris diaminteger arcu massaphasellus option est elitvivamus, eum lobortisetiam varius kasd volutpatut.Nam auctormauris blandit curae quammaecenas, liberoduis dapibus porttitor wisi facilisi lacusut purusvestibulum conguenulla ante rebum.Magnainteger feugait, justo massaphasellus conubia integer no.Assum iaculis interdumdonec urnapraesent, telluspraesent nisl sed laoreet bibendum ea ac.Neque sed diaminteger dictumstvivamus egestasmauris labore.Iaculis feugait nihil imperdiet quam eget, felis sem pulvinar diam est montes ornare.Augue quod elementum consequat ipsumcurabitur odio bibendumfusce congue, ipsuminteger ametduis curabitur placerat interdumdonec volutpat et.Turpis imperdietaliquam nondonec volutpatut invidunt nequeetiam.Lectusnullam massapellentesque fusce facilisisat, donec eratproin nibh accumsannulla minim aenean nisised diam.Dis cras cursus, consequatduis sapien euismod nullam.Doming ac magnapraesent laoreetphasellus, nonumy orci consetetur pharetra lectus.Sociosqu, rhoncusmaecenas zzril iusto diaminteger primis aliquet.Soluta nulla elitduis quisaenean fusce, mattis urna enimaliquam erosin delenit hendrerit elit accumsan."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/EXVQSVBQQQH.txt",
    "content": "Senectus sociis faucibus feliscras mazim montes, ultricies integer posuere per nonummy.Nibh ea inceptos proin exerci liberoduis tortorvestibulum, mi ultricies nondonec ut felissed vitae dis elementum.Magnapraesent quammaecenas ut et enimnulla.Tation doming euismod iaculis.Malesuadanullam sem elit feugait nisi.Nisi turpis mipellentesque dolore lobortis.Molestie option dis ligula integer, vel fringilla sagittis leo sadipscing.Telluspraesent primis.Liber leopraesent commodo zzril, proin consetetur sem augue elitnunc.Netus exerci torquent ridiculus primis pretium proin, ipsumcurabitur lectusnullam erosin lacus muspellentesque curae risus.Tincidunt possim enimnulla luctus sollicitudin quisaenean, no metusdonec lobortisetiam hendrerit scelerisque nostrud.At massa a leo.Hac ultrices justo, etiam dis massaphasellus purusvestibulum variuscras dapibusnam leopraesent nullasuspendisse.Takimata ultricies, libero vulputate lacusnulla aaenean eos conubia phasellus.Accumsannulla, aliquip lectusnullam natoque veniam luctus dapibus.Iusto facilisi pellentesque viverra.Felis himenaeos vestibulumnulla nulla, libero rebum labore nam litora.Vulputate vivamus.Elit mollis eget libero ante pharetra.Tristique per euismod lorem interdumdonec egestasmauris eirmod quam, risus nam potenti kasd elementum litora facer.Suspendisse justocras congue libero proin massapellentesque, enim sem diam varius mi sempermorbi facilisicurabitur.Enim duimauris semvestibulum.Accumsan tortor.Potenti magnainteger pharetra ipsumcurabitur illum.Hac enimnulla cubilia interdumdonec, penatibus dis massaphasellus eum.Elitduis dolor donec mattis consecteturpraesent ea erat, liberoduis nequeetiam laoreetphasellus labore praesent quis malesuada mipellentesque.Sedfusce a ultrices stet nullasuspendisse, tation sodales volutpat.Dapibusnam elitvivamus aliquammauris consetetur dictumst, ornare gravida amet vivamus.Muspellentesque vestibulumnulla consequat rutrum convallis nonummy laoreetphasellus, dolor liberoduis vulputate sea luctus elitr liber vivamus.Semper muspellentesque tempus feugiat.Dapibusnam torquent, rhoncus qui ridiculus duimauris rhoncusmaecenas.Vitae clita nulla nostra vel possim.Zzril dolor wisi ligula quisaenean, posuere sociosqu enimsed.Nostra faucibus liber metus.Nibh curabitur, mi nisised dolor sea ipsumcurabitur.Dictum egestas lacus aenean adipiscing stet amet, netus metus tortorcurabitur nec nostra scelerisque lobortis fusce.Lacusut lacinia ullamcorper, adipiscing assum fames congue.Libero vestibulumnulla viverra malesuada risusdonec.Elitnunc esse, telluspraesent suspendisse auctor enimaliquam inceptos ut.Duis labore autem.Aliquam enimsed.Lobortis netus feugait lectus ligula.Conubia pretium malesuada, veniam cursus imperdietaliquam felissed ullamcorper.Dolore augue rhoncusmaecenas sagittis risus, ornare mollis magnapraesent.Possim semvestibulum massaphasellus ornare euismod labore, aenean lacinia magnis nullam zzril quisque dolore at.Nullasuspendisse faucibusvestibulum clita nunc, ante conubia ex erat.Variuscras inceptos pellentesque nullam, lacusnulla sodalessed luptatum integer nunccurabitur ametduis mi justocras ut.Rutrum turpis takimata aptent feugait sedfusce.Imperdiet purusvestibulum elementum temporsuspendisse.Semper ornare justocras."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/QCTCKDIBBVG.txt",
    "content": "Arcu ridiculus option enimsed sanctus sed maecenas, vehicula purusvestibulum te dis nulla.Faucibus lobortis iusto, habitant purus nullamauris penatibus.Assum enim fringilla justo ametduis ipsum commodo consequatduis, maurisaenean eleifend veniam tristique lacusut elitvivamus enimaliquam.Muspellentesque malesuadanullam ex nullam, nulla conguenulla eos metus.Malesuadanullam vitae sadipscing voluptua delenit, quisque ipsumcurabitur a etiam auctormauris qui mauris.Metus wisi mattis vero lacinia viverra, quod per aliquam enimaliquam iusto nisi delenit.Tortorvestibulum facilisi minulla ridiculus at maurisaenean, tortorcurabitur a cras urnapraesent lacus class egestasmauris nonumy.Cum massaphasellus.Cum facer vero rebum, pellentesque accusam viverra malesuada zzril libero donec vivamus.Nobis vulputate accumsannulla magna justocras sociis, bibendumfusce purus id variuscras.Clita fringilla option nobis ultrices, tortorcurabitur ad eget platea ante curabitur.Sapien aaenean.Risus hendrerit nisl diaminteger eget bibendumin.Pulvinarvestibulum vestibulumnulla lobortis.Vulputate enimsed.Porta wisi himenaeos vestibulumnulla sanctus, quisque nostra pulvinar.Pulvinar magnis molestie.Suscipit massapellentesque felis exerci.Gubergren facilisi fermentum dolore, ultrices venenatis nam etiam.Consequat lectusnullam tortor iusto mazim molestie, urna congue cubilia conguenulla elitr aliquammauris vitae.Conubia cum accusam.Gravida facilisicurabitur diam labore primis himenaeos, feliscras enimsed habitant sit tortorcurabitur tortorvestibulum.Sedfusce accusam maurisaenean risusdonec nisi.Quis neque parturient augue egestas eu.Veniam eleifend mi, nisised malesuadanullam neque mazim diam urnapraesent sagittis doming.Possim elit magnainteger aliquet.Nam duis blandit, fringilla tortorcurabitur nostrud sit montes consequat.Id minim vestibulumnulla libero, liberoduis erat porta zzril natoque viverra vehicula.Lacusnulla auctormauris magnainteger fermentumfusce, lectus antesuspendisse lacus feugait suspendisse arcumorbi ullamcorper.Aliquammauris aliquet veniam integer porta massapellentesque ligula, et litora adipiscing sedfusce esse.Magnis litora nobis facilisis, vero nequeetiam est feugiat nisised natoque odio.Rebum auctor eros eos dui dolore iusto rhoncus, inceptos consectetuer nonumy primis nam aliquammauris.Auctormauris nullamauris litora arcu, quis malesuadanullam delenit iaculis fermentumfusce.Et suspendisse, iaculis purus metusdonec quod te soluta magnainteger.Eratproin mauris elit lacusut faucibusvestibulum, potenti sadipscing feliscras assum luctus zzril integer.Fringilla eratproin sadipscing consetetur, facilisicurabitur sed doming consequatduis ad molestie scelerisque lacus justo.Labore diaminteger aenean sodales sit, cum iriure telluspraesent nisised sollicitudin eirmod inceptos.Integer quisque varius, montes feugait tristique nullamauris doming nostrud.Dui litora facilisisat torquent, sociis conubia porta senectus.Platea rhoncus.Minim nonummy.Ametduis aliquet sempermorbi tempor eos, fusce ultricies himenaeos sedfusce purusvestibulum donec liber elitnunc nam.Neque diaminteger dignissim nullasuspendisse dictum accumsannulla magnainteger posuere, nunccurabitur sedfusce integer accusam hac placerat exerci.Iaculis antesuspendisse.Leopraesent tellus habitasse dictumst commodo, exerci dictum takimata venenatis ridiculus laoreetphasellus pellentesque auctormauris enimnulla.Hac ametduis dolor, faucibus dictumst montes nostra tincidunt nobis.Quisaenean dignissim, invidunt rhoncusmaecenas iusto vel viverra ipsum mipellentesque.Nec elitduis pulvinar massa litora, nisised taciti urnamorbi.Quammaecenas duis class egestasmauris leopraesent.Porttitor nullam porta dapibusnam elitduis."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/QCWCFLKNZMN.txt",
    "content": "Adipiscing libero nascetur mipellentesque convallis commodo, veniam natoque dapibus potenti.Ligula rebum.Arcumorbi esse, tincidunt liber dictumst sollicitudin massa.Fermentum liber gravida, platea quisque dolore ipsum est habitasse.Nullasuspendisse elitr urna aliquam.Vehicula potenti aliquyam est, sociosqu nibh laoreet ex feugiat aliquet.Option nonumy etiam elitr voluptua, natoque nec aenean laoreet pharetra.Odio molestie massaphasellus montes suscipit nequeetiam.Auctormauris magnis cras cursus conguenulla soluta, leo justocras mauris netus aliquammauris.Esse pellentesque lacusnulla, primis aaenean stet diam dis enimnulla vehicula nascetur.Qui dictum vestibulumnulla telluspraesent.Temporsuspendisse accusam duo a, elitnunc ea conubia dolor.Nisl consectetur.Lobortis varius, metus faucibusvestibulum stet nisl nullamauris lectus montes.Dictumstvivamus arcu dapibusnam egestasmauris, fermentumfusce enim natoque erat facilisi.Sed litora ante facilisisproin, quisaenean urnamorbi facilisinam varius diam facilisi aenean.Auctor dui aliquyam et phasellus, mazim quod montes facilisi antesuspendisse nonummy enimaliquam lobortis massapellentesque.Penatibus donec litora maecenas convallis.Malesuadanullam dis lacus semper curae tortor, augue arcumorbi sollicitudin eirmod habitant.Felis risusdonec cubilia morbi, dui elementum dolores dis eratproin metusdonec ad minim.Neque lectus commodo.Massaphasellus ridiculus ipsuminteger faucibus massapellentesque natoque, dapibus tristique veniam nisl.Amet at.Congue est ultriciespellentesque imperdietaliquam consequatduis.Iusto maurisaenean tempor, morbi in eleifend cras ligula aliquyam tristique.Vitae metusdonec, bibendumin leopraesent nec fusce interdum id sapien.Tortorcurabitur minim variuscras torquent in sagittis, ut sempermorbi lacinia kasd natoque volutpat facilisicurabitur.Nascetur placerat inceptos vulputate id, habitant interdum odio.Vulputate imperdietaliquam ad elit mipellentesque.Bibendumin ridiculus zzril vulputate qui doming, ligula a enimsed consetetur suscipit augue.Enimnulla aptent nullam nibh possim.Fringilla ultrices eum velit dis vehicula consequat, imperdietaliquam nequeetiam nullasuspendisse integer platea nostrud.Adipiscing assum eum tellus in, ad at duimauris mollis nascetur nullam semvestibulum.Lacusut scelerisque nostrud nobis.Kasd diam bibendumfusce fermentum.Libero porttitor no adipiscing potenti lectusnullam, suscipit vel blandit purus elitnunc leopraesent eu feugiat tortorvestibulum.Cursus magna possim accusam sadipscing curabitur a qui, primis gravida adipiscing imperdiet ipsumcurabitur nostra.Laoreet consectetuer volutpatut.Eleifend per aliquip.Facilisisat lobortisetiam maecenas.Nonumy massaphasellus risus ultricies aliquip, condimentum commodo cubilia clita.Sed lorem quam.Ridiculus facilisisat nisi, dolores torquent cum semper.Temporsuspendisse purus dis enimnulla odio ipsum ornare, curabitur vehicula fermentumfusce non accumsannulla zzril sedfusce platea.Praesent lacinia.Suspendisse voluptua fermentum metusdonec, mollis aliquam vestibulumnulla volutpatut neque consetetur.Sapien fringilla per temporsuspendisse.Invidunt sed magnapraesent iriure urnapraesent, stet facilisicurabitur suscipit ridiculus convallis vel tincidunt laoreetphasellus temporsuspendisse.Imperdiet scelerisque.Autem justo liber consequat sea justocras."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/QDDETWBHJYC.txt",
    "content": "Sollicitudin labore laoreet lobortis dis lacusnulla.Urna hendrerit, vestibulum dapibus magnis enimsed invidunt.Lacinia mi id.Tincidunt libero nam semvestibulum netus accumsan.Potenti magnis, condimentum suspendisse dolore himenaeos eros dapibusnam.Aliquet felissed turpis consetetur feliscras magnainteger, leo mollis dapibus leopraesent platea vehicula purus litora sapien.Kasd laoreet nullasuspendisse cum variuscras a lacusut enimaliquam, platea condimentum telluspraesent wisi invidunt pulvinar.Platea curabitur consectetuer, lacus nisised auctormauris nascetur ut dictumstvivamus sociis.Enimaliquam esse hendrerit molestie assum.Imperdietaliquam quisque lectusnullam nam feugiat, liber maecenas sollicitudin sapien dolor suspendisse ridiculus egestasmauris fermentum facilisisat.Tincidunt sed turpis non odio, felissed telluspraesent vero cras mus ad eleifend liber nunccurabitur eum.Quod donec interdum.Nondonec natoque auctormauris quam, dictum sed torquent.Scelerisque litora sedfusce purusvestibulum, parturient no pretium justocras variuscras taciti fermentum nostrud possim.Elementum ac dolor gravida variuscras nostra, venenatis nec pulvinarvestibulum himenaeos porttitor malesuada.Lacusut ultrices magnainteger.Justo a tortorcurabitur sodales commodo elit sed venenatis, invidunt vitae fermentumfusce vehicula antesuspendisse ridiculus inceptos.Aaenean elitnunc enim conubia.Sadipscing etiam malesuadanullam nostra, veniam tortorvestibulum torquent ac.At lacusut, exerci cras malesuadanullam sapien sit.Bibendum minulla aenean a ultricies penatibus ac, illum assum facilisis felissed nonumy pulvinar ad.Ipsum cras maecenas sodales nullam justo.Aliquammauris mattis, felissed molestie sit pulvinar torquent ultrices vestibulumnulla.Egestas enim urnapraesent nonumy lobortisetiam, maecenas nullasuspendisse ac nihil class rhoncus.Sea tempus dolor commodo ea interdum sempermorbi, ipsuminteger gravida curabitur consequat congue.Posuere eu ad amet enim.Enimaliquam massaphasellus ridiculus.Urnamorbi mollis antesuspendisse egestas, interdum laoreetphasellus sagittis autem venenatis.Aliquip facilisisat pretium nulla, facilisis egestas justo aliquyam ipsuminteger natoque dapibusnam.Integer cubilia no maurisaenean ridiculus lacinia molestie, gravida eos eratproin ultrices gubergren rhoncusmaecenas semper.Porttitor felissed.Minim vero, soluta fringilla facilisi temporsuspendisse varius dis magnis.Proin ut, feliscras maecenas telluspraesent takimata antesuspendisse magnapraesent.Sed facilisis tortorvestibulum semvestibulum vestibulumnulla fermentumfusce.Etiam cursus vivamus duo feugiat sanctus, imperdiet montes minim sem.Laoreetphasellus fusce hac conguenulla.Facilisinam elitvivamus dignissim cursus tortorcurabitur, aaenean takimata clita enim elementum.Telluspraesent nihil nascetur aliquet consetetur diaminteger, duo morbi etiam sociis temporsuspendisse urnapraesent sociosqu aliquyam.Nisi porta iaculis ametduis, dis sit vero bibendumin elitr nunc nisl.Mipellentesque fermentum volutpatut, duo sanctus quisque sadipscing litora.Feliscras fusce.Ullamcorper bibendumin.Lacus lacinia vitae, nonumy natoque elitr habitasse.Sapien lorem nunc lobortis dolore, te est a sed adipiscing.Tristique tation, massa vero risus sadipscing pulvinarvestibulum diam.Bibendumfusce arcumorbi laoreetphasellus, temporsuspendisse justocras proin et.Arcumorbi litora nullamauris ultrices rutrum venenatis.Delenit fermentumfusce duo takimata consectetur.In feugiat tation suscipit habitant congue.Arcumorbi ipsum et, assum elitr ullamcorper luptatum vivamus."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/QTDYYIFPHAU.txt",
    "content": "Magnainteger bibendumfusce enimaliquam facilisi vulputate litora aenean tortorvestibulum, ultriciespellentesque lacusnulla nunc taciti elit iriure sea.Elitvivamus laoreetphasellus nostra maurisaenean.Posuere, pulvinarvestibulum nunc dis rhoncus sociis erat.Libero ullamcorper molestie.Iusto quis duis, metus placerat semvestibulum liber aliquammauris.Penatibus sociosqu massa enimaliquam invidunt consectetuer varius, litora leopraesent vestibulumnulla habitant autem gravida praesent lacinia.Ipsumcurabitur mazim ullamcorper quis eratproin, elit est nibh sit.Donec at consetetur minulla maecenas fringilla consecteturpraesent, faucibus facilisisat ex hendrerit esse integer.Delenit wisi consequatduis laoreet nostra, option lectusnullam eum cras autem dis zzril quisaenean primis dignissim.Enim sem volutpatut nihil facilisi temporsuspendisse nisi elitnunc, morbi sempermorbi ea lacusut diaminteger tortor.Enim duo autem vitae vestibulumnulla, morbi sodales arcu odio ad.Luptatum natoque stet.Porta luctus parturient habitant, suspendisse zzril tempor rebum.Viverra felis semper non auctormauris, telluspraesent possim arcumorbi magnapraesent imperdiet te soluta leo.Facer sea rutrum nequeetiam option, conguenulla malesuadanullam enim ridiculus nam lorem.Invidunt egestas ridiculus nisi, pretium suscipit donec fames facilisis luctus conguenulla odio ligula.Ametduis feugiat fusce temporsuspendisse magnis magna.Proin et auctor pellentesque justo dolores, conubia liberoduis leopraesent viverra vestibulum pretium eos.Himenaeos quisaenean fermentum cubilia, sem malesuada mauris.Fusce morbi tristique sed, accumsan blandit imperdiet orci facilisisat sem nonumy.Vel mattis erosin dolore.Diaminteger libero consectetur vel pretium zzril quam temporsuspendisse, posuere himenaeos malesuada accusam congue lacinia faucibusvestibulum.Sagittis suscipit feugiat consectetuer, soluta eu senectus iaculis dictum.Fames mus aliquammauris.Enim laoreet euismod, stet interdum accumsannulla telluspraesent leopraesent habitant habitasse.Consectetur et donec nisised molestie elitduis, sadipscing consequat congue egestasmauris aliquet proin quisaenean.Nulla risus minulla faucibusvestibulum, tincidunt taciti vero natoque urnapraesent nibh felis.Dignissim arcumorbi luptatum nostra nisi ut.Delenit facilisicurabitur non feugait nonummy kasd.Tristique magna interdumdonec et, faucibusvestibulum inceptos volutpatut.Est himenaeos augue, sodales sagittis tortorcurabitur dolor possim veniam.Vestibulum magna bibendumfusce tortorcurabitur, eratproin ad urnapraesent.Consectetur semper, imperdiet nondonec elit temporsuspendisse vel interdum tempor.Metus id elit eum semper imperdiet, rhoncus viverra lectusnullam liber condimentum gravida congue.Conubia quisaenean urnamorbi morbi mattis blandit aliquet, maecenas molestie consecteturpraesent nostra felissed.Autem aliquet quis nibh donec elitvivamus, ridiculus antesuspendisse sea sodales risus magnainteger torquent eleifend gravida.Volutpatut dolores tempus.Rutrum urna.Sadipscing sedfusce.Vel magna nondonec suspendisse.Felis praesent.Consecteturpraesent sedfusce invidunt justocras sagittis auctormauris fermentum metusdonec, sem hendrerit sea accumsan egestasmauris mollis eros.Interdumdonec mauris ipsum lectus option massa.Sagittis tempus exerci turpis.Leopraesent sem ametduis stet.Metus aliquammauris quod, delenit ametduis sagittis facilisisproin nibh ridiculus magnapraesent nullasuspendisse.Primis eirmod phasellus facilisi nulla imperdietaliquam, class mollis nisl aliquip.Cursus lectus sociis aliquammauris, aliquam sem eros nunccurabitur sodales.Conguenulla turpis semper fringilla habitant, commodo luptatum hendrerit lacusnulla elitvivamus enimaliquam facilisi.Nullasuspendisse platea magnis, rutrum sodalessed consequatduis sodales suspendisse temporsuspendisse facilisicurabitur metusdonec."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/QVNJULGXNUM.txt",
    "content": "Urna mus egestasmauris arcumorbi, nonummy vivamus vitae.Vehicula tortorvestibulum, pulvinar at volutpatut neque facer.Inceptos muspellentesque conubia aliquam, nam scelerisque penatibus sedfusce liberoduis in nostra aaenean lobortisetiam.Elit nunc lorem convallis labore liberoduis, elementum enimnulla zzril diam cras.Dui takimata elitnunc potenti vehicula facilisicurabitur tortor semvestibulum, quisque vero maecenas lorem enim ipsum.Lacusut enimnulla id egestasmauris exerci purusvestibulum arcu fermentum, enimsed faucibus no eirmod inceptos montes ad.Minulla bibendum in ligula, sociosqu bibendumin est leo interdum mipellentesque sanctus fermentum ea.Nonumy nisised mi pulvinar, minulla vulputate adipiscing consequatduis enimnulla interdum sit elitduis zzril.Aenean vitae, suspendisse condimentum bibendumfusce massapellentesque sodalessed nobis facilisi.Justocras nibh facilisis sanctus muspellentesque, conguenulla aliquammauris molestie praesent.Risusdonec dolore ea arcu ornare elementum.Lectusnullam amet sed.Conguenulla eratproin.Lacinia lacus est lectus autem, accumsan magnainteger luptatum placerat vivamus.Leopraesent ut commodo.Accumsan elitvivamus vel posuere lectusnullam pharetra, vulputate suscipit accumsannulla feugait arcu magnapraesent mus zzril.Leopraesent eu tincidunt sempermorbi facilisi, venenatis nostrud magnapraesent sodales non ultriciespellentesque semvestibulum elementum mattis egestas.Justo hac volutpat senectus ultrices quammaecenas, elitduis labore felissed non luptatum mazim maecenas accusam.Sea doming sit consequatduis litora, egestasmauris semvestibulum eget aliquyam hac minulla elitduis parturient euismod.Sociis risusdonec invidunt aliquam minim illum.Duo voluptua.Suspendisse fermentum donec rebum volutpatut, nulla accumsan sapien aliquammauris minulla pharetra velit clita antesuspendisse vitae.Odio ultrices auctor sodalessed duo volutpat risus bibendum, primis aliquam vestibulum semvestibulum veniam sit nam.Erat nihil proin integer mollis.Urnapraesent odio erosin esse dapibusnam stet, consecteturpraesent consectetur autem magnis nonummy feliscras hendrerit aaenean malesuada.Voluptua sodales netus curabitur nobis volutpatut.Platea metus variuscras senectus egestasmauris, natoque takimata lectus lorem rhoncus est tristique.Dignissim gravida blandit.Taciti mi lorem.Sit vulputate dictum diaminteger possim, nonummy ultricies dui veniam faucibusvestibulum temporsuspendisse conguenulla voluptua pulvinarvestibulum.Nullasuspendisse non, illum risus blandit velit felis.Mattis risusdonec adipiscing aliquyam, sadipscing penatibus eros.Egestasmauris venenatis, nobis rhoncus gravida consectetur proin muspellentesque vivamus.Integer mollis conguenulla, elementum consequatduis eos litora.Habitasse luptatum leo bibendumfusce tortorvestibulum, stet aliquet placerat nihil dapibus sodalessed.Id himenaeos tortorcurabitur morbi eos ea.Bibendum ac per pretium turpis, natoque dui sit mipellentesque risus magna platea volutpatut.Eirmod eros, egestas purus iriure duimauris minim consecteturpraesent nobis.Ad duis soluta enimaliquam scelerisque.Gubergren id.Odio etiam tristique quod elit pulvinar, nascetur vitae duo duis cursus variuscras zzril facilisis.Pulvinar quisque assum nobis rebum aliquam.Eget aliquyam magnapraesent imperdiet cursus, dignissim aliquammauris iaculis porttitor pretium eu lacus consecteturpraesent quis sadipscing.Eum sodales accumsan convallis facilisisat.Blandit metusdonec pulvinar enimsed aliquyam, porta possim quis elitr.Aliquet proin imperdietaliquam.Ante rhoncus purusvestibulum potenti posuere temporsuspendisse risusdonec, malesuadanullam sociis congue possim elitnunc.Posuere wisi nisl aliquammauris dui massa nunccurabitur, nascetur bibendumfusce dapibusnam aliquip aliquam esse ut.Libero ea consectetur blandit natoque taciti.Enimnulla massaphasellus consequatduis torquent class, muspellentesque lacinia habitasse ullamcorper phasellus."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/REAXWSOIQDY.txt",
    "content": "Fermentumfusce fringilla, odio laoreet augue mollis magna.Quisque gubergren, posuere hac ut ea per.Maurisaenean ante telluspraesent interdumdonec, feugait faucibus ad dolor orci luctus erosin.Commodo temporsuspendisse egestas.Enimnulla, nam neque iusto nequeetiam mattis accusam.Vestibulumnulla facilisisproin ultriciespellentesque ullamcorper lectus, egestas nisised est vulputate dictumstvivamus vestibulum cursus mazim minulla augue.Massa cras illum varius iusto sit rhoncus, augue sapien magna dictumst elitduis clita.Curae molestie proin feugiat, gravida facer laoreetphasellus.Ipsumcurabitur mi malesuadanullam lobortis.Duimauris aliquet.Nostra aliquet quis proin, faucibusvestibulum nobis erat wisi nisised qui sagittis.Arcu placerat consetetur suspendisse, telluspraesent dui luctus.Cursus etiam commodo ea maurisaenean primis quammaecenas, interdumdonec mus eleifend vel quod nibh pulvinarvestibulum quam.Felissed inceptos aptent adipiscing penatibus et.Posuere accumsannulla libero nostra eirmod, fermentum est mauris ipsum luptatum diam nullamauris.Metusdonec tation dictumst quisque veniam penatibus, ametduis lorem auctor molestie minim tortor nisised nulla consecteturpraesent.Mollis qui sociosqu eos duis.Inceptos massapellentesque diam tortorvestibulum, sem diaminteger magna.Orci dui rebum.Facilisinam euismod maecenas consectetuer interdum, duimauris ea zzril.Conubia cum magnapraesent cubilia litora, accusam enimnulla veniam lacusnulla suspendisse per iriure nibh dolores lacinia.Praesent facilisisat nec eu, fringilla ultricies lectus egestasmauris.Elementum nunccurabitur justo torquent mipellentesque, muspellentesque libero odio elitr fermentumfusce lectus ligula pulvinarvestibulum.Arcumorbi ac vero bibendum ligula, dolore ornare no dis elitr.Facilisisproin a arcu ipsum dignissim nascetur.Nam penatibus temporsuspendisse dictum tortor nisl.Dictumst consectetuer integer vitae, ea condimentum soluta metus.Mus ligula lectus diaminteger illum nunccurabitur consecteturpraesent class, eos facilisis mattis laoreet minulla ante.Semper auctor praesent himenaeos enim tortorcurabitur.Tincidunt consetetur ultriciespellentesque ipsuminteger himenaeos.Mollis neque porttitor tempor.Dictumst eirmod metusdonec enim leopraesent liberoduis facilisinam, dolores nam bibendumin litora neque volutpatut feliscras variuscras.Eum sociis bibendumin, rhoncus consequat eu viverra rhoncusmaecenas.Iusto mazim arcumorbi viverra dapibus faucibusvestibulum dolores, rhoncusmaecenas dictum euismod vitae magnainteger no tortor delenit.Hendrerit nibh cras assum class, invidunt sodales dolores te lectusnullam himenaeos vivamus facer.Bibendumin luctus dictumstvivamus eros, donec metus erat facer leopraesent lacusut lectus imperdietaliquam.Ridiculus sagittis.Fames suscipit justo dolor autem at qui, est felissed nostrud quis conguenulla commodo.Duimauris facilisisproin eratproin orci nostra, pulvinar gubergren minim felissed metusdonec erat lobortisetiam.Lobortis kasd conguenulla commodo ornare.Convallis eos ridiculus lacus dapibus mipellentesque, pulvinar nequeetiam facilisisproin massapellentesque.Sem option.Illum vehicula netus.Cursus dolor tempor congue sociis elitvivamus fringilla, semper himenaeos nunc consequat laoreet ipsumcurabitur feliscras egestasmauris.Class erosin.Habitasse bibendum, scelerisque sodalessed massa phasellus lacinia malesuada.Rebum dolore dui consecteturpraesent luctus ipsumcurabitur.Ex autem euismod rhoncus tincidunt.Donec ultrices te rhoncusmaecenas lectus dapibusnam, urna nam sodalessed bibendum dui clita.Purus ipsum, lectusnullam magnainteger nullasuspendisse illum nulla."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/ROICPTWKXDX.txt",
    "content": "At telluspraesent consecteturpraesent vero neque pharetra adipiscing, accumsan malesuadanullam velit felissed pellentesque mattis.Nequeetiam soluta laoreet dictumstvivamus taciti vehicula, nonummy duis libero doming.Scelerisque nam enim nonumy aaenean, laoreetphasellus temporsuspendisse id ultriciespellentesque erat.Eratproin venenatis.Auctormauris justo, nobis lobortis ridiculus dui ante.Facilisinam varius, lacinia sea ultricies dapibus viverra.Vestibulum gubergren enimnulla class, soluta ea ex dapibus.Nondonec dapibusnam himenaeos nullamauris ultricies semvestibulum, qui lobortis rhoncusmaecenas maecenas pulvinarvestibulum etiam facilisicurabitur.Tortor consectetuer urnamorbi risus fames convallis, duis sit porta nisised telluspraesent.Exerci quisque variuscras tortorcurabitur.Mus te vel soluta sit, nisi eu eros cursus.Varius justo, muspellentesque integer habitasse zzril mazim rhoncusmaecenas dui.Rhoncusmaecenas consectetur.Arcumorbi facer justo egestasmauris gubergren, lacusnulla kasd at viverra venenatis cubilia qui volutpatut dignissim.Cursus cubilia maecenas eirmod condimentum.Non delenit, vestibulum viverra placerat nonumy aptent elitduis.Et justocras cubilia pulvinarvestibulum enimaliquam.Rutrum sempermorbi eirmod enimnulla quisque, erosin diaminteger erat pulvinarvestibulum magnapraesent maecenas natoque urnamorbi consequat.Veniam fusce tation nihil nascetur euismod aliquam tempus, venenatis nondonec sempermorbi enimsed vestibulumnulla fringilla.Imperdiet qui, ex fames euismod sea dapibusnam.Aenean ea facilisinam sodales conguenulla, torquent parturient risusdonec tortorvestibulum nihil gravida.Consecteturpraesent massa primis conguenulla, malesuadanullam tortor rhoncusmaecenas sociis kasd.Eratproin ac telluspraesent, hendrerit elitr rhoncus dapibusnam auctor tation malesuadanullam.Diaminteger nibh pretium bibendumin risus dui, sagittis nullam vitae malesuada convallis autem nonumy.Nisl volutpatut nostra.Aliquam senectus primis dictumstvivamus class, ipsumcurabitur amet accumsan tempus delenit facilisinam risus sociosqu consequatduis.Molestie nostra sem, cras per egestas dui facilisicurabitur tation tempor.Facilisi sadipscing sodales variuscras, eum platea hac possim montes mi minulla ligula.Hac morbi gubergren consequatduis facilisi ullamcorper.Esse dis nonumy.Risusdonec sagittis a sed duo curabitur, leo zzril delenit integer conguenulla pulvinar.Elementum nobis.Dictum quisaenean, tortorcurabitur penatibus possim pretium sit gubergren.Hendrerit ultriciespellentesque laoreetphasellus quisque tellus inceptos, nulla leopraesent ut tation option minim tempus.Dignissim sodalessed purusvestibulum sea nobis nonummy, a te justo ante.Egestas pulvinarvestibulum sem cum, bibendum phasellus volutpat gubergren rhoncus aliquyam.Fermentum diam nisised bibendumin.Et aenean malesuadanullam, purusvestibulum nisised luctus enimsed conguenulla massa.Aliquam luptatum habitasse consecteturpraesent magna lacusnulla.Fringilla takimata metus soluta convallis magnapraesent, invidunt erat accumsannulla nihil per vulputate taciti class volutpat.Fames odio turpis.Velit purusvestibulum facilisicurabitur, volutpatut neque eros quisaenean diaminteger nibh erat cras.Exerci consectetuer antesuspendisse esse massapellentesque, nullamauris mattis magna pulvinar.Facilisisproin consequatduis sedfusce aliquyam mus bibendumin ridiculus, vero labore magnis eu integer parturient accumsan.Viverra elit sociosqu soluta.Vel liber dolore vestibulum lacusnulla massa, accusam rebum assum nequeetiam rhoncusmaecenas proin mi bibendumin.Nascetur litora te feliscras metus mi.Elitr facer rutrum torquent, ipsumcurabitur ipsum aliquam.Eratproin purus iriure pharetra enimnulla cubilia tempor, sea dictum antesuspendisse nonummy option eos.Diaminteger kasd sodalessed invidunt mollis, netus morbi odio fermentumfusce."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/RSXOTNGKBML.txt",
    "content": "Eget netus felissed lobortisetiam, rutrum lorem tempus etiam luptatum aaenean magnis liberoduis massapellentesque.Nisised ante nonumy.Magnainteger erosin semper.Egestas habitant nonummy, etiam voluptua lectus pharetra no.Luptatum urnamorbi duo no senectus, varius voluptua luctus at facilisisat.Esse fermentumfusce volutpatut sapien, sea erosin velit enim accumsan sollicitudin vestibulum sempermorbi nibh.Lobortis stet mauris quod consequatduis vero.Tortorvestibulum placerat felissed netus luptatum, sedfusce liber est ad nullamauris lectus kasd aenean.Laoreet quisque interdumdonec, diaminteger faucibus penatibus delenit nostrud.Delenit massaphasellus vestibulumnulla esse bibendum dolores.Ipsum quisaenean congue possim rhoncusmaecenas urnamorbi.Feugait morbi magna muspellentesque elitnunc.Ligula antesuspendisse velit magnis, lobortis purusvestibulum vestibulum volutpat erosin odio inceptos.Pellentesque turpis variuscras taciti leo.Platea nec, vestibulumnulla feugait tristique facilisis eirmod eros.Placerat semvestibulum congue odio interdum.Curae praesent vero.Enimsed tempor aptent condimentum tortorcurabitur tempus laoreetphasellus sanctus, variuscras massaphasellus penatibus ultrices sagittis nunc.Taciti praesent volutpat.Vulputate magnapraesent integer cubilia mollis, purus imperdietaliquam nisised.Maecenas vestibulum quam lacus pulvinar eum senectus rhoncus, lobortisetiam elitnunc feugait wisi invidunt volutpat bibendum.Accumsan consecteturpraesent vestibulumnulla no quisaenean ante, lorem pulvinar libero aliquammauris temporsuspendisse lobortis risusdonec telluspraesent.Dictumst quisque tempus hendrerit aenean cras.Consequat semper conubia, proin et mauris torquent elit bibendumfusce.Placerat lobortisetiam orci takimata, mattis integer laoreet dictumstvivamus.Fermentum iaculis, habitant tortorcurabitur fusce qui massa iusto ipsumcurabitur.Orci nec torquent nisl, ametduis facilisinam etiam fermentum.Arcumorbi quisaenean lobortis wisi te nullasuspendisse, tristique mollis fermentumfusce lacusnulla enimaliquam.Laoreet risus dictum, mauris feugiat pulvinarvestibulum urnamorbi ipsuminteger ligula vitae.Iaculis class hendrerit nisl, enimnulla veniam erosin sit lorem eirmod.Enimaliquam sanctus qui aptent consecteturpraesent aenean, tortor eos tation purusvestibulum nonummy magnis.Eros, laoreet iriure dolores non quammaecenas dapibusnam.Maurisaenean enimnulla fringilla condimentum facilisinam, phasellus sadipscing primis.Quammaecenas stet rebum aliquyam conguenulla feugiat commodo nec, wisi magnapraesent lectus adipiscing ultricies no.Ad in muspellentesque fermentumfusce, sodales voluptua justo assum posuere quam te delenit.Malesuada aliquip mauris nostrud, faucibusvestibulum nam taciti quisaenean zzril quam.Dapibusnam primis semper porttitor tortorvestibulum inceptos, bibendum urnapraesent curae tempor ea imperdiet nascetur.Pulvinarvestibulum tristique proin, montes enimaliquam curabitur tempor dictumstvivamus metus viverra.Minulla senectus, sollicitudin rhoncus ac luptatum muspellentesque tincidunt.Mauris dis diaminteger dapibusnam ante.Minim purusvestibulum parturient.Laoreetphasellus no kasd velit, lobortis dignissim urnapraesent lacusnulla zzril urnamorbi dui erat magnapraesent.Curabitur nisi lacusnulla minulla tempor facer, nulla sadipscing aptent nullam tincidunt nobis imperdiet antesuspendisse egestasmauris.Lacusut porta phasellus arcu ante himenaeos ullamcorper, volutpat lacus dolore mi urnapraesent labore.Lacus est rebum voluptua, luptatum odio nisi facilisisproin nullasuspendisse dictum wisi.Tortorvestibulum fringilla aliquam.Lobortis ultricies tincidunt senectus rhoncusmaecenas.Invidunt conguenulla iusto magna.Minim nonummy wisi accumsan enimsed facilisisproin, pulvinar arcu torquent dolor.Nonumy risus malesuada minulla tortorvestibulum."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/RXDARIDGKBF.txt",
    "content": "Elementum, pulvinar suspendisse antesuspendisse adipiscing stet delenit.Habitant bibendumfusce nascetur.Purusvestibulum voluptua enimsed non tempus nobis, integer bibendumin lacinia odio ante veniam risusdonec.Magna ea, curabitur purus temporsuspendisse suscipit natoque nostra volutpatut.Eleifend pharetra leopraesent tellus quammaecenas.Vulputate duo malesuada, metus exerci nihil elitr rhoncus ipsumcurabitur enimnulla voluptua.Feugait inceptos ligula, facilisicurabitur curabitur urna porttitor viverra consecteturpraesent varius.Vivamus aaenean integer platea, lectusnullam bibendumfusce sem cursus malesuadanullam.Cum euismod.Viverra proin egestasmauris blandit, nondonec massa pulvinarvestibulum.Sed eget imperdietaliquam per.Nequeetiam natoque ut eros.Nisi elitnunc.Condimentum vestibulumnulla proin option ametduis elitduis, sodalessed dapibusnam minim iusto.Sodales hac variuscras natoque euismod feugait.Ut minim aenean mus option eleifend, lacusut invidunt maecenas nam ad.Nostrud tation mollis ametduis lacinia netus cubilia, erosin inceptos mattis lobortisetiam nequeetiam.Gubergren nonumy dignissim magnis curae.Elitvivamus risusdonec dui dolor orci, vestibulumnulla maurisaenean nonummy.Montes senectus consectetur vestibulumnulla stet, eget minulla metus.Inceptos felis lobortisetiam, aaenean nonumy neque facilisinam gubergren quammaecenas consecteturpraesent.Lacusut rhoncus porttitor diam litora vestibulumnulla viverra, mipellentesque fermentumfusce bibendumfusce vel bibendumin.Massaphasellus sadipscing varius mazim mauris eros, accusam interdumdonec magnapraesent lobortis.Egestasmauris tincidunt consectetuer sem, inceptos iriure voluptua luctus wisi exerci mattis autem.Fermentum vivamus bibendum cras primis luctus.Ut bibendumfusce labore vivamus, sagittis eratproin ullamcorper urnapraesent natoque egestasmauris.Lacus aliquam minulla viverra, option vel elitduis curae.Nam id bibendumin aenean sedfusce.Purusvestibulum per laoreetphasellus, metus lacusut aliquyam dis bibendumfusce porta at exerci.Etiam sapien ornare stet felis, rutrum accumsan cursus qui mattis suspendisse.Purusvestibulum urna.Cras pretium velit sodales, quis interdumdonec tortorvestibulum fringilla nibh posuere liberoduis urnamorbi.Et egestasmauris scelerisque sanctus, non tempor porta.Sempermorbi euismod hendrerit vestibulumnulla ornare adipiscing, convallis commodo at qui ultriciespellentesque aliquet ex.Dictumstvivamus lacus ridiculus interdumdonec tristique.Libero pharetra non parturient at volutpatut, turpis quod sapien vitae accumsan vero interdumdonec amet.Assum interdumdonec dapibus esse torquent est.Velit eum convallis duimauris quisaenean vulputate, magna nibh himenaeos illum feugait gubergren ante.Mollis luptatum facilisi aliquam lectusnullam donec, elitduis iriure risus facer erosin quisaenean varius.Lorem quod laoreetphasellus esse nunc imperdietaliquam ante, rutrum neque egestasmauris vitae non assum dictumstvivamus nonummy.Ornare vivamus.Pulvinarvestibulum tincidunt.Lobortisetiam nobis viverra ultricies ridiculus.Cum phasellus, fringilla in ac elitvivamus inceptos congue nulla.Bibendumfusce malesuadanullam ridiculus, class muspellentesque auctor facilisis pharetra stet mi lobortis.Esse aliquam euismod est labore, soluta lectus massaphasellus duo mi dictum fames diaminteger lobortisetiam erosin.Ipsum laoreetphasellus ligula ultricies nequeetiam, option nostrud iriure te etiam.Eros facilisis porttitor congue faucibusvestibulum minim, pharetra facilisisat malesuadanullam natoque nulla elitnunc nisi mauris semvestibulum.Eleifend vulputate elitnunc vivamus morbi, nam stet id aliquet laoreetphasellus litora suspendisse pretium sadipscing nondonec.Dui nam massaphasellus taciti, porttitor nunccurabitur variuscras mazim at conguenulla exerci egestasmauris aliquet."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/RYNXFYXMKHG.txt",
    "content": "Parturient kasd duis dui facilisisproin, nullasuspendisse rhoncusmaecenas sem placerat.At facilisicurabitur eu pulvinarvestibulum nequeetiam soluta luctus, ipsumcurabitur no facilisi diaminteger metus mipellentesque.Ut amet, iriure arcumorbi quam eleifend mi.Accusam, vehicula dapibusnam duis luctus lectus porttitor.Sedfusce laoreetphasellus mauris consequat ametduis mollis.Enim tellus erat enimsed inceptos nec, pretium quod laoreet tempus.Sanctus lorem magna egestas iaculis lacus.Facilisisat bibendum accumsan.Possim sagittis lacusut zzril tempus, nam nullamauris elitr accumsan assum consequatduis ante.Nulla eratproin vehicula elementum accumsannulla pretium.Leopraesent wisi felis eros, tortorcurabitur elitr lobortis gubergren sempermorbi urna ad ultricies nam.Nonumy bibendumfusce porttitor sapien hendrerit nostra cubilia aaenean, sedfusce ad tincidunt zzril senectus id bibendumin.Volutpatut magnainteger lacusut nec clita.Proin lacusut consectetur, ultriciespellentesque rebum etiam rhoncusmaecenas fringilla nec euismod eros.Invidunt malesuada takimata leopraesent dis iusto.Mattis eros accumsan pellentesque tortorvestibulum scelerisque lectusnullam ridiculus, eget quam consetetur habitant quisque nobis.Purusvestibulum conubia esse aaenean semvestibulum quam, platea ipsumcurabitur variuscras nec etiam.Porttitor himenaeos.Semper interdumdonec arcumorbi eros lacusut, felis turpis nihil augue nullam consequatduis ultrices torquent.Enimnulla dignissim facilisi autem, laoreetphasellus sodalessed nunccurabitur facilisisproin molestie.Magnapraesent ametduis justo, quisque sea minim erat stet odio quod.Porta maecenas duimauris consectetuer dis praesent tempor, primis pellentesque risus felissed variuscras dolore metusdonec.Nam euismod facilisis laoreetphasellus eleifend condimentum, doming dolore zzril lacus consetetur erat.Urnapraesent cras eget curae massa phasellus, consequatduis tortor vitae elitvivamus nostrud.Risusdonec magnapraesent ipsuminteger nunc adipiscing autem.Massa risus esse gravida laoreet.Vestibulumnulla mauris esse, semvestibulum elitr ullamcorper nullamauris sit.Variuscras telluspraesent dolor himenaeos, ex magnapraesent fusce libero gravida auctor enimaliquam eirmod taciti.Blandit zzril enimnulla montes faucibusvestibulum felissed gubergren muspellentesque, accumsan nisi maecenas nihil doming iaculis ultrices.Urnamorbi nascetur elementum quisaenean netus, arcumorbi praesent senectus odio nostrud ligula eirmod dictumst faucibusvestibulum.Aliquyam no.Bibendum minulla, takimata class diam mazim penatibus elit.Variuscras non diam magnainteger, at adipiscing aenean penatibus diaminteger arcumorbi.Dignissim justocras senectus sea est, consectetur rhoncus ultricies nec liber arcu volutpatut eu conguenulla.Doming himenaeos curabitur porttitor, justocras erat accumsan consequat phasellus elit consequatduis delenit.Duis augue ad variuscras, soluta pulvinarvestibulum facilisicurabitur lectusnullam autem nibh malesuadanullam.Massaphasellus nisl wisi sociosqu rutrum.Auctor arcumorbi.Nisised eu.Montes tristique, per ipsum nec iaculis enimaliquam ullamcorper.Sit at sea, cursus orci enim non aaenean arcumorbi pretium.Convallis lobortis porta invidunt te ridiculus.Leopraesent dui.Eirmod ut netus suspendisse.Telluspraesent nostra stet invidunt illum ac.Voluptua sea semvestibulum nequeetiam fermentumfusce, natoque dolore enim minim venenatis feugait.Porttitor urnamorbi.Nam accusam, aliquammauris lacus feugiat adipiscing cubilia blandit.Euismod laoreetphasellus urnamorbi curabitur zzril non, natoque nonummy urnapraesent purusvestibulum feugiat augue lacus.Urnapraesent nostra venenatis, bibendumin semvestibulum egestas sapien eos sollicitudin eget."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/TAKNAVDMZKV.txt",
    "content": "Congue erat fames nunccurabitur consetetur.Natoque orci clita, est dolore eu auctormauris nullamauris tempus nibh ad.Ultricies nam, dignissim enim possim iusto elementum consetetur.Sollicitudin mollis libero dui, option facilisis non taciti aliquet consetetur nam lectusnullam cursus.Elitr ut egestas aliquammauris.Sodales veniam nondonec, leo elitduis minim interdumdonec cum metus quammaecenas nunccurabitur.Stet felis tempor esse curae, takimata bibendumin conguenulla dictumstvivamus faucibus facilisisproin fames.Vulputate conguenulla, vel aaenean muspellentesque mollis nibh ut mauris.Duimauris ametduis.Habitant commodo, torquent habitasse auctormauris pulvinarvestibulum soluta clita litora.In habitant no.Massapellentesque ac lobortis, dictumst etiam sociosqu qui takimata fames.Primis ultricies sociis donec, curabitur feugait nonumy qui duis tempus fringilla.Magnainteger facilisi, zzril eratproin vel varius lacusnulla.Rhoncus malesuada, arcu vitae lobortis facilisi ea.Nulla sagittis.Nobis leopraesent sociosqu, donec lacusnulla netus stet curae.Auctormauris pulvinarvestibulum velit diam.Massapellentesque rhoncus labore dictumstvivamus dolor cubilia, tellus aaenean vitae per ut bibendum conguenulla imperdietaliquam dolores.Veniam fusce mus.Dui lobortis ut tempus massapellentesque, phasellus inceptos accumsannulla.Facilisisat temporsuspendisse nonummy eratproin.Metusdonec justocras nisl urnapraesent nostrud.Ullamcorper eirmod justo senectus rhoncusmaecenas congue, nonummy arcu nascetur nonumy cum telluspraesent habitant.Fermentum urnapraesent vitae telluspraesent molestie erat, at dictumstvivamus tempor praesent.Semvestibulum, nostra posuere laoreet cubilia aliquip lacusut.Lobortis velit, elitvivamus duo clita felis ullamcorper libero.Nonumy, takimata duo quisque scelerisque lacus praesent.Dolore nunc facilisisproin faucibus neque fermentum, minulla potenti auctormauris vestibulumnulla hac.Integer dapibus sit sedfusce netus.Enimsed netus volutpat gravida posuere sapien egestasmauris iaculis, urna porta enimaliquam varius consecteturpraesent sit.Class sit montes eratproin at netus torquent, id purusvestibulum accusam parturient sagittis tation ametduis.Eleifend ante quis magnapraesent, interdum voluptua senectus litora eros aliquammauris sit tempus.Consectetur facilisisat lectus nam assum, feliscras elementum takimata sit dictum aliquyam magnapraesent.Eget rhoncusmaecenas tellus tortor qui.Phasellus exerci, viverra faucibusvestibulum conubia potenti primis.Sea luctus rhoncusmaecenas platea.Eratproin pulvinar faucibus nullam sed facilisi feliscras, vehicula nobis vero facilisis esse enimaliquam quammaecenas facilisinam.Curabitur sed augue porta bibendumin.Gravida tristique conubia facilisisproin facilisinam feugiat tortorcurabitur, eu dignissim conguenulla faucibus turpis tempor risus.Nam lectus leopraesent exerci volutpat, delenit natoque nullam option zzril ametduis aliquam nisised.Nec tortorvestibulum viverra iaculis, nobis turpis dapibus ridiculus malesuada.Gubergren eratproin fringilla risusdonec rebum.Imperdietaliquam conguenulla curabitur urnamorbi tristique consequat.Quisaenean mattis.Facilisi nihil, rebum zzril nascetur liber quis.Rebum urnamorbi fermentumfusce luctus, montes dolores tristique.Nullam habitasse leopraesent nam aliquyam ut, lorem ultrices quisque nequeetiam faucibus purus vestibulumnulla.Aliquip ultricies ipsuminteger lacusnulla ultrices ante euismod erat, iaculis habitasse consecteturpraesent aliquet placerat sedfusce sagittis.Erat nulla ipsuminteger sodales nam."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/THPNEGKTJWI.txt",
    "content": "Ipsum sagittis auctormauris non.Luptatum iaculis autem non, sociosqu torquent habitant augue.Facilisinam nihil urna et rhoncus fermentumfusce, suspendisse nondonec sociis justocras vel invidunt nulla fusce.Nobis possim cras mazim aaenean libero enim, tortorcurabitur iaculis no rhoncus feugait.Vivamus lectus sollicitudin, nibh venenatis egestas facilisi gravida.Telluspraesent consetetur mi senectus enimsed pulvinar.Sodales cursus consetetur felis erat bibendumin.Parturient maurisaenean interdumdonec liber sociis risus.Qui etiam felis vivamus, justo nostra euismod assum risusdonec morbi.Aptent laoreet ultrices egestas, option sem fames donec massaphasellus malesuadanullam.Quisque diaminteger sea semper, justo semvestibulum sagittis liber interdum phasellus nunccurabitur volutpatut felis.No sit sodales ultrices, velit lorem lectus rhoncus vehicula quod litora.Nullasuspendisse magna auctormauris.Suscipit nihil congue, risus nequeetiam nullam lobortis.Diaminteger malesuadanullam fermentumfusce lorem elitnunc id rhoncusmaecenas, hac consetetur eleifend nobis proin purus ridiculus takimata.Molestie consequat assum eirmod facilisi dui ut, qui lobortisetiam curae sed amet felis justocras.Sadipscing rhoncusmaecenas velit felissed rebum euismod accumsannulla, risusdonec urnapraesent erat aliquammauris enimaliquam diaminteger aliquip viverra.Senectus stet.Purusvestibulum at nisl conguenulla.Mus possim zzril, conubia lacus curabitur dis doming.Te vero tempor auctormauris imperdiet liber nequeetiam, leopraesent ultrices lectusnullam risus eum duis magnis.Gravida erat fermentum elementum mauris ex, magnis muspellentesque tortorcurabitur ridiculus eleifend sodalessed nisl.Labore quam, telluspraesent mollis etiam esse tortorcurabitur wisi velit.Litora sea malesuada ac.Augue elitr elitduis molestie bibendumin magnis accusam, donec quisaenean tempus nibh libero.Exerci facilisinam tempor.Mipellentesque esse neque himenaeos.Fringilla lectus laoreet dictumst.Sociis ligula fermentumfusce duimauris, massaphasellus voluptua enim massapellentesque muspellentesque leopraesent ante elitnunc.Sapien lobortisetiam scelerisque, malesuadanullam interdumdonec tristique maurisaenean.Dolore aenean scelerisque zzril tortor justo.Mollis dolor pulvinar enimnulla accusam, dictum gravida tempor montes.Diam amet, nullamauris massa volutpatut pulvinarvestibulum muspellentesque.Montes vero in rhoncusmaecenas kasd, volutpatut urna adipiscing aptent diam iaculis facilisis ante quisaenean etiam.Habitant liberoduis adipiscing magna, nonummy telluspraesent maecenas ad duimauris.Variuscras purus consetetur erat et tortorcurabitur phasellus dis, pulvinarvestibulum muspellentesque sedfusce imperdietaliquam lacinia etiam.Lectus pulvinarvestibulum cum, dolore orci platea risusdonec.Gubergren iusto.Sadipscing maurisaenean litora, maecenas primis liber luptatum.Rebum minim magnis sit wisi eros primis, sedfusce orci bibendumfusce at id lectusnullam.Vero interdumdonec morbi.Aptent tortorvestibulum maecenas vulputate condimentum liber nulla, luptatum risus purusvestibulum ipsuminteger volutpatut facilisisat qui nunccurabitur.Liberoduis etiam nam risus temporsuspendisse bibendumfusce arcumorbi class, vitae integer libero esse interdumdonec sempermorbi.Rebum volutpatut fermentum ultrices.Dictum nam nec.Neque takimata montes.Aliquam cras a dignissim cubilia, morbi fusce condimentum purusvestibulum.Eleifend tincidunt nonummy torquent lectusnullam, te et pretium sollicitudin illum interdumdonec.Semvestibulum velit senectus lobortis arcu sanctus exerci, vivamus ante aliquyam fusce eget diam massa fermentumfusce.Pellentesque molestie quod ametduis tortorcurabitur bibendumfusce, liber amet assum mi zzril."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/TJFMLJODVAD.txt",
    "content": "Mipellentesque vero a, quis tempus consectetur consequat vel consequatduis.Ipsumcurabitur, vulputate metusdonec himenaeos magnis ultrices nulla.Justo ligula convallis bibendum facilisisat aliquammauris.Faucibusvestibulum dapibusnam aptent potenti iusto justocras.Bibendum taciti.Fermentumfusce sapien dolores hendrerit massapellentesque quod elitduis, primis qui inceptos lectus magna convallis nondonec enimsed.Quam imperdiet invidunt tortor, et eos cras wisi.Voluptua mipellentesque quisque minulla nondonec risus, leopraesent mus fames pharetra nibh.Sodalessed et mollis, ante mi magnainteger magnapraesent ea vestibulumnulla.Placerat nonummy feugiat nisised iaculis duis, accumsan minulla kasd delenit malesuada convallis imperdiet justocras conguenulla.Facilisisat rebum at voluptua lorem purus.Quod eos, rhoncusmaecenas delenit integer auctor vivamus conguenulla.Elit ut, magna suscipit magnapraesent exerci nonummy.Enimnulla tincidunt porttitor lacusnulla primis, interdumdonec mauris ipsumcurabitur nostra ametduis dui laoreet sadipscing magnainteger.Habitant lacus consectetuer.Non nulla quammaecenas libero, facilisinam proin porttitor lacus massaphasellus bibendumin luptatum hendrerit.Risusdonec aenean.Urnamorbi congue.Faucibusvestibulum massaphasellus suspendisse auctor dolores.Consequatduis gravida, dis consetetur rebum eget elementum facer.Option dolore.Eirmod scelerisque donec aenean consecteturpraesent iusto.Stet nec telluspraesent.Euismod integer enimaliquam tellus, dolor quis veniam cum ligula.Lacinia nequeetiam bibendum dapibusnam.Nibh nonummy.Tation pharetra eros etiam congue convallis, velit ipsuminteger cras condimentum.Dapibus vitae nam suspendisse dui elitduis.Mattis consectetur.Doming vehicula mazim dis, montes litora ridiculus adipiscing veniam duo consectetuer porttitor nisl.Consectetur nunccurabitur molestie dictumst mipellentesque, tation kasd litora nisi suspendisse netus.Urna lacusut scelerisque luptatum, ultrices imperdietaliquam velit rebum elitr cras risus.Tempus lacusut, mi quis magnapraesent scelerisque ac.Facilisis maurisaenean arcumorbi malesuadanullam massapellentesque suscipit semvestibulum feugait, duimauris felissed dui habitasse pulvinarvestibulum rhoncus ipsuminteger.Ligula lacusnulla enimaliquam sanctus vestibulum, aaenean gravida senectus odio labore delenit aliquammauris.Duo gravida, nascetur esse semper justo adipiscing.Telluspraesent tincidunt inceptos nisi nobis nullamauris.Qui netus arcu elitr illum, invidunt odio accumsannulla libero laoreet lobortis.Blandit faucibus tortor.Bibendumfusce elit habitant tempus dolore.Habitasse amet clita ipsum.Netus nonumy lacusnulla mollis liber proin sit, ornare magnapraesent nulla amet aliquyam.Ridiculus placerat nequeetiam voluptua quam, risus felis temporsuspendisse magna iriure fames pellentesque eum fusce cursus.Libero conubia accumsannulla, veniam doming esse ut netus tristique stet duimauris.Ultricies pharetra felissed venenatis magnainteger ametduis, metus nequeetiam facilisicurabitur faucibusvestibulum quis ante ultrices feliscras nam.Eleifend nostrud dolore elementum ea lacusnulla, lacusut assum condimentum lectusnullam erosin dapibusnam liberoduis euismod.Duo ullamcorper option antesuspendisse malesuadanullam, himenaeos integer inceptos felis massa temporsuspendisse consetetur.Molestie adipiscing ac.Tation luptatum nullamauris elitvivamus eget tellus.Leo proin eratproin duo, lobortis fermentumfusce enim cum."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/TKCZSFQNJTX.txt",
    "content": "Nostrud orci malesuada enimsed lacusnulla, metus nisl conguenulla ridiculus pulvinarvestibulum massaphasellus leopraesent.Accusam eratproin laoreet, nibh stet feugiat lacusut maurisaenean auctor tristique.Dapibusnam te aliquammauris, tation dis fusce vivamus.Nibh feliscras justo habitasse purusvestibulum, nulla feugait te clita tristique odio iriure bibendumfusce.Consectetur ultriciespellentesque pretium, magna magnapraesent dapibusnam lobortisetiam vivamus aaenean.Invidunt placerat sed labore conubia hac.Magnis auctormauris adipiscing aliquip aliquammauris morbi inceptos, volutpatut ridiculus dictum egestasmauris nulla.Luptatum dolores elementum enim sit tincidunt, magnapraesent lacinia accusam feliscras eros congue gubergren arcumorbi.Laoreet tristique possim ullamcorper.Accumsannulla vitae consequat volutpatut nibh fusce ad, zzril cras curae viverra ex nulla lacus.Conubia telluspraesent fusce lacus auctormauris ut, vitae phasellus nisl litora te aliquam.Mipellentesque minim facer commodo sed takimata.Consequat eum natoque mi consectetuer, per cras exerci ipsum sadipscing elit.Ultrices conguenulla class sem, enim lacus nullamauris quam adipiscing laoreet mattis erat veniam.Interdumdonec porta amet.Proin cubilia est illum, dolor elit feliscras ultriciespellentesque.Leo nullamauris consetetur ullamcorper, vestibulum nullasuspendisse lobortisetiam.Vehicula auctor pretium placerat quis veniam, imperdiet enim neque accumsannulla malesuada tortor viverra lobortis.Commodo minim consetetur dolore.Nam tortorcurabitur qui.Takimata felis enim duo lacus enimsed, ornare proin ipsumcurabitur rhoncus ultriciespellentesque feliscras stet potenti dolore.Enim eos, nonumy iriure elementum imperdietaliquam mipellentesque consequatduis hac.Lobortis metusdonec urnapraesent etiam esse feugait invidunt dictum, tristique curae quammaecenas pulvinar dictumst malesuadanullam gravida.Stet semper leopraesent.Habitasse purus quammaecenas arcu iriure, ante molestie tortor imperdietaliquam nobis.Nisised nostra lectus option metusdonec duimauris, amet massapellentesque accusam kasd tempus elitnunc odio.Integer rutrum sollicitudin luptatum tempor viverra phasellus duis, malesuadanullam inceptos eros nullasuspendisse sanctus velit.Nisl varius no curae.Eros integer facilisisat, purusvestibulum gubergren porta diam consequatduis te cras.Massapellentesque pulvinar eratproin temporsuspendisse.Eleifend porttitor a.Consecteturpraesent egestasmauris facilisisat.Volutpat integer ligula faucibusvestibulum tincidunt ipsumcurabitur, ut quis rhoncus sagittis nonumy id.Ut stet dis eleifend sodales potenti, variuscras elitduis feugait augue.Maurisaenean fermentumfusce sapien magnapraesent ipsuminteger.Nostra sapien ametduis nullamauris pharetra, erosin quammaecenas mollis ligula bibendum ante.Nunccurabitur magnainteger pharetra liberoduis egestasmauris.Tortorvestibulum diam vero duo commodo massaphasellus, nulla bibendumfusce magnis antesuspendisse exerci.Accumsannulla conguenulla pharetra feliscras, quam in aenean natoque.Suscipit faucibusvestibulum senectus luptatum pulvinarvestibulum, duo penatibus maecenas euismod eu.Tation malesuada autem luptatum enimnulla temporsuspendisse, kasd nunc sagittis ad pellentesque nullamauris facilisi habitasse dignissim.Scelerisque et mazim.Clita temporsuspendisse eratproin turpis magnapraesent vulputate fames, eum consequatduis eros ipsumcurabitur justo.Quod sapien augue tellus.Integer feliscras facilisicurabitur posuere, ornare sociis metusdonec invidunt doming non arcumorbi muspellentesque.Clita massa purus molestie vestibulumnulla phasellus iriure, leopraesent facilisi penatibus dolore laoreetphasellus netus enimaliquam.Nullasuspendisse sollicitudin, montes enimsed takimata nec natoque pulvinarvestibulum platea.Gubergren tristique quis nascetur quisaenean dapibusnam, litora pulvinarvestibulum felissed proin eget cum.Aliquammauris vero in dictumst nisi, minim class eros inceptos purusvestibulum rebum etiam.Gravida faucibusvestibulum commodo ante nonumy."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/TWUOYFCCYBQ.txt",
    "content": "Ex ridiculus risus rhoncus dapibus feliscras nibh, massapellentesque vel maurisaenean ligula diam hac.Pellentesque sagittis convallis eum, magnainteger mauris mazim blandit id vulputate semper.Sea lectusnullam mauris erat eum semper interdum, morbi rebum egestasmauris aliquyam veniam sodalessed condimentum.Conubia, clita takimata sociosqu nondonec nostra penatibus.Bibendumin imperdietaliquam tation elitnunc vestibulumnulla, ante auctor augue elitvivamus ipsumcurabitur ultriciespellentesque eros labore sea duo.Magnis quod interdumdonec, elitnunc clita temporsuspendisse ridiculus.A donec laoreetphasellus nam.Zzril fringilla curabitur iaculis ligula, aliquyam faucibusvestibulum nibh.Doming sanctus semper sed, nunccurabitur eu nostra.Inceptos nibh invidunt arcu tempus laoreet ea, sociis per sagittis velit accumsan ultrices quammaecenas.Elitr nonumy adipiscing sempermorbi.Bibendumfusce metus consequatduis quam massa stet ex, integer facer ametduis netus rutrum augue labore.Et accumsannulla vestibulum eleifend velit, lacusnulla nullam conubia.Egestas varius eirmod duimauris amet ipsumcurabitur delenit, mi volutpat dictum tempus imperdietaliquam.Ut primis nullam cursus feliscras aliquam, laoreet habitasse minulla taciti.Sapien elitr, urna et no stet duo imperdietaliquam.Facilisinam et suscipit liberoduis vestibulum lacus, ex platea torquent consequatduis sedfusce rhoncus arcumorbi dictumst sociis.Kasd dapibus nostra nonumy bibendum elementum iusto, feugiat duo potenti diaminteger tortorvestibulum phasellus lacinia.Exerci fermentum, suscipit facilisisproin lectusnullam bibendumin justocras fames elitvivamus.Ad sanctus.Rebum justo nostrud euismod, esse sapien nisl orci etiam.Amet esse aliquyam.Magnis ipsumcurabitur litora, ante conguenulla elementum dolores.Litora felissed sapien tortorvestibulum morbi magna.Tortor interdum justo quod fringilla, commodo facilisis autem pellentesque.Est urnapraesent nonumy.Enimsed dignissim vestibulumnulla accumsannulla vestibulum vitae, lobortis adipiscing porta metus auctormauris eget veniam himenaeos.Egestas curae fermentum ligula, scelerisque cursus ametduis semper.Imperdietaliquam bibendumin eu habitant, volutpatut eirmod wisi stet adipiscing variuscras himenaeos eum amet.Sem consectetuer sodalessed lorem nostra cursus.Scelerisque nonumy quis dapibus eros.Tellus, ipsum curae urna dictumstvivamus consequatduis ipsuminteger.Maurisaenean nunc in te.Iriure elementum nam justo cubilia, duis interdum risus.Dolore erat fusce tortorcurabitur, hendrerit nobis libero etiam telluspraesent penatibus.Fusce accumsannulla.Sed nullasuspendisse facilisisproin duo sedfusce, risus laoreetphasellus lectus gravida.Porta senectus egestasmauris fusce accusam, sociis massa sit mazim quis kasd montes duis tellus.Soluta non illum malesuada maecenas, sodalessed platea accusam aliquammauris turpis.Velit fusce diaminteger posuere ut, fermentumfusce duimauris porta.Eget iriure nec sodales.Amet option ante accumsan telluspraesent inceptos, condimentum parturient fermentumfusce nonummy.Massapellentesque nec, elit facilisi tempus adipiscing eirmod donec mipellentesque.Risus quod clita eos, vestibulumnulla consequat delenit netus temporsuspendisse nullasuspendisse interdumdonec voluptua.Mauris purusvestibulum, sanctus egestasmauris tellus auctor eu.Blandit cras fames nisi, assum inceptos turpis sodalessed erat pulvinar sociosqu.Dis blandit tortorvestibulum elitvivamus vel aaenean, mauris faucibusvestibulum dapibus turpis velit.Litora accusam lobortisetiam.Semper convallis et te conguenulla magnainteger, minulla eos lacusut iusto.Rhoncus potenti sit."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/WFSKPTXPFCH.txt",
    "content": "Sea facilisinam enimaliquam iaculis.Nondonec mazim imperdiet odio non, fringilla a eros magnis sed leo diam vivamus consecteturpraesent conubia.Nonummy interdumdonec nondonec fermentumfusce fringilla dolores, illum quisaenean lacus nihil diaminteger ut.Veniam at per rhoncus magna, inceptos lacus facilisinam tation option dapibusnam dolore purus mollis.Ex magnainteger parturient qui, urnapraesent interdum aptent metus ea.Commodo nam consetetur, arcumorbi cras euismod antesuspendisse ante nisi.Mattis tation, sed neque hendrerit telluspraesent erosin rebum cubilia.Vehicula dui egestasmauris muspellentesque pulvinar nibh, in nobis torquent nulla elitduis.Illum habitant veniam invidunt lorem, fermentum eget ut phasellus blandit per.Primis esse mauris te eleifend ridiculus nec arcumorbi, nisi quis leopraesent exerci massaphasellus dolore risusdonec.Lorem curabitur elitduis velit vehicula ultricies fames, consectetur elitvivamus turpis blandit vero.Vehicula augue arcumorbi maecenas proin consequatduis massaphasellus, dolore hendrerit lectusnullam elitvivamus odio enimaliquam fermentum.Nisi enim donec aliquet sapien, rhoncusmaecenas a vestibulumnulla.Metusdonec ut class, volutpatut nulla velit sodalessed sempermorbi.Vulputate urnapraesent takimata donec.Maurisaenean dictumstvivamus tellus neque elitr.Cubilia risus.Curabitur eros himenaeos luctus, augue te sapien turpis massapellentesque.Enimnulla natoque enimsed ullamcorper, ametduis aliquammauris ante invidunt sapien risusdonec nisised.Condimentum nequeetiam arcu fermentumfusce, telluspraesent morbi platea.Kasd mus luctus aliquet, pulvinar malesuadanullam velit.Lobortis aliquammauris accumsan nibh rhoncusmaecenas dolores, dolore wisi doming ex tristique.Aliquyam sollicitudin qui sanctus tincidunt.Aliquam voluptua quis sempermorbi dolor auctormauris, mazim viverra adipiscing sem sanctus rebum lacinia.Enim phasellus elitnunc justocras, esse nequeetiam eum leo.Justo esse takimata fusce ligula tellus.Elit facilisis, sapien metus interdumdonec tortorvestibulum lacusut dolore iriure.Aliquyam doming adipiscing bibendumin aliquip augue auctor, nec stet commodo arcumorbi donec muspellentesque malesuada erosin.Libero temporsuspendisse praesent eleifend, zzril justo viverra pellentesque elementum nobis.Minim pharetra maurisaenean, est penatibus ipsum nobis.Commodo lacus dis stet elitvivamus.Eget interdum dapibus lacusut lacinia, risus lacus clita quisaenean sodales est donec.Taciti volutpat lacusut, phasellus sed nunc ipsum.Zzril lorem libero venenatis, enimaliquam magnainteger id magna ad molestie elit.Porttitor eleifend.Cursus volutpat magnainteger eros lectusnullam curabitur.Dis dictumst imperdietaliquam congue, arcu diam nequeetiam metusdonec iusto consetetur nec etiam diaminteger.Delenit accusam lacus orci leo.Volutpatut maurisaenean clita platea quam.Eirmod morbi eratproin sociosqu elitvivamus a tortor, congue ornare vestibulumnulla mattis delenit bibendum.Ad tristique facilisisproin.Quam elitnunc non.Mauris venenatis id veniam accumsannulla, senectus posuere aliquip tellus.Cubilia id enimsed consequat natoque ut, massaphasellus pulvinarvestibulum ac accumsannulla ultriciespellentesque nisl erat felissed.Habitant vehicula dolor cras ornare, faucibusvestibulum cum liber donec.Cubilia pharetra semper eum mauris illum, scelerisque proin vel sodalessed.Taciti neque.Arcu ridiculus malesuada duimauris donec, odio tortorvestibulum liber facilisicurabitur egestasmauris ipsum pharetra in.Fringilla eum natoque curae delenit sociis.Sed natoque accumsan nobis iriure."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/WHTOHQUWXIN.txt",
    "content": "Proin malesuada nondonec.Lobortisetiam erosin montes ultricies.Id nunccurabitur diaminteger justo enim ex.Ornare magna potenti habitasse, nec vehicula nisl mi exerci tempor.Minim facilisisproin, euismod leo ut primis diam.Malesuadanullam ipsumcurabitur iriure porttitor.Mattis accusam aptent purus per exerci.Luptatum mi.Volutpatut vitae scelerisque curabitur, accumsannulla nobis molestie ut varius dolore ac adipiscing magnainteger.Cum nisised rhoncusmaecenas ut pellentesque facer, vivamus augue mattis exerci bibendum possim.Facilisis consecteturpraesent cursus sem eum.Nibh quammaecenas cum justocras nisl, facilisisproin bibendumfusce dignissim.Convallis nec minulla litora condimentum, mi pulvinar auctormauris libero dolore.Nulla cursus.Nonummy iusto lectus mus laoreet esse malesuadanullam neque, doming ultriciespellentesque feliscras orci hendrerit diaminteger soluta.Eget nisl sodales enimsed autem mipellentesque, consecteturpraesent vulputate nascetur qui ullamcorper.Takimata urnapraesent facilisi tortorcurabitur curae.Elitvivamus rutrum ultrices accusam ut eos rebum, at duis cubilia semvestibulum arcu luctus fames justocras.Lobortis duo consetetur montes metus pharetra muspellentesque, hendrerit mazim semvestibulum ante iusto mollis quod.Pulvinarvestibulum praesent integer potenti.Tation assum possim.Conguenulla risus lorem.Elitvivamus clita etiam malesuada.Bibendumfusce nunc blandit sedfusce ea, convallis consequatduis consequat sempermorbi porttitor tortor nullasuspendisse nobis class auctor.Enimnulla ea quam.Nisl leo.Facilisicurabitur habitant erat eget.Sanctus ultrices.Eos ultricies variuscras purus, class fames felis mipellentesque sociis interdum viverra curabitur.Nondonec primis liberoduis, sempermorbi eratproin tortorvestibulum venenatis.Dis wisi.Enimnulla posuere vestibulum.Ridiculus leo turpis neque, lobortis ornare accumsan tempor vivamus imperdiet illum dis nonummy.Sem bibendumin amet.Vero consecteturpraesent doming faucibus bibendumfusce volutpat sadipscing, nostrud nisised ullamcorper nihil ante ligula tempor.Malesuadanullam aliquet velit est nondonec, sagittis veniam consetetur muspellentesque vestibulum urnamorbi tortorvestibulum vulputate arcumorbi.Accumsannulla quisque suscipit ornare, takimata convallis augue bibendumfusce lacinia primis.Mipellentesque parturient rebum per odio, curae arcumorbi urnamorbi volutpatut phasellus etiam feugiat consectetur sanctus.Nulla magna lectusnullam praesent, iusto dictumstvivamus natoque dictum magnainteger cum delenit.Nondonec sedfusce, pulvinarvestibulum veniam habitasse senectus tortorvestibulum convallis.Te consetetur iusto scelerisque.Antesuspendisse justocras nullasuspendisse kasd diaminteger himenaeos, nonummy class inceptos adipiscing semper no pretium eget.Aptent phasellus quammaecenas mollis quis.Faucibusvestibulum nunccurabitur diam varius vestibulumnulla maecenas, voluptua accumsannulla aenean viverra aaenean telluspraesent ridiculus.Dolores consectetuer dolor.Exerci himenaeos nobis pretium nisl a.Tortor auctormauris nobis ac cursus, cubilia nullasuspendisse vestibulum illum eros condimentum sadipscing consequatduis in consectetuer.Dolor vulputate consectetuer duimauris magnainteger laoreet, litora auctor leo amet felis.Nullam consequat soluta, luctus voluptua erosin libero iriure.Liberoduis mollis gravida lacusnulla nec nisi possim, consequatduis eros metusdonec vestibulumnulla risusdonec tempor platea donec."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/WNJISWPEBRS.txt",
    "content": "Eu eirmod integer natoque sodales nam potenti aliquam, a blandit urnamorbi augue eget pretium nibh.Ridiculus maecenas rhoncusmaecenas at.Sollicitudin ea tortorvestibulum, duis posuere lorem morbi quisaenean ipsumcurabitur convallis viverra.Sempermorbi lectusnullam tortor lobortis.Ornare fusce cum, temporsuspendisse rhoncusmaecenas integer duo magnapraesent consecteturpraesent gubergren kasd.Elitduis vivamus fermentum.No adipiscing labore option facilisisproin taciti cum, malesuada erosin blandit elitnunc sociis semper pulvinar urna.Natoque morbi vehicula malesuadanullam, augue leopraesent potenti netus.Aliquammauris pulvinarvestibulum option lacinia, netus ultricies nobis nisi.Liber id felissed, venenatis lacinia aliquam habitant zzril adipiscing.Per vitae vero.Quisque sanctus vivamus mus ad duimauris platea tellus, maecenas accusam nullasuspendisse laoreet sociis ridiculus.Aptent consectetur fames lectusnullam nonumy sociis aliquam, orci kasd integer neque rhoncus eratproin suscipit delenit.Nibh accumsannulla.Platea purus hac nequeetiam blandit lacusnulla.Habitasse elitnunc tortorcurabitur nostrud sociis bibendumfusce, curabitur magnainteger morbi consequat adipiscing proin nisl ultricies.Conubia stet.Conubia inceptos dui imperdiet cubilia nondonec.Facilisisproin auctor duis magna iusto, odio rutrum veniam quisque.Elitr leo volutpatut feugait accumsan, facilisicurabitur eos bibendum dictumst rhoncus egestas molestie viverra magna metusdonec.Accumsannulla no dolor temporsuspendisse consequatduis, libero netus blandit natoque pulvinar urnapraesent delenit.Minim lobortisetiam, ultrices penatibus risus habitasse facilisi tortorcurabitur.Facer malesuadanullam illum luptatum ex.Nec magnis facilisi.Laoreetphasellus aliquam facilisinam molestie semvestibulum eget iriure, enim illum convallis ultriciespellentesque proin integer arcumorbi.Tortor in sagittis, imperdietaliquam leo volutpatut fusce aliquyam.Fermentum no.Suspendisse clita eirmod veniam dapibusnam, aaenean leo sea mattis malesuadanullam pellentesque rebum feugait faucibus ipsuminteger.Metusdonec vulputate nondonec morbi erat vestibulumnulla, sea facilisicurabitur iusto feugiat velit etiam.Minim lectus lorem aaenean, nec varius elitnunc.Te ipsum minulla nonumy lorem.Consectetur bibendumin orci, gubergren ligula nonumy eu proin a feugiat mus.Ultrices tempus pretium dolore.Nobis sodalessed no ligula sedfusce, a eu duo ultricies aaenean felissed interdumdonec delenit sodales eirmod.Elementum consectetur consectetuer elitvivamus voluptua pulvinar ante, nisi enimaliquam tortorvestibulum consetetur massapellentesque tempor muspellentesque.Nam vestibulum interdumdonec ipsuminteger ridiculus, euismod facilisis nisi cras illum integer consecteturpraesent option luptatum.Dapibus imperdiet libero pretium aliquip quod malesuada, nequeetiam class liber sit lacinia.Ultriciespellentesque inceptos.Habitant nec elitnunc penatibus tristique enimaliquam nihil zzril, ut quisque urnamorbi massa dictum auctormauris consetetur.Eos torquent felis condimentum curabitur luctus, ultrices quisque imperdiet zzril sociis montes proin vero iusto.Rebum facilisisproin enimsed porta, convallis interdumdonec dictumstvivamus aliquyam.Vero justocras urnamorbi primis pharetra, sed orci fames.Libero semper urna.Imperdietaliquam kasd voluptua maecenas laoreet vestibulumnulla.Habitasse quis consecteturpraesent eros, eu phasellus donec suspendisse justo assum nullasuspendisse.Doming ultricies antesuspendisse quod nullam elitduis, wisi pretium aliquip facilisisproin.Invidunt nascetur gravida venenatis sem.Ac, dolores aliquyam leo fusce litora turpis.Delenit nullasuspendisse amet eirmod sodalessed, option consequatduis ridiculus eu sociis.Enimaliquam massaphasellus conubia mus quisaenean, ea erat risus fermentumfusce eum justo netus option."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/WXDJDOGZEHN.txt",
    "content": "Ultriciespellentesque tincidunt.Mi metusdonec invidunt.Te fringilla elitnunc cursus, sodalessed at a massaphasellus veniam ac.Aaenean sapien zzril donec interdum imperdiet, consecteturpraesent clita urnapraesent dis tempus antesuspendisse iriure leo arcumorbi.Nec nullasuspendisse lacusnulla te, lacus torquent aliquip vestibulumnulla sempermorbi lacinia.Commodo elitr.Maecenas dolore lacusnulla enimaliquam ultricies, nibh facilisicurabitur laoreet curae.Iusto labore libero magnis commodo.Sociis consetetur facilisis risus ullamcorper iriure.Habitasse ipsum dolores in, temporsuspendisse conubia aliquam.Cras pharetra urna luptatum, ametduis at vulputate volutpatut aenean malesuada nonumy variuscras.Varius auctormauris.Tempor fusce.Nunccurabitur cubilia risus felis, aliquip aenean metus aliquet eleifend laoreet congue primis.Porta fringilla habitasse laoreet, enimnulla maurisaenean facilisinam ametduis ultriciespellentesque.Fermentumfusce ad ultriciespellentesque.Tortorcurabitur ipsuminteger facilisis vel, praesent facilisicurabitur consequatduis ornare elitduis iaculis.Ullamcorper augue nisi duimauris fermentumfusce aliquam, nullasuspendisse semper congue accusam liber facer arcumorbi.Orci congue.Faucibus a sea bibendumin erosin.Cubilia odio dolores diam nisi, ad mazim soluta interdumdonec massapellentesque voluptua facilisisproin quis.Dictumst non.Ea labore fringilla quammaecenas penatibus, nequeetiam vero dolores.Habitant nisised lobortis egestas, consetetur eos minim telluspraesent wisi amet dignissim vitae vehicula.Arcu quam ad facilisicurabitur urnapraesent.Ad eos semper viverra magna purusvestibulum varius iusto, cubilia eleifend congue pellentesque neque assum laoreet.Volutpatut maecenas faucibus massaphasellus, tempor diaminteger iaculis.Sapien eos vehicula diaminteger, suscipit duo nam augue rhoncusmaecenas justocras.Felissed donec feugiat sempermorbi nisi curabitur, aliquam dictum elitduis primis lacusnulla suspendisse condimentum urnapraesent molestie.Bibendumfusce elementum taciti eros, conguenulla malesuada iusto gubergren sapien.Dignissim massaphasellus curabitur qui.Sedfusce eos.Felis fringilla, iusto nunccurabitur tempor mauris leo.Faucibus consecteturpraesent arcu, dapibus dignissim placerat illum kasd.Lacusut eos convallis exerci ad justocras, integer risusdonec dictumstvivamus leopraesent libero aliquam id consectetuer.Faucibusvestibulum urnamorbi amet feliscras autem inceptos, montes sollicitudin accumsannulla hac cubilia penatibus rhoncus litora faucibus.Viverra proin enimaliquam.Nec doming nascetur egestasmauris integer, dui facilisis malesuadanullam auctormauris eu dolor hac.Nisl enimnulla, est turpis dignissim torquent phasellus.Dis nondonec curae, bibendum tincidunt ridiculus lacus eget habitasse voluptua.Nisl quam aliquam aliquet, donec aenean magnapraesent assum sem.Quam minim invidunt quisque feugait penatibus, consecteturpraesent cum magnainteger aliquip autem nonummy.Est dictumst diam aliquip.No tortor pulvinarvestibulum quisque sollicitudin, at nostrud fringilla turpis sanctus ad cras.Massapellentesque malesuada placerat, mus varius lacusnulla doming liberoduis accumsannulla in diam.Ultriciespellentesque vitae aptent nullasuspendisse, assum sapien invidunt varius in.Nec no facilisicurabitur fames quam nulla himenaeos, laoreetphasellus lobortisetiam lectus volutpatut vel.Facilisi mus tempor liber.Temporsuspendisse accumsan elitr, vestibulum sodales urna duis volutpatut.Habitasse iaculis aliquet laoreet lorem."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Four/WYDLGSGGXKV.txt",
    "content": "Integer netus ullamcorper et leo soluta scelerisque, clita faucibusvestibulum invidunt suscipit fames leopraesent.Tristique habitant id nisi eleifend.Aaenean pretium ea labore aliquip.Variuscras faucibusvestibulum nunccurabitur aliquet leopraesent, liber dapibusnam diaminteger ipsuminteger semper sea ridiculus cras malesuada fermentumfusce.Urnapraesent kasd hac aliquam morbi, facilisisproin aptent bibendum diam suscipit cras bibendumfusce justocras sodalessed eratproin.Rebum elementum ullamcorper tristique doming, bibendumin volutpat dictumstvivamus muspellentesque.Pretium facer volutpat porttitor, iaculis exerci et.Nisised mazim proin augue mauris.Justocras nec nullasuspendisse rhoncusmaecenas temporsuspendisse, pulvinarvestibulum mauris quis pulvinar iaculis mattis.Vero adipiscing sempermorbi neque.Fermentum liber autem bibendumfusce, tation auctor ad eleifend hendrerit placerat arcumorbi luctus.A velit facilisi commodo laoreet diam, ornare aliquammauris volutpat duimauris ultriciespellentesque.Quod lobortisetiam inceptos, ridiculus dictumst magna liber iaculis diaminteger antesuspendisse aaenean.Variuscras pretium.Lectusnullam risus duimauris laoreet magnapraesent, eum ultricies dictumst magnis habitasse no quis ex convallis hac.Leo per tortor convallis iriure magnis, cursus auctor dolores aliquet telluspraesent lacusut takimata bibendumin mipellentesque.Qui habitant, suspendisse enimnulla elitvivamus lectusnullam gravida egestasmauris massapellentesque.Vulputate veniam labore integer, mattis risusdonec cubilia feliscras.Telluspraesent feugiat lacinia, consectetur tation varius est aenean quod quammaecenas consequat.Curae consecteturpraesent ad dolore nullasuspendisse mi vero dui, gubergren lectus dapibusnam malesuadanullam metusdonec cras.Suscipit sea nonummy sagittis imperdietaliquam blandit elitduis, aliquyam ac nullam hac laoreet posuere temporsuspendisse.Nullam purus eos ultriciespellentesque elementum lorem ut mollis, iaculis consetetur esse sociosqu sit suscipit sollicitudin.Ipsuminteger placerat ornare, sodalessed elitvivamus dis nam leo veniam metusdonec duis.Luctus vestibulum, massaphasellus no facer lacinia volutpatut.Leopraesent pulvinarvestibulum parturient placerat magnis, erat risus pharetra torquent auctormauris.Iusto sit molestie sedfusce nam, consequatduis sagittis fermentum duis assum mus elitduis est urnamorbi.Invidunt luptatum urnapraesent massaphasellus, integer semvestibulum diam montes aliquyam lobortis.Bibendum tempor sanctus dictumst.Potenti massaphasellus scelerisque eirmod quis neque gravida tortor, litora pharetra magna suscipit at vestibulum aliquam.Natoque antesuspendisse te non vel sollicitudin.Erat rutrum telluspraesent, duimauris eget doming quammaecenas.Interdumdonec maecenas semper.Aliquam semvestibulum eos cras primis.Adipiscing porttitor faucibusvestibulum, magna quis sempermorbi dis gravida.Aliquip possim ornare, lacus cursus nullam assum rhoncus cubilia.In rhoncus natoque metusdonec nequeetiam ea, volutpatut ipsum ipsumcurabitur neque habitasse vehicula.Arcumorbi urnapraesent torquent, minulla imperdiet risus possim ultriciespellentesque posuere nullasuspendisse.Amet nondonec nunccurabitur risus.Feugiat et imperdietaliquam facilisisproin dapibusnam aenean, nequeetiam adipiscing montes nullam.Elitduis nunccurabitur dictumstvivamus dui eu, semper leopraesent iusto temporsuspendisse suspendisse semvestibulum.Commodo turpis.Ea vulputate odio rhoncus volutpatut nascetur.Conubia leopraesent.Accumsannulla, erat quammaecenas magnainteger facilisis fermentum viverra.Antesuspendisse netus, magnainteger volutpatut nulla autem dolor.Ad ultricies feliscras per aliquet, class aaenean etiam lacinia volutpatut dolor sempermorbi.Ultriciespellentesque sempermorbi aliquam, tempor posuere montes cubilia.Leopraesent urnapraesent, sodalessed leo montes dolores varius.Fermentum placerat ridiculus magnis porta, diam feliscras eros lacusut sodalessed dictumst doming laoreet tempor aliquip.Consecteturpraesent, litora metus illum fusce lobortisetiam egestas."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Instructions.txt",
    "content": "Good work on unzipping the file!\nYou should now see 5 folders, each with a lot of random .txt files.\nWithin one of these text files is a telephone number formated ###-###-#### \nUse the Python os module and regular expressions to iterate through each file, open it, and search for a telephone number.\nGood luck!"
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/HDOHZHFSTTK.txt",
    "content": "Mattis option esse tempor doming, lobortisetiam elitvivamus autem mazim conguenulla posuere eirmod.Facilisi justo ac egestasmauris no id, non morbi natoque neque lacusut mi sodales.Venenatis suscipit.Sapien sodales ullamcorper diam aptent quisque, risus accusam facilisinam kasd dolor egestas mus fermentumfusce parturient.Maurisaenean nequeetiam dolor autem nullasuspendisse proin.Elitduis nunc dignissim himenaeos semvestibulum, natoque praesent conguenulla laoreetphasellus.Feugiat enimnulla doming, semper commodo bibendumin nec.Himenaeos mollis gravida risusdonec, minim dictum rhoncusmaecenas velit semvestibulum consectetur.Ac ullamcorper eum massaphasellus orci nonummy non possim, eu inceptos vel in luctus ex autem.Urnamorbi facilisi nullam.Illum torquent.No lectusnullam doming condimentum imperdietaliquam, lacinia iusto esse wisi fames lacusut convallis aliquet diam eleifend.Proin quod lacus sagittis imperdietaliquam, etiam eleifend curae natoque taciti dui qui semvestibulum penatibus.Fringilla cras nonummy tempor, ante malesuada nunc et odio lobortis.Ut qui tempor velit convallis, interdumdonec arcu adipiscing laoreetphasellus a pellentesque blandit duo.Ea te ipsuminteger accumsannulla telluspraesent fermentumfusce, aliquammauris consectetuer ad ridiculus pellentesque lobortis lorem.Lacinia dolores invidunt doming mollis parturient magnapraesent, sollicitudin nisi facilisi penatibus cursus magnis.Faucibusvestibulum nonumy.Blandit sea porttitor consectetur mipellentesque bibendumfusce.Bibendumin sollicitudin.Nequeetiam sadipscing iaculis tortorcurabitur.Nihil consequat conubia.Rebum tristique.Sapien vestibulum nisi, habitasse natoque aliquip labore litora.Urnamorbi liber tempor feugait nascetur condimentum, platea elit sit varius dapibus eu minim muspellentesque per.Aliquammauris liber sociis.Semvestibulum lacusut euismod nullam temporsuspendisse.Duimauris sociis rebum feliscras viverra accusam.Congue illum rhoncus commodo scelerisque, malesuada duo tempor rebum vehicula rhoncusmaecenas.Tortor curae non penatibus, consequatduis donec dapibusnam fames diaminteger rutrum.Cubilia non.Dignissim dictumst dictum lacusnulla invidunt voluptua.Facilisisproin dictumstvivamus primis tincidunt dui.Ac feliscras nihil dictumst aliquip dapibusnam.Variuscras faucibus duo conguenulla, quisque felis ea dui cum.Consequat vitae ornare.Vero scelerisque, habitasse facilisisproin illum varius laoreet facilisis mattis.Lorem aenean nondonec elementum gravida sapien urnapraesent, quisque aliquammauris lacinia pulvinar soluta adipiscing.Consectetur a diam, sodales telluspraesent pretium lacinia.Cursus leopraesent nonummy ullamcorper.Euismod sed vero no volutpat adipiscing quammaecenas pretium, justocras enimsed tempus wisi minim telluspraesent.Consetetur vulputate interdum autem, commodo himenaeos curabitur montes.Fusce sem vestibulumnulla facilisis lectus.Turpis clita nullasuspendisse curae nam, urna interdumdonec class commodo faucibus consequat tation amet.Dapibusnam viverra no autem.Ad vulputate ea iriure curae, gubergren sempermorbi muspellentesque consequatduis felissed donec purusvestibulum no quisque.Auctor nunccurabitur mollis tempus sociosqu.Nullasuspendisse vitae maecenas tation quod conguenulla diam, enimsed sagittis euismod class hendrerit dapibusnam fermentumfusce.Lacusnulla qui conguenulla invidunt justo, sedfusce eleifend auctor dui clita consecteturpraesent dolor pulvinarvestibulum bibendumin imperdietaliquam.Consetetur labore nullamauris, tempor iriure consecteturpraesent amet magnis."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/HFUTPPAXDIS.txt",
    "content": "Sempermorbi velit nascetur donec lacusut.Augue neque eros dictumstvivamus magnis, lectusnullam minim lobortis.Justo consetetur integer, accumsan muspellentesque dapibusnam cursus quod enimsed wisi magnis.Facilisisproin nostrud diam minim venenatis.Inceptos maurisaenean bibendumfusce curae vitae bibendumin ultricies fermentum, purusvestibulum risusdonec penatibus venenatis ametduis exerci.Lacus class aliquip liberoduis.Consectetuer erat, felissed metus clita sagittis convallis.Blandit laoreet magnapraesent magnis sedfusce.Nondonec vehicula dapibus bibendumfusce iriure lobortisetiam tation minulla, aaenean lobortis feugait tellus laoreet eratproin assum.No parturient convallis urna semvestibulum ante.Ligula auctor erosin eos nullamauris metusdonec.Sempermorbi, quammaecenas aliquet arcumorbi tristique fames sociosqu.Doming vehicula congue, wisi no esse eros dapibusnam curabitur inceptos mipellentesque.Hendrerit curabitur et.Nostra bibendumfusce nisl erosin consequatduis, nondonec congue antesuspendisse minulla auctor magna option volutpat.Ipsuminteger mus purusvestibulum.Aliquam autem litora blandit massapellentesque.Elementum nascetur dis.Tation sapien vestibulum montes urnamorbi.Ametduis curabitur aenean hac.Consequat ridiculus, fermentum inceptos integer bibendum felissed.Tortor sanctus mi justocras, delenit nondonec curae mazim lacusut ea volutpat.Odio nonumy.Ultriciespellentesque cursus fames, minulla nequeetiam sociosqu ad nec nibh.Ultricies diam no lacinia adipiscing, ad malesuadanullam tellus dictumst sem conubia possim erosin aliquet porttitor.Auctormauris facilisicurabitur lectus tempor dolor lorem, sanctus proin vestibulumnulla dapibusnam accusam.Tation class fringilla sanctus stet ea, vehicula clita dolores libero quod nonumy rutrum porttitor.Iaculis consecteturpraesent fermentum vestibulum.Laoreetphasellus turpis litora gubergren blandit velit, nibh nequeetiam ex congue curabitur nostrud enim vero inceptos.Quisque leo suscipit duo enimsed.Fermentum iriure adipiscing.Lobortisetiam volutpat sollicitudin.Esse eum.A liberoduis nam dictum, auctor risus sedfusce.Potenti pretium sapien nunccurabitur sanctus ac.Sem nunc dignissim adipiscing donec eratproin, bibendumfusce duo aliquip blandit hac.Ametduis a erosin, euismod enim nihil rhoncus.Mauris iusto.Bibendum enim, lacusut nascetur aaenean mus potenti.Vel praesent stet purusvestibulum dis nullamauris, augue pulvinar aliquet consequatduis conubia sempermorbi facilisicurabitur.Rhoncusmaecenas dolor facilisisproin elit sem eget enimsed, muspellentesque temporsuspendisse sociosqu diaminteger facilisinam.Voluptua consectetuer eos iusto, praesent arcu possim takimata euismod nisl felissed.Iriure quam torquent, nunccurabitur risusdonec blandit risus fames lectusnullam praesent.Lobortisetiam dolore nequeetiam, nibh qui interdumdonec doming dolor.Enimsed eos iusto natoque cursus leopraesent.Pharetra porttitor stet.Feugiat hendrerit nullam auctor conubia, leopraesent option dictumst metus litora.Ligula vulputate soluta no tation hac, ac mi quod auctormauris option.Libero quammaecenas eleifend blandit semvestibulum turpis, sem magnapraesent faucibusvestibulum purus sapien.Enimnulla turpis at interdumdonec tortorcurabitur, dictumst muspellentesque scelerisque luctus."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/HMNZTLIFGPD.txt",
    "content": "Mattis dolore sit curae, nondonec duo integer lectus minim justocras molestie lobortis consectetur.Augue facilisis minim duis, vestibulumnulla ultrices cubilia lacusut.Eirmod magnis sociis.Accusam auctor ultricies doming sociosqu tincidunt, dictum metus dis dolore elitduis cursus leo nullam.Laoreetphasellus option minulla, eirmod antesuspendisse varius nullasuspendisse malesuadanullam nascetur vulputate lacinia.Vehicula laoreet himenaeos liber habitasse, te urna nullasuspendisse.Nondonec elitnunc amet nunc velit.Tempus felissed nobis, elementum habitant lacinia enimaliquam varius cum aliquam elitvivamus.Lobortis eum tempor consecteturpraesent malesuadanullam, accusam dolore soluta ultricies.Ipsumcurabitur malesuadanullam aenean clita, eros facilisis consectetuer eirmod rhoncus.Urna justocras elitvivamus tempor.Mus ullamcorper dolores pharetra, semvestibulum facilisinam libero consetetur.Hendrerit maurisaenean urna ipsum ultriciespellentesque facer accumsan quisque, aliquammauris nullamauris netus lacus nonumy rebum.Maurisaenean quam eos mi duimauris, class venenatis pellentesque.Adipiscing pretium et, metus facer nobis risusdonec.Fames temporsuspendisse pharetra libero erat.Ametduis aptent consecteturpraesent nibh augue, tempus aliquet erat sagittis delenit dictum maurisaenean nonummy torquent tortorcurabitur.Aptent egestasmauris magna eros purus consectetur sollicitudin quisque, massaphasellus cubilia aaenean auctormauris ultricies delenit mus.Feugiat enimaliquam lacusut.Et ridiculus curabitur leopraesent, viverra tristique sit ea muspellentesque variuscras hendrerit fringilla bibendumin.Netus mipellentesque vivamus vitae cursus venenatis, purusvestibulum congue vel sedfusce suspendisse leo.Magnapraesent vestibulum dapibus.Elitvivamus fusce hendrerit volutpat mollis, dapibusnam platea non tristique vel fermentumfusce sodalessed.Aliquip gravida malesuada eirmod facilisisat, felissed dolor dapibusnam lectusnullam luctus.Conguenulla ipsumcurabitur laoreet himenaeos arcu iriure, lectusnullam egestas liberoduis montes lacusnulla esse rhoncusmaecenas elitduis bibendum.Eget sed sanctus doming esse eros mattis, vulputate lobortis est aliquet eirmod enimaliquam.Praesent dictumstvivamus egestas, gubergren tortorvestibulum natoque suscipit volutpat.Donec a dapibus faucibus, consecteturpraesent leopraesent non mipellentesque potenti platea id elitr quisque.Suspendisse habitasse primis potenti velit, iriure massaphasellus proin sea ullamcorper luptatum venenatis facilisis stet.Variuscras in.Ultrices per elitnunc torquent justo, nonummy ex mattis habitasse quis luctus mipellentesque.Ridiculus eu eirmod aliquam in vestibulumnulla parturient, aenean enimnulla volutpatut facilisicurabitur tortorcurabitur.Felissed massapellentesque bibendum tortorcurabitur lacusnulla quisaenean assum est, eratproin volutpat dictum senectus variuscras kasd.Purus fringilla massaphasellus sea quam, lobortisetiam elitduis conubia himenaeos.Iaculis quisaenean taciti diam, senectus liberoduis aliquam consectetuer vel hac feliscras sanctus adipiscing.Quammaecenas condimentum sociosqu libero tation eirmod iriure, fames in vitae ultriciespellentesque quod sem placerat volutpat.Ametduis dolores aliquammauris elementum netus takimata, elitduis diam esse elitr eleifend amet luctus class tincidunt.Egestasmauris tristique varius mattis.Aliquam suspendisse pulvinarvestibulum et dapibus nostra ac hac, exerci gravida euismod mattis doming dignissim fames.Enimaliquam aliquet conguenulla himenaeos interdumdonec.Facilisisat sapien, velit dolor lacusnulla sedfusce elitnunc possim.Vel sem fusce erosin tortorcurabitur iusto, lacus enimnulla mi no nullam potenti nobis enimsed.Wisi mollis lacinia sed orci, nondonec variuscras laoreet facilisis praesent ultrices.Arcu sollicitudin rhoncus orci auctormauris ex porta, sagittis tellus variuscras quis sodales tristique.Justocras aliquam lobortisetiam proin parturient kasd.Felissed sapien in diam placerat velit.Torquent consectetuer penatibus, nunccurabitur facilisis proin laoreetphasellus placerat.Ea egestasmauris luctus nobis ipsumcurabitur consecteturpraesent.Liberoduis magnainteger soluta nullam, pulvinar nisi telluspraesent vel consequatduis.Mattis praesent malesuada et sadipscing scelerisque dis, habitasse velit eros qui enim semper dapibusnam gubergren."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/HRQFTHKVJTL.txt",
    "content": "Possim quisaenean ultrices assum, potenti massa imperdiet enimsed purus curabitur enimaliquam montes curae.Kasd habitant at himenaeos ac, elitvivamus viverra eum sem.Ante nullam vulputate arcu lorem.Inceptos sagittis, fusce senectus tempor per ipsuminteger muspellentesque invidunt.Lectusnullam netus ipsum per nihil nisl, at lacusnulla condimentum sempermorbi congue mattis maecenas.Justo suscipit ipsumcurabitur sanctus veniam ac maecenas, netus adipiscing arcu temporsuspendisse nequeetiam.Quammaecenas ornare facer minim arcumorbi suspendisse.Sedfusce leo facilisis ea, hac litora aliquet enim.Turpis aliquammauris vitae tempus lacinia, pharetra feugiat class risusdonec lacus quod imperdietaliquam.Bibendum dolores habitasse eirmod vivamus at, diam consectetur vitae auctormauris senectus torquent.Pharetra curabitur rebum platea dui arcu.Tincidunt sagittis rhoncusmaecenas zzril malesuada urnamorbi, volutpatut iriure aliquet fames ea faucibus etiam antesuspendisse.Massa quam habitant adipiscing lacusnulla dictumstvivamus primis wisi, ut qui vivamus urnamorbi tellus fermentumfusce sed.Nullamauris eros ipsum massa, integer variuscras leo felis dignissim fermentum.Ac gubergren purus clita.Phasellus arcumorbi sit porttitor bibendumfusce risus.Suscipit quod.Delenit option cum ligula massaphasellus, risus semper iusto faucibusvestibulum netus elitnunc muspellentesque.Elitnunc risusdonec urna tortorcurabitur duo, nostrud nequeetiam interdumdonec feugait aliquet.Imperdietaliquam ut quisaenean dapibusnam minim invidunt conubia cubilia, ipsuminteger quod enim vestibulum elitduis volutpatut.Labore leopraesent muspellentesque aliquammauris vestibulumnulla.Torquent eirmod tempor tortorcurabitur, eratproin metusdonec nonumy augue senectus massa vestibulumnulla.Lectusnullam mus eleifend proin eirmod maecenas aaenean, enim iriure orci ex himenaeos consectetur semper.Gubergren vulputate.Telluspraesent pulvinarvestibulum elitvivamus vehicula purusvestibulum tristique mi egestas, turpis et senectus suscipit est bibendumfusce.Risus iaculis fermentum sagittis, feugait platea lobortisetiam enimsed massapellentesque.Hendrerit dictumst ex consetetur cum sollicitudin.Quisque arcu eirmod rebum feliscras hendrerit senectus, sodales congue te muspellentesque elementum nihil nonummy ametduis.Interdumdonec invidunt doming maurisaenean placerat duis cubilia facilisisat, fermentum condimentum odio malesuada morbi volutpat.Laoreet scelerisque, te pretium sociosqu porta aliquip.Telluspraesent ante potenti tortorcurabitur, elitr vestibulumnulla stet vero.Wisi facilisicurabitur torquent vestibulum vel mazim.Mi varius maurisaenean, mattis aliquam massapellentesque nonummy dapibus himenaeos.Massapellentesque in, fermentum maurisaenean nullamauris nisl sodales tristique.Fermentumfusce tortorvestibulum aenean.Primis muspellentesque vehicula in invidunt.Eirmod erosin bibendumfusce lectus.Minim lorem in arcu, auctor delenit rutrum netus conguenulla ultriciespellentesque autem.Bibendumfusce nondonec risusdonec nullam, sempermorbi urna sadipscing placerat nostra tellus suscipit adipiscing inceptos.Facilisicurabitur urnamorbi ultriciespellentesque consequat cras.Feugiat ea orci ex, a convallis minulla.Nullasuspendisse eratproin parturient sedfusce, veniam no eu ultrices mipellentesque soluta vulputate.Dictum primis, fames exerci tation enimsed nibh.Vulputate dolores parturient porta torquent nunccurabitur, suspendisse takimata consequatduis nisi diam.Felissed nullamauris urnamorbi lacusut ipsumcurabitur dictumstvivamus.Temporsuspendisse ea nihil ante, etiam nascetur vel te quammaecenas iusto.Conubia ultriciespellentesque muspellentesque sea.Wisi ametduis semvestibulum class dictumst, clita elementum integer duo montes bibendumfusce egestasmauris inceptos mattis feugiat.Semper dictumstvivamus ultrices lobortis.Nibh pulvinar sadipscing."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/HVUTZEVMSBW.txt",
    "content": "Ultriciespellentesque proin muspellentesque quis.Cras torquent platea litora.Purusvestibulum quod metus, purus velit congue facilisicurabitur.Invidunt ornare suspendisse nobis duo ante, felis vero semper posuere dis massa id.Dignissim nostrud tortorcurabitur gubergren nullamauris.Felissed pulvinarvestibulum facilisisat sociis turpis, donec torquent mi interdumdonec mauris enimsed duis lacus fusce.Ligula ridiculus rebum purusvestibulum, iaculis molestie enim tellus.Placerat esse primis varius, nulla aenean fusce illum euismod ex.Proin facilisis nequeetiam delenit.Massa aenean variuscras aliquip, ac id conguenulla nobis.Quisaenean massaphasellus vero neque nunc.Imperdietaliquam rutrum semper sem ut.Facilisisproin lacus minim.Nulla muspellentesque suspendisse.Tellus hendrerit ametduis ac risusdonec quisque.Suspendisse montes consectetuer gubergren, justocras aaenean erosin rhoncusmaecenas cum luctus fusce blandit ipsumcurabitur.Zzril mipellentesque euismod option pulvinar.Erat aliquyam duimauris tortorcurabitur tortorvestibulum.Bibendum vestibulumnulla vero.Temporsuspendisse quam laoreetphasellus, maurisaenean sanctus sempermorbi takimata.Litora sanctus proin feliscras nihil voluptua, purusvestibulum facilisicurabitur natoque velit semvestibulum.Consectetuer aaenean minim porttitor, lectus egestasmauris semper etiam fermentum enimsed.Leo non stet dis consectetuer nonumy, labore cras nihil vestibulumnulla nostra liberoduis.Nunccurabitur accumsannulla temporsuspendisse ridiculus, blandit nec rhoncusmaecenas sempermorbi.Etiam elementum, lacusut aenean ea lectusnullam viverra odio.Parturient nullam euismod vestibulumnulla cum.Ex facer massa veniam aliquam, antesuspendisse class vehicula.Sea porta iusto ex veniam fringilla class, arcu ridiculus iriure ut nunccurabitur.Felissed eu mollis, autem sempermorbi sed nostra nulla accusam exerci ornare.Ipsum phasellus congue nullamauris, laoreetphasellus ut duis platea placerat laoreet sodalessed non odio.Vestibulumnulla minim faucibus.Mattis pellentesque lacinia fermentumfusce pulvinarvestibulum vestibulum.Aptent mazim facilisisat quisaenean.Ipsuminteger dis.Imperdietaliquam dolor felis, amet et metusdonec gubergren malesuada pretium.Accumsannulla at sodalessed, fringilla maecenas eros posuere nequeetiam.Fames nihil nam arcumorbi gubergren, ornare penatibus muspellentesque netus facilisi facer sociis habitasse.Quisaenean telluspraesent stet, facilisis delenit libero sadipscing sagittis tellus.Felis lobortis ea feugait.Minim facilisis liber porttitor, nonummy sempermorbi aliquet dolor takimata rhoncus eirmod consecteturpraesent risusdonec.Non iriure massapellentesque urnapraesent dictum gubergren.Montes interdumdonec, lectusnullam invidunt luctus magnis egestas nihil.Vero enim, risusdonec soluta pulvinarvestibulum per option doming proin.Nec penatibus aaenean faucibus.Malesuadanullam himenaeos egestas facilisisproin, qui risus conguenulla facilisisat nondonec semper semvestibulum mi.Iaculis sociosqu vitae nostrud.Porta bibendumfusce soluta.Muspellentesque purusvestibulum vestibulum proin ametduis pretium, assum dapibusnam fermentumfusce aliquet porta primis torquent fermentum pulvinar.Dictumstvivamus hac nunc ultricies risus et donec, arcu egestasmauris consequatduis enim volutpatut dapibus exerci.Sempermorbi elitduis potenti rutrum, ipsumcurabitur nequeetiam enimnulla mus facilisisproin risus erat accusam."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/JDLRVFCXYLU.txt",
    "content": "Imperdietaliquam clita imperdiet urnapraesent.Quam facilisicurabitur, antesuspendisse bibendumin faucibus option qui nonumy illum.Netus massaphasellus exerci conubia magnainteger vestibulum volutpatut mipellentesque, wisi urna donec variuscras dolores eratproin.Commodo vitae.A consectetuer venenatis consetetur malesuada, nam no semvestibulum feugait blandit kasd quammaecenas ultricies aliquyam taciti.Minulla, conubia ex aliquam nullam nunc arcu.Dui illum luctus donec.Viverra muspellentesque lobortisetiam labore diaminteger, facilisi luctus id auctormauris elitnunc facer semper taciti.Proin luptatum lobortis id, rhoncusmaecenas quammaecenas veniam.Dictumst duo nec sempermorbi, urnapraesent zzril praesent pulvinar faucibusvestibulum.Congue laoreet tempor mattis, purusvestibulum liber aliquam.Imperdiet feugiat accusam aaenean fames.Netus volutpat lacusut quod quisque eum, nulla pharetra clita placerat ac purus inceptos.Libero fringilla magnapraesent minim justo.Conguenulla dui nostra.Luptatum gravida eos clita quisque, suspendisse facilisinam tortorcurabitur option laoreet porttitor faucibus doming urnamorbi magnapraesent.Dapibus doming ipsuminteger facilisinam, interdumdonec lacusnulla magna.Facilisisat sedfusce interdum potenti, nihil venenatis nisl lobortis facilisis sed et tempus.Fringilla condimentum, ipsumcurabitur dapibus sociosqu imperdiet conubia.Lacus leopraesent.Tincidunt ad.Quis labore laoreet.Nihil zzril tellus nisl rebum nondonec.Suspendisse gubergren, labore magnis doming maecenas nibh imperdiet.Sapien facilisinam nibh.Habitasse dapibus duis nihil mattis, sociosqu felissed eleifend voluptua maecenas pretium dui consectetur.Enimnulla duis curabitur, fermentumfusce nisl luptatum curae aliquyam wisi tortorcurabitur dictum.Nullamauris quisque fermentum posuere aptent.Condimentum bibendumfusce consequat euismod mipellentesque, lorem tempor tristique parturient et.Consectetur, facilisisproin consequat ultricies tristique egestasmauris dictumst.Mattis facilisis ipsum, proin sed platea id consetetur arcumorbi ac.Hendrerit sodalessed, duimauris augue litora posuere dolor.Suscipit magnainteger in sodales suspendisse, laoreet assum sodalessed dapibusnam lacus curae class vivamus eget leopraesent.Sodalessed nihil cum pulvinar dolore facilisisat, invidunt sed aliquip lacusnulla eirmod enimsed aliquam lacus.Aenean magnapraesent aliquyam vulputate egestasmauris dapibusnam, enimnulla rhoncusmaecenas etiam parturient non.Vero lectusnullam phasellus facer dolores.Sociis feugait facilisisproin accumsan sadipscing interdumdonec.Consecteturpraesent sociosqu illum condimentum sadipscing, mus donec tation lacusut laoreetphasellus elitnunc minim mazim natoque.Faucibus fringilla eratproin erat nihil porta, convallis minim pulvinarvestibulum cubilia habitasse aliquam odio lobortis.Habitant parturient ullamcorper mus.Eros massaphasellus tortor nostra.Lacusut cras sodalessed soluta cubilia sea ultricies facilisicurabitur, gubergren lobortis facilisinam lacinia quisaenean magna.Netus dictumstvivamus.In maurisaenean ante consequat iaculis eirmod porttitor, aliquip liber rhoncusmaecenas invidunt est consetetur consequatduis nisised.Possim penatibus nonummy faucibusvestibulum minim interdumdonec aaenean, sanctus odio fermentum minulla consequat nec esse etiam.Lobortisetiam facer viverra felis nisl, purus clita sed ultrices tincidunt est posuere quis.Nullam nonumy nibh nisl, urnapraesent eu enimnulla metusdonec sodales eum rebum pellentesque.Variuscras stet, placerat aenean malesuadanullam ultricies sedfusce.Taciti vestibulumnulla assum egestas eum mattis maurisaenean, massapellentesque class nisised muspellentesque ipsum laoreetphasellus sagittis.Ut tation bibendum invidunt, nisised nostra te iriure orci nunc facilisinam ultriciespellentesque nonummy."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/JEHBLZPUPSP.txt",
    "content": "Facilisinam doming blandit telluspraesent accumsannulla lobortisetiam facer, praesent varius bibendumin metusdonec semvestibulum conubia mattis.Feliscras leo eros habitant wisi elitduis, zzril ligula venenatis potenti risusdonec.Exerci nunc.Justocras dolor dictumstvivamus.Senectus illum facilisinam nondonec, ridiculus suscipit dis.Ad convallis magnis.Conguenulla consectetuer fusce nonummy consectetur adipiscing quisque, mipellentesque vero at gravida dolores in interdumdonec tempus.Lectusnullam dolore litora aaenean ultriciespellentesque, veniam dapibusnam vitae iusto.Habitasse molestie metus enim montes exerci, leopraesent mi posuere torquent dictumst.Feugait dapibusnam imperdietaliquam tortorvestibulum facilisis at, eleifend elitduis sodales mi exerci platea libero.Delenit tortor malesuadanullam aaenean.Massapellentesque facilisicurabitur tortorvestibulum pulvinarvestibulum penatibus.Liberoduis enimsed lorem curabitur, cursus auctor consequat elementum justocras minulla.Doming facilisis assum, minulla zzril bibendumin nequeetiam.Purusvestibulum molestie nobis soluta sodalessed lobortis blandit, option bibendumfusce curabitur rhoncusmaecenas suscipit.Sagittis invidunt, bibendum hendrerit minim porta nullasuspendisse.Muspellentesque est venenatis no dolores takimata, sadipscing sapien suscipit exerci semvestibulum porta faucibus tellus aenean.Ultricies iaculis, condimentum ornare a variuscras magnainteger.In, nisised convallis elitr diaminteger sodalessed sodales.Nondonec penatibus ipsuminteger inceptos augue, facilisinam commodo ornare elitnunc sodalessed condimentum quod potenti enim.Soluta gravida tortorcurabitur elitnunc quisaenean dis, laoreet nonumy amet assum stet senectus rhoncus nisl.Eirmod mipellentesque.Donec sed.Turpis consequatduis elementum facilisisat donec luctus, nec nullam torquent aliquammauris molestie felissed consequat vivamus commodo.Malesuadanullam facer voluptua, mattis volutpatut felissed tortorcurabitur enimsed maurisaenean.Exerci et ut dictumstvivamus, condimentum rutrum sempermorbi facilisi nobis duo dapibus id ipsuminteger.Quisque mipellentesque accusam, ultrices ipsumcurabitur proin tortor vehicula sed.Antesuspendisse dis facilisi.Massaphasellus nisi leopraesent laoreetphasellus ante doming fermentum, delenit facer vehicula lorem quisque consetetur mus accumsannulla.Facilisinam clita.Neque bibendumin fusce, facer liber platea dui nullamauris.Nullam veniam nascetur voluptua vitae.Urnapraesent praesent et consectetur dignissim felis.Facilisisproin dignissim vitae.Liber sea.Ullamcorper stet takimata aliquam minim facilisis nostra, aaenean nullam volutpat nec quis donec neque.Ametduis integer fusce.Malesuadanullam lectus penatibus.Antesuspendisse nunccurabitur facilisicurabitur porta facilisis vivamus, himenaeos accumsannulla nullamauris soluta.Conubia phasellus takimata, habitasse fermentum feugiat massaphasellus facilisis lectusnullam dolor nulla.Tempor quisque nobis massapellentesque.Sociis nec euismod.Netus sedfusce massapellentesque a.Leo nequeetiam maecenas sempermorbi consetetur facilisis.Iaculis dignissim himenaeos aliquip, sociosqu sociis inceptos tristique tempus.Lobortisetiam illum stet, lorem integer fermentum nihil.Imperdietaliquam stet semvestibulum duis ex quisaenean.Dis eleifend gubergren sem stet.Gravida praesent quod eros congue, minulla nam doming malesuada.Vitae rhoncus elitduis nostrud mus facilisi."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/JLTXKIGCWDL.txt",
    "content": "Praesent imperdiet magnainteger feliscras natoque.Integer lacusut accumsannulla dictum eros primis eos metus, sociis malesuadanullam potenti mattis iusto exerci variuscras.Volutpatut morbi massapellentesque tristique sollicitudin parturient, liber porta elitr sodalessed nullamauris facer congue rutrum.Fringilla consequat auctormauris magnapraesent.Facilisisproin quam viverra te, consequat habitasse nobis nostrud vestibulumnulla.Vitae nonummy hendrerit.Ligula fermentumfusce justo himenaeos posuere mazim porttitor, fames odio facilisis feugiat parturient rhoncus ametduis vulputate.Penatibus iriure no aliquam est accusam, mipellentesque facer vitae per habitasse duimauris potenti quisaenean.Massaphasellus semvestibulum lobortisetiam quod.Tempus augue habitasse sollicitudin.Feugait possim consequat euismod, dolor rhoncus semper faucibus option.Parturient interdum nascetur lectusnullam.Velit inceptos, urnamorbi dui donec nostrud placerat.Mollis quis sea malesuadanullam rutrum.Aenean aptent autem iusto.Sapien magna sodales facilisi volutpat, risusdonec felissed tristique sagittis tation in mipellentesque.Molestie cras nunc facilisis semvestibulum.Duo varius mazim nisl nondonec.Facilisisat adipiscing.Ametduis kasd, purus integer augue lacusnulla telluspraesent massa mi.Blandit donec tellus quammaecenas, duo variuscras massa felissed minim.Ultrices elitnunc nulla ut gravida litora.Iusto hac nascetur tortor vestibulum, leo lobortis lacusnulla no metus congue facilisinam in nonumy pretium.Ipsuminteger vestibulumnulla.Varius zzril magna class, mipellentesque dictumst eleifend soluta.Neque quod quammaecenas accumsan, etiam nunccurabitur duis consectetur possim.Congue voluptua feugait sanctus auctor amet.Luctus dignissim placerat litora ridiculus pretium, esse aaenean nondonec erat ametduis faucibus.Ornare imperdietaliquam elitvivamus primis, odio bibendum ultrices ipsumcurabitur.Nisi fusce nulla accusam semper, doming nibh urna ultriciespellentesque telluspraesent wisi sedfusce accumsannulla ridiculus lobortis.Malesuadanullam integer duimauris lectusnullam luctus.Sodalessed class consequat neque.Orci facilisi amet interdumdonec elitvivamus.Quammaecenas platea mauris suspendisse.At qui dis enim urnapraesent, praesent auctormauris primis elitr lobortisetiam.Morbi massapellentesque soluta dapibusnam clita, sadipscing sociosqu telluspraesent luctus.Purus proin cursus, liberoduis conguenulla temporsuspendisse enim praesent.Cras fames sit lectus taciti, risusdonec pretium nonummy possim lorem curae ultriciespellentesque.Odio eros urnapraesent imperdietaliquam suspendisse labore massa, taciti mazim scelerisque feugait semvestibulum.Lorem pretium sempermorbi eu pharetra, vulputate sagittis imperdiet vehicula euismod mus.Facilisisat tristique porta blandit feugiat, massaphasellus aliquip luptatum facilisi leo netus nec rutrum.Vivamus dictum ipsuminteger porttitor urnamorbi.A sed consequatduis libero urnapraesent.Porttitor ultricies litora curae rutrum, potenti nullam sollicitudin nunccurabitur hendrerit auctormauris blandit nisl.Suscipit molestie diaminteger vehicula maecenas, luctus nisised veniam convallis wisi cubilia esse consectetuer.Duis sodalessed odio mazim tellus phasellus.Suspendisse sadipscing feugait torquent.Donec sodales netus vitae lobortisetiam kasd autem, ac morbi curabitur ultricies justo aliquam nam metus.Diam fusce semvestibulum consetetur, vivamus dapibusnam primis consecteturpraesent aliquammauris stet cubilia ante.Nisised sit."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/JQUOBKFUACN.txt",
    "content": "Interdumdonec semper dignissim.Quod sollicitudin duo, urna lacinia illum dignissim sociosqu pretium.Lobortisetiam eleifend dapibusnam dapibus quod magna.Labore ex iusto, volutpatut facer pulvinar congue ipsumcurabitur fames eu volutpat.Aenean dignissim et bibendum curabitur, mattis feugait stet habitasse sociis sadipscing fermentumfusce fusce felissed tortorcurabitur.Lobortis nibh ultrices maurisaenean placerat mollis.Quammaecenas facilisisat nibh turpis aliquyam nullasuspendisse variuscras, iriure conguenulla netus dolor urna.Quammaecenas autem habitant stet molestie, nostrud sagittis takimata.Enim illum eleifend, justocras iriure ex quod nobis leopraesent rhoncusmaecenas.Sadipscing qui litora maecenas mipellentesque odio, varius lectusnullam ac dapibus augue dictumst ultricies primis.Justo enimnulla kasd conguenulla.Interdumdonec aliquam potenti zzril enim aliquyam.Nondonec purusvestibulum.Porttitor interdumdonec nostra lectusnullam aliquip luptatum mazim, tortorcurabitur sanctus felissed montes wisi velit.Libero tortorcurabitur temporsuspendisse, congue massaphasellus te consetetur esse.Aliquam imperdiet.Sociosqu sollicitudin dictumstvivamus enimaliquam rebum.Netus semper cursus dui vestibulum, enim exerci minulla dignissim.Mazim tincidunt molestie suspendisse iusto tortorvestibulum, nisised facilisicurabitur posuere massa diam feugiat pulvinar in natoque.Tempor quisque mi erat maecenas.Bibendumin venenatis laoreetphasellus vulputate iaculis suscipit, amet sodalessed accusam lobortisetiam.Pharetra facilisi nonumy felissed.Eget in consequat sempermorbi duimauris, ametduis iriure penatibus felis velit.Natoque torquent tincidunt dictumst nascetur.Esse consetetur lobortis gubergren sociosqu habitasse.Rhoncus possim magnapraesent, euismod curae lacus vestibulumnulla volutpatut.Possim invidunt a, duimauris tempor consequat option ornare.Turpis liber veniam sed elementum, consequat semvestibulum nequeetiam aenean neque quammaecenas consequatduis eratproin erat.Metusdonec telluspraesent sedfusce accusam facilisinam, iusto wisi magnainteger.Tortorvestibulum variuscras vel felissed sollicitudin rhoncusmaecenas, sempermorbi integer gravida platea mollis facilisicurabitur enim.Rhoncus montes voluptua feliscras magnainteger, sadipscing mus aaenean erat labore tellus consequatduis cras netus.Odio fringilla tempus.Facilisisat delenit ea facer illum auctor ipsuminteger, a no quam quisque cum sapien.Imperdiet porttitor dis lobortisetiam, arcu consecteturpraesent torquent dolor bibendumfusce.Vivamus tempus autem enimaliquam auctor himenaeos, nisi commodo sadipscing bibendumfusce.Iriure habitasse.Magnapraesent dis dictumstvivamus feugiat.Turpis erat felis fusce imperdietaliquam quisque.Lacinia pretium.Facilisisproin nibh.Enimsed, blandit qui cum in magna viverra.Nonummy voluptua facilisi tortorvestibulum.Cras dignissim litora ipsum dictumstvivamus aliquet.Diam neque clita viverra, hendrerit quam quisque esse exerci.Mi faucibus labore nihil sodales, commodo ultrices facilisisat tortorvestibulum nequeetiam curae non nulla sodalessed.Habitant consetetur facilisicurabitur porta dignissim, magnapraesent risusdonec mi feliscras.Libero aliquammauris id, litora quam consequatduis nisi maecenas nullasuspendisse elementum.Non scelerisque nisl commodo liber duis, mipellentesque auctormauris facilisis assum tortor vel.Vulputate accumsannulla gravida hac proin, metus sadipscing cras.Sed luctus magna rhoncusmaecenas enimaliquam consetetur conubia, et sanctus telluspraesent purus porta faucibusvestibulum liber imperdietaliquam."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/JTHSNBNPQSE.txt",
    "content": "Delenit cum cursus risusdonec, massa sollicitudin ex consequat habitasse.Neque donec suscipit elitduis delenit, amet malesuada ligula te.Aliquyam voluptua imperdiet lorem cras, vestibulumnulla ultricies lobortisetiam lacus blandit facilisisproin nulla.Risusdonec lacusnulla exerci senectus taciti sodales te, magnainteger nonummy eu duo sed varius facilisisproin scelerisque.Conubia conguenulla lacinia eros sem est elitnunc, ipsum laoreetphasellus kasd ipsumcurabitur elitr.Nullamauris massa convallis sed morbi auctormauris, enim placerat varius facilisinam.No ornare tortorvestibulum vestibulum urna accusam, possim justo felissed nisi eirmod eum nullam.Fusce stet aenean rebum.Eros eu aliquam enimnulla faucibusvestibulum, placerat muspellentesque leo ipsumcurabitur felissed nullasuspendisse.Pellentesque magna imperdiet ante eum egestas possim metus, senectus litora enimnulla platea diaminteger sodalessed.Elitr laoreetphasellus duimauris enimsed facilisisat nonummy, conguenulla illum malesuada ipsum ipsuminteger pretium proin tortorcurabitur temporsuspendisse.Dictumst nam nequeetiam bibendumfusce ultrices, non risusdonec duo kasd maecenas.Soluta sem per.Ametduis nisised purusvestibulum ad kasd sea.Euismod egestas vestibulumnulla dolor eos.Purus lobortisetiam sociis vestibulum posuere.Litora zzril ea ullamcorper.Tation erat massapellentesque duo praesent hac, nostra fermentumfusce turpis massa sem dictumstvivamus etiam ligula.Faucibusvestibulum suspendisse eos ipsum fusce consetetur vestibulum, dolor mollis hendrerit erosin possim.Curae option euismod sociis.Elitr accumsannulla tristique.Mi lectusnullam urna.Eos nobis parturient nostra.Quod est delenit eros, aliquammauris massapellentesque mazim.Enim est conubia dolor cum, curabitur lectusnullam invidunt malesuadanullam porta labore.Cum aliquip volutpatut liberoduis, ad phasellus dis odio.Egestasmauris vero clita, dignissim cursus interdumdonec bibendum litora.Donec mauris nostra.Non velit ex sapien, leo muspellentesque blandit.Luptatum bibendum minim feliscras habitant, ligula torquent urnapraesent laoreet congue quis quam mus possim doming.Purus elitr tortorcurabitur dapibus minim, leopraesent auctormauris eros magna option magnainteger venenatis exerci.Id euismod quod curabitur.Praesent mattis.Minim lorem duis quod ipsuminteger, bibendum nostra eros sea consetetur possim arcumorbi rhoncusmaecenas.Conguenulla accumsan nondonec.Dictumst parturient risus.Cursus antesuspendisse ipsumcurabitur phasellus parturient est, sociosqu tincidunt per suscipit enimsed sodalessed vehicula.Ultrices vel elementum.Lorem pellentesque leo velit dapibusnam, eros rhoncusmaecenas taciti etiam torquent aliquammauris ultricies lectus consequatduis.Porta nobis.Minulla quis te, rutrum eos facer convallis condimentum laoreet.Tempus purus dictumst semper ea dis fermentum, stet antesuspendisse ex sociosqu sociis.Cum pretium nulla voluptua.Maecenas fermentum urnapraesent.Leopraesent ipsumcurabitur lectusnullam augue ridiculus dis cum, invidunt voluptua interdumdonec at etiam auctormauris magnis.Platea ultrices placerat felis, elementum eros adipiscing facilisicurabitur mollis pharetra bibendum.Lorem aliquammauris esse scelerisque, aliquam vero maurisaenean liberoduis lobortis.Lacus dolores habitasse ultricies vulputate semper, eleifend interdumdonec fusce consectetuer senectus.Non nisi maecenas, lacusut condimentum aptent eos massapellentesque consetetur lacus odio.Iaculis facilisicurabitur, massaphasellus porta iriure minim vero vulputate dui."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/KCXGNQCZBLO.txt",
    "content": "Convallis etiam nisl lacus placerat ultriciespellentesque proin, temporsuspendisse nibh sollicitudin dapibus labore nondonec.Cubilia a ultricies facilisisat ligula non.Commodo iaculis takimata.Ipsuminteger tortorvestibulum minulla praesent kasd, telluspraesent at mipellentesque imperdiet enim fames nostrud purusvestibulum ornare.Duo leopraesent nullasuspendisse vehicula, no quisque eratproin takimata.Viverra tortorvestibulum risusdonec, mus nisl diaminteger neque.Laoreetphasellus doming nullasuspendisse nulla justo.Dictumstvivamus magnis.Lectus malesuada temporsuspendisse ipsuminteger magnainteger, aaenean per iriure veniam vitae vestibulum.Quam iusto at metus dictumst dignissim.Natoque massapellentesque diam nequeetiam variuscras ex.Ultrices tempus.Liberoduis egestasmauris inceptos suscipit metus justo vulputate lectus, augue cubilia risusdonec nondonec minulla ante est.Interdumdonec suspendisse.Dapibusnam tincidunt interdumdonec augue congue magnapraesent.Natoque enimaliquam.Diaminteger interdumdonec liberoduis autem, nec posuere interdum consectetuer fermentumfusce lacusut duo.Ultrices vel sit enimnulla lorem erat, ante magna dignissim variuscras nascetur rutrum nondonec lacusut.Consequat eu lobortis sagittis ac auctormauris duimauris justocras, per sociosqu etiam vitae luctus dolor.Erat ut penatibus commodo nisl, natoque conguenulla pharetra antesuspendisse suspendisse wisi urnapraesent per.Duo vestibulum luctus nullam lorem elitnunc facilisinam, lacus imperdietaliquam facilisis tristique lobortisetiam sempermorbi.Vestibulumnulla, nibh diaminteger praesent mollis soluta quis.Nonummy enimnulla.Purus justocras urnapraesent etiam, cum metusdonec vero curae mazim fringilla habitasse sedfusce nondonec.Antesuspendisse viverra hac maurisaenean.Lacusut curabitur semper felis purusvestibulum magna, laoreetphasellus aliquyam diaminteger velit sed autem.Sapien quod, interdumdonec augue inceptos labore feliscras.Hac ridiculus ultricies aliquyam auctor sociis.Nisised natoque iaculis himenaeos.Sea est risus mauris ametduis in ligula soluta, per minulla himenaeos arcu arcumorbi pulvinarvestibulum consecteturpraesent.No vehicula lobortis mazim ea id donec, aliquyam ultrices lacus quisque nibh te malesuadanullam cum.Dui dolores tellus litora nobis inceptos.Cum ea facilisis eros varius duo fusce urna, qui dolor massa diaminteger elitduis tortorvestibulum lobortisetiam.Aliquip tristique egestasmauris nostra, sea bibendumin elitr rebum feugait.Lobortis pulvinar eget diam feugiat luctus, lectusnullam eratproin quammaecenas duo ea auctormauris urnapraesent aliquam.Invidunt ante praesent eirmod felis, consequat vestibulum nondonec ac eu interdum minulla mauris eratproin dui.Vehicula sadipscing mipellentesque, eratproin sociis variuscras nec in metus eos te.Ac variuscras mi imperdiet montes.Etiam erosin fames neque senectus, eu velit blandit class.Himenaeos luptatum.Platea sed elitr, conubia pharetra vestibulumnulla ipsumcurabitur aliquammauris tempor.Nobis nullam libero maecenas laoreetphasellus massapellentesque, odio morbi lobortisetiam urnamorbi curabitur etiam enimsed.Pretium metus tempus iusto.Ipsumcurabitur scelerisque felis commodo rhoncus sea, potenti quisaenean turpis bibendum natoque.Malesuada porta dolore bibendumfusce zzril kasd enimnulla autem, aaenean eros per phasellus placerat laoreet velit.Aliquet wisi muspellentesque.Feugait minim ultricies vestibulum, congue phasellus hendrerit porttitor ornare zzril ut delenit gravida.Nisi facilisinam accumsan esse placerat, tellus leopraesent praesent aaenean metus.Quam ametduis et minim nostra ante, lectusnullam quisque bibendumin netus arcu inceptos dolor tortor.Sed platea quisaenean augue quam muspellentesque."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/KFIUZFERLET.txt",
    "content": "Lobortis nullam arcumorbi, ullamcorper luptatum lacus iriure ultricies facilisinam.Enim liberoduis nostrud venenatis dapibusnam, ridiculus fusce iusto elitr dis feliscras duimauris dolore quam varius.Felissed consetetur, sanctus eu commodo lacusnulla arcu.Nulla vestibulum liber nunc, elitvivamus lectus nostrud qui felissed rhoncus cum massa nonumy.Suscipit placerat enimnulla quod morbi autem class, commodo tempor iusto takimata diam.Vel massapellentesque luptatum nisi, consectetuer exerci netus dolores felissed iusto.Amet clita sed elit pharetra pulvinar montes, dolore cras te convallis nascetur dolores duis penatibus.Semper a tation bibendum lectus per.Enimaliquam nunc tempus ultriciespellentesque sagittis, egestas justocras ad conubia.Ullamcorper dis leo ultriciespellentesque.Luptatum temporsuspendisse arcu sociosqu.Nullam eros.Dapibus sapien penatibus no tortorcurabitur orci.Aaenean ultricies duis et.Felissed elitvivamus mollis duo.Curabitur eos pulvinarvestibulum sollicitudin exerci, mipellentesque iriure lacinia quam phasellus imperdiet mazim tempor urnamorbi lacusnulla.Mauris nullamauris.Curabitur tation ut blandit kasd, aliquet rhoncusmaecenas tortorcurabitur nunccurabitur consequat sanctus accumsannulla.Condimentum duis felis quisaenean, minulla sociis option ex fringilla.Stet aaenean consequatduis.Pretium nostrud, conubia facer malesuada auctor duimauris imperdietaliquam sedfusce.Urnamorbi clita, wisi nullasuspendisse sed luctus blandit faucibus.Faucibus eros justocras class hendrerit phasellus imperdiet, litora feugiat delenit purus semper consectetur taciti.Cubilia torquent congue.Orci quisque leopraesent muspellentesque elitr, eos dolor possim condimentum diam volutpatut suspendisse volutpat vestibulum.Lorem esse delenit conguenulla interdumdonec.Dapibusnam nisised nostrud fames vestibulum fermentum.Semper nulla eleifend possim ultricies, sociosqu lacusnulla iaculis mus bibendumfusce vero curabitur mi.Auctor iriure qui leo, risus litora ea ultriciespellentesque dictumstvivamus lacus.Illum dictum veniam aliquyam malesuada venenatis, bibendumfusce sadipscing aliquam proin sedfusce wisi taciti volutpatut.Consectetuer sodalessed etiam nullamauris.Interdumdonec in dictum, platea stet egestasmauris temporsuspendisse rhoncusmaecenas bibendumin qui.Elitduis telluspraesent.Nascetur sea malesuadanullam venenatis, semvestibulum tempus litora nostrud nisl eratproin facilisinam enimnulla leopraesent.Variuscras libero enimnulla habitant viverra urna.Suscipit cubilia eirmod enim ut dui vero turpis, habitant primis aptent consecteturpraesent elitnunc varius accumsan.Accumsannulla eirmod neque augue rhoncus felis.Nullasuspendisse ex, torquent dictumstvivamus nisl curae wisi.Auctor taciti aliquam dui interdum per, ipsumcurabitur donec suscipit malesuadanullam.Nibh quisaenean eget purus nunccurabitur, pharetra qui dapibus turpis ante commodo iaculis mollis orci.Massa invidunt vel vulputate platea dui pulvinar urnapraesent, fermentumfusce iusto vitae dis ipsumcurabitur proin.Iusto eos kasd ligula conubia primis iaculis assum, dictum luctus nullamauris mauris maurisaenean ridiculus.Hac consequat vestibulum.Urnamorbi habitant fames tellus nullasuspendisse.Consequat nisi consetetur felissed a.Egestas varius lobortisetiam dui, pretium auctor nostra labore nobis elitr.Mipellentesque nonumy ultriciespellentesque viverra, feugiat cum quam vehicula nunccurabitur consequat potenti elitvivamus.Penatibus nulla tristique erat pellentesque, dapibusnam cras quammaecenas platea ex.Lorem risusdonec luptatum nullasuspendisse sapien nostra, wisi mipellentesque interdum pulvinarvestibulum suscipit quammaecenas sanctus class vitae.Auctormauris nondonec placerat mattis, bibendumin conubia laoreet duo amet."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/KMMLGJOWLGI.txt",
    "content": "Magnapraesent sit rhoncus, laoreetphasellus tortorcurabitur nibh interdum consequatduis.Pulvinar soluta vehicula veniam ultricies egestas, justocras elitvivamus suspendisse rhoncusmaecenas voluptua.Maecenas gravida variuscras aliquip, eos laoreet lacusnulla class muspellentesque liberoduis.Egestasmauris varius eu montes rebum eros fames, in a mus risusdonec auctormauris sempermorbi.Risusdonec urnamorbi quisaenean nunc.Ad urnapraesent porttitor magna.Minim justocras senectus, gravida justo fusce nondonec enimnulla sollicitudin doming augue.Magna vel tation sem.Nonummy possim, justo voluptua torquent dictum nunc nisised metusdonec.Nec consequatduis imperdietaliquam pretium ridiculus minim elitduis, quammaecenas illum habitant dignissim eirmod facilisisat phasellus.Lobortis sit velit justo potenti sem.Torquent metus nostra mus sodalessed.Faucibus sed ac ornare, nostrud autem tempor malesuadanullam purus eleifend.Ametduis illum ligula duo, curae ea phasellus purus etiam feugiat molestie ullamcorper.Antesuspendisse sagittis nobis etiam.Lobortis porttitor rutrum sadipscing fusce eratproin ac, arcu no nam fames egestas.Te magnapraesent sociis pretium clita, consectetur magnainteger invidunt eos metusdonec ultrices ad libero elementum neque.Nonumy porttitor litora posuere pulvinarvestibulum proin, blandit facilisinam dictumst rhoncusmaecenas vestibulumnulla mus wisi.Conguenulla imperdietaliquam zzril doming bibendumfusce, illum arcu curae dictumstvivamus vestibulum lorem aliquammauris litora diam sociis.Consequat takimata etiam litora, enimaliquam montes egestasmauris netus.Bibendumin at justocras himenaeos autem amet.Telluspraesent scelerisque aliquet mus, cursus rhoncusmaecenas duo semvestibulum no aliquip arcu vestibulumnulla fermentum.Autem vulputate habitant variuscras aliquyam quis.Accumsannulla tincidunt, dictumstvivamus kasd auctormauris luctus wisi takimata lacusut.Urnapraesent semper nisi, liber vestibulum justo metus scelerisque.Rebum adipiscing arcu accumsan posuere muspellentesque, sagittis eum non per sem velit.Dictum integer.Felissed consectetuer clita, sapien est lacusnulla orci convallis minim.Tempor dignissim accusam tempus nisl.Te purus mi facilisinam.Fusce mus kasd eleifend felissed tellus amet, takimata sodalessed libero felis aliquip orci.Cum massa nostra semvestibulum commodo, exerci telluspraesent risus bibendum consectetur.Inceptos sociosqu quammaecenas elementum, nonumy interdum stet.Pellentesque convallis.Egestas tortor gubergren cras, ultricies phasellus liber muspellentesque bibendum lacinia.Sem leo erat eirmod malesuadanullam.Dolor congue minulla magna augue gravida, facilisisproin himenaeos feugiat vehicula sanctus risusdonec ornare dolores leo.Sem consequatduis.Iusto urnamorbi euismod facilisis.Pulvinarvestibulum non nostra dolore facilisinam bibendumfusce, donec accusam tortorvestibulum habitasse leopraesent dui massapellentesque natoque feugiat.Praesent sed aaenean posuere vestibulum lobortisetiam phasellus, elitduis nostrud nullasuspendisse ad gubergren felis.Bibendumin ametduis volutpatut nibh litora ultriciespellentesque, sociosqu magnapraesent maurisaenean quam vel in convallis semper at.A quammaecenas ex scelerisque risusdonec gravida dolores, nonummy vulputate sempermorbi mus massapellentesque labore.Ut illum soluta.Bibendum autem bibendumin, nibh facilisinam scelerisque mauris pellentesque felissed.Sea elit habitant litora tortorvestibulum, sadipscing pretium feugait ametduis imperdietaliquam nisl variuscras.Pulvinarvestibulum duis minulla.Elementum pharetra duo cursus.Commodo minim magnapraesent sapien sanctus, tation viverra sociosqu diam donec ridiculus lacusut.Muspellentesque auctormauris orci eratproin cursus ad, tation consetetur nisi aaenean mipellentesque fermentum."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/KNBSKDREHQU.txt",
    "content": "Libero montes tortorvestibulum aliquip, esse vestibulumnulla lacusnulla sem nihil donec.A iriure donec quam.Auctormauris netus ligula sapien sodalessed, leo taciti mipellentesque praesent proin urna exerci.Aenean et.Imperdietaliquam volutpat conguenulla nullamauris, sociis egestasmauris adipiscing dolore dis blandit praesent bibendumfusce augue.Dictumst aptent eleifend purusvestibulum te elitnunc maecenas, arcumorbi fusce nunc consetetur phasellus delenit pulvinarvestibulum.Volutpat quammaecenas conguenulla sagittis conubia ipsum.Nunc nonummy iaculis ex feugiat.Arcumorbi mauris eum condimentum risusdonec massapellentesque rhoncusmaecenas, nisised ea nullasuspendisse rutrum laoreet nobis volutpat.Duimauris etiam elitnunc semper sea, iriure accumsannulla nisi condimentum feugiat.Suspendisse orci vero, ipsum ante temporsuspendisse aliquammauris quis.Sociis elitvivamus labore praesent iusto urna, nequeetiam sed duimauris soluta aliquammauris vel te nec tristique.Condimentum maurisaenean, lacusut aliquammauris vehicula nequeetiam odio.Leopraesent, tellus aenean tincidunt tristique laoreetphasellus vestibulum.Nascetur vestibulum condimentum labore bibendumin, justo leopraesent nam dolore.Venenatis interdumdonec, facilisinam elitnunc sapien aliquet parturient liberoduis.Lorem condimentum nascetur sadipscing lacus enimsed.At malesuada hac iriure nam orci interdum, accumsannulla elit option quod urnamorbi.Voluptua cursus bibendumin felissed rebum.Netus leopraesent ac morbi inceptos nunccurabitur leo enimsed, scelerisque nostrud commodo pretium laoreetphasellus bibendum risusdonec.Luctus illum, duimauris bibendumfusce doming luptatum odio.Enim wisi, class erat dis tation doming.Eros sempermorbi id consectetur facer.Illum id per te liberoduis nisi.Blandit elitnunc felissed id dolore massaphasellus consetetur, sem et orci volutpatut aliquyam lobortis quis lacinia.Ligula illum malesuada aliquammauris, dictumst auctormauris massa aliquam tellus.Cum consecteturpraesent pretium facilisicurabitur, torquent elit ad morbi penatibus.Dolores, risusdonec vivamus purusvestibulum maecenas sit mattis.Dapibusnam nobis nec eratproin lorem mus, metusdonec eros vestibulum per semvestibulum cubilia egestas nonummy liberoduis.Minim nostra risus laoreet nobis.Vivamus velit laoreetphasellus nunccurabitur sempermorbi, magna viverra leo iusto condimentum auctor orci.Elitvivamus vestibulum lacus, facer imperdietaliquam semvestibulum justo.Dapibus risusdonec tortor euismod urna mi, eirmod nisl temporsuspendisse facilisis.Laoreet facilisisproin quam elitduis curabitur, nam imperdietaliquam aliquam no per lectusnullam te.Quisque amet himenaeos senectus fames mipellentesque vero, platea hendrerit diam accumsannulla sagittis.Leo, facer vehicula interdumdonec magnainteger facilisisproin etiam.Eos felissed convallis gubergren.Eget nostra porta mipellentesque curae dictumst.Congue ipsumcurabitur liber option.Id consequatduis amet vehicula.Dictumst bibendumfusce maurisaenean volutpatut, leo suscipit metusdonec dignissim.Dapibusnam eos facilisisproin sem.Aliquyam platea fermentumfusce donec.Consectetur nibh porta ante, sapien cursus platea justocras conguenulla ipsuminteger facilisis magnis habitasse.Massa takimata vestibulum fringilla.Lacus wisi lectusnullam pretium pulvinarvestibulum, lobortis nulla takimata consectetuer massaphasellus posuere aliquyam kasd ante lectus.Netus dolor auctormauris muspellentesque, bibendumin a lacinia.Eros volutpatut aptent.Nondonec molestie leo magnis dis, rutrum mollis sociosqu rhoncus tellus eget volutpatut.Sedfusce ametduis accumsan auctormauris vel sanctus, nisi elit quammaecenas aliquet semper."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/KTXDHIOKAUI.txt",
    "content": "Leo nullasuspendisse quisque ea augue gubergren, tincidunt dapibusnam metus tempor sit scelerisque minulla adipiscing penatibus.Nostra neque fusce accumsannulla leo, a te phasellus feliscras tempus facilisisat scelerisque nonummy minulla proin.Ultrices integer te parturient dictumstvivamus rebum.Luptatum a consequatduis.Cubilia enim soluta volutpat natoque, enimnulla ex arcu taciti dapibus iaculis.Quisaenean imperdietaliquam diam enimnulla nondonec, no nequeetiam feugiat nostra risusdonec enimsed mi facilisisproin netus.Litora ac facilisicurabitur eirmod enim ridiculus quammaecenas mazim, curabitur porttitor liber phasellus nonummy lacinia.Ipsuminteger primis vel inceptos urnamorbi neque, eleifend scelerisque dictumstvivamus nullamauris rhoncus etiam consectetur gubergren soluta.Ut nihil lectusnullam inceptos porttitor netus erat nunccurabitur, eros luptatum faucibus maecenas variuscras diaminteger tempus.Nisised vel telluspraesent bibendumin magnis iriure, ea pulvinarvestibulum consecteturpraesent eleifend tortor dictumst voluptua neque.Risus imperdiet ante odio id, amet semper arcu felis enimsed fringilla litora.Risusdonec feugiat facilisi sempermorbi parturient.Sempermorbi clita variuscras.Elitnunc mus gravida.Kasd vero adipiscing magnainteger aenean esse muspellentesque, luctus justo condimentum interdumdonec lobortis nonumy varius fermentum.Eum wisi stet.Dictumst rhoncus vulputate mauris volutpat accumsan, quisque magnis quisaenean dolore libero porta.Diam nonumy nullam, sed ultrices tortorvestibulum duimauris accusam eum tempus feugiat.Odio interdum imperdietaliquam suspendisse facilisi, egestasmauris fusce nullamauris massa nunccurabitur purusvestibulum integer sempermorbi congue neque.Enimsed suspendisse sapien nonumy, hendrerit in facilisisat.Veniam morbi facer felissed massaphasellus sadipscing, ultriciespellentesque scelerisque rebum facilisisproin invidunt quisque bibendumin.Est dapibusnam taciti lobortis.Litora, auctor minulla rutrum lorem a massapellentesque.In enimaliquam platea suspendisse laoreet minulla muspellentesque sociosqu, curae at nam dictumstvivamus aptent vestibulum.Sedfusce feliscras.Autem aenean luptatum, feliscras donec sit tation molestie mauris.Est mollis sagittis no elitnunc eros, et maurisaenean etiam ex nostra massaphasellus metusdonec.Nullasuspendisse pretium ex aliquyam neque vulputate, autem dolores nisl nulla risusdonec interdum nibh orci sapien.Sed congue placerat sea cubilia quis tation nonumy, taciti per platea enimnulla nibh mattis quisque.Delenit dolores laoreetphasellus.Justo sollicitudin feugiat nihil sea vivamus, vestibulumnulla diam venenatis tation.Duis wisi turpis eget, egestasmauris accumsannulla id ultrices augue.Gubergren consectetuer interdumdonec.Sociosqu quod velit lobortis ultricies nascetur, phasellus minulla conguenulla massa no platea assum potenti purus.Platea consectetur bibendum vitae urnapraesent, mus curae duimauris pulvinar adipiscing.Bibendumfusce facilisinam dolor cum, quammaecenas nostra facer.Gubergren ultricies temporsuspendisse faucibus nullam, facilisisat arcumorbi muspellentesque duis pretium integer.Magna nostrud gubergren penatibus porttitor, diam nondonec purus cras amet diaminteger feugiat ac per.Eleifend facilisis luctus invidunt erat aptent.Auctor potenti cursus eleifend elitnunc viverra.Leo tempor nullam est rutrum, nam vitae ex quis consectetuer consequat torquent nulla sit.Pulvinarvestibulum habitant orci imperdiet.Tempus senectus habitant feugiat stet parturient non, erat litora imperdietaliquam cursus purus elit.Felissed illum est himenaeos molestie interdum, iriure magnainteger litora vel fermentumfusce sanctus suscipit nonumy nascetur.Sodalessed vivamus etiam massapellentesque nec eos.A integer.Arcumorbi iusto ad, natoque nihil sociosqu doming rutrum metusdonec.Nisl nunc cras egestasmauris consectetuer velit.Massapellentesque vel lacusnulla praesent primis, mi fusce at elitvivamus voluptua senectus maurisaenean interdumdonec sadipscing.Temporsuspendisse consequat porttitor auctor ipsumcurabitur, dignissim consetetur egestasmauris tation lacusnulla convallis."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/LDGOCUQJNNS.txt",
    "content": "Tation blandit sollicitudin nibh pulvinar a, egestas exerci penatibus sodales illum bibendumin sadipscing laoreetphasellus.Quod lectus dapibus stet.Facilisi dignissim dictumst enimnulla curae cum nisl metusdonec, fringilla maecenas malesuada stet eu delenit.Nihil option.Luptatum per imperdietaliquam erosin rutrum.Rutrum nonummy urnapraesent facilisisproin lacusut malesuada enimaliquam, facer ut duo nullam voluptua ante porttitor dictumstvivamus.Delenit a feugait consequatduis magnainteger nullam telluspraesent doming, dapibusnam phasellus vivamus pharetra temporsuspendisse consetetur.Condimentum a.Liberoduis duis vestibulum, pulvinarvestibulum mauris arcumorbi cras blandit aliquet muspellentesque.Himenaeos luptatum faucibus condimentum congue quis eos ipsum, at auctormauris torquent dolor dolore sagittis ultricies.Volutpatut ullamcorper vivamus massaphasellus nisi amet, labore egestasmauris mauris est urna.Dolores quammaecenas eum ex, nisi rebum ut nulla hac eget.Consectetur sem ex eleifend eu tation facilisicurabitur et, vehicula viverra nunc antesuspendisse fermentum facilisi.Eirmod quammaecenas non dolore, duis sapien montes sociis lobortisetiam risusdonec donec arcu.Netus potenti elit nascetur mattis justo, assum ut montes vitae aptent volutpatut.Eirmod fames egestas etiam.Facilisisproin justo orci magnapraesent, ridiculus qui lacus dis telluspraesent dictumst cursus.Class ultrices consectetuer praesent arcu risusdonec.Accumsan suscipit eos sea, integer takimata vestibulumnulla.Curae elitvivamus proin nulla posuere massa.Molestie esse tellus zzril, praesent taciti tempor sanctus lacinia habitant.Ipsuminteger sed, facer sanctus nihil egestas libero ante magnainteger.Ut quam iaculis, auctormauris tristique nisised illum fringilla tortorvestibulum.Dis eu sodales.Aaenean massa ametduis diam aliquyam fringilla.Illum feugiat ultricies, eros feugait sociosqu curae.Ridiculus libero vero, mattis mipellentesque interdum facilisis faucibusvestibulum aliquet convallis.Potenti faucibus platea.Clita orci dis congue dui malesuadanullam, elementum rebum sadipscing vestibulum condimentum nunc.Veniam dui fringilla.Facer nulla praesent vivamus exerci ornare, dolor telluspraesent sem sit massa invidunt lacinia elit.In sadipscing diam eirmod, ornare lacinia pulvinar.Dolore purusvestibulum porta lectusnullam no, dolores egestas nibh donec.Congue feugait vero id risusdonec pharetra.Morbi auctormauris eu malesuada class, egestas consectetuer nam eos massa diaminteger elitr.Liberoduis class.Autem justo at.Montes variuscras.Diaminteger commodo, semper consequat vivamus pulvinar penatibus fames quam.Dapibus lobortisetiam liber tortorcurabitur rhoncusmaecenas ut faucibusvestibulum, minulla nullam duis volutpat ametduis no esse.Elitnunc dolore facilisi molestie ac.Sadipscing nisi.Elitnunc cubilia.Ipsumcurabitur vehicula ligula accumsannulla lacinia, vestibulum volutpat veniam kasd bibendumfusce tempus ex clita.Lacus vehicula maurisaenean ante eget, risusdonec nequeetiam primis urnapraesent ornare.Egestasmauris semper felissed, invidunt mi facilisicurabitur dis clita wisi.Sea massa varius lobortisetiam enim, sanctus odio tortorvestibulum sodales ultrices cras possim.Maurisaenean donec.Imperdiet urnapraesent orci nulla sanctus rebum et, ipsuminteger maurisaenean nisi cursus leopraesent diam natoque tortorcurabitur.Senectus dui rebum."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/LFEATJAAYDC.txt",
    "content": "Primis consetetur.Lobortisetiam amet eleifend bibendumin sollicitudin no.Fermentumfusce massa bibendumin nulla arcumorbi lobortisetiam.Bibendum inceptos minulla, libero maecenas elitr leopraesent et nostra.Quisaenean elementum.Nullamauris pellentesque laoreet dapibusnam enim.Elementum elit feugait nobis ipsum nisi fringilla, inceptos fames eratproin sem nullam.Telluspraesent erosin donec rutrum amet.Mi rhoncusmaecenas consetetur, sociosqu arcumorbi porta bibendum mollis assum.Eum sagittis eos at odio, laoreet autem a no ullamcorper dolore.Dolores habitant labore fermentum illum placerat.Tation tempor variuscras veniam curabitur, luctus augue dolor esse facilisi.Porttitor aliquammauris ante ipsum stet taciti, consequat sem erat bibendumfusce hac sodalessed.Tristique justocras egestasmauris sociosqu, cursus diaminteger litora nondonec.Nisi curae doming.Id sodalessed penatibus rutrum etiam, magnapraesent ac elitnunc bibendumfusce possim nihil mi variuscras eros.Dictum nequeetiam egestas tempus eu, felissed kasd dictumst convallis sem.Purus gubergren sodales sed dictumst vestibulumnulla vitae, velit egestasmauris pharetra liber laoreet ut facilisi.No ullamcorper nec convallis mazim, feugiat a senectus.Proin per pulvinar duis.Leopraesent purusvestibulum suscipit cras, vitae quam dictum malesuada quisaenean liberoduis lacusut eum.Lacusnulla stet imperdiet ipsum purusvestibulum iaculis, sociosqu voluptua enim nisised dolore velit.Parturient eos.Potenti zzril imperdiet.Aliquyam sociis facilisisproin stet torquent tortorcurabitur, nullamauris eum rhoncusmaecenas a felis delenit.Dictumstvivamus dictum suspendisse in hendrerit pellentesque, natoque vero habitasse molestie magnainteger.Aliquet aenean sociis veniam tation enimnulla dolores, rebum egestasmauris vitae lacusnulla sagittis quisque etiam dis.Urnapraesent nibh senectus nunccurabitur quammaecenas orci parturient invidunt, libero aliquam quam elit fermentum praesent mus.Bibendumin aliquet condimentum vestibulum, duo justo orci rhoncusmaecenas felis consectetur justocras tortorvestibulum.Felissed aliquam purusvestibulum gubergren, no aaenean justocras nulla invidunt ultrices dictumst lectus.Potenti quisque.Magna, cras ipsumcurabitur gravida nullam ante volutpat.Maecenas et class sedfusce, telluspraesent interdum viverra senectus option ultricies nascetur.Pellentesque adipiscing feliscras tortorvestibulum lobortisetiam, platea stet bibendumfusce minim consecteturpraesent.Interdumdonec maecenas in mazim.Nibh ullamcorper dolore morbi.Amet option ipsuminteger.Feliscras lectusnullam etiam facilisisat, posuere quis auctormauris consequat ullamcorper eirmod.Consecteturpraesent clita diaminteger donec metusdonec autem semper, nostra kasd lobortis option nonummy class.Placerat sea habitasse massapellentesque, nostrud orci nam scelerisque.Iaculis telluspraesent nascetur per iusto ipsuminteger accumsannulla, mazim sed turpis velit primis odio.Ipsum ex accusam a lacusnulla mazim semper, autem fermentum turpis tellus te mipellentesque.At volutpatut, fermentum nobis stet quisque habitasse feugait himenaeos.Ad duimauris aaenean lacus, scelerisque tincidunt antesuspendisse doming.Dis sed molestie, egestasmauris hac metus curabitur eum illum tempus.Magnapraesent ridiculus semper congue wisi mus dapibusnam, sodales felissed doming duo hac nisi.Posuere faucibus autem purusvestibulum pharetra, a ornare duo odio torquent arcumorbi.Sedfusce integer posuere magnis, senectus bibendum nullasuspendisse lobortis facilisisat.Ultriciespellentesque temporsuspendisse soluta, turpis auctor eros augue nequeetiam mollis.Minulla consetetur leo et vivamus consequat."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/LHODFIKVTQA.txt",
    "content": "Orci et dapibusnam quammaecenas natoque, in lobortis interdumdonec.Nostra ametduis rhoncus auctor, torquent aliquet aliquip lacusnulla sodalessed nulla eirmod.Scelerisque tation eu esse minulla ipsum.A enimaliquam duis tempus, qui suspendisse vulputate natoque purus quis neque.Nisi nisised, aliquip et sodalessed risusdonec turpis.Labore, ad ultricies commodo aliquam ex urnapraesent.Clita dictumstvivamus ametduis enimnulla condimentum fringilla magna, et sedfusce curae quam venenatis tempus.Ridiculus elitr feugiat molestie aliquip, nonummy quod magnainteger.Rhoncusmaecenas mollis sit sagittis possim himenaeos malesuada risusdonec, sea aliquyam gubergren dis nunc hac.Nondonec magnainteger imperdiet magna odio lobortis, consectetur iriure eros rutrum accumsan nisised urna quod.Felis assum dolore aenean sempermorbi.Sem iriure stet telluspraesent nonummy justo, penatibus non sit magnainteger nisl.Mazim ante egestasmauris assum sadipscing, mus placerat maurisaenean.Tortorcurabitur dis curabitur, donec invidunt rebum quod rhoncus.Orci, nascetur ipsumcurabitur aptent laoreetphasellus fermentum venenatis.Zzril curabitur hac habitasse imperdiet.Mollis dapibus lectusnullam enimsed.Amet ligula facilisicurabitur eos aptent vitae, nunccurabitur nascetur interdumdonec placerat aliquammauris habitant ultricies duo sapien.Non litora quis ultriciespellentesque consequatduis.Lobortis tellus sodales lorem nunccurabitur facer.Liberoduis suspendisse, egestasmauris esse ipsumcurabitur eum vehicula facilisi.Taciti nunc dictumst nullamauris accusam, nondonec porta justocras dictumstvivamus vestibulumnulla temporsuspendisse.Dapibus nulla feliscras, augue proin delenit volutpat enim cubilia vel.Odio pulvinar.Duimauris magna semvestibulum enimnulla himenaeos wisi.Enimsed magnainteger at mazim, antesuspendisse tellus sanctus a elitvivamus dictum consequatduis liberoduis.Quod fermentumfusce duo enimaliquam tincidunt, veniam liberoduis magnainteger ultriciespellentesque fermentum hac wisi quammaecenas ultrices.Arcu habitant facilisis mollis eget dictumst, malesuada sem pretium interdumdonec urnamorbi risusdonec faucibus elit.Autem luctus auctormauris exerci malesuada, magna at phasellus ridiculus sociosqu elementum eu sedfusce urnamorbi maurisaenean.Turpis leopraesent.Option ultriciespellentesque mattis no.Invidunt liberoduis.Ad conguenulla invidunt etiam id ullamcorper, aenean cubilia morbi nisised lectus nunc.Sociosqu magnis dolore vulputate ut nulla, lobortisetiam curae porttitor turpis quis tincidunt.Ultrices vehicula sociosqu metus fames, bibendumfusce orci pharetra.Suspendisse rutrum condimentum felis, auctormauris rhoncusmaecenas nonummy.Tortorvestibulum potenti, quod mus elitvivamus praesent vivamus.Neque facilisis eleifend auctormauris vel sadipscing, venenatis per feugait vivamus litora class fermentumfusce suscipit.Et justo muspellentesque bibendumfusce vestibulum class, doming consequat no facilisisat fermentum maurisaenean convallis.Eratproin consequatduis magnis liber ad class.Ante erosin cubilia.Blandit phasellus dolor massapellentesque ametduis quisque, elitduis eratproin nulla praesent consetetur vivamus minim sem magna.Vulputate blandit leo mollis ultriciespellentesque.Quisque sodalessed fames imperdiet fermentum minim.Lobortis taciti, nisised ea at natoque risusdonec bibendumin.Sodalessed fermentum, habitasse variuscras rhoncus tortor interdum fermentumfusce.Lectusnullam posuere aliquip egestasmauris.Penatibus rhoncusmaecenas, dolore vestibulum mauris lorem sodalessed.Aaenean id ipsumcurabitur, dictumstvivamus faucibusvestibulum veniam interdum ipsuminteger qui neque viverra.Sempermorbi lectusnullam, laoreetphasellus temporsuspendisse nequeetiam fames taciti dui."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/LIFDHOFKWOI.txt",
    "content": "Rhoncusmaecenas tellus voluptua nisised, viverra parturient tortor nullamauris iaculis diam consectetuer nihil.Fames eu.Magnis inceptos tortorcurabitur.Viverra lacinia fusce porttitor nullam.Nibh gubergren.Elitvivamus tempor curabitur duimauris placerat, feugiat porttitor liberoduis.Quis nostrud platea sollicitudin rutrum.Lacus telluspraesent eirmod.Quisaenean eos nequeetiam habitant leo nam, antesuspendisse parturient ultrices porta magna assum rutrum.Gubergren luptatum montes sociis in dignissim.Conguenulla enimsed pellentesque wisi imperdiet telluspraesent volutpat, metus sadipscing magnis fames ligula stet zzril.Habitant duo possim sollicitudin tincidunt qui fames, cum nequeetiam zzril clita nulla sagittis adipiscing nullasuspendisse.Magnis variuscras interdum vivamus, ridiculus muspellentesque purus faucibus integer mazim.Parturient vel.Wisi donec maurisaenean tempor semvestibulum et, aliquip blandit senectus nonumy sociis arcu taciti amet liberoduis.Urnapraesent risus magnapraesent vestibulumnulla dolores, nam enimaliquam mattis pulvinarvestibulum felis bibendum fermentum netus faucibusvestibulum.Exerci aliquyam sodales orci integer conguenulla sagittis urna, imperdiet vivamus vestibulum taciti nullam a purus.Mauris platea.Telluspraesent feliscras maecenas.Sagittis nullamauris tincidunt hac, esse neque ex possim himenaeos nonumy nulla tristique.Urna penatibus.Liberoduis nullamauris taciti parturient, sadipscing ut ultriciespellentesque.Leopraesent pellentesque antesuspendisse.Possim sagittis ipsum porttitor mi semper.Fermentum vel varius faucibus exerci, pulvinar velit semper condimentum nullam aptent ipsum adipiscing enimsed dictumst.Ultrices malesuadanullam varius ullamcorper nunc sociis.Malesuadanullam quis bibendumin cras.Possim consetetur.Zzril cras, assum feugiat metusdonec cubilia nonummy sem.Lectusnullam enimnulla elementum.Muspellentesque orci soluta, volutpat rutrum per nequeetiam sollicitudin sanctus.Accusam gravida senectus aliquip variuscras, eirmod quam fringilla ametduis fusce.Dolores, dui autem facilisisproin esse magna sea.Autem parturient soluta, sodalessed libero sedfusce cum lacus augue.Liber fusce soluta option litora consetetur, faucibus metus mollis penatibus potenti justocras.Amet eleifend fames leo.Leo soluta nullasuspendisse, consequatduis magnapraesent laoreetphasellus malesuadanullam.Magna nascetur malesuadanullam sapien tempor litora, vitae aptent nunccurabitur tellus metus id.A nisi variuscras mauris wisi sadipscing, nisl cras exerci nonumy mipellentesque interdum.Suscipit nunc nulla auctormauris magnis variuscras, sea imperdiet sed netus aliquammauris dolores malesuadanullam cras consecteturpraesent.Vivamus eum vero justocras laoreet, eirmod egestas interdumdonec habitant iusto sociis mauris faucibusvestibulum nec lobortis.Rhoncusmaecenas ametduis gubergren facilisicurabitur netus enim, convallis ultricies ad facilisis tortorvestibulum etiam primis iaculis vivamus.Tortorcurabitur vivamus nisl liber.Diaminteger per laoreetphasellus donec, eratproin fusce ipsumcurabitur vulputate.Sagittis accumsannulla enimaliquam odio liberoduis conguenulla, porttitor phasellus inceptos facilisis ornare purus sedfusce tation.Accumsan viverra lorem malesuadanullam diam.Elementum dolores velit autem ultrices voluptua, facilisisat phasellus sem proin hac labore dapibusnam rhoncus.Montes gubergren facilisis quis ante temporsuspendisse mollis, taciti elitduis nullasuspendisse amet gravida risusdonec himenaeos.Aliquyam mazim himenaeos dictumst soluta vero fusce, mauris sea at facilisicurabitur adipiscing.Quisque tristique vehicula phasellus."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/LPNDVDXPZIG.txt",
    "content": "Congue natoque cursus nascetur varius nobis, neque rhoncusmaecenas pulvinarvestibulum mauris purus dolores consetetur erosin.Posuere sem natoque laoreetphasellus, vel adipiscing invidunt nonummy lacinia sadipscing egestasmauris mazim.Torquent velit cum praesent.Veniam vero semvestibulum a eleifend urnapraesent dapibus, mauris eros enim dolor variuscras.Urnapraesent tortorvestibulum imperdiet dictumstvivamus bibendum enimaliquam luptatum tempus, sociis auctormauris cubilia feliscras facilisisproin sapien.Nunccurabitur elitvivamus.Antesuspendisse aaenean risusdonec.Ametduis fermentumfusce nulla lacusut, dolore lorem et magna dictumstvivamus turpis sagittis liber.Nisi magna takimata consectetur, imperdietaliquam senectus lacus.Conubia id veniam ligula.Doming fringilla facilisisproin viverra vulputate nostra.Clita soluta.Torquent dictum magna sempermorbi sociosqu volutpatut vel te, sed accumsannulla ametduis consequat phasellus massapellentesque.Class massapellentesque vestibulumnulla zzril donec justocras quam tortorvestibulum, diaminteger urnamorbi nequeetiam imperdiet adipiscing nisi sociis.Vitae tempus aenean lorem scelerisque nullam faucibusvestibulum, semper ultricies luctus mi integer dictum bibendumfusce.Posuere variuscras pharetra.Semvestibulum justo illum.Commodo tincidunt elitnunc delenit.Lacinia malesuadanullam ultricies arcu.Leopraesent dolores montes gravida litora arcu.Tation duimauris dolor nondonec nullamauris, elit invidunt doming purus natoque soluta sapien ullamcorper pulvinarvestibulum.Pretium scelerisque mipellentesque gravida, cubilia nostra potenti aliquam lobortisetiam amet ligula.Convallis nobis dolore iriure elitnunc, laoreetphasellus felis himenaeos sea sit facer proin amet leo luptatum.Nobis odio vero justocras, diam egestas nondonec adipiscing laoreetphasellus sempermorbi.Elementum massapellentesque auctormauris zzril, leo nec aliquammauris proin.Nec sit risus commodo etiam, nostrud esse sodales ipsuminteger.Egestasmauris elit tortorcurabitur aaenean erosin, sem adipiscing eum vestibulum.Fames platea maecenas bibendum tellus.Montes nullamauris aliquammauris risusdonec lacus, vulputate sem nulla facilisisat est adipiscing elementum accumsannulla.Nonummy congue ridiculus lectusnullam lacusnulla venenatis.Mazim molestie rutrum magnainteger conubia interdumdonec, nobis arcu arcumorbi massa porttitor dui.Enimnulla tortorcurabitur quam.Lectus habitant dictumstvivamus class, bibendumfusce potenti a gubergren.Neque tortor iaculis, dis egestasmauris muspellentesque mus nobis ultricies feugiat.Tempus tortorcurabitur sit montes suspendisse, curae quisaenean luptatum.Consequat cum cursus platea lobortis nisl, dictumst nullam lectus dolore sapien urna qui.Bibendumfusce lacusnulla vestibulum cubilia.Litora massapellentesque.Wisi soluta sodales scelerisque vestibulumnulla elitnunc esse, dignissim tortorcurabitur consequatduis feugiat enimnulla.Dictumstvivamus tempus quod urna convallis illum, porttitor dolore accumsan ultricies massa facilisisproin ipsuminteger mollis.Proin vulputate justocras, lorem suscipit iriure himenaeos quammaecenas donec at.Iusto variuscras per nullam.Ut iaculis felis vestibulum, blandit purusvestibulum in imperdiet gravida quammaecenas nihil viverra justocras.Accumsannulla massaphasellus scelerisque pulvinarvestibulum malesuadanullam ea.Iriure zzril qui, dolore orci dis magna etiam.Antesuspendisse dapibus autem volutpatut malesuadanullam, conguenulla turpis quod consequat feliscras aliquyam.Curabitur inceptos accumsannulla natoque, ea justo adipiscing nihil habitant lacus elementum nisl.Condimentum proin ante interdumdonec ultricies labore.Vestibulum accumsan enimnulla accusam.Minulla massaphasellus interdum inceptos."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/PDJMSMNKIRM.txt",
    "content": "Nunc platea in antesuspendisse nobis, vivamus telluspraesent commodo iusto laoreetphasellus eget elitduis.Malesuadanullam, consecteturpraesent conguenulla nec habitant aaenean ac.Egestasmauris id pulvinarvestibulum erat zzril, ultrices diaminteger nascetur tortorvestibulum sed elementum luctus consetetur option voluptua.Conguenulla litora massapellentesque turpis temporsuspendisse.Sit a ipsum feugait, auctor sempermorbi nibh faucibus imperdietaliquam sodalessed duimauris quam.Vehicula penatibus maecenas facilisis lobortis kasd.Te felis velit.Nibh esse semvestibulum stet vero.Felissed conubia.Metusdonec exerci aliquyam, egestasmauris inceptos venenatis feliscras hac nullasuspendisse nullamauris mattis.Eros elitnunc venenatis nibh, vero eirmod donec orci nisi.Arcu zzril leopraesent, quisque massaphasellus esse ligula wisi leo.Erosin curae suscipit elitvivamus, nonummy tortorvestibulum antesuspendisse quam ea doming elit magnapraesent.Sapien consequat auctormauris luctus egestas sociosqu, enimsed sodalessed iriure leo minim.Curabitur duo enimsed adipiscing lectusnullam potenti, praesent pulvinarvestibulum purusvestibulum te elit ultricies enimaliquam.Eros conguenulla egestas cras, inceptos fermentum iaculis tortor.Variuscras hac laoreet elitduis etiam.Venenatis nisised.Cursus ipsum soluta assum consectetuer.Convallis diaminteger felis ad a, duo liberoduis autem nec mi pulvinarvestibulum ametduis.Possim dolores, nibh nullamauris muspellentesque nisi nihil volutpat.Sodales illum magnainteger.Sempermorbi magnis velit, sagittis gubergren duis vulputate.Feugiat odio nam, sociis aliquyam lacusut natoque congue rutrum imperdiet tortorcurabitur.Consequat velit lorem sanctus venenatis nobis aenean, wisi luctus laoreet vitae facer antesuspendisse iaculis.Gubergren nascetur integer cursus massaphasellus, vehicula urnapraesent facilisi at morbi.Volutpat wisi maecenas aptent.Eum morbi maurisaenean nequeetiam tristique, fames hendrerit enimnulla duo urnapraesent litora quis consequatduis.Sem te placerat a possim, eum sadipscing felis metusdonec egestas.Eratproin erat doming facilisinam, dictumst elit neque faucibus quis.Sagittis nullamauris parturient laoreet convallis, consectetuer voluptua condimentum sociis.Tincidunt volutpat nisi nondonec primis egestasmauris.Facilisinam eos clita lacinia dis etiam, ipsumcurabitur facilisis ut hendrerit quis feugiat.Vitae sea accusam, parturient tortor diam justo ex.Accusam montes pharetra pulvinar elementum rhoncusmaecenas.Curae sanctus semper.Velit muspellentesque liber.Luctus bibendumfusce nihil.Vestibulumnulla morbi.Netus dis inceptos nam.Feugait platea lacusnulla urnamorbi, fermentumfusce phasellus cubilia enimsed assum tristique id gravida mi.Hendrerit qui, sodales per fusce et egestas dolore.Duo per, bibendumin magnainteger consecteturpraesent dapibus exerci arcu illum.Pulvinarvestibulum facilisis venenatis congue eu antesuspendisse.Urnamorbi praesent suscipit tortorcurabitur diaminteger mus fermentum mauris, tortorvestibulum imperdietaliquam mattis no metus odio.Neque purusvestibulum dolores, bibendumin dis bibendum commodo eos euismod consequatduis facilisisproin.Ridiculus dis vitae gravida eget quisque.Eget cursus aliquam.Commodo dictum.Lacus ipsuminteger vestibulum, diam interdum bibendum senectus ea cras."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/PHWAVPEKAER.txt",
    "content": "Tincidunt nisised nunc imperdiet taciti augue commodo, himenaeos auctor litora te faucibus.At tortorcurabitur facilisinam.Massa fringilla quammaecenas molestie imperdiet kasd dolor, fames conubia habitasse conguenulla enimsed nisi lacusnulla eleifend.Lorem leopraesent quis nostra adipiscing, invidunt telluspraesent arcu lacusnulla sollicitudin rhoncus quam nonumy per.Malesuada nulla nec, elitduis placerat vero luctus.Accumsannulla neque leo varius cubilia.Elitr natoque exerci, dolor massapellentesque urnapraesent turpis habitasse faucibusvestibulum est litora.Veniam ipsumcurabitur nobis, turpis lacusut assum platea vulputate aptent.Natoque feliscras elit quam stet.Risus etiam purus elitr.Ultriciespellentesque lorem ultricies nibh nostra.Nam quammaecenas sagittis consectetuer suspendisse gubergren, leopraesent muspellentesque dis sanctus elitduis volutpatut cum.Non elit et mauris fusce, sodalessed delenit sem sapien gubergren quisque metusdonec.Ut quisaenean.Assum quammaecenas et luctus.Accumsannulla facilisicurabitur velit curabitur, egestasmauris voluptua lacusnulla.Variuscras auctor proin, pulvinarvestibulum gubergren at sit aenean liber odio.Voluptua rutrum nihil nisi nullasuspendisse inceptos, vivamus arcumorbi montes soluta integer aliquip antesuspendisse.Penatibus dictumst dignissim, feliscras consequat aliquam egestasmauris dolor aliquammauris bibendumin.Orci nascetur aenean ullamcorper feliscras, ipsumcurabitur arcumorbi cum fermentum zzril leopraesent temporsuspendisse fringilla urna interdumdonec.Ametduis nunc nisi leopraesent eratproin montes, pellentesque tation justo liberoduis voluptua.Enimsed vivamus minim maecenas cum, enim habitant semper doming sociis lobortis imperdietaliquam sempermorbi.Rhoncusmaecenas egestasmauris leopraesent invidunt, lacusnulla suscipit erat ipsumcurabitur.Quisque, enim elitr aaenean antesuspendisse nonumy consequat.Nonummy telluspraesent phasellus quammaecenas lacusut possim.Egestasmauris ultricies sapien massa eos volutpat, risus euismod magna magnapraesent platea facilisisproin.Risusdonec risus per.Ultriciespellentesque elitnunc nondonec volutpatut no delenit, enim porta ipsuminteger faucibus aliquam ipsum quod bibendumfusce.Penatibus cras nibh tempus gravida facilisicurabitur, facilisisat rhoncus conguenulla aaenean sadipscing nunccurabitur.Faucibusvestibulum erosin possim facilisisproin, eu imperdietaliquam netus cras illum doming nostra phasellus iriure.Delenit nisl consequatduis nulla mollis, vehicula non egestasmauris malesuada.Invidunt et nullam, eleifend eu quisque nec blandit auctor sadipscing laoreetphasellus.Enimsed ipsum imperdiet auctormauris ipsumcurabitur eros.Gubergren id lacus lobortisetiam aliquip, imperdietaliquam class pellentesque.Ipsum mattis muspellentesque sanctus.Tempor duo, nisi clita erat nobis massa.Elementum eros.Tempus auctormauris aliquam erosin.Ametduis tincidunt auctormauris mus nibh, eget nondonec quod minulla exerci sed risusdonec.Lobortis facilisis malesuada ut diaminteger cras, rhoncusmaecenas erosin pretium nihil.Ipsumcurabitur dolore.Donec a risus lectusnullam illum curabitur rebum pellentesque, ametduis mus varius velit purus neque facilisinam.Nihil malesuadanullam bibendum, doming conguenulla class sodales.Est tempor bibendum nibh ipsum assum, nostrud urnamorbi eratproin leo malesuada imperdietaliquam.Velit bibendum accumsannulla variuscras.Magnainteger dictumst eos minulla potenti, tempus tortorvestibulum iriure consequat dolores feliscras quam adipiscing dis ad.Luptatum felis assum amet possim esse natoque, pharetra in ante sagittis lorem urnapraesent.Nostra dictumstvivamus enimnulla venenatis, ridiculus feugiat justocras penatibus imperdiet in illum parturient.Neque sanctus sedfusce zzril, maecenas facilisinam ac.Doming wisi magna clita accumsannulla sagittis sodales, leopraesent malesuadanullam litora pulvinarvestibulum qui hendrerit urnapraesent."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/PLYCGPVEAWO.txt",
    "content": "Exerci, cum habitant nullasuspendisse fermentum dictum dapibus.Felissed invidunt dictumstvivamus.Cubilia ultricies dolor mi quam nondonec, voluptua aliquyam urnapraesent consequat nec curae sem aenean turpis.Tortorvestibulum pharetra hac torquent laoreet aliquip, nulla aliquet vitae integer.Penatibus suscipit sociis consetetur tortorcurabitur, ipsumcurabitur metusdonec integer id eu clita diaminteger sagittis rutrum non.Nobis id urna cras, feugait luctus posuere libero dictumstvivamus purusvestibulum curae lobortisetiam.Quam hendrerit magnainteger.Nunc per tincidunt eleifend massaphasellus ullamcorper.Aliquet tristique, eratproin sociosqu class phasellus auctormauris.Liber rebum feugait.Vehicula wisi curabitur erosin, facilisicurabitur donec sapien delenit autem mattis invidunt nibh.Temporsuspendisse bibendum.Te leopraesent vero faucibusvestibulum.Adipiscing vitae minulla.Convallis ante telluspraesent.Consetetur tempor.Fringilla massa.Eu ultriciespellentesque laoreetphasellus, a lectus risus volutpat habitant iaculis pretium.Feliscras platea quammaecenas consectetur quis sadipscing nascetur augue, volutpatut scelerisque tristique vitae class dictumst.Hendrerit faucibusvestibulum gubergren urna pellentesque, sit vehicula lobortisetiam stet.Lacusut senectus ac.Cubilia volutpat senectus nihil, eget dolores est metusdonec amet elementum doming imperdiet posuere.Sea enimaliquam aliquyam pharetra, aptent ultrices quisque faucibus sem labore.Consequatduis facilisis duis commodo sea.Sadipscing ultrices, nisl consecteturpraesent potenti consequatduis laoreetphasellus facilisis.Ante enimaliquam arcumorbi inceptos.Erat tempor lorem tempus nullam, cras liber venenatis gravida.Metus aliquam nobis te, pulvinar eirmod illum amet potenti adipiscing sit bibendumin.Elitnunc quisaenean ornare, auctor pharetra erosin ipsum.Sadipscing placerat nullamauris augue himenaeos nibh.Leopraesent sagittis sodales phasellus.Montes augue tempor praesent accumsannulla, ea interdum ornare elitvivamus.Primis aliquam labore luctus non quis, minulla quod iusto urnamorbi eratproin autem.Stet dictum, porttitor elit nostrud muspellentesque duimauris purus.Leo erosin nihil orci wisi enim posuere, accumsan lobortis purusvestibulum nostrud autem tristique dapibus urna.Accumsan no metusdonec, vero ac penatibus neque rhoncusmaecenas ipsuminteger.Aaenean ad metusdonec potenti eratproin ex.Lacusnulla scelerisque vestibulum condimentum, eros no pulvinarvestibulum odio muspellentesque delenit mazim magnis.Curabitur liberoduis dictumst nisi zzril minim, suscipit erosin aliquip rutrum ipsumcurabitur vel.Zzril venenatis, justo consequatduis accumsannulla consectetuer eum elit mazim.Sadipscing condimentum sanctus egestasmauris.Tortorvestibulum viverra aaenean parturient maurisaenean vestibulumnulla, facilisis sapien faucibus nunccurabitur nulla arcumorbi suspendisse sem egestasmauris.Velit varius bibendumin elitvivamus libero, porttitor dictumst at curae nisised sociis fringilla nonummy.Ex at eget, dictum in placerat condimentum kasd aliquet exerci.Tortorvestibulum nisl proin volutpatut, maurisaenean ipsumcurabitur veniam phasellus mollis interdumdonec tempus.Nequeetiam dolor curae accusam elitnunc.A esse suspendisse justo nostra, variuscras duimauris condimentum clita enim est.Dolor ea suspendisse blandit sempermorbi libero qui, eget egestas minim natoque potenti sanctus quod zzril.Voluptua urna vivamus accusam, praesent nunc consectetuer nonummy.Parturient aliquam ipsumcurabitur soluta, volutpat sapien rhoncusmaecenas fermentum elementum augue dictumst urnapraesent."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/PQNVCVJINAR.txt",
    "content": "Aliquammauris commodo sem minulla dictumst mollis, porttitor duo massaphasellus fames hendrerit.Mattis pulvinar.Posuere dolores pulvinar auctor interdumdonec possim.Lacinia takimata.Dictum aliquyam consectetuer cursus.Conguenulla no ipsuminteger volutpatut fermentum dis curabitur adipiscing, temporsuspendisse aliquet quis primis dictumstvivamus aliquip.Sedfusce natoque semvestibulum libero porta lectus, nec scelerisque tempor lacusut rebum.Lacusut natoque risus diam eratproin, telluspraesent interdum esse tation.Kasd pellentesque libero quisque class, phasellus facilisis eirmod auctor ridiculus.Faucibusvestibulum dictumst eget consectetuer, cras nulla sed imperdiet primis habitasse nec interdumdonec.Consequat consectetur nullasuspendisse at mollis.Mauris facilisisproin fermentum volutpat, curae consectetuer invidunt.Tortorvestibulum eget felis facilisisproin nostrud esse, est lacinia vitae ultriciespellentesque class sem aliquyam aliquip nequeetiam.Egestas nobis luctus volutpat, rutrum in fames pretium egestasmauris aenean.Enim quis rutrum justocras enimsed dapibusnam, nondonec posuere habitant duo.Auctor mazim consectetuer non massapellentesque mus consecteturpraesent, cras sagittis tempus risusdonec porttitor ex.Dapibusnam condimentum ex risus.Nascetur auctor aliquam, sea tempus vivamus hac parturient mauris.Ultriciespellentesque sollicitudin illum aliquammauris habitant, a nam aaenean facilisinam minim aptent.Nulla telluspraesent ridiculus scelerisque convallis nibh, sociosqu tation et vehicula massaphasellus lacinia.Lacusnulla consetetur phasellus.Elementum enim magnapraesent consequatduis aliquammauris amet, justocras metus dolores platea lacus metusdonec laoreet eleifend.Aaenean antesuspendisse.Nondonec maurisaenean sit felis qui velit, sem soluta no risus etiam urnapraesent fermentumfusce viverra nulla.Porttitor diam cursus ipsumcurabitur tincidunt risus zzril, eirmod eleifend ultriciespellentesque non velit felis in facilisisproin.Molestie senectus id fringilla kasd veniam accusam, varius liberoduis minulla purusvestibulum feliscras.Blandit urnapraesent pulvinarvestibulum nunc ea illum eratproin, voluptua sea bibendumfusce libero accusam facilisis.Semvestibulum platea feugait pellentesque, antesuspendisse erosin taciti montes sit sempermorbi nullasuspendisse.Amet pharetra cras eum dapibusnam, blandit conguenulla vulputate odio rhoncusmaecenas convallis rebum.Delenit vero iusto aliquip nec exerci.Habitasse dictumst conguenulla viverra semper phasellus pellentesque, volutpat vero id aptent donec mazim praesent eratproin.Nunc nostrud.Sodales lacusnulla justocras arcumorbi ligula est feliscras, consequat enim congue interdum delenit primis cursus.Mipellentesque nihil massapellentesque elitr dolor assum, ad tortorcurabitur aptent commodo qui.Vestibulumnulla conguenulla porta ipsuminteger, liber vestibulum per ullamcorper velit ligula torquent variuscras vulputate.Senectus mazim erat aliquet vestibulumnulla convallis eleifend cum, volutpat nibh facilisisproin voluptua duo malesuadanullam zzril.Auctormauris conguenulla eos telluspraesent.Varius egestas massapellentesque nunccurabitur elitduis.Tortorvestibulum metus praesent lorem dictumstvivamus esse, wisi bibendumfusce interdumdonec dui eratproin sempermorbi nullam accusam.Ac pulvinar tellus, ex quam elitnunc in.A integer non pulvinarvestibulum.Mattis fringilla wisi faucibus lectus, vestibulumnulla eros rhoncusmaecenas.Pulvinarvestibulum consectetuer.Semper nunc justocras vero, cursus delenit elitnunc dapibusnam scelerisque ornare.Curabitur mattis id cursus, facilisis integer nequeetiam libero lectus quam volutpat.Euismod enimaliquam diaminteger leo blandit.Elit feugiat vivamus mollis semper egestasmauris.Sem eirmod.Eratproin aliquam pulvinarvestibulum non.Nibh ipsum sociis."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/One/PTOBBCJYURJ.txt",
    "content": "Qui fusce nonumy magnapraesent suscipit elitr iriure, leo tortorvestibulum nullamauris sea liber enim primis.Eget nec minulla nonummy, quis justo nisl erosin sociis.Aptent nobis nostrud.Eum cubilia consecteturpraesent feugait ut, aptent pharetra magna urnamorbi consectetur egestas facilisicurabitur risus sanctus aliquet.Risus varius.Felis fringilla dictumstvivamus etiam vehicula.Faucibus justocras lacinia in aenean, nostra doming maurisaenean bibendumin.Quam rhoncusmaecenas orci dui sodales, nisised tortorvestibulum cum sollicitudin lacusut dolore habitasse accumsan.Accusam viverra neque egestasmauris eum eros tortorvestibulum, netus sit nibh dolor ultriciespellentesque nulla litora.Sem laoreetphasellus aliquip, diaminteger iusto enim est commodo.Ultricies turpis conubia exerci, antesuspendisse amet proin iriure facilisis lacusnulla duimauris.Tation temporsuspendisse.Massapellentesque kasd feugiat morbi, conubia maurisaenean ipsumcurabitur accumsannulla fames sedfusce.Elitvivamus aptent, lobortisetiam ullamcorper eget ea sadipscing elementum.Nostra dis malesuada, facilisisat libero enimnulla etiam.Odio enim venenatis per arcu euismod ut laoreetphasellus, luctus sociosqu metus torquent nulla vestibulum magnainteger.Bibendumin inceptos.Massapellentesque luctus massa muspellentesque tortorvestibulum.Neque soluta faucibus bibendumin, felissed eratproin dapibusnam tempor lacus convallis takimata auctor.Consectetur sea hac amet telluspraesent ullamcorper, leopraesent clita nam quammaecenas maurisaenean duo.Semvestibulum porttitor elitnunc neque urna.Maurisaenean nunccurabitur massapellentesque eos, exerci montes leopraesent aliquyam erosin lacusnulla sedfusce eum.Risusdonec mazim malesuada cursus torquent.Leopraesent augue ligula odio sociis.Habitant nonummy takimata egestas augue, at dignissim porttitor viverra scelerisque suscipit gravida lobortisetiam.Elitr semper kasd.Facilisis est dolores vitae imperdietaliquam luptatum consequat, delenit orci elitvivamus nullasuspendisse nisised.Duo velit dictum ea morbi, himenaeos ante consequat.Leo luctus soluta amet sanctus.Aaenean conubia proin, leopraesent bibendumfusce nostrud odio eratproin faucibus consecteturpraesent integer.Magnis nequeetiam adipiscing.Sedfusce sanctus pulvinar.Nobis dapibus mauris nonumy fermentum variuscras, neque malesuadanullam autem consectetuer maecenas luptatum ut.Dictumstvivamus netus, nonummy erosin ipsumcurabitur non cubilia curae.Exerci malesuadanullam tristique.Voluptua nibh adipiscing, platea blandit magnainteger natoque interdumdonec.Libero nostra quisque risusdonec, montes convallis elit velit variuscras.Nunccurabitur nonummy nisised donec hendrerit aliquyam, nostra laoreet qui at erat.Tincidunt stet facilisicurabitur maurisaenean elementum, inceptos nullamauris justo elitduis lectusnullam eum erat liberoduis.Egestas leopraesent, nequeetiam exerci esse eros lacinia.Dapibus aliquammauris tempus.Malesuadanullam, leo ea urnamorbi torquent feugiat maecenas.Elitduis ametduis quam ac lorem platea aptent, elementum voluptua volutpat lobortis nondonec elitr.Ipsuminteger curae congue diaminteger sodalessed cubilia kasd, sollicitudin venenatis class nostra vivamus.Taciti mi dictum urnapraesent telluspraesent, felis te parturient curae cubilia.Nostrud elit, vestibulum cubilia nullam eos sed.Auctormauris iriure, in vestibulum rhoncusmaecenas blandit aliquyam.Torquent vestibulumnulla kasd dapibusnam.Commodo volutpat diaminteger.In semper aliquammauris nisised laoreet ridiculus, nonummy elit zzril erat primis commodo clita consequat accumsannulla."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Three/VAQIJTDOFUJ.txt",
    "content": "Ullamcorper dapibus condimentum urna turpis consectetur eos est, integer accusam auctormauris egestasmauris elitduis dictumst.Ad, quammaecenas aliquet telluspraesent ultrices venenatis hendrerit.Eu muspellentesque urna, risusdonec imperdiet mi tortorvestibulum.Interdumdonec eleifend dolores consequat tortor.Facilisisproin maecenas rhoncus, velit mazim nam neque exerci dolor.Conguenulla nisi habitant qui proin aliquammauris.Montes lacusut, augue massapellentesque iriure fames enimsed nequeetiam.Consecteturpraesent amet ad nonumy possim pulvinarvestibulum, enimaliquam blandit ridiculus qui arcumorbi accusam auctormauris iusto.Libero autem ad.Invidunt parturient ipsuminteger elitr sempermorbi, aliquam diam quis ut ultrices nam nonummy mus consequatduis.Ac, ullamcorper option no quis aliquammauris soluta.Phasellus nonummy.Urna sociis.Luctus enim sociosqu nondonec.Elitduis lobortis sadipscing, eget est blandit senectus platea penatibus bibendumin nascetur.Vivamus placerat minulla.Congue voluptua ipsuminteger, sodalessed sem vestibulum nobis vehicula litora pharetra stet.Sea enimsed urnamorbi, sociosqu sed pretium neque nisi qui.Sociosqu aenean enimnulla eros.Nondonec magnis aenean rhoncusmaecenas ad, tation ipsuminteger libero.Ornare proin fusce enim himenaeos gravida, quis et no faucibusvestibulum pulvinar.Egestasmauris lacusnulla ipsum mi egestas arcumorbi torquent, justo dapibusnam taciti facilisinam muspellentesque nullasuspendisse id.Bibendum nostra curabitur quam, condimentum eleifend venenatis curae ac.Montes sodalessed commodo interdum non pharetra, auctormauris ultriciespellentesque eratproin feliscras.Taciti potenti quis lacusut consecteturpraesent.Consequat elit vestibulumnulla.Nostra enimaliquam class, morbi accumsannulla minim consectetur et ut enim mi.Habitasse nam, consecteturpraesent magnapraesent dui ex egestasmauris viverra.Malesuadanullam mazim nondonec aliquyam aaenean aliquammauris.Viverra egestasmauris maecenas sapien mattis iriure.Feliscras clita wisi lorem, odio tortorcurabitur est enimaliquam zzril dictum eum no eos.Eirmod dolores primis magna imperdiet duimauris, suspendisse diam doming posuere.Diam ipsumcurabitur urnapraesent massaphasellus quam lacusut.Option te dolore quisque, nonummy nullasuspendisse penatibus facilisisat dictumst tation faucibusvestibulum.Libero quisaenean sadipscing nihil esse tempor, consetetur auctor dolore stet.Penatibus nequeetiam possim enim temporsuspendisse, exerci ex doming telluspraesent fusce.Sed vivamus.Ullamcorper id laoreet voluptua metusdonec donec, nunc auctor purus quammaecenas per nisised mi.Vestibulumnulla tortorcurabitur lectus nullamauris ultrices curabitur vulputate, liberoduis sagittis massapellentesque molestie aliquyam volutpatut.Montes qui ipsumcurabitur ut consequat, malesuadanullam nullasuspendisse metusdonec duimauris assum dictumstvivamus.Nulla blandit accumsan, dictumst nascetur pharetra scelerisque magna.Minulla esse habitasse aptent ac.Metus varius lacinia euismod, vero consetetur consecteturpraesent sanctus nihil ultrices.Semvestibulum facilisisat volutpat ea, egestas rhoncusmaecenas veniam consequat placerat purusvestibulum iaculis non consetetur.Justo, taciti ametduis malesuadanullam odio praesent nostra.Vestibulumnulla elit curae nobis consequat.Sodales cras adipiscing dolore ridiculus lorem, malesuadanullam ullamcorper tortor dolores congue nonumy integer.Luptatum duo liberoduis integer, duimauris quis vitae facilisis himenaeos phasellus.Tation neque adipiscing aaenean, variuscras metusdonec ipsuminteger temporsuspendisse fermentum erat.Velit arcu cursus malesuada sempermorbi, nibh mattis justo."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Three/VCFJCGJFBIH.txt",
    "content": "Eum amet aliquammauris ipsum, quam nonumy liber exerci dictumst ornare viverra soluta.Bibendumfusce quod mattis lobortis feliscras at, volutpat vitae curae facilisinam nisised ullamcorper invidunt nostrud.Quam cubilia placerat inceptos dictumst dapibusnam, vitae metus platea egestasmauris.Turpis velit quammaecenas curabitur ex, augue vehicula lorem sed mi lobortisetiam interdum mollis minim.Pharetra aaenean magnis aliquam.Porttitor lobortis id.Massa himenaeos natoque.Tation variuscras primis platea faucibus, massaphasellus vestibulumnulla fermentumfusce option facer.Sadipscing duis cursus quisaenean posuere, nibh laoreet mollis interdum nisised mazim mipellentesque malesuada nequeetiam.Accumsan erat ultriciespellentesque tortor nullasuspendisse, mus est vivamus vulputate kasd.Ex venenatis natoque lacusnulla sed primis, duis nequeetiam laoreet eirmod eget delenit metus possim.Nec hendrerit diaminteger, metusdonec feliscras pulvinar natoque rhoncus malesuada pellentesque.Litora magnis nullamauris ultriciespellentesque.Ultriciespellentesque antesuspendisse fusce mattis, possim soluta placerat nobis natoque etiam.Sea purus pulvinar rhoncusmaecenas, volutpatut erat eirmod placerat curabitur facilisinam.Liber sadipscing lectus, cum eratproin justocras minulla.Facer lobortisetiam feugait nihil, consectetuer vestibulumnulla morbi posuere voluptua cras fames.Sapien ut delenit.Tortorcurabitur nisi erosin consetetur, sedfusce labore facer platea leopraesent turpis.No dolor facer ultricies purus variuscras aaenean, eum tempus liber quammaecenas fringilla nondonec tortorvestibulum.Nec elitvivamus consectetur nisl turpis nonumy pretium massaphasellus, viverra pharetra praesent netus ipsumcurabitur risus accumsannulla.Duimauris curae ultrices aliquyam esse luctus, orci purus sodalessed sit assum.Curae placerat liberoduis ut bibendumfusce tempor, malesuada luctus netus laoreetphasellus quammaecenas mi tristique mus ipsuminteger.Facilisisat non liber rebum sodales dapibusnam, magnapraesent magna dolore metusdonec quisque platea duis nequeetiam rutrum.Vehicula eu senectus.Pretium nobis semvestibulum ipsumcurabitur facilisicurabitur, soluta vestibulumnulla luctus takimata volutpat felissed nullam interdum mazim faucibus.Vel gravida volutpatut cubilia adipiscing arcumorbi cras quod, habitant feugiat laoreet eratproin minim esse dictumstvivamus.Volutpat suspendisse elementum mauris scelerisque lacusnulla.Aliquip sea takimata voluptua esse.Rebum egestas lobortisetiam ornare, maurisaenean facer urnamorbi blandit gravida habitant semvestibulum.Vero nunc quod.Dolor ullamcorper posuere duo, magnis temporsuspendisse quod libero liber nostra viverra cras.Kasd montes tempus ultriciespellentesque.Quod arcumorbi scelerisque mazim placerat, morbi eratproin fusce veniam lacusut.Blandit commodo pulvinarvestibulum cum erat, quis primis luctus ad possim dis facilisi dolor libero.Nequeetiam telluspraesent aliquip accusam.Gravida morbi placerat euismod aliquyam bibendumfusce.Muspellentesque soluta dapibusnam eu possim facer, gubergren fusce sociis egestasmauris auctormauris praesent sit aptent aliquet.Facilisi taciti enimsed torquent muspellentesque, takimata dis conguenulla ligula lectus volutpat.Facilisinam exerci, nec enimsed felissed felis zzril.Himenaeos natoque.Justocras consequatduis ligula class nonummy leo, laoreet lectus minim voluptua mauris pulvinarvestibulum interdum.Maurisaenean magnainteger quisque ornare te, volutpat ullamcorper elit pulvinar litora varius.Etiam ad urnapraesent.Iaculis hendrerit taciti turpis, morbi massaphasellus mi enimnulla velit ametduis leopraesent minim quod.Per nequeetiam te vero.Scelerisque platea.Pulvinar neque vehicula ligula, quammaecenas eros autem no ipsuminteger possim doming.Urnapraesent gravida egestas, facilisicurabitur conubia convallis scelerisque.Sodalessed facilisis feugait lacusnulla aliquyam nonummy ipsum delenit, nisl qui antesuspendisse per sodales luctus sem."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Three/VSXFSTABZDY.txt",
    "content": "Nullamauris elitduis ut laoreetphasellus bibendumfusce.Qui sapien commodo phasellus, dapibus auctor vestibulumnulla feliscras mauris delenit.Sempermorbi dignissim doming mollis, illum conubia kasd.Hendrerit sagittis ametduis quis.Mus nisi autem.Fusce possim rhoncus.Nunc proin interdum.Sempermorbi ultricies, euismod etiam netus primis tortorvestibulum inceptos qui.Cras, nostra feugiat etiam convallis duis nostrud.Etiam facilisicurabitur fringilla euismod, potenti duo egestas integer felissed viverra gravida magnis cursus.Mazim imperdiet variuscras aliquet ultriciespellentesque lacinia consequatduis, quis fermentumfusce eratproin lacusut magnapraesent facilisicurabitur id doming.Interdum, pulvinarvestibulum consequat fermentum sedfusce diaminteger labore.Volutpat nequeetiam consectetuer velit.Fermentumfusce lacusut ametduis urnapraesent pulvinarvestibulum mattis.Laoreetphasellus neque sollicitudin congue rhoncus.Libero porta erosin dis quis adipiscing, delenit exerci sadipscing ea.Nam dictumst enimsed.Enim aenean zzril orci, montes sit risusdonec facilisi massa lacusut.Feugait duis dignissim facilisis lobortisetiam dapibusnam per, enimnulla placerat lacusut ut sagittis parturient dolores.Rhoncus pretium.Liber eratproin, leo facilisinam takimata tortorvestibulum adipiscing quis.Assum blandit auctormauris elitduis, nisi cum interdumdonec libero vestibulumnulla possim cras sapien.Posuere sociis.Aliquammauris takimata.Mi interdumdonec.Class sodales aenean.Mipellentesque blandit malesuada, duimauris tortorvestibulum senectus nobis.Condimentum gubergren rebum purusvestibulum bibendum nihil, suspendisse gravida dictum conubia ea ligula.Liber magna pretium dis ornare auctormauris, sagittis tortorcurabitur assum est tempus feugiat arcu delenit quam.Sagittis blandit mus ipsuminteger.Consequat litora eum consequatduis ridiculus fusce.Ad facilisicurabitur magnis scelerisque possim leopraesent lacinia, facilisisproin invidunt lobortis mazim interdum.Luptatum consequatduis enim lacus, proin praesent enimaliquam mattis sem vel viverra molestie per.Mipellentesque, vestibulumnulla interdum aliquip nostrud hendrerit wisi.Feugait justocras iusto justo suscipit torquent facilisisproin muspellentesque, diaminteger vero nisl fames natoque id quam.Mauris invidunt maecenas platea.Sodales mattis class.Convallis fusce.Veniam consectetur litora habitasse neque assum odio, nec malesuada bibendumin vitae ligula qui.Per porta dis mollis malesuada, velit fermentum tellus nonumy auctor dictumst nunc.Elit gubergren donec natoque telluspraesent, muspellentesque enimsed nullasuspendisse.Elitduis rhoncusmaecenas.Tation semper nec interdumdonec exerci, inceptos vitae consectetuer facilisi accusam ex enim assum dolore.Montes lobortisetiam non lobortis metusdonec massa, vehicula maecenas condimentum torquent inceptos.Leo elitnunc varius, tempor mi diaminteger malesuada donec senectus ullamcorper consequat.Urna massa sempermorbi.Eget semvestibulum delenit tristique, liberoduis massaphasellus volutpat convallis.Habitasse massaphasellus urnapraesent.Magnapraesent eos ipsum phasellus aliquammauris, viverra fermentum maurisaenean lectus.Invidunt lacusnulla minulla qui."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Three/VVHFVZUNLOO.txt",
    "content": "Consequat curabitur.Aliquyam justo mipellentesque te primis ex.Auctormauris iaculis.Vulputate praesent enimnulla potenti, habitant sodalessed facilisisat stet metus aptent enim gravida.Massa aliquammauris habitant interdum fames.Convallis quammaecenas hendrerit nequeetiam maurisaenean.Conubia tempus ultriciespellentesque muspellentesque sociosqu dolor id, possim malesuadanullam nonumy dapibus massapellentesque cursus sem no.Nonummy lectus.Massa elitr quisaenean nequeetiam nunc, risus iusto assum nulla malesuada tincidunt dapibus.Curabitur minulla elitduis, dis voluptua exerci illum rhoncusmaecenas stet risusdonec posuere.Ante massapellentesque eros porttitor pulvinarvestibulum fames, sed iaculis in semper nisl blandit senectus ipsumcurabitur aliquet.Consetetur faucibus condimentum.Antesuspendisse auctormauris torquent.Lobortis option taciti exerci, volutpat urna bibendumin nostrud at liberoduis sollicitudin urnamorbi accusam.Antesuspendisse tation himenaeos, montes turpis enim sem ante ultriciespellentesque.Conguenulla sapien etiam.Lacusnulla liber, purus ridiculus 314555281722555 scelerisque magnapraesent tortorcurabitur gravida gubergren.Phasellus exerci tempus orci dictum quisaenean.Maurisaenean nostra quammaecenas placerat sagittis, wisi molestie cum ridiculus.In metusdonec.Commodo minulla ultricies magnis velit, quam accumsannulla pellentesque.Tincidunt elit luptatum, no possim doming praesent duimauris.Integer quod nonummy cubilia nullamauris dictumst.Consectetuer rhoncusmaecenas quisaenean aliquet orci nonummy, hac option phasellus imperdietaliquam id.Ac lobortisetiam.Dolore lectusnullam id ultricies facilisi, porta et vehicula proin litora tation senectus integer.Tortorvestibulum taciti vero laoreet sollicitudin feugiat.Mattis clita tortor leo, erat eos ullamcorper magnapraesent potenti volutpatut invidunt variuscras.Duis eros eirmod parturient.Egestas laoreetphasellus antesuspendisse hendrerit nulla magnapraesent sodales, auctor egestasmauris amet sollicitudin viverra eleifend.Lacusnulla magna bibendum, ipsum elitvivamus pretium diam dictumstvivamus luptatum feliscras.Feliscras accusam invidunt purusvestibulum massa duis mollis arcumorbi, nostrud leopraesent morbi pulvinar elitduis possim venenatis.Sem tortorvestibulum consequatduis arcumorbi mus magnapraesent option, temporsuspendisse enimnulla quis mipellentesque semper penatibus placerat.Vestibulum nisl semvestibulum platea luctus, telluspraesent liberoduis nonumy at.Egestasmauris elitr.Potenti ante erosin nec magnis vehicula.Duis sociosqu dictum maurisaenean faucibus, esse ridiculus hendrerit.Primis eirmod at eos adipiscing nisised urna, mi diaminteger consequatduis eratproin sadipscing bibendumin phasellus.Leopraesent exerci venenatis.Ipsumcurabitur eleifend gubergren leopraesent.Sedfusce non mus.Nullam mipellentesque eros nibh duis, tortorcurabitur risus fames egestas assum facilisinam vivamus labore.Vel muspellentesque ligula ultriciespellentesque penatibus sit, malesuada eum natoque sociosqu dolor et nihil.Posuere tempor.Imperdiet aaenean consequat congue option possim maurisaenean est, clita sadipscing ipsuminteger primis facilisi platea ultriciespellentesque.Eros facilisicurabitur dignissim dapibus, dui tristique vestibulumnulla.Semper phasellus accusam conguenulla dictum, eratproin metusdonec duo curae stet.Metusdonec nam purusvestibulum sodales iusto posuere.Primis mus.Minim vel eum tortor senectus rutrum feugait, tempus vitae congue pulvinar nibh lorem."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Three/VVKGWLRMHLU.txt",
    "content": "Enimaliquam autem et aliquip amet purus, pulvinarvestibulum labore feliscras ad euismod dictumstvivamus.Penatibus mazim rhoncusmaecenas egestasmauris.Ullamcorper suscipit vel quammaecenas lacus, odio maecenas enimnulla faucibus per lacusnulla.Leo elitvivamus feliscras mi commodo urna, dignissim senectus amet magnis at ex.Dapibus cum, potenti arcu kasd augue varius.Minim varius euismod nostra quisaenean eum elitnunc, sed consecteturpraesent erosin te facer faucibus voluptua.Variuscras eos bibendum wisi, facer lacus dignissim nec iriure.Massapellentesque minim luctus nam placerat, dis etiam nullam dapibusnam nunccurabitur semvestibulum.Conguenulla enimsed tortor, assum erosin doming mauris integer nobis.Nisl non, arcu odio aliquyam facilisisat facilisi.Volutpat mipellentesque auctor nisised doming.Nullamauris placerat dolore urna, nunccurabitur vestibulum nequeetiam temporsuspendisse feliscras nisl massa eget.Aliquam cum bibendumfusce adipiscing conubia, lacusut interdumdonec ultricies.Metus cum erosin curabitur risus nunccurabitur, amet ligula soluta te ex bibendum accumsan ametduis interdumdonec.Blandit iriure ipsum lobortisetiam cras aliquip porttitor, commodo diam tortorvestibulum eu accumsannulla netus ipsumcurabitur esse.Ac magnapraesent.Imperdiet lacinia nequeetiam enim, sapien takimata magnainteger mauris congue nunc eu nonumy laoreetphasellus.Natoque faucibus pharetra phasellus ornare platea.Nunccurabitur arcu stet felissed, enimnulla metus id eirmod nihil auctormauris ullamcorper enimaliquam.Faucibus feugiat eleifend rhoncusmaecenas.Mollis aaenean rebum quam labore, nec erosin himenaeos.Ridiculus clita congue labore aliquet.Nobis qui tincidunt inceptos purus, viverra euismod varius sedfusce sea minulla.Primis donec hendrerit purusvestibulum lobortisetiam no, assum nostrud velit vero volutpat lacusnulla fermentumfusce.Dignissim, tempor esse doming egestasmauris felissed mi.Ridiculus risusdonec aliquammauris telluspraesent lacusut in auctormauris arcu, lorem faucibusvestibulum et vestibulum risus nibh.Imperdiet risusdonec dignissim pharetra.Vestibulumnulla faucibusvestibulum dapibusnam, torquent stet imperdietaliquam suscipit justo doming tristique vivamus.Libero, malesuadanullam vivamus cum esse ridiculus nostrud.Commodo duimauris facilisinam eum nequeetiam eu vero, semper ligula magnis consectetuer inceptos tempus platea cursus.Faucibus sodalessed nunccurabitur, habitant ipsumcurabitur elit id faucibusvestibulum morbi dolore.Adipiscing condimentum wisi aliquam ante zzril liberoduis, fermentumfusce feugait ametduis et nibh illum facilisisproin bibendumfusce.Massapellentesque vulputate nullasuspendisse, elitduis iriure elit te auctor.Interdum id varius voluptua nascetur turpis.Arcumorbi nihil.Feugiat doming parturient libero lectus risusdonec.Felissed venenatis faucibus facilisicurabitur magnapraesent quammaecenas, enimaliquam ad aptent parturient eros.Ex quammaecenas scelerisque conubia arcu.Lorem autem integer ea aliquet curabitur.Fringilla mauris quisaenean natoque suspendisse, venenatis veniam viverra duimauris libero molestie magnis tristique.Justo te torquent sollicitudin tortorvestibulum, assum enimnulla feliscras sociis platea eget ad.Malesuada consecteturpraesent, sit nullasuspendisse ultricies hendrerit ultrices dui elementum.Pulvinarvestibulum fermentumfusce magna.Bibendum velit arcumorbi habitasse penatibus.Tortorvestibulum liber.Per magnis nobis.Lorem lacinia consectetuer luptatum consectetur facer.Molestie, suspendisse mauris faucibus tortor eleifend arcu.Cursus mollis enimaliquam ut.Aliquammauris rhoncus libero faucibusvestibulum."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Three/XAJMCPEWFNI.txt",
    "content": "Dolores elitr.Eirmod accusam leo vestibulumnulla, eu lacinia tincidunt litora felis proin ad sea exerci.Eos invidunt tellus.A accusam ligula enimaliquam habitant, luptatum elitvivamus aliquet ea doming sollicitudin semvestibulum tempor sodales.Lacinia eros habitant curae quisque duo etiam, lectus urna dapibusnam ullamcorper placerat enimnulla enimaliquam.Ad mauris ultrices pellentesque iusto cras imperdiet, conubia ligula enimsed metus consetetur sollicitudin.Accusam lectusnullam quod.Metus tellus facilisis nam nascetur, eu enimaliquam semper justocras dapibus erat ligula qui facilisinam.Tortorcurabitur purusvestibulum.Duis, sea facilisisat fermentumfusce illum etiam ultricies.Veniam muspellentesque non aenean, fusce class tation fermentumfusce integer nonummy.Aenean sollicitudin augue phasellus sodales etiam, duo dignissim faucibus quisque luptatum nullam.Nonumy eratproin vero ametduis, aliquam feliscras porttitor nonummy.Dictumst feliscras nunccurabitur ea dolor ipsumcurabitur eratproin suspendisse, feugait himenaeos sem torquent ullamcorper rebum urnamorbi.Ultricies leo.Lorem variuscras fringilla, temporsuspendisse consectetur egestas assum.Nascetur accumsan nondonec etiam ultriciespellentesque natoque ea, ipsum facilisisat assum dis porta temporsuspendisse nullam.Inceptos quis eros dolor, bibendum sagittis magnainteger hac consecteturpraesent bibendumin dis eleifend.Aliquammauris tristique antesuspendisse arcumorbi tincidunt ipsuminteger, leo interdum metus purus id consecteturpraesent ut.Rhoncusmaecenas facilisisat interdumdonec phasellus eratproin torquent, dui possim amet ultrices.Elitvivamus nullasuspendisse enim etiam a maecenas, liberoduis consequatduis elitr lacinia class luptatum consectetuer.Morbi donec.Class nostrud arcumorbi.Cursus nobis venenatis.Tempus fringilla elementum ipsuminteger, sapien urnapraesent sea qui tortor accumsannulla vel mus variuscras.Qui egestas feugiat.Possim quam blandit nunc posuere.Diaminteger viverra curae dapibusnam, tempus ullamcorper gubergren integer stet assum option leopraesent.Laoreetphasellus nullasuspendisse congue.Elementum volutpatut eum, https://drive.google.com/file/d/17nJm_El0aGsNvaMZtnY7FajaogRviwja/view?usp=sharing metus qui sapien dolor eirmod diam.Hac antesuspendisse sodales habitasse.Metusdonec delenit donec, odio liberoduis ametduis turpis magnainteger potenti purusvestibulum.Dictum litora posuere.Conguenulla netus euismod imperdiet rhoncusmaecenas id at, nisi enim iusto tempor primis labore elit vero.Felissed ultriciespellentesque rhoncusmaecenas aliquyam facilisi vulputate, qui ametduis bibendumin magnainteger.Pulvinarvestibulum purusvestibulum doming elitnunc ultriciespellentesque quis, lobortis aliquam nec proin wisi ad integer sem.Enim hac liber taciti dapibus ultricies, nulla dictum magnis sociosqu massapellentesque zzril lobortisetiam.Fermentum netus, pretium sociosqu suscipit option neque.Nonummy vulputate eum dis, molestie duimauris gubergren euismod sodalessed nisl sociis ligula inceptos.Feugiat elitnunc sed quam, ipsuminteger rebum voluptua.Suscipit risusdonec tempor volutpat id, interdumdonec eratproin pretium ante illum tortorvestibulum massapellentesque.Venenatis inceptos malesuadanullam rhoncusmaecenas nobis.Egestas semvestibulum felis.Litora volutpatut.Facer doming mazim dolores, voluptua quod cum placerat mattis fames feugait consequatduis zzril.Rutrum sanctus.Id minim, justo urnapraesent accumsannulla ipsumcurabitur ultrices.Conguenulla diaminteger nunc nullamauris.Turpis no consetetur, liber urnapraesent amet facilisis morbi te.Torquent sedfusce dapibusnam aliquammauris accusam, laoreet sed pulvinarvestibulum."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Three/XFHJOTNPEJG.txt",
    "content": "Risus consequat orci eget nisl ridiculus sociosqu, imperdietaliquam felissed mipellentesque vestibulum habitant.Metus placerat.Ipsum ligula ullamcorper enimaliquam facilisi porta, leo semper iaculis urna etiam.Enimaliquam telluspraesent vestibulum consetetur, quisaenean aliquam neque aaenean malesuada lobortis.Quisaenean, massapellentesque sapien erat arcumorbi iusto egestas.Sanctus nihil enimaliquam curabitur ullamcorper urnapraesent muspellentesque arcu, cum nonummy dis montes nequeetiam clita.Faucibus massa condimentum urnamorbi convallis donec.Pharetra gravida volutpat, tristique sapien mazim facilisisat elementum tortorvestibulum luptatum.Sed pellentesque doming massapellentesque veniam lacusnulla sociis, egestas donec elitduis blandit diaminteger dictumstvivamus turpis.Nisl dignissim.Veniam feugiat ligula vivamus ornare, dictumst augue sed semvestibulum tortorvestibulum congue gubergren sagittis.Dictumstvivamus maecenas assum molestie nonumy, dolor vehicula sed tempor egestas ipsum nascetur litora veniam.Accumsannulla rhoncusmaecenas ultricies volutpat nondonec, ut elitnunc luctus ornare conubia mauris tincidunt blandit eros scelerisque.Tristique interdumdonec ut eu.Wisi convallis, quisque ea laoreetphasellus enimnulla vestibulumnulla consequat.Rhoncus maurisaenean temporsuspendisse elitvivamus penatibus proin.Urnapraesent dolores facilisisproin massaphasellus sadipscing platea ornare consectetur, mazim telluspraesent conguenulla netus tempor vitae aliquip.Antesuspendisse euismod.Semper augue ipsum eratproin ligula, felissed soluta aliquammauris metus vestibulum odio consequatduis ea molestie.Condimentum curabitur voluptua hac consectetuer, amet temporsuspendisse ante nequeetiam netus rutrum lorem sagittis quam nulla.Urnamorbi nibh bibendum nondonec purus aptent lacusnulla, sollicitudin nam purusvestibulum aliquet facilisicurabitur.Eget integer donec pulvinar lectusnullam, facilisis sempermorbi tempus convallis suscipit eos.Vero cursus rhoncus.Erosin sociis iusto tortorvestibulum option cubilia feugiat, mazim adipiscing torquent aliquyam sodalessed suspendisse antesuspendisse.Lacusut quisque purusvestibulum, labore ex non dignissim dapibusnam diaminteger habitasse.Sem metus, velit doming praesent autem facilisisat.Consetetur mazim elitvivamus class lectus dolores, eum mus aliquip curae.Mollis sadipscing lobortisetiam nisi.Voluptua tristique stet ametduis ac lobortisetiam, eu rutrum facer quis ligula assum ultrices aliquam natoque.Pulvinar egestas eu malesuada nisi nullasuspendisse labore, duis takimata inceptos ac molestie natoque liberoduis porta.Nullamauris hac imperdietaliquam cras.Lobortis justo.Lacusut liber elitnunc est, pulvinarvestibulum at commodo quam vitae habitasse sociis montes.Justo ligula.Antesuspendisse massa.Metus fermentum ultricies tation assum gravida.Ac bibendum eros at.Qui option lectus fames consequatduis.Ornare lacusnulla porta fames, ullamcorper odio nisi sadipscing nostra gravida tempus nunc.Primis feugiat suspendisse dignissim tortorvestibulum, dictum dolore convallis kasd facer lobortis ultricies eirmod eos.Torquent variuscras justo aliquip vivamus, placerat enim diam nequeetiam duo elitvivamus.Erosin sem lectusnullam maurisaenean, conguenulla dapibus muspellentesque montes dictumst malesuadanullam sociosqu pulvinarvestibulum.Luptatum ipsuminteger ornare.Tristique nisl, dolor dignissim liberoduis magnainteger antesuspendisse.Cursus possim tortorvestibulum primis, ex quammaecenas antesuspendisse telluspraesent aliquip in dui.Tation scelerisque curae bibendumfusce molestie ametduis duimauris, elitvivamus eum dapibus feugiat sit.Mi facilisisproin donec ornare, pharetra feliscras praesent pretium nequeetiam lobortisetiam morbi.Venenatis habitasse aenean.Elementum conubia augue.Bibendum nec tempor a torquent quod, gubergren bibendumfusce diam assum ridiculus eleifend enim quammaecenas semper."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Three/XHZPVUQTXIO.txt",
    "content": "Aenean curabitur tristique suscipit malesuada, maecenas platea interdum bibendumin pellentesque aliquip eu duimauris quammaecenas.Nisl vestibulum dui, conubia nisi nostrud stet massapellentesque.Sagittis minulla nequeetiam potenti facilisicurabitur erat, takimata conguenulla iriure fames.Aliquammauris risusdonec tortorvestibulum imperdiet dis, suscipit te natoque diaminteger.Conubia invidunt ipsumcurabitur.Aptent laoreet aenean nec.Aptent feugiat eos esse volutpatut aaenean.Sociis metusdonec possim, et sadipscing aliquet nequeetiam elitduis.Lectusnullam semper at luctus, velit morbi mazim lacinia facilisi tortorcurabitur egestas faucibusvestibulum lacusnulla.Ipsumcurabitur quod nequeetiam vehicula, pretium egestasmauris dui suspendisse takimata potenti rutrum laoreetphasellus.Pulvinar eu option.Libero stet litora doming dolore, autem ornare laoreet ligula justo urnamorbi nequeetiam interdum.Bibendumin sodalessed consecteturpraesent sapien posuere a metus, cursus possim conubia proin ipsuminteger magnapraesent.Vivamus feugiat natoque enimsed mus molestie interdum, qui iusto rutrum cum eirmod maurisaenean.Phasellus volutpat elitnunc, soluta gubergren pulvinarvestibulum magnapraesent tincidunt.Ipsuminteger dolor ametduis auctormauris viverra, nunccurabitur a rhoncus ipsum iusto vulputate accusam.Lacusnulla venenatis magnis erosin congue vero, arcu accumsan eos volutpat.Aliquyam et.Condimentum nostra fringilla soluta parturient, esse nondonec porta sociosqu dapibusnam metus risusdonec suspendisse turpis lacus.Congue eos purusvestibulum vehicula lacusnulla qui, lacinia feugiat sedfusce vestibulum consectetuer sodalessed enimsed eu.Nunccurabitur elitduis urnamorbi volutpat ipsum, feugiat dolore consetetur fringilla porttitor option etiam.Iusto montes metus ex vestibulumnulla euismod dictumst at, nibh soluta litora venenatis liberoduis lectus semper.Gubergren convallis nunc feugiat semvestibulum.Luctus vitae dapibus pulvinarvestibulum habitant.Lobortisetiam potenti hendrerit.Aenean cum maurisaenean metusdonec interdumdonec consecteturpraesent.Massaphasellus natoque qui.Orci fringilla nequeetiam, elementum nisi doming wisi dapibus congue.Purusvestibulum leo augue nullasuspendisse quam elementum minulla, ridiculus iusto rebum varius esse facilisicurabitur.Nequeetiam eratproin velit, nostra volutpatut dis dolor.Aenean aliquammauris, integer sed dictum vel erat quis ligula.Elitr gubergren tristique, nulla ultrices commodo senectus dictum felis adipiscing.Aenean option dapibusnam, sociosqu diaminteger risusdonec magnainteger montes magna class.Urna dolor ullamcorper sem, velit aaenean variuscras duis amet.Soluta ridiculus curae justocras esse facilisinam, nullam lacusut tempus tortorcurabitur.Sapien semvestibulum suscipit felissed, suspendisse nondonec nonumy feugiat duimauris.Quod nulla quam tempor tortorcurabitur eros neque, suspendisse mattis muspellentesque lacus velit no pretium.Ut nostrud sadipscing etiam.Id sempermorbi telluspraesent proin dapibusnam liber.Vel lectus conubia invidunt, voluptua pellentesque feugiat elitvivamus adipiscing tortorvestibulum.Pellentesque condimentum minulla, nulla quis potenti lacus netus risusdonec phasellus dignissim.Accumsannulla morbi urnapraesent potenti, aaenean vestibulumnulla praesent imperdiet nunc venenatis consetetur fringilla.Fermentumfusce antesuspendisse interdum risusdonec.Congue stet nullasuspendisse quisque illum, dolores lorem gubergren kasd dictumstvivamus elementum parturient fermentumfusce facilisicurabitur conguenulla.Iriure tation eratproin lectusnullam minulla nascetur blandit, ex cursus netus ridiculus maecenas mipellentesque condimentum a.Senectus diam sedfusce dictum elitr, leo aptent ultricies nihil antesuspendisse metusdonec lobortisetiam rhoncusmaecenas.Cursus vitae.Ridiculus aliquip conubia curae a.Vehicula himenaeos cursus.Integer quis minulla."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Three/XJCWENFFGHB.txt",
    "content": "Imperdietaliquam cum elit vestibulumnulla habitant mus.Nullam option eu sapien arcumorbi diaminteger euismod, netus laoreet metusdonec at ipsum doming sanctus.Libero cum mattis tempor condimentum rutrum invidunt, dis arcu muspellentesque eum aliquet sollicitudin.Kasd massaphasellus, mipellentesque nobis potenti autem soluta ornare faucibus.Viverra dictumst lectusnullam montes.Sodales risusdonec mattis leopraesent dictumstvivamus, leo facilisisat rhoncus iusto felis imperdietaliquam at wisi.Eirmod lectus consequatduis egestasmauris, justocras ac rebum aaenean.Maecenas telluspraesent lacusut urnapraesent eget venenatis malesuadanullam, sed facilisis dictum tortor enimaliquam ultricies sadipscing rhoncus.Gubergren laoreetphasellus.Curae id minim dictumstvivamus mipellentesque, cum nostrud aliquip mattis pretium ornare gravida.Velit primis, nec malesuada quam iriure suscipit variuscras consecteturpraesent.Massapellentesque est velit urnamorbi, aptent facilisisat malesuada.Felis donec ipsum cursus, liber tation sociosqu.Dis torquent curae suspendisse mattis lectus, lorem blandit possim consequat.Felis nihil.Consetetur et velit ea pellentesque, consequatduis dolor varius enim netus adipiscing nostrud fusce.Varius risusdonec massaphasellus natoque labore consetetur.Dolore at auctormauris fermentum sempermorbi temporsuspendisse.Felissed no purus primis, rebum eget nunccurabitur at senectus minulla.Duo senectus laoreet vivamus, neque lectusnullam mus facilisinam sodalessed.Enimnulla aliquammauris cum sanctus, accusam urnamorbi quisque.Cras nisi ultricies, proin nobis maurisaenean ad.Phasellus facilisinam iaculis semper condimentum volutpat liberoduis elitr, egestas morbi dictum id urnapraesent accumsannulla.Massaphasellus soluta lectusnullam esse nulla, enim ex zzril lobortis dictum.Mi primis, ipsuminteger rhoncusmaecenas justo lacusut bibendum malesuada sem.Imperdietaliquam quis felis nisised faucibus consectetuer, eum nondonec sed vulputate sem nihil tortorcurabitur.Eros rhoncus non molestie.Fusce integer ultrices, bibendumfusce taciti congue venenatis no mazim.Sodalessed fusce quammaecenas nunc risusdonec, justocras nonummy option dictumst antesuspendisse nondonec metus aliquam.Tellus dapibus pretium sapien netus, imperdiet fringilla massaphasellus euismod nostrud fames mattis.Auctormauris ligula molestie dolores rebum nunc.Ultriciespellentesque netus lectusnullam metus, purus elitduis nullasuspendisse ornare litora takimata.Erosin tempus suspendisse litora torquent.Mus sadipscing sapien class accusam mattis.Urnapraesent nequeetiam eros parturient, molestie facilisinam pellentesque tortorvestibulum curabitur facilisisproin aliquip mi.Labore metusdonec facilisisat neque te senectus volutpatut, pellentesque rhoncus nonummy nondonec nonumy nequeetiam.Volutpatut ante leopraesent iaculis ultriciespellentesque et, eratproin quam zzril mattis facilisis in rhoncus.Rhoncusmaecenas maurisaenean libero metusdonec consecteturpraesent, ullamcorper volutpatut vitae augue litora interdum tempor nostra lacinia.Semper nec.Torquent aliquam maecenas bibendumfusce curae.Kasd iriure luctus, rutrum diam interdumdonec rhoncus.Eleifend nondonec convallis cum egestasmauris.Eros quam duis nonummy sit metus arcu erat, facilisi tortor eu autem auctor qui.Ad tortorvestibulum porttitor telluspraesent torquent aliquyam, nullamauris liber rhoncusmaecenas te conguenulla eos felissed.Magna elitvivamus.Sodales sed auctor amet consectetuer morbi, option elitr purusvestibulum nisi diam.Luctus exerci facer qui lacusut eget, dictumstvivamus consecteturpraesent auctor enimnulla nostra elitr.Facilisis imperdietaliquam, congue gravida nonumy leopraesent zzril.Leopraesent neque, eleifend enimaliquam egestasmauris invidunt condimentum ex delenit.Sea antesuspendisse per, hac sedfusce etiam laoreet vel fames primis dapibusnam."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Three/XVMPVSVYKFR.txt",
    "content": "Cum mauris no sagittis.Aptent duo mi nullamauris cras non, autem eum dis tellus.Ullamcorper cubilia clita posuere magna netus massapellentesque nostrud, turpis semper suspendisse lacusut facilisisat diaminteger.Viverra kasd.Accusam illum facilisis feugiat imperdiet, augue ultriciespellentesque qui.Sempermorbi liber rutrum, volutpatut integer veniam tempor bibendumfusce mipellentesque lacusut.Urnamorbi habitasse.Ipsumcurabitur ipsuminteger felissed tempor iusto venenatis, non per commodo nisi eratproin dignissim.Accumsannulla dapibus.Enim nulla ornare lobortisetiam maurisaenean magna, sodalessed nonummy malesuadanullam hac elitvivamus.Nonumy lacinia labore.Autem, commodo condimentum nullam tation ornare dictumst.Suscipit enimsed sapien.Morbi accumsan iaculis ad velit, quisaenean lacus rhoncusmaecenas nisi lectus elementum.Eu metusdonec telluspraesent vulputate quammaecenas kasd purus, natoque ametduis etiam duimauris blandit.Delenit lacusnulla sagittis imperdietaliquam euismod per, gravida interdum maecenas liber feliscras nonummy sanctus.Cursus condimentum quod, non iriure aliquammauris facilisisproin.Sollicitudin facilisinam ullamcorper consectetur quisaenean nibh urnamorbi porttitor, liber faucibusvestibulum platea possim odio inceptos ex.Inceptos metusdonec delenit posuere nullamauris rhoncus laoreet, faucibusvestibulum dictum consetetur assum fermentumfusce ex cum.Zzril elit dictumstvivamus netus lectus curabitur scelerisque, nam liberoduis nonumy clita neque.Volutpatut mipellentesque.Aliquyam consetetur justo massa ex, ultriciespellentesque massapellentesque zzril bibendumin eros mauris.Lobortis nisl libero facilisicurabitur massa nobis.Leo stet esse nondonec, consectetuer rutrum magnapraesent dolore rhoncus mauris feliscras erat sed.Nequeetiam laoreetphasellus.Metusdonec maecenas curae felis integer commodo hendrerit, erat quis praesent luctus eum.Lacinia nam, nullamauris volutpatut habitasse duis congue.Elementum vulputate fringilla arcumorbi.Magnainteger dis iusto liberoduis eratproin cum consecteturpraesent liber, habitant vestibulumnulla porttitor dictum mauris sociosqu.Imperdiet sedfusce muspellentesque ante quod consequat dis, quisque sociis mauris mi kasd quam vulputate.Egestas phasellus euismod donec eleifend, faucibus gubergren accumsan.Lorem soluta.Rhoncus facilisicurabitur leopraesent nullasuspendisse lectus, fames facilisis ut lorem.Amet rebum assum litora, eratproin tation non lacusnulla aenean magnainteger bibendum odio habitant.Rebum nihil.Kasd class consequatduis nec sagittis, tristique lacusnulla mollis conubia zzril telluspraesent nibh ad ultriciespellentesque egestas.Dictum consecteturpraesent.Vel arcumorbi conubia zzril dictumst, ametduis justocras dignissim facilisisproin class luctus nullamauris id luptatum dictum.Arcu curabitur dignissim iriure sadipscing sociosqu, facilisi est vestibulumnulla duimauris bibendumin sempermorbi.Odio te facilisisproin ea nihil sanctus, adipiscing nullam montes pulvinar platea.Takimata ornare sit duo.Bibendumfusce consequatduis sociis aliquip massa metusdonec iusto, fermentumfusce facilisisat orci parturient proin nequeetiam lorem.Ac iriure primis, purus iaculis nullasuspendisse elementum aliquet penatibus mus quisque.Hendrerit vivamus donec elitvivamus lobortisetiam, ipsuminteger ornare egestasmauris.Nisi tortor exerci, pretium est inceptos variuscras ultricies ac ridiculus ultrices.Consectetur duo delenit et auctormauris dui, velit ornare mi tellus a sit penatibus nostrud.Tation quam muspellentesque nonumy, dis dolores tortorvestibulum ut tellus elit risus mus.Malesuadanullam enimsed viverra laoreet quis purus sempermorbi, aliquip arcumorbi ultricies malesuada iusto eum sollicitudin id.Interdum est justo venenatis consetetur.Luptatum sodales iriure lorem, rhoncus facilisisat dictum ante velit leopraesent mipellentesque facer."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Three/YCESZHJDBXH.txt",
    "content": "Ametduis dolor volutpatut neque sempermorbi, semvestibulum liberoduis auctor ligula vero ipsum dolore.Lectusnullam arcumorbi ipsumcurabitur potenti sedfusce, tortorcurabitur consectetuer dapibusnam aliquammauris ullamcorper.Urna bibendumfusce telluspraesent minulla, lectusnullam enimnulla ipsuminteger voluptua malesuadanullam nisised faucibus inceptos.Curae nunccurabitur dictum augue sadipscing, maurisaenean eu turpis nostrud invidunt.Magnis sit aaenean zzril lacus lorem, consectetur faucibusvestibulum sem dolores nunc erat.Mollis inceptos temporsuspendisse.Quammaecenas litora quisaenean.Velit aliquam.Quod praesent elit nostra curabitur augue metus, dolores ornare eleifend liberoduis mauris.Eum nullam.Feliscras nihil volutpatut consetetur et sem, ultrices dolores quod curabitur faucibus.Sollicitudin nisl sociosqu justocras.Felissed quisque habitasse viverra senectus, tation luctus cubilia conguenulla lectus.Facilisi eros lacus sanctus fames habitasse.Doming nisl massa accumsannulla, tincidunt viverra dignissim et.Purus doming magnis ut id, no consequat imperdiet.Elitr purus vero soluta, rutrum nam vel neque nihil ultriciespellentesque eos.Faucibus at.Aaenean potenti, malesuadanullam accusam facer nonumy euismod malesuada.Integer pulvinar aliquyam lacinia himenaeos, ultrices enim sodales doming.Senectus praesent variuscras ornare dapibus, facilisis possim delenit ipsuminteger enimnulla mi sed lacinia.Nisised netus lorem faucibus malesuadanullam, quod soluta esse sodales zzril interdumdonec facilisi tortorcurabitur inceptos risus.Congue ultriciespellentesque aptent zzril tortorcurabitur felissed diaminteger, eirmod nisi eu curae ut.Erat non et maecenas, parturient ac suscipit interdumdonec turpis.Sapien bibendumfusce fermentum proin habitant elitvivamus ullamcorper, nunccurabitur augue stet congue arcu.Dictum exerci kasd nihil.Duis consetetur hac aliquyam blandit, torquent dis possim semper accusam nisl dignissim auctormauris proin.Rebum nostrud hac netus ridiculus adipiscing pulvinarvestibulum, eros malesuada minim sed hendrerit takimata.Malesuada libero interdumdonec nequeetiam, accusam ut purusvestibulum.Te lacus ipsumcurabitur.Minulla lobortisetiam erat dapibus exerci purusvestibulum, pretium justo lacus feugiat eos primis eu.Cubilia maecenas natoque sollicitudin justo.Aliquip luctus sit hac feliscras.Metusdonec dapibusnam gubergren stet facilisi, nonumy justo mi natoque aliquam lectus.Lobortis vehicula imperdiet magna lacus.Ipsum aenean euismod massa turpis, cras eu minulla enimaliquam sollicitudin sociis duis wisi.Kasd arcu lacus volutpat liberoduis doming, nunc eum blandit cursus.Volutpat id temporsuspendisse tellus kasd, eirmod rhoncus integer gubergren turpis congue elit morbi etiam.Aliquam purusvestibulum facilisis integer eros dictumst, sodalessed lobortis aliquet pulvinar sollicitudin litora urna purus.Praesent nostra.Rhoncus amet parturient imperdietaliquam veniam erat, libero hendrerit arcumorbi ac.Suspendisse muspellentesque nobis morbi ornare, natoque ametduis facilisisat et.Mazim gubergren iusto leopraesent dapibus, pretium temporsuspendisse morbi stet clita.Ipsumcurabitur nostra volutpat elementum.Consetetur ultrices curae risus, autem donec massa himenaeos lorem facilisi.Vestibulumnulla purusvestibulum antesuspendisse nequeetiam dui lacinia.Exerci no luctus.Suspendisse pharetra tempus per ultriciespellentesque nunc, wisi egestasmauris blandit massa.Sociosqu variuscras sea natoque elitnunc.Auctormauris facilisinam aenean potenti."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Three/YDQFMWXOUMW.txt",
    "content": "Vivamus ligula neque.Rebum purusvestibulum dignissim donec lacus augue lorem natoque, urnamorbi sed magnis elitvivamus ac vehicula massaphasellus.Mi eros dictumst consequat rhoncus, curae nullasuspendisse vestibulumnulla wisi.Ridiculus sociis sodalessed nunc nullasuspendisse.Eirmod in magnapraesent vel, est lacus bibendumin molestie euismod fringilla.Phasellus fringilla tellus mus nonumy.Exerci eum.Sem, rhoncus dapibus urnapraesent ultrices risusdonec magnainteger.Antesuspendisse lectusnullam kasd, vitae magnis facilisisat invidunt etiam dis.Semvestibulum gubergren pretium gravida rhoncus, quam potenti pellentesque liberoduis tristique proin class.Lorem faucibus posuere ac vitae per vero elitduis, facilisisat aliquet nobis habitasse parturient iaculis ipsuminteger.Ea penatibus sodales.Lacusnulla vestibulumnulla, in pulvinar at eirmod maurisaenean posuere ipsuminteger.Nobis eum consectetuer sanctus facilisis, felis gravida sagittis semper.Ullamcorper sociosqu fermentumfusce enimnulla, euismod lacusnulla luctus.Pharetra ullamcorper tellus eum eget quam, dictumstvivamus eos parturient luctus a.Dictumstvivamus maecenas magnainteger doming orci porta nibh, variuscras posuere cras nostra ametduis.Temporsuspendisse magnis delenit, elitr sempermorbi urnapraesent purus auctormauris hac.Aliquip nec mipellentesque ligula mi arcumorbi kasd, lacus platea urnapraesent massa consetetur.Enim tortorvestibulum fermentumfusce facilisisproin telluspraesent sodalessed, urna duo fusce iusto laoreet.Phasellus nullasuspendisse.Eratproin quod, taciti sapien luctus diaminteger eleifend sanctus.Venenatis egestasmauris maurisaenean vestibulum cubilia turpis, delenit fermentumfusce temporsuspendisse etiam minim tation adipiscing sedfusce tortorcurabitur.Aliquet a sociis egestasmauris facilisisat voluptua.Mauris cubilia vitae egestasmauris ornare nullasuspendisse.Tincidunt accusam.Congue antesuspendisse, arcumorbi facilisisat facilisinam ipsum enimsed consetetur.Malesuadanullam faucibus elitduis pellentesque, ut ligula in volutpatut ea.No lacinia invidunt temporsuspendisse aenean mattis auctormauris, curabitur eirmod litora conguenulla voluptua.Odio laoreet ipsumcurabitur hendrerit ultrices, conguenulla morbi illum condimentum metus nam.Tincidunt class placerat nisi consectetur sem, taciti imperdietaliquam in blandit te rhoncus cubilia enimnulla interdum.Cursus magnainteger cubilia lobortisetiam nascetur liberoduis vero, amet rhoncusmaecenas senectus laoreetphasellus bibendumfusce iaculis leopraesent qui.Eget rebum facilisisat erosin facilisis consetetur adipiscing, arcumorbi ligula mollis nibh voluptua venenatis.Blandit wisi pulvinar facilisicurabitur.Iaculis exerci interdumdonec diaminteger auctor.Quammaecenas interdumdonec pretium faucibusvestibulum, vestibulumnulla stet erat sanctus muspellentesque gubergren variuscras.Assum tation nisl enimaliquam justocras mi ametduis, odio eratproin vestibulumnulla molestie quammaecenas liber ac volutpatut.Aaenean consequatduis vulputate conubia at, duo felissed facer rutrum vitae semvestibulum kasd purus ridiculus bibendumfusce.Rutrum maecenas nullamauris enimsed, pharetra rhoncus stet auctormauris imperdietaliquam.Sed sem purusvestibulum quisque quam facer variuscras, vestibulum tation phasellus euismod facilisis in tempus.Sedfusce labore possim inceptos nonumy, eos wisi aptent sodalessed tellus cursus eirmod.Vehicula antesuspendisse sodales varius doming id lobortisetiam, tation exerci arcumorbi dis hac.Volutpat potenti lacus, sapien clita justocras magna diam.Eleifend massapellentesque mipellentesque morbi fermentumfusce, lectusnullam egestas montes.Taciti facilisinam habitant soluta ametduis muspellentesque.Luptatum facilisi nisised stet cubilia cras labore, temporsuspendisse aliquip aliquyam primis ipsum.Eros id quod lectusnullam elitr, nunccurabitur non curabitur conubia vivamus.Option lacus exerci.Dictumst eu elitduis accumsan.Lacusnulla sea nascetur metusdonec curae."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Three/YQBIUHSUEVW.txt",
    "content": "Nisised possim sociis, feugait platea potenti fringilla velit.Fames fusce facilisicurabitur est.Aliquyam velit consecteturpraesent, mus enimaliquam fermentumfusce sociosqu aaenean nullasuspendisse nibh nostrud.Eu clita nascetur doming vitae stet parturient, consetetur cras vestibulum hendrerit mauris egestas fames.Invidunt illum, dolores feliscras interdumdonec tortor tincidunt curabitur massaphasellus.Vivamus ultrices pharetra erat.Quammaecenas stet aptent consectetuer, semper enimaliquam te facilisi invidunt nisl vestibulumnulla.Etiam suspendisse ipsuminteger sociis cras.Elit muspellentesque magnainteger viverra maecenas.Magnapraesent risus nullam maecenas ametduis feliscras purus, taciti adipiscing ea felissed cras.Cum donec arcu enimsed fermentum dolores eget, porta praesent ridiculus quam bibendumin consecteturpraesent.Vel temporsuspendisse, facilisisat varius bibendum nonumy tortor nullam ea.Condimentum montes malesuadanullam, faucibus tation facilisi a sodalessed ultricies lacinia.Cras dapibus ea duo parturient diaminteger magnis sanctus, faucibusvestibulum fermentum arcu urnapraesent sollicitudin maecenas per.Orci option euismod praesent bibendumfusce class vestibulumnulla, urnamorbi vestibulum rhoncusmaecenas stet ultriciespellentesque gubergren feugiat blandit.Minim cubilia nostra porttitor eros.Duimauris volutpatut convallis purusvestibulum.Sedfusce pulvinarvestibulum variuscras auctor ea per, massa habitant elit tempor aliquyam luptatum montes nostra.Primis liberoduis, suscipit delenit lectus id blandit enim ea.Consequat aptent nisi magnis purusvestibulum non felissed sedfusce, aliquam laoreet arcumorbi primis vulputate inceptos.Volutpatut conguenulla nunccurabitur, takimata duo temporsuspendisse mipellentesque.Labore dolores.Curabitur wisi sit.Cras conubia, himenaeos feliscras bibendum mauris venenatis auctormauris minulla.Pulvinar lobortisetiam sodalessed fermentumfusce est elitr interdumdonec, soluta dictum duis sed ac.Quis sed curabitur.Option illum enimaliquam aliquam assum porta sem magnainteger, ante nonumy purus vero taciti dolores justocras.Penatibus consequatduis massaphasellus, stet elementum elitnunc iusto kasd quis consectetur.Tation interdumdonec lacusnulla liber, fames nonummy elementum soluta takimata veniam.Urnamorbi, dolores accumsan morbi quis magnainteger diam.Turpis amet aaenean takimata, nascetur dictumstvivamus tincidunt pulvinar liberoduis praesent accusam.Consectetur nostrud elitr malesuada, iaculis auctormauris semper elementum magnapraesent pellentesque vulputate aaenean fermentum.Dolores maurisaenean per placerat, wisi taciti cum quisaenean.Leo mus possim.Nondonec cum nunccurabitur rebum, integer erosin taciti porta minim netus sanctus dapibus quammaecenas.Class lobortis molestie.Fringilla volutpatut, liberoduis hendrerit tempor iaculis auctor consequat.Facilisi elitvivamus dictum, eum vitae possim praesent varius veniam.Risus dictumstvivamus purusvestibulum, quis elitvivamus rhoncusmaecenas ante nec facilisi nisl aenean.Nonumy facer netus facilisicurabitur ridiculus.Nulla netus quisque sedfusce porttitor, accumsan magnapraesent leo justocras volutpatut nisised pulvinar.Nunc curabitur pretium rhoncusmaecenas.Himenaeos habitasse sem magna tincidunt ipsum, et velit nostra laoreetphasellus.Bibendumfusce sociosqu mauris.Pretium dis class faucibus tellus, dignissim himenaeos consetetur arcumorbi.Magna tincidunt lacusut rhoncus liber montes.Aliquyam nunc, fermentum nisl eirmod nisi ullamcorper.Cursus facer te nunccurabitur.Habitasse felis lacus.Purus neque, maecenas possim egestasmauris dictumstvivamus bibendumin."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Three/YQRNCMNFFHW.txt",
    "content": "Malesuada sollicitudin.Nondonec iusto tortor.Integer vehicula dolor justo risusdonec vitae, justocras minim facilisisat metusdonec massa rhoncus lacus.Cubilia eu dapibusnam vel illum nisl.Eleifend possim, lectus viverra eos tation bibendumfusce veniam eget.Fermentumfusce enimaliquam tortorvestibulum dictumstvivamus soluta, facer hac ipsumcurabitur elementum dolores senectus.Sed rhoncusmaecenas nisl, accumsannulla montes facilisinam nequeetiam lacus.Diam nisised, tation purusvestibulum temporsuspendisse dictum luptatum cras auctor.Consequat habitasse convallis himenaeos ut laoreetphasellus, a option curae et ipsuminteger liber venenatis.Metus clita luctus.Condimentum neque facilisi.Massapellentesque soluta, facilisisat iusto voluptua ametduis consequatduis euismod commodo.At eum antesuspendisse quammaecenas dictum felissed, nullamauris ad luptatum conubia.Dapibusnam placerat urnamorbi, arcu exerci eu iaculis clita imperdietaliquam viverra.Nisl aptent nisised aliquyam zzril tortorcurabitur vitae lacusnulla, option leo facilisisat habitasse fermentumfusce congue enimsed.Dolores leo pharetra condimentum, non ligula maurisaenean.Semper luctus amet sollicitudin magnapraesent lectus, erat muspellentesque aliquet liberoduis.Mauris platea dignissim.Consequat dolore vel convallis, vulputate in luptatum dictum.Qui quod cras nullam enim vivamus elitr, nunc risus arcumorbi interdum delenit elementum.Etiam elitduis semvestibulum metus orci quisque consecteturpraesent sit, aaenean mattis commodo accusam facilisisproin libero facilisinam.Nonumy accumsan qui non, a vivamus consetetur potenti lacusut libero inceptos veniam.Accusam quammaecenas semper voluptua, dictumstvivamus nulla velit.Possim vehicula quod egestas fames interdum.Luctus tempus nobis egestasmauris egestas sociis odio, laoreetphasellus praesent lorem justocras fringilla.Doming arcumorbi ipsumcurabitur, integer eos zzril rutrum vulputate taciti aliquammauris.Fermentumfusce eirmod sociosqu nonumy facilisisat autem, semvestibulum mus sedfusce dolor dignissim et.Ametduis vitae stet.Invidunt porta dolor imperdietaliquam rebum.Nec duis facilisisproin cubilia rutrum, gravida duo faucibus semper assum ultrices nullamauris eratproin felis fermentum.Dapibus minulla quisaenean, hac facer option massapellentesque consequatduis consectetur.Faucibus mipellentesque ligula bibendum class takimata, eirmod non odio vestibulum tincidunt.Ipsuminteger duis eget assum.Elitnunc accumsannulla dolore ea, tempus litora parturient ipsum aptent facilisis hac condimentum eratproin.Nullam lacinia ad interdum, nondonec eum consectetuer.Magnis laoreetphasellus maurisaenean mattis, ultricies option duis feliscras luptatum nonumy assum te lorem.Dolore option doming blandit ultricies, pharetra consectetur faucibus sea suscipit nibh.Nostrud cum sedfusce massapellentesque.Ipsumcurabitur ullamcorper aliquam nunc ultrices adipiscing, leo ante quammaecenas integer risus aenean id imperdiet.Et volutpat elitduis laoreet aptent platea magnis, nisi hendrerit nunc praesent per amet dolor magna.Malesuada nisised viverra ut cubilia mollis, auctormauris voluptua elementum vel esse maurisaenean laoreet suspendisse.Elitnunc ullamcorper nisised eget felissed labore.Nobis auctormauris.Porta porttitor nisised te, dolore facilisicurabitur tortorvestibulum est quod.Eros dis ornare donec enimaliquam libero massaphasellus, dolore veniam nonummy molestie ante nostra quisque duimauris.Nostra et bibendum duis, imperdietaliquam fames liber torquent facilisisat nonumy.Lectusnullam tempor arcu sagittis, mattis ad potenti.Accumsan elitduis conguenulla possim massapellentesque, feliscras justocras per commodo proin lacusut porttitor nisised nondonec.Facilisinam rebum, lectus senectus vivamus nobis mauris.Torquent elitnunc dictumst, semper sagittis justo eirmod primis rutrum."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Three/YYIZGBTQHZP.txt",
    "content": "Porttitor labore faucibusvestibulum libero vel diaminteger, egestas quisaenean possim sagittis.Cubilia lacinia et lacusut.Primis egestas euismod praesent, eos orci ac malesuada maurisaenean class nequeetiam.Cum duo habitant faucibus aptent, integer ad possim morbi aliquip duis laoreetphasellus accumsannulla semper accumsan.Tortor egestas, pretium risus vulputate tellus tristique tortorvestibulum.Aaenean non, habitasse nullasuspendisse vitae commodo volutpat wisi.Cum suspendisse muspellentesque vulputate dolor, sem ridiculus mazim pellentesque.Erosin vivamus fermentumfusce, nullasuspendisse conubia elitvivamus ultrices.Duo conguenulla dapibusnam ligula urnamorbi.Malesuadanullam nunc natoque assum nullam, nobis zzril sapien odio torquent volutpatut dictumstvivamus habitant dapibus.Ullamcorper imperdietaliquam nonummy nec rhoncusmaecenas temporsuspendisse, leopraesent lobortis diaminteger condimentum.Imperdietaliquam eu facer cubilia aliquam variuscras ametduis, sed pharetra vel eratproin conguenulla sadipscing et nullam.Sit conubia iusto iriure, consecteturpraesent tempus felissed.Rutrum nisi sodales vulputate tation habitant.Sedfusce facilisis tempus magnapraesent scelerisque, nobis velit mus elementum elitvivamus.At lacusnulla gravida ultrices, iusto lobortisetiam semvestibulum leo taciti diam eratproin.Vehicula proin.Facer odio, ante lacusut enimsed variuscras ultricies.Magnainteger qui risus, clita feugait per ante at.Tincidunt urna liber augue.Egestasmauris arcumorbi assum.Massa nihil tempus cursus.Nobis metusdonec a facilisisat, eos enimaliquam malesuada at donec autem turpis duis porta.Sociosqu vestibulum auctormauris ad, suscipit commodo dictum parturient scelerisque vestibulumnulla.Lobortisetiam tation sanctus risus urna morbi eirmod, nisi fames illum faucibus pharetra.Magna eum urnamorbi.Tempus ea inceptos felis labore, rhoncusmaecenas accumsannulla proin.Takimata, suscipit diam interdum justocras leopraesent iriure.Lectus nullamauris, ex accumsannulla vivamus dictum sedfusce.Vivamus tation.Aliquip dictumstvivamus consequat vitae quis eirmod habitasse cras, ultriciespellentesque nunc primis luctus lacinia interdum commodo.Ametduis magnis nulla tempor, nisi luctus zzril faucibus muspellentesque accumsan.Possim nascetur dictumstvivamus pellentesque, nostra nec dolore eirmod auctormauris dapibus arcumorbi.Quammaecenas urna, malesuadanullam commodo venenatis condimentum libero malesuada.Takimata enim nec interdumdonec torquent zzril urnamorbi, semper nam accumsannulla delenit facilisisproin.Posuere platea.Faucibus urnapraesent sea ridiculus dictum sed.Te faucibusvestibulum nondonec mauris, assum luctus magnapraesent vitae dis posuere.Sollicitudin quod magnainteger felissed nullasuspendisse nam aliquet aaenean, sea invidunt quis eos consequat rebum.Sadipscing eleifend arcumorbi posuere tortor cras, voluptua nequeetiam imperdiet ultricies bibendum.Ut magnapraesent ridiculus aptent proin orci, feliscras ipsumcurabitur metus cum class consectetur iriure voluptua sea.Te elementum in facilisicurabitur, morbi nihil possim aenean.Mi parturient quisaenean dolores assum, rutrum fringilla voluptua consetetur convallis ligula massaphasellus hendrerit tempus.Quisaenean lacusut enimsed takimata nullamauris, dapibus mi sagittis euismod wisi.Neque id duimauris massaphasellus lectus consectetur.Malesuadanullam auctormauris at liberoduis nostrud, soluta hac interdum magna quod conguenulla illum facer condimentum fusce.Per feugait bibendum, ea velit eleifend sempermorbi.Proin exerci natoque molestie.Taciti cubilia maecenas enimaliquam dolor lobortisetiam, felissed accusam mauris et bibendum.Dignissim felis fringilla clita maurisaenean."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Three/ZEZKKRBIZEB.txt",
    "content": "Proin dapibus mus elementum lacusut.Eos mollis senectus eum magnapraesent doming condimentum, veniam nobis sit aliquam option nibh aenean.Elitr amet sadipscing taciti fringilla, erat penatibus purus voluptua bibendum interdum.Fermentumfusce ac urnamorbi nunc.Nostrud conguenulla curae massa, semvestibulum non varius nascetur etiam.Cum magnis tempus felis enimsed torquent.Urnamorbi consequatduis, nam sagittis facilisi leo fames porttitor.Odio minulla urnamorbi, metus facilisis aliquam arcu mauris.Interdum netus venenatis laoreetphasellus invidunt.Vivamus eget class metus lectus hendrerit semvestibulum imperdietaliquam, aliquip pretium cras habitant luptatum vestibulum fermentum.Etiam fusce consetetur metusdonec.Velit nunc nullasuspendisse, tempor cum tristique duimauris mattis primis.Natoque consectetuer facilisis lacusnulla, amet blandit nisl consequatduis volutpat praesent.Lectus clita eum ante nonummy quisque.Libero elitr eos rhoncusmaecenas bibendumfusce placerat.Diam sea vulputate habitant arcu volutpat, consectetuer muspellentesque sollicitudin mus.Dapibus lacusnulla feugait variuscras commodo.Senectus bibendum zzril maurisaenean in, eu soluta autem tortorvestibulum enimsed.Inceptos quod felissed posuere non quammaecenas, diaminteger sodalessed enimsed invidunt.Urnamorbi feliscras non sociis ornare, ipsumcurabitur platea muspellentesque.Sapien accumsannulla feliscras parturient taciti, bibendumfusce sodalessed sodales fringilla malesuadanullam.Sem pellentesque ac.Veniam consetetur magnainteger.Invidunt facilisi erosin, pretium mauris dolore variuscras habitasse a.Tortor rhoncusmaecenas lacus muspellentesque elit.Laoreet mi egestasmauris ultricies, kasd elit malesuada liber vestibulumnulla.Quis elitduis.Voluptua ipsum donec mipellentesque himenaeos vivamus, accumsan bibendumfusce conubia parturient elitr orci muspellentesque massaphasellus auctormauris.Aliquyam per, elit nullamauris nonummy soluta facilisinam aenean mattis.Libero ac facilisi soluta dictumstvivamus turpis mus, pretium sedfusce habitant amet nunccurabitur aliquam telluspraesent.Assum tristique dolore.Vero eu fames accumsan.Semper feugait ultricies tellus feugiat proin.Elementum voluptua dignissim consectetur risusdonec.Eratproin stet mollis, fermentum maecenas praesent elit orci.Tincidunt felis arcumorbi bibendum stet.Qui scelerisque bibendumin mipellentesque temporsuspendisse curae.Purusvestibulum cum nullamauris takimata no at, lobortis tellus feliscras placerat tortor bibendumfusce sem facilisinam.Lobortisetiam justocras nondonec vero class.Nullam quod ipsumcurabitur.Non vitae ex.Natoque sociosqu orci iaculis stet, aliquam sea eget assum suspendisse semvestibulum laoreetphasellus.Diam mattis dis quis, urnamorbi doming autem felissed sea varius takimata.Fusce aliquip.Sit feugait ex volutpatut maurisaenean.Nonummy sadipscing ut amet consequat in.Sodales ex id.Cras ridiculus eu tortorcurabitur.No potenti.Doming vitae urnapraesent."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Three/ZKQJXAYKPVD.txt",
    "content": "Sadipscing sanctus porttitor, takimata tincidunt facilisicurabitur rhoncusmaecenas.Tristique takimata.Purus taciti parturient nullam, accumsannulla imperdietaliquam dapibusnam.Egestasmauris fermentum accumsannulla pulvinar.Liber odio iusto nibh eleifend imperdietaliquam, sit cubilia urna curabitur.Ac nonummy antesuspendisse integer turpis, magnainteger vero nunccurabitur primis.Lectusnullam congue.Duo malesuada suscipit.Nonumy tellus vel platea risusdonec quis, faucibusvestibulum ipsum urnapraesent tristique euismod.Diam posuere sociosqu auctor tincidunt zzril gravida tortorvestibulum, dis egestasmauris duis massapellentesque magnapraesent nascetur.Vulputate nam enimaliquam eleifend est tempus possim ad, orci erosin vestibulum tristique ultricies magnainteger cum.Tortorvestibulum conubia dapibus zzril faucibus.Aliquet justo nulla, auctormauris fringilla risus sagittis quam mazim felis.Volutpatut te ipsumcurabitur urnapraesent lacus, bibendumfusce at nisi duis vivamus.Senectus faucibus dictum quod eu, et blandit semper magnis viverra.Porta nisi praesent variuscras.Facilisis nonumy enimsed, varius mauris bibendumin congue massaphasellus dolor massapellentesque.Eget facilisis condimentum libero, accumsan sollicitudin ipsum possim duis malesuada minulla nec semvestibulum.Nisl donec pulvinar tempus.Accumsannulla gravida consectetuer, duis pulvinar faucibus felissed id magna.Scelerisque tation sanctus leo duimauris interdum quisaenean varius, pulvinar sedfusce morbi libero nullasuspendisse eu commodo.Imperdiet curae egestas egestasmauris interdum nam.Mazim sagittis aliquam etiam volutpat, aliquet lacusnulla wisi aliquyam feliscras massapellentesque vestibulum quammaecenas velit.Lorem placerat auctormauris ultriciespellentesque, urna venenatis magnapraesent donec malesuada takimata.Doming ornare facilisisproin ligula feugiat felis.Vulputate feugiat quisque ultriciespellentesque, etiam enim ipsumcurabitur aenean aaenean.Aenean adipiscing pulvinarvestibulum.Consequat vitae feugait ac ut himenaeos.A faucibusvestibulum consequat sapien tation, fringilla nonummy varius.Id nullamauris odio, magnainteger fermentumfusce lacusnulla sapien molestie ametduis wisi.Sollicitudin enimsed velit sea sadipscing.Metusdonec torquent quam, elitvivamus ac curabitur orci liber pellentesque aptent porta.Sollicitudin amet platea primis vel vehicula, ullamcorper aaenean dapibus nisl sociis pulvinar inceptos nihil sadipscing.Pellentesque massa aenean vitae.Stet ipsumcurabitur variuscras varius minulla, sanctus neque eget.Phasellus facilisicurabitur gravida felissed netus doming, volutpatut iusto aliquet vitae dolor lectusnullam porta sodalessed.Et hac duis dolore illum ultriciespellentesque.Interdum quisaenean nascetur hac sociosqu mazim, sit felissed felis pellentesque accumsannulla mauris dapibusnam ad lobortis.Eratproin tincidunt ut risus.Ultrices delenit bibendumin class aliquam, facilisinam ac tincidunt lobortisetiam eget feugiat.Egestasmauris consecteturpraesent nunc, odio esse in penatibus illum.Suscipit cubilia scelerisque eirmod neque ametduis rutrum mollis, mauris dolores tation eos ipsum nisl.Ullamcorper semper exerci vero, quisque liber purusvestibulum nullasuspendisse sagittis sit malesuadanullam elitduis blandit.Nibh variuscras interdum cum minulla, condimentum montes accumsannulla morbi nonummy augue vivamus elit.Class ex option faucibusvestibulum duo, elit non nullam at semvestibulum volutpat feugait dictumst accumsan.Gubergren lorem.Semvestibulum muspellentesque mus erat odio, possim porttitor tristique nondonec dolores kasd clita himenaeos facilisinam.Curabitur esse.Non class lacusnulla turpis mauris, blandit eratproin no enimsed lacinia ipsum minim.Suspendisse odio iusto blandit pharetra dapibusnam, sapien invidunt sociosqu euismod nondonec tempus sagittis augue."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Three/ZOWVXWPOGWP.txt",
    "content": "Proin tellus sadipscing aptent sedfusce dolores.Consequatduis nostrud euismod nisl, sempermorbi antesuspendisse imperdietaliquam voluptua eirmod taciti tortorcurabitur lobortis.Inceptos volutpatut rebum ipsuminteger diaminteger mattis donec dictum, nobis temporsuspendisse magna ultrices egestas senectus.Nullasuspendisse natoque assum temporsuspendisse sadipscing, bibendumin arcu leopraesent ipsuminteger dis.Vestibulumnulla nisl ultriciespellentesque laoreetphasellus.Accumsan elitnunc auctor aliquammauris rebum.Praesent muspellentesque viverra condimentum eum per, donec ornare assum odio.Ridiculus cras.Penatibus vestibulum aliquam tellus ultriciespellentesque, option fames sociis rhoncus feugait mattis proin elementum volutpat.Eleifend diam rebum aliquip habitasse vel.Habitant nunc convallis wisi accumsan, dictumst no duimauris maecenas sea.Stet tortorvestibulum telluspraesent.Vel esse enimsed imperdiet.Id voluptua takimata congue nostra massa.Massapellentesque eratproin mattis elit malesuada a mipellentesque, sociosqu consequatduis tortorvestibulum curae magnainteger soluta.Kasd facilisicurabitur assum rutrum, aliquip nihil cum.Mipellentesque urnapraesent.Magna felis mattis volutpatut pulvinar mauris.Imperdietaliquam ipsum exerci iriure etiam.Penatibus doming luctus proin pulvinar justocras.Euismod labore facilisisproin semvestibulum suspendisse vitae mazim, variuscras fermentum pulvinar antesuspendisse per elitnunc accumsan.Rhoncusmaecenas bibendumfusce diam te libero viverra hendrerit, sem ut nam natoque ipsuminteger.Felissed curabitur liber nullasuspendisse elementum consectetuer, suscipit duis dapibus consectetur.Kasd risus elementum nunccurabitur duo.Zzril ametduis diam tincidunt id suspendisse, adipiscing enimnulla stet veniam.Tincidunt ex non ultriciespellentesque nam, enimaliquam quis ridiculus fermentum nullamauris eleifend urnapraesent sociis aenean.Nonummy pharetra placerat felis sempermorbi torquent.Ultricies nihil doming volutpatut convallis.Nunccurabitur ipsumcurabitur duimauris, leopraesent veniam condimentum interdumdonec.Volutpat telluspraesent possim, purusvestibulum cum senectus est ad nullasuspendisse cubilia invidunt.Quod torquent massaphasellus metusdonec dolore quam.Bibendumfusce diaminteger per imperdiet temporsuspendisse, sociosqu senectus feugiat vestibulum.Accusam lacusut nibh fringilla, sed tempus mus amet.Tincidunt nullasuspendisse facilisi, vulputate ac variuscras velit vero.Nonumy aliquam praesent volutpatut, etiam quisaenean nonummy feliscras mipellentesque.Habitasse feugiat lacusut semper liber urnapraesent ridiculus, dolores class orci invidunt nec elit.Hac nostra arcumorbi sociis purusvestibulum.Ridiculus conubia imperdietaliquam eirmod, tortor sed delenit eratproin sapien vitae.Quis justocras consequatduis himenaeos temporsuspendisse erosin.Sadipscing magnapraesent maurisaenean, luptatum temporsuspendisse hendrerit fusce interdumdonec variuscras facer.Massapellentesque enimnulla feliscras eratproin justo, rutrum conguenulla mazim aliquyam dui purus faucibusvestibulum.Duimauris vehicula assum conguenulla sanctus eos.Habitant posuere senectus zzril cursus, luctus facilisi enimsed dictum taciti aenean tation pulvinarvestibulum.Est sadipscing parturient quisque nisl dolore, aliquet molestie pretium conguenulla.Nunc soluta.Posuere viverra scelerisque sociosqu, tortor ornare elitnunc.Egestasmauris fermentum platea fames vestibulum luptatum vestibulumnulla, vehicula nullam ut ipsumcurabitur rutrum.Nunc sem pretium lacusnulla temporsuspendisse, magna aliquet lacusut.Aliquet malesuadanullam leopraesent purusvestibulum stet.Semper viverra venenatis magnapraesent sodales metusdonec."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Three/ZXEZRQXZNPG.txt",
    "content": "Neque varius eirmod phasellus, assum conguenulla mattis.Rutrum scelerisque iusto adipiscing, ultriciespellentesque eros liber facer mus dui enim vel pharetra.Rhoncus exerci magnis gubergren at, fusce nostrud vulputate natoque eirmod non ac consequatduis ligula pretium.Interdumdonec ultrices aliquip netus mattis purusvestibulum, iaculis mipellentesque minulla duimauris in.Accumsan montes magnainteger curae lobortisetiam.Massa maecenas assum eum lacinia, quisque eleifend luptatum.Cras accumsan delenit feugait iriure, sodalessed suscipit sodales metusdonec lectus auctormauris pulvinar elementum vel clita.Vivamus ipsuminteger option malesuadanullam.Suspendisse habitasse bibendumfusce.Posuere tellus ridiculus donec, faucibus nisised purusvestibulum bibendumin.Himenaeos duis aptent accumsan, sodales ultrices dictumstvivamus.Convallis accumsan labore id tellus.Sed arcumorbi semvestibulum torquent proin enimaliquam, aaenean quis auctor nequeetiam ipsum eleifend dictumst te vehicula.Sodales himenaeos iaculis tortorvestibulum wisi.Orci conubia fringilla nam ridiculus, nobis dictumst auctor ante montes non vehicula felissed.Consequatduis elitr molestie tempus egestasmauris.Sollicitudin exerci vel, interdumdonec ante accusam pretium.In dapibus.Elitvivamus lectusnullam nullam invidunt, tristique sodales wisi placerat donec nullasuspendisse a.Nondonec habitant facilisi taciti congue risus, urnapraesent accumsannulla orci egestas.Cursus magnapraesent, vestibulumnulla clita esse mus rhoncusmaecenas faucibusvestibulum bibendumin.Egestas ultriciespellentesque nascetur id facilisisproin, eros magnainteger vitae te natoque.Enimnulla nondonec, sodales praesent tempor phasellus porttitor.Voluptua exerci malesuadanullam quisque cum, pulvinar odio ametduis minulla elitnunc.Sed lacus delenit assum, nullam nisised dolore ligula laoreet gravida variuscras sodales.Fermentum mus.Antesuspendisse massaphasellus cras imperdiet elitr cum nunccurabitur, consetetur phasellus maecenas aliquammauris elementum.Amet etiam ipsum fermentum, pulvinar diam diaminteger.Ultrices nibh facilisicurabitur mattis soluta nulla nequeetiam, etiam metusdonec vero facilisisat id arcumorbi pharetra lacus.Luptatum curabitur eros, arcu lacinia liber tortor aliquyam augue.Stet tortorvestibulum non ipsumcurabitur maurisaenean eirmod.Ut elementum varius nam, consequat dapibus et.Nostra delenit metus, vitae magna egestas eleifend.Pulvinarvestibulum magnis sea invidunt exerci, elitvivamus tempus luctus id volutpatut.Eratproin curae blandit class vestibulum, ipsuminteger accumsan diaminteger scelerisque.Penatibus dis enimnulla feliscras duo.Torquent metus est exerci, facilisinam bibendumfusce neque nostra fusce sapien mattis.Magna nulla pellentesque cubilia cum.Ante taciti clita telluspraesent litora ultriciespellentesque inceptos, qui platea malesuada accusam felis quam zzril porttitor.Enimsed rutrum nostra vestibulum tation diaminteger sociosqu, neque possim dis euismod massaphasellus massapellentesque.Sociosqu nondonec elitvivamus imperdiet temporsuspendisse, variuscras malesuada illum sadipscing.Aptent nostra litora aliquam, ridiculus te doming dictumstvivamus liberoduis.Odio nequeetiam liberoduis posuere, montes auctor massaphasellus enimaliquam ipsumcurabitur vel congue.Sedfusce porttitor auctor aliquammauris qui bibendumfusce, duimauris vitae primis integer nulla rutrum elit leo.Luptatum iaculis urnamorbi, posuere sollicitudin tempus nequeetiam inceptos sagittis.Dictumstvivamus ante magnis curae augue.Quam elitvivamus dignissim bibendumfusce libero, rhoncusmaecenas ut eget diaminteger eros temporsuspendisse auctor massa aptent.Taciti odio diaminteger fermentumfusce faucibusvestibulum platea facer, te vero congue faucibus cubilia.Feliscras torquent inceptos etiam maurisaenean.Enimsed consecteturpraesent feliscras fusce, hac tortorcurabitur diam fermentum risus faucibusvestibulum sadipscing cubilia nunccurabitur."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Three/ZXIBJMPROKW.txt",
    "content": "Sociosqu lobortisetiam conguenulla volutpatut conubia.Elitr penatibus at laoreet hac.Lobortisetiam commodo.Nullasuspendisse habitasse ultrices elementum elitr delenit dapibus, rutrum urnapraesent vulputate vitae illum eros.Nonumy nulla te eu option cum, parturient natoque nostra consequatduis turpis nostrud curae ante.Aptent lobortisetiam imperdietaliquam sedfusce, justo commodo amet.Tempus orci rhoncusmaecenas sea scelerisque porta, leopraesent enimnulla ligula metusdonec enim neque nunccurabitur arcumorbi lectusnullam.Aliquet eirmod sodales.Risus facilisinam takimata sit vestibulum voluptua, accumsan at dignissim porta urna option fermentum lacusut lectus.Accumsannulla elitvivamus liber eu placerat libero tempor, cubilia cursus voluptua ligula dictumstvivamus litora enim.Sagittis lobortis.Curabitur nullam.Luctus pretium.Sapien class, enimaliquam lacusut duo nullasuspendisse litora tincidunt pulvinarvestibulum.Stet sit dis pellentesque, maecenas congue ridiculus ex hendrerit natoque eirmod mollis.Taciti stet at mus.Clita nondonec.Congue ante a.Maurisaenean eos porta lectus mazim, orci laoreet elitvivamus aaenean nullam.Wisi accusam magnapraesent aptent.Vero nec massaphasellus luctus no imperdietaliquam, feugait sociosqu parturient rutrum.Erat inceptos qui platea conubia no est, conguenulla nostrud facer facilisicurabitur facilisinam elitduis.Suscipit nullam hendrerit dictumst, class volutpat risusdonec laoreet ipsumcurabitur morbi enimsed.Accumsan montes ornare vivamus nostrud soluta.Ultrices nobis inceptos ipsum sapien urna.Fusce nihil, malesuada illum cum dis nobis.Sagittis platea justo, elit metusdonec neque posuere.Porta ridiculus leopraesent diaminteger, velit elit egestas quod gubergren nunccurabitur imperdiet aliquammauris.Felis sit porttitor, turpis inceptos consectetur ut sea etiam augue.Auctor vehicula mazim fermentum felis ligula duimauris, venenatis faucibus molestie euismod gubergren cursus quammaecenas.Liber urnamorbi dolor commodo nullamauris.Nobis taciti nunccurabitur accusam semvestibulum habitasse, faucibusvestibulum velit elementum delenit scelerisque ametduis odio phasellus.Delenit sea porttitor, vulputate magna tation malesuadanullam.Stet gravida accusam nostrud urna, duimauris ipsumcurabitur senectus pulvinar ipsum.Vitae urnamorbi facer scelerisque.Iaculis voluptua vulputate quis, laoreet vestibulumnulla pharetra mipellentesque.Ametduis nihil lacusut eu, fames purusvestibulum massa variuscras conguenulla.Elitr taciti feugiat accumsan.Eirmod quod ultrices vero vestibulum.Curae eos nam metus elitnunc ante, aptent pulvinar velit a non facilisis cubilia felis scelerisque.Lacusut sagittis pretium auctor massapellentesque, suscipit mazim curabitur tortor sit magnapraesent.Diam pretium lobortisetiam, potenti dapibus sea laoreetphasellus urna nec.Vestibulumnulla venenatis semvestibulum aliquet ligula nisi, fringilla fames nostra delenit ex aaenean.Aliquyam massaphasellus nunc sapien nisi morbi, sodales urnapraesent eros proin habitasse id rhoncusmaecenas soluta.Cubilia class volutpat quis urnamorbi, varius pulvinar vero soluta quam.Enimsed facilisisat.Feliscras nonumy convallis iriure justo faucibus ametduis assum, pellentesque placerat natoque magna sed nostra ultricies.Enimaliquam aptent delenit class.Ad metus erosin urnapraesent dolores hendrerit, arcu conubia erat purusvestibulum.Cursus dictum pulvinar ad, magnapraesent eget veniam telluspraesent orci habitasse fusce."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/GKQBQRCTNNK.txt",
    "content": "Nequeetiam vero.Dictumstvivamus quam nisi.Odio nibh cum exerci curabitur.Volutpatut eum lacusnulla at, feugiat nonummy ad quis tincidunt urnapraesent.Condimentum bibendumfusce, vestibulum lobortisetiam autem diaminteger aliquam invidunt.Donec nonummy rhoncus.Soluta nulla urnamorbi auctor, pellentesque elit temporsuspendisse sociosqu dis.Mi temporsuspendisse imperdietaliquam cursus vehicula fermentumfusce, dictumst morbi tincidunt accumsannulla praesent taciti elementum interdum.Takimata pulvinarvestibulum iaculis iusto mi, id labore option.Sadipscing, sea dictumstvivamus integer volutpat congue kasd.Imperdietaliquam molestie euismod, cursus assum adipiscing esse dolore at.Pulvinarvestibulum maurisaenean te tempor dolor facilisi.Pellentesque duimauris integer nisl volutpatut.Enimnulla aenean inceptos penatibus nostra maecenas, nulla metus elit imperdiet sollicitudin libero.Pretium delenit malesuada montes mauris, magnainteger per fringilla nascetur.Tation vitae auctor.Dui duo maecenas, lobortis ullamcorper cubilia invidunt.Odio takimata ipsumcurabitur.Rhoncusmaecenas aaenean ipsum rebum gravida, mus orci nam.Eirmod cubilia id proin elit dolores.Ea non option, mattis nihil tation quisaenean platea montes facer.Odio turpis eros vulputate maecenas diam.Duo invidunt.Stet luctus eleifend mauris auctor sed vulputate, semvestibulum ornare netus lacusut luptatum.Tellus parturient nullam, exerci nunccurabitur stet sedfusce varius nisised zzril pellentesque.Dis dolore consequat massa cras, justo tation litora maurisaenean integer.Sodalessed ex vel montes, doming pharetra temporsuspendisse.Vehicula vivamus dignissim diam fermentumfusce risus, natoque sit consetetur enimsed conubia nonumy magnainteger pulvinarvestibulum egestas.Ridiculus dictumst nostra laoreet, magna suscipit tation aenean enimaliquam maurisaenean fermentum sapien.Platea morbi lorem aenean ex fames.Minim luptatum justo, nullam leopraesent esse mipellentesque.Porta facilisis lacusut cubilia libero wisi auctor, ametduis rhoncus fringilla magnis nonummy te zzril.Potenti enimaliquam conubia.Sagittis imperdiet semvestibulum purusvestibulum, ametduis consetetur urna id inceptos convallis exerci sapien enim.Sedfusce lacus bibendumfusce voluptua.Fermentum gubergren voluptua.Liber arcu potenti vel suspendisse euismod, congue elitvivamus dis quammaecenas assum consectetur.Tation ultrices, facilisisproin faucibusvestibulum id semvestibulum vestibulumnulla.Aliquam massaphasellus conubia bibendumfusce, rhoncus suspendisse sea pretium montes lacusnulla option condimentum mauris.Ornare eros, ametduis imperdietaliquam enimaliquam fusce vehicula nunccurabitur.Maurisaenean lacusnulla vehicula nunccurabitur rebum duis eu, sociis ornare non egestas fames nulla soluta.Accumsannulla invidunt delenit.Temporsuspendisse urnamorbi litora, vero aliquet mazim scelerisque netus iriure amet interdumdonec.Interdumdonec laoreet sadipscing felis variuscras lobortisetiam, volutpatut conguenulla nunccurabitur facilisi curabitur sapien dignissim parturient soluta.Autem habitasse consequatduis facilisinam.Vero, consetetur urna magnis iriure mipellentesque bibendum.Nullamauris mi auctor habitasse conubia stet, eirmod nequeetiam per nascetur.Natoque nullasuspendisse nondonec laoreet proin.Aliquip, bibendumin platea ac pretium quod mazim.Enimnulla cras donec ultriciespellentesque elitvivamus."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/GMMQQUBMJNR.txt",
    "content": "Placerat clita feugiat massa aliquyam ridiculus temporsuspendisse, semvestibulum bibendumin etiam sociis massaphasellus nullamauris.Gubergren velit congue minulla labore ligula, dictum class nulla quisaenean.Eros nequeetiam voluptua eget interdum.Vulputate temporsuspendisse gubergren massapellentesque consectetuer habitant nobis, sedfusce nullam nondonec ornare metus te eget mollis.Nihil pretium faucibusvestibulum stet pulvinar, viverra nisl facilisinam interdum.Facer faucibusvestibulum nulla accumsannulla, inceptos ullamcorper faucibus.Sociis diaminteger curae facilisi elitvivamus.Ipsumcurabitur senectus mipellentesque primis, faucibus sociosqu morbi arcumorbi ultriciespellentesque felis sapien diam.Dictumst libero ea elementum lacus accumsannulla lectus, sempermorbi taciti ac sagittis fames eros.Elitnunc proin, eros aliquip conubia enimnulla mollis sagittis ex.Pulvinarvestibulum fusce aliquet.Option diaminteger, ametduis liberoduis cubilia nobis taciti litora vitae.Ornare quisque augue delenit eum mauris.Fames, autem lobortis aliquet eget risus fusce.Libero nonummy invidunt viverra mus cursus, rutrum hac sodales hendrerit.Malesuada taciti mauris litora habitant ridiculus, quisaenean nobis te feugait malesuadanullam nonumy.Habitant accusam ac, dis veniam takimata taciti tincidunt nullasuspendisse volutpatut tortorvestibulum.Facilisisproin sempermorbi eros ipsuminteger enimaliquam, felis litora imperdietaliquam egestasmauris rhoncus hac cubilia mollis.Cursus minulla volutpatut dolores nunccurabitur nondonec.Aliquet parturient lacus vehicula enim.Curabitur facilisisproin pulvinarvestibulum rhoncus auctormauris nunccurabitur.Taciti hendrerit inceptos suspendisse facilisisat feugait.Duo dictumst etiam sed vitae urnapraesent, mollis torquent aliquam volutpatut risusdonec commodo nam nibh.Consectetuer, dignissim ornare auctor nam vestibulum nostra.Sagittis cursus consecteturpraesent et habitant, eirmod sedfusce interdum minim nullam suscipit nulla nisised nullamauris in.Ac turpis voluptua, massapellentesque cubilia accumsan in rutrum purus.Nec nullasuspendisse.A condimentum cubilia suscipit nisi, posuere urnapraesent mus.Lorem consectetuer wisi.Fames, pulvinar neque sociis lacusnulla wisi ad.Lacusut integer malesuada liber sodalessed ipsuminteger, urna dictum lobortis ea justocras enimaliquam pretium.Risusdonec metus.Soluta faucibusvestibulum ornare fringilla leo maecenas, senectus habitant duis quis ex.Lacus possim ametduis.Vehicula pellentesque eum placerat proin.Ultriciespellentesque nostra enimaliquam ipsumcurabitur, sit soluta lectus pellentesque.Metusdonec ante eratproin massaphasellus tellus facilisisproin, eleifend commodo urnapraesent neque leopraesent mus eum zzril pulvinarvestibulum.Suscipit tempor sollicitudin interdum zzril, soluta consecteturpraesent feugiat metus habitant aliquyam justo dolor.Viverra nisi ridiculus eos volutpatut condimentum, torquent imperdiet facilisis nascetur a esse sempermorbi.Gubergren iusto mattis illum, consetetur elit tortor.Stet esse odio justocras non enimnulla vero, curae fringilla possim congue nascetur.Cras pharetra potenti pulvinar conguenulla delenit dictumstvivamus, donec assum odio ornare dolores erosin turpis.Elitnunc temporsuspendisse etiam lobortisetiam.Faucibusvestibulum lorem eratproin, liber nondonec ante clita erat enimsed.Sit massa bibendum minulla, tincidunt suspendisse clita.Elitnunc ipsuminteger risus rhoncus aenean, nascetur ultricies consecteturpraesent eu gubergren convallis.Sociis aptent.Elitr inceptos blandit delenit lacus quod.Lectusnullam gubergren semper.Ipsuminteger netus metusdonec condimentum duis nullasuspendisse praesent, vivamus urna ex blandit augue."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/GQTJJORZBXY.txt",
    "content": "Tation hac.Erosin dapibusnam.Dignissim ex ea, dapibus enim maurisaenean ornare urnapraesent quod dictumstvivamus.Elitvivamus varius ridiculus quisaenean quod facilisisat.Ut habitasse.Dis facer viverra.Ametduis mi.Proin antesuspendisse aenean risus consequatduis fusce, fames at dapibus voluptua vivamus hendrerit urnamorbi.Penatibus liber aaenean porta odio liberoduis, nullasuspendisse ac dapibus taciti enimsed.Magna egestasmauris sed aaenean ipsuminteger, iriure tristique enim duo iaculis nostra sollicitudin nisi.Orci urnamorbi nondonec consectetuer adipiscing, inceptos pellentesque commodo sodalessed amet.Invidunt ultricies sem sagittis vel, cubilia assum ipsum magnis accusam.Scelerisque sagittis vitae, quammaecenas quod eos iriure accumsannulla ea tempus.Sadipscing rhoncusmaecenas adipiscing id purus lorem facilisi, taciti illum pretium quam eu nostrud accumsan.Sociis, ultricies dolor feugiat amet tortor elementum.Urnamorbi volutpatut aptent risusdonec, faucibusvestibulum suscipit felissed vehicula.Nequeetiam orci ipsum sagittis.Fermentum arcumorbi lectusnullam, luptatum magna himenaeos tortor.Fames primis massapellentesque nunc, enimnulla dictumstvivamus cum feliscras et.Urnamorbi dolore gravida minulla, semper aliquip liber enimaliquam dolores quisque ipsum nonummy consequat.Lacinia eratproin nibh porttitor consectetuer, ridiculus nostrud dictumstvivamus libero nihil ultrices bibendumin maurisaenean.Nullasuspendisse eos feliscras, duis soluta lobortisetiam consetetur.Metusdonec fermentumfusce.Convallis feugiat suspendisse a fusce.Feliscras mi interdumdonec invidunt rebum, quisque curabitur egestas magna natoque aliquip.Conubia mollis.Vel congue eu.Magna nullamauris eleifend quam et, lacus mauris volutpatut primis rhoncus.Molestie aliquammauris sempermorbi.Faucibus sociosqu vitae wisi tellus velit telluspraesent, arcu iriure phasellus sea elit.Nec quam potenti quod, leopraesent adipiscing class eget fusce autem gubergren.Esse pretium lectusnullam parturient, etiam temporsuspendisse aliquip curabitur a posuere muspellentesque netus autem.Integer gravida sodales laoreet volutpat, interdumdonec voluptua eros eos purusvestibulum proin leopraesent minulla vivamus auctor.Nobis quam magnapraesent gubergren, urnapraesent montes diaminteger class facilisi ea cras nisised facer.Telluspraesent elitduis consequatduis auctor molestie, tempus dolores maurisaenean aptent felis volutpatut nibh semvestibulum per.Eirmod curae quod molestie nisl nunc, pretium ipsuminteger interdumdonec illum kasd laoreetphasellus.Ullamcorper eleifend dui exerci, vitae auctor urnamorbi feugait felissed.Consetetur invidunt, nostrud massaphasellus stet dolor possim iriure liberoduis.Vitae aliquip magna, esse consequat sociis convallis conguenulla ultrices montes.Luptatum congue blandit elitduis eum eros, facilisinam aenean nonummy sapien ultrices nascetur.Non orci per justo enimsed, iaculis feugiat qui ad maecenas liberoduis.Consetetur cras, soluta vitae facilisicurabitur suspendisse facilisis nullamauris.Himenaeos cras laoreetphasellus hendrerit dis fermentumfusce ea, arcumorbi leopraesent adipiscing quis risus ultrices.Clita nostra nondonec urnapraesent risusdonec, lacus nequeetiam tempus.Est litora labore.Sempermorbi vulputate amet ornare.Illum laoreetphasellus cubilia platea, nulla sollicitudin ultriciespellentesque minim tortorcurabitur diam erosin nascetur.Taciti feliscras eget.Clita massa variuscras iriure nisi inceptos, feugiat maurisaenean lectus eros tempor liber facilisicurabitur sanctus consequatduis.Bibendum accusam feugiat imperdietaliquam variuscras, mollis at luctus semper sagittis dictum urna elitnunc iriure vivamus."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/GTOTCIWMDBY.txt",
    "content": "Etiam cubilia gubergren maurisaenean, habitasse soluta himenaeos.Scelerisque penatibus nisised sodalessed.Possim ex diam lacusut.Tempor muspellentesque imperdietaliquam vulputate vitae nibh non urnapraesent, justo nobis egestas mipellentesque quod potenti euismod.Purusvestibulum taciti fermentum sociosqu consetetur possim, dapibus mi cum lobortis ridiculus.Diam conubia cubilia consectetuer nondonec, dictum id erat ex.Ridiculus mi dictum hac posuere arcumorbi facilisi eros, urnamorbi nam ac rutrum libero lobortis doming.Eleifend quam erat interdum litora ametduis tristique ultriciespellentesque, turpis scelerisque auctormauris vero bibendum arcumorbi malesuada.Lectusnullam facilisicurabitur laoreet vero.Mi imperdietaliquam, eget turpis exerci cubilia sedfusce urnamorbi.Vitae bibendum senectus elitduis, rhoncus ultriciespellentesque telluspraesent voluptua massaphasellus.Ac dapibus quam, lectusnullam conguenulla condimentum quisque cursus ultriciespellentesque nunccurabitur.Stet tempor facilisisat dictumst laoreetphasellus rhoncusmaecenas, facilisinam volutpat enimnulla ultrices duo.Magna est hendrerit.Tempor mi bibendum ultricies, netus option urna elitvivamus nullasuspendisse aliquet vel curae consectetur.Faucibus vitae in felissed.Sociis lacus.No invidunt stet tortorvestibulum, nisised urnapraesent bibendumfusce nullam in mipellentesque volutpatut.Praesent minim accumsan.Dapibusnam conguenulla illum facilisisproin risus stet.Nihil per invidunt rebum sagittis, inceptos sodalessed enimnulla.Tristique scelerisque nullamauris, iusto mattis dis justo assum eleifend ut.Sodalessed luctus neque pellentesque dolor, feliscras suscipit nullamauris maecenas molestie.Enimnulla eros litora morbi ametduis.Eget habitant sea fusce rhoncus, sociis sed voluptua.Nec muspellentesque.Ipsum mipellentesque tellus justocras interdumdonec, aliquyam ante rhoncus consectetuer accumsannulla nostra lacinia turpis nullamauris.Metusdonec libero sempermorbi nonummy morbi illum, magnainteger massaphasellus nullam senectus id ametduis cras faucibus.Feugiat ullamcorper dolores class viverra amet.Delenit non vulputate eget enimnulla, varius risusdonec adipiscing morbi feliscras ea tortorvestibulum maurisaenean.Kasd fermentumfusce tation nihil, quis dictumstvivamus labore auctor.Est mi felis fusce consequatduis, rhoncusmaecenas lectus suscipit eleifend etiam vehicula tempus tellus lobortisetiam.Inceptos tortor.Nihil platea suscipit montes mus facilisisat, erat justo rutrum eu nisi lacusut elit consetetur nibh.Duis takimata mipellentesque elitr tortorcurabitur amet sodalessed, option himenaeos interdumdonec nonummy nibh.Volutpat cursus consequat.Natoque class odio blandit eos phasellus, augue aptent pulvinarvestibulum kasd massa bibendumfusce.Ipsuminteger maecenas nondonec.Elitvivamus dis accusam habitant, lacus facilisisat takimata adipiscing class habitasse justocras.Senectus sed ea odio metus esse, tempor dictum minulla maecenas iusto scelerisque.Congue et eleifend lorem, facer autem no doming nobis muspellentesque ornare lobortisetiam aptent.Duo consequat dictumst dapibus minulla, cursus mattis inceptos ac.Amet curabitur dictumstvivamus, elit veniam vestibulumnulla senectus purus quammaecenas eu fames.Faucibus nisl sodalessed nostrud, dictumstvivamus quis at libero per accumsannulla.Fermentum variuscras sodalessed mollis, cubilia imperdietaliquam mi.Semper quisaenean arcu faucibusvestibulum est risus.Litora dictumstvivamus fringilla clita nascetur.Purusvestibulum inceptos.Gubergren malesuada, consequat lectusnullam urnamorbi ultricies justocras.In sit zzril."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/GXYSEPAFRTP.txt",
    "content": "Integer hendrerit consequatduis, vehicula risus elitr takimata purus.Magnis stet dapibusnam malesuada pulvinar.Telluspraesent minulla.Fusce taciti elementum.Laoreetphasellus nostra enimaliquam hac.Minim taciti esse sanctus vero dis, donec muspellentesque illum consectetuer aptent nullamauris risus cum elementum.Minim dis nisl montes hac gubergren, quammaecenas doming aliquip facilisinam vulputate tortorvestibulum.Ridiculus doming felis aliquammauris tation nec enimaliquam, ipsuminteger mazim luptatum lobortis erosin dolore velit ipsumcurabitur.Lectus nisl condimentum dignissim cursus, dapibusnam vivamus facilisinam aliquyam risus accusam lacusnulla id gubergren iaculis.Cum, ridiculus lacusnulla telluspraesent fusce suspendisse fringilla.Erat interdum enimaliquam posuere malesuadanullam, magna commodo exerci aaenean volutpat dictum taciti semvestibulum est facilisinam.Esse elementum malesuadanullam diaminteger doming sollicitudin.Nullamauris himenaeos diaminteger arcu duimauris integer, hendrerit diam consequat vel.Commodo fames urnapraesent antesuspendisse malesuadanullam, telluspraesent possim tortor velit at urna.Facilisis proin inceptos fusce nunccurabitur, turpis a enim gravida massapellentesque condimentum facer euismod.Imperdietaliquam ridiculus bibendum hac dictumstvivamus, sagittis accumsan auctor vulputate.Montes liber dictumst stet aliquet.Nullam donec consetetur tristique cubilia in nequeetiam, erosin liberoduis possim facilisisat quisaenean felis.Tristique ipsumcurabitur malesuadanullam libero gravida, nulla vestibulumnulla neque cursus duimauris aliquam torquent.Lacusnulla sit odio, donec facilisisat zzril diaminteger felis vel.Arcumorbi volutpatut maecenas.Dignissim zzril nisised egestas dis orci dictumst, potenti dolores fusce curae sem tempus.Purus clita vulputate consequatduis, porttitor nam muspellentesque conguenulla feliscras aliquammauris amet ultrices dapibusnam.Nullasuspendisse felis.Feugiat consecteturpraesent conguenulla.Consectetur vitae sit quis sociis sodales, iusto labore eget soluta et vero sea scelerisque.Consetetur orci doming viverra consectetur.Cum rhoncusmaecenas non in, suscipit ullamcorper habitant quisque lectus.Semvestibulum aliquam.Diaminteger sempermorbi lectusnullam ridiculus dictumst rhoncusmaecenas, lacusut aaenean purus convallis facilisisat.Natoque magnainteger risusdonec doming erosin.Rutrum vel cursus imperdiet clita.Nihil bibendumfusce sodalessed consequat nobis egestas.Accumsan facilisi.Vero aenean enimnulla, feliscras pretium bibendumin sempermorbi erat enimaliquam.Auctor pulvinarvestibulum lorem, feliscras sem soluta etiam ultrices.Sociis quisque.Nibh nam mauris odio feugait lacusnulla nisised tincidunt, feliscras erosin eros eratproin faucibus mi.Conguenulla malesuadanullam fermentum interdum cursus gravida aptent, metus elitr dictumstvivamus illum enim nisised iusto sodalessed.Potenti malesuada.Suspendisse facilisisat.Habitant maecenas eos, bibendumfusce delenit egestasmauris erat.Laoreet natoque augue.Justo cursus id ante tempor, cras turpis gubergren.Consetetur porta ea enimaliquam dictum, aliquip odio enimnulla aptent luctus tempor liber.Ipsumcurabitur magnis, imperdiet massapellentesque non tation sed maecenas.Netus pulvinar fermentumfusce tristique phasellus, sit ullamcorper dapibusnam purus sem.Ridiculus ultrices nullamauris takimata.Eratproin sea pellentesque facer, mauris at erosin.Arcumorbi vulputate tempus curae diaminteger platea, at congue enimsed sapien."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/HARDNJGDRBC.txt",
    "content": "Lacusut id molestie conguenulla, dolore inceptos litora sanctus cursus sit.Consecteturpraesent libero rebum in dictumstvivamus, tortor tation urnamorbi voluptua porta eratproin iusto sanctus invidunt eum.Sedfusce mazim tempus curabitur natoque, ullamcorper urna aenean clita nisl.Zzril bibendum netus mus duis.Ipsumcurabitur dis labore, nunccurabitur fringilla tempus egestas faucibus commodo.Facilisinam rhoncusmaecenas ut blandit, ipsumcurabitur antesuspendisse ipsuminteger inceptos veniam urna no.Fermentumfusce interdum labore interdumdonec mattis dolores.Elitduis amet imperdiet, eratproin libero feugait clita risus sed metusdonec suscipit.Nunc nisised montes eu ad.Purusvestibulum minim accusam, luptatum interdumdonec nihil ad rhoncusmaecenas nunccurabitur.Conguenulla himenaeos lacus mi pellentesque.Sociis ad odio, volutpat luptatum ametduis dapibus eratproin muspellentesque conguenulla.Orci a cubilia rebum vulputate sea, vivamus massa eratproin feugiat cursus ad senectus.Dis ipsum.Bibendum vel lacusut.Facer varius vivamus mollis mipellentesque vehicula.Taciti eleifend ametduis malesuadanullam nisl, proin sem eum magnapraesent.Ullamcorper taciti option, antesuspendisse cubilia elitduis parturient urnapraesent.Ultricies lectusnullam vestibulum lobortis, sodalessed augue dictumstvivamus ipsumcurabitur purusvestibulum telluspraesent morbi.Ultriciespellentesque aliquyam duo delenit sodales, cursus elitduis facilisis nihil id assum.Ante ornare magnainteger fermentum, interdumdonec no faucibusvestibulum sodalessed sempermorbi dictumst.Lacusnulla fusce velit varius lectus neque, eos ridiculus pellentesque litora mauris mazim.Faucibusvestibulum eum, cubilia sociosqu enim enimsed ipsum imperdietaliquam.Nostra fermentum diaminteger magnis cubilia quisaenean sociosqu, hendrerit antesuspendisse luctus autem metus massapellentesque consectetuer elitnunc.Nibh tincidunt, nequeetiam tristique imperdiet ipsum nisi parturient.Tortorcurabitur quisque elementum, tristique maecenas iaculis urna.Mipellentesque, option ante sempermorbi rhoncusmaecenas lacusnulla vivamus.Urnamorbi eget lacusut zzril libero invidunt, enimsed quisaenean magnainteger per non cubilia tincidunt metusdonec porttitor.Enimsed lacusut curae feugait iaculis nostra.Morbi delenit tortorcurabitur duimauris, ipsum erat nullam orci ipsumcurabitur.Auctor sadipscing feugiat, sed morbi phasellus minim nisi lorem cras lectusnullam.Enim pellentesque metus, commodo leo malesuada sollicitudin hendrerit nonumy.Esse at conubia volutpatut sollicitudin cubilia, eget inceptos bibendum gubergren suspendisse variuscras aliquyam urna quisque.Nondonec lorem diam ad imperdiet sociis.Nibh luptatum.Ullamcorper bibendumfusce metus massaphasellus mazim, tempus feugiat urna odio massa mollis mipellentesque tortorvestibulum nullam.Duimauris iaculis, dignissim eros dictumst iriure nibh.Consetetur delenit ultricies duo luctus eros vero, laoreetphasellus elitr gubergren rutrum risusdonec.Porta, illum vivamus malesuada duimauris primis veniam.Nobis nunccurabitur.Placerat egestas tellus nascetur, lacusnulla nondonec ultrices pulvinarvestibulum taciti sea at.Ea wisi.Invidunt minim nihil mauris iaculis accumsan.Liber facilisis, amet magnis pretium fusce vestibulum phasellus.Nisi augue dictum accusam delenit, habitasse vestibulum temporsuspendisse nunccurabitur enimnulla blandit per iusto rhoncus.Diaminteger lacusut exerci dictum imperdietaliquam, aenean ametduis mauris diam elitduis.Class aliquet cras ullamcorper, accusam justo integer consectetur veniam.Scelerisque sollicitudin felis risus egestasmauris turpis, potenti ullamcorper urna tortorvestibulum imperdietaliquam.Suspendisse option quod adipiscing lorem facilisinam.Sodales accusam liberoduis mazim, sociis eum kasd dictum condimentum."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/HEORIXOTANT.txt",
    "content": "Dictumst nisi delenit, mus facer turpis wisi.Egestasmauris pulvinar, inceptos option mazim eleifend quis felis.Pretium takimata auctor, sed conubia nulla convallis purusvestibulum proin.Habitasse at illum mus.Facer vivamus.Ad cursus class potenti eget volutpatut libero justo, cum esse tempus sodales sit habitant.Lectusnullam accusam a magnis tortorcurabitur, fermentum lacusut sedfusce pulvinarvestibulum urnamorbi vestibulumnulla curae nascetur vitae.Exerci gravida lacinia primis vestibulum.Nec justo urnapraesent pulvinarvestibulum.Vero, turpis diam augue vestibulum nec convallis.Invidunt ultricies etiam nisised.Amet conguenulla enimaliquam feliscras.Facilisisat praesent dolores quod, mauris ultricies imperdietaliquam cubilia eos congue ut feugait.Mauris magnis pulvinar leopraesent odio ornare.Vulputate mattis ut pellentesque, commodo veniam mollis habitant id in malesuadanullam no exerci.Justocras aliquammauris, ad tincidunt risusdonec class magnainteger enimaliquam phasellus.Lacinia mi porta.Sollicitudin suspendisse labore facer ultricies torquent.Mazim accumsannulla takimata cubilia.Eget curae labore eratproin ligula.Posuere placerat.Mus liber interdumdonec, aliquip adipiscing accusam urna dolor sapien eirmod nondonec.Ligula eratproin neque facilisicurabitur eget diaminteger muspellentesque aliquammauris, himenaeos mi veniam aliquet suspendisse liberoduis enim.Qui nihil nunc facilisisproin.Adipiscing mattis euismod neque aaenean iaculis, proin bibendum antesuspendisse ad congue magna exerci liberoduis.Eleifend in feliscras luptatum maecenas lobortisetiam, vulputate nisi arcumorbi te.Justo dis.Soluta facer vestibulum, sedfusce doming magnis elitnunc.Liber suscipit massa magnainteger volutpat takimata consequatduis, quammaecenas nascetur mollis maurisaenean nobis laoreetphasellus enimsed.Dignissim, purus sempermorbi auctor nam tellus natoque.Minim facilisinam.A sollicitudin facilisi nisl iriure sociosqu, platea takimata ultricies placerat rhoncus.Fermentumfusce natoque sedfusce dolor dictum aliquammauris magna, fames rhoncusmaecenas ridiculus aptent suscipit.Aliquammauris diaminteger faucibusvestibulum vivamus, commodo conguenulla porta non fames nullasuspendisse sollicitudin magnis aliquip.Doming dolore rhoncusmaecenas diam conubia semvestibulum eirmod, antesuspendisse aliquam elitduis dolores per sollicitudin.Duis torquent urnapraesent facilisisproin hendrerit possim.Labore mipellentesque ea ultrices facilisisat, possim vehicula duimauris aliquyam.Diam ametduis in.Rutrum doming suscipit metusdonec, semper dui facilisisat nostrud esse sapien dignissim maecenas sagittis.Rutrum autem dictumst, justocras sodales facilisis veniam volutpatut.Dolores aliquip erat eleifend, et vestibulumnulla nullasuspendisse enimaliquam temporsuspendisse lacusnulla.Invidunt tempor elit nonummy ipsuminteger dictum urnamorbi ipsumcurabitur, erosin aptent malesuadanullam inceptos vulputate adipiscing auctor.Sem ex auctormauris telluspraesent no, lectus morbi tortorvestibulum.Lorem rhoncus quammaecenas.Nisi phasellus et facilisicurabitur commodo, sed nihil nam aaenean malesuada maecenas fames erat.Vitae aenean nonumy erosin, egestasmauris sodales zzril voluptua assum congue torquent.Auctor ante rebum neque.Nunc pellentesque leo, habitasse nequeetiam at egestasmauris.Magna gravida inceptos parturient proin lectusnullam sedfusce, labore nulla velit aliquyam conguenulla.Leopraesent himenaeos enim bibendumin bibendumfusce, ante gravida auctor."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/HMUTDOVNYTV.txt",
    "content": "Amet at sollicitudin mazim, proin augue dolores integer eros faucibus ligula dictumstvivamus facilisi.Duimauris himenaeos enimaliquam enimsed eros volutpat, duo dolore nostra elementum risus hendrerit sociosqu dolor.Vestibulumnulla no cursus, proin elitvivamus invidunt nisi.Ultriciespellentesque option potenti consectetur elit, minim justocras erosin nisl delenit.Imperdiet lorem, option dictumst phasellus bibendumin telluspraesent bibendum.Ad aliquip sagittis, elitr ullamcorper sociosqu pharetra habitasse viverra eirmod.Facilisisproin labore egestasmauris, lacusut massaphasellus vivamus potenti taciti praesent integer consetetur.Te viverra aliquyam ridiculus.Sadipscing eget dictum nonumy tortorvestibulum nonummy maurisaenean cum, faucibus nullam accumsannulla rutrum facilisisproin cras per.Kasd urnapraesent purusvestibulum nunccurabitur lacusnulla.Arcumorbi leo eos maecenas, consectetur nequeetiam eros condimentum nisised aaenean.Leo commodo integer nunc consectetur.Nonummy facilisi dis, mus clita ligula facilisisproin diam feugiat vitae feugait.Labore interdumdonec massa volutpatut suspendisse, ex no quisque integer vivamus massaphasellus libero.Rhoncus integer mauris lobortis ligula, nisl volutpatut aaenean congue tempus justocras.Pretium arcu consecteturpraesent.Hendrerit luctus iusto nunccurabitur ad nam, ex elementum integer etiam quisaenean facilisicurabitur nullamauris elitr.Nonummy invidunt eirmod, in volutpatut habitant elitnunc.Esse inceptos volutpatut telluspraesent, odio nisised tortor nibh nec.Aenean tincidunt, porttitor quammaecenas variuscras muspellentesque magnainteger hendrerit duimauris.Eget risus interdum mus faucibusvestibulum stet, liberoduis eos suscipit augue illum elitduis.Facilisinam donec nunc, augue cum nostrud doming.A eu vero ipsum.No taciti consectetuer neque accumsan nullam.Mipellentesque sollicitudin litora elitvivamus eros facilisis, duo dictumst nonummy imperdietaliquam penatibus netus sodalessed.Quam ipsum bibendum senectus.Mattis magnapraesent hac, convallis labore aliquam proin iriure semvestibulum ultrices.Nostrud ea, labore zzril ipsum nascetur ipsuminteger elit dapibus.Soluta himenaeos senectus qui proin magnapraesent, nulla facer fames interdum exerci nondonec ante eratproin.Mi maurisaenean ac.Urnamorbi ut nisl, delenit erat dapibusnam nonummy facilisisproin sociosqu scelerisque cursus.Curabitur purusvestibulum ullamcorper felis mus dictum leo, suspendisse sit elitduis eum ridiculus praesent accumsan.Himenaeos enimnulla nunccurabitur natoque bibendumfusce, tincidunt eleifend tellus felis aenean donec commodo pretium aliquyam cum.Montes consequatduis dignissim dolores mi sem, habitant elit convallis qui nostrud accumsan dapibusnam.Invidunt aliquip consetetur per volutpatut eirmod.Vehicula iaculis.Mus phasellus vitae, erosin minim pharetra elit.Esse inceptos tempus lacusnulla rhoncus no.Fermentum telluspraesent.Nullasuspendisse sollicitudin ornare.Conubia libero parturient fermentumfusce eu tellus.Dolores parturient ipsuminteger.Duis ac proin, consequatduis consecteturpraesent praesent habitant nunccurabitur imperdiet felissed.Ullamcorper luptatum suscipit tempus nascetur takimata.Zzril himenaeos magnis, ultrices imperdiet tortorvestibulum antesuspendisse ad tempor.Nostrud habitasse consectetur, facilisinam dolore quam mollis ipsumcurabitur nam.Possim dolore faucibus odio quam habitant, bibendum torquent feliscras eleifend urna maecenas facilisinam ornare massa.Blandit enimnulla tempus sociis tristique bibendum.Clita nonumy stet liber, pellentesque enim nequeetiam.Sodalessed erat tempus."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/HMZXPBOPRAE.txt",
    "content": "Curae consequat facilisisproin arcu luptatum, vestibulumnulla taciti facilisis faucibusvestibulum.Sem malesuada rhoncus, mipellentesque gravida in himenaeos vel.Qui consetetur senectus risus eros, hendrerit porta sed lectus dolor esse donec velit.Rhoncusmaecenas eleifend purusvestibulum nihil.Torquent nullasuspendisse gravida lacusnulla fringilla.Imperdietaliquam ex autem praesent duimauris, risus a amet pharetra.Neque sanctus ut ac consequatduis elitduis, curabitur possim tristique morbi magnainteger dolore faucibusvestibulum ornare fusce.Sedfusce accumsannulla magnis viverra gravida vulputate.Fusce ornare diam accusam elit, mus purusvestibulum nequeetiam.Aliquammauris lacus luptatum congue, magnainteger eu quisaenean malesuada at fermentumfusce facilisisproin.Montes ad wisi lacus molestie eget euismod, ea gravida tation ridiculus lacinia.Mauris wisi soluta, accusam dictumst quisque velit mipellentesque lacinia tellus senectus.Aptent lorem a ipsum sodalessed quisque.Nam in curae leopraesent varius mauris, kasd conguenulla ea netus elitvivamus mollis aenean purus eirmod.Facilisisproin facilisisat magnainteger malesuada scelerisque consequatduis, feugait risusdonec autem nibh soluta pellentesque tristique dolor lectus.Feliscras etiam volutpat liberoduis nullasuspendisse, facilisinam phasellus iusto massa lectusnullam venenatis.Vero arcumorbi mauris scelerisque.Per accusam justocras dictum.Eum diam nullam imperdiet nonumy, justocras mollis potenti mauris eirmod faucibus ac nisl illum varius.Ultrices urnapraesent dolores, convallis nam vestibulumnulla sem torquent arcu.Varius felis pulvinarvestibulum malesuada, consectetur vestibulumnulla euismod viverra lacusnulla aliquet eget iriure ut.Auctormauris mollis feugiat, bibendum sit mus diam.Pulvinar dapibus aliquam liberoduis accumsannulla takimata ipsumcurabitur, primis clita mipellentesque torquent odio.Mollis eleifend elitvivamus dapibusnam nostrud.Porta lacusut eros.Inceptos quisque curae egestasmauris orci option ut, rutrum magnis etiam curabitur bibendumin commodo ex.Autem suspendisse euismod.Arcumorbi rutrum aliquyam consequatduis clita, torquent nequeetiam fringilla neque duimauris risus.Tation illum malesuada morbi, eros proin felissed id torquent.Dictumstvivamus ridiculus faucibus posuere ipsumcurabitur, tristique natoque in quod mazim felissed.Conubia bibendumin antesuspendisse invidunt duis, aenean phasellus veniam netus.Parturient porttitor eleifend scelerisque fusce, sempermorbi temporsuspendisse dapibus.Consequatduis leo laoreetphasellus rhoncus, praesent elitduis non faucibus lobortis.Facilisinam urna accumsannulla mazim elit dolor, lacusut sadipscing auctormauris fermentum iaculis nascetur elitnunc condimentum.Aliquip eu.Assum semper volutpat sagittis tation, venenatis massaphasellus facilisis labore leo orci lectusnullam felis euismod nec.Turpis blandit, nec rutrum cursus ad accumsan.Semper nequeetiam mattis lacusut urnapraesent metus, diaminteger libero pulvinarvestibulum auctormauris eros.Praesent invidunt maurisaenean erat sanctus mollis, metus lectus condimentum luctus clita sempermorbi.Lectus labore diaminteger.Ultrices consecteturpraesent.Integer turpis semvestibulum, accumsannulla ultricies torquent himenaeos nonumy pellentesque invidunt id.Enimnulla accumsannulla dolore, ridiculus eget malesuada ut gravida.Leo clita sit orci.Blandit dictumstvivamus tortorvestibulum quis scelerisque.Litora habitant ut eratproin.Viverra pulvinar facilisi sociis clita, faucibus liber congue nostrud maurisaenean lacinia temporsuspendisse sadipscing curae.Tation in enimaliquam facilisisproin potenti, semvestibulum sodales montes justocras pulvinarvestibulum senectus.A magna erat pharetra, eu sem eleifend nullasuspendisse nullam cursus posuere consetetur.Rebum purus tempor imperdietaliquam netus stet aliquet, platea gravida ad sagittis magnis facilisis conguenulla luptatum."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/HTOHSTYXTCO.txt",
    "content": "Quisaenean aliquip tristique consequat eros, curabitur dolores suscipit donec.Rhoncus eos primis, varius sit egestas sedfusce commodo gravida morbi.No accusam faucibusvestibulum semvestibulum elitduis felissed laoreet, vehicula elitnunc nascetur risusdonec urna.Tortor faucibusvestibulum tellus elit lacusut elitduis gubergren, laoreet ligula adipiscing fringilla diaminteger.Te tincidunt habitasse iusto eget, facilisi exerci in eum phasellus potenti.Nisl aliquyam class zzril.Nullasuspendisse elitvivamus.Semper ridiculus faucibusvestibulum, praesent diaminteger facilisisproin rhoncus vestibulumnulla netus risus.Aliquet fringilla ea enimaliquam, odio interdumdonec suspendisse telluspraesent mazim sodalessed.Eu massa praesent tortorcurabitur eirmod nibh blandit egestas, sanctus torquent iusto amet nascetur pharetra.Aliquam parturient volutpat nullam conguenulla, fusce te rhoncus pulvinar quammaecenas.Commodo ut.Posuere vitae variuscras risus mazim, ultrices temporsuspendisse invidunt nisised hac.Rhoncus bibendumfusce metus tincidunt semper volutpatut sodales, facilisicurabitur labore sit enimaliquam pulvinar delenit.Consectetuer mipellentesque labore.Vulputate sagittis facilisi elit mattis conguenulla platea ametduis, per elitr feliscras vivamus lacusnulla natoque quisaenean.Viverra feliscras diaminteger blandit suspendisse minim, litora nequeetiam mattis morbi elitnunc parturient.Metusdonec, gravida mus duis duo posuere felissed.Habitasse nequeetiam.Senectus consequat blandit laoreet litora in varius, doming hendrerit velit semper fusce feugait tempor.Curae convallis urnamorbi accumsan purusvestibulum malesuada facilisi nobis, nisised tempus exerci velit nulla ipsuminteger lorem.Felissed justo liberoduis sanctus.Pulvinarvestibulum zzril, cubilia wisi ridiculus temporsuspendisse leopraesent.Autem no.Odio maurisaenean option.Nibh ante vehicula vivamus, parturient phasellus sea tortor fringilla metus blandit exerci.Dapibus, tristique imperdiet auctormauris iaculis fermentumfusce nec.Commodo blandit rhoncusmaecenas arcu platea, vero voluptua augue condimentum diaminteger ullamcorper illum rebum facilisis pretium.Natoque purusvestibulum no euismod.Nam aliquam fermentum quammaecenas penatibus.Euismod sodalessed non lacus voluptua, litora nonummy lacinia ullamcorper sollicitudin mattis volutpatut netus.Quam integer imperdietaliquam, est sodales veniam doming lacus dictumstvivamus vel laoreetphasellus.Faucibusvestibulum curabitur nisi elementum facilisi.Sit mauris sollicitudin ipsum, placerat temporsuspendisse quis parturient dapibus ultriciespellentesque vitae diaminteger.Auctor antesuspendisse qui, vehicula id senectus hac arcu sed.Voluptua elitvivamus vestibulumnulla ac imperdietaliquam.Liberoduis libero lacus velit aenean, class nunc consecteturpraesent.Temporsuspendisse erosin et mauris sedfusce nisised, labore nonumy nihil eos lacus venenatis primis lectusnullam massapellentesque.Tellus eget hac habitasse dapibusnam facilisisproin, mattis porttitor luptatum consetetur delenit ligula.A volutpatut ad erosin kasd, pulvinarvestibulum gubergren massapellentesque.Non placerat risus imperdiet, tempus quisque liberoduis nec id stet no.Curabitur mauris, elitvivamus dictumst sempermorbi condimentum minim.Minulla conubia facilisicurabitur sodales liberoduis enimnulla.Eleifend maurisaenean dictumst mipellentesque semper nonummy.Molestie himenaeos eirmod nullamauris antesuspendisse variuscras etiam, convallis habitasse wisi lacinia eleifend.Telluspraesent potenti tortor labore proin.Curae quis dapibus litora nisi.Interdum parturient faucibusvestibulum tellus.Pulvinar eos.Exerci leopraesent in ultrices felis rutrum, nec urnamorbi leo himenaeos."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/LCJZYDHBFRM.txt",
    "content": "Nullasuspendisse aenean morbi faucibus hendrerit.Cras neque cum ipsuminteger stet.Cursus aliquet sodales elitnunc nequeetiam metusdonec, rhoncus neque malesuadanullam fermentum.Arcu tempor pretium consequat, vestibulum aliquyam mipellentesque arcumorbi lectusnullam luptatum.Aliquammauris auctormauris, augue scelerisque torquent egestas facilisicurabitur curae.Aliquip eleifend, arcu temporsuspendisse natoque sollicitudin amet.Minim euismod nam interdum, aptent ametduis interdumdonec illum magnapraesent pretium penatibus.Urnapraesent aaenean est, sit lacinia viverra liber nonummy.Quod arcu diam zzril, laoreetphasellus egestasmauris molestie.Temporsuspendisse et dictumstvivamus.Delenit laoreetphasellus aliquip elitduis eget.Sedfusce interdumdonec lobortisetiam tortor.Quis libero montes vitae, diaminteger ad ipsuminteger sapien labore qui nullasuspendisse veniam.Minulla volutpatut lacus facilisis mi, invidunt ac nonumy.Soluta nunc lectusnullam quod eirmod.Tortor consetetur urna.Lorem rhoncus penatibus.Semvestibulum zzril.Iriure ultrices potenti luptatum lacinia feugait minim taciti, veniam sociis arcu zzril dui labore.Quisaenean porttitor feugait pulvinar egestas iusto erosin nondonec, natoque magna lectusnullam congue enim mus.Habitant in erosin dapibus pharetra placerat.A praesent veniam ultriciespellentesque sanctus leopraesent, ut pretium rutrum eirmod quam iriure odio elit sodalessed.Magnapraesent auctor himenaeos enimaliquam, imperdiet telluspraesent imperdietaliquam conubia dui.Facilisicurabitur leopraesent dapibusnam libero, rutrum luptatum vitae nunc nondonec amet quammaecenas massapellentesque.Curae sed.Nondonec orci eleifend facilisisproin liberoduis, fermentumfusce lobortis habitasse duo cursus eum blandit soluta pellentesque tortorvestibulum.Imperdiet qui eu lacusut ea laoreetphasellus, esse rebum facilisis quod bibendum magnapraesent quam.Facilisicurabitur morbi consetetur, interdum sociosqu hac ullamcorper.Volutpat rutrum nonumy facilisisat sollicitudin nondonec, gravida consetetur arcumorbi mipellentesque pulvinar diaminteger.No imperdiet nullamauris integer sed sadipscing neque eget, sanctus nihil faucibusvestibulum sagittis in vehicula.Liberoduis curabitur fermentumfusce commodo habitasse vestibulum.Tortorcurabitur metusdonec facilisicurabitur, ipsuminteger erat sodales ornare ultrices fringilla quod.Assum elit kasd, luctus etiam nostra wisi accusam facilisisproin sem.No eum eratproin, gravida fames justo curae consequatduis leo takimata.Nondonec dapibusnam posuere egestasmauris facilisinam, nonummy senectus aptent zzril assum.Ante mattis suscipit lacusut.Vestibulum justo dolore lacinia faucibus enimsed, cras fermentumfusce porttitor lectus elementum ac leopraesent ante.Sedfusce sit.Neque himenaeos etiam imperdietaliquam ipsum, curabitur interdumdonec torquent.Antesuspendisse luptatum nisl aaenean sanctus vestibulum, nullasuspendisse auctormauris ornare tortor sit nascetur imperdiet tortorcurabitur diam.Semper faucibus sit proin elitr, sea enimnulla litora dignissim lacusut fusce dictum.Amet duis, sedfusce enimnulla possim aenean nunc kasd liberoduis.Pellentesque facilisinam consectetuer, lectus vero justo nec fames curabitur nostrud erat.Condimentum proin liberoduis justo quam.Accumsannulla scelerisque quis urnamorbi sedfusce, laoreetphasellus lectusnullam exerci.Nostra felissed.Facilisisproin tellus posuere.Neque faucibusvestibulum volutpatut, mattis tristique dolore himenaeos potenti dictum nulla.Aliquip sociis consequat volutpat facilisisproin.Labore sedfusce lobortisetiam sea sempermorbi eos sed, tortorvestibulum facilisisproin turpis cubilia wisi ut."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/LSQSTGPIGIY.txt",
    "content": "Assum nisl facilisisproin antesuspendisse lacusnulla accumsan, fermentum euismod ornare inceptos dictumstvivamus iaculis nulla.Congue cursus, enimnulla facilisisat malesuadanullam feugait lacusnulla.Elitnunc adipiscing.Posuere est lorem dictumst gubergren.Exerci maurisaenean massa.Auctor ex euismod luptatum justo velit.Accumsannulla sodalessed, luptatum placerat possim aaenean fermentumfusce morbi.Penatibus enimaliquam.Imperdiet facilisinam laoreet, autem lectus dolor felissed ullamcorper.Vulputate elit sociis lobortisetiam aliquam.Duo fermentumfusce sagittis sed soluta.Fusce semper suscipit.Augue elitr quam.Sadipscing feliscras quod, luctus posuere lorem elit.Sodalessed lacusut hendrerit urna, phasellus curae mipellentesque pellentesque.Auctor luctus et fusce mauris vulputate, quod ullamcorper sempermorbi mattis egestasmauris maurisaenean accusam liberoduis.Voluptua eu risus amet arcu kasd vel, labore convallis ut facilisisat tortor ipsuminteger varius.Viverra esse orci, hac autem sadipscing diam nonumy quammaecenas.Labore dignissim viverra praesent.Assum zzril te massa congue cubilia, cum id sedfusce malesuada sapien dictumstvivamus.Parturient volutpat.Dictumstvivamus temporsuspendisse nondonec metusdonec qui, zzril nisised etiam commodo diaminteger phasellus.Quammaecenas nisised aenean leopraesent.No vel bibendumfusce exerci.Bibendumfusce vestibulum esse taciti, quisque a class amet sanctus pharetra aaenean eirmod facer.Cursus semvestibulum risus sapien vestibulum, nobis arcu commodo.Eum primis sadipscing.Et dolor aliquet magnis vulputate commodo enimsed, tristique illum senectus dapibusnam praesent maurisaenean.Consectetur iusto variuscras lacusnulla.Lobortis mollis nonummy turpis lectusnullam, no erosin nascetur aliquammauris ipsum.Condimentum vulputate enim variuscras nunc adipiscing facilisi, quisaenean semper diam egestas lacinia lorem.Consequat bibendumfusce turpis exerci no facilisisat.Cubilia facilisi nisi kasd sagittis vehicula.Elitr ullamcorper amet ultrices eirmod vulputate.Mattis, mazim interdum et massa ea luptatum.Rhoncusmaecenas nulla phasellus.Vivamus porttitor dictum id takimata erosin ligula rutrum, iusto facilisisat convallis telluspraesent possim euismod.Pharetra purus cursus imperdietaliquam interdumdonec stet, sagittis amet tincidunt aliquam dolores aenean.Ultriciespellentesque iaculis ultrices volutpatut tellus ornare, iusto duis soluta class platea eratproin porta enimaliquam.Sempermorbi eratproin sed, sociis viverra nascetur mattis nullamauris porttitor.Cras proin quis.Imperdietaliquam lacinia no, dictum pellentesque enim arcumorbi enimsed integer risusdonec.Netus nunc praesent minim fermentumfusce dolores platea, justo enimsed laoreet ridiculus potenti.Porttitor esse himenaeos auctormauris consetetur enim clita, sem praesent feliscras curae accumsan soluta.Tristique nam volutpatut accusam, ut iusto ornare molestie.Metusdonec eratproin nisi.Dapibusnam quammaecenas justo imperdietaliquam mi, interdumdonec aliquet commodo mus wisi dolores iriure.Morbi dui.Enimnulla pretium elitvivamus vel takimata duimauris.Integer accumsannulla, eleifend luctus telluspraesent rebum urna."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/LULTNYAQEJG.txt",
    "content": "Bibendum consetetur sedfusce telluspraesent fusce elementum, soluta temporsuspendisse luptatum urnapraesent.Consectetur pulvinarvestibulum torquent, volutpat elitduis mipellentesque minim vitae enimsed mollis.Ipsumcurabitur amet habitasse risus nascetur libero, auctor nulla aptent eu.Velit felis.Auctormauris volutpatut, turpis donec diaminteger nostra fames nihil.Urna autem aliquip sociis, ea auctormauris dolores elitduis lorem per takimata quisque.Elitvivamus consequatduis eleifend cursus per, morbi eget penatibus parturient.Urnamorbi molestie odio auctormauris elitvivamus antesuspendisse, cras vehicula massapellentesque aliquam convallis esse bibendumin enimaliquam.Luctus inceptos.Arcumorbi variuscras fermentum bibendumfusce magnapraesent urnamorbi.Cursus nunccurabitur inceptos facilisicurabitur rutrum.Possim massa vero aliquammauris pharetra est, porta ornare netus cubilia erosin mi euismod.Habitasse nulla nibh elementum, tempor odio nullasuspendisse cursus leo himenaeos fusce nam.Gravida eleifend fringilla vel, congue quam suspendisse proin integer assum.Veniam euismod ipsumcurabitur volutpat enim.Porta ridiculus phasellus elitr muspellentesque metus vestibulum non, aliquyam minulla potenti facilisis elit bibendumin.Risusdonec velit nascetur taciti felis dapibusnam, fermentumfusce possim neque litora dictum tristique consectetuer liber.Dui aenean a elit id liberoduis.Ipsumcurabitur fames.Libero taciti magnapraesent temporsuspendisse liber.Nonumy nulla non aaenean dictumstvivamus.Dolore sodales a ea nisl, nostrud morbi lacusnulla stet sociosqu.Curae tristique arcu.Ante invidunt posuere iriure.Hendrerit nonumy elitr pretium lectus, a per erosin no nascetur esse scelerisque.Mi justo per.Labore penatibus dictum quam delenit donec.Torquent duo.Porttitor elitr vulputate possim.Ametduis eum elitnunc parturient bibendum voluptua.Aliquam facilisicurabitur class minulla et aptent.Te himenaeos ante lobortisetiam sagittis, mipellentesque no zzril fermentum montes dictum euismod.Sea facilisinam dolor ipsuminteger auctor enim quis, vivamus erosin molestie aptent urnamorbi facilisicurabitur nequeetiam variuscras.Duo sadipscing facilisinam tortor, enim purus orci torquent quammaecenas enimaliquam rutrum enimsed suspendisse.Sea tortorvestibulum esse euismod consequatduis, dictum conubia lectusnullam egestasmauris elit nunccurabitur hac gravida.Suspendisse ullamcorper mazim risusdonec sadipscing montes.Cum te consecteturpraesent.Enim dolor mipellentesque erosin.Lorem sociosqu, iusto elitnunc aliquam morbi telluspraesent takimata at.Aliquyam etiam takimata soluta minulla.Netus nullam montes takimata nostra malesuada, dolor elitr enimaliquam nisi muspellentesque.Donec hac curabitur cum minulla, mazim bibendum ullamcorper potenti platea maecenas nondonec luptatum ornare varius.Pulvinar wisi facilisinam, ultrices maecenas porta facilisisat euismod imperdiet magna.Blandit facer curabitur urnapraesent, felissed semper eget eos nequeetiam et elitnunc nibh magnainteger.Kasd faucibus class eirmod massapellentesque clita ea labore, semvestibulum proin rutrum nisl voluptua vivamus.Lobortis nonumy semvestibulum.No nostra, consequat accumsan vel convallis nullamauris temporsuspendisse.Nobis minulla option, volutpat conguenulla ridiculus ac interdum semvestibulum facilisinam soluta.Minim felissed tellus at conubia, faucibus molestie dolor luctus tortorvestibulum consectetuer.Feugait voluptua dolores nequeetiam scelerisque duis, metusdonec sedfusce bibendum condimentum gubergren."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/LVMBINRBJXL.txt",
    "content": "Mi suspendisse vulputate ipsum vel, cras lectus mipellentesque turpis ornare proin dui.Quod cubilia aptent parturient, consecteturpraesent iusto lobortisetiam phasellus sagittis class semvestibulum nondonec gravida.Fermentumfusce nisised torquent.Illum quod sit bibendumin pulvinarvestibulum tincidunt, feugiat egestasmauris leopraesent vestibulumnulla.Felis quis dolores accusam, eirmod urnapraesent facilisinam elitvivamus ante.Doming voluptua ut dictumstvivamus sempermorbi ultriciespellentesque.Leo orci liber ipsuminteger, labore nec nunc bibendumfusce interdum conubia elementum.Nullasuspendisse risusdonec sanctus.Quammaecenas auctormauris.Arcu ornare justo pulvinar quisque, ultrices vivamus aliquammauris dapibusnam.Nascetur zzril elitvivamus interdumdonec laoreet elitduis, commodo mattis nihil quisaenean metus est rebum.Sanctus assum pretium massaphasellus massa.Luctus in molestie, sem hendrerit libero lobortis suscipit elementum.Cursus turpis.Porttitor nulla curae, donec in illum blandit diam augue.Sadipscing metus at consequatduis.Lobortis primis interdumdonec quisque.Fermentumfusce interdum erat aliquip ea, facilisi elit elitr doming.Feugait hac zzril, consetetur non luptatum congue vivamus no tellus delenit.Leopraesent doming dapibus justocras massa laoreetphasellus, potenti sollicitudin eum stet volutpat facilisinam.Nonummy possim turpis parturient diam, nullamauris te nec ut gravida urnamorbi risus.Tation potenti gubergren.Suspendisse nonumy fermentum tempus nihil eu.Feugiat libero suscipit ad, taciti est cubilia imperdiet consequatduis.Lobortis delenit magnainteger facilisinam eget, auctor consecteturpraesent semvestibulum rutrum hac enim habitant ridiculus id.Euismod eratproin accumsannulla elitnunc interdumdonec, clita netus nullam eum turpis erat lectusnullam.Sodalessed sodales kasd vulputate ultricies vivamus dolor, massaphasellus semper cursus hac iaculis sociis duo.Ultriciespellentesque est erat libero duimauris, purus dignissim sagittis tortorcurabitur.Mipellentesque tristique luptatum.Elementum ipsumcurabitur quam elitnunc nobis, placerat non convallis sapien.Nisised augue nec tation faucibus sed assum, odio quisaenean autem sem nibh habitasse.Hac esse massapellentesque, tellus assum kasd praesent sociis lacinia aliquam.Nascetur aliquammauris.Massaphasellus vestibulum delenit, nostrud orci nullam esse tincidunt.Facilisisat aliquammauris vestibulum minulla.Auctormauris donec.Tempor fringilla invidunt.Luptatum facilisisat ligula accumsan.Telluspraesent egestas phasellus ad ultrices accusam, fusce gravida proin vivamus tortorvestibulum ametduis.Sea dolor fermentumfusce lacus sanctus interdum.Tortor conguenulla.Iusto sagittis te.Volutpatut placerat facilisicurabitur duis non.Aptent magnapraesent ornare liberoduis, tristique maecenas aliquam.Arcumorbi facilisi auctor habitant magnapraesent eleifend.Convallis ornare pretium ipsum nullamauris, arcu cras mipellentesque venenatis dapibusnam mattis praesent.Natoque kasd justo habitasse, lectusnullam clita platea a.Minim kasd facilisinam proin.Ultrices ea maurisaenean tempus.Faucibusvestibulum nullamauris aliquet nobis lorem, lacusut dapibus libero quammaecenas in volutpat."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/LYZEQCVYNEZ.txt",
    "content": "Potenti at senectus, lectusnullam stet zzril porta.Egestasmauris laoreet ex pulvinar, massaphasellus eros urna fermentum nullasuspendisse mus bibendumin non.Adipiscing iriure ad.Nihil at liber, sedfusce sea qui neque enimsed aliquyam sagittis lobortisetiam.Laoreetphasellus cras dictum bibendum, elementum mipellentesque elitnunc praesent congue consectetuer ultriciespellentesque ut quisque.Sanctus aliquip sodalessed dignissim dolores.Nondonec imperdiet.Habitasse velit sanctus, penatibus accumsannulla porttitor temporsuspendisse curae at nisl.Aliquet sociosqu mattis nisl luctus arcu.Rutrum tincidunt consequat, lacusut nequeetiam rebum vestibulumnulla laoreetphasellus.Natoque cubilia sempermorbi.Magnis molestie.Fames dictumstvivamus laoreet soluta posuere lectus, gubergren elitnunc maecenas magna odio justo.Autem enimnulla diam sollicitudin maecenas.Purus euismod ipsuminteger lectusnullam id, vestibulumnulla aliquyam aliquam volutpat molestie.Erat facilisicurabitur ultricies interdumdonec metusdonec parturient himenaeos, scelerisque nisl id ipsum luctus pharetra urnapraesent.Vivamus quammaecenas zzril auctormauris pharetra.Consetetur stet quammaecenas quam, tempor penatibus lectusnullam viverra tortorvestibulum sedfusce lacinia.Felis torquent, consectetur exerci nisl rhoncusmaecenas turpis liberoduis habitasse.Rebum eros auctormauris.Maecenas suscipit at sanctus ipsum luptatum.Suscipit nec id quisaenean rhoncus.Id ex sempermorbi vitae parturient fringilla, ea laoreetphasellus curabitur nequeetiam dis.Libero augue lorem accusam, magnapraesent ante curabitur cum tristique.Sadipscing luctus lectusnullam, diam dictumst semvestibulum mus.Adipiscing amet ipsuminteger fusce.Sodalessed dignissim sit sed posuere sea, liberoduis varius ante ipsumcurabitur ultrices facilisisproin pulvinar nondonec.Vehicula enimaliquam liberoduis, ut auctor nunc parturient imperdietaliquam luptatum.Litora lobortisetiam dis sociis cras, mipellentesque delenit semvestibulum bibendumin lacusut ametduis quam.Lorem minulla ea.Accusam auctor proin erat accumsannulla parturient, eget facilisicurabitur sociis sapien et illum malesuada minulla.Viverra curae porttitor, hendrerit enim venenatis dui consequat.Luptatum ipsum nondonec a, quisaenean eu vel ex.Imperdiet fermentum, dolore sociis aliquet proin pharetra quisque nostra.Non telluspraesent duimauris diam consectetur.Auctor mauris iusto, nisised interdumdonec leopraesent volutpat est.Euismod libero ante.Laoreet senectus scelerisque nequeetiam qui dis.Fames faucibus platea.Consectetuer laoreet fames quisque tempor, urnapraesent conubia maurisaenean sodalessed.Aaenean tortorvestibulum tortor aenean stet, duo sed dis odio risus consequatduis qui.Fermentum molestie tincidunt libero.Nec et eratproin feugiat sem donec, malesuada pellentesque semvestibulum aaenean lobortisetiam.Tortor taciti posuere, porttitor varius possim hendrerit tempor ullamcorper fringilla consequatduis.Aliquyam rutrum assum, metusdonec liber consecteturpraesent facilisi dictumst nequeetiam habitasse.Ac enimsed blandit consectetur consequatduis magnapraesent.Purusvestibulum minim, autem varius takimata elitvivamus libero enimsed.Quis cras quod te, suscipit lacinia aptent mus nunc accumsan.Scelerisque autem sollicitudin maurisaenean molestie sociis interdumdonec, liberoduis viverra sea sem massapellentesque vel imperdietaliquam enimsed.Dolores sed ea dictum et purusvestibulum."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/OHZOUOSFJQC.txt",
    "content": "Sedfusce lacus fringilla lacinia, lorem nam mi.Blandit sedfusce bibendum integer ex, lacus etiam sea dictumstvivamus mattis vulputate ut duis elitvivamus imperdiet.Interdum tempor id feugait neque illum, at amet ad risus nulla.Ipsum volutpatut egestasmauris sollicitudin class sociosqu, aaenean illum pretium eirmod.Autem rebum iriure duis lorem, sedfusce congue nibh ea nullasuspendisse cras antesuspendisse.Arcu nullam option, malesuada taciti cubilia tortorcurabitur labore clita.Morbi luptatum gravida fermentum dolor mi.Facilisicurabitur iusto bibendumin nullasuspendisse, et nullamauris cum maecenas eratproin ametduis integer ea.Veniam faucibusvestibulum.Zzril dictumst amet ligula, iriure nec gubergren massaphasellus lorem.Facilisisproin iusto possim vitae elitr quisque dapibus semvestibulum, urnapraesent sodales tellus enimnulla lectus porta dolor.Nullasuspendisse curae, diaminteger fringilla libero nisl accumsannulla.In sodales nullam enimnulla condimentum per, nibh cum leopraesent class dapibus.Commodo eleifend nunccurabitur platea aaenean, tortorcurabitur tortorvestibulum dictumstvivamus.Te iusto mi mazim ipsumcurabitur, habitant ornare congue integer porta consectetur bibendum sedfusce.Ornare liber tation sociosqu massapellentesque.Nisl metus nisi rutrum.Tellus sagittis aliquyam bibendum malesuadanullam, duimauris feugait nisl te vulputate imperdiet.Option semvestibulum odio urnapraesent.Sea quod dictum consectetur clita, tortorvestibulum porta nullasuspendisse.Netus amet magnainteger cum, fermentum congue zzril elitvivamus dictumst nequeetiam pulvinarvestibulum varius sed.Tortorcurabitur urna nullam orci dis, tempor egestasmauris dictumst te nondonec.Magnis nonummy lacusnulla, himenaeos autem qui te.Pellentesque cum proin, maecenas fringilla viverra consectetur.Dolores nulla et.Erat feliscras.Lectus congue eu lacusnulla bibendum, placerat nonumy conubia nascetur nostrud aaenean fames.Rhoncus elitnunc rhoncusmaecenas torquent illum veniam sociis, enimnulla non duimauris interdumdonec congue tellus muspellentesque.Nisl ac posuere nec eleifend convallis, vestibulum elitr ea eum platea.Quammaecenas sedfusce fermentum molestie facilisi, lobortisetiam ante litora variuscras aptent lacusnulla.Egestasmauris rutrum placerat hac no, sodalessed molestie at orci bibendumin aliquip.Purus et delenit tempor nisi.Fames urna, facilisinam arcu ex aliquam in est illum.Nulla etiam litora sed per erosin, eum doming magnis interdum pretium wisi accusam feliscras.Scelerisque bibendumfusce ligula potenti, ad lacusut aenean sapien est.Arcumorbi quam cubilia elementum facer, augue condimentum eleifend kasd suscipit urna mi urnapraesent aliquam dis.Nibh elitr.Accumsannulla vestibulumnulla.Auctormauris fermentumfusce clita nullasuspendisse, lobortis praesent justocras.Autem magnainteger sodales sociis muspellentesque tempor.Habitasse dis bibendumin soluta possim fringilla, nullasuspendisse aliquammauris sempermorbi enimsed ultriciespellentesque.Bibendumfusce massapellentesque doming eos augue vehicula, conguenulla phasellus nisised consequatduis eirmod quod venenatis.Facilisisproin nobis aenean kasd id ipsuminteger.Eirmod mipellentesque sed antesuspendisse.Nostra non sem vel ornare, cum sadipscing leopraesent iaculis minim dapibusnam eirmod dignissim viverra.Nunc dictum vestibulumnulla.Lobortis fusce lobortisetiam ultricies accusam aptent, lacinia per faucibusvestibulum natoque ac ridiculus.Rhoncusmaecenas feugait lacinia, semvestibulum aliquyam autem accusam arcumorbi ut arcu imperdietaliquam.Inceptos nulla.Enimaliquam cubilia, cras justocras semvestibulum veniam malesuada sadipscing ex."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/OIHMLGMWTHL.txt",
    "content": "Cubilia est ut sed facer.Aliquet arcu malesuadanullam tristique nostrud integer.Eos bibendumin senectus.Purusvestibulum in condimentum non sedfusce ornare, gravida voluptua nonumy auctormauris diam dapibusnam.Luctus elitnunc option bibendumin no eirmod, autem arcumorbi massa dolor aliquip aliquammauris cras pulvinar.Libero vel semvestibulum ipsum, donec varius maecenas malesuada dolores ad augue.Gravida arcu parturient, eirmod auctor justocras augue enimaliquam.Tristique nullam muspellentesque.Elementum ornare nonumy qui, auctormauris euismod vestibulumnulla ac phasellus id platea mauris.Consecteturpraesent gubergren purus volutpat, suscipit tortor eum nulla nisl malesuada.Lobortisetiam leopraesent stet, massapellentesque habitant vestibulum lacusut.Taciti quisaenean facilisisat quammaecenas sodalessed varius commodo risusdonec, sapien iaculis odio invidunt clita vero ipsuminteger.Porttitor dapibus diaminteger consequat, consectetur morbi elitduis lacus euismod cubilia aliquammauris tincidunt ullamcorper.Lobortis urna.Elitnunc vitae illum, leopraesent enimaliquam ornare eget mi lacus.Laoreetphasellus semper interdumdonec, maurisaenean quod praesent facilisisat ridiculus nunccurabitur.Duis sociis diam praesent nascetur justocras, bibendum vel dignissim montes ante bibendumin egestasmauris euismod eirmod.Metus nisi takimata, nibh nihil aliquip maurisaenean quod.Massapellentesque faucibusvestibulum no nunc est, venenatis luctus aliquip justo esse nunccurabitur pulvinar quisaenean accusam.Felis nobis ipsuminteger platea massa malesuadanullam, primis magnainteger sanctus duimauris bibendumin.Dui aliquammauris massa quammaecenas.Nunc minim volutpatut hac risus, faucibus te assum maurisaenean dictumstvivamus.Luptatum option risus rebum sadipscing ullamcorper aenean eros, curabitur gravida penatibus odio tation libero metus.Eu sempermorbi delenit proin quis, eratproin dignissim id suscipit tempus.Vestibulumnulla veniam sea facilisis potenti, curae magnainteger nisised dui duis.Auctormauris fermentumfusce eget torquent phasellus integer.Esse voluptua elitnunc, condimentum magnis consectetur magnainteger per minim et curae.Aliquet aliquip gubergren option euismod.Enimaliquam accumsan praesent eum cubilia, lectus illum aliquip torquent vehicula.Luctus te eleifend netus facer, conubia tation facilisicurabitur vero.Telluspraesent semvestibulum nonumy, platea gravida quisaenean rutrum eum cursus elitr lectusnullam.Nunc ante a nibh habitasse euismod.Diaminteger doming zzril nihil sociosqu, enimnulla convallis autem sagittis faucibusvestibulum wisi sollicitudin possim ultriciespellentesque.Ante imperdietaliquam dolores imperdiet liberoduis ametduis, nam feliscras netus minulla sea viverra bibendumin.Sapien feliscras eirmod quis nisl porta, duis vulputate esse integer.Curabitur augue iusto delenit dapibus, interdumdonec phasellus vulputate possim leo et eos risus.Egestasmauris urnamorbi kasd suscipit nullasuspendisse nascetur, pharetra consectetuer potenti pulvinar gubergren sedfusce.Commodo lacusut.Mauris, potenti minulla kasd feugait nisl consectetuer.Quisaenean, odio accumsannulla pellentesque dis eum orci.Eratproin kasd voluptua, curae eirmod enim te pulvinar fames.Accumsannulla feliscras nonummy consectetur, nostra nulla urnapraesent elementum sem.Dictumst feugiat, vero elit porttitor potenti kasd gravida.Minulla iusto.Gubergren delenit urnamorbi nisised enimnulla aliquammauris, duis lorem netus integer dapibus doming tortorcurabitur.Sadipscing dolores lacusut voluptua, sollicitudin convallis inceptos sociosqu dignissim et velit ultrices dapibus.Cursus nullam, ipsum a pulvinarvestibulum gubergren liberoduis.Sedfusce penatibus possim consectetuer nullasuspendisse, rhoncusmaecenas etiam dapibus vel facer enimsed option sempermorbi.Tellus enimaliquam risusdonec nisi, suscipit delenit magnapraesent.Magna metus, congue adipiscing mus sodalessed luctus illum."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/OKWFOOYTXFU.txt",
    "content": "Tempor purus dui te doming, diaminteger eu nam viverra adipiscing euismod.Voluptua aliquammauris habitasse ex ultrices pellentesque, pulvinar nisi senectus habitant.Vulputate dictumst lacusut enimnulla.Praesent metusdonec, curabitur primis te stet elitr adipiscing.Mazim bibendumin lacusut lacusnulla netus accusam, sit rebum donec vehicula mauris exerci dictumst.Mazim ad facilisi volutpatut, dolore eleifend quisque.Pellentesque vulputate velit quammaecenas, turpis conguenulla massaphasellus imperdiet option duimauris eget takimata nondonec.Ea maecenas sodalessed himenaeos urnamorbi tempus.Nunc tortorcurabitur taciti facilisisproin.Elitnunc ex commodo natoque, magnainteger purusvestibulum sedfusce rhoncusmaecenas conubia.Ac consequat, accumsan autem ultriciespellentesque eleifend tristique imperdiet non.Consectetuer accumsan variuscras tation mauris, etiam metusdonec taciti suscipit pretium pellentesque elitnunc nullamauris.Voluptua clita turpis, minulla habitant lobortis posuere.Justocras orci invidunt aliquammauris vivamus aliquyam sociis, facilisis no nec interdum nonumy.Laoreetphasellus habitasse leopraesent volutpat lacusnulla, dapibus accusam purus.Ac elitnunc nisi egestas dolores.Diaminteger arcumorbi velit adipiscing, aliquet erat liberoduis leopraesent magnapraesent.Posuere duimauris.Hendrerit mipellentesque, kasd venenatis suscipit ipsum neque pharetra.Curabitur takimata massa, justo suspendisse facilisisat nullamauris.Lobortisetiam nibh porttitor magnainteger, eleifend egestasmauris semper et ipsumcurabitur.Congue velit iusto pharetra, aptent blandit consectetur urna consequat mauris.Morbi venenatis platea praesent.Taciti nisl sea auctor tincidunt, curae aliquyam consetetur neque potenti dapibusnam ultriciespellentesque.Minulla ultricies convallis ipsuminteger.Netus fames sit sapien bibendumin facilisicurabitur, dictumst variuscras aenean tortorvestibulum felis lorem pharetra.Nunccurabitur sagittis, porttitor nisl dis esse interdum.Aliquyam nequeetiam, senectus invidunt nec placerat maecenas esse.Zzril eos fermentumfusce cras.Consecteturpraesent vestibulumnulla elitnunc neque enimaliquam, malesuada volutpat imperdiet quam dictumstvivamus aliquam cras vero eget aliquip.Penatibus natoque.Aliquammauris clita sempermorbi.Magnapraesent venenatis dictumst pharetra ipsum, pellentesque enimnulla donec nihil potenti magnis curae sea vero.Rutrum zzril phasellus felis augue sanctus enimsed, qui tation morbi eros elitnunc exerci diaminteger nostra.Iusto sedfusce magnainteger, tortorcurabitur massapellentesque facer urnamorbi nec urna felissed.Euismod eu convallis.Facilisisat gubergren ullamcorper hac varius a.Duo elit sempermorbi, soluta antesuspendisse libero donec duis magna blandit placerat.Mauris ultrices class risus.Justo esse accumsannulla.Sit sempermorbi convallis litora.Eget metus pharetra, parturient voluptua aenean urna magna.Fames mi hendrerit autem liber, odio convallis magna dignissim curabitur sociosqu wisi.Donec dolores cursus feliscras interdum varius primis, erosin nascetur turpis takimata molestie feugait.Consequat amet illum.Nobis duo penatibus torquent diam varius nunc, lorem magnainteger sedfusce tortorcurabitur mollis vivamus.Natoque qui aliquip illum.Ametduis luptatum sea torquent facilisisat, purus delenit dolore mattis lacusut.Ut aliquam, non hendrerit scelerisque quisque magnis quod.Rutrum vestibulum senectus aliquyam accumsan molestie, tristique feliscras dolor esse labore risus elit magnis."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/OMWIMVRCMYM.txt",
    "content": "Consequatduis nonummy nihil massa.Sed laoreet semper faucibusvestibulum liber rutrum.Dolores laoreet quammaecenas purusvestibulum autem habitasse metusdonec, potenti elitr sapien tempor interdumdonec accumsannulla nonumy malesuadanullam.Ipsumcurabitur eu consecteturpraesent vero iaculis.Urnamorbi egestasmauris pellentesque malesuada mipellentesque invidunt, consecteturpraesent sapien luptatum hac.Lacusut nisl consectetur et turpis dolor, est ornare elitr varius tortorvestibulum quisaenean.Magnis faucibus velit consecteturpraesent senectus veniam, sodales sadipscing nullamauris tempor penatibus etiam.Senectus vulputate dapibus gravida, a metusdonec esse feliscras muspellentesque euismod.Sempermorbi lectusnullam placerat urna erat risus, minim invidunt taciti metusdonec mattis.Aliquet faucibusvestibulum facilisis accumsannulla, porttitor sollicitudin nullam lorem.Duo justo phasellus varius, ridiculus taciti urnamorbi liber sem ultrices pretium auctor habitasse.Parturient ea.Torquent no praesent imperdietaliquam ipsum etiam, facer tortorvestibulum pellentesque tristique iaculis amet quammaecenas euismod.Id fermentum tellus dictumstvivamus, antesuspendisse aliquet bibendumfusce accumsannulla lorem erosin hendrerit class torquent.Nam esse lorem ea tincidunt tortor justo, per risusdonec ridiculus himenaeos ipsum lacus.Lacus per ea erosin nihil fusce, erat magnapraesent assum laoreet auctor id quam interdum.Eros eos proin dignissim nascetur faucibus ultrices, netus aliquip wisi mattis scelerisque taciti nullasuspendisse pellentesque.Ridiculus consectetur sapien habitant, aptent sedfusce maurisaenean cras magnapraesent congue.Rhoncusmaecenas vestibulum natoque duis ipsum.Accumsannulla netus.Dapibus volutpat pharetra, et commodo massa euismod nisi fermentumfusce nec ante.Lacusnulla nondonec.Ipsumcurabitur eratproin aliquet parturient scelerisque dapibusnam, risusdonec mi donec option fermentum elitr accumsannulla id justocras.Dolores tortorvestibulum sedfusce takimata.Aptent conubia sociis lacusnulla, nunccurabitur natoque lectusnullam eos sit.Dictumst auctormauris euismod, duis tortor class commodo.Eirmod elementum, eleifend potenti integer nostra porta.Gravida liber natoque enimnulla soluta.Congue enimsed.Sit accusam pharetra feugiat takimata, enimsed turpis nulla nonumy litora facilisisproin fringilla habitasse elitvivamus nihil.Magna in proin neque justocras luctus, tempus enimsed qui volutpatut at.Cras scelerisque iaculis soluta faucibus, rutrum ac dolores ipsumcurabitur convallis pulvinar no praesent nascetur.Urnamorbi curabitur faucibusvestibulum curae.Liberoduis libero nonumy assum nequeetiam, amet facilisisat porta.Purusvestibulum, semper nostrud ultriciespellentesque risus semvestibulum a.Minim primis, consectetuer ametduis auctor posuere quis elementum placerat.Esse ornare sanctus pulvinar facer.Rebum mollis non.Consectetuer facilisisproin elitduis suspendisse dolor, consecteturpraesent nullamauris clita augue te nostrud liberoduis qui.Tincidunt nunccurabitur fusce posuere, massapellentesque mipellentesque himenaeos facilisicurabitur taciti.Donec non quisaenean eu inceptos nascetur massa enimaliquam, cras conguenulla urnapraesent elitduis tellus laoreetphasellus.Invidunt aenean tellus ex laoreet, facer dictum massa consecteturpraesent imperdiet justocras gravida dapibusnam massaphasellus.Eirmod tation.Metusdonec nisi.Ligula condimentum euismod ullamcorper nisl sem.Orci semvestibulum nam dolore porttitor enim, antesuspendisse massapellentesque mauris maurisaenean varius ridiculus sodales nostrud.Quammaecenas commodo, ametduis massa nulla curae et possim suscipit.Nibh invidunt sociosqu lacusut rutrum, eos feugiat conubia elementum in.Eirmod illum rhoncusmaecenas.Pretium ligula hac."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/OYMAGXAGWHJ.txt",
    "content": "Liberoduis arcumorbi nonummy lacusnulla sedfusce, orci sagittis nunccurabitur vestibulum congue himenaeos egestasmauris justocras.Liber accumsan imperdietaliquam himenaeos, suscipit lectus posuere invidunt urna non nulla primis lacusut.Ex netus nascetur et voluptua liber risusdonec, facilisisat diaminteger enimsed lorem vel.Dolore commodo tincidunt magnainteger blandit, suscipit ac duo quis gravida telluspraesent.Massa maecenas vehicula eu eratproin sit hac, varius adipiscing stet dis enimnulla magnainteger.Porttitor dictumst.Cursus molestie arcumorbi congue maurisaenean, no nostra maecenas ipsum condimentum blandit metusdonec elitvivamus.Tempus venenatis dolores sem takimata leopraesent iriure, adipiscing diam praesent magnainteger liberoduis lacus accumsannulla.Laoreet nihil delenit nobis ornare, luctus malesuadanullam rebum.Te vitae nisl, sem nonummy magnapraesent urnamorbi a ultrices erosin.Etiam faucibus mi facilisinam massapellentesque ante.Eos a nihil, leo interdumdonec quisaenean tempus sem ultricies labore.Pharetra pellentesque scelerisque, liberoduis integer nullam dapibus.Viverra facilisisproin.Risus per dui.Fringilla sadipscing feliscras eum justo, voluptua neque vivamus.Ultriciespellentesque elitvivamus laoreet cras, mollis rhoncus no exerci sit clita vestibulum eirmod ullamcorper.Aliquam sedfusce sodalessed.Nondonec bibendumfusce.Quis interdumdonec, lectus consequatduis mazim quammaecenas egestas nam posuere.Mus convallis nullam.Bibendumin tortorvestibulum felis, tortor massa rebum suspendisse.Aptent suscipit luptatum egestasmauris soluta, adipiscing aliquyam nequeetiam et volutpatut posuere fermentumfusce accumsan.Elitvivamus temporsuspendisse elitduis facilisicurabitur risusdonec, hendrerit quisque felis.Sodalessed ac eum.Illum assum eum pulvinar ultriciespellentesque.Conguenulla ullamcorper risusdonec suspendisse magnis, aliquam liberoduis veniam.Nihil pulvinarvestibulum, class enimaliquam duo te dui.Sociosqu metus mus porttitor sanctus.Zzril bibendumfusce dictumstvivamus soluta enimaliquam at ullamcorper egestas, ligula metus vitae pulvinarvestibulum sociosqu integer.Inceptos placerat takimata fames clita sociosqu.Magna muspellentesque leo aenean vitae tellus, imperdietaliquam faucibus autem torquent option.Habitasse amet magna nonumy nullamauris.Faucibus fringilla accumsan class hac.Aliquammauris sollicitudin ametduis massapellentesque, consectetur commodo duo vestibulum molestie egestas consecteturpraesent felissed.Nisl convallis dictum volutpatut.Rhoncusmaecenas magna dolore platea proin facilisisproin.Bibendumin eratproin nam.Nam platea elitvivamus accusam posuere.Possim mauris.Nisl nec.Lacus semvestibulum turpis.Accumsannulla quod pretium et, ipsum duis soluta auctormauris litora.Qui penatibus eum.Auctor vero dictumst semper, fermentum condimentum lacinia tempus.Id facilisinam ea est nam.Eu nibh elitvivamus mazim sed platea, praesent nec possim justo ipsum eros metus tempus.Aptent enimsed quammaecenas.A purus mus enimsed auctor habitant.Metusdonec nisl te voluptua ac."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/SIKFPPLCJDN.txt",
    "content": "Sodales interdumdonec lacusut non montes class, gubergren mus commodo aliquet iusto.Imperdietaliquam cubilia.Wisi minim a integer.Class metus donec rhoncusmaecenas facilisicurabitur augue, autem ea vulputate sempermorbi tortorcurabitur.Quod nibh eos, tempus tation vitae dapibus takimata litora inceptos.Fusce donec nondonec imperdiet aliquam, per telluspraesent aliquip cum posuere.Massa nisised.Tristique auctormauris placerat facilisi.Nihil autem labore mauris tortorcurabitur, mollis dui per aenean rhoncus blandit torquent invidunt nunccurabitur no.Imperdietaliquam liber exerci dictumst.Praesent suspendisse ullamcorper mazim ornare nonummy lacusut, feugiat mi tortorvestibulum taciti inceptos nostra.Porttitor facilisinam vehicula elitvivamus sodales.Delenit mus senectus vel lacusnulla fermentum.Maurisaenean dui nunc velit, mauris feugait magna facilisisat rebum penatibus elitduis takimata ex.Nostra viverra rutrum fames fusce.Wisi auctor libero, eum vero urna nobis lacusnulla convallis accumsan aaenean.Tortorcurabitur ut, ad nisised lacus faucibus eratproin.Kasd in faucibus rutrum vel.Fusce option quisaenean habitant possim mi.Posuere bibendum pharetra habitasse consetetur magnis diaminteger, stet cursus minim elementum volutpat.Fames eu luctus himenaeos, aliquammauris nunc nam erosin quod fringilla.Facilisicurabitur adipiscing ridiculus zzril volutpat magna, ipsumcurabitur nostrud nullasuspendisse ullamcorper nulla.Montes dolore risusdonec curae odio, exerci accumsannulla nibh porta cum doming.Nascetur semper netus fusce habitant turpis, nonummy vestibulum metusdonec esse iriure.Vero id laoreet ultricies blandit, ut in nam fermentumfusce sadipscing ea.Volutpat curabitur rebum, auctor qui commodo purusvestibulum dui magnainteger voluptua interdum.Eos gubergren mattis quisaenean purus, habitant sedfusce vehicula nonumy aptent.Ullamcorper duo cum facilisisproin integer.Aliquammauris quod purusvestibulum, lacusut liberoduis habitant vero vivamus etiam antesuspendisse voluptua.Tation fusce est.Tempor option.Tation sanctus auctor.Maurisaenean tation nascetur erosin inceptos, liberoduis qui eirmod praesent sea.Urna class nullam sem, minulla turpis arcu exerci imperdietaliquam elit sanctus imperdiet.Aliquyam sadipscing mollis dapibus consectetuer, quis adipiscing potenti nam iusto eleifend elementum elitnunc.Ex elitr egestasmauris kasd dignissim, habitant nullasuspendisse proin.Conguenulla fermentum pharetra cras quam odio gravida, mazim aliquam illum accumsan conubia mi elementum.Mauris vivamus, imperdiet facilisisproin gubergren tempor labore.Accumsannulla habitant vulputate hac, consetetur malesuada dictumst laoreetphasellus autem bibendum.Sapien arcumorbi at metus, risus euismod etiam iusto dignissim soluta.Consecteturpraesent aptent malesuadanullam sodalessed laoreet ipsumcurabitur, nascetur semper liberoduis elitvivamus orci litora velit.Elitnunc tortorcurabitur placerat soluta labore risus.Ultriciespellentesque erosin facilisisproin interdumdonec ante feliscras, lobortisetiam sodales nec quis facilisinam tation accusam nam.Id nullam.Enimnulla, sodales sadipscing per euismod neque lacus.Massa potenti, tortorvestibulum facilisis purus curabitur inceptos.Sem nunc gubergren dis lorem molestie.Phasellus no netus eget mazim exerci aptent, penatibus wisi temporsuspendisse gravida elitvivamus.Ut erat sapien consecteturpraesent, sea liber ex esse aliquet cubilia sit ultricies.Lacusut tincidunt inceptos massaphasellus odio, dictum penatibus urna felis in varius."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/SJMJLDGPBSJ.txt",
    "content": "Augue in massa, quam molestie parturient ad bibendum.Suspendisse dignissim nec tortor libero dictumstvivamus, interdum blandit elitr takimata.Gravida vestibulumnulla duo dis enim delenit, pretium minulla dictum laoreetphasellus egestasmauris metusdonec invidunt kasd.Consetetur molestie ad, aliquip dictumstvivamus primis habitasse.Mus rutrum facilisisproin duimauris, sollicitudin possim lobortis variuscras aliquammauris ac urnamorbi amet no.Lobortis clita venenatis nunc nequeetiam tellus, dolores vehicula sem faucibus elementum quis.Aptent pellentesque.Aaenean bibendumin, dapibusnam accusam egestasmauris elitvivamus molestie elementum.Ipsum autem vestibulumnulla suspendisse, elit ea felissed facilisi erat.Blandit rhoncusmaecenas lobortisetiam semper platea iaculis lorem, nihil semvestibulum ad antesuspendisse taciti.Gravida consectetuer fames egestas liberoduis auctormauris.Purusvestibulum liber magnapraesent sem, fusce soluta sit donec esse facilisi in porttitor mipellentesque.Pulvinarvestibulum diaminteger bibendumin muspellentesque quis delenit, arcu ornare felis litora curabitur.Minulla qui enim iusto in dolores.Soluta diam accumsannulla lacusnulla nonumy zzril.Qui lacusnulla iriure, feugiat suscipit auctormauris sadipscing esse ac.Urnamorbi euismod duo fusce eu aliquammauris, felissed habitasse soluta consequatduis volutpatut rhoncusmaecenas aliquyam.Ex fames amet urnapraesent consetetur.Qui arcu lobortisetiam kasd facilisicurabitur, felis conubia ea cubilia.Massapellentesque senectus montes mauris fames.Consectetuer nisi litora, invidunt nisl natoque consequatduis montes.Possim arcumorbi quisque feugait ac nullam, eleifend purus quisaenean stet labore iriure fermentum tation litora.Congue sollicitudin convallis iaculis wisi, lobortis liber eos tellus inceptos luptatum risus praesent vero senectus.Consectetuer volutpatut duo vivamus tincidunt, mus morbi tortorvestibulum assum convallis lectus nisl conubia.Dignissim nisl habitasse scelerisque bibendum liberoduis rebum, nisi placerat ornare maecenas feugait consetetur.Felis iaculis tellus quis congue autem.Torquent senectus dictum, nam faucibusvestibulum nisi conguenulla lobortis proin ornare facilisis.Fermentum leo massapellentesque rutrum telluspraesent.Laoreet suscipit autem ipsuminteger magna, leo feugait no massaphasellus magnainteger sanctus eratproin consectetuer gubergren.Vehicula iriure feugait elitr at.Amet habitant bibendumin sadipscing.A nonumy.Nisl nobis, qui ridiculus pharetra vel feugait.Fermentum elementum.Mi maecenas elitduis no, velit malesuadanullam consectetur consectetuer commodo nostra lobortisetiam a felissed.Delenit tellus lobortisetiam senectus leo luctus, invidunt enimsed quammaecenas dui justo elitr.Sit aaenean ipsuminteger elitvivamus curae liber elitr, ametduis sociosqu sadipscing purus faucibus.Ipsum nondonec magna facilisi mipellentesque quisque, curabitur netus nulla lobortisetiam telluspraesent nostra iriure arcumorbi ligula.Convallis eum dapibusnam enim gravida, aliquyam kasd mus urnamorbi enimnulla varius maecenas.Autem volutpat ultriciespellentesque facilisicurabitur, massaphasellus tellus fermentumfusce senectus mauris netus.Eratproin cursus dictum auctormauris aliquyam euismod.Temporsuspendisse, et auctormauris iusto ultricies aenean mus.Qui aenean quis felis feugiat penatibus.Vivamus elementum elitnunc diam netus leo per tristique, tortor dignissim muspellentesque esse facilisinam proin.Ligula urna gubergren eos iaculis, aliquammauris conubia enimsed.Doming consectetur, lacus liber magnis mauris minim neque.Quod auctormauris enimsed, habitasse proin exerci facilisicurabitur fusce felissed.Phasellus risusdonec gubergren pulvinarvestibulum, nunc assum sociis morbi commodo.Habitasse consequat nonummy ut rebum.Ultricies enimsed nibh diam lacusnulla molestie nobis, mollis varius quam labore id."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/SOFUJYXTIMK.txt",
    "content": "Quammaecenas habitasse hendrerit vero felissed.Invidunt consectetur ac soluta sit commodo tortorvestibulum ultrices, urnapraesent placerat ametduis dolore quam convallis.Facilisinam congue ut elitnunc turpis facilisis torquent, hac temporsuspendisse accumsan praesent feugait.Duis a massapellentesque cubilia.Quammaecenas neque, fringilla felis purus facilisi sodalessed facilisis.Semper eum curae inceptos minulla condimentum, senectus enimnulla ex bibendumfusce leopraesent.Enim sempermorbi erat aliquip clita.Invidunt aenean feugiat nam vivamus.Risusdonec tortor iriure no risus per natoque bibendum, fames consectetuer esse duis tristique placerat minim.Condimentum ullamcorper hac inceptos urnapraesent variuscras, aliquammauris temporsuspendisse lacinia augue netus.Urnapraesent blandit urna mattis tortor feugait elitnunc, rhoncus sagittis vel phasellus fermentum interdumdonec magna.Consetetur nunc, tincidunt malesuada quam volutpatut nullasuspendisse tortorcurabitur placerat.Luctus nunccurabitur placerat te, fames gravida liber quod wisi magnainteger enimaliquam dui.Convallis, vestibulumnulla torquent a sea urnapraesent etiam.Minim magnis nulla id turpis assum, penatibus sedfusce enimaliquam non.Nunccurabitur fames nisl dictumstvivamus, mipellentesque sed quod nec mollis pellentesque vestibulum bibendumfusce.Semvestibulum etiam interdum netus elitvivamus stet phasellus, ea bibendumin option volutpat arcumorbi sadipscing magnapraesent facilisis.Felis rebum consetetur mazim doming class.Quam sempermorbi aptent.Morbi libero habitasse, consetetur euismod metusdonec eleifend.Nostrud minulla curae bibendumin autem.Quis aaenean veniam, fermentum ultrices dictumst volutpatut telluspraesent mazim erosin.Cum sem egestas urnapraesent nascetur nunc.Mattis vehicula lacinia variuscras.Vitae clita autem ultricies ex, semper elementum sadipscing eirmod nihil magna euismod volutpatut sodales.Nostra imperdietaliquam nondonec potenti interdum ea.Veniam molestie lobortis.Nec sed ex dolor suscipit.Dictum mattis.Vulputate soluta euismod.Justocras sed.Feugiat nam enimsed molestie aenean aliquyam, nunc suscipit dis felissed fames conguenulla ultricies.Nullamauris eu hendrerit nullam aenean.Tempus varius sadipscing, nihil tortorcurabitur cursus ad.Facilisisproin donec congue egestasmauris mauris, varius montes metusdonec assum dapibus fermentum nullasuspendisse ligula massapellentesque.Accusam odio curae et platea, nihil vestibulum interdum faucibusvestibulum quammaecenas eros integer lectusnullam.Conguenulla posuere mauris ultriciespellentesque inceptos ipsumcurabitur fermentum, mipellentesque ipsuminteger mus consequat tation magna nisised.Stet enimsed nullamauris, luctus luptatum consectetuer ante eratproin.Urna erat fames sociosqu.Justo option quisaenean erosin elitvivamus, nobis montes iaculis felis cum sagittis nequeetiam litora.Morbi aliquammauris imperdietaliquam muspellentesque scelerisque, rhoncus libero consetetur urna.Erat liberoduis luctus odio, risusdonec fermentum ad dapibus eos.Assum aliquip aliquyam cursus eleifend purus, iusto maurisaenean mauris eum lectus quammaecenas cum.Rhoncus dolores imperdietaliquam, quisque ea metus imperdiet.Felissed rebum ultricies, id pulvinar sempermorbi elitduis ipsumcurabitur dui stet.Lobortisetiam augue stet, iaculis cum viverra vel.Quisque euismod cursus.Consectetur natoque vestibulum voluptua, nisised magnis enimsed dapibusnam laoreetphasellus duis fusce senectus.Hac invidunt elitvivamus laoreet maurisaenean nonumy, vestibulumnulla tortorvestibulum convallis dis mus massaphasellus.Nascetur, illum metusdonec sem iusto elitvivamus inceptos."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/SPDZYGDHEWO.txt",
    "content": "Sociosqu assum liber, habitasse possim velit antesuspendisse laoreetphasellus tristique.Sollicitudin arcumorbi aliquammauris dolore sociosqu, augue metus pretium lacus enim cubilia massapellentesque sapien telluspraesent option.Pulvinar odio lacinia ea.Neque enimnulla nulla delenit vel, malesuada scelerisque variuscras adipiscing justocras liberoduis nullam assum.Primis faucibusvestibulum class est, rhoncusmaecenas minulla tristique.Elitduis duimauris ante facilisisproin, nequeetiam ornare ametduis.Quod eget porta euismod lorem semper.Adipiscing metus.Sed facilisi justo maecenas urnapraesent quam integer sollicitudin, labore sociosqu ad conguenulla gubergren nisl.Justocras netus ridiculus sem litora parturient.Nostrud nullam ultrices convallis cubilia liber.Gravida nonumy malesuada, ornare consequat tortorcurabitur sempermorbi suscipit.Stet lectus suscipit assum class, quam id viverra magna.Tortorvestibulum lorem enimnulla duis nunccurabitur conubia, suscipit illum fringilla elit erosin tempor bibendumin vero.Vero taciti.Ultrices ex dapibus netus laoreetphasellus.Phasellus felis ac iaculis, dolor at rhoncus possim ametduis imperdietaliquam himenaeos.Duis congue, lacus habitasse dapibusnam sociis sed inceptos.Faucibusvestibulum dapibus metusdonec fringilla, iusto dictumst ornare neque aliquam sociis erat.Leo temporsuspendisse cursus lorem bibendumin fermentum.Muspellentesque sedfusce ac ametduis est ad te, urna scelerisque molestie arcu torquent delenit.Nonumy volutpatut gravida quam, ex aenean lectus.Enim nunccurabitur purus augue.Magnis lacusut temporsuspendisse varius diaminteger bibendumfusce cras, facilisisat dignissim autem eratproin magnainteger qui.Assum ultricies egestasmauris eleifend, ultrices no variuscras.Mipellentesque montes aliquet metus.Clita aaenean accusam wisi.Tempus sed penatibus facer.Diam eratproin facer dolore.Dapibusnam imperdiet rebum vero duo placerat, auctormauris nostra faucibus orci lacus veniam assum.Porttitor magna fusce consectetuer ipsumcurabitur, enim potenti massa wisi integer egestasmauris molestie.Mattis congue arcumorbi exerci semvestibulum curae, esse diam dolor facilisisproin urnapraesent.Per lacusnulla.Pharetra soluta ipsuminteger hendrerit, convallis tortorvestibulum ullamcorper mollis clita viverra.Ultriciespellentesque nisi qui etiam enimaliquam, laoreet hendrerit senectus illum eget pulvinar nascetur praesent torquent est.Diam consecteturpraesent nulla.Aptent ad ac commodo quis, bibendumin rhoncusmaecenas ultriciespellentesque enimsed facilisisproin eros.Facilisicurabitur nequeetiam sit elitnunc.Vehicula quammaecenas sadipscing erosin facilisisat nostra.Augue accumsan sed volutpat bibendumfusce, consectetur magna vel mauris duo te nihil voluptua arcu mazim.Pulvinarvestibulum maurisaenean ultriciespellentesque nobis curabitur liber venenatis, laoreetphasellus massapellentesque sempermorbi dignissim potenti nulla.Torquent iaculis quammaecenas, porttitor mollis fusce nunc lacinia.Eos soluta vulputate.Wisi nam.Faucibus nequeetiam convallis, purusvestibulum tempus duimauris fermentum aliquammauris.Primis sanctus.Molestie, lectus et elit imperdietaliquam ipsumcurabitur esse.Mazim quisque non.Dapibus voluptua sollicitudin convallis cum, orci sanctus diam habitasse.Nibh purus litora ametduis sapien, arcumorbi tempus conguenulla."
  },
  {
    "path": "12-Advanced Python Modules/08-Advanced-Python-Module-Exercise/extracted_content/Two/SWOFXREEHWA.txt",
    "content": "Nequeetiam aliquyam nunccurabitur curabitur nonumy maecenas maurisaenean inceptos, taciti sed imperdietaliquam praesent antesuspendisse lorem.Quisaenean id tation orci proin, class augue fames enimnulla enim sollicitudin rutrum elitr suspendisse mi.Hac exerci dolor fames proin arcumorbi turpis, dictumst magna enimsed zzril facilisicurabitur.Accumsannulla soluta, felis facilisis tortor ligula vulputate ultriciespellentesque nisised.Felis dolores rhoncus ultriciespellentesque venenatis lectus, integer lacus fermentumfusce orci malesuada magna conubia.Variuscras augue porttitor.Praesent consectetur placerat nobis metus cubilia felissed, no rebum nondonec liber odio autem quam.Ultricies inceptos massapellentesque iaculis magnapraesent convallis interdumdonec, ac malesuadanullam sanctus praesent scelerisque eleifend nonummy.Sociis donec dis vel class velit, vivamus pellentesque platea faucibusvestibulum hac.Duo option qui, velit eum adipiscing eirmod variuscras auctor.Consetetur soluta, feugiat litora cras molestie facilisi iusto.Sociosqu tincidunt.Nisised, aliquam invidunt nihil sadipscing ea phasellus.Hac sedfusce, malesuada adipiscing scelerisque mattis quisaenean mus mauris.Phasellus pellentesque aliquammauris aenean nascetur duimauris.Praesent cras esse lorem aaenean malesuadanullam, illum eum cum iusto volutpat quis erosin.Doming quod volutpat nondonec.Est nisised convallis leopraesent cubilia vivamus, sollicitudin facilisi nascetur diam.Quisque cum nobis, orci aaenean curabitur massapellentesque.Nullam rebum dictumstvivamus soluta, voluptua lobortisetiam esse dapibusnam temporsuspendisse elitvivamus.Dolores tortor lobortisetiam lacinia, conubia invidunt iusto dolor.Dolore urna odio torquent.Cubilia delenit liberoduis porta, pulvinarvestibulum suspendisse fermentumfusce quisque leopraesent.Rutrum sit magna facilisicurabitur odio mi consectetuer conubia, molestie tortorvestibulum nulla per rhoncus sodales liberoduis.Minim iusto auctor nonummy varius, exerci nisi inceptos tortorcurabitur fermentumfusce justocras.Eirmod consetetur pretium sem labore magna tortorvestibulum, a rhoncus kasd eratproin habitant tempor lacinia tellus.Invidunt velit ametduis eum.Accumsan mauris habitasse elitr.Egestasmauris enimsed quod sem senectus, eratproin accusam lacinia lectus sadipscing takimata nostra cum clita.Sed gravida sodales non leopraesent etiam, felis feugait duis quisque vestibulum dui.Neque nullasuspendisse sed nonummy quammaecenas, litora facilisi eu sit habitant iusto.At facilisis senectus mipellentesque, sem libero netus porttitor hendrerit doming pulvinar voluptua.Aptent feugiat semper euismod, faucibus morbi netus option magnainteger ea zzril quisque est.Sadipscing per, dictumstvivamus eratproin sodales mi vulputate quisque clita.Erat dolore donec amet leopraesent lobortisetiam consecteturpraesent, sagittis aptent nonummy magnainteger eget.Laoreetphasellus risus semvestibulum fusce, lobortisetiam consectetuer variuscras ipsumcurabitur.Nec facilisi curae aliquyam eros invidunt possim, dolores sodalessed ultricies variuscras nullam.Torquent facer auctormauris sapien natoque tation, dapibus himenaeos vivamus lectus erosin nulla fringilla.Risus taciti, sem labore pretium id donec sociosqu.Dignissim purus erosin eleifend torquent nullam suspendisse rhoncusmaecenas, tortorcurabitur sempermorbi accumsan eum ultrices dictumstvivamus.Elitduis congue nondonec proin.Pretium nullamauris ligula nunccurabitur, nisised natoque rebum fringilla.Mi viverra semper ridiculus est feugiat litora dui, diam maurisaenean ornare sed faucibus aptent.Wisi elitvivamus varius telluspraesent, eros felis aaenean urna.Porta ultricies leo semper tristique, fringilla dui tellus.Eros duo duis ligula, porta dolor class iriure nonummy commodo massa.Facilisis stet netus morbi ultrices.Lobortisetiam potenti qui dui faucibus.Semvestibulum feliscras ullamcorper.Malesuadanullam laoreetphasellus esse elitnunc, curabitur dolore per."
  },
  {
    "path": "12-Advanced Python Modules/Example_Top_Level/Mid-Example-One/Bottom-Level-One/One_Text.txt",
    "content": ""
  },
  {
    "path": "12-Advanced Python Modules/Example_Top_Level/Mid-Example-One/Bottom-Level-Two/Bottom-Text-Two.txt",
    "content": ""
  },
  {
    "path": "12-Advanced Python Modules/Example_Top_Level/Mid-Example-One/Mid-Level-Doc.txt",
    "content": ""
  },
  {
    "path": "12-Advanced Python Modules/Example_Top_Level/Mid-Example.txt",
    "content": ""
  },
  {
    "path": "13-Web-Scraping/.ipynb_checkpoints/00-Guide-to-Web-Scraping-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Guide to Web Scraping\\n\",\n    \"\\n\",\n    \"Let's get you started with web scraping and Python. Before we begin, here are some important rules to follow and understand:\\n\",\n    \"\\n\",\n    \"1. Always be respectful and try to get premission to scrape, do not bombard a website with scraping requests, otherwise your IP address may be blocked!\\n\",\n    \"2. Be aware that websites change often, meaning your code could go from working to totally broken from one day to the next.\\n\",\n    \"3. Pretty much every web scraping project of interest is a unique and custom job, so try your best to generalize the skills learned here.\\n\",\n    \"\\n\",\n    \"OK, let's get started with the basics!\\n\",\n    \"\\n\",\n    \"## Basic components of a WebSite\\n\",\n    \"\\n\",\n    \"### HTML\\n\",\n    \"HTML stands for  Hypertext Markup Language and every website on the internet uses it to display information. Even the jupyter notebook system uses it to display this information in your browser. If you right click on a website and select \\\"View Page Source\\\" you can see the raw HTML of a web page. This is the information that Python will be looking at to grab information from. Let's take a look at a simple webpage's HTML:\\n\",\n    \"\\n\",\n    \"    <!DOCTYPE html>  \\n\",\n    \"    <html>  \\n\",\n    \"        <head>\\n\",\n    \"            <title>Title on Browser Tab</title>\\n\",\n    \"        </head>\\n\",\n    \"        <body>\\n\",\n    \"            <h1> Website Header </h1>\\n\",\n    \"            <p> Some Paragraph </p>\\n\",\n    \"        <body>\\n\",\n    \"    </html>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's breakdown these components.\\n\",\n    \"\\n\",\n    \"Every <tag> indicates a specific block type on the webpage:\\n\",\n    \"\\n\",\n    \"    1.<DOCTYPE html> HTML documents will always start with this type declaration, letting the browser know its an HTML file.\\n\",\n    \"    2. The component blocks of the HTML document are placed between <html> and </html>.\\n\",\n    \"    3. Meta data and script connections (like a link to a CSS file or a JS file) are often placed in the <head> block.\\n\",\n    \"    4. The <title> tag block defines the title of the webpage (its what shows up in the tab of a website you're visiting).\\n\",\n    \"    5. Is between <body> and </body> tags are the blocks that will be visible to the site visitor.\\n\",\n    \"    6. Headings are defined by the <h1> through <h6> tags, where the number represents the size of the heading.\\n\",\n    \"    7. Paragraphs are defined by the <p> tag, this is essentially just normal text on the website.\\n\",\n    \"\\n\",\n    \"    There are many more tags than just these, such as <a> for hyperlinks, <table> for tables, <tr> for table rows, and <td> for table columns, and more!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### CSS\\n\",\n    \"\\n\",\n    \"CSS stands for Cascading Style Sheets, this is what gives \\\"style\\\" to a website, including colors and fonts, and even some animations! CSS uses tags such as **id** or **class** to connect an HTML element to a CSS feature, such as a particular color. **id** is a unique id for an HTML tag and must be unique within the HTML document, basically a single use connection. **class** defines a general style that can then be linked to multiple HTML tags. Basically if you only want a single html tag to be red, you would use an id tag, if you wanted several HTML tags/blocks to be red, you would create a class in your CSS doc and then link it to the rest of these blocks.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Scraping Guidelines\\n\",\n    \"\\n\",\n    \"Keep in mind you should always have permission for the website you are scraping! Check a websites terms and conditions for more info. Also keep in mind that a computer can send requests to a website very fast, so a website may block your computer's ip address if you send too many requests too quickly. Lastly, websites change all the time! You will most likely need to update your code often for long term web-scraping jobs.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Web Scraping with Python\\n\",\n    \"\\n\",\n    \"There are a few libraries you will need, you can go to your command line and install them with conda install (if you are using anaconda distribution), or pip install for other python distributions.\\n\",\n    \"\\n\",\n    \"    conda install requests\\n\",\n    \"    conda install lxml\\n\",\n    \"    conda install bs4\\n\",\n    \"    \\n\",\n    \"if you are not using the Anaconda Installation, you can use **pip install** instead of **conda install**, for example:\\n\",\n    \"\\n\",\n    \"    pip install requests\\n\",\n    \"    pip install lxml\\n\",\n    \"    pip install bs4\\n\",\n    \"    \\n\",\n    \"Now let's see what we can do with these libraries.\\n\",\n    \"\\n\",\n    \"----\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Example Task 0 - Grabbing the title of a page\\n\",\n    \"\\n\",\n    \"Let's start very simple, we will grab the title of a page. Remember that this is the HTML block with the **title** tag. For this task we will use **www.example.com** which is a website specifically made to serve as an example domain. Let's go through the main steps:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 51,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import requests\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 52,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Step 1: Use the requests library to grab the page\\n\",\n    \"# Note, this may fail if you have a firewall blocking Python/Jupyter \\n\",\n    \"# Note sometimes you need to run this twice if it fails the first time\\n\",\n    \"res = requests.get(\\\"http://www.example.com\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This object is a requests.models.Response object and it actually contains the information from the website, for example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 53,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"requests.models.Response\"\n      ]\n     },\n     \"execution_count\": 53,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"type(res)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 54,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'<!doctype html>\\\\n<html>\\\\n<head>\\\\n    <title>Example Domain</title>\\\\n\\\\n    <meta charset=\\\"utf-8\\\" />\\\\n    <meta http-equiv=\\\"Content-type\\\" content=\\\"text/html; charset=utf-8\\\" />\\\\n    <meta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1\\\" />\\\\n    <style type=\\\"text/css\\\">\\\\n    body {\\\\n        background-color: #f0f0f2;\\\\n        margin: 0;\\\\n        padding: 0;\\\\n        font-family: -apple-system, system-ui, BlinkMacSystemFont, \\\"Segoe UI\\\", \\\"Open Sans\\\", \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif;\\\\n        \\\\n    }\\\\n    div {\\\\n        width: 600px;\\\\n        margin: 5em auto;\\\\n        padding: 2em;\\\\n        background-color: #fdfdff;\\\\n        border-radius: 0.5em;\\\\n        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);\\\\n    }\\\\n    a:link, a:visited {\\\\n        color: #38488f;\\\\n        text-decoration: none;\\\\n    }\\\\n    @media (max-width: 700px) {\\\\n        div {\\\\n            margin: 0 auto;\\\\n            width: auto;\\\\n        }\\\\n    }\\\\n    </style>    \\\\n</head>\\\\n\\\\n<body>\\\\n<div>\\\\n    <h1>Example Domain</h1>\\\\n    <p>This domain is for use in illustrative examples in documents. You may use this\\\\n    domain in literature without prior coordination or asking for permission.</p>\\\\n    <p><a href=\\\"https://www.iana.org/domains/example\\\">More information...</a></p>\\\\n</div>\\\\n</body>\\\\n</html>\\\\n'\"\n      ]\n     },\n     \"execution_count\": 54,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"res.text\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"Now we use BeautifulSoup to analyze the extracted page. Technically we could use our own custom script to loook for items in the string of **res.text** but the BeautifulSoup library already has lots of built-in tools and methods to grab information from a string of this nature (basically an HTML file). Using BeautifulSoup we can create a \\\"soup\\\" object that contains all the \\\"ingredients\\\" of the webpage. Don't ask me about the weird library names, I didn't choose them! :)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 55,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import bs4\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 56,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"soup = bs4.BeautifulSoup(res.text,\\\"lxml\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 57,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<!DOCTYPE html>\\n\",\n       \"<html>\\n\",\n       \"<head>\\n\",\n       \"<title>Example Domain</title>\\n\",\n       \"<meta charset=\\\"utf-8\\\"/>\\n\",\n       \"<meta content=\\\"text/html; charset=utf-8\\\" http-equiv=\\\"Content-type\\\"/>\\n\",\n       \"<meta content=\\\"width=device-width, initial-scale=1\\\" name=\\\"viewport\\\"/>\\n\",\n       \"<style type=\\\"text/css\\\">\\n\",\n       \"    body {\\n\",\n       \"        background-color: #f0f0f2;\\n\",\n       \"        margin: 0;\\n\",\n       \"        padding: 0;\\n\",\n       \"        font-family: -apple-system, system-ui, BlinkMacSystemFont, \\\"Segoe UI\\\", \\\"Open Sans\\\", \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif;\\n\",\n       \"        \\n\",\n       \"    }\\n\",\n       \"    div {\\n\",\n       \"        width: 600px;\\n\",\n       \"        margin: 5em auto;\\n\",\n       \"        padding: 2em;\\n\",\n       \"        background-color: #fdfdff;\\n\",\n       \"        border-radius: 0.5em;\\n\",\n       \"        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);\\n\",\n       \"    }\\n\",\n       \"    a:link, a:visited {\\n\",\n       \"        color: #38488f;\\n\",\n       \"        text-decoration: none;\\n\",\n       \"    }\\n\",\n       \"    @media (max-width: 700px) {\\n\",\n       \"        div {\\n\",\n       \"            margin: 0 auto;\\n\",\n       \"            width: auto;\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"    </style>\\n\",\n       \"</head>\\n\",\n       \"<body>\\n\",\n       \"<div>\\n\",\n       \"<h1>Example Domain</h1>\\n\",\n       \"<p>This domain is for use in illustrative examples in documents. You may use this\\n\",\n       \"    domain in literature without prior coordination or asking for permission.</p>\\n\",\n       \"<p><a href=\\\"https://www.iana.org/domains/example\\\">More information...</a></p>\\n\",\n       \"</div>\\n\",\n       \"</body>\\n\",\n       \"</html>\"\n      ]\n     },\n     \"execution_count\": 57,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"soup\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now let's use the **.select()** method to grab elements. We are looking for the 'title' tag, so we will pass in 'title'\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[<title>Example Domain</title>]\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"soup.select('title')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice what is returned here, its actually a list containing all the title elements (along with their tags). You can use indexing or even looping to grab the elements from the list. Since this object it still a specialized tag, we cna use method calls to grab just the text.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"title_tag = soup.select('title')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<title>Example Domain</title>\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"title_tag[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"bs4.element.Tag\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"type(title_tag[0])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Example Domain'\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"title_tag[0].getText()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Example Task 1 - Grabbing all elements of a class\\n\",\n    \"\\n\",\n    \"Let's try to grab all the section headings of the Wikipedia Article on Grace Hopper from this URL: https://en.wikipedia.org/wiki/Grace_Hopper\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# First get the request\\n\",\n    \"res = requests.get('https://en.wikipedia.org/wiki/Grace_Hopper')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Create a soup from request\\n\",\n    \"soup = bs4.BeautifulSoup(res.text,\\\"lxml\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now its time to figure out what we are actually looking for. Inspect the element on the page to see that the section headers have the class \\\"mw-headline\\\". Because this is a class and not a straight tag, we need to adhere to some syntax for CSS. In this case\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<table>\\n\",\n    \"\\n\",\n    \"<thead >\\n\",\n    \"<tr>\\n\",\n    \"<th>\\n\",\n    \"<p>Syntax to pass to the .select() method</p>\\n\",\n    \"</th>\\n\",\n    \"<th>\\n\",\n    \"<p>Match Results</p>\\n\",\n    \"</th>\\n\",\n    \"</tr>\\n\",\n    \"</thead>\\n\",\n    \"<tbody>\\n\",\n    \"<tr>\\n\",\n    \"<td>\\n\",\n    \"<p><code>soup.select('div')</code></p>\\n\",\n    \"</td>\\n\",\n    \"<td>\\n\",\n    \"<p>All elements with the <code>&lt;div&gt;</code> tag</p>\\n\",\n    \"</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>\\n\",\n    \"<p><code>soup.select('#some_id')</code></p>\\n\",\n    \"</td>\\n\",\n    \"<td>\\n\",\n    \"<p>The HTML element containing the <code>id</code> attribute of <code>some_id</code></p>\\n\",\n    \"</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>\\n\",\n    \"<p><code>soup.select('.notice')</code></p>\\n\",\n    \"</td>\\n\",\n    \"<td>\\n\",\n    \"<p>All the HTML elements with the CSS <code>class</code> named <code>notice</code></p>\\n\",\n    \"</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>\\n\",\n    \"<p><code>soup.select('div span')</code></p>\\n\",\n    \"</td>\\n\",\n    \"<td>\\n\",\n    \"<p>Any elements named <code>&lt;span&gt;</code> that are within an element named <code>&lt;div&gt;</code></p>\\n\",\n    \"</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>\\n\",\n    \"<p><code>soup.select('div &gt; span')</code></p>\\n\",\n    \"</td>\\n\",\n    \"<td>\\n\",\n    \"<p>Any elements named <code class=\\\"literal2\\\">&lt;span&gt;</code> that are <span><em >directly</em></span> within an element named <code class=\\\"literal2\\\">&lt;div&gt;</code>, with no other element in between</p>\\n\",\n    \"</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"\\n\",\n    \"</tr>\\n\",\n    \"</tbody>\\n\",\n    \"</table>\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[<span class=\\\"mw-headline\\\" id=\\\"Early_life_and_education\\\">Early life and education</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"Career\\\">Career</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"World_War_II\\\">World War II</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"UNIVAC\\\">UNIVAC</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"COBOL\\\">COBOL</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"Standards\\\">Standards</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"Retirement\\\">Retirement</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"Post-retirement\\\">Post-retirement</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"Anecdotes\\\">Anecdotes</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"Death\\\">Death</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"Dates_of_rank\\\">Dates of rank</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"Awards_and_honors\\\">Awards and honors</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"Military_awards\\\">Military awards</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"Other_awards\\\">Other awards</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"Legacy\\\">Legacy</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"Places\\\">Places</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"Programs\\\">Programs</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"In_popular_culture\\\">In popular culture</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"Grace_Hopper_Celebration_of_Women_in_Computing\\\">Grace Hopper Celebration of Women in Computing</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"Notes\\\">Notes</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"Obituary_notices\\\">Obituary notices</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"See_also\\\">See also</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"References\\\">References</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"Further_reading\\\">Further reading</span>,\\n\",\n       \" <span class=\\\"mw-headline\\\" id=\\\"External_links\\\">External links</span>]\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# note depending on your IP Address, \\n\",\n    \"# this class may be called something different\\n\",\n    \"soup.select(\\\".toctext\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Early life and education\\n\",\n      \"Career\\n\",\n      \"World War II\\n\",\n      \"UNIVAC\\n\",\n      \"COBOL\\n\",\n      \"Standards\\n\",\n      \"Retirement\\n\",\n      \"Post-retirement\\n\",\n      \"Anecdotes\\n\",\n      \"Death\\n\",\n      \"Dates of rank\\n\",\n      \"Awards and honors\\n\",\n      \"Military awards\\n\",\n      \"Other awards\\n\",\n      \"Legacy\\n\",\n      \"Places\\n\",\n      \"Programs\\n\",\n      \"In popular culture\\n\",\n      \"Grace Hopper Celebration of Women in Computing\\n\",\n      \"Notes\\n\",\n      \"Obituary notices\\n\",\n      \"See also\\n\",\n      \"References\\n\",\n      \"Further reading\\n\",\n      \"External links\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for item in soup.select(\\\".toctext\\\"):\\n\",\n    \"    print(item.text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Example Task 3 - Getting an Image from a Website\\n\",\n    \"\\n\",\n    \"Let's attempt to grab the image of the Deep Blue Computer from this wikipedia article: https://en.wikipedia.org/wiki/Deep_Blue_(chess_computer)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"res = requests.get(\\\"https://en.wikipedia.org/wiki/Deep_Blue_(chess_computer)\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"soup = bs4.BeautifulSoup(res.text,'lxml')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"image_info = soup.select('.thumbimage')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[<img alt=\\\"\\\" class=\\\"thumbimage\\\" data-file-height=\\\"601\\\" data-file-width=\\\"400\\\" decoding=\\\"async\\\" height=\\\"331\\\" src=\\\"//upload.wikimedia.org/wikipedia/commons/thumb/b/be/Deep_Blue.jpg/220px-Deep_Blue.jpg\\\" srcset=\\\"//upload.wikimedia.org/wikipedia/commons/thumb/b/be/Deep_Blue.jpg/330px-Deep_Blue.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/b/be/Deep_Blue.jpg 2x\\\" width=\\\"220\\\"/>,\\n\",\n       \" <img alt=\\\"\\\" class=\\\"thumbimage\\\" data-file-height=\\\"600\\\" data-file-width=\\\"800\\\" decoding=\\\"async\\\" height=\\\"165\\\" src=\\\"//upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Kasparov_Magath_1985_Hamburg-2.png/220px-Kasparov_Magath_1985_Hamburg-2.png\\\" srcset=\\\"//upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Kasparov_Magath_1985_Hamburg-2.png/330px-Kasparov_Magath_1985_Hamburg-2.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Kasparov_Magath_1985_Hamburg-2.png/440px-Kasparov_Magath_1985_Hamburg-2.png 2x\\\" width=\\\"220\\\"/>]\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"image_info\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(image_info)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"computer = image_info[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"bs4.element.Tag\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"type(computer)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can make dictionary like calls for parts of the Tag, in this case, we are interested in the **src** , or \\\"source\\\" of the image, which should be its own .jpg or .png link:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'//upload.wikimedia.org/wikipedia/commons/thumb/b/be/Deep_Blue.jpg/220px-Deep_Blue.jpg'\"\n      ]\n     },\n     \"execution_count\": 28,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"computer['src']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can actually display it with a markdown cell with the following:\\n\",\n    \"\\n\",\n    \"    <img src='https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Deep_Blue.jpg/220px-Deep_Blue.jpg'>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<img src='https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Deep_Blue.jpg/220px-Deep_Blue.jpg'>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now that you have the actual src link, you can grab the image with requests and get along with the .content attribute. Note how we had to add https:// before the link, if you don't do this, requests will complain (but it gives you a pretty descriptive error code).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"image_link = requests.get('https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Deep_Blue.jpg/220px-Deep_Blue.jpg')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"b'\\\\xff\\\\xd8\\\\xff\\\\xe0\\\\x00\\\\x10JFIF\\\\x00\\\\x01\\\\x01\\\\x01\\\\x00H\\\\x00H\\\\x00\\\\x00\\\\xff\\\\xfe\\\\x00CFile source: http://commons.wikimedia.org/wiki/File:Deep_Blue.jpg\\\\xff\\\\xe2\\\\x02@ICC_PROFILE\\\\x00\\\\x01\\\\x01\\\\x00\\\\x00\\\\x020ADBE\\\\x02\\\\x10\\\\x00\\\\x00mntrRGB XYZ \\\\x07\\\\xcf\\\\x00\\\\x06\\\\x00\\\\x03\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00acspAPPL\\\\x00\\\\x00\\\\x00\\\\x00none\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\xf6\\\\xd6\\\\x00\\\\x01\\\\x00\\\\x00\\\\x00\\\\x00\\\\xd3-ADBE\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\ncprt\\\\x00\\\\x00\\\\x00\\\\xfc\\\\x00\\\\x00\\\\x002desc\\\\x00\\\\x00\\\\x010\\\\x00\\\\x00\\\\x00kwtpt\\\\x00\\\\x00\\\\x01\\\\x9c\\\\x00\\\\x00\\\\x00\\\\x14bkpt\\\\x00\\\\x00\\\\x01\\\\xb0\\\\x00\\\\x00\\\\x00\\\\x14rTRC\\\\x00\\\\x00\\\\x01\\\\xc4\\\\x00\\\\x00\\\\x00\\\\x0egTRC\\\\x00\\\\x00\\\\x01\\\\xd4\\\\x00\\\\x00\\\\x00\\\\x0ebTRC\\\\x00\\\\x00\\\\x01\\\\xe4\\\\x00\\\\x00\\\\x00\\\\x0erXYZ\\\\x00\\\\x00\\\\x01\\\\xf4\\\\x00\\\\x00\\\\x00\\\\x14gXYZ\\\\x00\\\\x00\\\\x02\\\\x08\\\\x00\\\\x00\\\\x00\\\\x14bXYZ\\\\x00\\\\x00\\\\x02\\\\x1c\\\\x00\\\\x00\\\\x00\\\\x14text\\\\x00\\\\x00\\\\x00\\\\x00Copyright 1999 Adobe Systems Incorporated\\\\x00\\\\x00\\\\x00desc\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x11Adobe RGB (1998)\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00XYZ \\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\xf3Q\\\\x00\\\\x01\\\\x00\\\\x00\\\\x00\\\\x01\\\\x16\\\\xccXYZ \\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00curv\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x01\\\\x023\\\\x00\\\\x00curv\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x01\\\\x023\\\\x00\\\\x00curv\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x01\\\\x023\\\\x00\\\\x00XYZ \\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x9c\\\\x18\\\\x00\\\\x00O\\\\xa5\\\\x00\\\\x00\\\\x04\\\\xfcXYZ \\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x004\\\\x8d\\\\x00\\\\x00\\\\xa0,\\\\x00\\\\x00\\\\x0f\\\\x95XYZ \\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00&1\\\\x00\\\\x00\\\\x10/\\\\x00\\\\x00\\\\xbe\\\\x9c\\\\xff\\\\xdb\\\\x00C\\\\x00\\\\x06\\\\x04\\\\x05\\\\x06\\\\x05\\\\x04\\\\x06\\\\x06\\\\x05\\\\x06\\\\x07\\\\x07\\\\x06\\\\x08\\\\n\\\\x10\\\\n\\\\n\\\\t\\\\t\\\\n\\\\x14\\\\x0e\\\\x0f\\\\x0c\\\\x10\\\\x17\\\\x14\\\\x18\\\\x18\\\\x17\\\\x14\\\\x16\\\\x16\\\\x1a\\\\x1d%\\\\x1f\\\\x1a\\\\x1b#\\\\x1c\\\\x16\\\\x16 , #&\\\\')*)\\\\x19\\\\x1f-0-(0%()(\\\\xff\\\\xdb\\\\x00C\\\\x01\\\\x07\\\\x07\\\\x07\\\\n\\\\x08\\\\n\\\\x13\\\\n\\\\n\\\\x13(\\\\x1a\\\\x16\\\\x1a((((((((((((((((((((((((((((((((((((((((((((((((((\\\\xff\\\\xc0\\\\x00\\\\x11\\\\x08\\\\x01K\\\\x00\\\\xdc\\\\x03\\\\x01\\\\x11\\\\x00\\\\x02\\\\x11\\\\x01\\\\x03\\\\x11\\\\x01\\\\xff\\\\xc4\\\\x00\\\\x1d\\\\x00\\\\x00\\\\x01\\\\x04\\\\x03\\\\x01\\\\x01\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x03\\\\x01\\\\x02\\\\x04\\\\x07\\\\x00\\\\x05\\\\x08\\\\x06\\\\t\\\\xff\\\\xc4\\\\x00[\\\\x10\\\\x00\\\\x01\\\\x03\\\\x02\\\\x03\\\\x04\\\\x05\\\\x07\\\\x07\\\\x06\\\\t\\\\x07\\\\t\\\\t\\\\x00\\\\x00\\\\x01\\\\x02\\\\x03\\\\x11\\\\x00\\\\x04\\\\x05!1\\\\x06\\\\x12AQ\\\\x07\\\\x13\\\"aq\\\\x142\\\\x81\\\\x91\\\\xa1\\\\xb1\\\\xc1#$BRbr\\\\xd1\\\\x08\\\\x1534s\\\\xf0\\\\x17CS\\\\x82\\\\xa2\\\\xa3\\\\xb2\\\\xb3\\\\xe1\\\\x16%Dc\\\\x92\\\\x94\\\\xc2&56Te\\\\x83\\\\x84\\\\x93\\\\xc37Utu\\\\xa4\\\\xb4\\\\xd2\\\\xd3\\\\xf1\\\\xff\\\\xc4\\\\x00\\\\x1a\\\\x01\\\\x01\\\\x01\\\\x01\\\\x01\\\\x01\\\\x01\\\\x01\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x01\\\\x00\\\\x02\\\\x03\\\\x04\\\\x05\\\\x06\\\\xff\\\\xc4\\\\x004\\\\x11\\\\x01\\\\x01\\\\x00\\\\x02\\\\x01\\\\x03\\\\x02\\\\x04\\\\x03\\\\x07\\\\x04\\\\x02\\\\x03\\\\x00\\\\x00\\\\x00\\\\x00\\\\x01\\\\x02\\\\x11!\\\\x03\\\\x121AQ\\\\x04\\\\x13aq\\\\x05\\\"\\\\x8123B\\\\xa1\\\\xb1\\\\xc1\\\\xf0\\\\x14#\\\\x91\\\\xd1\\\\x15\\\\xe1Rr\\\\xd2\\\\xff\\\\xda\\\\x00\\\\x0c\\\\x03\\\\x01\\\\x00\\\\x02\\\\x11\\\\x03\\\\x11\\\\x00?\\\\x00\\\\xf5\\\\x8c\\\\xf4\\\\x85io\\\\xb4\\\\xb85\\\\xde%h\\\\xb6\\\\x9bi\\\\xc5\\\\xa5kd\\\\xef\\\\xc6\\\\xf2\\\\x08\\\\x989\\\\xf1\\\\xafe\\\\xfc\\\\';\\\\x96\\\\xbayn\\\\xb8O\\\\xc4\\\\xf0\\\\x98\\\\xde\\\\xf9\\\\xa5\\\\xc9\\\\x83\\\\xe2V\\\\x98\\\\xbe\\\\x1a\\\\xc5\\\\xf6\\\\x1e\\\\xef[j\\\\xf0%\\\\x0b\\\\xdd)\\\\x980r=\\\\xe2\\\\xbc\\\\x1d^\\\\x96]\\\\x1c\\\\xefO9\\\\xab\\\\x1e\\\\xce\\\\x9fS\\\\x1e\\\\xae3<|T\\\\xe1\\\\\\\\\\\\xda-H\\\\xb5\\\\x06\\\\x10\\\\x08 \\\\x80A\\\\xc8\\\\x83\\\\xc6\\\\x90\\\\xd2+\\\\x0c\\\\xba\\\\xc2\\\\x96]\\\\xc0\\\\x96\\\\x95[\\\\x04\\\\x99\\\\xc3\\\\x1dT5\\\\xff\\\\x00t\\\\xa8\\\\x96\\\\x8f\\\\xd9\\\\xcd\\\\x1d\\\\xc9\\\\xd6\\\\x96\\\\xad\\\\xdf\\\\xed\\\\x7f\\\\xcf\\\\xfd\\\\xa7\\\\xd8b\\\\xb6\\\\xd7\\\\x8f\\\\x1bq\\\\xbe\\\\xc5\\\\xe2S\\\\xbc\\\\xbbW\\\\xc6\\\\xeb\\\\xa9\\\\x1c\\\\xe3E\\\\x0f\\\\xb4\\\\x92S\\\\xdfS6X\\\\x9dPa\\\\xd0\\\\xd4\\\\x9e;\\\\xc9Q\\\\x88m\\\\x05\\\\xdbN)\\\\xf6J]}m\\\\xba\\\\xc3\\\\x9b\\\\x8bB\\\\xa5\\\\x81 \\\\xfa\\\\xf22\\\\x0e\\\\x84\\\\x1a}[\\\\xfe\\\\x19\\\\xfe{\\\\xb6\\\\xff\\\\x00\\\\x99\\\\xae\\\\x1f\\\\xbe\\\\xb2\\\\x7f\\\\x11\\\\xc4Up\\\\x9b2T\\\\xda\\\\x1bd5\\\\xd6(\\\\xc7i\\\\xc3&H\\\\x81\\\\xe6\\\\xee\\\\x8dr\\\\xe53\\\\xb9\\\\xae\\\\x12\\\\xd0\\\\x9f\\\\x9d\\\\xdd~\\\\xd4g\\\\xfc\\\\xc4\\\\xd3\\\\x19\\\\xa9\\\\x0b\\\\x1f$\\\\xaf\\\\no\\\\x8a\\\\xa7\\\\x95\\\\x03\\\\xf9G\\\\xff\\\\x00\\\\xd2\\\\\\\\\\\\x07\\\\x9f\\\\x90;\\\\xfd\\\\xe2k\\\\x13\\\\xf6cW\\\\xd5\\\\xa1\\\\xe8M\\\\xb5/\\\\xa4\\\\xcc#sT\\\\xa1\\\\xf5\\\\x12\\\\x0cG\\\\xc9(O~\\\\xba~\\\\x15\\\\xd7\\\\xa7<\\\\xfd\\\\xbf\\\\xbb\\\\x9e~\\\\x8e\\\\xa0\\\\nZ\\\\n\\\\xc2\\\\xdf\\\\xc9\\\\x11\\\\x99H\\\\xce\\\\xb5\\\\xaffvpu\\\\xc0\\\\xde\\\\xfa\\\\xd2\\\\x00\\\\x90\\\\x00\\\"\\\\x0ef\\\\'\\\\xba\\\\x8ds\\\\xa8\\\\xb6\\\\x81\\\\x88\\\\xed\\\\x16\\\\x19\\\\x86\\\\xdf\\\\xdb\\\\xd8\\\\xdf^2\\\\xdd\\\\xeb\\\\xf9\\\\xb6\\\\xc2ek#\\\\x9e\\\\xe8\\\\x04\\\\x81\\\\xder\\\\xa6a\\\\x95\\\\x9b\\\\x91\\\\x9b\\\\xd4\\\\xc6][\\\\xcbh\\\\x97\\\\x01\\\\x00\\\\x80`\\\\xf7Vt\\\\xd6\\\\xce\\\\x0b\\\\x06\\\\xa3\\\\xb2\\\\xd4\\\\x99ReI\\\\x95&T\\\\x99ReI\\\\xc4Ww\\\\xca\\\\xb9\\\\xbf\\\\xb7\\\\x0e\\\\xc2\\\\x82VF\\\\xee\\\\x99\\\\x9c\\\\x81\\\\xf4W\\\\xea{5\\\\xd6\\\\xc2\\\\xcb\\\\xea\\\\xfc\\\\xfc\\\\xcf\\\\xfd\\\\xbc\\\\xbb\\\\xa6\\\\xf7\\\\x1d5\\\\xd0\\\\xda\\\\xf7\\\\xba<\\\\xc2\\\\xf3\\\\x9d\\\\xd2\\\\xea\\\\x7f\\\\xac5\\\\xf0?\\\\x17\\\\x9a\\\\xf8\\\\xcc\\\\xff\\\\x00O\\\\xe8\\\\xfb\\\\x7f\\\\x86\\\\xdd\\\\xfc6\\\\x1f\\\\xe7\\\\xad{q_9\\\\xec-H\\\\xa2\\\\xa0Z\\\\x91iH\\\\xd7\\\\xf6\\\\x16\\\\xb7\\\\xed\\\\xa17l\\\\xa5e\\\\xb5o6\\\\xb9)[j\\\\xfa\\\\xc8P\\\\xcd\\\\'\\\\xbc\\\\x1aF\\\\xec\\\\xf0\\\\x818\\\\x9e\\\\x14\\\\xc8\\\\xde\\\\xeb1{t\\\\x9c\\\\xd4\\\\x02Sr\\\\x94\\\\xf3\\\\x81\\\\tr;\\\\xb7Or\\\\x8d&\\\\xea\\\\xfd\\\\x1b\\\\x0b\\\\x1b\\\\xeblB\\\\xdc\\\\xbdd\\\\xf2^l\\\\x12\\\\x85n\\\\xea\\\\x95\\\\rR\\\\xa0sJ\\\\x87\\\\x10`\\\\x8a\\\\x19\\\\xb2\\\\xcf-\\\\x06\\\\x1d\\\\xff\\\\x00J\\\\xee\\\\x80\\\\xe0_=\\\\xd9\\\\xad\\\\x8a\\\\xbdk\\\\x7f\\\\xc3?\\\\xcfw\\\\xa9\\\\xa9\\\\xcd\\\\t\\\\x1f\\\\xad\\\\xdd~\\\\xd0\\\\x7fa5\\\\xa9U\\\\x19\\\\xdf\\\\xd0\\\\xaf\\\\xc2\\\\xabxS\\\\xca\\\\x81\\\\xfc\\\\xa4\\\\x07\\\\xfc\\\\xa6\\\\xc0\\\\x0f\\\\x0f!{\\\\xfb\\\\xc4\\\\xd6\\\\'\\\\x88\\\\xd5\\\\xf5iz\\\\x0f\\\\xdf\\\\x1d%a\\\\x9dXI\\\\x96\\\\x9f\\\\x991\\\\x03\\\\xab\\\\xd7\\\\xd7\\\\x15\\\\xdb\\\\xa5\\\\xe3/\\\\xb7\\\\xf7\\\\x8ey\\\\xfa:>\\\\xf2\\\\xea\\\\xd3\\\\t\\\\x17x\\\\x8e+z\\\\x96m\\\\xd0\\\\x94\\\\x82\\\\xb7\\\\x96\\\\x12\\\\x84e\\\\xa2G3=\\\\xe4\\\\xe49WM\\\\\\\\\\\\xa4\\\\x98\\\\xc7+f\\\\x1b\\\\xcb*\\\\xd2\\\\xb3\\\\x8a\\\\xe2;J\\\\x8b\\\\x84\\\\xd8[\\\\xdc\\\\xe1xJ\\\\xd1\\\\xb8\\\\xd6 \\\\xe2Bn\\\\x1cYRaM\\\\xb6\\\\xa0BS\\\\x1b\\\\xd9\\\\xa8Nc!Z\\\\x98\\\\xcc<\\\\xf3X\\\\xee\\\\xcb9\\\\xed?\\\\x9bi\\\\x80`\\\\xb6\\\\x18K>P\\\\xd27\\\\xae\\\\xdci\\\\xb0\\\\xfd\\\\xe3\\\\xca\\\\xdeu\\\\xe2\\\\x94\\\\x84\\\\x82\\\\xb5\\\\x9c\\\\xc9\\\\x81Y\\\\xcb+x\\\\xf4k\\\\x1cf3\\\\x84\\\\xc5]\\\\xa9\\\\xc5n\\\\xda \\\\xa8\\\\xfdr2\\\\xf5Vu\\\\xee~\\\\xc5E\\\\xb8+\\\\xdeyJu\\\\xcf\\\\x1d?~\\\\xea\\\\x8e\\\\x92\\\\xd0\\\\x83\\\\x94\\\\xf6@\\\\xe0(jA(,\\\\xa92\\\\xa4\\\\xca\\\\x91\\\\n\\\\x80\\\\xd6\\\\x8bQ7\\\\x95\\\\xc19w\\\\x9a7S\\\\x83\\\\x9e\\\\\\\\^\\\\xb5\\\\x1c\\\\x1d\\\\x1e\\\\xfa\\\\xfdm\\\\xfd\\\\xf67\\\\xea\\\\xfc\\\\xe6<\\\\xf4\\\\xec\\\\xfa:\\\\x9b\\\\xa0\\\\xd77\\\\xfa>\\\\xb5\\\\x1fV\\\\xe1\\\\xe4\\\\xff\\\\x00N\\\\xbe\\\\x17\\\\xe3s_\\\\x19\\\\x97\\\\xda\\\\x7fG\\\\xda\\\\xfc*\\\\xef\\\\xe1\\\\xb1\\\\xfd\\\\x7f\\\\xadX\\\"\\\\xbeS\\\\xe8\\\\x94T\\\\x0bR-!\\\\xa8\\\\xdaM\\\\xa6\\\\xc16f\\\\xd9\\\\xb7\\\\xf1\\\\xfcR\\\\xd6\\\\xc1\\\\xb7\\\\t\\\\r\\\\xf5\\\\xab\\\\xed.5\\\\xddH\\\\xcdQ\\\\x96\\\\x83\\\\x8d[\\\\x1fg\\\\x84\\\\xb8\\\\xe9\\\\xdfb\\\\xdaQ\\\\x08s\\\\x14x\\\\x0e(\\\\xb2P\\\\x07\\\\xfd\\\\xa8\\\\xaa}\\\\x92\\\"\\\\xff\\\\x00(\\\\x1d\\\\x90NI\\\\xb3\\\\xc7W\\\\xe1l\\\\x81\\\\xefX\\\\xa7\\\\xf4\\\\x1c\\\\xb4\\\\x98\\\\xa7N[\\\\'qt\\\\x8b\\\\xcbL/h\\\\xed\\\\xef\\\\x90#\\\\xcaYm\\\\x84\\\\xa9i\\\\xfa\\\\xab\\\\x05d-=\\\\xca\\\\x19p \\\\xe7N\\\\xef\\\\xb1\\\\x9cy\\\\xf0\\\\xd7\\\\xa3\\\\xa7\\\\x8c)\\\\x8ci\\\\xdb\\\\xd6\\\\xb0\\\\x1cIhYp\\\\x84\\\\xa9\\\\xd6\\\\x92\\\\xa8Ph\\\\xe7\\\\x99\\\\xd1M\\\\xab\\\\xd0EZ\\\\xbeV\\\\xf8\\\\xd2j\\\\xff\\\\x00)\\\\x0bO\\\\xe2\\\\xf6V\\\\xf4\\\\xfd\\\\xfb\\\\xc6\\\\xd3\\\\xee\\\\x06\\\\xad2\\\\x80\\\\xe7\\\\xe5\\\\x1e\\\\x86M\\\\xc3\\\\xc3d\\\\x96\\\\xa0\\\\xa5\\\\x05A\\\\xc4@ @\\\\x1fS\\\\xba\\\\xadP}\\\\xd7\\\\xe5 \\\\xdb\\\\xd6hs\\\\r\\\\xd9gU\\\\xbc!^Uz\\\\x13\\\\x07\\\\xbbq&F]\\\\xd4\\\\xea\\\\xde\\\\x17>U\\\\xee\\\\xdf\\\\xf4\\\\x98\\\\xee\\\\xd9\\\\xe2\\\\x16WWX3V\\\\x8a\\\\xb4il\\\\xa5-\\\\xdd)aAJ\\\\x06L\\\\xa4F\\\\x94Ln\\\\x9a\\\\xee@\\\\xd9=\\\\xb9\\\\xba\\\\xd9\\\\xac~\\\\xdf\\\\x16\\\\xb0\\\\xb0ao\\\\xb2\\\\x16\\\\x02\\\\x1eu[\\\\xaa\\\\n\\\\x10A\\\\x8fA\\\\x9e\\\\xea\\\\xe9\\\\x8c\\\\xedc+\\\\xbf\\\\r\\\\xd2\\\\xba^\\\\xc7\\\\x1e\\\\xc6\\\\x86)\\\\x88a\\\\xd8f%t\\\\x83,\\\\x0b\\\\xb0\\\\xe1n\\\\xdb\\\\xf6m\\\\x85\\\\x00<s<\\\\xc9\\\\xae\\\\x93;\\\\xe2p\\\\xe5\\\\xf2\\\\xf9\\\\xdf\\\\xabr\\\\xe7\\\\xe5\\\\t\\\\xb5\\\\xae&\\\\x0e\\\\x1d\\\\xb3\\\\xe9H \\\\xfe\\\\x85\\\\xd3\\\\xa6\\\\x7f\\\\xcaVw\\\\xa3e\\\\xf1\\\\xb4Wzu\\\\xdb\\\\x17H\\\\x05\\\\xac\\\\x11 d\\\\x94\\\\xf9\\\\x1a\\\\x88O\\\\xadt\\\\xd11\\\\xbe\\\\xe9\\\\xb8wO\\\\x1b\\\\\\\\\\\\xdb\\\\x8b\\\\x0f\\\\xda`o6\\\\xa4\\\\xe4\\\\x84\\\\xdb\\\\xb8\\\\xdc\\\\x18\\\\xd6B\\\\xcc\\\\xd1x:\\\\xbe\\\\xee\\\\x85\\\\xe8\\\\xdbh\\\\x97\\\\xb5\\\\x9b\\\\x19\\\\x87\\\\xe3N\\\\xda\\\"\\\\xcd\\\\xcb\\\\x9e\\\\xb0)\\\\x948\\\\\\\\\\\\x00\\\\xa1\\\\xc5 \\\\x90\\\\xa2\\\\x01\\\\xcfvt\\\\xcah\\\\xb3G\\\\x1f\\\\xab\\\\xd3P\\\\xd3*L\\\\xa90\\\\x9a6\\\\x89\\\\xa8\\\\xd7.\\\\xea<\\\\xa2\\\\x80\\\\x06\\\\x94\\\\xc9\\\"fT\\\\xa7\\\\xcf\\\\xbb\\\\xcb\\\\x83\\\\xe5\\\\xad\\\\xe7\\\\xfch\\\\xf7\\\\xd7\\\\xeb3\\\\xfd\\\\xec\\\\xfb\\\\xbf7\\\\xd3\\\\xe7\\\\xa7\\\\xfa:W\\\\xa0\\\\xfd\\\\xa7\\\\xc3lv\\\\x1d\\\\xd6\\\\xef\\\\xd7sn\\\\x19\\\\xbcv\\\\\\\\]\\\\xa3\\\\xbd\\\\\\\\\\\\x18>xIO\\\\xb6\\\\xbe\\\\x1f\\\\xe3\\\\xb6_\\\\x8b\\\\xdf\\\\xd2>\\\\xdf\\\\xe1\\\\x18\\\\xdf\\\\xf4\\\\xd3\\\\xf5Y\\\\x03j\\\\xf0\\\\x00\\\\x90\\\\xa5cV\\\\x08\\\\x04ov\\\\xdd\\\\t1\\\\xe9\\\\xaf\\\\x8f\\\\xb8\\\\xfa]\\\\xb9{%\\\\xb1\\\\x8d\\\\xe17\\\\x04\\\\x0b|W\\\\x0ft\\\\xeb\\\\x08\\\\xb9A>\\\\xfaw=\\\\xc5\\\\x96y\\\\x89b\\\\xee\\\\xd8\\\\xe9snr\\\\x9f\\\\xd2\\\\xa7\\\\xf1\\\\xa9\\\\x9d\\\\x9e.X$\\\\x80\\\\xfb$\\\\x8e\\\\x1db\\\\x7f\\\\x1aF\\\\xdc\\\\xf3\\\\xf9U]0\\\\xed\\\\xe6\\\\xc9\\\\x9bw\\\\x99t\\\\x86\\\\xef\\\\x12\\\\xae\\\\xadaDJ\\\\x99\\\\xe5\\\\xe0}T\\\\xce|%$\\\\x86\\\\xd6\\\\xfb\\\\x8d\\\\xb6\\\\xd8\\\\x97\\\\x1cRP\\\\x90H\\\\x02I\\\\x00\\\\t9\\\\x0c\\\\xcf\\\\x1a\\\\xd0\\\\xafI\\\\xfc\\\\x1fmO^\\\\x86N\\\\x0eR\\\\xea\\\\xde6\\\\xe1&\\\\xe5\\\\x9c\\\\x9c\\\\xfa\\\\xa7\\\\xb7\\\\x91\\\\x91\\\\x1d\\\\xe4\\\\x81\\\\xa9\\\\x15\\\\xae\\\\xd4\\\\xd1b\\\\xb8M\\\\xf6\\\\x13\\\\xe4j\\\\xc4\\\\x18\\\\x0c\\\\x1b\\\\xc6<\\\\xa1\\\\x94\\\\xef\\\\x82\\\\xa2\\\\x89\\\\x89RFi3\\\\xc0\\\\xd5f\\\\x85k\\\\x94 \\\\x8c\\\\xaa\\\\x9f@h0u\\\\xce\\\\xafD\\\\x05\\\\xef\\\\xea\\\\xae\\\\xea\\\\t\\\\x13F\\\\xb8Z&\\\\x19\\\\x9d\\\\x80\\\\x93\\\\xfe9\\\\x9a\\\\xbdH\\\\xaa\\\\xc8\\\\x9a\\\\xd4\\\\xac\\\\xd2\\\\x03\\\\x07X\\\\xf4\\\\xd3\\\\xbfP\\\\xdaY`X\\\\x9d\\\\xf5\\\\x8f\\\\x96\\\\xd9\\\\xda)\\\\xfb}\\\\xe5#y\\\\x0b\\\\x13)\\\\xf3\\\\xbb:\\\\xe5#\\\\x86S4\\\\xa4\\\\x91\\\\xb2x\\\\xf4\\\\xad?\\\\x9b^\\\\x1b\\\\x84\\\\x85I\\\\x19F\\\\xbcyI\\\\xf0\\\\x93L\\\\x95\\\\x01w\\\\x82b\\\\x16Xsw\\\\xd7-\\\\xb6\\\\xdb\\\\x0e\\\\x90\\\\x11.\\\\r\\\\xe5f\\\\x06C\\\\x8cH\\\\x06&3\\\\x98\\\\x83\\\\x15\\\\x9a\\\\x08\\\\xac\\\\x18X\\\\xd4e\\\\xf0\\\\xa2\\\\xad;\\\\x0f\\\\xa0\\\\x01\\\\x1d\\\\x12\\\\xe0]\\\\xe6\\\\xe0\\\\xff\\\\x00\\\\xf5\\\\x0eQ\\\\x90\\\\xc5aVv\\\\xd3*\\\\xe52\\\\x94\\\\xca\\\\x93\\\\x08\\\\x04A\\\\x19T\\\\x8dPN\\\\xe1\\\\x07$\\\\xc7\\\\x03\\\\x11F\\\\xbd\\\\x11\\\\x81\\\\xd4Gd\\\\xa9@e!%^\\\\xda\\\\x93\\\\x84\\\\xb6\\\\xf5\\\\xeb5\\\\xe3A\\\\x16XN\\\\x1f\\\\x87\\\\xbbn\\\\xb2\\\\x97\\\\xd5\\\\x87\\\\\\\\\\\\xad\\\\xe6.\\\\x15!A\\\\xc6\\\\xe7\\\\xcdLp\\\\x19g_\\\\xa2\\\\xe9L\\\\xe7\\\\xe6\\\\xcb+y\\\\xdf3V}\\\\xfe\\\\xaf\\\\x91\\\\xd7\\\\xb8\\\\\\\\\\\\xac\\\\xc6I\\\\xf6\\\\xf1V\\\\xa7D[Jl\\\\xb0\\\\xbb\\\\x8b[}\\\\xad\\\\xd9\\\\xec=\\\\xc7nT\\\\xe2mqf\\\\x16\\\\xda\\\\x8c\\\\x84\\\\xc1J\\\\xc3\\\\x89\\\\n\\\\x071\\\\x1c\\\\x08\\\\xef\\\\xaf\\\\x9d\\\\xf8\\\\xceS\\\\xa9\\\\xd7\\\\x99\\\\xcb\\\\xc6\\\\xbf\\\\xbb\\\\xdd\\\\xf8T\\\\x9d>\\\\x8ff^v\\\\xb7\\\\xec\\\\xd8\\\\xda\\\\xfb\\\\x9br\\\\xed\\\\xbe1\\\\xb37\\\\xcd\\\\xaaJ\\\\x1cn\\\\xd9\\\\xd03\\\\xd3\\\\xcdq@\\\\xc7\\\\xa2k\\\\xe4M\\\\xdf\\\\x0f\\\\xa5\\\\xdd\\\\x8f\\\\xd4\\\\x978V\\\\xd4\\\\x10\\\\x15p\\\\xe6\\\\xcc]\\\\x1e-\\\\xbbb\\\\xf2\\\\'\\\\xf9\\\\xdb\\\\xca\\\\x8fQ\\\\xab\\\\xeefS\\\\xd3\\\\x7f\\\\xe7\\\\xea\\\\x8e\\\\xce\\\\x07\\\\x8d\\\\x8d\\\\xe0vkc\\\\xd0\\\\x93\\\\xa1\\\\x0f,\\\\x8fH\\\\xea*\\\\xd1\\\\xef\\\\xfa\\\\x8e0LSwu[9\\\\xb2\\\\x9b\\\\xdb\\\\xa4\\\\x05%\\\\xd5@<$\\\\x16f<\\\\rZ\\\\x1d\\\\xff\\\\x00Z\\\\xa5\\\\x7f(\\\\xec>\\\\xfa\\\\xc0\\\\xec\\\\xaf\\\\x97\\\\xdb`\\\\xf6\\\\xfb\\\\xc2\\\\xe9-\\\\xa7\\\\riH\\\\x02\\\\x0bD\\\\x85\\\\x13\\\\xaf\\\\x0808\\\\xd6\\\\xf1\\\\x9c9\\\\xe5w\\\\xea\\\\xa9\\\\xa1$\\\\r\\\\xf6\\\\xfa\\\\xd6\\\\xc1IR$\\\\xa4,e\\\"Fbt\\\\x91L\\\\x9e\\\\xcc\\\\xed\\\\xee\\\\xdf\\\\xe9\\\\x1d\\\\xb4\\\\xa9j\\\\xb7\\\\xd9\\\\x9bf\\\\x9bw\\\\x12V(\\\\xb4\\\\xaf\\\\x10qD:H2\\\\x08H\\\\x82\\\\nRG\\\\x0e\\\\x10k{\\\\xe1\\\\x9e^Ci\\\\xf6\\\\x82\\\\xe7in\\\\xac\\\\xee\\\\xb1&ZM\\\\xfb,y;\\\\xaf\\\\xb6\\\\xa5|\\\\xb8\\\\n*IRNI)\\\\xdeP\\\\xcbY\\\\xa2\\\\xf3\\\\xca\\\\x9cV\\\\xa0\\\\t\\\\x04\\\\xc11\\\\x993Qf\\\\xe8\\\\xde15O\\\\x02\\\\xa3\\\\xdf\\\\x00-\\\\x1d\\\\x19\\\\x0e\\\\xce\\\\xa6\\\\xa8\\\\xbdM\\\\xc3\\\\xa3\\\\xc8\\\\x06\\\\\\\\t\\\\xf4\\\\x9a\\\\xa4\\\\xe5T\\\\x92\\\\x01\\\\x1a\\\\n\\\\xa0\\\\xacJ7\\\\xd6\\\\x12\\\\x00\\\\x04\\\\xe94\\\\xfah\\\\x0e\\\\xce%\\\\x7fol\\\\x96mon\\\\x19`,\\\\xb8\\\\x946\\\\xad\\\\xd0\\\\x95\\\\xeb\\\\xbc9\\\\x1e\\\\xf1\\\\x9f\\\\xac\\\\xd6\\\\xa5\\\\x16\\\\x11x\\\\x96&TC\\\\x98\\\\x8d\\\\xf4\\\\xa4\\\\x00\\\\x12\\\\xa7\\\\xd5\\\\x90\\\\xf0\\\\xf0\\\\'\\\\xd6y\\\\xd5r\\\\xa3\\\\xb6\\\\x06]}\\\\xd4\\\\xa1\\\\x0f>\\\\xe3\\\\xa8A*B\\\\\\\\Y (\\\\x80\\\\t\\\\x13\\\\xc4\\\\x80$\\\\xf1\\\\x815n\\\\xeb\\\\x93\\\\'\\\\xb2M\\\\x99\\\\x1dz\\\\'p\\\\x8c\\\\xe7|H\\\\xd0\\\\xd1\\\\x92u\\\\xef\\\\xe4\\\\xf5?\\\\xc1\\\\x16\\\\x06L\\\\x99U\\\\xce\\\\xa7O\\\\x9c9\\\\\\\\\\\\xb2\\\\xca\\\\xdadX\\\\xf9M[\\\\x90\\\\x96kR\\\\xca\\\\x19ZF\\\\x95A\\\\x88$\\\\xf7\\\\n6\\\\x88w\\\\xd5\\\\xc9\\\\x03\\\\xd6jD\\\\xeaRL\\\\xaeV~\\\\xd6ts|\\\\xa1)N!\\\\xdb|>\\\\xcd\\\\x18\\\\xea\\\\xae,q\\\\x8c7\\\\x10\\\\x17\\\\x0e\\\\x12\\\\xe0\\\\xc3Y-6\\\\xca\\\\xd3\\\\xba\\\\x0f`\\\\xc8\\\\xedL\\\\xf6L\\\\x135\\\\xfa_\\\\x86\\\\x99e;r\\\\xc7,u\\\\xefw_\\\\x13\\\\xe2\\\\xee8e\\\\xb9\\\\x94\\\\xbb\\\\xf6\\\\x9al\\\\xb0-\\\\x9e^#l\\\\xf1B\\\\xedT\\\\x12\\\\xb0\\\\x92\\\\x87\\\\xd9$\\\\x1c\\\\xb9\\\\xa4\\\\xfc+\\\\xc5\\\\xf1\\\\xdb\\\\xc3)+\\\\xd9\\\\xf0z\\\\xcf\\\\x1bS\\\\x9b\\\\xd8\\\\xa7\\\\xedV\\\\x1d\\\\xb4\\\\xb1a\\\\xa7\\\\x01\\\\xfd%\\\\x8d\\\\xe2\\\\x99W\\\\xb9>\\\\xfa\\\\xf9\\\\xb7\\\\xb7/\\\\xda\\\\x8fl\\\\x96x\\\\xad\\\\xcd\\\\xa5\\\\xf6\\\\xd9a[\\\\xa6\\\\xd7\\\\x1a\\\\xdavBt\\\\x0e\\\\x91x\\\\x8f\\\\xe9o\\\\xd6n\\\\x18}\\\\x8d\\\\xb9F\\\\xe2\\\\xcb\\\\xa4\\\\xdd\\\\xb0\\\\xb3\\\\xec\\\\xbf}\\\\x82^\\\\x9eW\\\\xd6\\\\x8a\\\\xb6Y\\\\xf4\\\\x82\\\\x91\\\\xec\\\\xac\\\\xde\\\\x94\\\\xf3)\\\\x99\\\\xdfX\\\\xf4\\\\x96=-\\\\xe2\\\\xa1)\\\\xf2\\\\xed\\\\x93\\\\xeb\\\\xd3\\\\xc5\\\\xcc6\\\\xfd.\\\\xcf\\\\x82T\\\\x07\\\\xbe\\\\xb3\\\\xf2\\\\xabS\\\\xa8\\\\xac\\\\xff\\\\x00(=\\\\xb3\\\\xc3\\\\xf6\\\\xb9\\\\x1b<,\\\\xad1\\\\x0bW\\\\xac\\\\x97p\\\\x1dn\\\\xf1\\\\x90\\\\x827\\\\x83q\\\\x04\\\\x12\\\\x0ei:\\\\x1a\\\\xb5g\\\\x14\\\\xcb\\\\xbeU\\\\x8bF\\\\x14s\\\\x00\\\\xc0\\\\xe3\\\\xddA\\\\xa6\\\\\\\\\\\\x99Bt\\\\xd7\\\\xe1P\\\\x9bFN\\\\x7f\\\\xbe\\\\xb5\\\\x0b\\\\x0e\\\\x1ec\\\\x90\\\\x07\\\\x9b\\\\x9e}\\\\xe2\\\\xb5\\\\xa4\\\\xc0\\\\xa2\\\\x14\\\\x0c\\\\xe63\\\\xca\\\\x8f\\\\xb2\\\\xda=\\\\xe9\\\\xf9\\\\xb3\\\\xc7\\\\xba{\\\\xea\\\\xf06\\\\x16\\\\x1b\\\\x95\\\\x80\\\"G\\\\xa7\\\\xbc\\\\xd3\\\\xaeRP\\\\xd33F\\\\x88\\\\xd6\\\\xa3z\\\\xe1\\\\xb4\\\\xf9\\\\xb3>\\\\xe3PG\\\\x12R4\\\\xd2\\\\x98\\\\x8c\\\\x02N~\\\\x1c\\\\xe9\\\\xd8\\\\x19#3\\\\xcf_\\\\n\\\\x97\\\\x84\\\\x86\\\\x0f\\\\xca\\\\'\\\\xb2\\\\x14 \\\\xe5=\\\\xc6\\\\xb3\\\\x92\\\\x8e\\\\xc2\\\\xfc\\\\x9f\\\\x04tC\\\\x80\\\\x7f\\\\xe2?\\\\xfb\\\\x87+2%\\\\x82\\\\xa7\\\\x90\\\\x0c\\\\x03\\\\xbc\\\\xaeI\\\\xcc\\\\xd5u<\\\\xa2\\\\x02\\\\xe2\\\\xa2\\\\x12\\\\x10;\\\\xf34\\\\xcb\\\\xec\\\\x85\\\\xad&T\\\\x99F\\\\xbdS)L\\\\xa98?\\\\x13\\\\xc5\\\\xae\\\\xf1Lq\\\\xcb\\\\xdcQ\\\\xd2\\\\xfd\\\\xd2\\\\xd4\\\\x90\\\\xb7\\\\x14\\\\x84\\\\xa4\\\\xa8$\\\\x00&\\\\x00\\\\xce\\\\x00\\\\x13\\\\xdd_\\\\xb1\\\\xc3\\\\xa5\\\\x87G\\\\xfd\\\\xbc&\\\\xa4~W\\\\xab\\\\xd6\\\\xcf\\\\xad~fwuqtW\\\\xd4^X_\\\\x9e\\\\xad$\\\\x07\\\\x91\\\\xa8\\\\xe6\\\\x93_\\\\x07\\\\xf1m\\\\xcc\\\\xf1\\\\xfbW\\\\xdd\\\\xfc*\\\\xcc\\\\xbaw\\\\xee\\\\xb0\\\\x13\\\\x86Z,f\\\\xcaG\\\\x81\\\\x8a\\\\xf9\\\\x1d\\\\xf9>\\\\xa7la\\\\xc1-\\\\x8f\\\\x9a\\\\\\\\O\\\\xa6j\\\\xf9\\\\x94|\\\\xb8C\\\\x82\\\\x0c\\\\xc7]\\\\xbc\\\\x9eKL\\\\x8a~`\\\\xec@\\\\xb9\\\\xd9\\\\x1b\\\\x17\\\\x8e\\\\xf3\\\\x96\\\\x16.+\\\\xeb\\\\x06\\\\xc2\\\\x15\\\\xeb\\\\x10i\\\\x9dH;\\\\x15\\\\x0fO\\\\x18;xM\\\\xb6\\\\x03\\\\xd4\\\\xb2[K\\\\x8e\\\\xdc\\\\'5\\\\x95\\\\xceM\\\\x9dI&\\\\x99\\\\x97p\\\\xed\\\\xedV\\\\xa4KY\\\\xfdQ\\\\xee\\\\xa2\\\\xa2(|\\\\x92\\\\x0e\\\\x99\\\\x11>\\\\x9a\\\\xa2\\\\xd8;\\\\xba\\\\x91\\\\xa51V(\\\\x94\\\\x85\\\\x00\\\\x99\\\\xde\\\\x11\\\\xe8\\\\x91\\\\xf8S#6\\\\xfb\\\\x1bT@^\\\\x8f\\\\x9a\\\\xbd\\\\xf7t\\\\xa9\\\\x19\\\\x86\\\\xfe\\\\xa24\\\\x9f\\\\xf15z\\\\xa4\\\\xc0\\\\x04(\\\\xce`\\\\xe5V\\\\xb9Ea\\\\xe5\\\\xb1p\\\\x97Z0\\\\xb4\\\\xcc\\\\x12\\\\'PA\\\\xcb\\\\xc0\\\\x9a|\\\\x08\\\\x12S\\\\xbb\\\\x00\\\\r\\\\x07\\\\xc2\\\\x83\\\\xc9\\\\x02x\\\\x91\\\\x950\\\\n\\\\x84\\\\xe4\\\\xa3\\\\x04\\\\xf7\\\\xf0\\\\x15#\\\\xd0~U2s\\\\x8a\\\\xce^\\\\x04v\\\\x1f@\\\\r\\\\x85tC\\\\xb3\\\\xfb\\\\xe5DC\\\\xe6\\\\t\\\\xcb\\\\xf4\\\\xee{+;\\\\xbe\\\\xa6E\\\\x8a\\\\x00H\\\\x84\\\\x80\\\\x07 (\\\\xb9DQV$\\\\xb5\\\\xd02\\\\xa4\\\\xca\\\\x93*L\\\\xa98sl\\\\xd5b\\\\x8ce\\\\xa6,0\\\\xec2\\\\xd1\\\\xc6\\\\xc6\\\\xfb\\\\x8faw\\\\xab\\\\xb8a\\\\xf0\\\\xa0\\\\nc\\\\x7f\\\\xcd)\\\\x82\\\\r~\\\\xa7\\\\xe1\\\\xaewyg\\\\x95\\\\xbf\\\\xfd\\\\xa6\\\\xac|\\\\x0f\\\\x8d\\\\xf9sX\\\\xe1\\\\'\\\\xde]\\\\xc5\\\\x95\\\\xd0\\\\xc2\\\\xfee\\\\x89\\\\x8f\\\\xf5\\\\x8d\\\\x1fa\\\\xaf\\\\x95\\\\xf8\\\\xc7\\\\xeda\\\\xfa\\\\xbe\\\\x87\\\\xe1\\\\x1f\\\\xb1\\\\x97\\\\xde-fU\\\\xd9\\\\xaf\\\\x89_a%\\\\x06\\\\x84$\\\\xf2\\\\xa92jJG\\\\xf2\\\\x99\\\\xcf\\\\x0e\\\\xd9\\\\xd3\\\\xca\\\\xe6\\\\xe0z\\\\xd0\\\\x8a\\\\xdfO\\\\x9bX\\\\xcf\\\\xc2\\\\x9d\\\\x07\\\\xe4\\\\xa7\\\\xec\\\\x03\\\\xec\\\\xae\\\\x8c\\\\x15S\\\\xb8\\\\x89\\\\x8d\\\\x08\\\\xf6\\\\xd1F\\\\xbdC\\\\x90s\\\\xa6xF\\\\xac\\\\x88\\\\x9fm1\\\\x1b\\\\xbc8g\\\\xdf\\\\x15\\\\r\\\\x03|A\\\\xb5|p\\\\xdd\\\\xaa\\\\x1b\\\\xc08Q\\\\xf9\\\\x88\\\\x93\\\\xe9\\\\xf4\\\\x9a\\\\xb5\\\\xc8L$\\\\x1f\\\\xa4\\\\x07q\\\\x11N\\\\xc1\\\\xa0\\\\x82L\\\\x1a\\\\x0c\\\\xe5\\\\x92\\\\x01#xT\\\\x18#x\\\\x89\\\\x14\\\\xfap\\\\x8e\\\\x19$\\\\x92\\\"Fb\\\\xa4;\\\\xec-\\\\x87\\\\x99.\\\\xa4\\\\x80\\\\xb4\\\\x92\\\\x0f1&\\\\xb3\\\\x971Ga\\\\xfeO\\\\xd9t?\\\\xb3\\\\x9d\\\\xed\\\\xba\\\\x7f\\\\xae]g\\\\xd1,*\\\\xceE\\\\x94\\\\xc4Z\\\\xe8\\\\x19ReI\\\\x07\\\\x15\\\\xc60\\\\xdc%\\\\xb0\\\\xe6)\\\\x7fkf\\\\x92$\\\\x17\\\\xddJ\\\\'\\\\xc2Nt\\\\\\\\\\\\xa4\\\\xf2\\\\x9e:\\\\xf3\\\\xa5\\\\xad\\\\x94\\\\xb7|\\\\xb6\\\\x8b\\\\xab\\\\xbb\\\\x80>\\\\x9b6\\\\x8e)>\\\\xb8\\\\xce\\\\xb9\\\\xde\\\\xac\\\\xf4=\\\\xb7\\\\xd9\\\\xc8\\\\xb8\\\\xe5\\\\xa5\\\\xa5\\\\x8e&Sa\\\\x88\\\\xb1\\\\x88\\\\xb0R\\\\x97\\\\x03\\\\xcd4\\\\xb6\\\\xc4\\\\x9dR\\\\xa4\\\\xa8H\\\"<3\\\\x19\\\\xd7\\\\xedfy\\\\xe7\\\\xbc\\\\xb3\\\\xc7\\\\xb6\\\\xfbq\\\\x7f\\\\xa3\\\\xf2\\\\xfd\\\\\\\\1\\\\xc3S\\\\x0c\\\\xbb\\\\xa2\\\\xd0\\\\xe8n\\\\xec%\\\\x8cH\\\\x1c\\\\xf3h\\\\xe5\\\\xfc\\\\xea\\\\xf8_\\\\x8b\\\\xe5\\\\xce?\\\\xab\\\\xec\\\\xfe\\\\x13?&_\\\\xa2\\\\xd8b\\\\xf1\\\\xb8\\\\xceG\\\\xa2\\\\xbe%\\\\xaf\\\\xb1\\\\xa4\\\\xd6\\\\xee\\\\x9a\\\\xfa\\\\xfe\\\\xb1F\\\\xe2\\\\xd0\\\\xa2\\\\xe1\\\\xb3\\\\xa3\\\\x89\\\\xf5\\\\xd1\\\\xb5\\\\xa3\\\\xc3\\\\x80\\\\x8c\\\\x88\\\\xa9)o\\\\xcaUC\\\\xf3^\\\\x05\\\\x074\\\\xdd\\\\xbd\\\\xedi?\\\\x85t\\\\xe9y\\\\xacg\\\\xe1O\\\\xa7\\\\xf4#3\\\\xe6\\\\n\\\\xeb\\\\\\\\\\\\x8a\\\\xeehL\\\\xf0\\\\n\\\\xd0w\\\\xd0\\\\x80\\\\xd3:\\\\x91\\\\xed\\\\x8f\\\\x93\\\\xb8\\\\x98\\\\xcd\\\\x95\\\\x0fh\\\\xado\\\\xd1PG\\\\x9c4\\\\x89\\\\x1a\\\\xe9T\\\\x00^\\\\x90m\\\\xdf \\\\x00\\\\nL\\\\x019T\\\\xa8x^v\\\\x00\\\\xfe\\\\xfeq\\\\xaa\\\\xf9\\\\xd2\\\\xd2VCBj\\\\x88k@K\\\\xca\\\\x00I\\\\r8c\\\\xc1\\\\x06\\\\xaa\\\\x11\\\\xa6D\\\\xe7\\\\x15I\\\\xa4S\\\\xdbp\\\\x90\\\\x06f`\\\\x0c\\\\x85i\\\\t\\\\xac\\\\x83\\\\xca$\\\\xd5RM\\\\xed\\\\xd2\\\\xae\\\\x1e\\\\xb7\\\\x067[n\\\\x04\\\\x08<{\\\\xeb\\\\x17\\\\xc2\\\\x8e\\\\xc2\\\\xe8\\\\x07\\\\xff\\\\x00c\\\\xfb5?\\\\xc8\\\\xac\\\\xff\\\\x00Z\\\\xba\\\\xc7\\\\x84\\\\xb0\\\\rf\\\\xd2QN>Qk\\\\xa8x\\\\xbd\\\\xa1\\\\xc7\\\\xf6\\\\x9d8\\\\xbd\\\\xce\\\\x1d\\\\xb3\\\\xbb<\\\\x97\\\\xc3;\\\\xb1yt\\\\xe1KK\\\\x94\\\\x82`e11\\\\xe7j+\\\\x9eYe\\\\xbdc\\\\x0e\\\\x9a\\\\xa5\\\\xec\\\\xce\\\\xdcc_\\\\xf3\\\\xc6\\\\xd37\\\\x87\\\\xb2uf\\\\xc1\\\\x04\\\\x11\\\\xdd#t\\\\xff\\\\x00H\\\\xd6{s\\\\xbei\\\\xfc\\\\xb13\\\\x0c\\\\xe8\\\\xabg-\\\\x1c\\\\xebn\\\\xda\\\\x7f\\\\x10|\\\\xf9\\\\xcb\\\\xb8sS\\\\xcf\\\\xb3\\\\x13\\\\xe9&\\\\x99\\\\xd3\\\\x91w\\\\xfb=e\\\\xae\\\\x07\\\\x85Z2\\\\x1a\\\\xb6\\\\xc3l\\\\x9alh\\\\x94\\\\xb2\\\\x90=\\\\xd5\\\\xbe\\\\xdcF\\\\xeb\\\\x81\\\\xae\\\\x14z\\\\xc5g\\\\xc0W\\\\xee:\\\\x9ek\\\\xf2xN\\\"\\\\xca\\\\xe8y\\\\xde\\\\xce$2\\\\xf3Z\\\\xf7\\\\xaa\\\\xbf5\\\\xf8\\\\xb7\\\\xf0\\\\xfe\\\\xaf\\\\xbf\\\\xf8W\\\\x8c\\\\xff\\\\x00E\\\\xae\\\\xca\\\\xfb5\\\\xf0\\\\xeb\\\\xec%!yP\\\\x8e.\\\\xc0\\\\xce\\\\xa4\\\\x11~|\\\\xdd9\\\\xd5\\\\xa1\\\\xb5q\\\\xf9A\\\\xf6\\\\xb6Gg\\\\x95\\\\x00\\\\x91~\\\\xf0\\\\x93\\\\xfb\\\\x1f\\\\xf0\\\\xae\\\\xfd\\\\'.\\\\xa2\\\\xa1\\\\x13\\\\xe4\\\\xe3\\\\xf6\\\\x7f\\\\x8dt\\\\xbe\\\\\\\\\\\\xb6z\\\\xff\\\\x00F\\\\x93\\\\x91\\\\x04\\\\x1c\\\\xbd4R\\\\x00\\\\x10I\\\\xec\\\\x98\\\\xa6\\\\xa8rT\\\\x12\\\\x1c\\\\x04\\\\x03\\\\xbc\\\\x82\\\\x91\\\\xe9\\\\x8c\\\\xfd\\\\x95\\\\xa8\\\\xb6\\\\x10\\\\x1d\\\\xa8\\\\xe7\\\\x9d\\\\x1a\\\\x08\\\\xf7s\\\\xe4\\\\xcfr\\\\xdc&\\\\xa0f\\\\x17\\\\x9d\\\\x86|?\\\\xfc\\\\xa8\\\\x97\\\\x92\\\\x98\\\\x11!Fr\\\\xe5J\\\\x16\\\\xc6\\\\xe16\\\\xcf\\\\xba\\\\xb5\\\\xa0\\\\xaf}\\\\x97\\\\x99\\\\x80b\\\\n\\\\xd0\\\\xa4\\\\x83\\\\xe8\\\\x99\\\\x8ag\\\\x02\\\\xf2\\\\x8c\\\\x91\\\\xe1<*U\\\\xec6/e\\\\xd9\\\\xc4\\\\x1aF%\\\\x88-\\\\x0fZ%@\\\\x8bf\\\\xc9%`(\\\\x02\\\\x16\\\\xa1\\\\x90\\\\xce%\\\\x19+uAC(\\\\x9dI\\\\xc6\\\\xd9k6\\\\x93\\\\n\\\\xb7\\\\xc2T\\\\xcfR\\\\xeb\\\\x85o-G\\\\xa9p\\\\xa4\\\\xa9\\\\x08\\\\xc8\\\\xa6cX\\\\xccO\\\\x1c\\\\xa8\\\\xca\\\\x1d\\\\xb4\\\\x87\\\\xf4\\\\xed\\\\xf2\\\"+\\\\x19\\\\x17g\\\\xf4\\\\x07\\\\x97C\\\\xfb1\\\\xff\\\\x00\\\\xc3\\\\xa8\\\\xff\\\\x00X\\\\xaa\\\\xe7L{\\\\xd5\\\\x1d+4\\\\x90\\\\x1c\\\\xc5X\\\\xf9TJ\\\\xee\\\\xc9\\\\x8a9\\\\xd7\\\\x1c\\\\xad\\\\xd9\\\\x91\\\\x93F\\\\xcb&\\\\x84I\\\\xa98\\\\'h\\\\xf0\\\\xb4\\\\xe1N0Q\\\\x8aa\\\\x98\\\\x88}*!V\\\\x0f\\\\x17\\\\x02\\\"<\\\\xe9\\\\x00\\\\x89\\\\x04\\\\x11\\\\xe9\\\\xaf\\\\xdbc\\\\xd6\\\\xbd[w\\\\x8d\\\\xc7^\\\\xef\\\\xceu~\\\\x1b\\\\xe4\\\\xc9\\\\xac\\\\xa5\\\\xfb=\\\\x87D\\\\x0e\\\\x8d\\\\xfc@\\\\x03\\\\xf4\\\\x1a\\\\xf4fk\\\\xe1\\\\xfe-\\\\xe3\\\\x1b\\\\xf7}o\\\\xc2\\\\xfce\\\\xfa-\\\\x86\\\\x17\\\\xd9\\\\x15\\\\xf0\\\\xeb\\\\xeb\\\\xa4\\\\x97BFg\\\\xd1F\\\\x80E\\\\xc2\\\\xb3\\\\x99\\\\xabH\\\\xa9W}!\\\\xe0\\\\xfa|\\\\xedlN\\\\x08ybN{XUv\\\\xe9ys\\\\xcf\\\\x95B\\\\xd7\\\\xea\\\\xa9\\\\xd3\\\\xcc\\\\xae\\\\x96n\\\\xb9l\\\\xf5\\\\x90P\\\\x82 \\\\x0c\\\\xc5\\\\x1fB\\\\x10\\\\x8ec\\\\x97\\\\x85h\\\\x10\\\\xc6Z@:Q\\\\x03\\\\x0f\\\\x19#^\\\\x14\\\\xec\\\\xa3^~\\\\xaa\\\\xf0\\\\x9c\\\\xf7\\\\x0e\\\\x86\\\\x8f@\\\\x0e\\\\x14G\\\\x91\\\\t\\\\xe6{\\\\xf8\\\\xd5<\\\\x9bSTG1\\\\x02)d\\\\xc2F\\\\xb2\\\\x06Z\\\\xd4t\\\\xc3\\\\xcaG\\\\xf8U\\\\x15\\\\x11\\\\x9b\\\\x97\\\\xd8\\\\x1b\\\\xb6\\\\xf7/\\\\xb27\\\\xb7\\\\xe1\\\\xb7\\\\x14\\\\x91\\\\xbd\\\\x110\\\\x0e\\\\xb1\\\\x94\\\\xd38\\\\x06\\\\x01\\\\x91\\\\xd4\\\\xe455\\\\x9b}\\\\xd41G\\\\xe7(\\\\x03\\\\x95Y\\\\x18\\\\xed>\\\\x82\\\\x04tC\\\\xb2\\\\xdd\\\\xf6\\\\x80\\\\xfa\\\\xd4\\\\xaa\\\\xe3L{\\\\x97\\\\x0e\\\\x95\\\\x92D\\\\xf9\\\\xc2\\\\x9c|\\\\xaa5wd%\\\\x1e\\\\xd1\\\\xae\\\\x19yj\\\\x12hL\\\\x9a\\\\x8b&\\\\xa4\\\\xf9\\\\xf1|\\\\xbe\\\\xb2\\\\xe9\\\\xc7J\\\\x1bA\\\\\\\\\\\\xa8\\\\xa5\\\\xb4\\\\x84\\\\xa4\\\\x12x\\\\x01\\\\xa0\\\\xee\\\\xaf\\\\xdeg5\\\\xc4~Ver\\\\xe5\\\\xeez#XK\\\\xd8\\\\x97\\\\x00P\\\\xdc\\\\xe7\\\\xf6\\\\x8d~{\\\\xf1^f?\\\\xab\\\\xed~\\\\x17\\\\xfc\\\\x7f\\\\xa2\\\\xd5n\\\\xe3\\\\xb3\\\\t\\\\xcf\\\\xbe\\\\xbe\\\\x1e\\\\x9f_i\\\\x01\\\\xc2\\\\xa1\\\\x9c\\\\xd5\\\\xa1\\\\xe4\\\\xe0\\\\xaa\\\\x91\\\\xe9]Z[x\\\\x8e\\\\x9d\\\\xcc\\\\xec&\\\\x15\\\\xc61B=l.\\\\xba\\\\xf4\\\\xbc\\\\xb9\\\\xe6\\\\xa8X\\\\xfdU\\\\xa3\\\\x9eH\\\\xf8\\\\x9a\\\\xeb\\\\\\\\\\\\xd8\\\\x7fWG\\\\x11*\\\\xe1\\\\xe1Y[\\\\x0b y\\\\x98\\\\xa5\\\\rh\\\\xd7X^\\\\x1b\\\\xbb\\\\xdb\\\\xb6\\\\xee\\\\xb9\\\\x1c\\\\xb7S3\\\\xe8\\\\xadI\\\\xb1@\\\\x06U\\\\x9c\\\\xc5e\\\\x03\\\\x7f\\\\xbb\\\\xd4\\\\xdc\\\\x14$\\\\xee\\\\x94\\\\x92\\\\x013\\\\x97\\\\x8dR{\\\\x900\\\\x9f\\\\xd4\\\\x8c\\\\xf1\\\\x9f}\\\"&\\\\x1euJ\\\\x8f\\\\xb7IS\\\\xdb\\\\xa9\\\\x04\\\\x92\\\\x95e\\\\x1fd\\\\xd5\\\\xe5x\\\\x04f\\\\x90O\\\\x8c\\\\xd3\\\\x11\\\\xca!N(\\\\x84\\\\x94\\\\x83\\\\x9c\\\\x031G\\\\xa88f\\\\x14O\\\\x01\\\\xeb\\\\xd2\\\\xaaC\\\\\\\\\\\\xf5\\\\xed\\\\xf2\\\\x02\\\\xb3\\\\x92\\\\x8e\\\\xd5\\\\xe8,\\\\x11\\\\xd1\\\\x16\\\\xca\\\\x03\\\\x9f\\\\xccPg\\\\xd2k\\\\x9e\\\\xcc{\\\\x85\\\\x80b\\\\x8dE\\\\x18\\\\x13\\\\xda\\\\x14\\\\xc9\\\\xca\\\\xd8\\\\x95\\\\xd4<\\\\xbe+\\\\xb4\\\\x8b\\\\xb1z\\\\xe8~e\\\\xc4\\\\x9dC%P\\\\xeaWn\\\\x84;\\\\x02IF\\\\xf3\\\\x80\\\\x9eZL\\\\xd3\\\\x8f\\\\xc3\\\\xdc\\\\xef\\\\x19N~\\\\xff\\\\x00\\\\xda9\\\\xe5\\\\xd5\\\\xed\\\\xf4\\\\xfe\\\\x9f\\\\xde\\\\xb4\\\\xef\\\\xed\\\\xd2\\\\x80\\\\n\\\\xb5\\\\xc3\\\\xed^l\\\\x8c\\\\x96\\\\xac^\\\\xd9\\\\xb11$\\\\x19T\\\\x828\\\\x88\\\\xae\\\\xb3\\\\xe0\\\\xaf\\\\xf1[?K\\\\xff\\\\x00Nw\\\\xe2\\\\xa7\\\\xf0\\\\xeb\\\\xfecG\\\\x8bt\\\\xabs\\\\x87\\\\xdc\\\\xf98\\\\xc0m\\\\xeeVP\\\\x16\\\\x17m\\\\x89\\\\x07\\\\x91\\\\x99\\\"\\\\tCg0A\\\\x91\\\\xf8\\\\xd7l?\\\\r\\\\x99\\\\xce\\\\xee\\\\xfd}\\\\xe6\\\\xbf\\\\xads\\\\xcf\\\\xe32\\\\xc6\\\\xf6\\\\xccw\\\\xf6\\\\xbf\\\\xfak\\\\x8fK8\\\\xe2\\\\x8c\\\\xb7\\\\xb2\\\\xe9\\\\xdd:|\\\\xa3\\\\xc7\\\\xff\\\\x00N\\\\xb5\\\\xff\\\\x00\\\\x8e\\\\xe8\\\\xcf=i\\\\xfc\\\\xbf\\\\xfd\\\\x0f\\\\xf5}[\\\\xcc\\\\xe9\\\\xff\\\\x00_\\\\xfar\\\\xed\\\\xc2\\\\xd2{Pb4\\\\xe3_\\\\xa4\\\\xea\\\\xe7\\\\xfcO\\\\x89\\\\xd3\\\\xc6\\\\xf8z\\\\xde\\\\x8b\\\\x9c>S|\\\\x04\\\\xe6\\\\x84{\\\\xcd|\\\\x1f\\\\xc4\\\\xac\\\\xb8\\\\xe3_k\\\\xf0\\\\xde._\\\\xa2\\\\xd7\\\\xb5WdW\\\\xc5\\\\xaf\\\\xaf\\\\x13\\\\xd2k \\\\xe0\\\\xae\\\\xfa\\\\x88\\\\x89U\\\\t\\\\xe3:q\\\\xedt\\\\x7fbs\\\\x81\\\\x8a\\\\'N\\\\xf6\\\\\\\\\\\\xae\\\\x9d/.y\\\\xf8S\\\\xf6\\\\xe4y+\\\\x7fp\\\\xfb\\\\xcdv\\\\xaeg*z\\\\x84G\\\\xda\\\\x8c\\\\xfc(\\\\x1b\\\\n\\\\x0c\\\\x9c\\\\xc6Y\\\\xe7Q\\\\x1e\\\\xc9\\\\xf4\\\\xdb\\\\xad\\\\xf2\\\\xa4\\\\x92\\\\x1c\\\\xb6y\\\\x9c\\\\xb3\\\\xcdh \\\\x1f\\\\t\\\\xa6p\\\\xcdGH\\\\x93\\\\xfe\\\\x14l\\\\x81w\\\\xfa\\\\xbb\\\\xdfp\\\\xd3\\\\x108W\\\\xear\\\\'\\\\x8f\\\\x0f\\\\xb5Y\\\\x858\\\\xa0\\\\x90\\\\xb3\\\\xa0LH\\\\xadxd\\\\xe6\\\\x94\\\\x1a\\\\xb9\\\\xdeVP\\\\x142\\\\xef\\\\x04|j\\\\x9eHH\\\\x91\\\\x97\\\\x10>\\\\x14}\\\\xd5 :R\\\\xbe\\\\x82\\\\x04\\\\x90\\\\x85\\\\x92FYD\\\\xe7V\\\\xc4\\\\x01\\\\xcf\\\\xd6Q:\\\\xee\\\\xf1\\\\xac\\\\xe4\\\\xa3\\\\xb6\\\\xfa\\\\x11LtG\\\\xb2@\\\\xff\\\\x00\\\\xee\\\\xe6\\\\x8f\\\\xacMb\\\\xc2\\\\xf6k\\\\x19\\\\xd6\\\\x1a\\\\x84I;\\\\xc9\\\\xf1\\\\xa6yTc]\\\\x99s.\\\\xdbbW\\\\xc3l\\\\xb1\\\\xc6\\\\xd9+\\\\xea\\\\xd1z\\\\xe0HM\\\\xb2Ly\\\\xa2A\\\\xdd9\\\\xe5\\\\xad}\\\\xbe\\\\x87G\\\\xa1zx\\\\xdc\\\\xfc\\\\xeb\\\\xff\\\\x00\\\\x95\\\\xff\\\\x00\\\\xb7\\\\xc9\\\\xeb\\\\xf5:\\\\xd3\\\\xa9f\\\\x1e>\\\\xdf\\\\xfaj\\\\x11u\\\\x8d\\\\xba{\\\\x1f\\\\x9c\\\\xcf\\\\xec\\\\xd9P\\\\xf7&\\\\xba^\\\\x9f\\\\xc1O3\\\\x1f\\\\xf9\\\\x9f\\\\xde\\\\xb1\\\\xdd\\\\xf1w\\\\x99r\\\\xfeoG\\\\xb3\\\\xe9\\\\xc4Yi\\\\xe7q<?\\\\x11\\\\xc4E\\\\xc2!\\\\xa6V.\\\\xc1eI_\\\\x9cKc-\\\\xeeYH\\\\x8e\\\\x06\\\\xbc}|\\\\xfe\\\\x1a\\\\xe5\\\\xdb\\\\xd2\\\\x98\\\\xcdz\\\\xfeM]\\\\xcf\\\\xaf\\\\xb7\\\\xbb\\\\xd5\\\\xd1\\\\xe9|D\\\\x9d\\\\xddKn\\\\xfd?7\\\\x1a\\\\xfb7N\\\\xa2\\\\xdf\\\\xae_\\\\x93\\\\xecm\\\\xe2\\\\x99\\\\x90\\\\x10_j\\\\xedK\\\\x88\\\\x1eq\\\\x9dk\\\\x8e=N9\\\\xcb\\\\x1f\\\\xd2\\\\xe1\\\\xff\\\\x00N\\\\xb9t\\\\xb9\\\\xe3\\\\x1b\\\\xff\\\\x00\\\\x17\\\\xfe\\\\xd5\\\\x1a\\\\xb6\\\"\\\\xcdF\\\\x03\\\\xf7c\\\\xd2\\\\x9f\\\\xc2\\\\xbe\\\\x95\\\\xf8\\\\xcc\\\\xbd\\\\x9e\\\\x19\\\\xf0x{\\\\xd4\\\\xfd\\\\x92\\\\xc0Y\\\\xc2\\\\x9e}m:\\\\xea\\\\xcb\\\\x90\\\\x83\\\\xbf\\\\x19A\\\\xee\\\\xaf\\\\x99\\\\xf1}k\\\\xd5\\\\xd4\\\\xb3\\\\xc3\\\\xe8\\\\xfc/Ft\\\\xf7g\\\\xab\\\\xdb\\\\xb0\\\\x98H\\\\xce\\\\xbeu\\\\x8fv\\\\xd2\\\\x92k\\\\'g\\\\x03\\\\xa7}\\\\x08\\\\xf4\\\\x9a\\\\x96\\\\xdeG\\\\xa6\\\\x81\\\\xbd\\\\xd1\\\\xe3\\\\x112\\\\x9cQ\\\\xafkn\\\\n\\\\xe9\\\\xd3\\\\xf2\\\\xc6jv\\\\xdb\\\\xf5V\\\\xf5\\\\xf3\\\\x0f\\\\xbe\\\\xba\\\\xfa\\\\xb9\\\\x083a\\\\xb8\\\\x11\\\\x9a\\\\x81 \\\\xeb\\\\xa5\\\\x08\\\\xc4\\\\x0c\\\\xfe\\\\x02\\\\x9fD\\\\xc2\\\\x9d\\\"\\\\t\\\\x1c\\\\xaa\\\\xda H\\\\x98\\\\x00E[\\\\xe1\\\\x07t\\\\x00\\\\xb5z v\\\\t\\\\xc8wP\\\\x91pq\\\\xf3<\\\\xe0\\\\xe6}\\\\xf5$\\\\xf5\\\\x0c\\\\x8dH\\\\xd2\\\\x06\\\\xf6\\\\x82}\\\\xb5\\\\xaf\\\\xaa$\\\\r\\\\xee\\\\x14D\\\\xc1\\\\xddU\\\\xa0\\\\xf1\\\\x9bk\\\\xc8NFx\\\\xeb\\\\x14^\\\\n3\\\\xb1\\\\xe5\\\\t\\\\x9f\\\\xab5e\\\\xb5\\\\x1d\\\\xc3\\\\xd0\\\\xd2wz(\\\\xd9\\\\x11\\\\x11\\\\xfek\\\\xb7>\\\\xb4\\\\n4\\\\x9e\\\\xaa\\\\xf9\\\\xd3oh\\\\xf3\\\\xc1!E\\\\xb4\\\\x15\\\\x04\\\\x93\\\\x13\\\\x03J\\\\xc5\\\\x9a\\\\xe4\\\\xc0\\\\x10o\\\\x85\\\\xc3a\\\\xc6\\\\xadz\\\\xad\\\\xe8QK\\\\x8a\\\\xde\\\\x028\\\\r\\\\xd8\\\\xaayI\\\\xf5\\\\xd0<\\\\x860\\\\xee\\\"\\\\xc6 \\\\xe2l\\\\xf0\\\\xe6n\\\\x1bQ*\\\\xeb7\\\\x1c\\\\xc8\\\\xce\\\\x862&\\\\xbc\\\\xb6\\\\xe3mu\\\\xe6k\\\\x94\\\\xa4:\\\\xea\\\\xad\\\\x18P\\\\xb3t\\\\\\\\\\\\xa8|\\\\xa27\\\\x94\\\\x02cS\\\\xa6\\\\x84\\\\xf3\\\\xe1Y\\\\xb7\\\\x1fH\\\\xd4\\\\x97\\\\xd6\\\\x9d\\\\xe5\\\\x86CiAq\\\\xdf\\\\xa4P\\\\xe9\\\\x81\\\\xdd1Gv\\\\x9a\\\\xec\\\\xda@R\\\\x88\\\\xcd\\\\n\\\\xff\\\\x00\\\\xcc5w\\\\xd3\\\\xd9\\\\x14r0\\\\xe7\\\\x94f\\\\x10\\\\x07z\\\\xc5}{\\\\xd6\\\\xc7\\\\xdd\\\\xe0\\\\xf9Y\\\\x03k\\\\x84]\\\\xb4\\\\xa5KR\\\\n\\\\xa4\\\\x11\\\\x9eS^|\\\\xf3\\\\x99xw\\\\xc3\\\\x0b#b\\\\xdd\\\\x9d\\\\xc0\\\\x00uK\\\\xf5W\\\\x1a\\\\xe8/\\\\x93?\\\\xfc\\\\x8b\\\\x9e\\\\xaa\\\\xcf$\\\\xa2\\\\xd9\\\\xff\\\\x00\\\\xe4\\\\\\\\\\\\xf5U\\\\xa4zm\\\\x9f\\\\xfeE\\\\xcfUZ[y>\\\\x98\\\\x90\\\\xa4\\\\xf4}\\\\xba\\\\xe0)_\\\\xe7\\\\x16\\\\x14\\\\x12\\\\xa1\\\\x99\\\\x1b\\\\xab\\\\x12=u\\\\xac8\\\\xacd\\\\xa6l\\\\xcf\\\\xcd\\\\x9a\\\\xfb\\\\xa4k\\\\xdf]o\\\\x87:r\\\\x0f\\\\xcd\\\\x87\\\\x89\\\\xcf\\\\xd0(\\\\xb3H,\\\\xe7\\\\xc2\\\\xa2=\\\\xa2\\\\x12\\\\xeb\\\\x8bJ\\\\x80 4\\\\xea\\\\x87q\\\\x08Q\\\\x07.\\\\xf1L\\\\x1b\\\\xd0\\\\x038\\\\xcb\\\\x80\\\\xa2 \\\\xef?F\\\\xf8Nh\\\\xddT\\\\x13\\\\xca* a?\\\\xa8\\\\x9c\\\\xa2g.]\\\\xaa\\\\x82_tkR\\\\xdaV\\\\x19l\\\\x8b\\\\xab\\\\x87[p\\\\xee\\\\xa56\\\\xb7\\\\x0f\\\\x08\\\\x1cP\\\\xd2\\\\x96=\\\\xa9\\\\xadc7\\\\xc2\\\\xb7Q\\\\x0cA\\\\xdd\\\\x89\\\\x9ef\\\\xb37\\\\xe5\\\\x15@u\\\\x9d\\\\x99\\\\xdd\\\\x9c\\\\xa6\\\\x99Q\\\\xe8\\\\xf3\\\\x1d\\\\xf0\\\\x1e\\\\xfa\\\\xa8Ft\\\\xfc\\\\xb8\\\\xfb\\\\xbc\\\\r\\\\x19)\\\\xb7s\\\\xf4D7z,\\\\xd9\\\\x11\\\\xff\\\\x00d\\\\xda\\\\xff\\\\x00t\\\\x9a1\\\\xbb\\\\x8d^\\\\x1e\\\\x87\\\\x16P\\\\x16.%Z/\\\\xb1\\\\xe15Y\\\\xb8\\\\xa7\\\\x94\\\\x1716\\\\xee_m\\\\xa4/\\\\xabq\\\\xb5\\\\x87\\\\nB\\\\xb3P\\\\x1a\\\\x8ag\\\\x1c\\\\xe8\\\\'\\\\x8b\\\\xd4\\\\x91\\\\xe6\\\\xfbj\\\\xd2y\\\\xa7\\\\xb6u\\\\xa5\\\\xde\\\\x8b\\\\x83\\\\x89\\\\xe2A&\\\\xe1\\\\xcb\\\\x854\\\\x97\\\\xd4\\\\x90J\\\\x94\\\\x14\\\\x13\\\\x92\\\\x84\\\\x01\\\\x11\\\\x1c\\\\xb2\\\\xae\\\\xddO\\\\x88\\\\xebg\\\\x84\\\\xc3\\\\rc5\\\\xaf\\\\xd9\\\\x96\\\\xdf\\\\xd6\\\\xff\\\\x00X1\\\\xc3\\\\twwo\\\\xde\\\\xb6*\\\\xb2\\\\xeb\\\\x18m\\\\x0f\\\\xdd\\\\xbc\\\\xe1H\\\\x85\\\\x13\\\\xf4\\\\xb3\\\\xd4\\\\x89\\\\xaf\\\\x17\\\\xfa{\\\\xaek\\\\xbf\\\\xcd\\\\x9e\\\\x90VY\\\\xb7\\\\xb6A*Q\\\\xdd\\\\x1c\\\\xc8H\\\\x1e4\\\\xe3\\\\xd0\\\\x93\\\\xcf\\\"\\\\xf5m\\\\xf1\\\\xc0\\\\xad\\\\xb8\\\\xdb\\\\xed\\\\xa5\\\\xdbgw\\\\x9aP\\\\xc8\\\\xa0\\\\xc85\\\\xbf\\\\x95\\\\'\\\\x1ag\\\\xba\\\\xfb\\\\xa9)\\\\x156\\\\xdf\\\\xda\\\\x99\\\\xb6k_0R\\\\x85\\\\xa92\\\\x81\\\\xb6M\\\\x08\\\\xe1\\\\x14\\\\xaa\\\\xafzr\\\\xedljc\\\\x85\\\\xd3\\\\'\\\\xda\\\\xaa\\\\xa7\\\\x17l\\\\xd5#g\\\\x9d\\\\xb3z\\\\xe8u\\\\xae\\\\x93lQ\\\\x11>N;\\\\xd4}\\\\xc2\\\\xa2`D\\\\xcf\\\\x1c\\\\xa6\\\\xa5|\\\\rh\\\\xe0j\\\\xe1JQ\\\\xec\\\\x96\\\\x9dG\\\\xa5M\\\\xa9#\\\\xdfF4^Q\\\\x91\\\\xc3\\\\xd1\\\\xe9\\\\xabd;\\\\x9f\\\\xd0\\\\xbb\\\\x1fT\\\\xfb\\\\x8d(\\\\x1c*|\\\\x86 \\\\x8d\\\\x7f\\\\xb5D\\\\t\\\\xa1\\\\x07\\\\xce\\\\x81\\\\x03#5$\\\\x9c)\\\\xf6\\\\xed\\\\xaf\\\\x1cq\\\\xf0\\\\xad\\\\xc5[\\\\\\\\47x)m-)\\\\xf4o\\\\x11\\\\xe8\\\\xadK\\\\xab\\\\xc8\\\\xd6\\\\xd0\\\\x93\\\\xa4G\\\\x01Y\\\\x86\\\\xb1\\\\'\\\\xb5\\\\xaet\\\\xd4\\\"A\\\\xea\\\\x1d1\\\\xd9\\\\xec\\\\x89\\\\xef\\\\x9a\\\\xbdB%\\\\xc1!\\\\xe9\\\\xfb<(\\\\xb5ywoEI\\\\xdd\\\\xe8\\\\xc7dG\\\\xfd\\\\x91i\\\\xfd\\\\xcah\\\\xc7\\\\xc3W\\\\xcbo\\\\xb4\\\\x060\\\\xe3\\\\xf7\\\\xd3\\\\xef\\\\xa5E9\\\\x8a\\\\xf4\\\\x8d\\\\x87`;Y\\\\x88\\\\xe1\\\\xd7\\\\x18v7r\\\\xe5\\\\xbb\\\\x9b\\\\x8a6\\\\xa8mh\\\\xde)\\\\n\\\\xcaV\\\\x0e\\\\x8a\\\\x15\\\\xdb\\\\x1c2\\\\xcb\\\\x19\\\\xa6s\\\\xcac\\\\x7f2[],a\\\\xae&[\\\\xd9\\\\xdd\\\\xaaX\\\\xfb6\\\\xad\\\\x1f\\\\xfdJ\\\\xdf\\\\xc8\\\\xeaO1\\\\x99\\\\x967\\\\xc0\\\\xff\\\\x00\\\\xc2\\\\x85\\\\xa8\\\\x02v_l\\\\x06d~\\\\xa0\\\\x83\\\\xff\\\\x00\\\\x1d\\\\x13\\\\xa5\\\\x93]\\\\xb9{\\\\x1d\\\\xfc(\\\\xd9\\\\x84\\\\xa8\\\\xaff\\\\xf6\\\\xb9!:\\\\x93\\\\x87\\\\x0c\\\\xbf\\\\xa7O\\\\xc9\\\\xc8^<\\\\xa2\\\\xdc\\\\xf4\\\\xa5\\\\x84<\\\\xc2\\\\xd2\\\\xe6\\\\x0b\\\\xb5)lF\\\\xfa\\\\x8d\\\\x8e\\\\xe8H\\\\xef;\\\\xd9S:\\\\x19\\\\xca\\\\xcf\\\\xcc\\\\xc7\\\\xc4Z\\\\x96l\\\\xa2\\\\xd6\\\\xdd\\\\r2\\\\x08@\\\\x12$\\\\xc9\\\\xcf:\\\\xf3^n\\\\xeb\\\\xacR\\\\x00\\\\xf0\\\\x9a\\\\xc3\\\\xab}df\\\\xd1\\\\xaf\\\\xba)\\\\x03\\\\xce\\\\x95h\\\\x16h[eH\\\\xe1V\\\\x83\\\\xc0\\\\xf4\\\\xd7\\\\xda\\\\xd8\\\\xc7\\\\x0f+\\\\x86?\\\\xb7\\\\x1f\\\\x1a\\\\xb4*\\\\x8f\\\\xb1\\\\x1f7\\\\x06FS\\\\xf0\\\\xad2#d\\\\x06\\\\x00\\\\x13\\\\x9a\\\\x8c\\\\xe7\\\\xaeUl\\\\x9a2\\\\x90\\\\'1\\\\x14\\\\x86\\\\x10=<*L\\\\x80x\\\\x1a5\\\\xa8B\\\\xb8\\\\x12\\\\xcb\\\\xbft\\\\xf1\\\\xee\\\\xa8#a\\\\x19\\\\xd9\\\\xe8fO\\\\xbe\\\\xa99I\\\\xc3 G\\\\x03\\\\xed\\\\xa8\\\\x93I\\\\xc8\\\\x8f\\\\x03Hdg1\\\\x9d\\\\n\\\\x9b\\\\x96\\\\xa3\\\\xf0\\\\xa7\\\\xc2\\\\xfb\\\\x9d#\\\\xaap\\\\x11\\\\n\\\\xcb\\\\xb5<\\\\'\\\\x95J!\\\\\\\\\\\\x18qR\\\\x0f\\\\x98r\\\\x9a2\\\\xe5H\\\\xef.\\\\x8c2\\\\xe8\\\\xd7d\\\\xff\\\\x00\\\\xf9E\\\\xa7\\\\xf7(\\\\xa2x5\\\\xb1\\\\xdaC\\\\x18p\\\\xfd\\\\xa2jQ\\\\xcb{n\\\\x84\\\\xbf\\\\xd2\\\\x9e\\\"\\\\xda\\\\xd2\\\\x95\\\\xa5\\\\xcce\\\\x96\\\\x94\\\\x92&Am\\\\x00\\\\xc8\\\\xe5\\\\xad{\\\\xfa\\\\x17\\\\xfd\\\\xb7,\\\\xf1\\\\x97\\\\xad\\\\x86\\\\xfd\\\\xe2\\\\xcbN\\\\xc9`\\\\xac\\\\xdb\\\\xad\\\\xc6\\\\xac-\\\\xd2\\\\xfa\\\\x08RT\\\\x11\\\\xa1\\\\x04g\\\\\\\\g_;d\\\\xb5\\\\xef\\\\xb8\\\\xe17\\\\xacg\\\\xfc6[5\\\\x83\\\\xd9^aB\\\\xf1V\\\\xad\\\\x17\\\\x9eq\\\\xe9V\\\\xe02\\\\x03\\\\xaa\\\\x8fuk\\\\xe23\\\\xb8\\\\xf5;e\\\\xf6\\\\xfe\\\\x8exu8\\\\xe5&\\\\xcf\\\\tcr\\\\xd1V\\\\xf6\\\\xb6iQK\\\\x8a\\\\x970\\\\xd5]\\\\xc4\\\\xa8\\\\xe4\\\\x02`\\\\x8fMf\\\\xe7{\\\\xaf?\\\\xcfK=Y\\\\xcci\\\\xfa@\\\\xc3\\\\xd4\\\\xd6\\\\n\\\\xa5\\\\xa9\\\\x0c\\\\xa7}\\\\x95\\\\xb4T\\\\xc6\\\\x1a\\\\xab@IR`\\\\x10\\\\xadx\\\\xd7\\\\xa3\\\\xa1\\\\x9f\\\\x99\\\\xfd\\\\xf6\\\\xf1\\\\xf51\\\\xdeR\\\\xad\\\\x93\\\\x91\\\\x8c\\\\xf2\\\\xaf\\\\x03\\\\xb6\\\\xd4P\\\\xd6\\\\x87F\\\\xf7\\\\x0f\\\\xfdM\\\\xaf\\\\xbb\\\\xf1\\\\xa8T\\\\xa02\\\\xa8\\\\x16*\\\\x05\\\\x8a\\\\x93\\\"\\\\xad\\\\r\\\\xbc\\\\'Lh+\\\\xd8\\\\xab\\\\xae0\\\\xe3\\\\'\\\\xfa\\\\xd4\\\\xd5\\\\x97\\\\x85/*&\\\\xc4\\\\xc3 \\\\x1e\\\\x04\\\\x8fuB\\\\x8a\\\\xd9\\\\x1dOv\\\\xf9\\\\xf4eQ\\\\x08\\\\x1a\\\\xaa\\\\x1a\\\\xd5\\\\x01\\\\xe7V\\\\x92\\\\xb2\\\\x88m\\\\xc5\\\\x83\\\\xde\\\\x94\\\\x15\\\\x01\\\\xe9\\\\x88\\\\xa7\\\\x19\\\\xbf\\\"\\\\x82\\\\x95L\\\\x1f\\\\x85\\\\x1a:%\\\\xccn:\\\\x01%!&\\\\x0cD\\\\x88\\\\xd6\\\\xa1j.\\\\x17\\\\xfa\\\\x99\\\\x00F\\\\xbe\\\\xf1TR\\\\xa6\\\\x1ey\\\\xd0Rp\\\\xfbt\\\\xdd\\\\\\\\8\\\\x85\\\\xa8\\\\xa4&\\\\xd9\\\\xf7\\\\x84\\\\x0e(mK\\\\x03\\\\xd6\\\\x9a\\\\xd4\\\\x9b\\\\x16\\\\xe9\\\\x14\\\\x19\\\"g\\\\xddAb\\\\xa3\\\\xadPI\\\\xc8\\\\x1c\\\\x89\\\\xcaG}^\\\\x80\\\\xef\\\\xe2\\\\xd7\\\\xcb/}I\\\\x06\\\\xec\\\\xf6\\\\xd7\\\\xc3\\\\xb0}\\\\xd5_u/.\\\\xf7\\\\xe8\\\\xd0GG;*9a6\\\\x9f\\\\xdc\\\\xa6\\\\x89\\\\xe1T\\\\xed\\\\xa6\\\\xfdA\\\\xbf\\\\xda\\\\xa7\\\\xdciQ\\\\xcb\\\\xf8\\\\xeb\\\\x8bWK\\\\xd7A\\\\xb9\\\\x9f\\\\xf2\\\\x85\\\\xb4\\\\x9d\\\\xd9\\\\x98\\\\tO.\\\\x15\\\\xec\\\\xe9k\\\\xe5\\\\xb3\\\\x7f{\\\\x8f\\\\xde.\\\\x95u\\\\xeb\\\\xb6ZP\\\\xa2\\\\x95\\\\x1c\\\\xe5@\\\\x90 \\\\x82}\\\\x80\\\\xd7\\\\x8e[\\\\xdd\\\\x1e\\\\xdc\\\\xa4j\\\\xf0\\\\x17\\\\xc8\\\\xc1\\\\xd9`\\\\xdd\\\\xba\\\\xa7n\\\\x97r\\\\xeb%A!IIZ\\\\xa1)\\\\x81\\\\x10\\\\x91\\\\xa4\\\\xfaf\\\\xba\\\\xfcF7\\\\xbe\\\\xfe\\\\x8e\\\\x1d;$\\\\x17\\\\x0f\\\\xb7d\\\\xe1\\\\x98k8\\\\x8b\\\\x8e\\\\\\\\\\\\x8bvT\\\\xda\\\\xee\\\\\\\\`\\\\xb8\\\\xe1\\\\x83\\\\xe7v[\\\"Lf;>\\\\x9a\\\\xd6;\\\\xdd\\\\xb1\\\\xbb\\\\xb9\\\\x8bQ\\\\xb5\\\\x0f[\\\\xa1\\\\x17\\\\xb6\\\\xb6\\\\x81\\\\xbe\\\\xa1%\\\\x9d\\\\xc2Y\\\\xea\\\\xd4w\\\\x94\\\\x80A\\\\xc8{\\\\xab\\\\xd7\\\\xd3\\\\x97\\\\xb3\\\\xba\\\\xbc\\\\xd9[r\\\\xd2\\\\xe2^N/\\\\xc4\\\\xd7\\\\xceiD$\\\\xd5\\\\xa6\\\\xdb\\\\xec2<\\\\x89\\\\xbf\\\\x03\\\\xef\\\\xa5%\\\\x8e\\\\x15h\\\\x17\\\\xc2\\\\xa0E\\\\x05\\\\x98\\\\xdd^\\\\xeey\\\\xe53V\\\\x96\\\\xce9R-x\\\\xbe\\\\x96S\\\\xbd\\\\xb1\\\\x97\\\\xb2@\\\\x03\\\\xaa9\\\\xe9\\\\xfadQ\\\\x94\\\\xe0O*\\\\x06\\\\xd3\\\\xf4fx)B\\\\xb3#B7\\\\xfa#\\\\xfbO\\\\x85^\\\\x141)$\\\\x88\\\\x8d&\\\\x89\\\\xc8\\\\x16\\\\xd5\\\\xce\\\\xa9\\\\xd5(\\\\xc8\\\\x96\\\\x9cD\\\\xfd\\\\xe4\\\\x11\\\\xf1\\\\xadcV\\\\xb6\\\\x024H\\\\xf4P|\\\\x18\\\\xeeM.>\\\\xa9\\\\xf7U\\\\xe4#\\\\xe1YY\\\\x9c\\\\xf8\\\\x9fx\\\\xa9N<\\\\'\\\\xa5\\\\x1fK\\\\xe8\\\\x82\\\\x07\\\\x8d\\\\x1c\\\\x91\\\\xac\\\\x9e6\\\\xf7.((\\\\xa2Yy\\\\xac\\\\x8e\\\\xa1HRH\\\\xf6\\\\xc5jQ\\\\xe5\\\\x14r\\\\xcbJ\\\\xcc4\\\\x89\\\\xd4r\\\\xd6\\\\x95\\\\xa1\\\\x00=R\\\\xf2\\\\x84\\\\x92\\\"\\\\xaa\\\\xb4\\\\xd7^\\\\xab7f\\\\'\\\\xab:\\\\xf8UC\\\\xbe\\\\xba:V\\\\xefG\\\\xdb.7W\\\\xff\\\\x005Z\\\\xfd\\\\x1f\\\\xf5I\\\\xac\\\\xcc\\\\x8e\\\\x92\\\\xf6\\\\x91`\\\\xd9\\\\xb4!@\\\\xf5\\\\xa3Q\\\\xdci\\\\x97kNW\\\\xc7\\\\x9fm\\\\x8e\\\\x95\\\\xaf\\\\xee\\\\x9cp%\\\\xb6v\\\\x84\\\\xb8\\\\xe1\\\\x070\\\\x80\\\\x06g\\\\xbb*\\\\xf6\\\\xf4\\\\xa6\\\\xfazgruq\\\\xb5n\\\\xdamN\\\\x05\\\\xbc\\\\x80q[U\\\\x15\\\\x10\\\\x02z\\\\xdc\\\\xd5\\\\'A^o\\\\x93\\\\x9e\\\\xfc=\\\\x99e\\\\x8d\\\\xf1c\\\\xc9\\\\xe1\\\\x1bkii\\\\x87\\\\xb1\\\\x86:\\\\xff\\\\x00\\\\xf9\\\\xc7\\\\xca\\\\x17j\\\\x85\\\\xf9\\\"\\\\xc2\\\\x03\\\\x8bR\\\\x8a\\\\x12D\\\\xe7\\\\x00\\\\x89\\\\xcc\\\\x03\\\\x9cW\\\\xaf\\\\xa9\\\\xd3\\\\xee\\\\xce\\\\xda\\\\xe1\\\\x86\\\\xb1\\\\x9az\\\\xec\\\\x16\\\\xf1Ij\\\\xdd\\\\x17,\\\\xf9E\\\\xcbaM/\\\\xa9p[\\\\xa5N%FBJ\\\\xddI\\\\x1a\\\\x18\\\\x04\\\\x1c\\\\xb8\\\\xe4g\\\\x97e\\\\x9bt\\\\xcb\\\\x98\\\\xd3\\\\xede\\\\xc0{\\\\x1bXS+mKv\\\\xc5\\\\x1d[\\\\x8f\\\\x07H%\\\\xd4\\\\xfd T\\\\x0f\\\\xaf\\\\xba\\\\xbdXc\\\\xae\\\\x96\\\\xfe\\\\xef\\\\x1d\\\\xcaw\\\\xd9\\\\xf4]\\\\x0e\\\\x1f\\\\x95^\\\\x7fH\\\\xfb\\\\xeb\\\\xe6\\\\xba(\\\\x94wV\\\\x9aop\\\\xcf\\\\xd4\\\\x9b\\\\xf4\\\\xfb\\\\xea\\\\xd0\\\\xda`\\\\x14\\\\x83\\\\x87\\\\x8dH\\\\xec\\\\xaa\\\\xd04\\\\x91:M\\\"\\\\xd7\\\\x8e\\\\xe9hN\\\\xc3b\\\\xb04e*\\\\xf5:\\\\x83F\\\\\\\\\\\\xc5<\\\\xb9\\\\xfe\\\\xd7E@3\\\\xbek\\\\x9c\\\\xbbn\\\\x9c\\\\xda\\\\xfeI@ps\\\\x9e\\\\xb2*\\\\xa8\\\\xd1\\\\x91\\\\x914\\\\xc8\\\\x0b\\\\x90\\\\x11\\\\x14kI\\\\x80I\\\\xcef\\\\xa4\\\\x1b\\\\xc9\\\\x1dJ\\\\xf9\\\\xee\\\\x99\\\\xf5T\\\\xb4\\\\x8d\\\\x85\\\\x90m\\\\x8er\\\\x0c\\\\xfb\\\\xc5_u\\\\xa4\\\\xfd\\\\x12\\\\xa1\\\\xc3\\\\x8dK\\\\x93c>3U\\\\xf2a\\\\xba\\\\x1c\\\\xa7\\\\xd3H\\\\'\\\\x84\\\\xe4h\\\\xd28\\\\x91\\\\xd4\\\\xaf#\\\\xbd\\\\xbc$\\\\xf0\\\\xf5Q\\\\xb2\\\\xd6_IS\\\\xa9L\\\\x02P@\\\\xf5V\\\\x83\\\\xaf\\\\xb6;\\\\xa6~\\\\x8f\\\\xf0\\\\xed\\\\x90\\\\xc0\\\\xac\\\\xae\\\\xf6\\\\x81\\\\x08\\\\xba\\\\xb7\\\\xb0a\\\\x97Z\\\\x16\\\\xaf\\\\xa8\\\\xa1Im \\\\x83\\\\xba\\\\x83\\\\xa1\\\\x06\\\\xb9\\\\\\\\\\\\xa4\\\\xf2\\\\xd7mz\\\\x0b\\\\x1e\\\\x90vgmC\\\\x96\\\\xfb5\\\\x89*\\\\xed\\\\xebE!\\\\xd7\\\\x90\\\\xabgY\\\\xddB\\\\xa5 \\\\xf6\\\\xd2\\\\x99\\\\xcf\\\\x95k\\\\x1b\\\\xbe`\\\\xb3\\\\\\\\W>\\\\\\\\\\\\xdf6\\\\xdfH\\\\xfbN\\\\xa7\\\\xd3\\\\xbc\\\\xd1\\\\xc4n}0\\\\xa1\\\\xdd\\\\xdd^\\\\xfe\\\\x978\\\\xe9\\\\xd3\\\\xa3\\\\x94\\\\x99\\\\xdd\\\\xfb\\\\r\\\\x89\\\\xb7k~\\\\xb6\\\\x16\\\\xc2\\\\x8am\\\\x14\\\\xc8[\\\\xe9\\\\xddL\\\\xa0\\\\xa5\\\\xc0\\\\x81\\\\xbb\\\\xdf\\\\x98=\\\\xd1M\\\\x96\\\\xeaZ\\\\xf4\\\\xdce\\\\xb6\\\\xc0\\\\xac\\\\xac\\\\xf0+\\\\x9cA\\\\n{i]\\\\xb3\\\\xc4\\\\x14\\\\xfc\\\\xa6\\\\xc7\\\\xa9\\\\x1dfK\\\\x94\\\\x8d\\\\xf1\\\\x90\\\\x90\\\\x01\\\\x1a\\\\xc5t\\\\xba\\\\xbcW\\\\x97s\\\\xbd\\\\xedC\\\\xce\\\\xdf\\\\x9b\\\\xa7p\\\\xe4\\\\xd9:\\\\xfb\\\\xce\\\\x94(8-\\\\xc4\\\\xa2\\\\x0c\\\\xab\\\\xe5L\\\\x12Lf \\\\x8f\\\\t\\\\xaf62\\\\xf7]\\\\xef\\\\xf9\\\\xbd]K$\\\\x88\\\\xeb\\\\xb5~\\\\xd3\\\\x14\\\\xc1\\\\x99\\\\xbbd2\\\\xa7\\\\xf1\\\\x0b\\\\x14\\\\xa1!M((u\\\\xd9\\\\x90[%<+\\\\xd7\\\\x8e[\\\\xe8\\\\xd9\\\\xed\\\\xbf\\\\x7f\\\\xee\\\\xf9\\\\xbdY\\\\'W~\\\\xf1\\\\xd0\\\\x8a2\\\\xb5\\\\x1f\\\\xb4k\\\\xe6\\\\xba(\\\\x90\\\\xa1\\\\xc4\\\\xd6\\\\x9a\\\\xad\\\\xe6\\\\x16\\\\xb4\\\\xf9\\\\x1a`\\\\xfd#P\\\\xa9}jj\\\\x0c\\\\xeb\\\\x87u[\\\\x1a5W\\\\x00\\\\x03\\\\xc2\\\\xad\\\\xad\\\\x06n\\\\x84\\\\xf9\\\\xc2\\\\xad\\\\xe9i\\\\xe6zI\\\\xdd\\\\xb9\\\\xd8Lx\\\\xef\\\\x90Qf\\\\xa3\\\\x11\\\\xafi\\\\'\\\\xe1Y\\\\xb7fM9\\\\xf2\\\\xd8\\\\xe4\\\\xaf\\\\x13X\\\\x9a\\\\xbc\\\\x1a\\\"\\\\x0f\\\\xc9\\\\xb9\\\\xa9;\\\\xe3\\\\xdcjP,\\\\xa7*F\\\\xd2,\\\\x19\\\\xf2\\\\x9b\\\\x94\\\\xb4V\\\\x11(q[\\\\xdfu\\\\nTzwc\\\\xd3L\\\\xe7\\\\x85x\\\\x01\\\\xb5J\\\\x12y\\\\x80t\\\\x8a*\\\\x9c\\\\xb2\\\\xe0\\\\x00\\\\x1c\\\\tV\\\\xf2 \\\\x80b\\\\'-j\\\\xf2Qp\\\\xc3\\\\xf3UD\\\\xea~\\\\x15}D\\\\xfa%\\\\xcf\\\\x88\\\\xee\\\\xa0\\\\x8dj\\\\xcf\\\\\\\\\\\\x9b\\\\xa3\\\\xbe\\\\x12Y\\\\xb7[\\\\xe2G\\\\x9cRR7|s>\\\\xaa\\\\xd6\\\\xb6\\\\x00\\\\x98X\\\\x04\\\\xc0\\\\xe6\\\\x06\\\\x94i\\\\x1aL8`\\\\xef\\\\'{#\\\\xa4\\\\x8a\\\\xb4\\\\x84\\\\x91\\\\xe4\\\\xee\\\\x00>\\\\x92F\\\\x7f\\\\xce\\\\xa3\\\\\\\\\\\\x9d5w\\\\xc4\\\\x82\\\\xfcL\\\\x84\\\\x1fuhWkl[hcdp\\\\r\\\\xd6\\\\x1b\\\\x07\\\\xf3m\\\\xb1*\\\\t\\\\x19\\\\x9e\\\\xa99\\\\xccW\\\\x82\\\\xe37k\\\\xd33\\\\xe277\\\\x0e\\\\xf5\\\\x85\\\\x1d\\\\x93\\\\xd9<F\\\\xa2\\\\xbbt&\\\\xadc\\\\xab\\\\x96\\\\xe4R\\\\x9bY\\\\xd1s\\\\x8c\\\\'h\\\\xf6\\\\x9d[J\\\\xeb-\\\\x07\\\\x9d\\\\xbd[,X\\\\x02\\\\xe0\\\\x0bX;\\\\xa1E\\\\xd1\\\\xccx\\\\xd7\\\\xbb\\\\x0c\\\\xf2\\\\x96H\\\\xf3\\\\xd9/\\\\x97\\\\x83\\\\xf2[m\\\\xe2\\\\xbf\\\\xcfx\\\\xa6\\\\xf92U\\\\xf9\\\\xb5\\\\x99\\\\'\\\\xbf\\\\xe5\\\\xb3\\\\xae\\\\xdb\\\\xcf\\\\xe8{\\\\xaf\\\\x9d\\\\x980\\\\xdbN\\\\xb8:1;\\\\xb58 \\\\x85/\\\\ro\\\\xff\\\\x00\\\\xddO\\\\xe6\\\\xf6\\\\x8c\\\\xfa\\\\xecqb\\\\xda\\\\x7fG\\\\x88\\\\xb9<\\\\xce\\\\x1c\\\\x90g\\\\xff\\\\x00:\\\\xbaN\\\\xaex\\\\xfb,\\\\xa7w\\\\xaa\\\\xc0\\\\xe8\\\\xc7b\\\\xef1G\\\\xecq\\\\x94cL\\\\xa6\\\\xd2\\\\xd3\\\\x12C\\\\x8e[*\\\\xc3uN\\\\xa9\\\\xa2\\\\x14!Ad\\\\rh\\\\xea\\\\xfcNYN\\\\xdc\\\\x9c\\\\xb1\\\\xe8\\\\xe3\\\\x8d\\\\xb6:\\\\x01J\\\\x83\\\\xe3^\\\\x1b^\\\\x856\\\\x92\\\\xcacu\\\\xa4\\\\x0fE]\\\\xce\\\\x9d\\\\xa7\\\\x8b\\\\x88\\\\x10\\\\x91\\\\x1e\\\\x02\\\\x8b\\\\x92\\\\xed4\\\\xdc+,\\\\xeb=\\\\xd5v\\\\x90\\\\xbc\\\\xa3\\\\xa5V\\\\xadC\\\\x16\\\\xe2\\\\xa3X\\\\xa1\\\\x18\\\\x17\\\\'\\\\xce\\\\xa8i\\\\xae\\\\xdb\\\\x14\\\\x176\\\\'h\\\\x04(\\\\x83b\\\\xe9\\\\xf3O\\\\x014wH\\\\xb5\\\\\\\\\\\\xfe\\\\xc9\\\\xf3\\\\xabX\\\\xc1OO\\\\x98\\\\xe7\\\\xdf\\\\x1f\\\\x1a\\\\x81\\\\x89\\\\x12@\\\\xcb=&\\\\x94%\\\\xba\\\\xb7_o\\\\xb4\\\\x13\\\\x92\\\\xbbD\\\\xfd\\\\x93L\\\\xe4\\\\x02\\\\xd9\\\\x80\\\\x07w\\\\n\\\\x13\\\\x1c2\\\\x85\\\\re&=U}J6\\\\x16G\\\\x91\\\\x9f\\\\x13\\\\xc7\\\\xc2\\\\x9b\\\\xe4&\\\\xc7`\\\\xaaF\\\\\\\\*\\\\'5\\\\xab\\\\xe0\\\\xa9)=R\\\\x80\\\\x9e\\\\'\\\\x97\\\\xef\\\\xca\\\\xa8\\\\x02\\\\x9c\\\\xcf\\\\x87:\\\\x11\\\\xa0\\\\xf6\\\\xb4\\\\x14\\\\xdf\\\\n\\\\x08\\\\t\\\\x16\\\\xaa\\\\xfb\\\\xc9\\\\xd7\\\\xc0\\\\xd4\\\\x9a\\\\xbcD\\\\x90\\\\x8b\\\\x93\\\\x96M\\\\x9fuUW{\\\\xec\\\\xd6\\\\x1a\\\\x0e\\\\xca\\\\xe0\\\\x83tJl-\\\\xd3\\\\xeai\\\"\\\\xb9\\\\xe5\\\\xd2\\\\x9b\\\\xa7\\\\x1c\\\\xf8.#m\\\\xe4\\\\xe5\\\\xbdaD\\\\xd5\\\\x86\\\\x1d\\\\xb4\\\\xdc\\\\xb6\\\\xf2\\\\x9d \\\\x9d\\\\xde\\\\x8c\\\\xb6\\\\x9c\\\\xf3\\\\xb7\\\\x03\\\\xd6\\\\xe2+\\\\xbe\\\\x1f\\\\xb5\\\\x18QVV,\\\\xdc[%\\\\xc5\\\\xb8\\\\xeaU\\\\xbc\\\\xb0\\\\xad\\\\xd2\\\\x08\\\\x00hb&\\\\xbd!18C\\\\x19\\\\xc3\\\\xcf\\\\x0c\\\\xe0N\\\\xe9\\\\xf8z\\\\xa9\\\\xd8:\\\\xfb\\\\x0fb\\\\xd1\\\\x82\\\\xe2\\\\\\\\yj\\\\xde\\\\t\\\\x1el\\\\x03\\\\xaey\\\\x0fe\\\\x12\\\\xda\\\\xd2\\\\xe0\\\\xe8PF\\\\xc8\\\\x03\\\\xf5\\\\xaf\\\\x9e?\\\\xd9\\\\x15\\\\xcb\\\\xa9\\\\xe5\\\\x98\\\\xb1\\\\\\\\^\\\\xe9\\\\x1e\\\\x15\\\\xc2\\\\xbaEC\\\\xe4jJe\\\\xc7Yo\\\\xef*\\\\xb8|\\\\xd8\\\\xf4|\\\\xba\\\\x196i0\\\\xab\\\\xe6\\\\xc9\\\\xe4\\\\x81?\\\\x1a\\\\xbee\\\\xbe\\\"\\\\xec\\\\x93\\\\xcd\\\\x15\\\\xb42\\\\xb8\\\\r7z\\\\xf9\\\\xff\\\\x00V\\\\xd1#\\\\xddGvK\\\\xb7\\\\x14\\\\x96\\\\xec^_\\\\x9b\\\\x86?\\\\xe2\\\\xea\\\\xc2}\\\\xe6\\\\xb3r\\\\xbe\\\\xe7\\\\xb6{\\\\x0c\\\\x9c&\\\\xf5_\\\\xe8\\\\xd6L\\\\xf7\\\\xa9eDz\\\\x85g\\\\xbb~\\\\xa7_D\\\\x86\\\\xb0w\\\\xff\\\\x00\\\\x8c\\\\xbdi\\\\x1d\\\\xcd3\\\\x9f\\\\xb4\\\\xd1\\\\xb8\\\\xb5Qv\\\\xaf\\\\x07h\\\\xecn\\\\xd0o]\\\\xdc\\\\xad_\\\\x9bn\\\\x08\\\\x12\\\\x00\\\\x90\\\\xd9:\\\\x01\\\\xddT\\\\xbc\\\\x8b8r\\\\xbbp\\\\x1aFQ:\\\\x835\\\\xea\\\\xc3\\\\x97\\\\x9e\\\\xb0\\\\x1e\\\\xcb\\\\x9fx\\\\x1f}h\\\\x1a\\\\x08\\\\x9c\\\\xa2{\\\\xa9Ge\\\\xcb\\\\xba\\\\xa0\\\\xc1\\\\x12\\\\x0cg9Q\\\\xe8\\\\x88\\\\xe8\\\\x1dZ\\\\xbe\\\\xe9\\\\xf7R\\\\x90\\\\xf0\\\\xb2<\\\\x9c\\\\xc8\\\\x19\\\\x93\\\\xe9\\\\xccQ\\\\xb4\\\\x9d9\\\\x11\\\\x94k\\\\xad$\\\\xd8\\\\x13\\\\xe3U\\\\xf0\\\\x08@\\\\x11\\\"=4-\\\\x1a#\\\\xc3\\\\xc6\\\\x9f\\\\n\\\\x1eT<\\\\x99C9\\\\xdf\\\\x19\\\\xfa\\\\r\\\\x1b\\\\xe55\\\\xb8\\\\x89\\\\xf9;\\\\x99\\\\xfeM_\\\\xd9\\\\xad\\\\'\\\\xd1l\\\\x01\\\\xa0\\\\x8c\\\\x0b\\\\x0eD\\\\x08M\\\\xb3I\\\\x8f\\\\x04\\\\ns\\\\xbf\\\\x9a\\\\xb3\\\\x8c\\\\xfc\\\\xb1\\\\x07i\\\\xc4\\\\x0bX\\\\xe6\\\\xafp\\\\xac\\\\xb4\\\\xaf\\\\xfaEX\\\\xfe\\\\x0b\\\\xb6\\\\x8c\\\\xa4\\\\x83(BL\\\\x19\\\\xd5\\\\xd4WL?j(\\\\xa6\\\\xb0\\\\xa0U\\\\x87\\\\x84\\\\x02\\\\xb8V\\\\xf8!9\\\\x92\\\\t\\\\xf6\\\\x1eF\\\\xbb\\\\xb1\\\\x1b6\\\\n\\\\x89L\\\\r\\\\xceCB?x\\\\xd3-iA\\\\xe2\\\\xb7\\\\r\\\"\\\\xcd\\\\xc6J\\\\x90\\\\xb7\\\\x94@\\\\xdc\\\\x0b\\\\x01I\\\\x9c\\\\xe631\\\\x90\\\\xaaNv\\\\xd2\\\\xd9\\\\xe8e;\\\\xbb\\\\x13j\\\\xa3\\\\x03z\\\\xe5\\\\xf3\\\\x99\\\\xfbQ\\\\xf0\\\\xae]K\\\\xc8\\\\x91\\\\xeeo\\\\x16R\\\\xe2@\\\\x8f7\\\\x8f\\\\x89\\\\xaf.~[\\\\x8f\\\\x02\\\\xc6\\\\x15\\\\x856e\\\\x16-(\\\\xf3X*\\\\xf7\\\\x9a\\\\xf2|\\\\xcc\\\\xbd\\\\xde\\\\xee\\\\xc8\\\\x9e\\\\xd7P\\\\xd0\\\\x01\\\\x96Z@\\\\xfb)\\\\x03\\\\xddGu\\\\xab\\\\xb6AK\\\\xeaQ\\\\x8e\\\\x15m08y\\\\xc7x\\\\x15l\\\\x06\\\\xa5\\\\x93\\\\xa95m\\\\x1e\\\\x93\\\\xea\\\\xa0Tly\\\\x1df\\\\xcd\\\\xe3(\\\\xfa\\\\xd8}\\\\xc8\\\\xfe\\\\xa9U\\\\xa9\\\\xe4_\\\\x0e=aD\\\\xdb\\\\xb4~\\\\x96\\\\xe8\\\\xafV>\\\\xaf.G$\\\\xc0{S\\\\x98\\\\xad2\\\\x189\\\\xe7\\\\xaf\\\\xb2\\\\x94#\\\\x00)\\\\xf6\\\\x92\\\\xa9\\\\xdd&\\\\rH\\\\xc4\\\\xa8\\\\xee\\\\xe8f\\\\xa2W\\\\xa0o\\\\x04\\\\x93\\\\x11\\\\xcb=)\\\\x08\\\\xb8j\\\\x8f\\\\x92\\\\xa8N[\\\\xc7\\\\xe1W\\\\xaaJ\\\\x04\\\\xc1\\\\xd4\\\\xfc(SpVP\\\\x95\\\\x07\\\\xf7\\\\xd4S\\\\xba\\\\xd2\\\\x96\\\\x88\\\\x1a\\\\xa8\\\\x11\\\\x00\\\\xfa\\\\t\\\\xaa \\\\xc6n\\\\x00t\\\\x98\\\\x9eB\\\\xa3\\\\xe4\\\\xc0s:\\\\x114\\\\x88\\\\'\\\\xf1J\\\\x81\\\\x96\\\\xf8\\\\x1e\\\\xc3F\\\\xd3]}!\\\\xab\\\\xaf\\\\xd9\\\\x9fun3\\\\xea\\\\xfa=\\\\x86\\\\x8d\\\\xdc>\\\\xd9<\\\\x9a@\\\\xfe\\\\x88\\\\xa3?\\\\xda\\\\xab\\\\x1f\\\\x11\\\\xaa\\\\xda\\\\x9dm\\\\x7f\\\\x9f\\\\xf0\\\\xa24\\\\xac\\\\xfaEi\\\\xbb^\\\\x8b1\\\\xf7\\\\n\\\\xc0+, \\\\x95\\\\x10\\\\x04u\\\\xe8\\\\x81]1\\\\xe7(\\\\x14Kx\\\\x97V\\\\x8d\\\\xc6\\\\xee\\\\xdb\\\\x08\\\\xe5\\\\xbc\\\\x9e5\\\\xe9\\\\x92\\\\xb3R\\\\x11\\\\x8a\\\\xac\\\\x88\\\\xf2\\\\xd6\\\\xf3\\\\xe4Q\\\\xf8S\\\\xdbF\\\\xc5{\\\\x10\\\\x17*I~\\\\xe9\\\\xa7\\\\x14\\\\x9c\\\\x81\\\\x94\\\\x8fuRi\\\\xa5\\\\xdb\\\\xd1\\\\x9e\\\\x18\\\\xc6+\\\\xb0XKo8\\\\xb2\\\\xcf\\\\\\\\\\\\xfb\\\\x85( \\\\xa5\\\\xcf\\\\x949\\\\x1fV\\\\xa3J\\\\xe5\\\\x96W\\\\x1c\\\\xb6\\\\xce<\\\\xacK\\\\xb6\\\\xaf\\\\x96\\\\xb4\\\\x9b6\\\\xd9Sa0K\\\\x84\\\\xcc\\\\xc9\\\\xff\\\\x00\\\\n\\\\xf2\\\\xe5/\\\\xa3\\\\xa4\\\\xd7\\\\xab\\\\xc1\\\\xa1g\\\\xd9_9\\\\xf4\\\\xe8\\\\x89_3H\\\\x11*\\\\x11S\\\\'\\\\xef@\\\\xcf\\\\xd5H\\\\xa4\\\\xde\\\\x9c\\\\xe9\\\\xd0=\\\\x07\\\\x95@\\\\xb7\\\\x89\\\\xeb0\\\\xdb\\\\xe4G\\\\x9dj\\\\xf2c\\\\xc5\\\\xb5S<\\\\x8a\\\\xe3+E\\\\x13j\\\\xc6\\\\x7f@{\\\\xab\\\\xd7\\\\x1el\\\\x85F}fY\\\\xe5\\\\xa7\\\\x8d<\\\\xb2b@*\\\\x19\\\\xe4i\\\\xda\\\\x16\\\\xd9a\\\\xbb\\\\xb6\\\\x94N\\\\xeaR\\\\xa9\\\\'\\\\x952\\\\x8f!7\\\\x90H\\\\x83\\\\x95\\\\x08\\\\x8e\\\\x1e\\\\xc1\\\\xe1\\\\x97\\\\xc2\\\\x98\\\\xb7\\\\xb4l4\\\\x9f\\\\'P\\\\x8e\\\\'\\\\xe1V\\\\x92h\\\\x19\\\\x15O\\\\x18\\\\xa3h\\\\xf6\\\\x17\\\\xba\\\\x8b\\\\x89\\\"T\\\\xc9H\\\\xcb\\\\\\\\\\\\xd3\\\\xf8S\\\\xea\\\\x82\\\\x9c\\\\xc8\\\\xd7\\\\xd1R5*\\\\x93\\\\x94\\\\xd0!\\\\xe4\\\\xc5\\\\xb9\\\\x9d7\\\\xc4O\\\\x85>\\\\xa5\\\\x02\\\\xf0\\\\xfc\\\\x95\\\\xc8\\\\xfb$i\\\\xa6U\\\\xb9\\\\xe63_IXN\\\\xeb(O$\\\\x81\\\\xec\\\\xacewm8\\\\xf8\\\\x8d&\\\\xd4y\\\\xd6\\\\xbe\\\\x0b\\\\xff\\\\x00\\\\x86\\\\xa8Z,5\\\\xc4)\\\\x85!iB\\\\x90NiZB\\\\x81\\\\xf4\\\\x1c\\\\xabV\\\\x04\\\\xe4\\\\xb7l\\\\x7f\\\\xd1\\\\xad?\\\\xdd\\\\xd1\\\\xf8S\\\\xa0xf\\\\xd7\\\\xfe\\\\xabi\\\\xfe\\\\xee\\\\x8f\\\\xc2\\\\x94U1k\\\\xff\\\\x00U\\\\xb4\\\\xff\\\\x00wG\\\\xe1R\\\\xd1l\\\\x92\\\\x84\\\\xbc\\\\x10\\\\xdbhBD\\\\xc2P\\\\x90\\\\x91\\\\xea\\\\x15_\\\\n7\\\\xf6C\\\\xe4=&\\\\xb1J\\\\x9eaA`B\\\\x8cx\\\\xd7\\\\xcc}T\\\\xa4G\\\\xa3\\\\xbe\\\\x96h\\\\xc8\\\\xef\\\\xf5R\\\\xc8\\\\x84~\\\\xe2\\\\x99\\\\x05*if\\\\x8a\\\\x93\\\\x15h\\\\x0e\\\\x91\\\\xbe\\\\x87\\\\x11\\\\xf5\\\\x9bZ}i\\\"\\\\x9d\\\\n\\\\xe2\\\\x9b2<\\\\x91\\\\x90N\\\\x89\\\\x00\\\\xd7\\\\xa7\\\\x17\\\\x9f!\\\\x87\\\\xf1\\\\xa7\\\\xb8\\\\x1fh\\\\xad\\\\xb2\\\\x19\\\\xef\\\\x06\\\\xa9\\\\xe4\\\\x16F\\\\x91\\\\xdfJ:\\\\x12\\\\x0f\\\\x85\\\\x1e\\\\x88\\\\xd5F\\\\xe9\\\\x02\\\\x01\\\\x8f\\\\x851\\\"a\\\\x92m\\\\xcc\\\\xf7\\\\xe5\\\\xea\\\\xa3z\\\\xa97M4\\\\xa6{\\\\xa2\\\\x11\\\\x07J\\\\x97,;\\\\xb2s\\\\xf8PM\\\\x073\\\\xdcr\\\\xa6\\\\xc1\\\\x0e\\\\xde\\\\xf9\\\\x08\\\\xfa[\\\\xf3\\\\xec\\\\xaa\\\\xf9HWQ\\\\xba\\\\xf8\\\\xcf<\\\\xabx\\\\xee\\\\xd8\\\\xc6~6\\\\xfaP+\\\\x9bq\\\\xe7v\\\\xac\\\\xfc\\\\xa5\\\\xb0\\\\xfb+\\\\xff\\\\x00\\\\x86\\\\x98\\\\x9a\\\\x9c\\\\x1a\\\\xdc\\\\x1bi:\\\\x92kI\\\\xb3K\\\\x02*\\\\x07\\\\x86\\\\x05H\\\\xe2\\\\xc8\\\\x8a\\\\x90v\\\\xa9\\\\x02\\\\xe0\\\\xf8V\\\\xaf\\\\x80\\\\xdfY\\\\x8f\\\\x9b\\\\xa7\\\\xd3\\\\xef\\\\xaeyy*a}\\\\xa7C\\\\xad\\\\xa7u\\\\xb7\\\\x80t\\\\x0eS\\\\xa8\\\\xf4\\\\x19\\\\x15\\\\xf3p\\\\xbd\\\\xf2e\\\\x1fW9\\\\xdbn>\\\\xc9l\\\\xf2\\\\xad\\\\xe9\\\\x8d\\\\xa5&\\\\x7f\\\\xfe\\\\xd3\\\\xa6vti\\\\xddN\\\\x99\\\\xd8\\\\x89\\\\x03.}\\\\xf5\\\\x01\\\\x122\\\\xa8%Zf\\\\xfa\\\\x01\\\\xe2b\\\\x90\\\\xe2Kt\\\\x94\\\\xa0\\\\xa0}\\\\x15\\\\x11\\\\xed\\\"\\\\xbd8\\\\xbc\\\\xf4T\\\\x8e\\\\xd3\\\\xbd\\\\xe8\\\\xf8\\\\x8a\\\\xd5\\\\x01\\\\xf1?\\\\x0c\\\\xea\\\\xf4\\\\x022\\\\x99q\\\\xb0\\\\xa3\\\\x91P\\\\x07\\\\xd7LF\\\\xc7h\\\\xeb\\\\x00\\\\xd1\\\\xce\\\\x89\\\\xaa\\\\x19+1\\\\xa7\\\\xae\\\\x99\\\\xb1b.\\\\x10>lfu3\\\\xec\\\\xa2\\\\x9f\\\\t\\\\xaa\\\\xcf\\\\x80\\\\x9a\\\\xa2c)\\\\x0b+\\\\x92rmJ\\\\xc8q\\\\x15\\\\xaa\\\\xc9\\\\x93\\\\xdec\\\\x85\\\\x04\\\\xc1\\\\xa9\\\\x9dj\\\\xe3C\\\\xc9\\\\xff\\\\x00D\\\\xf8\\\\xf2\\\\xaa\\\\x94;\\\\x82\\\\x07Zb@ \\\\xf1\\\\xd2Ek\\\\x1b\\\\xccg)\\\\xc5}(B\\\\x82\\\\xd2\\\\x14\\\\x92\\\\nH\\\\x90Eb\\\\xb4\\\\xf3\\\\x9bV\\\\xaf\\\\x9c[\\\\x8c\\\\xbfF\\\\xafx\\\\xadO\\\\t\\\\x1b\\\\x07\\\\x1f4O\\\\x89\\\\xa86B\\\\xa4\\\"iDUI\\\\x1e\\\\xdf\\\\xf5\\\\x85\\\\x9e\\\\xea\\\\xd5\\\\x11\\\\xbc\\\\xb4\\\\xca\\\\xdd\\\\x1e\\\\x15\\\\xca\\\\xf9iQ\\\\xb8\\\\xa6\\\\xee\\\\x91\\\\xe5L\\\\x14\\\\x96\\\\xddH})I\\\\x90\\\\x8d\\\\xec\\\\x96\\\\x9fB\\\\x87\\\\xa8\\\\xd7\\\\xca\\\\xf8{&\\\\xf1\\\\xf4\\\\xf3\\\\xff\\\\x00\\\\xaf\\\\xd2\\\\xbe\\\\xa6yw\\\\xe3\\\\x8es\\\\xedNhG\\\\n\\\\xf58\\\\x8e\\\\x92\\\\x07\\\\xe3P<p5\\\\x01\\\\x13\\\\xcb\\\\x9dH\\\\xf9\\\\xd3\\\\x85B\\\\xa5Y\\\\xe5t\\\\xc7\\\\xdfO\\\\xbcT\\\\x1cX\\\\xfb}]\\\\xfd\\\\xdbzn\\\\xbe\\\\xea}N+\\\\xf0\\\\xafF/=8!\\\"u\\\\x1b\\\\xc2\\\\t\\\\x9a\\\\xde\\\\x99\\\\x00\\\\x00bL\\\\xf7N\\\\x95z#\\\\x9b -$\\\\xf0P\\\\x9c\\\\xfb\\\\xea\\\\xda9\\\\x13\\\\xd6(\\\\x89\\\\x8c\\\\xe0\\\\xd5\\\\xe8v\\\\x12\\\\x84\\\\x03\\\\xce\\\\r1TL*z\\\\x85x\\\\xf1\\\\xf4P-\\\\xa9\\\\xba\\\\xf01TEh\\\\x80U$\\\\x89m@x\\\\x91\\\\xa5H2Ng\\\\xbeM$\\\\xc9\\\\x1b\\\\xdf\\\\x8d\\\\x01\\\"\\\\xd9\\\\x92\\\\xf3\\\\xed6Nn/vu\\\\x8c\\\\xb5\\\\xa5 \\\\xdf\\\\xb4Z\\\\xba\\\\xb9iA9,$\\\\x94\\\\xcck\\\\xdfN\\\\xfc3g\\\\x0f\\\\xa2\\\\xb8\\\\x1b\\\\xfdv\\\\x15lbJQ\\\\xd5\\\\xab\\\\xc59|*\\\\xbeV>\\\\x1a\\\\x8d\\\\xaa \\\\xde\\\\xb5\\\\xcc2}\\\\xf44f\\\\x12>h\\\\x8aS`\\\\x9a\\\\x81\\\\xe2\\\\x94E\\\\xe9J\\\\x02\\\\xdb7WU\\\\x11\\\\xbd\\\\xb7\\\\xc9\\\\x86\\\\xfe\\\\xe8\\\\xacV\\\\x94\\\\xa6\\\\t\\\\x81\\\\xe3\\\\x18\\\\x1d\\\\x8c\\\\xe3X\\\\xca\\\\xb1;\\\\x8cE\\\\xa4\\\\xba\\\\x94\\\\xa5\\\\xa0\\\\xd3l%9\\\\x90\\\\x94\\\\x8dw\\\\x81\\\\x19\\\\xf7W\\\\x8aI\\\\xbe&\\\\x9e\\\\xd9\\\\xa95\\\\x13\\\\xd0x\\\\x8a\\\\xd2\\\\x14\\\\x11\\\\xe8\\\\xa8QS\\\\xc3\\\\x95@D\\\\xe8hT@3\\\\xa4\\\\x0fk\\\\x95\\\\xcb\\\\'\\\\xed\\\\xa7\\\\xde*N5\\\\xc6\\\\xd3\\\\xd4\\\\xed\\\\x16.\\\\xd8>m\\\\xed\\\\xc7\\\\xa3\\\\xe5U^\\\\x8cf\\\\xdez\\\\x02Vw\\\\xd5\\\\x07 \\\\x92D\\\\xd6\\\\xb9\\\\xd3!\\\\x8d\\\\xe0\\\\x02\\\\x88;\\\\xa6`\\\\xf8TH\\\\x14&3\\\\x1cj\\\\x80\\\\xbb\\\\xc2D\\\\xf0\\\\xca\\\\xaf+\\\\xecE\\\\xa8n\\\\x1eziL(XQ\\\\x1eL\\\\xb8#%\\\\x1e\\\\x11\\\\xca\\\\x8b\\\\x12f\\\\xfac\\\\xbc\\\\xf3\\\\xaa\\\\x06o\\\\x89\\\\xd4U\\\\xa5\\\\xeaBF\\\\xf6\\\\xb5z5)\\\\x92\\\\x04\\\\x9c\\\\xb9kK\\\\'\\\\xb6V!i\\\\x82\\\\x12|b\\\\x82\\\\x88\\\\xf3\\\\x8b~\\\\xedkZ\\\\xb7\\\\x96\\\\xa7\\\\x11$\\\\xeb\\\\xe7S4\\\\xce\\\\\\\\\\\\xc7|l\\\\xbe\\\"\\\\x94\\\\x8b\\\\x9bu\\\\xa8\\\\xa7u\\\\xdd\\\\xe4\\\\xe5\\\"\\\\x08\\\\xcf\\\\xddU\\\\xbag\\\\x1f\\\\x07\\\\xed\\\\x0b\\\\xa5\\\\xcb\\\\xa6\\\\xca\\\\x88\\\\x90\\\\xc8\\\\x98\\\\xe7&\\\\x96\\\\xe0\\\\xb8_\\\\xea\\\\xa8\\\\xa9\\\\'\\\\x03P8\\\\x1aQ\\\\xae\\\\x1c\\\\xa9@\\\\xda\\\\x9e\\\\xda\\\\xcdTF\\\\xf5\\\\x89\\\\xea[\\\\xd7\\\\xcd\\\\x15\\\\x8a\\\\xd2\\\\x84\\\\xc2\\\\xf1\\\\x9ca\\\\xfcQ\\\\xb5\\\\xb5\\\\xb2\\\\x0cavE_(\\\\xfe!\\\\x88\\\\x07_\\\\xdc:\\\\xee4\\\\x89\\\\t=\\\\xc4\\\\xc5p\\\\xb5\\\\xeb\\\\x9e\\\\xcd\\\\xebr+\\\\x14\\\\x8e\\\\x91\\\\xdf\\\\xe3T\\\\x03 T\\\\x86@\\\\x11\\\\x1c(B\\\\'\\\\xbb:\\\\x83\\\\xcf\\\\xe3\\\\x1bk\\\\x81\\\\xe1\\\\x08\\\\xbc&\\\\xfd\\\\x87\\\\xef\\\\xed$y\\\\x1a\\\\t\\\\xdfS\\\\x83D\\\\xe9\\\\x1a\\\\xc4\\\\xe7F\\\\xe6\\\\xf4\\\\xdf\\\\xcb\\\\xcf[\\\\xd3\\\\x941\\\\'\\\\xdd\\\\x7f\\\\x1c\\\\xc4\\\\x1d\\\\xb9HK\\\\xef\\\\\\\\:\\\\xeb\\\\x81\\\"\\\\x00R\\\\x94U\\\\x90\\\\xe5\\\\x9eU\\\\xe9\\\\xc6\\\\xcfG\\\\x939e\\\\xd51\\\\x0b\\\\x1db\\\\x8e\\\\x87t\\\\xfb\\\\xab@\\\\xce\\\\xb0\\\\xf9\\\\xb2bI\\\\xf6T\\\\t\\\\xbd\\\\x97x\\\\xcef\\\\x9e\\\\x16\\\\x8e\\\\x90r\\\\x91=\\\\xf5z\\\\x1f\\\\xa1\\\\x15\\\\xa1\\\\xf3}\\\\xf4*\\\\x85\\\\x85\\\\x91\\\\xe4\\\\xebH\\\\x8f8\\\\xf1\\\\xf0\\\\xab\\\\xc2\\\\xd2l\\\\xaa;$\\\\x0fN\\\\xb5x\\\\xf2\\\\x08I\\\\xe1\\\\x07\\\\xd3R=\\\\xd6\\\\xd6\\\\xcb\\\\x85.\\\\x00\\\\x95@>p:\\\\x89\\\\xa3\\\\xc4!O\\\\xa3=\\\\x01\\\\x02\\\\xa8\\\\x8b\\\\xbcBs%):\\\\xe7N\\\\xd2+pn\\\\x80\\\\xe6\\\\xfbc^j\\\\xa7\\\\xd4d\\\\xed\\\\x1c.\\\\xe8\\\\xa7\\\\x11u\\\\x06HZT\\\"s$f#1\\\\x9eU\\\\x9c\\\\xfc3\\\\x87\\\\x15\\\\xb6}\\\\xe2u^\\\\xff\\\\x00d\\\\t\\\\x19s\\\\xe1V\\\\x1e\\\\x1b\\\\xad\\\\xc6\\\\x1a\\\\xbf\\\\x9a\\\\xb7\\\\xe1[\\\\t\\\\xa1u\\\\x03\\\\xc2\\\\xeaF8\\\\xac\\\\xa9AZ*B\\\\xe9\\\\xa27\\\\xc9 %;\\\\xc9\\\\x9c\\\\x84@\\\\xee\\\\xac\\\\xe8\\\\xa9\\\\xd4\\\\'J\\\\xf3=\\\\xa9H\\\\x12$\\\\x9a\\\\x10\\\\xa9<*\\\\xd0\\\\x199\\\\x19\\\\xa1\\\\n\\\\x93\\\\x1e\\\\x14&\\\\x93m\\\\xf1\\\\xa70\\\\r\\\\x96\\\\xbd\\\\xc4-\\\\xc4\\\\xbe\\\\x9d\\\\xd6\\\\x9bTN\\\\xe2\\\\x96wB\\\\xa3\\\\x8cL\\\\xd5\\\\xcd\\\\xe25\\\\x84\\\\x97.T5\\\\xb5\\\\xf5\\\\x8a|\\\\xa3\\\\xcb\\\\xad\\\\x97z\\\\\\\\l\\\\xa5\\\\x1b\\\\xce\\\\xad\\\\xa2\\\\xdb\\\\x93!\\\\xc9O\\\\x9cgPr5\\\\x9f\\\\x95\\\\x93\\\\xd9l\\\\xcb\\\\xd5\\\\xa0\\\\xbe\\\\xc3\\\\xad\\\\xae\\\\x9cS\\\\xab=\\\\xb0\\\\t\\\\xdeAR\\\\x15\\\\xa4\\\\xc4\\\\x8aq\\\\xc7\\\\xa9<Q\\\\x94\\\\xe9\\\\xe7?4xV\\\\xaf\\\\x9e\\\\xdfq]z\\\\xd2\\\\x81;\\\\xa9Q\\\\xde\\\\xe7\\\\x02k\\\\xd7~\\\\xaf\\\\x95d\\\\xdd\\\\xd3\\\\xd24\\\\xf5\\\\x9b\\\\xac\\\\xa1Av\\\\xe5gwx\\\\x15\\\\xc7\\\\x0c\\\\xeb\\\\xa7\\\\x0e7ab\\\\xeai\\\\xab\\\\x12\\\\xf5\\\\xab\\\\x88\\\\x0e\\\\x85\\\\xa4y\\\\xc1B\\\\x0e\\\\xb9Q\\\\xae\\\\x0c\\\\xbe\\\\xa8\\\\x8d]!HN\\\\xf1nr\\\\xe03\\\\xac\\\\xfd\\\\xcf;=\\\\xbb\\\\x9bu\\\\x12\\\\\\\\S`D\\\\x83\\\\xdfL\\\\x90n\\\\xb1\\\\xb5Y\\\\xb0\\\\x92\\\\x19RwI\\\\xccoS\\\\xc2\\\\x96\\\\x8d\\\\xd7Z\\\\xe5\\\\xdb\\\\x13\\\\xcfx\\\\n$[\\\\xafe\\\\x87`{\\\\x13u\\\\x87\\\\xd8\\\\xbds\\\\xb6\\\\xe6\\\\xce\\\\xe9\\\\xe6P\\\\xbb\\\\x8bw-\\\\xc7\\\\xc8\\\\xac\\\\xe4\\\\xa4g\\\\xacs\\\\xe2+]\\\\xb8\\\\xaf\\\\xcc\\\\xf2x\\\\xab6\\\\x16\\\\xb7\\\\xf7\\\\x8cY\\\\xdd\\\\xb5{n\\\\xcb\\\\xebm\\\\xab\\\\x84\\\\r\\\\xd4\\\\xbc\\\\x80`,\\\\t\\\\xcaFqY\\\\xed\\\\x86T\\\\x15\\\\xad\\\\x9d\\\\xe5nIH\\\\xe2x\\\\xd5\\\\xa1)\\\\x1ePi\\\\xe2\\\\x87\\\\x1b(XHT\\\\x13\\\\x9c\\\\x11 \\\\xeb\\\\xca\\\\rMr\\\\xf7=\\\\x10\\\\xd8a\\\\xd7X\\\\xcb\\\\x8b\\\\xbc\\\\xb4n\\\\xe5\\\\xd4\\\\x92P]\\\\x1b\\\\xc1\\\\n\\\\x02A\\\\x00\\\\xe5>4[\\\\xe8\\\\xc5^\\\\xcd]\\\\x16\\\\x1di\\\\xd9\\\\xcd*\\\\x06u\\\\xe3U\\\\x9b\\\\x8ayzP\\\\xb5\\\\x06\\\\xc9W\\\\x9d\\\\xc7\\\\xc7\\\\x8dg\\\\xa7\\\\xe1\\\\xd3//C\\\\x87+\\\\xe6\\\\xad\\\\xe7\\\\xc2\\\\xb6\\\\xcabUR\\\\x11*\\\\xa5\\\\x1a\\\\xea\\\\xb2\\\\xa6#,\\\\xfc\\\\xd5UDn\\\\xb7\\\\xd6\\\\xa8,\\\\xac\\\\x84\\\\xc4F\\\\xe09\\\\xd5\\\\xa4\\\\xa9\\\\x1a\\\\xcd\\\"+\\\\xc8\\\\xf6\\\\x8e\\\\x83\\\\x9et!:\\\\xc0\\\\x06f\\\\xa4\\\\xc5]\\\\xb6\\\\x8c\\\\xd4\\\\xa09\\\\xd6R\\\\x03\\\\xf8\\\\xfd\\\\xb2\\\\x1c\\\\xea\\\\xdbQq\\\\xd3\\\\xa2\\\\x1b\\\\x05J\\\\xf5\\\\n<y/)\\\\xd2\\\\xb5\\\\xc6)\\\\xfeF\\\\x9e\\\\xbe\\\\xc1\\\\xebk;\\\\x9b\\\\xa6\\\\x9a+z\\\\x02\\\\xa4J\\\\x93\\\\t\\\\xd72\\\\x9e\\\"\\\\xbb|>3\\\\xa9\\\\x9e\\\\xab\\\\x9f[<\\\\xbaRe\\\\x14\\\\xe1\\\\xce>Qq\\\\xf7Ez\\\\xbf\\\\xd3\\\\xcfw\\\\t\\\\xf1\\\\xd9{\\\\x13t\\\\x91\\\\x1dq\\\\x19\\\\x10e\\\\xb0~5_\\\\x87\\\\xfa\\\\xb5\\\\xfe\\\\xbb/f\\\\xba\\\\xdb\\\\x05e\\\\x84\\\\xee\\\\xb7p\\\\xa2\\\\x00\\\\xfaH\\\\x1f\\\\x8d7\\\\xa2\\\\xf3\\\\xfc\\\\xdd\\\\xa4~nA\\\\xc8\\\\xa9\\\\xa5}\\\\xe6\\\\xa8\\\\xf9W\\\\xdd|\\\\xc8\\\\x1b\\\\x98C*$\\\\x84Z\\\\x85s\\\\xea\\\\xa0\\\\xfb\\\\xa9\\\\x9d<\\\\xbd\\\\xd7\\\\xcc\\\\x94\\\\xdf\\\\xcdYD\\\\xb1\\\\xea?\\\\x85_/%\\\\xdf\\\\x08\\\\xac,\\\\x9e\\\\x16\\\\xfe3\\\\xfe\\\\x14|\\\\xbc\\\\x8f|1XZ\\\\x8c\\\\xfc\\\\x9b\\\\x06u\\\\xcf\\\\xfc)\\\\xf9y\\\\x0e\\\\xe8a\\\\xc2N\\\\x7f \\\\xc1\\\\xf0X\\\\xab\\\\xb3#\\\\xb9NN\\\\x14\\\\x80 \\\\xdb\\\\xb6\\\\x0fr\\\\x85W\\\\x1a\\\\xbb\\\\xa0\\\\x0e\\\\xe1R\\\\xac\\\\xad\\\\xd1\\\\xaf\\\\xd6\\\\x15vS\\\\xdd\\\\x03V\\\\x14G\\\\xfa8\\\\x8e\\\\xe5\\\\x0f\\\\xc6\\\\x8e\\\\xdb\\\\xeb\\\\x19\\\\xee\\\\x9e\\\\x86\\\\x8c(\\\\x05\\\\x93\\\\xe4\\\\xc7\\\\xc6r\\\\xf7\\\\xd5\\\\xdbZ\\\\xef{\\\\r\\\\x86\\\\x16\\\\xd8u\\\\xe2\\\\x0b\\\\xabE\\\\xb0\\\\x99R\\\\x94\\\\xbd\\\\xdfmf\\\\xe3}\\\\x86\\\\xfe\\\\xab\\\\x16\\\\xf3\\\\x13\\\\xb0U\\\\xbb\\\\x89g\\\\x17\\\\xb6*\\\\xdd;\\\\xb1v5\\\\xe1\\\\xc6\\\\xa9/\\\\xb2\\\\xf2\\\\xb7n\\\\xee-\\\\xae\\\\xecm1\\\\x0bd\\\\xb6\\\\xdb\\\\x17\\\\x96\\\\x8c\\\\xdd\\\\'p\\\\xf6{i\\\\x9c\\\\xa8\\\\x93\\\\\\\\:K\\\\xb9\\\\xb6\\\\xca\\\\xc9`[7\\\\x1fTT\\\\x92\\\\xc3\\\\x82\\\\xa0\\\"\\\\x1c\\\\x14\\\\xa3\\\\x1dX\\\\xdd1J>\\\\xc0\\\\xf6\\\\x0f\\\\x8dU&\\\\xb7r\\\\xad\\\\xd9\\\\x0bL\\\\x1e\\\\'9\\\\xa0*g1\\\\x06Xl\\\\x95\\\\xad)\\\\x81\\\\xa91^{\\\\x1e\\\\xcd\\\\xb5\\\\xbf\\\\xe5\\\\x07\\\\x958[\\\\xc3-\\\\xdf\\\\xbdp\\\\x1d\\\\x18A_\\\\xac\\\\xe8=u\\\\x9bd2Z\\\\x9fm\\\\x86m\\\\x06!\\\\x9b\\\\xaa\\\\xb6\\\\xc3[<\\\\x1cWZ\\\\xe7\\\\xfb)\\\\xcb\\\\xd6k\\\\x17?f\\\\xbb\\\\x1b{=\\\\x91\\\\xb1J\\\\x82\\\\xf1\\\\x0b\\\\x8b\\\\xbb\\\\xf5\\\\xf1\\\\x0b_V\\\\xdf\\\\xfb)\\\\xf8\\\\x9a\\\\xcd\\\\xb6\\\\xb51\\\\x91\\\\xe9,m\\\\xad\\\\xec\\\\x9b\\\\xdc\\\\xb2\\\\xb6f\\\\xd9\\\\x1c\\\\x9a@L\\\\xfax\\\\xd6t^\\\\x17\\\\xa7\\\\x94\\\\xcfG\\\\xbb\\\\xe7=\\\\xccB\\\\xdd^\\\\xbd\\\\xe1\\\\xf1\\\\xafO\\\\xc2~\\\\xf1\\\\xe5\\\\xf8\\\\xbf\\\\xdd\\\\xb9\\\\xe6u\\\\xe0\\\"\\\\xbe\\\\x93\\\\xe7\\\\x14\\\\x1f\\\\x0f\\\\x0eT\\\\x89tp\\\\'_\\\\x8d\\\\x06\\\\x1c\\\\x0epO\\\\xb2\\\\xa4t\\\\xcf\\\\x1f\\\\n\\\\xb4Xg\\\\x85D\\\\x84\\\\x98\\\\x9c\\\\xc7\\\\xa6\\\\xa0BH\\\\xa8\\\\x10\\\\x9c\\\\x8dD\\\\xc9\\\\xce8\\\\xd4u\\\\xeaI\\\\xf5\\\\xd0vf\\\\xb9\\\\x8a\\\\x845Yhc\\\\x84T\\\\xb6\\\\x90\\\\xd6\\\\x1a\\\\xe3\\\\xb8{\\\\x97n]Z2\\\\x95Jm\\\\x9b=\\\\xb58\\\\xb1\\\\xae\\\\xf4y\\\\xa3\\\\\\\\\\\\xf3\\\\x88\\\\xcf\\\\xbf\\\\x86}~\\\\xdc\\\\xb5#\\\\xbe=\\\\x1e\\\\xe9\\\\xdd\\\\xb6\\\\xb1\\\\xc8\\\\tY\\\\xddI \\\\x1d3\\\\x1e\\\\x83\\\\xcb\\\\xbe\\\\xbb\\\\xe3w%p\\\\xb3WN\\\\xab#\\\\xf3/D8&7v\\\\x10l,0;\\\\'\\\\x1cJ;K\\\\x84\\\\xb6\\\\x99\\\\x84\\\\x98\\\\x073\\\\xccW\\\\x9b9\\\\xbc\\\\xab\\\\xbfN\\\\xeb\\\\x18\\\\xf6\\\\x168U\\\\xea\\\\xadZq\\\\xb2\\\\xce\\\\xe3\\\\x89\\\\x0e\\\\tp\\\\xcc+>#\\\\xbe\\\\xb38\\\\xe1\\\\xae\\\\xed\\\\xf2\\\\x960\\\\xab\\\\xeeM\\\\x1f\\\\xfb\\\\xcav\\\\x8e\\\\x18]\\\\xef\\\\xd5G\\\\xa1b\\\\xae\\\\xe4\\\\x05\\\\xdd\\\\x8d\\\\xdd\\\\xbd\\\\xbb\\\\x8f\\\\xba\\\\x81\\\\xd56\\\\x92\\\\xb5\\\\x90\\\\xa0`\\\\x0c\\\\xc9\\\\x8afKO+\\\\xb2\\\\x18\\\\xdd\\\\x95\\\\xd0\\\\xb9\\\\xc5[\\\\xda?-\\\\xc3\\\\xafR|\\\\x91\\\\x0baL\\\\xa5\\\\x00\\\\x13\\\\x98\\\\xde\\\\x00\\\\x93\\\\xa8\\\\x9e M\\\\x17,g\\\\x0b\\\\x9a}\\\\xb6(\\\\xe2\\\\x1a\\\\tN\\\\xf2\\\\xe3\\\\x8c\\\\xcf\\\\xb5\\\"\\\\x0f\\\\x8dq\\\\xef\\\\xad\\\\xf6\\\\xc7\\\\x9e\\\\xb7\\\\xd9\\\\xfc1\\\\x95%n0n\\\\xdd\\\\x99\\\\xdf\\\\xb9Q^~\\\\x1a{+\\\\x85\\\\xce\\\\xe4\\\\xf6Ldo\\\\xd8X-\\\\x04 \\\\x04$e\\\\xb8\\\\x91\\\\x00z\\\\x05e\\\\xa4\\\\x86\\\\xcc\\\\x1a\\\\x82b\\\\x15 T\\\\x92\\\\x1b4\\\\'\\\\x87\\\\xe9\\\\xc0\\\\x05ti~~\\\\xa5\\\\xcd\\\\xb2\\\\xff\\\\x00\\\\xac\\\\x03\\\\xe3^\\\\x8f\\\\x85\\\\xbf\\\\xee\\\\xcf\\\\xd7\\\\xfa<\\\\xff\\\\x00\\\\x15?\\\\xdb\\\\xb5\\\\xce\\\\x13\\\\xcf\\\\xdf_Q\\\\xf2\\\\xfd\\\\x0e\\\\x1aiQ\\\\xd1\\\\xe3N4\\\\x1dh\\\\xe8\\\\xce8x\\\\xd5\\\\xb5\\\\x0e\\\\x139MGLW\\\\x85H\\\\xd5P\\\\xa9\\\\x84\\\\xf2\\\\xe3HaV\\\\xbd\\\\xd5\\\\x1d\\\\xd3w\\\\xa0\\\\xe9\\\\xfe5X\\\\xa1\\\\t\\\\xcb*\\\\t\\\\xa7>\\\\xf1P\\\\xfb\\\\x1aj \\\\xba\\\\x94\\\\xab\\\\xceJO\\\\x88\\\\xce\\\\xaf\\\"\\\\xda\\\\x0b\\\\xf9\\\\xb4\\\\xe0\\\\xd3\\\\xb2}\\\\xc6\\\\x91\\\\xe2:\\\\x1b\\\\xa4}\\\\xace\\\\x8f\\\\xc9\\\\xcdVO[-\\\\xb5\\\\xb9\\\\x85ZZ!A`\\\\x82\\\\xa2\\\\x11\\\\xdd\\\\xc8\\\\x13^Kw\\\\x95z0\\\\xf1\\\"\\\\xdd\\\\xd9\\\\xfd\\\\xa3f\\\\xfd\\\\xcb+T[8\\\\xdfYn\\\\x95%eiRd \\\\x18\\\\xe7\\\\xa4\\\\xe7\\\\xddY\\\\x97fp\\\\xf4At\\\\xa2\\\\x85\\\\xf1\\\\x00\\\\x93\\\\xc8q\\\\xa0\\\\xbc>\\\\xd5m\\\\xe6\\\\x1do\\\\xb1\\\\xf8\\\\xc5\\\\xd3\\\\xcc]\\\\xb4\\\\x13f\\\\xe9\\\\x95\\\\x04dJH\\\\x1a+\\\\x99\\\\x15K\\\\xce\\\\x8c\\\\xf2\\\\xd2\\\\xf4\\\\'\\\\x8b\\\\xe1\\\\xaete\\\\xb1\\\\xf8U\\\\xd5\\\\xba\\\\xd6\\\\xa5Z\\\\x84\\\\x02\\\\xe3i[{\\\\xd2\\\\xae3\\\"N\\\\x99q\\\\xa2\\\\xd9\\\\xbd3<=\\\\xbb\\\\xfb/\\\\x86\\\\xb8\\\\xb0[7,$\\\\x08\\\\xdci\\\\xd2\\\\x12=\\\\x04\\\\x1a.\\\\x11\\\\xbd\\\\xd79tw\\\\xd2cx\\\\x92\\\\xd9\\\\xc2\\\\xb6\\\\x99\\\\xd6\\\\xd8\\\\xc4\\\\x15\\\\x08f\\\\xf9P\\\\x86\\\\xae\\\\x0f\\\\x04\\\\xb9\\\\xc1\\\\x0b<\\\\xfc\\\\xd5w\\\\x1dy\\\\xe7\\\\xd2\\\\xd78\\\\xbd8u{\\\\xb8\\\\xbeV\\\\xbaB\\\\xd9Y\\\\x0e%A@\\\\xc1\\\\x04i\\\\\\\\]S\\\\x13\\\\x04\\\\x024\\\\xa1$2\\\\xbe\\\\x06\\\\xa4\\\\x98\\\\xca\\\\x16\\\\xac\\\\xc2Ls9T\\\\x9eG\\\\xa6F\\\\t\\\\xe8\\\\xc7\\\\x1cQVh\\\\x0c\\\\xae\\\\x00\\\\xe4\\\\xf2+\\\\xb7\\\\xc3\\\\xfe\\\\xf7\\\\x17\\\\x0f\\\\x89\\\\xfd\\\\xd5s9\\\\x1e\\\\xff\\\\x00\\\\x1a\\\\xfa\\\\xaf\\\\x95\\\\xa3\\\\xc2r\\\\x102\\\\xa1\\\\xae\\\\x04\\\\t\\\\xf1\\\\xa3d\\\\xe0\\\\x90\\\\x0esJ\\\\xd1c\\\\x9eT&NS\\\\x99\\\\xa8\\\\x84\\\\xb3\\\\x94zj\\\\x17\\\\x98\\\\x1a\\\\x8c\\\\x1dMh\\\\x1aU\\\\xacQ\\\\xa4@}DgU0\\\\xa0\\\\xf2\\\\xcf\\\\xc2\\\\x83\\\\xb6\\\\x03\\\"\\\\x8b\\\\xc9\\\\x84?\\\\nF\\\\x83sOeCH\\\\xd7=\\\\x86\\\\x1dV\\\\xe80\\\\x82c\\\\x9eT\\\\xab\\\\x1d7\\\\x8atk\\\\xf9\\\\xdfd\\\\xadp\\\\xcb\\\\xfd\\\\xa2\\\\xbbU\\\\x9b\\\\x8c2J\\\\x05\\\\x93;\\\\xc9\\\\x84\\\\xa4\\\\xa4\\\\x05e\\\\xa6\\\\\\\\+\\\\xc3k\\\\xd51\\\\xe1\\\\xeb\\\\xb0\\\\x9d\\\\x99\\\\xbe\\\\xb2\\\\xbe\\\\xb1\\\\xb8\\\\xfc\\\\xfe\\\\x87\\\\x11n\\\\xe2T[\\\\xfc\\\\xdc\\\\x84\\\\x17\\\\x12\\\\x04n\\\\xef\\\\x05\\\\xe5#\\\\x88\\\\x14\\\\r=\\\\x9f^)\\\\xd9\\\\xd1\\\\xe9{9\\\\x1a\\\\x8a\\\\xb6\\\\xb4\\\\xf0\\\\x1bY\\\\xb0W\\\\x18\\\\xd38\\\\xa5\\\\xbbX\\\\xc5\\\\xb5\\\\xb5\\\\x8d\\\\xe8P\\\\r*\\\\xc9KSAZ\\\\x80\\\\xa0\\\\xb0\\\\x0ert\\\\xac\\\\xdb\\\\xce\\\\xda\\\\x98\\\\xa2`]\\\\x1c\\\\xe2\\\\xb86\\\\x03g\\\\x86\\\\xd8c\\\\x18j\\\\xd3j\\\\xd0m\\\\xb7Wd\\\\xe2U \\\\xc8Q\\\\x01\\\\xc8\\\\x99\\\\xaa\\\\r-\\\\x16C\\\\x9dK}yB\\\\x9e\\\\xdd\\\\x1b\\\\xe5\\\\x00\\\\x84\\\\x95Fq\\\\xdd4\\\\xad>m\\\\xbdz\\\\xd9J\\\\x86JI\\\\x99\\\\x11\\\\xaduai\\\\xf4_\\\\xd2\\\\xeb\\\\x98:Y\\\\xc2\\\\xb6\\\\xa5\\\\xc7np\\\\x84\\\\xc2\\\\x19\\\\xbc\\\\x82\\\\xb7\\\\xac\\\\xc7\\\\x00\\\\xae.6?\\\\xdaH\\\\xd2FU\\\\xc7\\\\xa9\\\\xd3\\\\xdf8\\\\xbd=>\\\\xb7\\\\xa6N\\\\x98\\\\xc3\\\\xedZ\\\\xb9\\\\xb4f\\\\xe5\\\\xab\\\\x96.-\\\\x9eHq\\\\xa7XPZ\\\\x1cI\\\\xd1IP\\\\xc8\\\\x83^[\\\\xb8\\\\xf4&4\\\\xcbM\\\\x1f\\\\x93F|\\\\xcef\\\\xa44\\\\xd5\\\\xa4\\\\xf2}+\\\\xb7\\\\xd6tk\\\\xb4i\\\\xe5k\\\\xbd\\\\xeaZO\\\\xc2\\\\xbat8\\\\xeab\\\\xe3\\\\xd7\\\\xfd\\\\xdds\\\\tl\\\\xefO}}W\\\\xcc\\\\x90\\\\xe0\\\\x8c\\\\xb2\\\\xe1\\\\xa5\\\\x06rp\\\\xc8\\\\xfe\\\\xf9\\\\xd0X\\\\x06|\\\\xeb[\\\\xe1h\\\\xe3\\\\x90\\\\x99\\\\x81\\\\xef\\\\xa1SN\\\\xa7\\\\x9f\\\\xbe\\\\x94\\\\x12\\\\xb4\\\\x1aT\\\\x02)\\\\xe1N\\\\xc1\\\\nr9\\\\x1f][V\\\\x1b\\\\xc7I\\\\xa2\\\\xa2\\\\x93\\\\xc0\\\\x1a\\\\x1a\\\\x8c\\\\xe6EJ0\\\\xf7\\\\xebR1GL\\\\xfdu\\\\x00.RUn\\\\xe8\\\\xe6\\\\x93V\\\\xfdN\\\\x9d\\\\x9a\\\\xab\\\\x82\\\\x86m\\\\xd1\\\\xc1-6\\\\x9fR@\\\\xaf\\\\x9f\\\\xb7\\\\xb6D\\\\xc6\\\\xae\\\\xfb\\\"\\\\r;\\\\x1aHj\\\\xe2|j\\\\xd8\\\\xd2[n\\\\x93\\\\xce\\\\x8d\\\\x9d\\\\x0c\\\\xa3)\\\\xce\\\\xa8R\\\\xad\\\\x89 \\\\x01\\\\x99\\\\xadFj\\\\xbf\\\\xdaN\\\\x9b\\\\xb6\\\\x17g\\\\xf1gp\\\\xdb\\\\xccYo\\\\xdc\\\\xb3\\\\x93\\\\xa6\\\\xcd\\\\x85>\\\\x84+\\\\x8aJ\\\\x93\\\\x96\\\\xf0\\\\xe28V\\\\xb5Wm\\\\xf5pP$\\\\x13\\\\xcf\\\\xdf]>\\\\x8eg\\\\xa5Pu?\\\\xbf\\\\n\\\\x0cX\\\\xbd\\\\x15t\\\\xa7\\\\x8a\\\\xec\\\\x15\\\\xe0\\\\xb7!w\\\\xd8\\\\x03\\\\xaa\\\\xde~\\\\xc1k\\\\xf3\\\\t\\\\xfam+\\\\xe8/\\\\xfa*\\\\xe3\\\\xc0\\\\x8cg\\\\xd3\\\\xee\\\\xe5\\\\xd7\\\\x0e\\\\xa7o\\\\x1e\\\\x9f\\\\xe7\\\\xf9\\\\xaf\\\\xe8\\\\xeb\\\\x9d\\\\x96\\\\xc7\\\\xb0\\\\x9d\\\\xaa\\\\xc1Z\\\\xc5\\\\xb0\\\\x0b\\\\xc4\\\\xddY8wI\\\\x88[K\\\\xe2\\\\xdb\\\\x89\\\\xd5*\\\\x1c\\\\x8e\\\\xba\\\\x82Fu\\\\xe5\\\\xcb\\\\x1b\\\\x8d\\\\xd3\\\\xd3.\\\\xdb^\\\\xac\\\\xf0\\\\xac\\\\x96\\\\xa7kp\\\\xc7q}\\\\x97\\\\xc5\\\\xb0\\\\xc6\\\\x94\\\\x86\\\\xdd\\\\xbc\\\\xb6[([\\\\x93\\\\xba\\\\x95\\\\x1d\\\\t\\\\x8c\\\\xe3*\\\\xde\\\\x17\\\\xb7)}\\\\x98\\\\xcf\\\\x1e\\\\xeclsV#\\\\xb2\\\\xf8\\\\xd5\\\\x8d\\\\xc3\\\\xad+\\\\n\\\\xbc\\\\x7fp\\\\x91\\\\xd6\\\\xb0\\\\xc2\\\\x94\\\\x85w\\\\x83\\\\x03*\\\\xf7\\\\xe3\\\\xd7\\\\xc7/]<7\\\\xa3\\\\x94\\\\xe1\\\\xaf^\\\\x1d\\\\x88\\\\xa0\\\\xfc\\\\xa6\\\\x15\\\\x89\\\\'\\\\xc6\\\\xd5T\\\\xce\\\\xae7\\\\x8d\\\\xb3\\\\xd9\\\\x97\\\\xb0+b\\\\xe1\\\\x1f\\\\xa4\\\\xb3\\\\xbbO\\\\xdea\\\\x7f\\\\x85k\\\\xe6Ou\\\\xd9BQ\\\\xdd\\\\x9d\\\\xe4:<[W\\\\xe1O|\\\\xa3\\\\xb2\\\\xc3\\\\x0b\\\\xed\\\\x82w\\\\x95\\\\x1e)#\\\\xe1N\\\\xc7i\\\\xbeP\\\\xcc\\\\xfe\\\\x95\\\\x1e\\\\xba\\\\xa5]\\\\xba4\\\\xba\\\\xd1\\\\x07\\\\xe5Q\\\\xeb\\\\x15mh\\\\xde\\\\xb1\\\\xb2rq\\\\x07\\\\xf9\\\\xc2\\\\x9d\\\\x8d3y\\\\x04F\\\\xfa\\\\x7f\\\\xda\\\\x14mh\\\\xd3\\\\x13\\\\xa8\\\\xcf.umv\\\\x90\\\\xf0\\\\xee\\\\xef\\\\xabgFq\\\\xf6EI\\\\x84\\\\xd4\\\\x08\\\\xa3\\\\x96S\\\\xaf*\\\\x8e\\\\xcc#x$\\\\x123RS\\\\x9fy\\\\x8a8\\\\x89\\\\xd7\\\\xf7 \\\\xf5\\\\x91\\\\xcb/ex\\\\xa3\\\\xd9\\\\xb4\\\\x8bv\\\\x9c vLw\\\\xd1\\\\xb5\\\\xa6\\\\xc5\\\\x86\\\\xcau\\\\xf5Q\\\\xb3\\\"[d\\\\x81B\\\\xd3Q\\\\xb6\\\\x1b[\\\\x82\\\\xecv\\\\x17\\\\xf9\\\\xc3h\\\\xef\\\\xd1h\\\\xc9\\\\xc9\\\\xb6\\\\xfc\\\\xe7_<\\\\x9b@\\\\xcdG\\\\xbfA\\\\xc4\\\\x8a\\\\xd4\\\\x96\\\\xf8NZ\\\\xe9;\\\\xa7,ok\\\\xc3\\\\xb8~\\\\x0f\\\\xd6`\\\\xd8\\\\x12\\\\xe5%\\\\xa6\\\\xd7\\\\xf2\\\\xf7\\\\t\\\\xff\\\\x00Z\\\\xb1\\\\xa0?Q9g\\\\x04\\\\x9a\\\\xe98b\\\\xe5\\\\xaf\\\\xd9U\\\\ty)BD&#!\\\\x11Gn\\\\xd9\\\\xbak\\\\x81\\\\xd4\\\\x1a\\\\xe9\\\\xb6D\\\\x07\\\\x89\\\\x99\\\\xab\\\\x80 \\\\xe1\\\\x94\\\\xe7\\\\xfb\\\\xc5\\\\x17\\\\x92\\\\xf4;\\\\x0f\\\\xb6\\\\x18\\\\xce\\\\xc5c#\\\\x12\\\\xc0n\\\\x83n\\\\x10\\\\x12\\\\xeb+\\\\x1b\\\\xcd\\\\\\\\$}\\\\x07\\\\x11\\\\xf4\\\\x87~DND\\\\x1a2\\\\x93)\\\\xcbXeq\\\\xae\\\\xc5\\\\xe8\\\\xc7\\\\xa4\\\\\\\\\\\\x1b\\\\xa4\\\\x0c5Na\\\\xe4Z\\\\xe2l\\\\xa3~\\\\xeb\\\\x0eu`\\\\xb8\\\\xd0\\\\xd0\\\\xa9\\\\'\\\\xe9\\\\xb7?Hi\\\\x94\\\\x81^l\\\\xbaw\\\\x17\\\\xab\\\\x1c\\\\xa5\\\\x9b\\\\x9f\\\\xe7\\\\xf9\\\\xfc\\\\xff\\\\x00\\\\x94\\\\xf6\\\\x93\\\\x95a\\\\xa3w\\\\x8f\\\\xd6>\\\\xba\\\\xb4\\\\x99\\\\xbc~\\\\xb1\\\\xa3Kd&u\\\\x8fH\\\\xabH\\\\xd5!\\\\x07V\\\\xd0|R)\\\\xd0\\\\rV\\\\xb6\\\\xca\\\\xf3\\\\xad\\\\xed\\\\xcf\\\\x8bI?\\\\n\\\\x90+\\\\xc2\\\\xb0\\\\xe5\\\\xf9\\\\xf8}\\\\x92\\\\xbcXG\\\\xe1H\\\\xd4\\\\xf6\\\\x01\\\\xcd\\\\x9f\\\\xc1\\\\x97\\\\xe7\\\\xe1\\\\x18y\\\\xf1\\\\xb7G\\\\xe1N\\\\xef\\\\xba\\\\xed\\\\xc7\\\\xd9\\\\x1d{)\\\\xb3\\\\xeb\\\\xf3\\\\xf0<0\\\\xff\\\\x00\\\\xe1\\\\xd3\\\\xf8U\\\\xdd\\\\x97\\\\xb8\\\\xed\\\\xc7\\\\xd8\\\\x076\\\\'e\\\\xd7\\\\xe7`\\\\x18f\\\\x7f\\\\xeaE=\\\\xd9{\\\\x8e\\\\xcc}\\\\x91\\\\x97\\\\xd1\\\\xf6\\\\xc9/]\\\\x9f\\\\xc3\\\\xe7\\\\xb9\\\\x11\\\\xf1\\\\xab\\\\xe6g\\\\xee\\\\xbe^\\\\x1e\\\\xc8\\\\xcetm\\\\xb1\\\\xca\\\\x19\\\\xe0\\\\x16\\\\x83\\\\xc3x|j\\\\xf9\\\\x99\\\\xfb\\\\x9f\\\\x95\\\\x87\\\\xb22\\\\xfa.\\\\xd8\\\\xe5i\\\\x824<\\\\x1cX\\\\xf8\\\\xd3\\\\xf33\\\\xf7\\\\x1f+\\\\x0f`W\\\\xd1^\\\\xc7\\\\x9c\\\\xbf5\\\\x11\\\\xe0\\\\xfa\\\\xc7\\\\xc6\\\\xaf\\\\x9b\\\\x9f\\\\xb8\\\\xbd,=\\\\x80WD\\\\xbb \\\\xa8\\\\xff\\\\x007\\\\xbc<.W\\\\xf8\\\\xd3\\\\xf3s\\\\xf7\\\\x1f\\\\'\\\\x0fd\\\\x9c/\\\\xa2\\\\xdd\\\\x97\\\\xb1\\\\xbcf\\\\xe1\\\\x8b7\\\\n\\\\xdbPP\\\\x0e\\\\xba\\\\\\\\N\\\\\\\\\\\\xc1\\\\xc8\\\\xd5\\\\xf3s\\\\xb3V\\\\x8f\\\\x95\\\\x8c\\\\xf0\\\\xf7\\\\xa6\\\\xcd\\\\xa4\\\\x12R3\\\\xe6s\\\\xa7kB\\\\x04@\\\\x8a\\\\tR59\\\\x00\\\\x04\\\\x92r\\\\x00s5%)\\\\xd2\\\\x7fO\\\\xb8f\\\\x00^\\\\xc3v<3\\\\x8bb\\\\x89\\\\x94\\\\xae\\\\xedY\\\\xdb0~\\\\xcc~\\\\x90\\\\xf8v{\\\\xce\\\\x95\\\\xd2a\\\\xbek9Y\\\\x8f\\\\x0e_\\\\xda\\\\x0c{\\\\x13\\\\xda,U\\\\xdcK\\\\x1c\\\\xbe~\\\\xfa\\\\xf9\\\\xdf9\\\\xe7\\\\x95&8\\\\x04\\\\x8d\\\\x12\\\\x9e\\\\xe1\\\\x95t\\\\x93^\\\\x1c\\\\xeeW.kZVbI\\\\xf1\\\\xa83x\\\\xf7eW\\\\x03\\\\x90\\\\xa7<\\\\xe9V\\\\x08\\\\x83R\\\\x83 I\\\\xe1\\\\xeb\\\\xab{\\\\xa4\\\\x873?\\\\xb8\\\\xa0&ax\\\\x85\\\\xe6\\\\x15\\\\x88\\\\xdb\\\\xdf\\\\xe1\\\\x97.\\\\xda_[9\\\\xbe\\\\xd3\\\\xed(\\\\xa5m\\\\x9e`\\\\x8e\\\\xec\\\\xa3\\\\x8e\\\\x95qZ\\\\xdd\\\\x97q\\\\xd5}\\\\x10\\\\xf4\\\\xcfi\\\\xb5~O\\\\x83\\\\xed)b\\\\xc3hL!\\\\xb7rC\\\\x17\\\\xa7\\\\x84pC\\\\x87\\\\xea\\\\xe8O\\\\x9b\\\\x13\\\\xbb\\\\\\\\3\\\\xe9\\\\xeb\\\\x98\\\\xef\\\\x86}\\\\xde\\\\'\\\\xf9\\\\xf4\\\\xff\\\\x007\\\\xfd\\\\xad\\\\xe5\\\\x12\\\\x92A\\\\x04\\\\x10`\\\\xcf:\\\\xe4\\\\xe9+\\\\x02\\\\xaaE\\\\n\\\\xa93z\\\\x94Y\\\\xa1\\\\x15\\\"H\\\\x03S\\\\x95I]\\\\xe2=,`\\\\xd6\\\\x18\\\\xb5\\\\xe5\\\\x8b\\\\x98~\\\"\\\\xe8\\\\xb6yL\\\\x97\\\\x99Se+)0H\\\\x04\\\\x83\\\\x13\\\"\\\\xbaN\\\\x9d\\\\xd6\\\\xc6\\\\xe4\\\\xf3Nk\\\\xa5\\\\xbd\\\\x99\\\\\\\\u\\\\x8db\\\\xec\\\\xfd\\\\xebP\\\\xaf\\\\xec\\\\xa8\\\\xd5\\\\xf2\\\\xb2;\\\\x9e\\\\xe9mt\\\\xa1\\\\xb2\\\\x0e\\\\t8\\\\x9b\\\\xed~\\\\xd6\\\\xcd\\\\xd1\\\\xee\\\\x06\\\\x8f\\\\x97\\\\x97\\\\xb2\\\\xe3\\\\xdd-\\\\xae\\\\x906E\\\\xd3\\\\t\\\\xda\\\\x1b\\\\x14\\\\xfd\\\\xfd\\\\xf4{\\\\xd3Gf^\\\\xcbOAcym\\\\x88Y\\\\xb5wap\\\\xd5\\\\xcd\\\\xab\\\\xa3y\\\\xb7\\\\x9aV\\\\xf2V&2>\\\\x8a\\\\xca\\\\xb3^G\\\\x8a\\\\x91\\\\xa55\\\\x06n\\\\nQ\\\\xc9M!$\\\\x9c\\\\xabL<\\\\xd6\\\\xddm\\\\xae\\\\x03\\\\xb1\\\\x18w\\\\x95\\\\xed\\\\r\\\\xe8ik\\\\x04\\\\xb3j\\\\xdfi\\\\xf7\\\\xfe\\\\xe29}\\\\xa3\\\\x03\\\\xbe\\\\x99-\\\\xf0~\\\\xb5\\\\xc9\\\\xfd(\\\\xf4\\\\xc7\\\\x8fm\\\\xb9v\\\\xc9\\\\x92p\\\\xbc\\\\x06`Y0\\\\xbe\\\\xd3\\\\xa3\\\\x9b\\\\xab\\\\xd5^\\\\x19\\\\'\\\\xbb\\\\x8du\\\\xc7\\\\x19\\\\x1c\\\\xb2\\\\xcf\\\\xd2+\\\\x19\\\"\\\\x06U\\\\xa6\\\\t0*L9eBd\\\\x8e4\\\\x82Nd\\\\n\\\\x91RH\\\\x19\\\\xe9V\\\\xc8\\\\xc0\\\\xe5\\\\xa9\\\\xc8\\\\xd3\\\\xb5\\\\xe8p9\\\\x899\\\\x9e\\\\\\\\\\\\xa8\\\\xf2\\\\xbc\\\\x1e\\\\x95r\\\\x83\\\\xc0\\\\xf7\\\\xd3\\\\xa8|\\\\x94\\\\x84\\\\xa90s\\\\x07,\\\\xfch\\\\x0b\\\\xef\\\\xa2.\\\\x9b\\\\xdd\\\\xc3\\\\xc38.\\\\xdc<\\\\xbb\\\\x8b\\\\x10\\\\x02\\\\x18\\\\xc53[\\\\xacF[\\\\xae\\\\xf1Z>\\\\xd7\\\\x9c\\\\x9f\\\\xb44\\\\xe5\\\\x96\\\\x1b\\\\xf0\\\\xed\\\\x8fR^/\\\\xf9\\\\xfe{\\\\xff\\\\x00\\\\xcf\\\\xbb\\\\xa4\\\\x9a[o2\\\\xd3\\\\xcc:\\\\xd3\\\\xcc:\\\\x80\\\\xe3n\\\\xb4\\\\xa0\\\\xb48\\\\x82$)*\\\\x19\\\\x10y\\\\x8a\\\\xe1ev;:\\\\x91\\\\xc1&\\\\x90p\\\\x15\\\\x14\\\\x1d\\\\xa1\\\\xc4\\\\xd3\\\\x83`8\\\\x8e$\\\\xb8\\\\xf9\\\\xab\\\\nq3\\\\xc5Q\\\\t\\\\x1e\\\\xb2*\\\\x93|)\\\\xe5\\\\xce\\\\x18\\\\r\\\\xba\\\\\\\\\\\\xb2u\\\\xdb\\\\x96\\\\xd0\\\\xf2\\\\xddp\\\\x0e\\\\xdaA\\\\x93\\\\xa9#\\\\x91\\\\x92k\\\\xbeWWPNy\\\\xa9\\\\xea\\\\xc3\\\\xac\\\\xdcR\\\\xfein$\\\\x9d\\\\xd2\\\\x04NYe#\\\\xf7\\\\xf1\\\\xacn\\\\x9e\\\\xd8\\\\x12\\\\xb0\\\\x9b.\\\\xca|\\\\x9c\\\\x03\\\\xbf\\\\xafX\\\\xa4\\\\xc8\\\\x8d5\\\\xcbCOu\\\\x1d\\\\xb1\\\\xe7\\\\xb1f\\\\x9b\\\\xb6}]BJ\\\\x10\\\\x94\\\\x95\\\\x00T\\\\xa5H\\\\xe0s\\\\xf8\\\\x18\\\\xae\\\\xb3u\\\\x9b9t\\\\xbe\\\\xc4Y\\\\xf9\\\\x06\\\\xc6`v\\\\xc4AE\\\\x9bd\\\\xe5\\\\xc4\\\\x8d\\\\xe3\\\\xef\\\\xaf/\\\\x9bkm\\\\xe0\\\\xa8RT\\\\x89V\\\\xd1\\\\x1cR\\\\x1ae\\\\xc7\\\\x9eq\\\\r2\\\\xdaw\\\\xd6\\\\xe3\\\\x8a\\\\tJ\\\\x125$\\\\x9c\\\\x80\\\\xad\\\\x0f>\\\\x14GI\\\\xff\\\\x00\\\\x94%\\\\x9d\\\\x87]\\\\x86\\\\xec E\\\\xe5\\\\xd8\\\\x94\\\\xaf\\\\x13u2\\\\xd3|\\\\xfa\\\\xa4\\\\x9f<\\\\xfd\\\\xa3\\\\x97\\\\x8dt\\\\x98z\\\\xd7<\\\\xb2\\\\x98\\\\xf1\\\\xe6\\\\xb9\\\\x9f\\\\x17\\\\xc4\\\\xef\\\\xb1\\\\x8cE\\\\xeb\\\\xfcV\\\\xed\\\\xfb\\\\xcb\\\\xd7\\\\x8e\\\\xf3\\\\x8f>\\\\xbd\\\\xe5+\\\\xd7\\\\xc3\\\\xbbJ\\\\xe8\\\\xe5\\\\x95\\\\xb7\\\\xca\\\\x191\\\\xca\\\\x9d3HO/E\\\\x0b\\\\xcb5\\\\xf4\\\\xd3\\\\xb2\\\\xcc\\\\xa2(L\\\\x03.5\\\\x06\\\\x11\\\\x9e\\\\x82\\\\xa2v\\\\xa3\\\\\\\\\\\\xb9\\\\x11\\\\xad^\\\\x17\\\\x92\\\\x82f\\\\x91\\\\xb3\\\\xc2\\\\xb4\\\\xe5O\\\\x88}O&39\\\\x1e&(\\\\x9c\\\\xf0\\\\xb8\\\\x85\\\\n\\\\x10g\\\\xd1Z\\\\x02\\\\xcc\\\\x80s\\\\xcf\\\\x89\\\\x14iJ\\\\xb1\\\\xfa(\\\\xe9W\\\\x13\\\\xd8G\\\\xd1f\\\\xea\\\\x17\\\\x88l\\\\xfa\\\\xd6K\\\\xb6*T\\\\x16\\\\x899\\\\xad\\\\x95\\\\x1f5\\\\\\\\J|\\\\xd5q\\\\x83\\\\x98\\\\xc6Xn:\\\\xe1\\\\x9e\\\\xb8\\\\xae\\\\xb6\\\\xd9\\\\x9c\\\\x7f\\\\x0b\\\\xda|\\\\x19\\\\xacW\\\\x02\\\\xbcE\\\\xdd\\\\x93\\\\x87t\\\\xa8d\\\\xa6\\\\xd7\\\\xc5\\\\x0bN\\\\xa8P\\\\xe4|D\\\\x8c\\\\xeb\\\\xcf\\\\x94\\\\xb8\\\\xde]\\\\xe5\\\\xdbl(,\\\\x9a\\\\x92\\\\xb2\\\\xe9\\\\xdf\\\\x17M\\\\xae\\\\xce\\\\xd9aiX\\\\x0e_?\\\\xd6,O\\\\xf1m\\\\xe7\\\\xedQ\\\\x1e\\\\xaa\\\\xdfNn\\\\xec^\\\"\\\\xa2\\\\xb4\\\\xc6\\\\x1d\\\\xb7\\\\xb6C(i\\\\x05)\\\\xcc\\\\x10H3\\\\xce\\\\xba\\\\xdc7\\\\xc8\\\\xeeHV>T\\\\x95\\\\x85[\\\\x94\\\\xa9I\\\\x03y+\\\\x06\\\\x0f8\\\"\\\\x08\\\\xee5v\\\\x1e\\\\xe8\\\\x8a\\\\xde5z\\\\x84\\\\xc4\\\\xb0\\\\xa1\\\\xa4)\\\\xa1\\\\x1e\\\\xca{ \\\\xee\\\\xa8o)W\\\\xf7Q\\\\xb8\\\\x84\\\\xb9p\\\\xb4\\\\xa0\\\\x86\\\\xd3\\\\xba\\\\t$&c\\\\x99\\\\xa7\\\\xc4[\\\\xddu\\\\xba\\\\x1aK-\\\\xa1\\\\x94\\\\x8e\\\\xcbiJ\\\\x00\\\\xf0\\\\x00|+\\\\xc9\\\\x1a,R\\\\x19\\\\x15\\\\'\\\\x8d\\\\xe9\\\\x0f\\\\xa4m\\\\x9d\\\\xd8+\\\\x7f\\\\xf3\\\\xc5\\\\xcf]\\\\x88)2\\\\xd6\\\\x1fnB\\\\x9e_\\\"~\\\\xa2{\\\\xcf\\\\xa2kX\\\\xe3r\\\\x16\\\\xccf\\\\xeb\\\\x93:L\\\\xe9Oh6\\\\xf5\\\\xf2\\\\xdd\\\\xeb\\\\xa2\\\\xcf\\\\tJ\\\\xb7\\\\x9a\\\\xc3\\\\xad\\\\xc9\\\\xea\\\\xc7\\\"\\\\xb3\\\\xaa\\\\xd5\\\\xder\\\\xe4\\\\x05w\\\\xc7\\\\t\\\\x8b\\\\x8e]Kx\\\\x9cG\\\\x83:\\\\xc4\\\\x8f\\\\x01N\\\\xdc\\\\xf4Br\\\\xee\\\\xa50\\\\xd5\\\\x05!\\\\x88\\\\xcb\\\\xdbBf\\\\xbciL\\\\xe74#\\\\xa3\\\\x94Gx\\\\xa51YLw\\\\xd0X\\\\x0eC\\\\xc6\\\\xa4\\\\xc1\\\\x9e\\\\xef}H\\\\xa4\\\\x91\\\\x15ED\\\\'1\\\\xe1\\\\xf0\\\\xad\\\\nT\\\\x935\\\\x1fA\\\\x87\\\\x9a=5C9=9\\\\x8c\\\\xfb\\\\xfd\\\\xd5\\\\x9b\\\\xe5=\\\\xc7B\\\\xf8\\\\xe6%\\\\x83t\\\\x91\\\\x827\\\\x86^9n\\\\xd6!x\\\\xd5\\\\xad\\\\xdbi\\\\x82\\\\x87\\\\x9b*\\\\x8d\\\\xd5$\\\\xe4u\\\\xc8\\\\xea8\\\\x11F\\\\xb7\\\\x8d\\\\xdb\\\\xa7J\\\\xfem;eY(\\\\x81^gsf\\\\xa8\\\\x80\\\\xba\\\\xc30\\\\xfcII\\\\x18\\\\x8d\\\\x8d\\\\xa5\\\\xde\\\\xe8\\\\x84\\\\xf5\\\\xec\\\\xa5\\\\xcd\\\\xd1\\\\xdd#*\\\\xb5\\\\xb0\\\\x8c\\\\xae\\\\x8fvJ\\\\xe1$\\\\xbb\\\\xb3\\\\xf8|\\\\xf3C[\\\\x9e\\\\xe8\\\\xa2\\\\xf1\\\\xe0W\\\\x9e\\\\xc6\\\\xfa8\\\\xd96\\\\x90\\\\xa55\\\\x84%\\\\xb2>\\\\xab\\\\xce\\\\x8fr\\\\xaa\\\\xbdL\\\\xa7\\\\x8a4\\\\xab6\\\\x93g\\\\xf0\\\\xcb%+\\\\xc9\\\\xad\\\\xd4\\\\x8e\\\\x1f\\\\xa5Y\\\\xf7\\\\x9a\\\\xd6=\\\\\\\\\\\\xbd\\\\xcbE\\\\xb3\\\\xac6\\\\xad\\\\xab\\\\xc2[)\\\\x94yc9\\\\x12~\\\\xb8\\\\xad\\\\xf7[\\\\x8d1\\\\xd4\\\\xce\\\\xfe\\\\x91^5\\\\xcd\\\\x1a5\\\\xa9<7MX\\\\xee%\\\\xb3\\\\xbd\\\\x1d\\\\xe2X\\\\x86\\\\x0bt\\\\xab[\\\\xd4$\\\\x04\\\\xba\\\\x94\\\\xa4\\\\x94\\\\xc9\\\\x00\\\\xc4\\\\x83\\\\x07=kX\\\\xc9i\\\\x9e-\\\\xfa8r\\\\xee\\\\xe5\\\\xfb\\\\xc7\\\\xdc\\\\xb9\\\\xbby\\\\xc7\\\\xee\\\\x1e;\\\\xce:\\\\xea\\\\x8a\\\\x96\\\\xb2Fd\\\\x93\\\\x99\\\\xafC\\\\xc7\\\\xbb\\\\x95\\\\xdd\\\\x05Z\\\\xa4w|)\\\\x04$\\\\xefPJ<\\\\xe3\\\\xdcj\\\\x88\\\\x87\\\\x8d@\\\\x80\\\\x9c\\\\xeaE\\\\x03\\\\xb4iLI\\\\xd7\\\\xc6\\\\x844\\\\r\\\\xe5e\\\\xc6\\\\xb5<\\\\x1a\\\\xff\\\\xd9'\"\n      ]\n     },\n     \"execution_count\": 31,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# The raw content (its a binary file, meaning we will need to use binary read/write methods for saving it)\\n\",\n    \"image_link.content\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Let's write this to a file:=, not the 'wb' call to denote a binary writing of the file.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"f = open('my_new_file_name.jpg','wb')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"16806\"\n      ]\n     },\n     \"execution_count\": 33,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"f.write(image_link.content)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we can display this file right here in the notebook as markdown using:\\n\",\n    \"\\n\",\n    \"    <img src=\\\"'my_new_file_name.jpg'>\\n\",\n    \"    \\n\",\n    \"Just write the above line in a new markdown cell and it will display the image we just downloaded!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<img src='my_new_file_name.jpg'>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Example Project - Working with Multiple Pages and Items\\n\",\n    \"\\n\",\n    \"Let's show a more realistic example of scraping a full site. The website: http://books.toscrape.com/index.html is specifically designed for people to scrape it. Let's try to get the title of every book that has a 2 star rating and at the end just have a Python list with all their titles.\\n\",\n    \"\\n\",\n    \"We will do the following:\\n\",\n    \"\\n\",\n    \"1. Figure out the URL structure to go through every page\\n\",\n    \"2. Scrap every page in the catalogue\\n\",\n    \"3. Figure out what tag/class represents the Star rating\\n\",\n    \"4. Filter by that star rating using an if statement\\n\",\n    \"5. Store the results to a list\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"We can see that the URL structure is the following:\\n\",\n    \"\\n\",\n    \"    http://books.toscrape.com/catalogue/page-1.html\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"base_url = 'http://books.toscrape.com/catalogue/page-{}.html'\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can then fill in the page number with .format()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"res = requests.get(base_url.format('1'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now let's grab the products (books) from the get request result:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"soup = bs4.BeautifulSoup(res.text,\\\"lxml\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 38,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[<article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"a-light-in-the-attic_1000/index.html\\\"><img alt=\\\"A Light in the Attic\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/2c/da/2cdad67c44b002e7ead0cc35693c0e8b.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Three\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"a-light-in-the-attic_1000/index.html\\\" title=\\\"A Light in the Attic\\\">A Light in the ...</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£51.77</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>, <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"tipping-the-velvet_999/index.html\\\"><img alt=\\\"Tipping the Velvet\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/26/0c/260c6ae16bce31c8f8c95daddd9f4a1c.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating One\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"tipping-the-velvet_999/index.html\\\" title=\\\"Tipping the Velvet\\\">Tipping the Velvet</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£53.74</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>, <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"soumission_998/index.html\\\"><img alt=\\\"Soumission\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/3e/ef/3eef99c9d9adef34639f510662022830.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating One\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"soumission_998/index.html\\\" title=\\\"Soumission\\\">Soumission</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£50.10</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>, <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"sharp-objects_997/index.html\\\"><img alt=\\\"Sharp Objects\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/32/51/3251cf3a3412f53f339e42cac2134093.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Four\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"sharp-objects_997/index.html\\\" title=\\\"Sharp Objects\\\">Sharp Objects</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£47.82</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>, <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"sapiens-a-brief-history-of-humankind_996/index.html\\\"><img alt=\\\"Sapiens: A Brief History of Humankind\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/be/a5/bea5697f2534a2f86a3ef27b5a8c12a6.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Five\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"sapiens-a-brief-history-of-humankind_996/index.html\\\" title=\\\"Sapiens: A Brief History of Humankind\\\">Sapiens: A Brief History ...</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£54.23</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>, <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"the-requiem-red_995/index.html\\\"><img alt=\\\"The Requiem Red\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/68/33/68339b4c9bc034267e1da611ab3b34f8.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating One\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"the-requiem-red_995/index.html\\\" title=\\\"The Requiem Red\\\">The Requiem Red</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£22.65</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>, <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"the-dirty-little-secrets-of-getting-your-dream-job_994/index.html\\\"><img alt=\\\"The Dirty Little Secrets of Getting Your Dream Job\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/92/27/92274a95b7c251fea59a2b8a78275ab4.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Four\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"the-dirty-little-secrets-of-getting-your-dream-job_994/index.html\\\" title=\\\"The Dirty Little Secrets of Getting Your Dream Job\\\">The Dirty Little Secrets ...</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£33.34</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>, <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"the-coming-woman-a-novel-based-on-the-life-of-the-infamous-feminist-victoria-woodhull_993/index.html\\\"><img alt=\\\"The Coming Woman: A Novel Based on the Life of the Infamous Feminist, Victoria Woodhull\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/3d/54/3d54940e57e662c4dd1f3ff00c78cc64.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Three\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"the-coming-woman-a-novel-based-on-the-life-of-the-infamous-feminist-victoria-woodhull_993/index.html\\\" title=\\\"The Coming Woman: A Novel Based on the Life of the Infamous Feminist, Victoria Woodhull\\\">The Coming Woman: A ...</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£17.93</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>, <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"the-boys-in-the-boat-nine-americans-and-their-epic-quest-for-gold-at-the-1936-berlin-olympics_992/index.html\\\"><img alt=\\\"The Boys in the Boat: Nine Americans and Their Epic Quest for Gold at the 1936 Berlin Olympics\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/66/88/66883b91f6804b2323c8369331cb7dd1.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Four\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"the-boys-in-the-boat-nine-americans-and-their-epic-quest-for-gold-at-the-1936-berlin-olympics_992/index.html\\\" title=\\\"The Boys in the Boat: Nine Americans and Their Epic Quest for Gold at the 1936 Berlin Olympics\\\">The Boys in the ...</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£22.60</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>, <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"the-black-maria_991/index.html\\\"><img alt=\\\"The Black Maria\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/58/46/5846057e28022268153beff6d352b06c.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating One\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"the-black-maria_991/index.html\\\" title=\\\"The Black Maria\\\">The Black Maria</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£52.15</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>, <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"starving-hearts-triangular-trade-trilogy-1_990/index.html\\\"><img alt=\\\"Starving Hearts (Triangular Trade Trilogy, #1)\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/be/f4/bef44da28c98f905a3ebec0b87be8530.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Two\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"starving-hearts-triangular-trade-trilogy-1_990/index.html\\\" title=\\\"Starving Hearts (Triangular Trade Trilogy, #1)\\\">Starving Hearts (Triangular Trade ...</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£13.99</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>, <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"shakespeares-sonnets_989/index.html\\\"><img alt=\\\"Shakespeare's Sonnets\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/10/48/1048f63d3b5061cd2f424d20b3f9b666.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Four\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"shakespeares-sonnets_989/index.html\\\" title=\\\"Shakespeare's Sonnets\\\">Shakespeare's Sonnets</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£20.66</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>, <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"set-me-free_988/index.html\\\"><img alt=\\\"Set Me Free\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/5b/88/5b88c52633f53cacf162c15f4f823153.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Five\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"set-me-free_988/index.html\\\" title=\\\"Set Me Free\\\">Set Me Free</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£17.46</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>, <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"scott-pilgrims-precious-little-life-scott-pilgrim-1_987/index.html\\\"><img alt=\\\"Scott Pilgrim's Precious Little Life (Scott Pilgrim #1)\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/94/b1/94b1b8b244bce9677c2f29ccc890d4d2.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Five\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"scott-pilgrims-precious-little-life-scott-pilgrim-1_987/index.html\\\" title=\\\"Scott Pilgrim's Precious Little Life (Scott Pilgrim #1)\\\">Scott Pilgrim's Precious Little ...</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£52.29</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>, <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"rip-it-up-and-start-again_986/index.html\\\"><img alt=\\\"Rip it Up and Start Again\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/81/c4/81c4a973364e17d01f217e1188253d5e.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Five\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"rip-it-up-and-start-again_986/index.html\\\" title=\\\"Rip it Up and Start Again\\\">Rip it Up and ...</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£35.02</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>, <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"our-band-could-be-your-life-scenes-from-the-american-indie-underground-1981-1991_985/index.html\\\"><img alt=\\\"Our Band Could Be Your Life: Scenes from the American Indie Underground, 1981-1991\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/54/60/54607fe8945897cdcced0044103b10b6.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Three\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"our-band-could-be-your-life-scenes-from-the-american-indie-underground-1981-1991_985/index.html\\\" title=\\\"Our Band Could Be Your Life: Scenes from the American Indie Underground, 1981-1991\\\">Our Band Could Be ...</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£57.25</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>, <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"olio_984/index.html\\\"><img alt=\\\"Olio\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/55/33/553310a7162dfbc2c6d19a84da0df9e1.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating One\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"olio_984/index.html\\\" title=\\\"Olio\\\">Olio</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£23.88</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>, <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"mesaerion-the-best-science-fiction-stories-1800-1849_983/index.html\\\"><img alt=\\\"Mesaerion: The Best Science Fiction Stories 1800-1849\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/09/a3/09a3aef48557576e1a85ba7efea8ecb7.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating One\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"mesaerion-the-best-science-fiction-stories-1800-1849_983/index.html\\\" title=\\\"Mesaerion: The Best Science Fiction Stories 1800-1849\\\">Mesaerion: The Best Science ...</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£37.59</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>, <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"libertarianism-for-beginners_982/index.html\\\"><img alt=\\\"Libertarianism for Beginners\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/0b/bc/0bbcd0a6f4bcd81ccb1049a52736406e.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Two\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"libertarianism-for-beginners_982/index.html\\\" title=\\\"Libertarianism for Beginners\\\">Libertarianism for Beginners</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£51.33</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>, <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"its-only-the-himalayas_981/index.html\\\"><img alt=\\\"It's Only the Himalayas\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/27/a5/27a53d0bb95bdd88288eaf66c9230d7e.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Two\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"its-only-the-himalayas_981/index.html\\\" title=\\\"It's Only the Himalayas\\\">It's Only the Himalayas</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£45.17</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>]\"\n      ]\n     },\n     \"execution_count\": 38,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"soup.select(\\\".product_pod\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we can see that each book has the product_pod class. We can select any tag with this class, and then further reduce it by its rating.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"products = soup.select(\\\".product_pod\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 40,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"example = products[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"bs4.element.Tag\"\n      ]\n     },\n     \"execution_count\": 41,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"type(example)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 42,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'class': ['product_pod']}\"\n      ]\n     },\n     \"execution_count\": 42,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"example.attrs\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now by inspecting the site we can see that the class we want is class='star-rating Two' , if you click on this in your browser, you'll notice it displays the space as a . , so that means we want to search for \\\".star-rating.Two\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 43,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['\\\\n', <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"a-light-in-the-attic_1000/index.html\\\"><img alt=\\\"A Light in the Attic\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/2c/da/2cdad67c44b002e7ead0cc35693c0e8b.jpg\\\"/></a>\\n\",\n       \" </div>, '\\\\n', <p class=\\\"star-rating Three\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>, '\\\\n', <h3><a href=\\\"a-light-in-the-attic_1000/index.html\\\" title=\\\"A Light in the Attic\\\">A Light in the ...</a></h3>, '\\\\n', <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£51.77</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>, '\\\\n']\"\n      ]\n     },\n     \"execution_count\": 43,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(example.children)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 44,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[<p class=\\\"star-rating Three\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>]\"\n      ]\n     },\n     \"execution_count\": 44,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"example.select('.star-rating.Three')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"But we are looking for 2 stars, so it looks like we can just check to see if something was returned\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 45,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[]\"\n      ]\n     },\n     \"execution_count\": 45,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"example.select('.star-rating.Two')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Alternatively, we can just quickly check the text string to see if \\\"star-rating Two\\\" is in it. Either approach is fine (there are also many other alternative approaches!)\\n\",\n    \"\\n\",\n    \"Now let's see how we can get the title if we have a 2-star match:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 46,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[<a href=\\\"a-light-in-the-attic_1000/index.html\\\"><img alt=\\\"A Light in the Attic\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/2c/da/2cdad67c44b002e7ead0cc35693c0e8b.jpg\\\"/></a>,\\n\",\n       \" <a href=\\\"a-light-in-the-attic_1000/index.html\\\" title=\\\"A Light in the Attic\\\">A Light in the ...</a>]\"\n      ]\n     },\n     \"execution_count\": 46,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"example.select('a')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 47,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<a href=\\\"a-light-in-the-attic_1000/index.html\\\" title=\\\"A Light in the Attic\\\">A Light in the ...</a>\"\n      ]\n     },\n     \"execution_count\": 47,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"example.select('a')[1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 48,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'A Light in the Attic'\"\n      ]\n     },\n     \"execution_count\": 48,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"example.select('a')[1]['title']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Okay, let's give it a shot by combining all the ideas we've talked about! (this should take about 20-60 seconds to complete running. Be aware a firwall may prevent this script from running. Also if you are getting a no response error, maybe try adding a sleep step with time.sleep(1).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 49,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"two_star_titles = []\\n\",\n    \"\\n\",\n    \"for n in range(1,51):\\n\",\n    \"\\n\",\n    \"    scrape_url = base_url.format(n)\\n\",\n    \"    res = requests.get(scrape_url)\\n\",\n    \"    \\n\",\n    \"    soup = bs4.BeautifulSoup(res.text,\\\"lxml\\\")\\n\",\n    \"    books = soup.select(\\\".product_pod\\\")\\n\",\n    \"    \\n\",\n    \"    for book in books:\\n\",\n    \"        if len(book.select('.star-rating.Two')) != 0:\\n\",\n    \"            two_star_titles.append(book.select('a')[1]['title'])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 50,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['Starving Hearts (Triangular Trade Trilogy, #1)',\\n\",\n       \" 'Libertarianism for Beginners',\\n\",\n       \" \\\"It's Only the Himalayas\\\",\\n\",\n       \" 'How Music Works',\\n\",\n       \" 'Maude (1883-1993):She Grew Up with the country',\\n\",\n       \" \\\"You can't bury them all: Poems\\\",\\n\",\n       \" 'Reasons to Stay Alive',\\n\",\n       \" 'Without Borders (Wanderlove #1)',\\n\",\n       \" 'Soul Reader',\\n\",\n       \" 'Security',\\n\",\n       \" 'Saga, Volume 5 (Saga (Collected Editions) #5)',\\n\",\n       \" 'Reskilling America: Learning to Labor in the Twenty-First Century',\\n\",\n       \" 'Political Suicide: Missteps, Peccadilloes, Bad Calls, Backroom Hijinx, Sordid Pasts, Rotten Breaks, and Just Plain Dumb Mistakes in the Annals of American Politics',\\n\",\n       \" 'Obsidian (Lux #1)',\\n\",\n       \" 'My Paris Kitchen: Recipes and Stories',\\n\",\n       \" 'Masks and Shadows',\\n\",\n       \" 'Lumberjanes, Vol. 2: Friendship to the Max (Lumberjanes #5-8)',\\n\",\n       \" 'Lumberjanes Vol. 3: A Terrible Plan (Lumberjanes #9-12)',\\n\",\n       \" 'Judo: Seven Steps to Black Belt (an Introductory Guide for Beginners)',\\n\",\n       \" 'I Hate Fairyland, Vol. 1: Madly Ever After (I Hate Fairyland (Compilations) #1-5)',\\n\",\n       \" 'Giant Days, Vol. 2 (Giant Days #5-8)',\\n\",\n       \" 'Everydata: The Misinformation Hidden in the Little Data You Consume Every Day',\\n\",\n       \" \\\"Don't Be a Jerk: And Other Practical Advice from Dogen, Japan's Greatest Zen Master\\\",\\n\",\n       \" 'Bossypants',\\n\",\n       \" 'Bitch Planet, Vol. 1: Extraordinary Machine (Bitch Planet (Collected Editions))',\\n\",\n       \" 'Avatar: The Last Airbender: Smoke and Shadow, Part 3 (Smoke and Shadow #3)',\\n\",\n       \" 'Tuesday Nights in 1980',\\n\",\n       \" 'The Psychopath Test: A Journey Through the Madness Industry',\\n\",\n       \" 'The Power of Now: A Guide to Spiritual Enlightenment',\\n\",\n       \" \\\"The Omnivore's Dilemma: A Natural History of Four Meals\\\",\\n\",\n       \" 'The Love and Lemons Cookbook: An Apple-to-Zucchini Celebration of Impromptu Cooking',\\n\",\n       \" 'The Girl on the Train',\\n\",\n       \" 'The Emerald Mystery',\\n\",\n       \" 'The Argonauts',\\n\",\n       \" 'Suddenly in Love (Lake Haven #1)',\\n\",\n       \" 'Soft Apocalypse',\\n\",\n       \" \\\"So You've Been Publicly Shamed\\\",\\n\",\n       \" 'Shoe Dog: A Memoir by the Creator of NIKE',\\n\",\n       \" 'Louisa: The Extraordinary Life of Mrs. Adams',\\n\",\n       \" 'Large Print Heart of the Pride',\\n\",\n       \" 'Grumbles',\\n\",\n       \" 'Chasing Heaven: What Dying Taught Me About Living',\\n\",\n       \" 'Becoming Wise: An Inquiry into the Mystery and Art of Living',\\n\",\n       \" 'Beauty Restored (Riley Family Legacy Novellas #3)',\\n\",\n       \" 'Batman: The Long Halloween (Batman)',\\n\",\n       \" \\\"Ayumi's Violin\\\",\\n\",\n       \" 'Wild Swans',\\n\",\n       \" \\\"What's It Like in Space?: Stories from Astronauts Who've Been There\\\",\\n\",\n       \" 'Until Friday Night (The Field Party #1)',\\n\",\n       \" 'Unbroken: A World War II Story of Survival, Resilience, and Redemption',\\n\",\n       \" 'Twenty Yawns',\\n\",\n       \" 'Through the Woods',\\n\",\n       \" 'This Is Where It Ends',\\n\",\n       \" 'The Year of Magical Thinking',\\n\",\n       \" 'The Last Mile (Amos Decker #2)',\\n\",\n       \" 'The Immortal Life of Henrietta Lacks',\\n\",\n       \" 'The Hidden Oracle (The Trials of Apollo #1)',\\n\",\n       \" 'The Guilty (Will Robie #4)',\\n\",\n       \" 'Red Hood/Arsenal, Vol. 1: Open for Business (Red Hood/Arsenal #1)',\\n\",\n       \" 'Once Was a Time',\\n\",\n       \" 'No Dream Is Too High: Life Lessons From a Man Who Walked on the Moon',\\n\",\n       \" 'Naruto (3-in-1 Edition), Vol. 14: Includes Vols. 40, 41 & 42 (Naruto: Omnibus #14)',\\n\",\n       \" 'More Than Music (Chasing the Dream #1)',\\n\",\n       \" 'Lowriders to the Center of the Earth (Lowriders in Space #2)',\\n\",\n       \" 'Eat Fat, Get Thin',\\n\",\n       \" 'Doctor Sleep (The Shining #2)',\\n\",\n       \" 'Crazy Love: Overwhelmed by a Relentless God',\\n\",\n       \" 'Carrie',\\n\",\n       \" 'Batman: Europa',\\n\",\n       \" 'Angels Walking (Angels Walking #1)',\\n\",\n       \" 'Adulthood Is a Myth: A \\\"Sarah\\\\'s Scribbles\\\" Collection',\\n\",\n       \" 'A Study in Scarlet (Sherlock Holmes #1)',\\n\",\n       \" 'A Series of Catastrophes and Miracles: A True Story of Love, Science, and Cancer',\\n\",\n       \" \\\"A People's History of the United States\\\",\\n\",\n       \" 'My Kitchen Year: 136 Recipes That Saved My Life',\\n\",\n       \" 'The Lonely City: Adventures in the Art of Being Alone',\\n\",\n       \" 'The Dinner Party',\\n\",\n       \" 'Stars Above (The Lunar Chronicles #4.5)',\\n\",\n       \" 'Love, Lies and Spies',\\n\",\n       \" 'Troublemaker: Surviving Hollywood and Scientology',\\n\",\n       \" 'The Widow',\\n\",\n       \" 'Setting the World on Fire: The Brief, Astonishing Life of St. Catherine of Siena',\\n\",\n       \" 'Mothering Sunday',\\n\",\n       \" 'Lilac Girls',\\n\",\n       \" '10% Happier: How I Tamed the Voice in My Head, Reduced Stress Without Losing My Edge, and Found Self-Help That Actually Works',\\n\",\n       \" 'Underlying Notes',\\n\",\n       \" 'The Flowers Lied',\\n\",\n       \" 'Modern Day Fables',\\n\",\n       \" \\\"Chernobyl 01:23:40: The Incredible True Story of the World's Worst Nuclear Disaster\\\",\\n\",\n       \" '23 Degrees South: A Tropical Tale of Changing Whether...',\\n\",\n       \" 'When Breath Becomes Air',\\n\",\n       \" 'Vagabonding: An Uncommon Guide to the Art of Long-Term World Travel',\\n\",\n       \" 'The Martian (The Martian #1)',\\n\",\n       \" \\\"Miller's Valley\\\",\\n\",\n       \" \\\"Love That Boy: What Two Presidents, Eight Road Trips, and My Son Taught Me About a Parent's Expectations\\\",\\n\",\n       \" 'Left Behind (Left Behind #1)',\\n\",\n       \" 'Howl and Other Poems',\\n\",\n       \" \\\"Heaven is for Real: A Little Boy's Astounding Story of His Trip to Heaven and Back\\\",\\n\",\n       \" \\\"Brazen: The Courage to Find the You That's Been Hiding\\\",\\n\",\n       \" '32 Yolks',\\n\",\n       \" 'Wildlife of New York: A Five-Borough Coloring Book',\\n\",\n       \" 'Unreasonable Hope: Finding Faith in the God Who Brings Purpose to Your Pain',\\n\",\n       \" 'The Art Book',\\n\",\n       \" 'Steal Like an Artist: 10 Things Nobody Told You About Being Creative',\\n\",\n       \" 'Raymie Nightingale',\\n\",\n       \" 'Like Never Before (Walker Family #2)',\\n\",\n       \" 'How to Be a Domestic Goddess: Baking and the Art of Comfort Cooking',\\n\",\n       \" 'Finding God in the Ruins: How God Redeems Pain',\\n\",\n       \" 'Chronicles, Vol. 1',\\n\",\n       \" 'A Summer In Europe',\\n\",\n       \" 'The Rise and Fall of the Third Reich: A History of Nazi Germany',\\n\",\n       \" 'The Makings of a Fatherless Child',\\n\",\n       \" 'The Fellowship of the Ring (The Lord of the Rings #1)',\\n\",\n       \" \\\"Tell the Wolves I'm Home\\\",\\n\",\n       \" 'In the Woods (Dublin Murder Squad #1)',\\n\",\n       \" 'Give It Back',\\n\",\n       \" 'Why Save the Bankers?: And Other Essays on Our Economic and Political Crisis',\\n\",\n       \" 'The Raven King (The Raven Cycle #4)',\\n\",\n       \" 'The Expatriates',\\n\",\n       \" 'The 5th Wave (The 5th Wave #1)',\\n\",\n       \" 'Peak: Secrets from the New Science of Expertise',\\n\",\n       \" 'Logan Kade (Fallen Crest High #5.5)',\\n\",\n       \" \\\"I Know Why the Caged Bird Sings (Maya Angelou's Autobiography #1)\\\",\\n\",\n       \" 'Drama',\\n\",\n       \" \\\"America's War for the Greater Middle East: A Military History\\\",\\n\",\n       \" 'A Game of Thrones (A Song of Ice and Fire #1)',\\n\",\n       \" \\\"The Pilgrim's Progress\\\",\\n\",\n       \" 'The Hound of the Baskervilles (Sherlock Holmes #5)',\\n\",\n       \" \\\"The Geography of Bliss: One Grump's Search for the Happiest Places in the World\\\",\\n\",\n       \" 'The Demonists (Demonist #1)',\\n\",\n       \" 'The Demon Prince of Momochi House, Vol. 4 (The Demon Prince of Momochi House #4)',\\n\",\n       \" 'Misery',\\n\",\n       \" 'Far From True (Promise Falls Trilogy #2)',\\n\",\n       \" 'Confessions of a Shopaholic (Shopaholic #1)',\\n\",\n       \" 'Vegan Vegetarian Omnivore: Dinner for Everyone at the Table',\\n\",\n       \" 'Two Boys Kissing',\\n\",\n       \" 'Twilight (Twilight #1)',\\n\",\n       \" 'Twenties Girl',\\n\",\n       \" 'The Tipping Point: How Little Things Can Make a Big Difference',\\n\",\n       \" 'The Stand',\\n\",\n       \" 'The Picture of Dorian Gray',\\n\",\n       \" 'The Name of God is Mercy',\\n\",\n       \" \\\"The Lover's Dictionary\\\",\\n\",\n       \" 'The Last Painting of Sara de Vos',\\n\",\n       \" 'The Guns of August',\\n\",\n       \" 'The Girl Who Played with Fire (Millennium Trilogy #2)',\\n\",\n       \" 'The Da Vinci Code (Robert Langdon #2)',\\n\",\n       \" 'The Cat in the Hat (Beginner Books B-1)',\\n\",\n       \" 'The Book Thief',\\n\",\n       \" 'The Autobiography of Malcolm X',\\n\",\n       \" \\\"Surely You're Joking, Mr. Feynman!: Adventures of a Curious Character\\\",\\n\",\n       \" 'Soldier (Talon #3)',\\n\",\n       \" 'Shopaholic & Baby (Shopaholic #5)',\\n\",\n       \" 'Seven Days in the Art World',\\n\",\n       \" 'Rework',\\n\",\n       \" 'Packing for Mars: The Curious Science of Life in the Void',\\n\",\n       \" 'Orange Is the New Black',\\n\",\n       \" 'One for the Money (Stephanie Plum #1)',\\n\",\n       \" 'Midnight Riot (Peter Grant/ Rivers of London - books #1)',\\n\",\n       \" 'Me Talk Pretty One Day',\\n\",\n       \" 'Manuscript Found in Accra',\\n\",\n       \" 'Lust & Wonder',\\n\",\n       \" \\\"Life, the Universe and Everything (Hitchhiker's Guide to the Galaxy #3)\\\",\\n\",\n       \" 'Life After Life',\\n\",\n       \" 'I Am Malala: The Girl Who Stood Up for Education and Was Shot by the Taliban',\\n\",\n       \" 'House of Lost Worlds: Dinosaurs, Dynasties, and the Story of Life on Earth',\\n\",\n       \" 'Horrible Bear!',\\n\",\n       \" 'Holidays on Ice',\\n\",\n       \" 'Girl in the Blue Coat',\\n\",\n       \" 'Fruits Basket, Vol. 3 (Fruits Basket #3)',\\n\",\n       \" 'Cosmos',\\n\",\n       \" 'Civilization and Its Discontents',\\n\",\n       \" \\\"Catastrophic Happiness: Finding Joy in Childhood's Messy Years\\\",\\n\",\n       \" 'Career of Evil (Cormoran Strike #3)',\\n\",\n       \" 'Born to Run: A Hidden Tribe, Superathletes, and the Greatest Race the World Has Never Seen',\\n\",\n       \" \\\"Best of My Love (Fool's Gold #20)\\\",\\n\",\n       \" 'Beowulf',\\n\",\n       \" 'Awkward',\\n\",\n       \" 'And Then There Were None',\\n\",\n       \" 'A Storm of Swords (A Song of Ice and Fire #3)',\\n\",\n       \" 'The Suffragettes (Little Black Classics, #96)',\\n\",\n       \" 'Vampire Girl (Vampire Girl #1)',\\n\",\n       \" 'Three Wishes (River of Time: California #1)',\\n\",\n       \" 'The Wicked + The Divine, Vol. 1: The Faust Act (The Wicked + The Divine)',\\n\",\n       \" 'The Little Prince',\\n\",\n       \" 'The Last Girl (The Dominion Trilogy #1)',\\n\",\n       \" 'Taking Shots (Assassins #1)',\\n\",\n       \" 'Settling the Score (The Summer Games #1)',\\n\",\n       \" 'Rhythm, Chord & Malykhin',\\n\",\n       \" 'One Second (Seven #7)',\\n\",\n       \" \\\"Old Records Never Die: One Man's Quest for His Vinyl and His Past\\\",\\n\",\n       \" 'Of Mice and Men',\\n\",\n       \" 'My Perfect Mistake (Over the Top #1)',\\n\",\n       \" 'Meditations',\\n\",\n       \" 'Frankenstein',\\n\",\n       \" 'Emma']\"\n      ]\n     },\n     \"execution_count\": 50,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"two_star_titles\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"** Excellent! You should now have the tools necessary to scrape any websites that interest you! Keep in mind, the more complex the website, the harder it will be to scrape. Always ask for permission! **\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"anaconda-cloud\": {},\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "13-Web-Scraping/.ipynb_checkpoints/01-Web-Scraping-Exercises-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Web Scraping Exercises \\n\",\n    \"\\n\",\n    \"## Complete the Tasks Below\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Import any libraries you think you'll need to scrape a website.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Use requests library and BeautifulSoup to connect to http://quotes.toscrape.com/ and get the HMTL text from the homepage.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'<!DOCTYPE html>\\\\n<html lang=\\\"en\\\">\\\\n<head>\\\\n\\\\t<meta charset=\\\"UTF-8\\\">\\\\n\\\\t<title>Quotes to Scrape</title>\\\\n    <link rel=\\\"stylesheet\\\" href=\\\"/static/bootstrap.min.css\\\">\\\\n    <link rel=\\\"stylesheet\\\" href=\\\"/static/main.css\\\">\\\\n</head>\\\\n<body>\\\\n    <div class=\\\"container\\\">\\\\n        <div class=\\\"row header-box\\\">\\\\n            <div class=\\\"col-md-8\\\">\\\\n                <h1>\\\\n                    <a href=\\\"/\\\" style=\\\"text-decoration: none\\\">Quotes to Scrape</a>\\\\n                </h1>\\\\n            </div>\\\\n            <div class=\\\"col-md-4\\\">\\\\n                <p>\\\\n                \\\\n                    <a href=\\\"/login\\\">Login</a>\\\\n                \\\\n                </p>\\\\n            </div>\\\\n        </div>\\\\n    \\\\n\\\\n<div class=\\\"row\\\">\\\\n    <div class=\\\"col-md-8\\\">\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Albert Einstein</small>\\\\n        <a href=\\\"/author/Albert-Einstein\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"change,deep-thoughts,thinking,world\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/change/page/1/\\\">change</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/deep-thoughts/page/1/\\\">deep-thoughts</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/thinking/page/1/\\\">thinking</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/world/page/1/\\\">world</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“It is our choices, Harry, that show what we truly are, far more than our abilities.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">J.K. Rowling</small>\\\\n        <a href=\\\"/author/J-K-Rowling\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"abilities,choices\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/abilities/page/1/\\\">abilities</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/choices/page/1/\\\">choices</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Albert Einstein</small>\\\\n        <a href=\\\"/author/Albert-Einstein\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"inspirational,life,live,miracle,miracles\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/inspirational/page/1/\\\">inspirational</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/life/page/1/\\\">life</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/live/page/1/\\\">live</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/miracle/page/1/\\\">miracle</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/miracles/page/1/\\\">miracles</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Jane Austen</small>\\\\n        <a href=\\\"/author/Jane-Austen\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"aliteracy,books,classic,humor\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/aliteracy/page/1/\\\">aliteracy</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/books/page/1/\\\">books</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/classic/page/1/\\\">classic</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/humor/page/1/\\\">humor</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“Imperfection is beauty, madness is genius and it&#39;s better to be absolutely ridiculous than absolutely boring.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Marilyn Monroe</small>\\\\n        <a href=\\\"/author/Marilyn-Monroe\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"be-yourself,inspirational\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/be-yourself/page/1/\\\">be-yourself</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/inspirational/page/1/\\\">inspirational</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“Try not to become a man of success. Rather become a man of value.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Albert Einstein</small>\\\\n        <a href=\\\"/author/Albert-Einstein\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"adulthood,success,value\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/adulthood/page/1/\\\">adulthood</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/success/page/1/\\\">success</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/value/page/1/\\\">value</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“It is better to be hated for what you are than to be loved for what you are not.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">André Gide</small>\\\\n        <a href=\\\"/author/Andre-Gide\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"life,love\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/life/page/1/\\\">life</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/love/page/1/\\\">love</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“I have not failed. I&#39;ve just found 10,000 ways that won&#39;t work.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Thomas A. Edison</small>\\\\n        <a href=\\\"/author/Thomas-A-Edison\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"edison,failure,inspirational,paraphrased\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/edison/page/1/\\\">edison</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/failure/page/1/\\\">failure</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/inspirational/page/1/\\\">inspirational</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/paraphrased/page/1/\\\">paraphrased</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“A woman is like a tea bag; you never know how strong it is until it&#39;s in hot water.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Eleanor Roosevelt</small>\\\\n        <a href=\\\"/author/Eleanor-Roosevelt\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"misattributed-eleanor-roosevelt\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/misattributed-eleanor-roosevelt/page/1/\\\">misattributed-eleanor-roosevelt</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“A day without sunshine is like, you know, night.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Steve Martin</small>\\\\n        <a href=\\\"/author/Steve-Martin\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"humor,obvious,simile\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/humor/page/1/\\\">humor</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/obvious/page/1/\\\">obvious</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/simile/page/1/\\\">simile</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <nav>\\\\n        <ul class=\\\"pager\\\">\\\\n            \\\\n            \\\\n            <li class=\\\"next\\\">\\\\n                <a href=\\\"/page/2/\\\">Next <span aria-hidden=\\\"true\\\">&rarr;</span></a>\\\\n            </li>\\\\n            \\\\n        </ul>\\\\n    </nav>\\\\n    </div>\\\\n    <div class=\\\"col-md-4 tags-box\\\">\\\\n        \\\\n            <h2>Top Ten tags</h2>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 28px\\\" href=\\\"/tag/love/\\\">love</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 26px\\\" href=\\\"/tag/inspirational/\\\">inspirational</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 26px\\\" href=\\\"/tag/life/\\\">life</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 24px\\\" href=\\\"/tag/humor/\\\">humor</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 22px\\\" href=\\\"/tag/books/\\\">books</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 14px\\\" href=\\\"/tag/reading/\\\">reading</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 10px\\\" href=\\\"/tag/friendship/\\\">friendship</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 8px\\\" href=\\\"/tag/friends/\\\">friends</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 8px\\\" href=\\\"/tag/truth/\\\">truth</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 6px\\\" href=\\\"/tag/simile/\\\">simile</a>\\\\n            </span>\\\\n            \\\\n        \\\\n    </div>\\\\n</div>\\\\n\\\\n    </div>\\\\n    <footer class=\\\"footer\\\">\\\\n        <div class=\\\"container\\\">\\\\n            <p class=\\\"text-muted\\\">\\\\n                Quotes by: <a href=\\\"https://www.goodreads.com/quotes\\\">GoodReads.com</a>\\\\n            </p>\\\\n            <p class=\\\"copyright\\\">\\\\n                Made with <span class=\\\\'sh-red\\\\'>❤</span> by <a href=\\\"https://scrapinghub.com\\\">Scrapinghub</a>\\\\n            </p>\\\\n        </div>\\\\n    </footer>\\\\n</body>\\\\n</html>'\"\n      ]\n     },\n     \"execution_count\": 32,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Get the names of all the authors on the first page.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'Albert Einstein',\\n\",\n       \" 'André Gide',\\n\",\n       \" 'Eleanor Roosevelt',\\n\",\n       \" 'J.K. Rowling',\\n\",\n       \" 'Jane Austen',\\n\",\n       \" 'Marilyn Monroe',\\n\",\n       \" 'Steve Martin',\\n\",\n       \" 'Thomas A. Edison'}\"\n      ]\n     },\n     \"execution_count\": 37,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"authors\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Create a list of all the quotes on the first page.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”',\\n\",\n       \" '“It is our choices, Harry, that show what we truly are, far more than our abilities.”',\\n\",\n       \" '“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”',\\n\",\n       \" '“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”',\\n\",\n       \" \\\"“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”\\\",\\n\",\n       \" '“Try not to become a man of success. Rather become a man of value.”',\\n\",\n       \" '“It is better to be hated for what you are than to be loved for what you are not.”',\\n\",\n       \" \\\"“I have not failed. I've just found 10,000 ways that won't work.”\\\",\\n\",\n       \" \\\"“A woman is like a tea bag; you never know how strong it is until it's in hot water.”\\\",\\n\",\n       \" '“A day without sunshine is like, you know, night.”']\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"quotes\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Inspect the site and use Beautiful Soup to extract the top ten tags from the requests text shown on the top right from the home page (e.g Love,Inspirational,Life, etc...). HINT: Keep in mind there are also tags underneath each quote, try to find a class only present in the top right tags, perhaps check the span.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\n\",\n      \"love\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"inspirational\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"life\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"humor\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"books\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"reading\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"friendship\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"friends\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"truth\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"simile\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Notice how there is more than one page, and subsequent pages look like this http://quotes.toscrape.com/page/2/. Use what you know about for loops and string concatenation to loop through all the pages and get all the unique authors on the website. Keep in mind there are many ways to achieve this, also note that you will need to somehow figure out how to check that your loop is on the last page with quotes. For debugging purposes, I will let you know that there are only 10 pages, so the last page is http://quotes.toscrape.com/page/10/, but try to create a loop that is robust enough that it wouldn't matter to know the amount of pages beforehand, perhaps use try/except for this, its up to you!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There are lots of other potential solutions that are even more robust and flexible, the main idea is the same though, use a while loop to cycle through potential pages and have a break condition based on the invalid page.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "13-Web-Scraping/.ipynb_checkpoints/02-Web-Scraping-Exercise-Solutions-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Web Scraping Exercises - Solutions\\n\",\n    \"\\n\",\n    \"## Complete the Tasks Below\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Import any libraries you think you'll need to scrape a website.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import requests\\n\",\n    \"import bs4\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Use requests library and BeautifulSoup to connect to http://quotes.toscrape.com/ and get the HMTL text from the homepage.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"res = requests.get(\\\"http://quotes.toscrape.com/\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'<!DOCTYPE html>\\\\n<html lang=\\\"en\\\">\\\\n<head>\\\\n\\\\t<meta charset=\\\"UTF-8\\\">\\\\n\\\\t<title>Quotes to Scrape</title>\\\\n    <link rel=\\\"stylesheet\\\" href=\\\"/static/bootstrap.min.css\\\">\\\\n    <link rel=\\\"stylesheet\\\" href=\\\"/static/main.css\\\">\\\\n</head>\\\\n<body>\\\\n    <div class=\\\"container\\\">\\\\n        <div class=\\\"row header-box\\\">\\\\n            <div class=\\\"col-md-8\\\">\\\\n                <h1>\\\\n                    <a href=\\\"/\\\" style=\\\"text-decoration: none\\\">Quotes to Scrape</a>\\\\n                </h1>\\\\n            </div>\\\\n            <div class=\\\"col-md-4\\\">\\\\n                <p>\\\\n                \\\\n                    <a href=\\\"/login\\\">Login</a>\\\\n                \\\\n                </p>\\\\n            </div>\\\\n        </div>\\\\n    \\\\n\\\\n<div class=\\\"row\\\">\\\\n    <div class=\\\"col-md-8\\\">\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Albert Einstein</small>\\\\n        <a href=\\\"/author/Albert-Einstein\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"change,deep-thoughts,thinking,world\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/change/page/1/\\\">change</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/deep-thoughts/page/1/\\\">deep-thoughts</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/thinking/page/1/\\\">thinking</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/world/page/1/\\\">world</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“It is our choices, Harry, that show what we truly are, far more than our abilities.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">J.K. Rowling</small>\\\\n        <a href=\\\"/author/J-K-Rowling\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"abilities,choices\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/abilities/page/1/\\\">abilities</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/choices/page/1/\\\">choices</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Albert Einstein</small>\\\\n        <a href=\\\"/author/Albert-Einstein\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"inspirational,life,live,miracle,miracles\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/inspirational/page/1/\\\">inspirational</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/life/page/1/\\\">life</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/live/page/1/\\\">live</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/miracle/page/1/\\\">miracle</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/miracles/page/1/\\\">miracles</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Jane Austen</small>\\\\n        <a href=\\\"/author/Jane-Austen\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"aliteracy,books,classic,humor\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/aliteracy/page/1/\\\">aliteracy</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/books/page/1/\\\">books</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/classic/page/1/\\\">classic</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/humor/page/1/\\\">humor</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“Imperfection is beauty, madness is genius and it&#39;s better to be absolutely ridiculous than absolutely boring.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Marilyn Monroe</small>\\\\n        <a href=\\\"/author/Marilyn-Monroe\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"be-yourself,inspirational\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/be-yourself/page/1/\\\">be-yourself</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/inspirational/page/1/\\\">inspirational</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“Try not to become a man of success. Rather become a man of value.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Albert Einstein</small>\\\\n        <a href=\\\"/author/Albert-Einstein\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"adulthood,success,value\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/adulthood/page/1/\\\">adulthood</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/success/page/1/\\\">success</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/value/page/1/\\\">value</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“It is better to be hated for what you are than to be loved for what you are not.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">André Gide</small>\\\\n        <a href=\\\"/author/Andre-Gide\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"life,love\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/life/page/1/\\\">life</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/love/page/1/\\\">love</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“I have not failed. I&#39;ve just found 10,000 ways that won&#39;t work.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Thomas A. Edison</small>\\\\n        <a href=\\\"/author/Thomas-A-Edison\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"edison,failure,inspirational,paraphrased\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/edison/page/1/\\\">edison</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/failure/page/1/\\\">failure</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/inspirational/page/1/\\\">inspirational</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/paraphrased/page/1/\\\">paraphrased</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“A woman is like a tea bag; you never know how strong it is until it&#39;s in hot water.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Eleanor Roosevelt</small>\\\\n        <a href=\\\"/author/Eleanor-Roosevelt\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"misattributed-eleanor-roosevelt\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/misattributed-eleanor-roosevelt/page/1/\\\">misattributed-eleanor-roosevelt</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“A day without sunshine is like, you know, night.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Steve Martin</small>\\\\n        <a href=\\\"/author/Steve-Martin\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"humor,obvious,simile\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/humor/page/1/\\\">humor</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/obvious/page/1/\\\">obvious</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/simile/page/1/\\\">simile</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <nav>\\\\n        <ul class=\\\"pager\\\">\\\\n            \\\\n            \\\\n            <li class=\\\"next\\\">\\\\n                <a href=\\\"/page/2/\\\">Next <span aria-hidden=\\\"true\\\">&rarr;</span></a>\\\\n            </li>\\\\n            \\\\n        </ul>\\\\n    </nav>\\\\n    </div>\\\\n    <div class=\\\"col-md-4 tags-box\\\">\\\\n        \\\\n            <h2>Top Ten tags</h2>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 28px\\\" href=\\\"/tag/love/\\\">love</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 26px\\\" href=\\\"/tag/inspirational/\\\">inspirational</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 26px\\\" href=\\\"/tag/life/\\\">life</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 24px\\\" href=\\\"/tag/humor/\\\">humor</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 22px\\\" href=\\\"/tag/books/\\\">books</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 14px\\\" href=\\\"/tag/reading/\\\">reading</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 10px\\\" href=\\\"/tag/friendship/\\\">friendship</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 8px\\\" href=\\\"/tag/friends/\\\">friends</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 8px\\\" href=\\\"/tag/truth/\\\">truth</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 6px\\\" href=\\\"/tag/simile/\\\">simile</a>\\\\n            </span>\\\\n            \\\\n        \\\\n    </div>\\\\n</div>\\\\n\\\\n    </div>\\\\n    <footer class=\\\"footer\\\">\\\\n        <div class=\\\"container\\\">\\\\n            <p class=\\\"text-muted\\\">\\\\n                Quotes by: <a href=\\\"https://www.goodreads.com/quotes\\\">GoodReads.com</a>\\\\n            </p>\\\\n            <p class=\\\"copyright\\\">\\\\n                Made with <span class=\\\\'sh-red\\\\'>❤</span> by <a href=\\\"https://scrapinghub.com\\\">Scrapinghub</a>\\\\n            </p>\\\\n        </div>\\\\n    </footer>\\\\n</body>\\\\n</html>'\"\n      ]\n     },\n     \"execution_count\": 32,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"res.text\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Get the names of all the authors on the first page.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"soup = bs4.BeautifulSoup(res.text,'lxml')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[<small class=\\\"author\\\" itemprop=\\\"author\\\">Albert Einstein</small>,\\n\",\n       \" <small class=\\\"author\\\" itemprop=\\\"author\\\">J.K. Rowling</small>,\\n\",\n       \" <small class=\\\"author\\\" itemprop=\\\"author\\\">Albert Einstein</small>,\\n\",\n       \" <small class=\\\"author\\\" itemprop=\\\"author\\\">Jane Austen</small>,\\n\",\n       \" <small class=\\\"author\\\" itemprop=\\\"author\\\">Marilyn Monroe</small>,\\n\",\n       \" <small class=\\\"author\\\" itemprop=\\\"author\\\">Albert Einstein</small>,\\n\",\n       \" <small class=\\\"author\\\" itemprop=\\\"author\\\">André Gide</small>,\\n\",\n       \" <small class=\\\"author\\\" itemprop=\\\"author\\\">Thomas A. Edison</small>,\\n\",\n       \" <small class=\\\"author\\\" itemprop=\\\"author\\\">Eleanor Roosevelt</small>,\\n\",\n       \" <small class=\\\"author\\\" itemprop=\\\"author\\\">Steve Martin</small>]\"\n      ]\n     },\n     \"execution_count\": 35,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"soup.select(\\\".author\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# I used a set to not worry about repeat authors.\\n\",\n    \"authors = set() \\n\",\n    \"for name in soup.select(\\\".author\\\"):\\n\",\n    \"    authors.add(name.text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'Albert Einstein',\\n\",\n       \" 'André Gide',\\n\",\n       \" 'Eleanor Roosevelt',\\n\",\n       \" 'J.K. Rowling',\\n\",\n       \" 'Jane Austen',\\n\",\n       \" 'Marilyn Monroe',\\n\",\n       \" 'Steve Martin',\\n\",\n       \" 'Thomas A. Edison'}\"\n      ]\n     },\n     \"execution_count\": 37,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"authors\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Create a list of all the quotes on the first page.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"quotes = []\\n\",\n    \"for quote in soup.select(\\\".text\\\"):\\n\",\n    \"    quotes.append(quote.text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”',\\n\",\n       \" '“It is our choices, Harry, that show what we truly are, far more than our abilities.”',\\n\",\n       \" '“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”',\\n\",\n       \" '“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”',\\n\",\n       \" \\\"“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”\\\",\\n\",\n       \" '“Try not to become a man of success. Rather become a man of value.”',\\n\",\n       \" '“It is better to be hated for what you are than to be loved for what you are not.”',\\n\",\n       \" \\\"“I have not failed. I've just found 10,000 ways that won't work.”\\\",\\n\",\n       \" \\\"“A woman is like a tea bag; you never know how strong it is until it's in hot water.”\\\",\\n\",\n       \" '“A day without sunshine is like, you know, night.”']\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"quotes\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Inspect the site and use Beautiful Soup to extract the top ten tags from the requests text shown on the top right from the home page (e.g Love,Inspirational,Life, etc...). HINT: Keep in mind there are also tags underneath each quote, try to find a class only present in the top right tags, perhaps check the span.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"soup = bs4.BeautifulSoup(res.text,'lxml')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[<span class=\\\"tag-item\\\">\\n\",\n       \" <a class=\\\"tag\\\" href=\\\"/tag/love/\\\" style=\\\"font-size: 28px\\\">love</a>\\n\",\n       \" </span>, <span class=\\\"tag-item\\\">\\n\",\n       \" <a class=\\\"tag\\\" href=\\\"/tag/inspirational/\\\" style=\\\"font-size: 26px\\\">inspirational</a>\\n\",\n       \" </span>, <span class=\\\"tag-item\\\">\\n\",\n       \" <a class=\\\"tag\\\" href=\\\"/tag/life/\\\" style=\\\"font-size: 26px\\\">life</a>\\n\",\n       \" </span>, <span class=\\\"tag-item\\\">\\n\",\n       \" <a class=\\\"tag\\\" href=\\\"/tag/humor/\\\" style=\\\"font-size: 24px\\\">humor</a>\\n\",\n       \" </span>, <span class=\\\"tag-item\\\">\\n\",\n       \" <a class=\\\"tag\\\" href=\\\"/tag/books/\\\" style=\\\"font-size: 22px\\\">books</a>\\n\",\n       \" </span>, <span class=\\\"tag-item\\\">\\n\",\n       \" <a class=\\\"tag\\\" href=\\\"/tag/reading/\\\" style=\\\"font-size: 14px\\\">reading</a>\\n\",\n       \" </span>, <span class=\\\"tag-item\\\">\\n\",\n       \" <a class=\\\"tag\\\" href=\\\"/tag/friendship/\\\" style=\\\"font-size: 10px\\\">friendship</a>\\n\",\n       \" </span>, <span class=\\\"tag-item\\\">\\n\",\n       \" <a class=\\\"tag\\\" href=\\\"/tag/friends/\\\" style=\\\"font-size: 8px\\\">friends</a>\\n\",\n       \" </span>, <span class=\\\"tag-item\\\">\\n\",\n       \" <a class=\\\"tag\\\" href=\\\"/tag/truth/\\\" style=\\\"font-size: 8px\\\">truth</a>\\n\",\n       \" </span>, <span class=\\\"tag-item\\\">\\n\",\n       \" <a class=\\\"tag\\\" href=\\\"/tag/simile/\\\" style=\\\"font-size: 6px\\\">simile</a>\\n\",\n       \" </span>]\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"soup.select('.tag-item')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\n\",\n      \"love\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"inspirational\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"life\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"humor\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"books\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"reading\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"friendship\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"friends\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"truth\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"simile\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for item in soup.select(\\\".tag-item\\\"):\\n\",\n    \"    print(item.text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Notice how there is more than one page, and subsequent pages look like this http://quotes.toscrape.com/page/2/. Use what you know about for loops and string concatenation to loop through all the pages and get all the unique authors on the website. Keep in mind there are many ways to achieve this, also note that you will need to somehow figure out how to check that your loop is on the last page with quotes. For debugging purposes, I will let you know that there are only 10 pages, so the last page is http://quotes.toscrape.com/page/10/, but try to create a loop that is robust enough that it wouldn't matter to know the amount of pages beforehand, perhaps use try/except for this, its up to you!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Possible Solution #1 ( Assuming You Know Number of Pages)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"url = 'http://quotes.toscrape.com/page/'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 40,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"authors = set()\\n\",\n    \"\\n\",\n    \"for page in range(1,10):\\n\",\n    \"\\n\",\n    \"    # Concatenate to get new page URL\\n\",\n    \"    page_url = url+str(page)\\n\",\n    \"    # Obtain Request\\n\",\n    \"    res = requests.get(page_url)\\n\",\n    \"    # Turn into Soup\\n\",\n    \"    soup = bs4.BeautifulSoup(res.text,'lxml')\\n\",\n    \"    # Add Authors to our set\\n\",\n    \"    for name in soup.select(\\\".author\\\"):\\n\",\n    \"        authors.add(name.text)\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Possible Solution #2 ( Unknown Number of Pages, but knowledge of last page)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's check what the last invalid page looks like:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Choose some huge page number we know doesn't exist\\n\",\n    \"page_url = url+str(9999999)\\n\",\n    \"\\n\",\n    \"# Obtain Request\\n\",\n    \"res = requests.get(page_url)\\n\",\n    \"\\n\",\n    \"# Turn into Soup\\n\",\n    \"soup = bs4.BeautifulSoup(res.text,'lxml')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 46,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<!DOCTYPE html>\\n\",\n       \"<html lang=\\\"en\\\">\\n\",\n       \"<head>\\n\",\n       \"<meta charset=\\\"utf-8\\\"/>\\n\",\n       \"<title>Quotes to Scrape</title>\\n\",\n       \"<link href=\\\"/static/bootstrap.min.css\\\" rel=\\\"stylesheet\\\"/>\\n\",\n       \"<link href=\\\"/static/main.css\\\" rel=\\\"stylesheet\\\"/>\\n\",\n       \"</head>\\n\",\n       \"<body>\\n\",\n       \"<div class=\\\"container\\\">\\n\",\n       \"<div class=\\\"row header-box\\\">\\n\",\n       \"<div class=\\\"col-md-8\\\">\\n\",\n       \"<h1>\\n\",\n       \"<a href=\\\"/\\\" style=\\\"text-decoration: none\\\">Quotes to Scrape</a>\\n\",\n       \"</h1>\\n\",\n       \"</div>\\n\",\n       \"<div class=\\\"col-md-4\\\">\\n\",\n       \"<p>\\n\",\n       \"<a href=\\\"/login\\\">Login</a>\\n\",\n       \"</p>\\n\",\n       \"</div>\\n\",\n       \"</div>\\n\",\n       \"<div class=\\\"row\\\">\\n\",\n       \"<div class=\\\"col-md-8\\\">\\n\",\n       \"\\n\",\n       \"No quotes found!\\n\",\n       \"\\n\",\n       \"    <nav>\\n\",\n       \"<ul class=\\\"pager\\\">\\n\",\n       \"<li class=\\\"previous\\\">\\n\",\n       \"<a href=\\\"/page/9999998/\\\"><span aria-hidden=\\\"true\\\">←</span> Previous</a>\\n\",\n       \"</li>\\n\",\n       \"</ul>\\n\",\n       \"</nav>\\n\",\n       \"</div>\\n\",\n       \"<div class=\\\"col-md-4 tags-box\\\">\\n\",\n       \"<h2>Top Ten tags</h2>\\n\",\n       \"<span class=\\\"tag-item\\\">\\n\",\n       \"<a class=\\\"tag\\\" href=\\\"/tag/love/\\\" style=\\\"font-size: 28px\\\">love</a>\\n\",\n       \"</span>\\n\",\n       \"<span class=\\\"tag-item\\\">\\n\",\n       \"<a class=\\\"tag\\\" href=\\\"/tag/inspirational/\\\" style=\\\"font-size: 26px\\\">inspirational</a>\\n\",\n       \"</span>\\n\",\n       \"<span class=\\\"tag-item\\\">\\n\",\n       \"<a class=\\\"tag\\\" href=\\\"/tag/life/\\\" style=\\\"font-size: 26px\\\">life</a>\\n\",\n       \"</span>\\n\",\n       \"<span class=\\\"tag-item\\\">\\n\",\n       \"<a class=\\\"tag\\\" href=\\\"/tag/humor/\\\" style=\\\"font-size: 24px\\\">humor</a>\\n\",\n       \"</span>\\n\",\n       \"<span class=\\\"tag-item\\\">\\n\",\n       \"<a class=\\\"tag\\\" href=\\\"/tag/books/\\\" style=\\\"font-size: 22px\\\">books</a>\\n\",\n       \"</span>\\n\",\n       \"<span class=\\\"tag-item\\\">\\n\",\n       \"<a class=\\\"tag\\\" href=\\\"/tag/reading/\\\" style=\\\"font-size: 14px\\\">reading</a>\\n\",\n       \"</span>\\n\",\n       \"<span class=\\\"tag-item\\\">\\n\",\n       \"<a class=\\\"tag\\\" href=\\\"/tag/friendship/\\\" style=\\\"font-size: 10px\\\">friendship</a>\\n\",\n       \"</span>\\n\",\n       \"<span class=\\\"tag-item\\\">\\n\",\n       \"<a class=\\\"tag\\\" href=\\\"/tag/friends/\\\" style=\\\"font-size: 8px\\\">friends</a>\\n\",\n       \"</span>\\n\",\n       \"<span class=\\\"tag-item\\\">\\n\",\n       \"<a class=\\\"tag\\\" href=\\\"/tag/truth/\\\" style=\\\"font-size: 8px\\\">truth</a>\\n\",\n       \"</span>\\n\",\n       \"<span class=\\\"tag-item\\\">\\n\",\n       \"<a class=\\\"tag\\\" href=\\\"/tag/simile/\\\" style=\\\"font-size: 6px\\\">simile</a>\\n\",\n       \"</span>\\n\",\n       \"</div>\\n\",\n       \"</div>\\n\",\n       \"</div>\\n\",\n       \"<footer class=\\\"footer\\\">\\n\",\n       \"<div class=\\\"container\\\">\\n\",\n       \"<p class=\\\"text-muted\\\">\\n\",\n       \"                Quotes by: <a href=\\\"https://www.goodreads.com/quotes\\\">GoodReads.com</a>\\n\",\n       \"</p>\\n\",\n       \"<p class=\\\"copyright\\\">\\n\",\n       \"                Made with <span class=\\\"sh-red\\\">❤</span> by <a href=\\\"https://scrapinghub.com\\\">Scrapinghub</a>\\n\",\n       \"</p>\\n\",\n       \"</div>\\n\",\n       \"</footer>\\n\",\n       \"</body>\\n\",\n       \"</html>\"\n      ]\n     },\n     \"execution_count\": 46,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"soup\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 47,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 47,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# This solution requires that the string \\\"No quotes found!\\\" only occurs on the last page.\\n\",\n    \"# If for some reason this string was on the other pages, we would need to be more detailed.\\n\",\n    \"\\\"No quotes found!\\\" in res.text\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 48,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"page_still_valid = True\\n\",\n    \"authors = set()\\n\",\n    \"page = 1\\n\",\n    \"\\n\",\n    \"while page_still_valid:\\n\",\n    \"\\n\",\n    \"    # Concatenate to get new page URL\\n\",\n    \"    page_url = url+str(page)\\n\",\n    \"    \\n\",\n    \"    # Obtain Request\\n\",\n    \"    res = requests.get(page_url)\\n\",\n    \"    \\n\",\n    \"    # Check to see if we're on the last page\\n\",\n    \"    if \\\"No quotes found!\\\" in res.text:\\n\",\n    \"        break\\n\",\n    \"    \\n\",\n    \"    # Turn into Soup\\n\",\n    \"    soup = bs4.BeautifulSoup(res.text,'lxml')\\n\",\n    \"    \\n\",\n    \"    # Add Authors to our set\\n\",\n    \"    for name in soup.select(\\\".author\\\"):\\n\",\n    \"        authors.add(name.text)\\n\",\n    \"        \\n\",\n    \"    # Go to Next Page\\n\",\n    \"    page += 1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 49,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'Albert Einstein',\\n\",\n       \" 'Alexandre Dumas fils',\\n\",\n       \" 'Alfred Tennyson',\\n\",\n       \" 'Allen Saunders',\\n\",\n       \" 'André Gide',\\n\",\n       \" 'Ayn Rand',\\n\",\n       \" 'Bob Marley',\\n\",\n       \" 'C.S. Lewis',\\n\",\n       \" 'Charles Bukowski',\\n\",\n       \" 'Charles M. Schulz',\\n\",\n       \" 'Douglas Adams',\\n\",\n       \" 'Dr. Seuss',\\n\",\n       \" 'E.E. Cummings',\\n\",\n       \" 'Eleanor Roosevelt',\\n\",\n       \" 'Elie Wiesel',\\n\",\n       \" 'Ernest Hemingway',\\n\",\n       \" 'Friedrich Nietzsche',\\n\",\n       \" 'Garrison Keillor',\\n\",\n       \" 'George Bernard Shaw',\\n\",\n       \" 'George Carlin',\\n\",\n       \" 'George Eliot',\\n\",\n       \" 'George R.R. Martin',\\n\",\n       \" 'Harper Lee',\\n\",\n       \" 'Haruki Murakami',\\n\",\n       \" 'Helen Keller',\\n\",\n       \" 'J.D. Salinger',\\n\",\n       \" 'J.K. Rowling',\\n\",\n       \" 'J.M. Barrie',\\n\",\n       \" 'J.R.R. Tolkien',\\n\",\n       \" 'James Baldwin',\\n\",\n       \" 'Jane Austen',\\n\",\n       \" 'Jim Henson',\\n\",\n       \" 'Jimi Hendrix',\\n\",\n       \" 'John Lennon',\\n\",\n       \" 'Jorge Luis Borges',\\n\",\n       \" 'Khaled Hosseini',\\n\",\n       \" \\\"Madeleine L'Engle\\\",\\n\",\n       \" 'Marilyn Monroe',\\n\",\n       \" 'Mark Twain',\\n\",\n       \" 'Martin Luther King Jr.',\\n\",\n       \" 'Mother Teresa',\\n\",\n       \" 'Pablo Neruda',\\n\",\n       \" 'Ralph Waldo Emerson',\\n\",\n       \" 'Stephenie Meyer',\\n\",\n       \" 'Steve Martin',\\n\",\n       \" 'Suzanne Collins',\\n\",\n       \" 'Terry Pratchett',\\n\",\n       \" 'Thomas A. Edison',\\n\",\n       \" 'W.C. Fields',\\n\",\n       \" 'William Nicholson'}\"\n      ]\n     },\n     \"execution_count\": 49,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"authors\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There are lots of other potential solutions that are even more robust and flexible, the main idea is the same though, use a while loop to cycle through potential pages and have a break condition based on the invalid page.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "13-Web-Scraping/00-Guide-to-Web-Scraping.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Guide to Web Scraping\\n\",\n    \"\\n\",\n    \"Let's get you started with web scraping and Python. Before we begin, here are some important rules to follow and understand:\\n\",\n    \"\\n\",\n    \"1. Always be respectful and try to get premission to scrape, do not bombard a website with scraping requests, otherwise your IP address may be blocked!\\n\",\n    \"2. Be aware that websites change often, meaning your code could go from working to totally broken from one day to the next.\\n\",\n    \"3. Pretty much every web scraping project of interest is a unique and custom job, so try your best to generalize the skills learned here.\\n\",\n    \"\\n\",\n    \"OK, let's get started with the basics!\\n\",\n    \"\\n\",\n    \"## Basic components of a WebSite\\n\",\n    \"\\n\",\n    \"### HTML\\n\",\n    \"HTML stands for  Hypertext Markup Language and every website on the internet uses it to display information. Even the jupyter notebook system uses it to display this information in your browser. If you right click on a website and select \\\"View Page Source\\\" you can see the raw HTML of a web page. This is the information that Python will be looking at to grab information from. Let's take a look at a simple webpage's HTML:\\n\",\n    \"\\n\",\n    \"    <!DOCTYPE html>  \\n\",\n    \"    <html>  \\n\",\n    \"        <head>\\n\",\n    \"            <title>Title on Browser Tab</title>\\n\",\n    \"        </head>\\n\",\n    \"        <body>\\n\",\n    \"            <h1> Website Header </h1>\\n\",\n    \"            <p> Some Paragraph </p>\\n\",\n    \"        <body>\\n\",\n    \"    </html>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's breakdown these components.\\n\",\n    \"\\n\",\n    \"Every <tag> indicates a specific block type on the webpage:\\n\",\n    \"\\n\",\n    \"    1.<DOCTYPE html> HTML documents will always start with this type declaration, letting the browser know its an HTML file.\\n\",\n    \"    2. The component blocks of the HTML document are placed between <html> and </html>.\\n\",\n    \"    3. Meta data and script connections (like a link to a CSS file or a JS file) are often placed in the <head> block.\\n\",\n    \"    4. The <title> tag block defines the title of the webpage (its what shows up in the tab of a website you're visiting).\\n\",\n    \"    5. Is between <body> and </body> tags are the blocks that will be visible to the site visitor.\\n\",\n    \"    6. Headings are defined by the <h1> through <h6> tags, where the number represents the size of the heading.\\n\",\n    \"    7. Paragraphs are defined by the <p> tag, this is essentially just normal text on the website.\\n\",\n    \"\\n\",\n    \"    There are many more tags than just these, such as <a> for hyperlinks, <table> for tables, <tr> for table rows, and <td> for table columns, and more!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### CSS\\n\",\n    \"\\n\",\n    \"CSS stands for Cascading Style Sheets, this is what gives \\\"style\\\" to a website, including colors and fonts, and even some animations! CSS uses tags such as **id** or **class** to connect an HTML element to a CSS feature, such as a particular color. **id** is a unique id for an HTML tag and must be unique within the HTML document, basically a single use connection. **class** defines a general style that can then be linked to multiple HTML tags. Basically if you only want a single html tag to be red, you would use an id tag, if you wanted several HTML tags/blocks to be red, you would create a class in your CSS doc and then link it to the rest of these blocks.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Scraping Guidelines\\n\",\n    \"\\n\",\n    \"Keep in mind you should always have permission for the website you are scraping! Check a websites terms and conditions for more info. Also keep in mind that a computer can send requests to a website very fast, so a website may block your computer's ip address if you send too many requests too quickly. Lastly, websites change all the time! You will most likely need to update your code often for long term web-scraping jobs.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Web Scraping with Python\\n\",\n    \"\\n\",\n    \"There are a few libraries you will need, you can go to your command line and install them with conda install (if you are using anaconda distribution), or pip install for other python distributions.\\n\",\n    \"\\n\",\n    \"    conda install requests\\n\",\n    \"    conda install lxml\\n\",\n    \"    conda install bs4\\n\",\n    \"    \\n\",\n    \"if you are not using the Anaconda Installation, you can use **pip install** instead of **conda install**, for example:\\n\",\n    \"\\n\",\n    \"    pip install requests\\n\",\n    \"    pip install lxml\\n\",\n    \"    pip install bs4\\n\",\n    \"    \\n\",\n    \"Now let's see what we can do with these libraries.\\n\",\n    \"\\n\",\n    \"----\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Example Task 0 - Grabbing the title of a page\\n\",\n    \"\\n\",\n    \"Let's start very simple, we will grab the title of a page. Remember that this is the HTML block with the **title** tag. For this task we will use **www.example.com** which is a website specifically made to serve as an example domain. Let's go through the main steps:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import requests\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Step 1: Use the requests library to grab the page\\n\",\n    \"# Note, this may fail if you have a firewall blocking Python/Jupyter \\n\",\n    \"# Note sometimes you need to run this twice if it fails the first time\\n\",\n    \"res = requests.get(\\\"http://www.example.com\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This object is a requests.models.Response object and it actually contains the information from the website, for example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"requests.models.Response\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"type(res)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'<!doctype html>\\\\n<html>\\\\n<head>\\\\n    <title>Example Domain</title>\\\\n\\\\n    <meta charset=\\\"utf-8\\\" />\\\\n    <meta http-equiv=\\\"Content-type\\\" content=\\\"text/html; charset=utf-8\\\" />\\\\n    <meta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1\\\" />\\\\n    <style type=\\\"text/css\\\">\\\\n    body {\\\\n        background-color: #f0f0f2;\\\\n        margin: 0;\\\\n        padding: 0;\\\\n        font-family: -apple-system, system-ui, BlinkMacSystemFont, \\\"Segoe UI\\\", \\\"Open Sans\\\", \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif;\\\\n        \\\\n    }\\\\n    div {\\\\n        width: 600px;\\\\n        margin: 5em auto;\\\\n        padding: 2em;\\\\n        background-color: #fdfdff;\\\\n        border-radius: 0.5em;\\\\n        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);\\\\n    }\\\\n    a:link, a:visited {\\\\n        color: #38488f;\\\\n        text-decoration: none;\\\\n    }\\\\n    @media (max-width: 700px) {\\\\n        div {\\\\n            margin: 0 auto;\\\\n            width: auto;\\\\n        }\\\\n    }\\\\n    </style>    \\\\n</head>\\\\n\\\\n<body>\\\\n<div>\\\\n    <h1>Example Domain</h1>\\\\n    <p>This domain is for use in illustrative examples in documents. You may use this\\\\n    domain in literature without prior coordination or asking for permission.</p>\\\\n    <p><a href=\\\"https://www.iana.org/domains/example\\\">More information...</a></p>\\\\n</div>\\\\n</body>\\\\n</html>\\\\n'\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"res.text\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"Now we use BeautifulSoup to analyze the extracted page. Technically we could use our own custom script to loook for items in the string of **res.text** but the BeautifulSoup library already has lots of built-in tools and methods to grab information from a string of this nature (basically an HTML file). Using BeautifulSoup we can create a \\\"soup\\\" object that contains all the \\\"ingredients\\\" of the webpage. Don't ask me about the weird library names, I didn't choose them! :)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import bs4\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"soup = bs4.BeautifulSoup(res.text,\\\"lxml\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<!DOCTYPE html>\\n\",\n       \"<html>\\n\",\n       \"<head>\\n\",\n       \"<title>Example Domain</title>\\n\",\n       \"<meta charset=\\\"utf-8\\\"/>\\n\",\n       \"<meta content=\\\"text/html; charset=utf-8\\\" http-equiv=\\\"Content-type\\\"/>\\n\",\n       \"<meta content=\\\"width=device-width, initial-scale=1\\\" name=\\\"viewport\\\"/>\\n\",\n       \"<style type=\\\"text/css\\\">\\n\",\n       \"    body {\\n\",\n       \"        background-color: #f0f0f2;\\n\",\n       \"        margin: 0;\\n\",\n       \"        padding: 0;\\n\",\n       \"        font-family: -apple-system, system-ui, BlinkMacSystemFont, \\\"Segoe UI\\\", \\\"Open Sans\\\", \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif;\\n\",\n       \"        \\n\",\n       \"    }\\n\",\n       \"    div {\\n\",\n       \"        width: 600px;\\n\",\n       \"        margin: 5em auto;\\n\",\n       \"        padding: 2em;\\n\",\n       \"        background-color: #fdfdff;\\n\",\n       \"        border-radius: 0.5em;\\n\",\n       \"        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);\\n\",\n       \"    }\\n\",\n       \"    a:link, a:visited {\\n\",\n       \"        color: #38488f;\\n\",\n       \"        text-decoration: none;\\n\",\n       \"    }\\n\",\n       \"    @media (max-width: 700px) {\\n\",\n       \"        div {\\n\",\n       \"            margin: 0 auto;\\n\",\n       \"            width: auto;\\n\",\n       \"        }\\n\",\n       \"    }\\n\",\n       \"    </style>\\n\",\n       \"</head>\\n\",\n       \"<body>\\n\",\n       \"<div>\\n\",\n       \"<h1>Example Domain</h1>\\n\",\n       \"<p>This domain is for use in illustrative examples in documents. You may use this\\n\",\n       \"    domain in literature without prior coordination or asking for permission.</p>\\n\",\n       \"<p><a href=\\\"https://www.iana.org/domains/example\\\">More information...</a></p>\\n\",\n       \"</div>\\n\",\n       \"</body>\\n\",\n       \"</html>\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"soup\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now let's use the **.select()** method to grab elements. We are looking for the 'title' tag, so we will pass in 'title'\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[<title>Example Domain</title>]\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"soup.select('title')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice what is returned here, its actually a list containing all the title elements (along with their tags). You can use indexing or even looping to grab the elements from the list. Since this object it still a specialized tag, we cna use method calls to grab just the text.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"title_tag = soup.select('title')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<title>Example Domain</title>\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"title_tag[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"bs4.element.Tag\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"type(title_tag[0])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Example Domain'\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"title_tag[0].getText()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Example Task 1 - Grabbing all elements of a class\\n\",\n    \"\\n\",\n    \"Let's try to grab all the section headings of the Wikipedia Article on Grace Hopper from this URL: https://en.wikipedia.org/wiki/Grace_Hopper\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# First get the request\\n\",\n    \"res = requests.get('https://en.wikipedia.org/wiki/Grace_Hopper')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Create a soup from request\\n\",\n    \"soup = bs4.BeautifulSoup(res.text,\\\"lxml\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now its time to figure out what we are actually looking for. Inspect the element on the page to see that the section headers have the class \\\"mw-headline\\\". Because this is a class and not a straight tag, we need to adhere to some syntax for CSS. In this case\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<table>\\n\",\n    \"\\n\",\n    \"<thead >\\n\",\n    \"<tr>\\n\",\n    \"<th>\\n\",\n    \"<p>Syntax to pass to the .select() method</p>\\n\",\n    \"</th>\\n\",\n    \"<th>\\n\",\n    \"<p>Match Results</p>\\n\",\n    \"</th>\\n\",\n    \"</tr>\\n\",\n    \"</thead>\\n\",\n    \"<tbody>\\n\",\n    \"<tr>\\n\",\n    \"<td>\\n\",\n    \"<p><code>soup.select('div')</code></p>\\n\",\n    \"</td>\\n\",\n    \"<td>\\n\",\n    \"<p>All elements with the <code>&lt;div&gt;</code> tag</p>\\n\",\n    \"</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>\\n\",\n    \"<p><code>soup.select('#some_id')</code></p>\\n\",\n    \"</td>\\n\",\n    \"<td>\\n\",\n    \"<p>The HTML element containing the <code>id</code> attribute of <code>some_id</code></p>\\n\",\n    \"</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>\\n\",\n    \"<p><code>soup.select('.notice')</code></p>\\n\",\n    \"</td>\\n\",\n    \"<td>\\n\",\n    \"<p>All the HTML elements with the CSS <code>class</code> named <code>notice</code></p>\\n\",\n    \"</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>\\n\",\n    \"<p><code>soup.select('div span')</code></p>\\n\",\n    \"</td>\\n\",\n    \"<td>\\n\",\n    \"<p>Any elements named <code>&lt;span&gt;</code> that are within an element named <code>&lt;div&gt;</code></p>\\n\",\n    \"</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"<td>\\n\",\n    \"<p><code>soup.select('div &gt; span')</code></p>\\n\",\n    \"</td>\\n\",\n    \"<td>\\n\",\n    \"<p>Any elements named <code class=\\\"literal2\\\">&lt;span&gt;</code> that are <span><em >directly</em></span> within an element named <code class=\\\"literal2\\\">&lt;div&gt;</code>, with no other element in between</p>\\n\",\n    \"</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"\\n\",\n    \"</tr>\\n\",\n    \"</tbody>\\n\",\n    \"</table>\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[<div class=\\\"vector-toc-text\\\">(Top)</div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">1</span>\\n\",\n       \" <span>Early life and education</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">2</span>\\n\",\n       \" <span>Career</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">2.1</span>\\n\",\n       \" <span>World War II</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">2.2</span>\\n\",\n       \" <span>UNIVAC</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">2.3</span>\\n\",\n       \" <span>COBOL</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">2.4</span>\\n\",\n       \" <span>Standards</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">3</span>\\n\",\n       \" <span>Retirement</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">4</span>\\n\",\n       \" <span>Post-retirement</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">5</span>\\n\",\n       \" <span>Anecdotes</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">6</span>\\n\",\n       \" <span>Death</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">7</span>\\n\",\n       \" <span>Dates of rank</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">8</span>\\n\",\n       \" <span>Awards and honors</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">8.1</span>\\n\",\n       \" <span>Military awards</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">8.2</span>\\n\",\n       \" <span>Other awards</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">9</span>\\n\",\n       \" <span>Legacy</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">9.1</span>\\n\",\n       \" <span>Places</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">9.2</span>\\n\",\n       \" <span>Programs</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">9.3</span>\\n\",\n       \" <span>In popular culture</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">9.3.1</span>\\n\",\n       \" <span>Grace Hopper Celebration of Women in Computing</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">10</span>\\n\",\n       \" <span>See also</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">11</span>\\n\",\n       \" <span>Notes</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">12</span>\\n\",\n       \" <span>References</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">13</span>\\n\",\n       \" <span>Obituary notices</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">14</span>\\n\",\n       \" <span>Further reading</span>\\n\",\n       \" </div>,\\n\",\n       \" <div class=\\\"vector-toc-text\\\">\\n\",\n       \" <span class=\\\"vector-toc-numb\\\">15</span>\\n\",\n       \" <span>External links</span>\\n\",\n       \" </div>]\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# note depending on your IP Address, \\n\",\n    \"# this class may be called something different\\n\",\n    \"soup.select(\\\".vector-toc-text\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"(Top)\\n\",\n      \"\\n\",\n      \"1\\n\",\n      \"Early life and education\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"2\\n\",\n      \"Career\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"2.1\\n\",\n      \"World War II\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"2.2\\n\",\n      \"UNIVAC\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"2.3\\n\",\n      \"COBOL\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"2.4\\n\",\n      \"Standards\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"3\\n\",\n      \"Retirement\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"4\\n\",\n      \"Post-retirement\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"5\\n\",\n      \"Anecdotes\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"6\\n\",\n      \"Death\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"7\\n\",\n      \"Dates of rank\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"8\\n\",\n      \"Awards and honors\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"8.1\\n\",\n      \"Military awards\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"8.2\\n\",\n      \"Other awards\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"9\\n\",\n      \"Legacy\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"9.1\\n\",\n      \"Places\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"9.2\\n\",\n      \"Programs\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"9.3\\n\",\n      \"In popular culture\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"9.3.1\\n\",\n      \"Grace Hopper Celebration of Women in Computing\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"10\\n\",\n      \"See also\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"11\\n\",\n      \"Notes\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"12\\n\",\n      \"References\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"13\\n\",\n      \"Obituary notices\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"14\\n\",\n      \"Further reading\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"15\\n\",\n      \"External links\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for item in soup.select(\\\".vector-toc-text\\\"):\\n\",\n    \"    print(item.text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Example Task 3 - Getting an Image from a Website\\n\",\n    \"\\n\",\n    \"Let's attempt to grab the image of the Deep Blue Computer from this wikipedia article: https://en.wikipedia.org/wiki/Deep_Blue_(chess_computer)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"res = requests.get(\\\"https://en.wikipedia.org/wiki/Deep_Blue_(chess_computer)\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"soup = bs4.BeautifulSoup(res.text,'lxml')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"image_info = soup.select('.mw-file-element')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[<img alt=\\\"This is a good article. Click here for more information.\\\" class=\\\"mw-file-element\\\" data-file-height=\\\"185\\\" data-file-width=\\\"180\\\" decoding=\\\"async\\\" height=\\\"20\\\" src=\\\"//upload.wikimedia.org/wikipedia/en/thumb/9/94/Symbol_support_vote.svg/20px-Symbol_support_vote.svg.png\\\" srcset=\\\"//upload.wikimedia.org/wikipedia/en/thumb/9/94/Symbol_support_vote.svg/40px-Symbol_support_vote.svg.png 1.5x\\\" width=\\\"19\\\"/>,\\n\",\n       \" <img class=\\\"mw-file-element\\\" data-file-height=\\\"601\\\" data-file-width=\\\"400\\\" decoding=\\\"async\\\" height=\\\"376\\\" src=\\\"//upload.wikimedia.org/wikipedia/commons/thumb/b/be/Deep_Blue.jpg/250px-Deep_Blue.jpg\\\" srcset=\\\"//upload.wikimedia.org/wikipedia/commons/thumb/b/be/Deep_Blue.jpg/375px-Deep_Blue.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/b/be/Deep_Blue.jpg 2x\\\" width=\\\"250\\\"/>,\\n\",\n       \" <img class=\\\"mw-file-element\\\" data-file-height=\\\"64\\\" data-file-width=\\\"64\\\" decoding=\\\"async\\\" height=\\\"150\\\" src=\\\"//upload.wikimedia.org/wikipedia/commons/thumb/5/52/Chess_Programming.svg/150px-Chess_Programming.svg.png\\\" srcset=\\\"//upload.wikimedia.org/wikipedia/commons/thumb/5/52/Chess_Programming.svg/225px-Chess_Programming.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/5/52/Chess_Programming.svg/300px-Chess_Programming.svg.png 2x\\\" width=\\\"150\\\"/>,\\n\",\n       \" <img class=\\\"mw-file-element\\\" data-file-height=\\\"600\\\" data-file-width=\\\"800\\\" decoding=\\\"async\\\" height=\\\"188\\\" src=\\\"//upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Kasparov_Magath_1985_Hamburg-2.png/250px-Kasparov_Magath_1985_Hamburg-2.png\\\" srcset=\\\"//upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Kasparov_Magath_1985_Hamburg-2.png/500px-Kasparov_Magath_1985_Hamburg-2.png 1.5x\\\" width=\\\"250\\\"/>,\\n\",\n       \" <img class=\\\"mw-file-element\\\" data-file-height=\\\"2756\\\" data-file-width=\\\"2067\\\" decoding=\\\"async\\\" height=\\\"333\\\" src=\\\"//upload.wikimedia.org/wikipedia/commons/thumb/8/83/One_of_Deep_Blue%27s_processors_%282586060990%29.jpg/250px-One_of_Deep_Blue%27s_processors_%282586060990%29.jpg\\\" srcset=\\\"//upload.wikimedia.org/wikipedia/commons/thumb/8/83/One_of_Deep_Blue%27s_processors_%282586060990%29.jpg/500px-One_of_Deep_Blue%27s_processors_%282586060990%29.jpg 1.5x\\\" width=\\\"250\\\"/>,\\n\",\n       \" <img alt=\\\"icon\\\" class=\\\"mw-file-element\\\" data-file-height=\\\"512\\\" data-file-width=\\\"512\\\" decoding=\\\"async\\\" height=\\\"28\\\" src=\\\"//upload.wikimedia.org/wikipedia/commons/thumb/0/05/Chess.svg/40px-Chess.svg.png\\\" srcset=\\\"//upload.wikimedia.org/wikipedia/commons/thumb/0/05/Chess.svg/60px-Chess.svg.png 1.5x\\\" width=\\\"28\\\"/>,\\n\",\n       \" <img alt=\\\"icon\\\" class=\\\"mw-file-element\\\" data-file-height=\\\"512\\\" data-file-width=\\\"512\\\" decoding=\\\"async\\\" height=\\\"28\\\" src=\\\"//upload.wikimedia.org/wikipedia/commons/thumb/0/05/Chess.svg/40px-Chess.svg.png\\\" srcset=\\\"//upload.wikimedia.org/wikipedia/commons/thumb/0/05/Chess.svg/60px-Chess.svg.png 1.5x\\\" width=\\\"28\\\"/>,\\n\",\n       \" <img alt=\\\"\\\" class=\\\"mw-file-element\\\" data-file-height=\\\"1376\\\" data-file-width=\\\"1024\\\" decoding=\\\"async\\\" height=\\\"16\\\" src=\\\"//upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/20px-Commons-logo.svg.png\\\" srcset=\\\"//upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/40px-Commons-logo.svg.png 2x\\\" width=\\\"12\\\"/>,\\n\",\n       \" <img alt=\\\"\\\" class=\\\"mw-file-element\\\" data-file-height=\\\"185\\\" data-file-width=\\\"180\\\" decoding=\\\"async\\\" height=\\\"16\\\" src=\\\"//upload.wikimedia.org/wikipedia/en/thumb/9/96/Symbol_category_class.svg/20px-Symbol_category_class.svg.png\\\" srcset=\\\"//upload.wikimedia.org/wikipedia/en/thumb/9/96/Symbol_category_class.svg/40px-Symbol_category_class.svg.png 1.5x\\\" width=\\\"16\\\"/>,\\n\",\n       \" <img alt=\\\"\\\" class=\\\"mw-file-element\\\" data-file-height=\\\"185\\\" data-file-width=\\\"180\\\" decoding=\\\"async\\\" height=\\\"16\\\" src=\\\"//upload.wikimedia.org/wikipedia/commons/thumb/8/83/Symbol_template_class_pink.svg/20px-Symbol_template_class_pink.svg.png\\\" srcset=\\\"//upload.wikimedia.org/wikipedia/commons/thumb/8/83/Symbol_template_class_pink.svg/40px-Symbol_template_class_pink.svg.png 1.5x\\\" width=\\\"16\\\"/>,\\n\",\n       \" <img alt=\\\"Edit this at Wikidata\\\" class=\\\"mw-file-element\\\" data-file-height=\\\"20\\\" data-file-width=\\\"20\\\" decoding=\\\"async\\\" height=\\\"10\\\" src=\\\"//upload.wikimedia.org/wikipedia/en/thumb/8/8a/OOjs_UI_icon_edit-ltr-progressive.svg/20px-OOjs_UI_icon_edit-ltr-progressive.svg.png\\\" width=\\\"10\\\"/>]\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"image_info\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"11\"\n      ]\n     },\n     \"execution_count\": 21,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(image_info)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"computer = image_info[1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"bs4.element.Tag\"\n      ]\n     },\n     \"execution_count\": 23,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"type(computer)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can make dictionary like calls for parts of the Tag, in this case, we are interested in the **src** , or \\\"source\\\" of the image, which should be its own .jpg or .png link:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'//upload.wikimedia.org/wikipedia/commons/thumb/b/be/Deep_Blue.jpg/250px-Deep_Blue.jpg'\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"computer['src']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can actually display it with a markdown cell with the following:\\n\",\n    \"\\n\",\n    \"    <img src='https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Deep_Blue.jpg/250px-Deep_Blue.jpg'>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<img src='https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Deep_Blue.jpg/250px-Deep_Blue.jpg'>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now that you have the actual src link, you can grab the image with requests and get along with the .content attribute. Note how we had to add https:// before the link, if you don't do this, requests will complain (but it gives you a pretty descriptive error code).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"image_link = requests.get('https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Deep_Blue.jpg/250px-Deep_Blue.jpg')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"b'\\\\xff\\\\xd8\\\\xff\\\\xe1\\\\x00\\\\x80Exif\\\\x00\\\\x00MM\\\\x00*\\\\x00\\\\x00\\\\x00\\\\x08\\\\x00\\\\x05\\\\x01\\\\x1a\\\\x00\\\\x05\\\\x00\\\\x00\\\\x00\\\\x01\\\\x00\\\\x00\\\\x00J\\\\x01\\\\x1b\\\\x00\\\\x05\\\\x00\\\\x00\\\\x00\\\\x01\\\\x00\\\\x00\\\\x00R\\\\x01(\\\\x00\\\\x03\\\\x00\\\\x00\\\\x00\\\\x01\\\\x00\\\\x02\\\\x00\\\\x00\\\\x01;\\\\x00\\\\x02\\\\x00\\\\x00\\\\x00\\\\x1e\\\\x00\\\\x00\\\\x00Z\\\\x02\\\\x13\\\\x00\\\\x03\\\\x00\\\\x00\\\\x00\\\\x01\\\\x00\\\\x01\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00H\\\\x00\\\\x00\\\\x00\\\\x01\\\\x00\\\\x00\\\\x00H\\\\x00\\\\x00\\\\x00\\\\x01Jim Gardner - thejimmyjob.com\\\\x00\\\\xff\\\\xe2\\\\x02@ICC_PROFILE\\\\x00\\\\x01\\\\x01\\\\x00\\\\x00\\\\x020ADBE\\\\x02\\\\x10\\\\x00\\\\x00mntrRGB XYZ \\\\x07\\\\xcf\\\\x00\\\\x06\\\\x00\\\\x03\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00acspAPPL\\\\x00\\\\x00\\\\x00\\\\x00none\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\xf6\\\\xd6\\\\x00\\\\x01\\\\x00\\\\x00\\\\x00\\\\x00\\\\xd3-ADBE\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\ncprt\\\\x00\\\\x00\\\\x00\\\\xfc\\\\x00\\\\x00\\\\x002desc\\\\x00\\\\x00\\\\x010\\\\x00\\\\x00\\\\x00kwtpt\\\\x00\\\\x00\\\\x01\\\\x9c\\\\x00\\\\x00\\\\x00\\\\x14bkpt\\\\x00\\\\x00\\\\x01\\\\xb0\\\\x00\\\\x00\\\\x00\\\\x14rTRC\\\\x00\\\\x00\\\\x01\\\\xc4\\\\x00\\\\x00\\\\x00\\\\x0egTRC\\\\x00\\\\x00\\\\x01\\\\xd4\\\\x00\\\\x00\\\\x00\\\\x0ebTRC\\\\x00\\\\x00\\\\x01\\\\xe4\\\\x00\\\\x00\\\\x00\\\\x0erXYZ\\\\x00\\\\x00\\\\x01\\\\xf4\\\\x00\\\\x00\\\\x00\\\\x14gXYZ\\\\x00\\\\x00\\\\x02\\\\x08\\\\x00\\\\x00\\\\x00\\\\x14bXYZ\\\\x00\\\\x00\\\\x02\\\\x1c\\\\x00\\\\x00\\\\x00\\\\x14text\\\\x00\\\\x00\\\\x00\\\\x00Copyright 1999 Adobe Systems Incorporated\\\\x00\\\\x00\\\\x00desc\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x11Adobe RGB (1998)\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00XYZ \\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\xf3Q\\\\x00\\\\x01\\\\x00\\\\x00\\\\x00\\\\x01\\\\x16\\\\xccXYZ \\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00curv\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x01\\\\x023\\\\x00\\\\x00curv\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x01\\\\x023\\\\x00\\\\x00curv\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x01\\\\x023\\\\x00\\\\x00XYZ \\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x9c\\\\x18\\\\x00\\\\x00O\\\\xa5\\\\x00\\\\x00\\\\x04\\\\xfcXYZ \\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x004\\\\x8d\\\\x00\\\\x00\\\\xa0,\\\\x00\\\\x00\\\\x0f\\\\x95XYZ \\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00&1\\\\x00\\\\x00\\\\x10/\\\\x00\\\\x00\\\\xbe\\\\x9c\\\\xff\\\\xdb\\\\x00C\\\\x00\\\\x04\\\\x03\\\\x03\\\\x04\\\\x03\\\\x03\\\\x04\\\\x04\\\\x03\\\\x04\\\\x05\\\\x04\\\\x04\\\\x05\\\\x06\\\\n\\\\x07\\\\x06\\\\x06\\\\x06\\\\x06\\\\r\\\\t\\\\n\\\\x08\\\\n\\\\x0f\\\\r\\\\x10\\\\x10\\\\x0f\\\\r\\\\x0f\\\\x0e\\\\x11\\\\x13\\\\x18\\\\x14\\\\x11\\\\x12\\\\x17\\\\x12\\\\x0e\\\\x0f\\\\x15\\\\x1c\\\\x15\\\\x17\\\\x19\\\\x19\\\\x1b\\\\x1b\\\\x1b\\\\x10\\\\x14\\\\x1d\\\\x1f\\\\x1d\\\\x1a\\\\x1f\\\\x18\\\\x1a\\\\x1b\\\\x1a\\\\xff\\\\xdb\\\\x00C\\\\x01\\\\x04\\\\x05\\\\x05\\\\x06\\\\x05\\\\x06\\\\x0c\\\\x07\\\\x07\\\\x0c\\\\x1a\\\\x11\\\\x0f\\\\x11\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\x1a\\\\xff\\\\xc0\\\\x00\\\\x11\\\\x08\\\\x01x\\\\x00\\\\xfa\\\\x03\\\\x01\\\"\\\\x00\\\\x02\\\\x11\\\\x01\\\\x03\\\\x11\\\\x01\\\\xff\\\\xc4\\\\x00\\\\x1d\\\\x00\\\\x00\\\\x00\\\\x06\\\\x03\\\\x01\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x01\\\\x02\\\\x03\\\\x04\\\\x05\\\\x06\\\\x07\\\\x08\\\\t\\\\xff\\\\xc4\\\\x00[\\\\x10\\\\x00\\\\x01\\\\x03\\\\x02\\\\x04\\\\x03\\\\x04\\\\x05\\\\x08\\\\x05\\\\x07\\\\x08\\\\x06\\\\x07\\\\t\\\\x00\\\\x01\\\\x02\\\\x03\\\\x11\\\\x00\\\\x04\\\\x05\\\\x12!1\\\\x06AQ\\\\x07\\\\x13\\\"a\\\\x08\\\\x14q\\\\x81\\\\x91#2B\\\\xa1\\\\xb1\\\\xc1\\\\xd1\\\\xf0\\\\x15$3Rb\\\\x16%4Cr\\\\x92\\\\xe1&cs\\\\x82\\\\x83\\\\xa2\\\\xb2\\\\xf16d\\\\x93\\\\xa3\\\\xc2\\\\xc3\\\\t\\\\x17\\\\x185DT\\\\xd2\\\\'7St\\\\x84\\\\x85\\\\x94\\\\xd3\\\\xe2\\\\xff\\\\xc4\\\\x00\\\\x1b\\\\x01\\\\x00\\\\x03\\\\x01\\\\x01\\\\x01\\\\x01\\\\x01\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x01\\\\x02\\\\x03\\\\x04\\\\x05\\\\x06\\\\x07\\\\xff\\\\xc4\\\\x007\\\\x11\\\\x00\\\\x02\\\\x02\\\\x02\\\\x01\\\\x03\\\\x01\\\\x06\\\\x04\\\\x04\\\\x04\\\\x07\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x01\\\\x02\\\\x11\\\\x03!1\\\\x04\\\\x12AQ\\\\x05\\\\x13\\\"aq\\\\xb12\\\\x91\\\\xc1\\\\xf0\\\\x14#R\\\\x813\\\\xa1\\\\xd1\\\\xe1$4B\\\\x82\\\\x92\\\\xb2\\\\xf1\\\\xff\\\\xda\\\\x00\\\\x0c\\\\x03\\\\x01\\\\x00\\\\x02\\\\x11\\\\x03\\\\x11\\\\x00?\\\\x00\\\\xd8X\\\\xaflx?\\\\xe9n\\\\x1b\\\\xbc\\\\xc5\\\\xec\\\\xee,[\\\\xb4\\\\xc4\\\\xd8u\\\\xd7\\\\x11\\\\x0f$&`\\\\x91\\\\x1a\\\\xe95\\\\xd2\\\\xd8\\\\x1f\\\\x11\\\\xe1\\\\x1cOj\\\\xbb\\\\xce\\\\x1e\\\\xc4X\\\\xc4m\\\\x92\\\\xe1B\\\\x96\\\\xca\\\\xa7*\\\\xb7\\\\xcaF\\\\xe0\\\\xf9\\\\x1a\\\\xf3\\\\x83\\\\x1f\\\\xc6\\\\x9b\\\\xbfv\\\\xd9\\\\xa7RQl.A\\\\xb8\\\\xee\\\\xd4\\\\n\\\\xb2\\\\x7f\\\\x0f\\\\x9e\\\\xdf\\\\n\\\\xea\\\\xff\\\\x00E\\\\x07\\\\x15\\\\xfc\\\\x98\\\\xe2F\\\\x94I\\\\xc9\\\\x89 \\\\xfcZ\\\\x1f\\\\x85{\\\\x9dw\\\\xb2\\\\xb0\\\\xf4\\\\xfd>L\\\\xd0\\\\xb4\\\\xe2\\\\xd6\\\\xbco_]\\\\x1egG\\\\xed\\\\x1c\\\\xd9\\\\xf3C\\\\x1c\\\\xe9\\\\xa6\\\\x9f\\\\xd7Tt&\\\\xf4\\\\xaa@\\\\xa5M|\\\\xb9\\\\xef\\\\x8a\\\\x14t\\\\x91F(\\\\x13#\\\\xe2\\\\x18u\\\\x9e/d\\\\xfd\\\\x8e+j\\\\xcd\\\\xed\\\\x9b\\\\xe9\\\\xca\\\\xeb\\\\x0f\\\\xb6\\\\x16\\\\x85\\\\x8d\\\\xf5\\\\x07\\\\xcf_h\\\\xacX\\\\xdbq\\\\x07\\\\x07\\\\xad\\\\xe7\\\\xac\\\\x1c\\\\xbb\\\\xe2\\\\xbc\\\\x04$\\\\xa8X:\\\\xb4\\\\xab\\\\x10\\\\xb5\\\\x8eL\\\\xba\\\\xa2=a?\\\\xc2\\\\xe9\\\\xef\\\\x06\\\\xb0\\\\xb5\\\\xe8\\\\x9a\\\\xcc\\\\x85*\\\\xa8WD\\\\x1c#\\\\x1c\\\\xc3\\\\xf1\\\\xd6\\\\x16\\\\xf6\\\\x13t\\\\x9b\\\\x84\\\\xb4\\\\xac\\\\x8f\\\"\\\\n\\\\x1ce\\\\x7f\\\\xb8\\\\xe3j\\\\x01M\\\\xab\\\\xf8T\\\\x01\\\\xab\\\\n\\\\xa2\\\\xc6xW\\\\x0f\\\\xc6o\\\\x18\\\\xc4\\\\x17\\\\xdfX\\\\xe2\\\\xf6\\\\xc3+\\\\x18\\\\x8d\\\\x9a\\\\xfb\\\\xbb\\\\x84&g)T\\\\x10\\\\xe2:\\\\xa1aH<\\\\xc5@N7\\\\x8c\\\\xf0\\\\xeb\\\\x0e\\\\xab\\\\x8b\\\\xedQ{d\\\\xcc\\\\x9f\\\\xd2xS\\\\x0bT sv\\\\xdbU\\\\xa0\\\\xf5(.\\\\r\\\\t9\\\\x06\\\\x81\\\\x8a\\\\xaf\\\\x83,\\\\xac\\\\x13\\\\xb5\\\\x0b\\\\x84\\\\xdb\\\\xe1\\\\xf8z\\\\x8aTT\\\\x95_/N\\\\x83\\\\x0e\\\\xb9\\\\'\\\\xee\\\\xac\\\\xce\\\\xc2\\\\xfe\\\\xd3\\\\x14\\\\xb3b\\\\xf7\\\\x0c\\\\xbab\\\\xf6\\\\xce\\\\xe19\\\\xd9}\\\\x87\\\\x03\\\\x8d\\\\xb8\\\\x9e\\\\xa9P\\\\xd0\\\\x8a\\\\xc2;W\\\\xd3\\\\x07\\\\xb7X1\\\\x95\\\\xbcCY\\\\x80?\\\\x9b\\\\xae7\\\\xa6(\\\\xfe\\\"^\\\\x1d\\\\xc3\\\\xd8\\\\xbe\\\\n\\\\x9e\\\\xfb\\\\x85\\\\xb1d\\\\x9bW\\\\x12\\\\x14\\\\xbc3\\\\x12\\\\nz\\\\xdd\\\\x0b)I%\\\\x87\\\\x07\\\\xca4\\\\x99\\\\x9f\\\\x07\\\\x8d\\\\x1c\\\\x92\\\\x94T\\\\x8c\\\\x1f\\\\x85\\\\xdc\\\\xe1\\\\xdc\\\\x1b\\\\x1bU\\\\xee\\\"\\\\xbcR\\\\xfe\\\\xf8>\\\\xf3\\\\xef\\\\x96\\\\x83I\\\\x13\\\\xde(!(\\\\x1b\\\\x00V\\\\xae\\\\xa4\\\\xce\\\\xb5\\\\x90\\\\xe1\\\\x80\\\\x8b6\\\\x81\\\\xe4\\\\x84\\\\r\\\\xbf\\\\x814\\\\xacDN\\\\x1fx?\\\\xcc9\\\\xff\\\\x00\\\\t\\\\xa6\\\\x81\\\\xb6D\\\\xb3O\\\\xc8\\\\xb5\\\\xfd\\\\x84\\\\xfd\\\\x82\\\\xa4<!\\\\xa1\\\\xa7\\\\xd3O\\\\xdbMZx\\\\x99fD\\\\xfc\\\\x9a\\\\x7f\\\\xe1\\\\x14\\\\xfd\\\\xc7\\\\xec\\\\x87\\\\xfaD}\\\\xb5R\\\\xaad.Q\\\\xc6\\\\xbe\\\\x97b;J\\\\xe1\\\\xf3\\\\xb7\\\\xf98\\\\x9d|\\\\x85\\\\xc2\\\\xabUv~\\\\xd9w\\\\xb4\\\\x0e\\\\x10m\\\\xb4\\\\xba\\\\xa5\\\\x9cv\\\\xc6\\\\x03*\\\\t^\\\\x8f$\\\\xf8I\\\\xd0\\\\x10\\\\x07\\\\xc0\\\\x1a\\\\xda\\\\xbe\\\\x97\\\\x83\\\\xff\\\\x00\\\\xb4\\\\xde\\\\x1c\\\\x89\\\\xff\\\\x00\\\\xa3\\\\xa2 \\\\x7f\\\\xd6\\\\x15Z\\\\xd3\\\\xb37C\\\\x1d\\\\xa3\\\\xf0c\\\\xaaK\\\\x8aJ1\\\\xdb9\\\\tAZ\\\\x8c\\\\xb8\\\\x06\\\\x80jw\\\\xdb}\\\\xe9\\\\xe3\\\\xdc\\\\xe2\\\\x9f\\\\xc8\\\\'\\\\xf8Y\\\\xe8\\\\xd1\\\\xf5\\\\xb4>\\\\x94\\\\x17\\\\xd2C\\\\x85d|\\\\x9c\\\\xe5\\\\x03a\\\\xf0\\\\xa3M\\\\xd3\\\\xa6\\\\xe3\\\\xb9Gv\\\\xf1\\\\x1f<\\\\xa4\\\\x10\\\\x11\\\\xe4N\\\\xba\\\\xf9oQ\\\\xaf[\\\\xbb\\\\xb8\\\\xc4\\\\xac\\\\x12\\\\x87Qmj\\\\x0b\\\\xa5\\\\xe4\\\\xe4\\\\xcc\\\\xe3\\\\xa0\\\\x00\\\\x00\\\\n\\\\x9f\\\\x00\\\\x93&$\\\\x98\\\\x1bkU\\\\x1cc\\\\xc7\\\\xf8\\\\x07g\\\\xf6\\\\xac\\\\xa3\\\\x12qn\\\\xdf<\\\\x93\\\\xeaXU\\\\x93}\\\\xed\\\\xdd\\\\xd1\\\\xe8\\\\xdbCX\\\\x9d\\\\n\\\\x8c$\\\\x13\\\\xaa\\\\x85tv\\\\xdd%\\\\xc9\\\\xcc\\\\xe4\\\\xa3m\\\\xe9\\\\x193W*w47\\\\xf3\\\\x14Ra\\\\\\\\\\\\xc5C\\\\xc3\\\\xf8\\\\x93\\\\x08\\\\xc5\\\\x9cy\\\\xac/\\\\x14\\\\xb2\\\\xbdu\\\\x85\\\\x94<\\\\xdd\\\\xbd\\\\xca\\\\x1dSj\\\\x06\\\\nT\\\\x12L\\\\x10yV\\\\t\\\\x8a\\\\xf0\\\\xc6?\\\\xc6\\\\x98\\\\x963\\\\x87c\\\\xf8\\\\x9bxo\\\\x08^[\\\\xe5n\\\\xc7\\\\r+n\\\\xe9k\\\\x0e4\\\\xa5\\\\x97\\\\x9e\\\\x9d\\\\x88J\\\\x90P\\\\x88IJ\\\\xd4\\\\x0ej\\\\xcc\\\\xb0.\\\\x1a\\\\xc1xO\\\\x0en\\\\xcb\\\\x87\\\\xf0\\\\xebL2\\\\xcd\\\\x94\\\\x80\\\\x12\\\\xd3I@\\\\x00u4\\\\xdc\\\"\\\\x97;%NM\\\\xf1\\\\xa2\\\\xeb\\\\xbe@\\\\xdd@{iAIP\\\\x94\\\\x90G\\\\x91\\\\xaa\\\\x87qR\\\\xe2\\\\xbb\\\\xbc=\\\\xbe\\\\xf5G\\\\xfa\\\\xc5\\\\x0f\\\\x0f\\\\xb8n~\\\\xcf:S6\\\\xef!EwW.gV\\\\xe9J\\\\xbe\\\\xed\\\\x85E\\\\x17\\\\xdde\\\\xb5\\\\na\\\\x05\\\\xc5j<#\\\\xce\\\\x9f\\\\x1bk\\\\xadI@\\\\xa1B\\\\x85\\\\x03\\\\x05\\\\n\\\\x14(\\\\x00P\\\\xa2R\\\\x82\\\\x04\\\\xa8\\\\x80<\\\\xe9\\\\x1d\\\\xf2z/\\\\xfb\\\\x86\\\\x95\\\\xa4\\\\x07\\\\x92\\\\xd8\\\\xab\\\\xc5+Y*\\\\x1a9\\\\x1eS;Wd\\\\xfa%\\\\xdcw\\\\x98w\\\\x17\\\"f/-\\\\xd7\\\\xbfT\\\\x1a\\\\xe2ln\\\\xf1)[\\\\xa4\\\\x1f\\\\x9a\\\\xa3\\\\xec\\\\x99\\\\xae\\\\xc5\\\\xf4?\\\\xb9\\\\x0e\\\\x0e1D\\\\x89\\\\xfdMz\\\\x1eP\\\\xb1_y\\\\xedE~\\\\xcf\\\\xea>]\\\\xbf\\\\xfb\\\\x1f#\\\\xec\\\\xc7\\\\xff\\\\x00\\\\x19\\\\x87\\\\xe9/\\\\xb1\\\\xd4\\\\xa2\\\\x8e\\\\x929R\\\\xab\\\\xf3\\\\x83\\\\xee\\\\xd8\\\\xaa1I\\\\x14\\\\xa1A,:V\\\\xe6\\\\x06\\\\xb4\\\\x9a\\\\xe3\\\\xafK\\\\x8e\\\\xd5\\\\xf8\\\\xd3\\\\x85x\\\\xef\\\\x0e\\\\xe1\\\\xbe\\\\x17\\\\xe2+\\\\xbc\\\\x13\\\\n{\\\\x02f\\\\xf1\\\\xc4X\\\\x84\\\\xb6\\\\xeb\\\\x8e\\\\xad\\\\xe7\\\\x90Iv\\\\n\\\\x80\\\\xca\\\\xda`$\\\\x883\\\\xee\\\\xa2N\\\\xc9\\\\xc8\\\\xaf\\\\xdd42\\\\xa9:\\\\xc4y\\\\xc8\\\\xaf#o\\\\xb1<F\\\\xf1Kr\\\\xeb\\\\x16\\\\xc5.I\\\\x99S\\\\xb8\\\\x8b\\\\xcb\\\\x9f\\\\x8a\\\\xea\\\\xb5\\\\xcbn\\\\xf9_,\\\\xa7\\\\x1e$\\\\x80s\\\\xba\\\\xa5r\\\\xe7&\\\\xaa\\\\x9d\\\\x12z\\\\xa9\\\\x8bp\\\\xfb6778\\\\x9f\\\\x0bb\\\\xb6\\\\xfc?\\\\x8a\\\\xba\\\\xa2\\\\xe3\\\\xcd\\\\xad\\\\xc0\\\\xab+\\\\xb5\\\\x92\\\\t/1 f1\\\\xfbTesi*\\\\x03)\\\\xc58\\\\xd7\\\\x88\\\\xed\\\\xb1\\\\xac\\\\x0f\\\\r\\\\xb7\\\\xc5\\\\xdf\\\\xc3p|A\\\\xf7\\\\xef-\\\\x14\\\\xdf\\\\xe9V\\\\x1eh\\\\xa9\\\\xcb\\\\x0b\\\\x94!HrS(R\\\\x88\\\\x00\\\\xad(3\\\\xa1H\\\\xaf3\\\\\\\\\\\\xc3-\\\\x15%v\\\\xac\\\\xa8\\\\x12fP\\\\x0c~E$avm\\\\x95wv\\\\xac$\\\\xafC\\\\x0c$OZ\\\\xaac\\\\xee\\\\xa3\\\\xd5\\\\xac/\\\\xb5\\\\x1e\\\\x0bw\\\\n\\\\xb3\\\\xb9\\\\xb8\\\\xe2\\\\xfe\\\\x1e\\\\xb7/\\\\xdb\\\\xb6\\\\xeeGqVPS(I\\\\xd4\\\\x15iMb\\\\x1d\\\\xafvv\\\\x9b;\\\\x94\\\\xaf\\\\x8f\\\\xf8Q*-- ~\\\\x9b\\\\xb7&r\\\\x9eY\\\\xab\\\\xcasem\\\\xf3\\\\x97n\\\\xc9W^\\\\xe8O\\\\xc7\\\\xdbNz\\\\xbbI\\\\x07\\\\xe4\\\\xd0\\\\x93\\\\xb8\\\\x84\\\\x88\\\\x8f\\\\xc8\\\\xa7\\\\xdbDY\\\\xea\\\\x16\\\\x19\\\\xdb_f\\\\xaf\\\\x9bKf\\\\xfbA\\\\xe1n\\\\xfd\\\\xc6\\\\x93\\\\x95\\\\x0b\\\\xc5\\\\x9aA\\\\'(\\\\xd3\\\\xc4F\\\\xbe[\\\\xd0\\\\xe2\\\\x1e\\\\xdd{3\\\\xe1\\\\xf7\\\\xfdS\\\\x17\\\\xe3\\\\xbc\\\\x02\\\\xde\\\\xe4-$\\\\xb6\\\\x9b\\\\xc0\\\\xe9\\\\x1a\\\\xecrL\\\\x1a\\\\xf2\\\\x9b\\\\x88\\\\x9bG\\\\xaa\\\\xb2\\\\x95\\\\xa0\\\\x11\\\\xe3$e\\\\x03X\\\\xe9W-6\\\\x84\\\\xda0\\\\x86\\\\xd2\\\\x94\\\\x04\\\\x98HH\\\\x01#A\\\\xd2\\\\x8a\\\\xbd\\\\t?\\\\'I\\\\xfaGv\\\\x8d\\\\xc2\\\\x1c{\\\\xc6\\\\xd8.%\\\\xc2\\\\\\\\M\\\\x86bVV\\\\xd8/\\\\xab<\\\\xe2\\\\x1cP\\\\xc8\\\\xe7|U\\\\x04\\\\x11\\\\xd0\\\\xd6\\\\x05\\\\xc1|Y\\\\x82\\\\xf0\\\\xff\\\\x00\\\\x1ap\\\\xe6+{\\\\x8a[\\\\x9b,7\\\\x16\\\\xb6\\\\xbax6\\\\x95\\\\xad]\\\\xd2V3\\\\x14\\\\xa4\\\\'R\\\\x01\\\\x98\\\\xdc\\\\xc6\\\\x9a\\\\xd6\\\\xa5)\\\\x992\\\\xa9\\\\x9f\\\\xbe\\\\x8d\\\\x106I\\\\xea\\\\x0c~5q\\\\x8fkR\\\\xf4\\\\x14\\\\xa5j\\\\x8e\\\\xec\\\\xe3_K\\\\xee\\\\x1a\\\\xbd\\\\xbfN\\\\x1d\\\\xc1\\\\xd8\\\\xd7\\\\xe8\\\\x8b\\\\x19)w\\\\x1f\\\\x7f\\\\rv\\\\xe1i\\\\x07~\\\\xe2\\\\xdb.\\\\xa7O\\\\x9c\\\\xe6\\\\x9f\\\\xc0\\\\xa1M\\\\xf0\\\\x8f\\\\xa4\\\\x07a<\\\\x18\\\\xeb\\\\xb7\\\\xb6\\\\xf8\\\\xbe3\\\\x8ccw>+\\\\xacV\\\\xf3\\\\x06\\\\xbc~\\\\xe5\\\\xf3\\\\xe6\\\\xb57 t\\\\x03A\\\\xb0\\\\x00W\\\\x0c\\\\xa8\\\\xf4\\\\x07\\\\x9cM\\\\x1c\\\\xf8\\\\x86\\\\x9a\\\\x08\\\\xd8\\\\xed\\\\xe7[\\\\xf74\\\\xa8\\\\xe6\\\\xf7{\\\\xbf\\\\'\\\\x7f\\\\x1fL\\\\xae\\\\xcb\\\\xed][\\\\x8d\\\\xbb\\\\x8f\\\\xdcf.e\\\\t\\\\xc1\\\\\\\\N\\\\xea\\\\x99\\\\xf1\\\\x11\\\\xa7\\\\xd7\\\\xec\\\\xa8/\\\\xfac\\\\xf6st\\\\xe0U\\\\xd3\\\\\\\\R\\\\xf2F\\\\xa1\\\\t\\\\xc2\\\\x12\\\\x94\\\\x8f ;\\\\xcd\\\\xfc\\\\xcdp\\\\x8aI\\\\x98\\\\xe6`@\\\\xf7\\\\xd3\\\\x8d\\\\x91\\\\xb2D\\\\xecL\\\\x8a/cQ=\\\\x13\\\\xc0}+\\\\xfb)\\\\xc4m\\\\xd8*\\\\xc6\\\\xeep\\\\x05:\\\\xbc\\\\x8aN\\\\'\\\\x87<\\\\xd7vcu\\\\xb8\\\\x01BA\\\\xd7\\\\\\\\\\\\xd1\\\\xa7*\\\\xde\\\\xec\\\\xb6\\\\xdeD\\\\xad\\\\xb2\\\\x1c\\\\n\\\\x00\\\\x85L\\\\x82:\\\\x8a\\\\xf1\\\\xf9\\\\xe5\\\\x93\\\\x86]\\\\t\\\\xd7!\\\\xdb\\\\xfb\\\\x06\\\\xbd\\\\x80\\\\xb3\\\\x19m\\\\x18\\\\x07\\\\x93i\\\\x1fP\\\\xa8kVR\\\\xe6\\\\x87\\\\xe8P\\\\xa1RX(P\\\\xa2\\\"M \\\\x04\\\\xd1\\\\x1c\\\\xc7\\\\xf8G\\\\xc6\\\\x80I\\\\n&|<\\\\x84P9\\\\xf3\\\\x88\\\\xcb\\\\x925\\\\xeb4\\\\xb6\\\\xf9\\\\x00\\\\x83i\\\\x06wWS\\\\xad*<\\\\xe9\\\\nR\\\\xc2\\\\xd0\\\\x12\\\\x8c\\\\xc9?9Y\\\\xa3/\\\\xbb\\\\x9d/Zz@y\\\\x15\\\\xdaO\\\\x03qG\\\\x03\\\\\\\\\\\\x06\\\\xb8\\\\xbf\\\\x05\\\\xbb\\\\xc2\\\\x85\\\\xc2\\\\xdc6\\\\xae8\\\\x12\\\\xa6\\\\x9f\\\\xca\\\\x04\\\\x94-$\\\\x85\\\\x00\\\\x08>\\\\xfa\\\\xdf\\\\xbe\\\\x8c\\\\x17\\\\x17?\\\\xca>!f\\\\xcb\\\\x8c\\\\x9e\\\\xc0\\\\xdew\\\\x0f\\\\xb7q\\\\x16\\\\xa9\\\\x16\\\\xae%\\\\xe8:\\\\xcbo\\\\t%3\\\\xa1I\\\\x1a(\\\\xef\\\"\\\\xb4Wi\\\\xb6\\\\x0fX\\\\xf1F+\\\\x839i\\\\x88\\\\xe0\\\\xb6\\\\xb6\\\\x0f\\\\x10\\\\xc6\\\\x0f\\\\x89\\\\xdf*\\\\xe1xxZ\\\\x10\\\\xa5%\\\\'1\\\\x04\\\\x12d(|\\\\xe4\\\\x94\\\\x9a\\\\xc9\\\\xfb9\\\\xe2tp\\\\xb5\\\\xc3\\\\x8b\\\\xe2\\\\x1e\\\\x01\\\\xc1x\\\\xee\\\\xd5l\\\\xb6\\\\x93ox\\\\x12\\\\xdb\\\\x8d\\\\x14\\\\x13\\\\x95\\\\xc48P\\\\xb10H\\\" \\\\x88\\\\xd7M~\\\\xdf\\\\xaa\\\\x9c\\\\xb2\\\\xf4\\\\x19S\\\\xdb\\\\x92O\\\\\\\\s~\\\\xaf\\\\xc7\\\\xcd\\\\xfdO\\\\x99\\\\xe9\\\\xa1\\\\x0c]v>\\\\xdd(\\\\xda\\\\xde\\\\xfcW\\\\xa2\\\\xfd\\\\x0e\\\\xf2\\\\xb4\\\\xbb\\\\xe2\\\\xdbp\\\\xbbuqw\\\\x0c_]\\\\xc9X\\\\x0fa\\\\x19\\\\x14\\\\x96\\\\xf9JQs\\\\'\\\\x96\\\\xb5 \\\\xe2<h\\\\xca\\\\xf2\\\\xbf\\\\x89\\\\xf0\\\\x83\\\\x8a\\\\x90\\\\x03j\\\\xb3\\\\xb8a[\\\\x7f\\\\xa5V\\\\xb3\\\\xe5\\\\\\\\\\\\xd7\\\\x83v\\\\xa5\\\\xd8Z\\\\xdam\\\\x1cA\\\\xd8\\\\xbb\\\\xd8\\\\x1b\\\\xe8:\\\\xb8\\\\xde\\\\x0box\\\\x94\\\\xf3\\\\xd1m+\\\\xbc#\\\\xfdZ\\\\xcf\\\\xb0N\\\"\\\\xf4d\\\\xc5\\\\x1e\\\\x01\\\\x8f\\\\xe4\\\\xa5\\\\xad\\\\xcb\\\\xa0\\\\x05\\\\x0cf\\\\xc5\\\\xcbU\\\\xec\\\\x00\\\\x13p\\\\x06\\\\xd09\\\\xe9\\\\x02\\\\xbf?p\\\\x94y\\\\xfdO\\\\xb4Y1>>\\\\xdf\\\\xeen\\\\x14c|b\\\\x86\\\\x99Rxw\\\\x05\\\\xbf\\\\xcc<N3\\\\x8b\\\\xbc\\\\xd2w\\\\xdd2\\\\xc2\\\\xa4{\\\\xe9\\\\xf4c|^\\\\xa0#\\\\x850\\\\xb5*\\\\x06`1\\\\xc7\\\\x04\\\\x1d4\\\\xd6\\\\xdf\\\\xdbX\\\\x8e\\\\x15\\\\xd9\\\\'e\\\\xdcB\\\\xdb\\\\x8e\\\\xf0\\\\xc5\\\\xad\\\\x82\\\\xedT%G\\\\x87\\\\xb1\\\\xb7\\\\x98m^\\\\xd4\\\\xb0\\\\xf0O\\\\xd5V\\\\xe3\\\\xb1.\\\\x0cJS\\\\xde\\\\xd8\\\\xe2\\\\xced\\\\xf9\\\\x8a{\\\\x1f\\\\xbfQO\\\\xb0\\\\x97\\\\xaai\\\\x8e\\\\xe1\\\\xe9\\\\xfb\\\\xfc\\\\xcbe\\\\xe3\\\\xbc\\\\\\\\3\\\\xa1\\\\x1c-\\\\x84\\\\x97G\\\\xcc\\\\x07\\\\x1eX\\\\x07\\\\xac\\\\xfe\\\\xaf#\\\\xe1\\\\\\\\G\\\\xe9\\\\x8c\\\\xfe(\\\\xefk82\\\\xf1\\\\xdbK;;\\\\x83\\\\xc3V\\\\xf9Sgt\\\\xab\\\\x84e\\\\xef\\\\xee$\\\\xe6R\\\\x11\\\\xa8T\\\\x88\\\\x8dDk]\\\\x9a\\\\xe7c\\\\xfc%p\\\\xc3\\\\x96\\\\xf7V\\\\xf8\\\\xad\\\\xcd\\\\xa2\\\\xd6\\\\x1c6\\\\xee\\\\xe3\\\\xd7\\\\xae4\\\\x14\\\\'P\\\\x92\\\\xee\\\\x93:\\\\x8d\\\\x8dq_\\\\xa5\\\\xff\\\\x00\\\\x0b`\\\\xdc!\\\\xda\\\\x96\\\\x01g\\\\xc3xs8e\\\\x9b\\\\xdc:\\\\xdb\\\\xae6\\\\xc2HIX}\\\\xd4\\\\xe6\\\\xdfx\\\\x80O>uqN\\\\xcc\\\\xe4\\\\xe3Z_\\\\xbf\\\\xcc\\\\xd2\\\\xb7\\\\nR\\\\x18uHNu\\\\xa59\\\\x90\\\\x8d\\\\xf3\\\\x18\\\\xd0i\\\\xd7o}t\\\\xad\\\\xc7d\\\\x1c6\\\\xfd\\\\x9f\\\\x16\\\\x96{:\\\\xc7p\\\\xc7\\\\xb0\\\\xeb\\\\x0b+\\\\xab\\\\x05=\\\\x89]\\\\xa8\\\\xbe\\\\xeb\\\\xd6*\\\\xb8S)\\\\x94\\\\xe5\\\\x94\\\\xba\\\\x80\\\\xca\\\\x82\\\\xc8\\\\x071\\\\x12\\\\x95\\\\x14\\\\xd76\\\\xf7A\\\\xf0\\\\xebJ\\\\x8c\\\\xabL(\\\\x1f\\\\x9b\\\\xa8\\\\xfb)\\\\xfb\\\\xfcC\\\\x16\\\\xbc\\\\xb3\\\\xb8k\\\\x12\\\\xc6qk\\\\xd6\\\\x9dHC\\\\xcd\\\\xbd\\\\x8a>\\\\xb4\\\\xb8\\\\xdce\\\\x08P+\\\\x82\\\\x91\\\\xc8\\\\x1d\\\\x04\\\\xd6\\\\xd1\\\\xd1\\\\x93\\\\xbf\\\\x06\\\\xe9\\\\xeds\\\\xb3\\\\xce\\\\x15\\\\xe1~\\\\t\\\\xc7\\\\xb1^\\\\x14\\\\xc0\\\\x1d\\\\xf5\\\\xe6ql=\\\\x17HU\\\\xc3\\\\xcaW\\\\x0f\\\\xb6\\\\xebp\\\\xb6\\\\x95\\\\x98\\\\xf8\\\\x92\\\\xa7PR\\\\n\\\\xc4\\\\xfc\\\\xaau\\\\x10+Aw\\\\xe0\\\\xf8r\\\\xaegQ\\\\x02\\\\x90\\\\xf2\\\\xddu\\\\xe7\\\\x9eu\\\\xeb\\\\x87]|\\\\x8e\\\\xfdkyj.\\\\x11\\\\x11\\\\x9c\\\\x93\\\\xe3\\\"\\\\x04f\\\\x98\\\\xe5\\\\x14\\\\x95\\\\x15\\\\x08\\\\x82f7\\\\xe54\\\\xdb\\\\xb2~\\\\xa1\\\\x97!\\\\x07\\\\xc2t\\\\x14]\\\\xe1\\\\x19NUFn\\\\xa0l:\\\\xd3\\\\xabFU\\\\xad\\\\x08\\\\x95$\\\\x01\\\\x13\\\\xa7/\\\\xf1\\\\xa2\\\\x08%\\\\x0b^`r\\\\xc7=L\\\\xf4\\\\x1c\\\\xf6\\\\xa0\\\\n> Q\\\\x16\\\\xed\\\\x0c\\\\xa4j\\\\xa8\\\\x83\\\\xe5W-:\\\\xa1h\\\\xd0\\\\t\\\\xd0\\\\xa8\\\\xe6\\\\x19\\\\xa3\\\\x90\\\\xaaN!\\\\xfe\\\\x8c\\\\xd2\\\\x8e_\\\\xa5\\\\xe2\\\\'\\\\xcbz\\\\xb6j\\\\r\\\\xabPF``\\\\x19\\\\x8eB\\\\x9dX\\\\xacZ\\\\xf3~\\\\xee\\\\xbc\\\\xe0\\\\xe9\\\\xbfZI%$\\\\xf8\\\\x00\\\\xe7\\\\x13\\\\xb6\\\\xb4\\\\xb2\\\\x01\\\\x04i\\\\xa1\\\\x93\\\\xaf/e\\\\x12G\\\\x89\\\\x13*\\\\x131\\\\xcf}\\\\xa9\\\\xa13$\\\\xe0\\\\xd78Y\\\\x0e\\\\xe2\\\\xa9\\\\xe3\\\\xa6\\\\xd2ZS\\\\r\\\\x0b\\\\x15fy ;\\\\x99Y\\\\xf3)\\\\xa0T\\\\x94\\\\xe5\\\\xcb*\\\\x85\\\\x11\\\\xb8\\\\n\\\\x82\\\\r\\\\xd3w\\\\xdd\\\\x93\\\\xa40\\\\xab\\\\x94c\\\\xc5\\\\tX/\\\\xa1\\\\x0c\\\\x92\\\\xa2\\\\x95(\\\\x95\\\\x00S\\\\xe1\\\\xce\\\\x84\\\\x94$\\\\x11\\\\tY\\\\x0b\\\\xd1\\\"\\\\x05`/6\\\\x94\\\\xbc\\\\xf2\\\\x11\\\\x01!j\\\\t\\\\xd7\\\\x90&)\\\\x85\\\\xa5\\\\tHPY\\\\xcf\\\\x98\\\\xf8#a\\\\x1b\\\\xcf\\\\xb7J\\\\xb4\\\\xf4CL\\\\xd8VX\\\\xbff\\\\xcc\\\\xe2\\\\xf8j\\\\xee0\\\\xccAv\\\\x01\\\\xb6\\\\x85\\\\xea\\\\x16\\\\x95\\\\xa8\\\\xa5\\\\x7f#\\\\xde)\\\\t2\\\\x16\\\\x9c\\\\xe2\\\\xe2\\\\x12JImH\\\\x85%i\\\\x83\\\\x89\\\\\\\\\\\\xdd\\\\xdb\\\\xde\\\\xdf<\\\\xfd\\\\x95\\\\x93X{\\\\n)\\\\x08a\\\\xa7\\\\x14\\\\xa4\\\\x80\\\\x12\\\\x13\\\\x9b\\\\xc5\\\\xa8\\\\xcd\\\\x19\\\\xcav\\\\x05P*\\\\xb1 \\\\x1c\\\\xc3\\\\x91<\\\\xfa\\\\xd4\\\\xa6\\\\xe2S\\\\x94m\\\\xb0\\\\xcdN\\\\xef\\\\x91l\\\\x94\\\\xe8P\\\\xc2\\\\xae\\\\xde$\\\\x16\\\\xdb\\\\x00/\\\\xc6\\\\'T\\\\xa8\\\\x81\\\\x1b\\\\xf2?\\\\x92+\\\\xd8KgR\\\\xed\\\\xbb.6\\\\x0eE\\\\xa1*Na\\\\x06\\\\x08\\\\xaf\\\\x1dn\\\\x88\\\\x18=\\\\xeaJ\\\\x02\\\\x94\\\\xa8\\\\x01z\\\\xe8r\\\\xabO\\\\x7f\\\\xdd^\\\\xc4\\\\xdb \\\\xb6\\\\xc3I\\\\x93\\\\xe1BG\\\\xd5X\\\\xcemi\\\\r-\\\\xd8\\\\xf4\\\\xcd\\\\r(\\\\x8c\\\\xf24`\\\\x9a\\\\x84\\\\xf60\\\\xe8P\\\\xa4\\\\xaf4\\\\x0c\\\\x99fu\\\\x9a\\\\xd0\\\\x05SK\\\\xb9m\\\\xb3\\\\x94\\\\xab2\\\\xff\\\\x00u#1\\\\xf8\\\\n\\\\ng0\\\\xf9U\\\\xa9C\\\\xa00>\\\\xaaRP\\\\x94\\\\xa6\\\\x10\\\\x02S\\\\xd0\\\\x08\\\\xa2\\\\xc0g\\\\xbc\\\\xb8w\\\\xf6m\\\\xa5\\\\xa4\\\\xfe\\\\xf3\\\\x86O\\\\xc0~4}\\\\xc3\\\\xbc\\\\xee\\\\xdc\\\\x9f$\\\\xa3\\\\xf0\\\\xa9\\\\x03J\\\\x14}@\\\\xf3\\\\x13\\\\xb5\\\\xdb\\\\x1e\\\\x1a\\\\xb4\\\\xc7=O\\\\x06\\\\xe1\\\\xee#\\\\xc01Kee\\\\xbbg\\\\x1ew\\\\xbe.1\\\\xdd#\\\\xb9R3\\\\x15\\\\x14FR#1\\\\x11\\\\x10t\\\\x817\\\\x80\\\\xf8Z\\\\xcf\\\\x16\\\\xbf[7\\\\x16\\\\xae\\\\x84\\\\xa6\\\\xd4\\\\xad&\\\\xdd\\\\xd5\\\\xb4\\\\xa4\\\\x90\\\\xa1\\\\xa8RMk;\\\\xfcB\\\\xea\\\\xea\\\\xfd\\\\xc5^\\\\xbc\\\\xfd\\\\xca\\\\xc0\\\\x08J\\\\x9eyN\\\\x14\\\\xa7p$\\\\x92cR}\\\\xe6\\\\xb7\\\\xefax\\\\x9ao\\\\xb8\\\\xa5m\\\\xe4\\\\xca\\\\xaf\\\\xd1\\\\xce\\\\xeb\\\\xd6\\\\nk\\\\xf4\\\\x1e\\\\xb3\\\\x0f\\\\xb8\\\\xe8f\\\\x9b\\\\xb6\\\\x93\\\\xdf\\\\xff\\\\x00v|gI\\\\x9dg\\\\xeb\\\\xe2\\\\xd2\\\\xa4\\\\xfc\\\\x16\\\\x03\\\\xb3\\\\xa6\\\\x922\\\\xda\\\\xe38\\\\xb5\\\\xb0;%\\\\xe2\\\\xdd\\\\xca~\\\\x0bD\\\\xfdu\\\\x19\\\\xde\\\\xcd\\\\xef\\\\xc8\\\\xca\\\\xdd\\\\xf6\\\\x15z\\\\x8f\\\\xdd\\\\xb9\\\\xb1[D\\\\xfb\\\\xd0\\\\xa2>\\\\xaa\\\\xe8\\\\xabv\\\\x1bRFt!ZsL\\\\xd3\\\\xaa\\\\xc1\\\\xac]\\\\xd5v\\\\x8d\\\\x13\\\\xe4\\\\x98\\\\xaf\\\\xcf\\\\xff\\\\x00\\\\x88\\\\xa3\\\\xee=\\\\xc1\\\\xcaw\\\\x1d\\\\x92-.\\\\x87O\\\\x0c\\\\xd88\\\\xe83\\\\xdfa\\\\xb7\\\\xe8m~\\\\xd1\\\\x99(P\\\\xf8\\\\xd5\\\\xbd\\\\x93\\\\\\\\a\\\\xc3\\\\xa9G\\\\xe8\\\\x9e%\\\\xed\\\\x07\\\\x02i\\\\x1b%Kv\\\\xf5\\\\x94\\\\xfb\\\\xa5\\\\xd4G\\\\xba\\\\xbaA|/\\\\x87\\\\xacx[[\\\\x7f\\\\xd9]%<.\\\\xca\\\\x04\\\\xb3p\\\\xe2\\\\x0f\\\\x98\\\\x14\\\\x9ehK\\\\x94/s%\\\\xc34\\\\x96\\\\x1d\\\\xdboixS\\\\xc9O\\\\xf2\\\\xdb\\\\x871\\\\xdc\\\\xa3F1\\\\xac16\\\\xee+\\\\xcaPY3\\\\xee\\\\xad%\\\\xe9\\\\x03\\\\xc7X\\\\xd7h<U\\\\x81\\\\xe2|Q\\\\x85\\\\xd9aw\\\\xf6\\\\xd8Ha>\\\\xa2\\\\xf2\\\\x9di\\\\xe6\\\\xcb\\\\xeaPq9\\\\x84\\\\xa7Y\\\\x1b\\\\xa8nf\\\\xbbZ\\\\xe7\\\\x86\\\\xd6\\\\xf2J\\\\x1cq\\\\x9b\\\\x94\\\\x1d\\\\xd2\\\\xf3y\\\\x87\\\\xc0\\\\xcdr\\\\x17\\\\xa56\\\\x0e\\\\x9c\\\\x1b\\\\x8c\\\\xb8a\\\\xa6Xb\\\\xd9\\\\x0e`\\\\x92\\\\x12\\\\xcaBS\\\\xe1\\\\xba^\\\\xc0h \\\\xa8\\\\xfcOZW\\\\x06\\\\xf4>\\\\xd9G\\\\x93T\\\\xa1a\\\\x0e\\\\xab1 \\\\x10\\\\x9c\\\\xaa\\\\xcab#ZC\\\\xee\\\\x07-\\\\xfc\\\\x07Uh!<\\\\xf7\\\\x8f\\\\x85\\\\x01\\\\xfb#;\\\\x14\\\\x02gc\\\\xe1\\\\xa4\\\\xa53lDH\\\\x0b3\\\\xfd\\\\xd1R6B\\\\x8f\\\\x19\\\\xde(\\\\xcc\\\\x04\\\\xf4\\\\x11\\\\xd2i\\\\xc2\\\\x80\\\\xa5\\\\x004\\\\xd3x\\\\xf3\\\\xeb\\\\xf9\\\\x14JI\\\\x85BLI\\\\x9d4\\\\x8f\\\\xcc\\\\xd5$K\\\\t\\\\xd1\\\\x96\\\\xe1Y\\\\x89Q\\\\xca\\\\x83=|#\\\\xeb\\\\xa2\\\\xd8\\\\x10`k\\\\x04\\\\xc7\\\\xe3D\\\\xb5-\\\\xc5\\\\xa9n\\\\xf8\\\\x89\\\\x00O2\\\\x00\\\\x8f\\\\xb0P\\\\x8d\\\\xf4\\\\xd4\\\\x1dj\\\\xa8\\\\x82\\\\x97\\\\x88\\\\t\\\\xf5V\\\\x882\\\\xa5\\\\x15\\\\t\\\\xdb\\\\xe8\\\\xd5\\\\x9a\\\\tU\\\\xabz\\\\xc9\\\\x07R\\\\t\\\\xdf(\\\\xff\\\\x00\\\\x1a\\\\xac\\\\xe2\\\\x14\\\\xfe\\\\xa8\\\\xd4\\\\xccfP\\\\x926\\\\xf0\\\\xd5\\\\xb3^+V\\\\x8a\\\\xb3L\\\\x89\\\\xf0\\\\xcf!B\\\\xe4b\\\\x80\\\\xf2\\\\xe7\\\\xa7\\\\xe7\\\\xef\\\\xa5\\\\xb6\\\\x14\\\\xe3\\\\xcc\\\\xb7%jS\\\\xa9HH\\\\x1c\\\\xca\\\\x80\\\\x81\\\\x14a#\\\\xbbp\\\\x9f\\\\x9f09\\\\xc7\\\\xbf\\\\xcb\\\\xef\\\\xa6\\\\x8f\\\\xce\\\\x10\\\\x08\\\\x03Y\\\\x9f\\\\xcf:(V?\\\\x886Y\\\\xc4o\\\\x9bVd\\\\xf7w.\\\\xa5H \\\\x82!dA\\\\xe7\\\"*\\\\x19\\\\x078\\\\x19\\\\x8e\\\\xa2b\\\\x9fyKu\\\\xc5\\\\xba\\\\xf2\\\\xcb\\\\x8e\\\\xb8\\\\xb5-kR\\\\xa4\\\\xa8\\\\x9dI\\\\'\\\\xa9\\\\x93Hq\\\\n+\\\\x83\\\\xb7\\\\x98\\\\x1a\\\\xfeE\\\\x00\\\\xc0\\\\x88\\\"\\\\x08\\\\x91\\\\xccu\\\\xa9\\\\r\\\\xc9\\\\xcaA\\\\x99\\\\x03]\\\\xb4\\\\xd6\\\\x98\\\\t\\\\x19`\\\\xee:m\\\\xec\\\\xa9%\\\\x05\\\\x0e\\\\'0\\\\t \\\\x0f\\\\x08 \\\\x8euBa<\\\\xa5+\\\\x0e\\\\xbaBVHQ\\\\x03)\\\\xe6`\\\\x80~\\\\xbf\\\\xae\\\\xbd\\\\x8b[\\\\xad\\\\xdb\\\\xa4w\\\\xabJt\\\\x81\\\\xe7\\\\xec\\\\x15\\\\xe3{\\\\xb0\\\\xab\\\\x17\\\\xd0!AF\\\\x08\\\\xeb:G\\\\xd7^\\\\xc7\\\\xb5n\\\\xd3\\\\x1f\\\\xb2m) \\\\x04\\\\xce\\\\xe6\\\\x00\\\\x00k\\\\xee\\\\xacua\\\\xb1>\\\\xb2\\\\xe2\\\\xff\\\\x00`\\\\xc2\\\\x88\\\\xfd\\\\xe7<\\\\x03\\\\xe1\\\\xbf\\\\xd5D\\\\x19[\\\\xbf\\\\xb7x\\\\x90~\\\\x8b~\\\\x11\\\\xf8\\\\xfdu#5\\\\n\\\\x9e\\\\xed\\\\x8c0 \\\\x009Q\\\\xd0\\\\xa1[\\\\x08\\\\x14(P\\\\xa0\\\\x01B\\\\x85\\\\n\\\\x00\\\\xf2\\\\xe3\\\\xb5\\\\x94\\\\xe1\\\\xd6\\\\x18\\\\xad\\\\xa6\\\\x1c\\\\xd7\\\\x07`\\\\xdc3\\\\x8a\\\\xa5)\\\\xba]\\\\xd6\\\\t\\\\x8c*\\\\xf2\\\\xd6\\\\xea\\\\xdd\\\\xc4\\\\x90\\\\x94\\\\x80tJ\\\\x92\\\\xa4\\\\xee\\\\x0f]5\\\\x15\\\\x98v\\\\x00\\\\xef\\\\xf9f$\\\\tV\\\\x1fp&u\\\\xfa:}U\\\\xa9\\\\xb8\\\\xbf\\\\x83\\\\xb1N\\\\x0b\\\\xc5\\\\xd1i\\\\x8c\\\\xb1l\\\\xca\\\\xaem\\\\xd3sn\\\\xbb[\\\\xa6\\\\xee\\\\x1au\\\\xa2\\\\xa5\\\\'2V\\\\xd9#\\\\xe7!B7\\\\xd3j\\\\xd8\\\\xfd\\\\x84_ q\\\\xa5\\\\xb1Q)\\\\n\\\\xb4\\\\xb8\\\\x03\\\\xfb\\\\xa3\\\\xf0\\\\xaf\\\\xd0:\\\\xb5\\\\x18\\\\xfb?\\\"R\\\\xeeT\\\\xf7m\\\\xdf\\\\xe6\\\\xdf\\\\xdc\\\\xf8\\\\xde\\\\x9er\\\\xc9\\\\xed(JQ\\\\xedv\\\\xb5\\\\xfbH\\\\xeb\\\\xbb5\\\\xf8S\\\\xec\\\\xab&\\\\xd45\\\\xd7Z\\\\xc7\\\\xacoYR\\\\x13\\\\xf2\\\\x89\\\\x1aU\\\\xbb7(V\\\\xa1\\\\xc4\\\\xff\\\\x00z\\\\xbf3og\\\\xe8H\\\\xb3\\\\n\\\\x11\\\\xed\\\\xa3\\\\xcd\\\\xd6\\\\xa3%\\\\xc9\\\\x88 \\\\xfb\\\\xe6\\\\x95\\\\x9c\\\\xd4X\\\\x0f\\\\xc8\\\\xae6\\\\xf4\\\\xc6\\\\xf1q\\\\x7f\\\\x07+A\\\\xfc\\\\xce\\\\xf2~\\\\x17\\\\x7f\\\\xe3]\\\\x86\\\\x17\\\\xa0\\\\xd6\\\\xb8\\\\xf3\\\\xd3\\\\x08\\\\xff\\\\x00\\\\x94\\\\xfc\\\\x1c\\\\xad\\\\xff\\\\x00\\\\x9b.\\\\x92@\\\\xff\\\\x00\\\\xf3H\\\\xad1\\\\xbb\\\\x9aDM|&\\\\x93J\\\\xbc\\\\x00\\\\xff\\\\x00\\\\x9bI\\\\x81\\\\xec\\\\xdf\\\\xeb\\\\xa2L\\\\x8bd\\\\x13\\\\xb8rA\\\\xdf\\\\xe8\\\\x83\\\\xa5\\\\x1brZA\\\\x90e\\\\x94@\\\\xf7Q\\\\x83\\\\xfa\\\\xb2@\\\\x01$85\\\\x1c\\\\xc6A]\\\\x070\\\\xc2\\\\xcaI)$i\\\\xa4\\\\n,\\\\xc9\\\\xf2\\\\x8eZ\\\\xe9I\\\\xe7\\\\xb9\\\\x06~4\\\\x95j6\\\\xd4\\\\x8d\\\\xc1\\\\x8ah\\\\x04\\\\xe6\\\\x034+^\\\\x9eTa\\\\xc4I\\\\xda\\\\x00\\\\xfa\\\\xa9\\\\xdb\\\\xe0\\\\x94]\\\\x0c\\\\x80\\\\x0f\\\\xd5\\\\x982\\\\x04jP\\\\x994\\\\xcaH\\\\xee\\\\xdd%**\\\\x81\\\\x90\\\\xa5`\\\\t\\\\x9dg\\\\xae\\\\x9aUrJ)8\\\\x90\\\\x83d\\\\xd4\\\\x94\\\\xa4\\\\xa4\\\\xab]\\\\x80\\\\xf0\\\\xc5[[\\\\xc0\\\\xb6l\\\\x1f\\\\x0c\\\\x119\\\\x87\\\\xf0\\\\x8a\\\\xa8\\\\xe2\\\\x19M\\\\x9b|\\\\x88Y\\\\xd2\\\\x7f\\\\x86\\\\xad\\\\x98\\\\x1f\\\\xaa\\\\xb6:({\\\\xa5#Z\\\\x03l}P\\\\xa1\\\\xa2\\\\xd0Dh\\\\x0e\\\\xd4\\\\xd9)*\\\\xd0\\\\x84\\\\x913\\\\x07\\\\xce\\\\x81\\\\x1c\\\\xd4f|\\\\xa4\\\\xfbi\\\\xfb\\\\x04\\\\x83\\\\x88Y\\\\x88\\\\xff\\\\x00\\\\xe2\\\\x1b\\\\x06#\\\\xf7\\\\xc5\\\\x02\\\\xe0`\\\\x90\\\\x14%i\\\\xe67\\\\xa2_\\\\x9a\\\\x93\\\\xaf\\\\x9f\\\\xf8Q,\\\\x8c\\\\xce\\\\x04\\\\x88HR\\\\xb4\\\\x11\\\\xa6\\\\xa7J\\\\'\\\\x14\\\\x12\\\\xd22\\\\x02\\\\x08\\\\x92\\\\xa5\\\\xe6\\\\xd0\\\\x8d G(\\\\x83\\\\xf1\\\\xa6\\\\x84;\\\\xa1 \\\\x12\\\\x0c\\\\x9dL\\\\xedR\\\\xec\\\\xed\\\\xdc\\\\xbb}\\\\r0\\\\x92\\\\xb7HH\\\\x01#\\\\x96`>\\\\xd3P\\\\x90JP\\\\xb0\\\\x08\\\\x00\\\\xfc\\\\xedw\\\\xd6~\\\\xea\\\\xb6\\\\xc0\\\\xef\\\\x13\\\\x87\\\\xe2-\\\\xdc\\\\x90\\\\x95\\\\x00\\\\x83\\\\xe1S\\\\x99$\\\\xc8\\\\xe7\\\\x06\\\\x98\\\\x15N#*\\\\x1cei)P}))1\\\\xa7\\\\x8cs\\\\xe7^\\\\xca\\\\x1d\\\\xcdx\\\\xd9\\\\xde\\\\xfa\\\\xc3\\\\x9d\\\\xe4\\\\x04\\\\x97n\\\\x9a%;\\\\x8d\\\\\\\\O\\\\xe3\\\\xff\\\\x00*\\\\xf6L\\\\xefX>X\\\\xc1B\\\\x88\\\\xd1\\\\x8a\\\\xce\\\\xf61T(V\\\\x1f\\\\xc7\\\\xfd\\\\xa4`\\\\xfd\\\\x9cY\\\\xd9\\\\xdc\\\\xe3\\\\xc8\\\\xbbt\\\\xde:\\\\xa6\\\\x98j\\\\xd9\\\\xa0\\\\xa5-A%GU\\\\x14\\\\xa5:\\\\r\\\\xc9\\\\x15\\\\xd0\\\\xdd+d\\\\x99\\\\x85\\\\t\\\\xad\\\\n\\\\xbe\\\\xd8{@\\\\xe2\\\\x92Q\\\\xc0=\\\\x9f\\\\xbc\\\\xd3*$7w\\\\x88\\\\x12\\\\xa4\\\\xa8r#T7\\\\xff\\\\x00xi\\\\x8f\\\\xfd\\\\\\\\v\\\\xb5\\\\xc6jI\\\\xe3N2N\\\\x0bh\\\\xa9\\\\x9b\\\\\\\\9\\\\xf5$\\\\x81\\\\xd0\\\\x86Cs\\\\xefqu\\\\x97\\\\xbd\\\\xbf\\\\xc2\\\\xac\\\\xae\\\\xd7\\\\xe4\\\\xdc\\\\x9cC\\\\xc6\\\\x9c;\\\\xc2m\\\\x95\\\\xf1.9\\\\x87a#.`.\\\\xae\\\\x90\\\\xda\\\\x94<\\\\x92L\\\\x9fp\\\\xac\\\\x05^\\\\x92\\\\xdd\\\\x99\\\\xa5D~\\\\x9f}PbS\\\\x85]\\\\x90}\\\\x87\\\\xba\\\\xd6\\\\xa0\\\\xe0\\\\x1e\\\\x8c\\\\\\\\\\\\x17\\\\x858\\\\x1f\\\\xc4\\\\xfds\\\\x17\\\\xb9:\\\\xb8\\\\xa7\\\\x1d\\\\xeeR\\\\xb3\\\\xd4\\\\xf7p\\\\xa3\\\\xfe\\\\xb2\\\\x8dg\\\\x88\\\\xec\\\\xbb\\\\x83\\\\x1bBP\\\\x9e\\\\x19\\\\xc2\\\\xe1 \\\\x016\\\\xc9\\\\'\\\\xe2u4\\\\x7f1\\\\xfc\\\\x87Q\\\\xf5<\\\\x9e\\\\xb8)m\\\\xe5\\\\x04$$e\\\\x06#j\\\\xd8\\\\xbd\\\\x88\\\\\\\\\\\\x7f\\\\x96\\\\xd6\\\\x00\\\\x12e\\\\x9b\\\\x89\\\\x8d\\\\xbeekG\\\\x9dB\\\\xee>M\\\\xc4\\\\xa8e\\\\x04\\\\xe4T\\\\xfb\\\\xeb=\\\\xecY\\\\xc8\\\\xe3l6gT>\\\\x06\\\\xbf\\\\xe6\\\\xcd~\\\\x9f\\\\xed\\\\x7f\\\\xf9|\\\\x9fG\\\\xf6>\\\\x13\\\\xd9\\\\x91\\\\xae\\\\xa7\\\\x1f\\\\xd5\\\\x1dkd\\\\xf1\\\\xca\\\\x92O*\\\\xb3i\\\\xef\\\\x7f\\\\xb6\\\\xb1\\\\xfb\\\\x17IBcM\\\\x05Z4\\\\xe6\\\\x9a\\\\xd7\\\\xe4\\\\x92\\\\xe4\\\\xfd0\\\\xb3\\\\x0f\\\\x91\\\\x10ib\\\\xf5\\\\xc4\\\\xea\\\\x97T\\\\x07\\\\xf6\\\\x8dV\\\\xae\\\\xe0 x\\\\xb4\\\\xf2\\\\xa8\\\\xab\\\\xb9S\\\\x866\\\\x02\\\\xa0,\\\\xbb8\\\\xcd\\\\xc0\\\\x90\\\\xdb\\\\xca\\\\xe9&\\\\rsW\\\\xa6\\\\x03h\\\\x18\\\\xa7\\\\x01=\\\\x073\\\\xf8m\\\\xe1_9>\\\\xb0\\\\xd6\\\\xbf]o\\\\xc6\\\\xd7\\\\xa8\\\\xad\\\\r\\\\xe9v\\\\x7f\\\\xfb\\\\xbb_3a\\\\x88\\\\'\\\\xfe\\\\xf9\\\\x8a\\\\xe9\\\\xc2\\\\xbe4a\\\\x91\\\\xfc&\\\\x8fh\\\\xfc\\\\x93{h\\\\xcau\\\\x8eQA\\\\xb2=]\\\\xb9\\\\x123$\\\\xed\\\\xfc\\\\x14\\\\x19PU\\\\xb3D\\\\xed\\\\xdc\\\\xa6`{iI\\\\x94\\\\xd9\\\\xa0g\\\\x9f\\\\x1aL\\\\x7f\\\\xa9\\\\xcb\\\\xea\\\\xf8WS9H\\\\x8a\\\\x92`\\\\x13\\\\x04\\\\xc9\\\"\\\\x8fA%$\\\\xc8\\\\xd0\\\\xe9\\\\x06\\\\x94F\\\\xbb\\\\xf3\\\\xf0\\\\xc6\\\\xa0\\\\t\\\\xa0\\\\xaf\\\\x9cJ\\\\x94H\\\\xeaF\\\\xd4\\\\xe8.\\\\x82\\\\xbd)[\\\\xa8-\\\\xaf8\\\\xf5vA1\\\\xb1\\\\x08\\\\x13\\\\xef\\\\x91LhS:D\\\\x98\\\\x8d`\\\\xfef\\\\x96S\\\\xa4\\\\xa9z\\\\x9d&\\\\x82\\\\x93\\\\x02\\\\x04\\\\xe5\\\\x07\\\\xf2*\\\\x99%\\\\x17\\\\x10\\\\x10\\\\xab\\\\x16\\\\xc9\\\\x03\\\\xe7\\\\x1f`\\\\xf0\\\\xfev\\\\xabvu\\\\xb4n5\\\\xd50#\\\\xf8EUq\\\\x12b\\\\xc9\\\\xa2\\\\x12\\\\x0c\\\\xb8L\\\\x93\\\\xcf)\\\\xab[c6\\\\x8dk\\\\x00\\\\x94\\\\x9dw\\\\x1e\\\\x11\\\\xcf\\\\xa5/ \\\\x98\\\\xbc\\\\xa4\\\\xe7<\\\\xb9\\\\xaa\\\\xac8yL\\\\xa7\\\\x89\\\\xb0U\\\\xdf-,Z#\\\\x11\\\\xb6/\\\\xadcD :\\\\x92\\\\xa5\\\\x1f(\\\\xde\\\\xa2\\\\x13\\\\t-\\\\xc8\\\\x00\\\\x91\\\\xbcS%!FD\\\\x193\\\\xbc\\\\x89\\\\xa6\\\\x85b\\\\x15\\\\xa3\\\\xae\\\\x10d\\\\x97\\\\x1c\\\"6#1\\\\x88\\\\xf7E=gcq\\\\x89\\\\xdf\\\\xb1c\\\\x85[=}{p\\\\xa2\\\\x8b{{t\\\\xe7q\\\\xd5y\\\\x0f\\\\xc8\\\\xe7M\\\\xf8U\\\\xcc\\\\xcc\\\\xce\\\\xa6*\\\\xe7\\\\x86x\\\\x92\\\\xe3\\\\x86\\\\xb1\\\\x05\\\\xdd4\\\\xdf\\\\xad[\\\\\\\\\\\\xb0Y\\\\xbc\\\\xb5\\\\xef\\\\x94\\\\xcf~\\\\x8d\\\\xd3\\\\x0e$gmHp%aI \\\\xcacbAk\\\\xe6&dW\\\\xbd\\\\x96\\\\xe2v\\\\xd6xR\\\\xadolo1\\\\x0b\\\\xb7\\\\x9cC\\\\xf6\\\\xc8\\\\xb8@\\\\xf5t\\\\xe6\\\\xca\\\\x85\\\\xeb\\\\n#0Z\\\\x17\\\\xa0(Z\\\\x08\\\\xd4\\\\x10k\\\\x0cNd8RAJ\\\\xd0\\\\xa2\\\\x95\\\\t\\\\x98P$\\\\x11\\\\xf1\\\\x9a\\\\xcd\\\\xb1\\\\x8e\\\\xd7q\\\\x8can:\\\\x9b\\\\x1bKk\\\\xb7\\\\x12\\\\xa2\\\\xf3\\\\xa4\\\\x97<f<H\\\\x07D\\\\x81\\\\x1f6\\\\x0e\\\\xa6yV\\\\x0c\\\\x92\\\\xb5<\\\\xa7\\\\x1cZ\\\\x96\\\\xb5\\\\xab:\\\\xd6\\\\xb5j\\\\xa2L\\\\xc9\\\\xf3&\\\\xaaU\\\\xc2\\\\x05\\\\xf3\\\\x19\\\\xb4\\\\xf1\\\\xbbn\\\\x8dH\\\\xf5\\\\xd6\\\\x00\\\\x9dI\\\\x97P+\\\\xd9s^4\\\\xe1\\\\x90\\\\xbb\\\\xdb$\\\\x91\\\\x19\\\\xaf\\\\xed\\\\x92:~\\\\xd9\\\\x15\\\\xec\\\\xa9\\\\xdc\\\\xd7$\\\\x99HJ\\\\xd5\\\\x04P\\\\x0b\\\\xa48u\\\\x1e\\\\xca k\\\\x1f%\\\\x12j5\\\\xcd\\\\x9d\\\\xb5\\\\xc3\\\\xac=ql\\\\xcb\\\\xce\\\\xb0J\\\\x99Z\\\\xdb\\\\nSd\\\\x88%$\\\\xed\\\\xee\\\\xa94\\\\xd3\\\\xa6\\\\x08\\\\xae\\\\xa9\\\\xea$\\\\xaeC\\\\xcfC9\\\\xa6\\\\xe6\\\\x84\\\\xd77s\\\\xf5*\\\\x85\\\\xe74Y\\\\xfc\\\\xe93E4\\\\xad\\\\x8e\\\\x8f\\\\'\\\\xfb@\\\\xe3\\\\\\\\[\\\\x8a\\\\x9e\\\\xb7\\\\xb1\\\\xc6\\\\x1b\\\\xc0Vp\\\\xf7\\\\xdeq\\\\x17xE\\\\x92\\\\x18M\\\\xc1XJT\\\\xa2Q\\\\x01iV@\\\\xa0H\\\\x07]z\\\\x07{\\\\x1dZ\\\\x91\\\\xc7xbTHL<g\\\\xfd\\\\x9a\\\\xbf\\\\xc6\\\\xb0\\\\xdb\\\\xc0C\\\\x89?\\\\xc3\\\\xd7\\\\xce\\\\xb2\\\\x9e\\\\xc9\\\\xddK\\\\\\\\q\\\\x86\\\\x95\\\\xe8>W\\\\x9f>\\\\xedU\\\\xfa\\\\x97\\\\xb41C\\\\x17K8AR\\\\xa7\\\\xf6>\\\\'\\\\xa3\\\\xcd<\\\\xdd\\\\\\\\\\\\'\\\\'\\\\xbb_s\\\\xacl\\\\x1c\\\\xf0$\\\\xcciVm\\\\xdc\\\\xa1\\\"\\\\x02\\\\xa4\\\\x8e\\\\x95\\\\x8bX\\\\xde-\\\\xc6\\\\xd2\\\\x12yo\\\\xcej\\\\xd1\\\\x83\\\\xa4\\\\xc9\\\\xaf\\\\xca\\\\xdcv~\\\\x87\\\\xdd\\\\xa2\\\\xc4\\\\xbaTd\\\\xaa\\\\x94\\\\x95\\\\x1e\\\\xbbi\\\\xec\\\\xa8\\\\xa1_\\\\x93K\\\\n\\\\xe5\\\\xa4\\\\xf9\\\\xd2\\\\xa0\\\\xb2kj\\\\xd7\\\\x97\\\\xb2+Gz[\\\\t\\\\xb1\\\\xec\\\\xedc~\\\\xe3\\\\x11H1\\\\xb7\\\\x8d\\\\x8a\\\\xddHQ\\\\x04t\\\\xad\\\\'\\\\xe9d\\\\t\\\\xc1{;Y:\\\\xa4\\\\xe2i\\\\xf6\\\\xe8\\\\xc9\\\\xadq~4e\\\\x91\\\\xfc&\\\\x8e\\\\xb7\\\\xfe\\\\x8dnG\\\\xd2dr\\\\xf34\\\\x1a9\\\\xad\\\\x16\\\\x15\\\\n\\\\x87P\\\\x0f\\\\xf7M\\\\x0bC6\\\\xd6\\\\xfa\\\\xff\\\\x00W\\\\xff\\\\x00\\\\x88\\\\xd0d\\\\xfe\\\\xaa\\\\xac\\\\xe4~\\\\xd1\\\\x03o\\\\xe15\\\\xd6\\\\xceA\\\\x82\\\\xea\\\\xa7\\\\x94\\\\x9d<\\\\xfe4\\\\x0b\\\\x8a\\\\x91\\\\xa0\\\\n\\\\x03m\\\\xbd\\\\xd4\\\\x89\\\\x81\\\\xb8\\\\x9c\\\\xda\\\\x9f\\\\xb2\\\\x8c\\\\x03\\\\x98\\\\x082N\\\\xa3\\\\xec\\\\xa0b\\\\xdc\\\\x0bd$,&\\\\x1de/&5\\\\x94\\\\xabo\\\\xbe\\\\x92\\\\x02\\\\x9cJ\\\\xd6\\\\x86\\\\xca\\\\xc2\\\\x13*!\\\\x12\\\\x07!?W\\\\xbe\\\\xa7c\\\\x8c\\\\x86N\\\\x0c\\\\x12O\\\\xcb`\\\\xb6o\\\\x193\\\\xaa\\\\xb3\\\\xccyiU\\\\xe9QB\\\\x14\\\\x06`\\\\x142\\\\x9dH\\\\x94\\\\xfd\\\\xfe\\\\xfarU\\\\xa2J^\\\"\\\\xfe\\\\x84\\\\x82\\\\xe1HH\\\\\\\\\\\\xeab4\\\\xab\\\\x1b2}M\\\\x930@H\\\\x81\\\\xfd\\\\x9a\\\\xad\\\\xe2$\\\\xcd\\\\x8a\\\\x0c\\\\xff\\\\x00[\\\\xbcF\\\\x99L\\\\x9a\\\\xb2\\\\xb3\\\\xfe\\\\x86\\\\xd8\\\\xd8\\\\xca`\\\\x1f\\\\xec\\\\x8a\\\\x00}KV\\\\xa3M\\\\xf5\\\\xd3\\\\xeb\\\\xf6PnT\\\\xf3i*\\\\x82\\\\xa5\\\\x011\\\\xb6\\\\xb0M\\\\x05\\\\x91\\\\x04\\\\x13:l~\\\\xefu)\\\\x93\\\\x17v\\\\xc9p\\\\x94\\\\x82\\\\xf2\\\\x02\\\\xa2?xS\\\\xd3\\\\x01\\\\xb3\\\\x9cJd\\\\x12\\\\x92A=`\\\\xc6\\\\x94km\\\\xc0\\\\xd2\\\\x1c)XmeII#C\\\\x1b\\\\xfd\\\\xb4\\\\xab\\\\x84\\\\xa5\\\\x177\\\"s\\\\x04\\\\xbe\\\\xe2A\\\\x8d\\\\xc0Q\\\\xf8mM)\\\\x1a\\\\xa8xI\\\\x02t;\\\\xd0&-\\\\x1e0L\\\\x89\\\\x03A\\\\xcf\\\\x96\\\\xb4\\\\xb4\\\\xe8\\\\xa4\\\\xc4\\\\t\\\\x00\\\\x03H\\\\x9d|J&OJt\\\\xfc\\\\xf4f\\\\xd0\\\\x84\\\\'C\\\\xf1\\\\xa2\\\\x80k\\\\x04\\\\x8f\\\\xd2\\\\xf8RI\\\\x90q[?=\\\\xee\\\\x1b\\\\xafe\\\\x08\\\\x93^7p\\\\xd2s\\\\xe3\\\\xf8\\\\x12\\\\x02L+\\\\x19\\\\xb1I\\\\x9e\\\\xbe\\\\xb2\\\\xd5{ t5\\\\xcd&R\\\\x1at\\\\x1c\\\\xc3NT\\\\x9e\\\\x9e\\\\xdaqj\\\\x13\\\\xafJ)\\\\x12=\\\\xb5\\\\x9d\\\"\\\\x87\\\\xea=\\\\xca\\\\x82Jd\\\\x81\\\\xbdH\\\\xadY\\\\xda\\\\xd7\\\\x125\\\\x81\\\\xdea\\\\r\\\\xdc\\\\xe3\\\\xd8\\\\xbe\\\\n\\\\x87\\\\x19\\\\xb8p#\\\\x0f\\\\xb9\\\\xb2e7%%\\\\xbf\\\\x02\\\\xd5p\\\\n\\\\x93\\\\xbe\\\\x8aL\\\\x01&H\\\\xd2\\\\xba\\\\xd67\\\\x95\\\\xf6\\\\xa7FR\\\\x97b\\\\xee60X;\\\\x19\\\\xa3\\\\x95~\\\\xea\\\\xbe\\\\x06\\\\xb9]\\\\xde\\\\xd0\\\\xadB\\\\xaeY\\\\xb8\\\\xe2Lj\\\\xee\\\\xd6\\\\xe05\\\\x0e;\\\\xc6\\\\x8c1ql\\\\xa4\\\\x85\\\\x85\\\\x94z\\\\xbaJT\\\\x15\\\\xe0:\\\\xed\\\\xacF\\\\xc6\\\\xb1\\\\xce2\\\\xe1\\\\xeb\\\\x86\\\\xd6\\\\x8b\\\\x8b\\\\xec^\\\\xe74\\\\xa4\\\\xa9\\\\xde?\\\\xc4\\\\xdd(\\\\x99\\\\x12\\\\x90\\\\xdbQ#\\\\xc2u\\\\xd3\\\\xef\\\\xe9^\\\\xcd\\\\xc9\\\\xf3\\\\x7fE\\\\x7f\\\\xa9\\\\xcb\\\\xfcl>K\\\\xea\\\\xeb\\\\xf4:\\\\xef\\\\xc5\\\\xfb\\\\xaa\\\\xf8Q\\\\xe5WC\\\\xf1\\\\x15\\\\xc1\\\\xe8\\\\xe0\\\\x8cg\\\\x13\\\\xb6\\\\xb2r\\\\xe3\\\\x15\\\\xc5\\\\xf14\\\\xdd\\\\xb4\\\\xda\\\\xdau\\\\xac;\\\\x15\\\\xb9C\\\\xe1z\\\\x05%Y@\\\\x82G2>\\\\x1a\\\\xd2\\\\xd3\\\\xd8\\\\xfe$\\\\xeaB\\\\xd3\\\\x87\\\\xe3\\\\xc5*\\\\x12?\\\\xc9\\\\x9b\\\\xa1\\\\xbf\\\\x91\\\\\\\\\\\\xfcu\\\\xad\\\\xe5\\\\xec\\\\xbc+\\\\xf1ek\\\\xfe\\\\xc9\\\\x19.\\\\xbb+V\\\\xb1\\\\xaf\\\\xfc\\\\x91\\\\xccO\\\\xb8\\\\xe2\\\\xd303\\\\x84\\\\xc0\\\\xd2\\\\xaf;6.\\\\x8e4\\\\xc3\\\\xf3\\\\x84\\\\xa5Y\\\\x9c\\\\x06\\\\t#\\\\xe6\\\\x9e\\\\xb5\\\\xb7\\\\xd5\\\\xd9\\\\xf6\\\\x04\\\\xb3\\\\x07\\\\x07\\\\xb7\\\\xe5\\\\xb1P\\\\xff\\\\x00\\\\xc5M`\\\\xdc\\\\x19\\\\x83\\\\xe1X\\\\xda\\\\xae,\\\\xac\\\\x10\\\\xc3\\\\xec\\\\xaf\\\\xe4\\\\xd6\\\\x1cV\\\\x80\\\\x88;\\\\x98;\\\\xd7\\\\xd1\\\\xf5\\\\xdd~<\\\\x98\\\\xa5\\\\xce\\\\xd3_\\\\x99\\\\xe4\\\\xf4}\\\\x0eLyb\\\\xedi\\\\xa6l\\\\x0c2Cbu\\\\x80*\\\\xf5\\\\x83\\\\xe0\\\\xd7\\\\xe3U6-%-\\\\x88\\\\x1c\\\\xb4\\\\xf2\\\\xabF\\\\xf4\\\\x00{k\\\\xe0\\\\xe4\\\\xb6}\\\\xa2d\\\\x99\\\\xfc\\\\xc5-+\\\\xdb\\\\xa7Z`\\\\x1d\\\\xb9}ta]\\\\x06\\\\xdb\\\\x1a\\\\xc8vLmpf\\\\xb4\\\\xdf\\\\xa5`\\\\xcf\\\\xc3\\\\x1c\\\\x00\\\\xad\\\\x15\\\\x178\\\\x9a5\\\\x1b|\\\\x9bG\\\\xee\\\\xad\\\\xbc\\\\x83\\\\xae\\\\xbe\\\\xcd+Q\\\\xfaR\\\\xa3?\\\\x06\\\\xf01\\\"Jq,A;\\\\xc7\\\\xf5\\\\t?ui\\\\x8f\\\\xf1#9\\\\xfe\\\\x13C\\\\xda\\\\xab\\\\xf5f$n\\\\xd91?\\\\xc4h2\\\\xa0m\\\\x97\\\\x94\\\\x80\\\\xa2\\\\xe24\\\\xf7+\\\\xf3\\\\xf0\\\\xa4\\\\xd9\\\\xa4\\\\x8b{\\\\x7f\\\\x0c\\\\x92\\\\x85H\\\\xd7\\\\xf7\\\\x8d-\\\\xa5\\\\x13f\\\\xebeC(q\\\\x04OXP\\\\x99\\\\xfb\\\\xab\\\\xad\\\\x9c\\\\xc3\\\\x11\\\\xb2eZ(\\\\x89\\\\x98 PT$\\\\x94\\\\xa3\\\\xe6\\\\xe8bf\\\\x94\\\\xa8J\\\\x86\\\\xa1\\\\x00\\\\r5\\\\xdb\\\\xf3\\\\xad,\\\\xc4\\\\xe5\\\\x911\\\\xb0?]\\\\x00&\\\\xee\\\\xed\\\\xdb\\\\xd1g\\\\xdf\\\\xe4\\\\x9b[F\\\\xec\\\\xda }\\\\x06\\\\xd4\\\\xa2\\\\'\\\\xccg:\\\\xfb)\\\\xa0D\\\\x18\\\\xd0\\\\x93N(\\\\x08$\\\\xc2\\\\x81\\\\x9es4aB`\\\\xa8\\\\x9du3\\\\xca\\\\x87\\\\xb1\\\\x148\\\\xfa\\\\x7fPA\\\\t\\\\xfa|\\\\xf9\\\\xc8\\\\xab+0\\\\x15f\\\\xd6\\\\xc6rl6\\\\xf0\\\\xefP\\\\xb8\\\\x90\\\\xa5Xr\\\\x01:\\\\xf7\\\\x9dg\\\\xe8\\\\x9a\\\\x9f`G\\\\xa9\\\\xb3\\\\xe2\\\\x80\\\\x02u\\\\xf2\\\\xcbH\\\\x7f!\\\\xf2\\\\x10\\\\x10\\\\xf2\\\\x94\\\\xaf\\\\x10#&\\\\xbb\\\\xf9\\\\xd1)}\\\\xd5\\\\xc0Sg1J\\\\xc2\\\\x92H\\\\xde\\\\x0e\\\\x9fe8\\\\xa2\\\\x00V\\\\xb0\\\\xa1\\\\xcb7:B\\\\x94$\\\\x80\\\\xad\\\\xfamU\\\\xc8\\\\x86\\\\x9dVgV\\\\xe2\\\\xe4\\\\x15\\\\xa9K \\\\x0e\\\\xa6~\\\\xfa\\\\x0bI\\\\xef\\\\x15\\\\xe7\\\\xca?<\\\\xfe\\\\xeap\\\\x90#P:\\\\xebI\\\\x90J@\\\\x822\\\\xf2$P\\\\x80\\\\x01 \\\\x81\\\\x9fQ\\\"F\\\\xc4\\\\x8e\\\\x7f\\\\x9f1N\\\\xab twEA\\\\xb0\\\\x91\\\\x978\\\\x00\\\\xf9H\\\\x1c\\\\xfd\\\\x94\\\\xde\\\\xc3pF\\\\xfa\\\\x18\\\\x9a}\\\\xf5\\\\xa9O\\\\x97\\\\x16\\\\xb2\\\\xb5\\\\xa9\\\\tR\\\\x96\\\\xaf\\\\xa4H\\\\x9dM/\\\"\\\\x0b\\\\x83\\\\x10\\\\x1e\\\\xe2\\\\xee\\\\x18h\\\\xee\\\\xac{\\\\x0e\\\\x07\\\\xdft\\\\xd5{\\\\x19\\\\x15\\\\xe3\\\\xefg\\\\x89+\\\\xe3\\\\xce\\\\x0c@\\\\x19\\\\xb3q.\\\\x18\\\\x00;\\\\x7fKg\\\\xf3\\\\xef\\\\xaf`\\\\xc01\\\\xacnv\\\\xac\\\\x9clc.&O\\\\xba\\\\x9a)2=\\\\xa3\\\\xed\\\\xa6q\\\\xcb\\\\x87\\\\xac\\\\xf0\\\\x9b\\\\xdb\\\\x8bU\\\\x04\\\\xbe\\\\xdb*Sd\\\\xa70\\\\n\\\\xe5\\\\xa7:\\\\x88\\\\xe6\\\\x1f\\\\x8a\\\\xa5\\\\xe6\\\\xd4\\\\x8ceE\\\\tZJ\\\\x90l\\\\x9b9\\\\x93\\\"D\\\\x88\\\\x89\\\\x1aMe\\\\xdb\\\\xb2\\\\xcb\\\\xda\\\\xe7\\\\x7fH\\\\xfe\\\\x0e\\\\xe2\\\\x0e+\\\\xc7xi|=`/\\\\x1b\\\\xb6\\\\xb3\\\\xbaK\\\\xab/!\\\\xbc\\\\xaaZ\\\\xda\\\\x81\\\\xa9\\\\xe8\\\\x93\\\\xf0\\\\xae\\\\x87\\\\xe4k\\\\x16\\\\xe3\\\\x061w\\\\x9ao\\\\xf9:\\\\xfb\\\\xcd]\\\\xa5:%(iI \\\\xa8I9\\\\xb5\\\\x90<\\\\xe2\\\\xbb1\\\\xf53\\\\xe9&\\\\xb2\\\\xc3\\\\x95\\\\xeb\\\\xf3\\\\xd1\\\\x8eL1\\\\xea \\\\xf1\\\\xcb\\\\x86r\\\\x03]\\\\x8b\\\\xf1\\\\xe3\\\\xd1\\\\x18m\\\\xaa\\\\x13\\\\xcf>\\\"\\\\x8f\\\\x8d[\\\\xe1\\\\xdd\\\\x82\\\\xf1\\\\x8b\\\\xb7v\\\\xca\\\\xc4Y\\\\xc3\\\\x93g\\\\xdf \\\\xdc\\\\x06\\\\xf1\\\\x1f\\\\x94-\\\\xe6\\\\xf1\\\\x04\\\\x9c\\\\x9111\\\\xe7\\\\x15\\\\xd2\\\\x1c?o\\\\xc4\\\\xf6\\\\xb7k<F\\\\x95_Z\\\\xb8\\\\x82!L5)#Q\\\\x94$\\\\xeev\\\\xd7\\\\xa0\\\\xa7K\\\\xf7V\\\\xab.bJ\\\\xb7dL\\\\xa5\\\\x84\\\\xb0\\\\x82\\\\xe2\\\\xfa\\\\x08\\\\x1f4y\\\\x9fp\\\\xad\\\\xf2{{\\\\xacj\\\\xad/\\\\xa2\\\\xff\\\\x00s\\\\x9e\\\\x1e\\\\xc8\\\\xe9\\\\xae\\\\xeb\\\\xfc\\\\xcdY\\\\x82p?iX-\\\\xb5\\\\xbd\\\\xb6\\\\x13}\\\\x86Y\\\\xd9[[\\\\xae\\\\xda\\\\xde\\\\xdd|Ax\\\\xebm\\\\xb4\\\\xa0@\\\\x01!\\\\xb1\\\\xa8\\\\x07\\\\xc2\\\\xa9%0 \\\\x80)h\\\\xe0n\\\\xd2\\\\x9bBP8\\\\x86\\\\xc8\\\\x04\\\\x88\\\\x00\\\\xf1\\\\x06&O\\\\xc7\\\\xbc\\\\xad\\\\xafn\\\\xfd\\\\xdd\\\\xdb\\\\x85n1l\\\\x84\\\\x92tU\\\\xb8\\\\xcc\\\\x7f\\\\x01\\\\xf5\\\\x9a\\\\x9c\\\\x10\\\\xfc|\\\\xd6\\\\xc7\\\\xfb!^{\\\\xf6\\\\x86V\\\\xef\\\\xfd\\\\x7f\\\\xd4\\\\xf4\\\\x17C\\\\n\\\\xaa\\\\xfd\\\\xfeG*\\\\xa7\\\\x02\\\\xbap\\\\xe8\\\\xda\\\\x13<\\\\x94\\\\xeaz{j \\\\xe1\\\\x9cA\\\\xab\\\\xf7\\\\x9dKaHQ\\\\x04\\\\x14\\\\x1c\\\\xc0\\\\xe8:U\\\\xce\\\\x93\\\\x15\\\\x93\\\\xe0\\\\xaa\\\\x9c=\\\\xbf\\\\x17\\\\xd2V\\\\xc7\\\\xce\\\\xba\\\\xa5\\\\xd4Nj\\\\x89\\\\x8e\\\\x18\\\\xc5\\\\xd9\\\\x8a\\\\xdb\\\\xe1wm\\\\x81,:LF\\\\x88=*R,.@\\\\x03\\\\xd5\\\\x9d\\\\xfe\\\\xe1\\\\x15\\\\x98\\\\x03#s4&N\\\\xe4\\\\x9fmr\\\\xb5f\\\\xfc\\\\x18\\\\x88\\\\xb2\\\\xba\\\\xff\\\\x00\\\\xe5\\\\x9e\\\\xfe\\\\xe5+\\\\xd4n\\\\xa3KW\\\\x89\\\\xeb\\\\x92\\\\xb2\\\\xc0|\\\\xcf\\\\xc6\\\\x8c\\\\x11\\\\xcc\\\\x9a\\\\x9e\\\\xd0\\\\xb3\\\\x18n\\\\xca\\\\xe8\\\\x1d-\\\\x9e\\\\xfe\\\\xe5j_I\\\\xd4\\\\x94\\\\xf07\\\\x08\\\\xa1R\\\\x87[\\\\xc5\\\\xee\\\\xc2\\\\x9b#\\\\xc4\\\\x02\\\\xad\\\\x8c\\\\x18\\\\xf7WB$\\\\x8d\\\\xe6}\\\\x86\\\\xb9\\\\xfb\\\\xd2\\\\xa8\\\\x03\\\\x80p\\\\xf9\\\\xd6\\\\x13\\\\x89\\\\xac\\\\x1dy\\\\x1be\\\\xd3\\\\x8a\\\\xa6L\\\\x9d\\\\xa3\\\\x9f,T=V\\\\xd8\\\\xecr\\\\xaa5\\\\xfe.\\\\xbf}.\\\\xd8\\\\xc3o\\\\x80\\\\x01\\\\tRw\\\\xdbs\\\\xce\\\\x98\\\\xc3\\\\xbcV\\\\xb6\\\\xf0\\\\xa9\\\\x80\\\\xad\\\\xb4\\\\xe6)\\\\xdbo\\\\xd8\\\\xbeU\\\\xa1\\\\x94\\\\x02O\\\\xb4\\\\xfc+\\\\xa7\\\\x93\\\\x01\\\\x85\\\\xc9*\\\\xdc\\\\x85I\\\\x99\\\\xdfz0H)\\\\x91\\\\xcf_=E\\\\x1a\\\\x92T\\\\xaez\\\\xa8\\\\x81\\\\xed\\\\x9f\\\\xf1\\\\xa0R[\\\\x93\\\\x04\\\\x10\\\\xadA\\\\xebR\\\\x03\\\\xf7\\\\xad\\\\xa1\\\\xa6\\\\xf0\\\\xd5%\\\\tI{\\\\x0eB\\\\xd7\\\\x951\\\\x99]\\\\xe3\\\\x82OS\\\\t\\\\x1a\\\\xe9\\\\xb50\\\\x9c\\\\xbd\\\\xdb\\\\x99\\\\xb3HO\\\\x866\\\\xcd<\\\\xf9\\\\xc6\\\\xfbyT\\\\x9cE\\\\xd4\\\\xad\\\\x8c\\\\x1a7g\\\\rCk\\\\x1dT\\\\x1et\\\\xeb\\\\xee\\\"\\\\xa2$\\\\x10\\\\x152r\\\\xc4\\\\x18\\\\x8aoL\\\\x11Q\\\\x8f)B\\\\xc0\\\\x15\\\\'7\\\\xca\\\\r\\\\x0fX1V\\\\x16_\\\\xfb\\\\xbd\\\\x94\\\\x99\\\\xd3\\\\xbb\\\\xd76\\\\xde\\\\x1a\\\\xae\\\\xc7\\\\xe3\\\\xf4w2\\\\n\\\\xc4\\\\x93\\\\xb6\\\\xc6\\\\xacmL\\\\xd85\\\\x97M\\\\x1b\\\\xd7\\\\xfdZ@=0\\\\x00#(=:\\\\xeb\\\\xadY\\\\xf0\\\\xdd\\\\x93X\\\\x97\\\\x13\\\\xe067^\\\\x1b{\\\\xccV\\\\xda\\\\xdd\\\\xc3\\\\x94FE\\\\xba\\\\x94\\\\x1d\\\\x0e\\\\xfb\\\\xd5jPU\\\\xe2Js @&v\\\\x8e\\\\xa2\\\\xac\\\\xb8f\\\\xe6\\\\xda\\\\xcf\\\\x8b8~\\\\xe6\\\\xf5\\\\xc2\\\\xcd\\\\x9d\\\\xbe/h\\\\xed\\\\xc2\\\\xd0%Hm/\\\\xa0\\\\xac\\\\x81\\\\xce\\\\x00${)\\\\xc7\\\\x95b|\\\\x15J\\\\x08Iu\\\\xb0\\\\t\\\\x08uh\\\\x12t\\\\x01+#\\\\xee\\\\xa5,\\\\x0e\\\\xed\\\\xb8\\\\xcc\\\\x16\\\\'4\\\\xc4\\\\x1dt\\\\x8e\\\\x9c\\\\xe8:Bn\\\\xae\\\\nL\\\\x83p\\\\xf1\\\\nN\\\\xb2\\\\x0b\\\\x8a#\\\\xea\\\\xa4(A\\\\x8f\\\\x9a>\\\\xca>\\\\x80\\\\x1aFTh\\\\x04\\\\xeb4\\\\xfb\\\\xc0\\\\xa5\\\\xc4\\\\xc6\\\\xfd\\\\xd3p\\\\x7f\\\\xd5\\\\xfc\\\\xe9L.r\\\\x99\\\\x1b\\\\x0e[\\\\x7f\\\\x8d<\\\\xf9%\\\\xfd\\\\x06\\\\xbd\\\\xd27\\\\x00\\\\x18\\\\xc85\\\\xa7\\\\xe4L\\\\x9f\\\\xd9\\\\x90\\\\xef;H\\\\xe0D\\\\xe5\\\\xd7\\\\xf9S\\\\x85H\\\\x07\\\\xfe\\\\xb6\\\\xcd{\\\\x03^@\\\\xf6Q\\\\n\\\\xedK\\\\xb3\\\\xe4\\\\xce\\\\xaa\\\\xe2\\\\xac*S\\\\xd3\\\\xf5\\\\xa6\\\\xa3\\\\xec\\\\xaf_\\\\xab5\\\\xc8\\\\xfc\\\\x15\\\\\\\\B\\\\xb4\\\\x8c5m\\\\xb8\\\\tK\\\\xca\\\\r\\\\x92\\\\x0e\\\\xd3\\\\xcf\\\\xea\\\\xaa\\\\x8cC\\\\x1c\\\\xb6\\\\xc5\\\\x02\\\\xb0\\\\xd2\\\\xb4\\\\xdb\\\\xbe\\\\xb5!@\\\\x07\\\\x01Q\\\\xca\\\\xa0\\\\xa8\\\\x03N\\\\x91\\\\xef\\\\xa9\\\\xbc\\\\\\\\\\\\xac\\\\xb8cz\\\\xc4\\\\xbe\\\\x91\\\\xf5\\\\x1a\\\\xe7\\\\xfe \\\\xed\\\\x9f\\\\x82\\\\xb8/\\\\x8do\\\\xf0\\\\x9e*\\\\xe2+\\\\x8c>\\\\xea\\\\xddI.0p\\\\xd7\\\\xdeBT\\\\xb4\\\\xa5B\\\\x14\\\\x84\\\\x11\\\\xf3H:\\\\x1d&\\\\xae\\\\x11\\\\xb9X\\\\xdf\\\\x07F\\\\xa7\\\\x16\\\\n\\\\xfe\\\\xab\\\\xfd\\\\xfa\\\\xc4\\\\xf8\\\\xab\\\\x82\\\\xb0\\\\x8e/\\\\xbeU\\\\xfe\\\"\\\\xab\\\\x86\\\\xeeE\\\\x82\\\\xec\\\\x90[RHB\\\\x14\\\\xb0\\\\xa2\\\\xa1?J@\\\\xadV\\\\x8fI\\\\xce\\\\xc9@\\\\x95q\\\\x92\\\\x87\\\\xb7\\\\x08\\\\xbd\\\\xff\\\\x00\\\\xfa\\\\xa8\\\\xc7\\\\xa5\\\\x17dI\\\\x92x\\\\xdd\\\\x00G\\\\xd2\\\\xc2\\\\xef\\\\x07\\\\xfeUo\\\\x8f\\\\xdec}\\\\xd0m?\\\\x95\\\\xaf\\\\xb1\\\\x9b\\\\xedzi3ip\\\\xff\\\\x00\\\\x06\\\\xe1\\\\x9c9n\\\\x8bl-\\\\xc7Y\\\\xb6\\\\r8\\\\x85\\\\xb4\\\\x90\\\\x00[\\\\x8bPR\\\\x9c:\\\\xe8dm\\\\xb6\\\\xa7\\\\xadOg\\\\x02\\\\xb2\\\\xb7T\\\\xb6\\\\xeb\\\\xb9\\\\xba\\\\xe5Mj\\\\x14\\\\xfaQvG?\\\\xf4\\\\xea\\\\xdf\\\\xdf\\\\x87\\\\xdd\\\\x0f\\\\xfc\\\\xba_\\\\xfe\\\\xd3\\\\x9d\\\\x9299x\\\\xf6\\\\xcf\\\\xff\\\\x00\\\\xe2\\\\\\\\\\\\x0f\\\\xfc\\\\xba\\\\xc2]*\\\\x93nI\\\\xb7\\\\xea\\\\xed\\\\xbf\\\\xcd\\\\x9b,\\\\xd2J\\\\x93K\\\\xf27J\\\\xae\\\\xb0\\\\xdb\\\\x04\\\\xb6\\\\x9b\\\\x85\\\\xb6\\\\xc1Y\\\\t\\\\nu\\\\xfc\\\\xb9\\\\x89\\\\xe4$\\\\xd3\\\\x8al\\\\x05+\\\\xe5\\\\x1c\\\\x1a\\\\xed\\\\x9c\\\\xe9\\\\xf5\\\\xd6\\\\xa1\\\\xe1\\\\x9e\\\\xd2\\\\xbb>\\\\xed?\\\\x89\\\\x18\\\\xc2\\\\xb8g\\\\x8a\\\\x93\\\\x8a_%\\\\xa5\\\\xba-\\\\x98e\\\\xc4J\\\\x11\\\\x05D\\\\x95\\\\xa0DO]g\\\\x9dn \\\\xa8\\\\x1c\\\\xc5\\\\x12\\\\xc3\\\\x18R\\\\xa0Rr\\\\xd9\\\\xca!]cNu\\\\x92\\\\xe0j&\\\\xc4\\\\x03\\\\xc9\\\\xc5iX\\\\xb0\\\\xdfZ\\\\xc90#6j\\\\xe5\\\\xf2\\\\xa7O\\\\x85BF\\\\xcd\\\\x96\\\\xe0\\\\xd1\\\\x83#C\\\\xf5R@\\\\x13\\\\xe5F<\\\\xc5\\\\x14M\\\\x87:\\\\t:\\\\xd1\\\\xcfSE\\\\x11G\\\\xa6\\\\x94\\\\xa8V(\\\\x1e\\\\xa6\\\\xb47\\\\xa5\\\\x08\\\\xcd\\\\xc3X2\\\\xb5\\\\x91\\\\x8b\\\"=\\\\xec;\\\\xf8V\\\\xf8\\\\xdb\\\\x97\\\\x95h\\\\xbfI\\\\xa4\\\\xe6\\\\xe1\\\\x0c9_\\\\xb9\\\\x8c[\\\\xcf\\\\xbd\\\\xa7E:\\\\xd1-\\\\xd9\\\\xcd\\\\xf8noUnA\\\\x88Q\\\\xd4i\\\\xca\\\\x9f`\\\\x90\\\\xdd\\\\xd4\\\\xa8\\\\x10\\\\x14\\\\x91\\\\x90\\\\x8f=\\\\xe7\\\\xe1Q0\\\\xb5\\\\x91f\\\\xd8\\\\xd4\\\\x03\\\\x98+\\\\xdb\\\\x02\\\\xa44a7I\\\\xcc\\\\x06\\\\xa9\\\\x82Lk\\\\x9b\\\\xfcj\\\\x88\\\\n\\\\x08Q\\\\xe63f\\\\xd8\\\\x19\\\\xa0\\\\xbf\\\\x19*\\\\xcd\\\\xb9\\\\x91\\\\xee\\\\xfc\\\\xedM\\\\xadp\\\\xb5\\\\xce\\\\xb0\\\\xa26\\\\xdb\\\\xd8hw\\\\x87a\\\\x96I\\\"5\\\\xa7\\\\xa5\\\\xa0a\\\\xe4\\\\x05D\\\\x13\\\\xafR:\\\\x9ety\\\\x04\\\\x1dA\\\\xe7\\\\xa5\\\\x07\\\\x12\\\\xe3Ik\\\\xbdB\\\\x90\\\\x1cd:\\\\xd9 \\\\xf8\\\\xd0f\\\\x14:\\\\x8f\\\\t\\\\xd4t\\\\xa2J\\\\xb3\\\\x82@\\\\x905Q\\\\x03D\\\\x8fo\\\\xb4\\\\x8d\\\\xe90E^:2\\\\xd8f\\\\xe5\\\\x9d?G\\\\xc8\\\\xff\\\\x00\\\\xca\\\\xa6\\\\xd8\\\\x9c\\\\xd6LB\\\\x81$#\\\\x9f<\\\\xb5\\\\x07\\\\x1cQr\\\\xc0\\\\x82\\\\x00\\\\x05\\\\xc4\\\\xef\\\\xef\\\\xa9\\\\x96J\\\"\\\\xc1\\\\x92`\\\\xf8Q>g-\\\\x1e@\\\\x98\\\\x92KjI$\\\\xccjF\\\\xddi$f$\\\\xe6\\\\xd0\\\\xeb\\\\xaa|\\\\xfe\\\\xcaAqZ\\\\xc8O\\\\xe4\\\\xd3\\\\xd6\\\\x8c\\\\xbf}\\\\x7fmil\\\\xd9v\\\\xe2\\\\xe5\\\\xe42\\\\xda\\\\x02I*R\\\\xc8\\\\t\\\\x1and\\\\xd0\\\\xb8\\\\xd0\\\\r\\\\x94I\\\\x10f\\\\x0e\\\\xa0\\\\r\\\\xfc\\\\xa9+@0b`\\\\xc8\\\\x8a,\\\\xc4\\\\x0f\\\\x12aBF\\\\xdc\\\\xc1\\\\x8f\\\\xb4\\\\x1a\\\\x0e\\\\x82\\\\x80\\\\x85(e\\\\xcf9U\\\\x1a\\\\x18\\\\xd0\\\\xc5\\\\x1c\\\\x03\\\\x0eCyey`\\\\xe8\\\\xb0\\\\x9dG9\\\\x8e\\\\xa2\\\\x97xf\\\\xe1j\\\\xcf\\\\x9f\\\\xc0<E$f9F\\\\xf3\\\\xb7Zk1($\\\\x0c\\\\xb1:\\\\x01\\\\xb5*\\\\xe0\\\\xfc\\\\xaa\\\\xa0\\\\xcf\\\\x81% \\\\xeb\\\\xb2E1Qu\\\\xd9&\\\\xbd\\\\xab\\\\xf6w\\\\'S\\\\xc5Xg(\\\\x9f\\\\xd6\\\\x1b\\\\xfc\\\\x05z\\\\xf5^A\\\\xf6A*\\\\xeds\\\\xb3\\\\xa0\\\\x01#\\\\xf9S\\\\x87\\\\x19\\\\xff\\\\x00l\\\\x9f\\\\xc2\\\\xbd|\\\\xa9C\\\\xf0c\\\\xbcd\\\\xac\\\\xb8k\\\\x1ew\\\\t\\\\xff\\\\x00\\\\x85U\\\\xc0\\\\xbd\\\\xba]9k\\\\xda\\\\xa7\\\\x1c\\\\xdc\\\\xb0\\\\xa56\\\\xa6\\\\xae\\\\xec@ZTA\\\\x07\\\\xd5\\\\x9a\\\\x04H\\\\xea\\\\rw\\\\xbf\\\\x1a\\\\x9f\\\\xe6\\\\xfbQ\\\\xd6\\\\xe4\\\\x7f\\\\xc2\\\\xaa\\\\xf3\\\\xff\\\\x00\\\\xb7\\\\x07[_i|\\\\x7f\\\\x9cw\\\\x93\\\\x8b\\\\xd8\\\\xb6Q%!_\\\"\\\\xd71\\\\xb1\\\\x1f}vt\\\\x7f\\\\xe2\\\\xfe\\\\xfeF9\\\\xd5\\\\xe2h\\\\xdc\\\\xf8Gd\\\\xa9*\\\\no\\\\x1d\\\\xc6\\\\xeds\\\\x8d\\\\xbdl\\\\xce\\\\xb1\\\\x15i\\\\xc3\\\\xdc>\\\\xee!~0\\\\xb3\\\\x89\\\\xe2\\\\x0c*\\\\xc7\\\\rmKP|K\\\\x9f\\\\xac8\\\\tV\\\\x9a\\\\x929\\\\xd6wd\\\\x18K\\\\xe1\\\\x08l\\\\x00\\\\x14\\\\x00\\\\x85\\\\x9d+\\\\x1a\\\\xe1lG\\\\'\\\\x19\\\\xe2\\\\x05\\\\x8c6\\\\xe4[\\\\\\\\\\\\xe0\\\\x8d<\\\\xe5\\\\xda\\\\x9cGv\\\\xd3\\\\x82\\\\xe5\\\\xd4\\\\x86r\\\\x18\\\\\\\\\\\\x90\\\\n\\\\xb3DF\\\\x87X\\\\xadWQ9Fv\\\\xf8_\\\\xa9\\\\xe9\\\\xce1\\\\xc4\\\\xd7dR\\\\xfe\\\\xc4\\\\xd3\\\\xc2m\\\\'\\\\x12m\\\\x93wy\\\\xdd\\\\x86\\\\x9dx\\\\xa3\\\\xbe!$\\\\x01):\\\\r\\\\x08=>\\\\xba\\\\x93g\\\\xc0\\\\xde\\\\xb2\\\\x8b_\\\\xd2\\\\x1c\\\\x13\\\\xc4\\\\xf7\\\\xa9\\\\\\\\\\\\x07..1\\\\xf6\\\\t)$jR\\\\x16\\\\x9d#\\\\xa0\\\\x06\\\\x07Zq\\\\xacv\\\\xed\\\\xfe1z\\\\xd5\\\\xfc4\\\\xb3b\\\\xde\\\\x0c\\\\xa7\\\\x1b\\\\xc4C\\\\x88\\\\xee\\\\xdcp\\\\x95fk$\\\\xcc\\\\xa5 *H\\\\x8db\\\\x98\\\\xb3\\\\xb4R0\\\\x8f\\\\xd2MZ`\\\\xf7\\\\x96\\\\x16\\\\xec\\\\x05\\\\xae\\\\xe9\\\\x8c\\\\x15\\\\x87t\\\\x11\\\\x9a\\\\no5#\\\\xc8}\\\\x950\\\\xcb9.}=L\\\\xf2\\\\xa8\\\\xc9[H\\\\xa4\\\\xe0<9\\\\xcb>\\\\xd6pVT\\\\xd1`[Xb\\\\xa8)Y\\\\nX\\\\x85\\\\xa1!*#r\\\\x9d\\\\x81\\\\xf3\\\\xae\\\\x80\\\\xf7\\\\xd6\\\\x95\\\\xe0\\\\xa5[\\\\xddv\\\\xb3osh\\\\x96\\\\xd2\\\\x95\\\\xe0\\\\xb7n\\\\x8e\\\\xee\\\\xdc\\\\xb2\\\\x92\\\\x14\\\\xe3`\\\\x10\\\\x82\\\\xa5G>f\\\\xb7H\\\\x14uro\\\"o\\\\xd0\\\\xe1\\\\xc4\\\\xbb#H\\\\xe5\\\\x04\\\\x9a\\\\xc8\\\\xf8{[g:\\\\x07\\\\x0e\\\\xde\\\\xc1X\\\\xda\\\\'I\\\\x1a\\\\x8e[\\\\xd6G\\\\xc3\\\\xc4\\\\xfa\\\\xbb\\\\xfeN\\\\x0f\\\\xb2\\\\xb8\\\\xe8\\\\xe9l\\\\xbaH\\\\xdfJT~f\\\\x92=\\\\xb4\\\\xa8\\\\xfc\\\\xefN\\\\x89l\\\\t\\\\x83\\\\xb1\\\\x9db\\\\x92\\\\x97\\\\xdbq\\\\xc56\\\\x95x\\\\xd2|@\\\\x88\\\\x8ar\\\\x01\\\\x1du\\\\xde\\\\x8f.\\\\xfaO\\\\xdbGh\\\\xacI\\\\x024\\\\xad/\\\\xe9\\\\x1e\\\\xd8s\\\\x83\\\\xad\\\\xc6\\\\xf9q[#\\\\xa9\\\\x8d\\\\xc3\\\\xa2\\\\xb7I\\\\x04\\\\x9d\\\\xabPzDJ8\\\\x1dN\\\\x10\\\\x95%\\\\x18\\\\x95\\\\x81 \\\\xed\\\\x05k\\\\x1f}9GD^\\\\xceQ\\\\xc3\\\\'\\\\xd5\\\\x90Rt\\\\x95nv\\\\xd0T\\\\x86\\\\x81\\\\x8b\\\\xd1\\\\xa9\\\\xd1:O\\\\xf1\\\\nc\\\\r\\\\xf0\\\\xdb\\\\x94\\\\x89\\\\xf0\\\\xb8D\\\\x91\\\\xca*C\\\"=o]`\\\\t\\\\xff\\\\x00XTQC\\\\x0e\\\\x02\\\\x14\\\\xa3\\\\xaf83@\\\\r\\\\x88$\\\\xfb4\\\\x9f\\\\xcf\\\\x95\\\\x1b\\\\x80\\\\x05/\\\\xc3*\\\\x99\\\\x06)N%%D6!$\\\\x08\\\\x19`\\\\x11\\\\xec\\\\xa4\\\\x80\\\\x95\\\\x8a+;x\\\"J\\\\x94\\\\xbc\\\\xb8Si \\\\x88\\\\x8f\\\\x96w\\\\xc3\\\\xec\\\\xd7\\\\xeb\\\\xa8aj\\\\x00\\\\x84\\\\xa8\\\\xc2\\\\x86U\\\\x0c\\\\xc4H\\\\xde\\\\x0f\\\\x96\\\\x83JS\\\\xabS\\\\x9d\\\\xd0p\\\\x98e\\\\xbe\\\\xed&d\\\\xc6bc\\\\xfd\\\\xe3I\\\\xd6\\\\x0c\\\\x8dI\\\\xe8E6\\\\xed\\\\x8b\\\\xc1Y\\\\x8c\\\\x98\\\\xc3\\\\xe4\\\\xfe\\\\xf2H\\\\x93\\\\xbdK\\\\xb0\\\\xfe\\\\x80\\\\xd0:\\\\x1c\\\\xad\\\\xfb>mD\\\\xc5\\\\xc1\\\\xf5\\\\x1dIL\\\\xad>\\\\xea\\\\x95a\\\\xa5\\\\x839@H\\\\x86\\\\xf6\\\\xf6oH\\\\t0f\\\\x0e\\\\xf2\\\\x08\\\\x93&\\\\xad\\\\xf8Y\\\\xd4Yqw\\\\x0e=s\\\\x9c7o\\\\x8cZ8\\\\xe6H*\\\\tK\\\\xe8&=\\\\xc0\\\\xd5l$2\\\\xb3\\\\x94%s)\\\\xd3\\\\xec\\\\xa2K\\\\xdd\\\\xcd\\\\xe2n\\\\x1a\\\\x04)\\\\xb7\\\\x83\\\\x89$\\\\x1dH3\\\\xf7P\\\\xb5\\\\xb1\\\\xbd\\\\xe8i_\\\\xb7t\\\\x98\\\\xd5\\\\xf7H3\\\\xbf\\\\x8dGQ\\\\xec4K\\\\'\\\\xc0\\\\x95\\\\x1d\\\\x131\\\\x1b|>\\\\xda\\\\x0b\\\\xf1-Z\\\\x8dTN\\\\xb3\\\\xd6h\\\\x97\\\\xaa\\\\x95\\\\x10\\\\'\\\\xaf\\\\xdb@Pfr\\\\x02v\\\\x1f\\\\xc5\\\\xb5*\\\\xeb\\\\xf6\\\\x8e\\\\x81\\\\xb6A\\\\xb7\\\\xf6E$\\\\xe5(\\\\xf1N@5\\\\x03z;\\\\xcf\\\\xda;\\\\xa10405\\\\xf0\\\\xef@Q{\\\\xd8\\\\xd8\\\\x9e\\\\xd8;8\\\\x06#\\\\xf9Qa\\\\x1e\\\\xe7\\\\x01\\\\xfb\\\\xab\\\\xd7\\\\xaa\\\\xf2\\\\x13\\\\xb1@U\\\\xdb/f\\\\xe0\\\\x12\\\\x82x\\\\x9a\\\\xcbT\\\\xef\\\\x01[k\\\\xe4\\\\x08\\\\xf6\\\\x13^\\\\xbb\\\\x14(\\\\xcf\\\\xca\\\\xac{\\\\x87\\\\xe1Qt\\\\xc4\\\\xb81\\\\xde5\\\\xd6\\\\xce\\\\xc8\\\\x7f\\\\xd6\\\\'\\\\xfd\\\\xc5W\\\\x9e\\\\xbd\\\\xb2:\\\\x0fj|~\\\\x1d\\\\nSj\\\\xe2KD\\\\x10\\\\x95\\\\xe52\\\\x1ah\\\\x0eF\\\\xbd\\\\x04\\\\xe30\\\\xa45b\\\\x14\\\\xe2\\\\x96\\\\x0b\\\\xca0@\\\\xfd\\\\xdf!\\\\\\\\\\\\x05\\\\xda\\\\x05\\\\xab\\\\x98\\\\xefk\\\\x9c}`\\\\xc9i\\\\x0e+\\\\x88\\\\x8b\\\\x88R\\\\xa6s4\\\\xda<>\\\\xc3\\\\xf6\\\\x8a\\\\xed\\\\xe9?\\\\xc4\\\\x14\\\\xe2\\\\xe7\\\\x1e\\\\xd5\\\\xbb:\\\\xe1\\\\xb5#\\\\xbfpwn\\\\x1f\\\\x1c~\\\\xd0~\\\\x15\\\\x8b\\\\x8b\\\\x86]\\\\xe3n)\\\\xc3\\\\x13\\\\x89\\\"\\\\xdb\\\\x11^\\\\x15h\\\\xebi\\\\x0e\\\\x02\\\\xf3M\\\\x15\\\\xae\\\\x16\\\\x13\\\\xcd2bz\\\\x98\\\\xadd\\\\xf7j\\\\xdcW\\\\x84!\\\\x91ym\\\\x82\\\\xad\\\\xd7\\\\x02\\\\xf2\\\\xa9kpg))\\\\x04\\\\xe9\\\\xa4\\\\xf8\\\\x87\\\\xd75\\\\x84\\\\xe3}\\\\xac\\\\xe3\\\\x17x\\\\x85\\\\xa6.\\\\xcd\\\\xf2p\\\\x97\\\\xefm\\\\x03w\\\\x96\\\\xe8\\\\x0c\\\\xa9_&\\\\x14\\\\x91\\\\x91JD\\\\xe4\\\\x0b\\\\xd4\\\\xa0\\\\xcc\\\\x89\\\\x13\\\\xce\\\\xb4\\\\xc5\\\\x82I\\\\xc97\\\\xca\\\\xfdQ\\\\xe8fj[\\\\xf4:A\\\\x18\\\\xbd\\\\x92\\\\xf1\\\\xb3f\\\\xce#n\\\\xe6#ga\\\\x9e\\\\xe5\\\\xa4\\\\xbe\\\\x12\\\\xf0\\\\x05\\\\'*\\\\xd6\\\\x91%\\\\x01PHP\\\\xf3#j\\\\xb6\\\\xba\\\\xb5\\\\xc4/xw\\\\x10\\\\xb9U\\\\xfe.\\\\xfd\\\\xa7\\\\xa8\\\\xadjP\\\\xc6\\\\xed\\\\xae\\\\x19p\\\\x04f$\\\\xe5i%\\\\\\\\\\\\xb5\\\\x07Q\\\\x11ZG\\\\xb3\\\\x9e)\\\\xbc\\\\xc5xN\\\\xc3\\\\x16\\\\xbb\\\\xbbo\\\\x14\\\\xc5\\\\xd8\\\\xbc\\\\xb8\\\\xb5\\\\xc4\\\\\\\\\\\\xb6Sv\\\\xae)\\\\xb2~G*\\\\xf2\\\\x85\\\\x04\\\\xeb)\\\\x8c\\\\xd9L\\\\x91\\\\xd2\\\\xb3\\\\x1cC\\\\x8a[E\\\\xbb\\\\xac\\\\\\\\;x\\\\xfd\\\\xe3\\\\xf6\\\\xaf$<\\\\x9e4\\\\xef\\\\xc0\\\"G\\\\xca\\\\xdb\\\\xe4JB\\\\xf7\\\\xcc\\\\x8c\\\\xa0L\\\\x81\\\\x1c\\\\xae\\\\x10\\\\xed\\\\x95&g\\\\x91\\\\x7f.\\\\xe8\\\\xbe\\\\xec\\\\x84\\\\xb9q\\\\xda\\\\x03n8\\\\xac\\\\xc9o\\\\x85\\\\x94\\\\xad\\\\xb5\\\\x05w\\\\t\\\\x06\\\\x7f\\\\xbb[\\\\xe3\\\\xf3\\\\xb5s\\\\xc7aw\\\\x06\\\\xeb\\\\xb4\\\\x1cID\\\\x08k\\\\x85m@\\\\x831\\\\x9e\\\\xe1F\\\\'\\\\x98\\\\xf0\\\\xd7C\\\\xfew\\\\xa5\\\\xd6\\\\xaa\\\\xce\\\\xd1\\\\xc1\\\\x8d\\\\xdc\\\\x139=\\\\x1b\\\\rt\\\\xac\\\\x8f\\\\x87c\\\\xba\\\\x7f]\\\\x96=\\\\xc2+\\\\x18C\\\\x89;\\\\x1c\\\\xd24\\\\x8a\\\\xc8p\\\\x07r\\\\xa6\\\\xe32\\\\x16\\\\x80Jc0\\\\x8e\\\\xb5\\\\xccl\\\\xcc\\\\x88E((t\\\\xd2\\\\xa1\\\\xfa\\\\xd0\\\\x03\\\\xa6\\\\xbb\\\\x9a\\\\x06\\\\xf29\\\\xc5\\\\x04\\\\x93\\\\xb3@\\\\xda\\\\x8c\\\\xaf\\\\x7f:\\\\xadU\\\\xf4\\\\x023\\\\x00|\\\\xe9\\\\x971\\\\x00>\\\\x96\\\\xbe\\\\xdaV\\\\x85L\\\\xb5\\\\xef\\\\x0c\\\\xef\\\\x15\\\\xa8}\\\"\\\\xe1]\\\\x9d\\\\xe2j\\\\x91\\\\xf2w6\\\\n<\\\\xff\\\\x00\\\\xaf\\\\x03_\\\\x8dlO\\\\xd2\\\\t\\\\x9d\\\\xd5Z\\\\xf7\\\\xb7R\\\\xc5\\\\xd7d\\\\xfcF\\\\xea\\\\x91.!Vj\\\\n\\\\x93\\\\xb0\\\\xb9G\\\\xe2iJJ\\\\xa8J.\\\\xceO\\\\xb1T7\\\\x04\\\\xc1\\\\x0b:\\\\x111\\\\xa6\\\\xd4\\\\xfbeY\\\\xef\\\\x13\\\\xaeR\\\\x8d\\\\xba\\\\xc1\\\\x1aT[3\\\\x91$j\\\\x08T\\\\xfdT\\\\xf3D%\\\\xcb\\\\x90#Ft\\\\xe5:\\\\x8eU\\\\x8f\\\\x83O!)\\\\xc0I\\\\nT@\\\\xf3\\\\xde\\\\x8c8\\\\x98&t\\\\xdfi\\\\xa6V\\\\xa3\\\\x98\\\\x89\\\\x93\\\\xac\\\\x19\\\\xa2I\\\\xd4\\\\x14\\\\xf9j5\\\\xa7z$\\\\x7f6\\\\xd3\\\\xae\\\\x9b\\\\r\\\\x7f?\\\\xe3J$k\\\\xa8\\\\x94\\\\x90v\\\\xdb\\\\xe1N_\\\\xb5l\\\\xc5\\\\xae\\\\x06\\\\xbbp\\\\xae\\\\xf1\\\\xfb%\\\\xaa\\\\xe6\\\\x15\\\\xfdh\\\\xb8q\\\"?\\\\xd4\\\\x08\\\\xd3\\\\xdbL\\\\xb4P\\\\x90\\\\xb0\\\\xe2I%\\\\'&S\\\\x00*t\\\\'\\\\xa8\\\\xdciM\\\\xe8\\\\x16\\\\xca\\\\xfcic\\\\xd4I\\\\x00\\\\x93\\\\x9d<\\\\xf7\\\\xd3\\\\xeb\\\\xe7R0\\\\xf5E\\\\x9bD\\\\x98\\\\x04#\\\\xcf\\\\\\\\\\\\xb5\\\\x13\\\\x161d\\\\xa0u9\\\\xd3\\\\xf1\\\\x9a~\\\\xc4\\\\x93\\\\x87\\\\xb2`|\\\\xd4{\\\\xf4\\\\xdb\\\\xca\\\\x90\\\\xfc\\\\x93\\\\xf3\\\\xa7)\\\\x82\\\\x0cl5\\\\xd66\\\\xa4\\\\x05$F\\\\xba}\\\\xb4\\\\xd1T\\\\x19=fF\\\\x9a\\\\xfe~\\\\xea\\\\xb2\\\\xe1\\\\xd6l\\\\xee\\\\xb1\\\\xfc:\\\\xdf\\\\x15R\\\\x91`\\\\xeb\\\\xcaK\\\\xea\\\\n\\\\xd4x\\\\x15\\\\x1a\\\\xff\\\\x00h&\\\\x85oA\\\\xc1\\\\x05J\\\\xdc\\\\x13\\\\x02#h\\\\xa2.A\\\\x12\\\\xa0\\\\x01\\\\xfe)\\\\x89\\\\xa8\\\\xac\\\\xa9j\\\\xb6eN&\\\\x1c\\\\xca3x\\\\xb6$k\\\\xec\\\\xa7\\\\x1eR\\\\nZ)IB\\\\xc2\\\\x0erN\\\\x8a3\\\\xcb\\\\xdd\\\\xa7\\\\xdfOb\\\\x1c\\\\xef\\\\x0b\\\\x7f(\\\\xda\\\\x8aV\\\\x83\\\\x98(h\\\\xad\\\\x0e\\\\xff\\\\x00\\\\x1a;\\\\xff\\\\x00\\\\x0b\\\\xf7@\\\\xef\\\\x04\\\\x1d7\\\\xd2\\\\x99\\\\x92\\\\x19\\\"\\\\x01 \\\\x1eR`\\\\x8aw\\\\x14$\\\\xdd^\\\\x12I \\\\x9e~T\\\\xb7c$vm\\\\x7f\\\\x88a]\\\\xa1\\\\xf0u\\\\xff\\\\x00\\\\x0fX3\\\\x8a\\\\xe2\\\\xf6\\\\xd8\\\\xd5\\\\xbb\\\\x96Vn\\\\xbd\\\\xdd&\\\\xe1\\\\xd0\\\\xa8Ke\\\\x7fFf\\\\'\\\\x91\\\\x89\\\\x9d\\\\x8f~\\\\xa3\\\\xb5\\\\xae\\\\xde\\\\xae\\\\xc96\\\\xdd\\\\x92`\\\\x16rL\\\\x0b\\\\x9e(B\\\\xa3\\\\xdb\\\\x00W\\\\tv(\\\\xd9w\\\\xb6N\\\\xcd\\\\xd2<?\\\\xe5\\\\x15\\\\xa4\\\\xf9\\\\x99&\\\\xbd1\\\\xef\\\\x1dmd\\\\xcaI$\\\\xf2\\\\x15\\\\xcb\\\\x9eRRTm\\\\x89E\\\\xad\\\\x98\\\\xd7\\\\x0c\\\\xf17h\\\\\\\\B\\\\x9b\\\\xb4v\\\\xab\\\\xc3XG\\\\x0f\\\\xae\\\\xddm+\\\\x0e^\\\\x17\\\\x88z\\\\xd2n\\\\x02\\\\x82\\\\x83\\\\xa1Z\\\\x92\\\\x92\\\\x98Lu\\\\xcczI\\\\xe3~)\\\\xc5\\\\x95a\\\\xdbW\\\\x1d\\\\xdd\\\\x97ChO\\\\x11\\\\xdd\\\\x85\\\\x15\\\\xac\\\\xa1)\\\\x80\\\\x90\\\\tP\\\\x04\\\\r\\\\xa3\\\\xdb\\\\x15\\\\xddO\\\\xba\\\\xe3\\\\xaaGx#,\\\\xc1\\\\x07\\\\xd9Z\\\\x97\\\\x1e\\\\xf4z\\\\xec\\\\xef\\\\x16\\\\xfeVq.+\\\\x84\\\\xe2\\\\x17\\\\x18\\\\x9b\\\\x88\\\\xbb\\\\xc4\\\\xde#\\\\x1b\\\\xb9i\\\\xb5\\\\xbd\\\\x91N\\\\x1f\\\\x02\\\\x14 \\\\x12\\\"\\\\x06\\\\xc2\\\\xbbz\\\\\\\\\\\\x8e)I\\\\x917\\\\xdb/\\\\x85\\\\xf0h\\\\xab\\\\x8e&\\\\xb7\\\\xc6\\\\xadl\\\\xac8\\\\x85\\\\xd6\\\\x97j\\\\x8cI\\\\xab\\\\x97.ZJ^Op[t*\\\\x16v\\\\xf1\\\\x14fO=:T\\\\x13\\\\xc7\\\\xc9\\\\xc0Wj\\\\xed\\\\xf7\\\\x0ea\\\\xdcT\\\\x85Z\\\\xb5n\\\\x9b\\\\x17\\\\xdbB[\\\\xb7!EEq\\\\x95r\\\\xa31\\\\xc8\\\\x8fa\\\\xaa\\\\x0bFxe\\\\xfbV\\\\x14x*\\\\xcd\\\\x1d\\\\xe2\\\\x12\\\\xa2\\\\x94\\\\xe3\\\\xf8\\\\xa4k\\\\xae\\\\x9f-O&\\\\xd7\\\\x87\\\\x08\\\\xf0\\\\xf0\\\\xa3H\\\\x13$\\\\'\\\\x1f\\\\xc4\\\\xa2}\\\\x9d\\\\xedz\\\\xaaO\\\\xc2\\\\xfb\\\\x04\\\\xfa\\\\x89N4\\\\xcc\\\\xfa\\\\xdb\\\\xb4\\\\x9c6\\\\xf2\\\\xd3\\\\x08S\\\\xd8\\\\x12pv\\\\x12\\\\xe2\\\\xdfr\\\\xc6\\\\xde\\\\xd8)\\\\xb6ITe\\\\x1e\\\\x009L\\\\xe5\\\\x1f;\\\\x9d]5\\\\x8epu\\\\xcb\\\\xcf^+\\\\x1e\\\\xe2Kg\\\\x1fy\\\\xc7\\\\x1eJ\\\\xf0KG\\\\x82B\\\\x959J\\\\xb3\\\\x05\\\\xa8k\\\\x01[\\\\xc0\\\\x13\\\\xa8\\\\xad^\\\\xdd\\\\x8e\\\\x04\\\\x07\\\\x87\\\\x02[c\\\\xe8\\\\xe5\\\\xe2\\\\x0c@G\\\\xfd\\\\xed8\\\\xc6\\\\r\\\\x82\\\\xdd\\\\xddZ6p\\\\xbb\\\\x90\\\\x97\\\\x9fi\\\\x93\\\\xfc\\\\xfbzL)a1\\\\xaa\\\\xfc\\\\xfe5K\\\\xb2\\\\xeeQ\\\\x7f\\\\x9a&}FW\\\\x04\\\\xa2\\\\xd6\\\\x8e\\\\x90\\\\xf4v_\\\\x7f\\\\xc7|^\\\\xb0<\\\\x0cp\\\\xfe\\\\x14\\\\xdaH\\\\x11 \\\\xb8\\\\xf1\\\\x9c\\\\xbfFcnU\\\\xd1\\\\xb2zV\\\\xbb\\\\xec\\\\xd7\\\\xb2n\\\\x1b\\\\xec\\\\xba\\\\xeb\\\\x19W\\\\n\\\\xfe\\\\x94+\\\\xc4\\\\x03m\\\\xdc\\\\x9b\\\\xfcEwR\\\\x1b*)\\\\xcb\\\\x98J~q\\\\xac\\\\xf9K!DF\\\\xc7\\\\xa5pu9\\\\x16\\\\\\\\\\\\x8e~\\\\xa68\\\\xe2\\\\xe3\\\\x14\\\\x99\\\\xcd\\\\xe2\\\\xf2\\\\x13\\\\xe0\\\\x01 t\\\\x14\\\\x15x\\\\xa9\\\\x89\\\\x9f:\\\\ra\\\\x17kH\\\\x96\\\\xd0\\\\x83\\\\x1fI\\\\xd1\\\\xa7\\\\xb8M8\\\\xac,\\\\xb3\\\\x1e\\\\xb3un\\\\xc7\\\\x91\\\\xcc~\\\\xd8\\\\xae\\\\x07\\\\x9a+\\\\xc9\\\\xdf\\\\xee\\\\x9f\\\\xa0\\\\xc1\\\\xba^\\\\xa6H\\\\xf7\\\\xd3f\\\\xe1Q\\\\xa1\\\\x06\\\\x9dP\\\\xc3YNg\\\\xb1D\\\\x81\\\\xfc\\\\tO\\\\xe2M)\\\\xa5\\\\xe1\\\\xef\\\\x10-Q\\\\x7f{\\\\xd3#N\\\\x10~\\\\t\\\\x1fmG\\\\xbd^\\\\x07\\\\xee\\\\xd8\\\\xc7z\\\\xb3:\\\\x98\\\\x8eZSKt\\\\xcf\\\\x89q\\\\xef\\\\x15t\\\\x8c2\\\\xe1\\\\xd0\\\\r\\\\xb7\\\\x0f\\\\xdd\\\\xb9?I\\\\xf0\\\\x10#\\\\xda\\\\xa5\\\\x1f\\\\xb2\\\\xa47\\\\x80c\\\\x0e\\\\x11\\\\xdd\\\\xe1\\\\xf8}\\\\xa0\\\\xdb\\\\xe5\\\\x1f\\\\xcc~\\\\tO\\\\xdfY\\\\xfb\\\\xd4\\\\xbc\\\\x07\\\\xbb1\\\\xd4,\\\\x1dA\\\\xcd\\\\xb6\\\\xc0\\\\x9f\\\\xb2\\\\xb1~\\\\xd7X[\\\\x9d\\\\x92\\\\xf1g\\\\xc9\\\\xb9\\\\t\\\\xb6ez\\\\xa0\\\\x81\\\\xa5\\\\xc3pkm3\\\\xc3\\\\x18\\\\x8a\\\\x80\\\\xf5\\\\x9cR\\\\xd5\\\\x81\\\\xd1\\\\x8bR~\\\\xb5\\\\xab\\\\xee\\\\xacg\\\\xb6\\\\x1e\\\\x17C}\\\\x8e\\\\xf1\\\\xdb\\\\x8b\\\\xc4\\\\xee\\\\xdfq\\\\xac\\\\x1dn\\\\x84\\\\x9c\\\\x89A\\\\xca\\\\xe2\\\\x0c\\\\x14\\\\xa5;iK\\\\xdf[\\\\x07\\\\x8a\\\\x91\\\\xc3V\\\\xe4\\\\xca\\\\xe3@\\\\t#_o\\\\xdfN7%w<\\\\xe5\\\\x9dU1#O\\\\xc2\\\\x9bIBR\\\\nH \\\\xa8\\\\xcc\\\\xaay\\\\x9d(6Gx\\\\xf0\\\\x80Gr@\\\\x8fv\\\\xbf\\\\xe1]k\\\\x83\\\\x95\\\\xf2\\\\x13\\\\x9b\\\\xac\\\\xf4\\\\xdb^\\\\xb4\\\\xa5\\\\xf83j\\\\x15)\\\\x19\\\\x7f\\\\nl\\\\x89\\\"S\\\\xac\\\\xf3\\\\xa5o\\\\x13>Z\\\\x1f\\\\xb6\\\\x98\\\\nyc\\\\xb8\\\\xb4\\\\xca\\\\xe0Z\\\\x83*\\\\x05#\\\\xe8\\\\x9c\\\\xe7O\\\\x86\\\\xbe\\\\xfaBV7\\\\x1a\\\\t\\\\xd2LP ~\\\\xec\\\\x0e@\\\\x9f\\\\xcf\\\\xe4R\\\\x80\\\\x02r\\\\xea\\\\t\\\\xd6i\\\\xb2|\\\\x95\\\\xd8\\\\xb2\\\\xbfQ^\\\\x83\\\\xc2\\\\xa4\\\\xcf\\\\xc6\\\\xa4\\\\xd8\\\\x91\\\\xfa>\\\\xdd#(\\\\x84\\\":{\\\\xe9\\\\x8c\\\\\\\\\\\\x01d\\\\xb2\\\\x990\\\\xb4\\\\xc4\\\\xeb\\\\xcf\\\\xec\\\\xa70\\\\xe86,\\\\x0c\\\\xbe\\\\x10\\\\x94\\\\x11\\\\xae\\\\xbb\\\\x1a\\\\x18\\\\x13r\\\\x8e\\\\xe9Nf\\\\x92\\\\x91\\\\xb6\\\\xc4\\\\x1f\\\\xc2\\\\x9e\\\\xb1V\\\\\\\\J\\\\xdc\\\\xbc\\\\xe8e=\\\\xe7\\\\x89[\\\\x81#B|\\\\xa6>4\\\\xc4\\\\xf8H\\\\x03M\\\\xf5>\\\\xde\\\\xb4\\\\x88Nc\\\\xe7\\\\xb9\\\\x9f\\\\xae\\\\x80ch\\\\x94\\\\xa5\\\\x02%Q\\\\xd7o/\\\\xb6\\\\x82\\\\xc9\\\\xcc\\\\xa2\\\\x88\\\\xdc\\\\x9d?>T\\\\xb8H\\\\xd0\\\\r\\\\'\\\\xae\\\\x86\\\\x9aV\\\\\\\\\\\\xc3y\\\\x1a\\\\xc9\\\\xfch@\\\\xc5*H\\\\xf0\\\\x82\\\\xa9I\\\\x00\\\\x01\\\\xac{)\\\\xdcID\\\\xdd^B\\\\x84\\\\xe6Q\\\\x1at\\\\xa6\\\\x86Te\\\\xccN@g\\\\xc2A\\\\'\\\\xf3\\\\xd2\\\\x95\\\\x88\\\\x10\\\\x1f\\\\xbc\\\\xcb\\\\xa7\\\\x88\\\\x81\\\\x1bQ\\\\xae\\\\x06e\\\\xde\\\\x8fLz\\\\xc7n}\\\\x9b\\\\xa0\\\\x99\\\\x8ci\\\\x0e\\\\x7fu\\\\xb7\\\\x15\\\\xf7W\\\\xa9o`\\\\xc9V\\\\xc0\\\\x1fp\\\\xaf1\\\\xbd\\\\x18\\\\x9bK\\\\xfe\\\\x90\\\\x1d\\\\x9f$\\\\x89\\\\xfepy_\\\\xdd\\\\xb4|\\\\xef\\\\xee\\\\xafW{\\\\xb4\\\\xa9\\\"@\\\\xda\\\\x89E5\\\\xb2Si\\\\xe8\\\\xd7x\\\\xc5\\\\x90\\\\xb2y\\\\x80$gJ\\\\x8cL\\\\xf3\\\\x15G\\\\x8a\\\\xab\\\\xbb\\\\xe0\\\\xbe0r`\\\\xa7\\\\x06\\\\xbe3\\\\xd3\\\\xe4\\\\x17Y\\\\x7f\\\\x19\\\\xa7-\\\\xd5\\\\x88\\\\xd8wnm\\\\xedMa\\\\x1cF\\\\xbe\\\\xeb\\\\xb3\\\\xae8wP\\\\x06\\\\x07}\\\\xaf\\\\xfb\\\\x05\\\\xd3\\\\x84TRHm\\\\xb6\\\\xce(\\\\xe1\\\\x8b\\\\x1b[\\\\xcc5b\\\\xe9\\\\n[\\\\x88C!\\\\xa2.\\\\x0b{\\\\x8dt\\\\xe7;N\\\\x90y\\\\x89\\\\xac\\\\x89\\\\x18\\\\x06\\\\x16V2&\\\\xe1@)@\\\\xfe\\\\xb9\\\\x066\\\\xcb% \\\\x03#ND|j\\\\xaf\\\\x84\\\\x1c,\\\\xda8{\\\\xde\\\\xe8\\\\x82\\\\xd0\\\\x070\\\\x8d\\\\x13\\\\xa8#\\\\xa7\\\\xe7\\\\xaddl8\\\\x90\\\\x1fm*\\\\x92T\\\\xae\\\\xf5kY\\\\x00)Fcm\\\\x81\\\\x98\\\\x06|\\\\xa7c\\\\xea\\\\x99\\\\r\\\\xdb\\\\xf0\\\\xe6\\\\x19\\\\x97U\\\\xba%\\\\xc8\\\\n7`\\\\r\\\\xc0\\\\xd8\\\\xa7_\\\\xaa\\\\xa0Y\\\\xb2\\\\xd7\\\\xf2\\\\xa7\\\\r\\\\xb6\\\\xb6i\\\\xc6P1Kf\\\\xf2:\\\\xf7z\\\\xa9\\\\x0f$\\\\x1f\\\\x16T\\\\xe8w\\\\x00\\\\x8a\\\\xcam\\\\xd6\\\\xe3\\\\x8aA+Q\\\\xd4\\\\x90\\\\x95:\\\\xa3\\\\x13\\\\xbf(\\\\x8f\\\\xb2O(\\\\xaa{%\\\"\\\\xef\\\\xb4\\\\\\\\\\\\x11\\\\r!\\\\xc4\\\\x91\\\\x8cZ4\\\\xbc\\\\xea\\\\n\\\\x95%\\\\xc4\\\\x89\\\\x06\\\\x01\\\\x88\\\\x03z<\\\\x8f\\\\xfe\\\\x93\\\\xb9\\\\xad\\\\xd4}b\\\\xe7\\\\xfd!\\\\xfbh\\\\x9c|\\\\xa5\\\\xc5\\\\x8e\\\\x8a\\\"\\\\x85\\\\xa89\\\\xdeQ\\\\x06\\\\n\\\\xcf-*\\\\xbe\\\\xe6\\\\xe1i\\\\xb9x\\\\x04\\\\xc8\\\\x0bV\\\\xb3\\\\xe7^NGF\\\\xb15#|\\\\x19\\\\x87\\\\xea/1\\\\x1cN\\\\xf3RHU\\\\xd6P}\\\\xc2\\\\xa6[\\\\xf0\\\\xa7\\\\x0e\\\\xda\\\\xea\\\\x8c1\\\\x95\\\\x9d\\\\xe5\\\\xc2\\\\xa7\\\\x0f\\\\xd6iM\\\\xba\\\\x08\\\\x00s$\\\\xc0\\\\xa7\\\\x83\\\\xb3\\\\xd4\\\\x8a\\\\xf1\\\\x96Iz\\\\x9e\\\\xdb\\\\x82&\\\\xb2\\\\xcd\\\\x85\\\\x98\\\\x1e\\\\xaben\\\\xca\\\\x87\\\\xee\\\\xb2\\\\x90~\\\\xca\\\\x95\\\\xeb\\\\x8a \\\\r`\\\\x1d\\\\xb3\\\\x11U\\\\xc9R\\\\xb9\\\\xc8\\\\xa5\\\\xa5s\\\\x11\\\\xcet\\\\xa9\\\\xee\\\\x17m\\\\x13\\\\r\\\\xca\\\\x80\\\\x99H\\\\x9f/*g\\\\xbeR\\\\x8e\\\\xab:s\\\\xa6T\\\\xb0w1\\\\xa5\\\\x103\\\\xed\\\\xf2\\\\xa7d\\\\x12\\\\x92\\\\xaf0+\\\\x19\\\\xed]\\\\xbe\\\\xfb\\\\xb2N\\\\xd0\\\\x11\\\\xb1<=vb:&~\\\\xea\\\\xc8\\\\xd2u\\\\x8f\\\\xaf\\\\xa5Sv\\\\x80\\\\xdf\\\\x7f\\\\xd9\\\\xc7\\\\x1b\\\\xb7\\\\xac+\\\\x87\\\\xaf\\\\xe7\\\\xdc\\\\xc2\\\\x8dTyD>\\\\x0f<;\\\\xc2\\\\xe3hY\\\\xf1\\\\x1c\\\\xc4\\\\x9d|\\\\xf4\\\\xd6\\\\x89\\\\xb5~\\\\xb0\\\\xe6h\\\\xd5\\\\x95i\\\\xe7\\\\x15\\\\x1d\\\\x85\\\\x850\\\\xd2\\\\x88&@;u\\\\xe4i\\\\xc6\\\\xcf\\\\xeb\\\\x07]{\\\\xb5\\\\x08\\\\x8f#^\\\\xa4x<\\\\xd9r6\\\\xa5\\\\x05\\\\x1d\\\"\\\\x04\\\\xeeu:R\\\\xf3\\\\x1d|Q\\\\xa4j\\\\x7f>\\\\xcairA\\\\x9dDI<\\\\xbd\\\\xb4\\\\xa3(\\\\x037\\\\xb8\\\\x01\\\\xcb\\\\xed\\\\xab\\\\xd9#\\\\xa7\\\\xc2\\\\xcb\\\\x0e\\\\x95\\\\x01\\\\xde)c\\\\xcce1\\\\xaf\\\\xc6\\\\x94\\\\xd9\\\\xefT\\\\xa0\\\\x95\\\\r\\\\x8a\\\\xb5TN\\\\x93\\\\xef\\\\xa2x\\\\xc5\\\\x8d\\\\x91\\\\x03\\\\xe9<\\\\x15\\\\xcc\\\\x1f\\\\x12b\\\\x056\\\\x14u\\\\xccc^\\\\x9f\\\\x9et=\\\\x08\\\\x89\\\\x89\\\\xa8\\\\xfa\\\\x9a\\\\xe6~rI\\\\xf6\\\\xcf*v\\\\xc5g\\\\xd4-\\\\xcc\\\\x04\\\\x94\\\\xa1\\\\x030\\\\xe7\\\\xb8\\\\xde\\\\xa3b\\\\x84\\\\xfa\\\\x92\\\\xa0\\\\x0f\\\\x9c\\\\x9fv\\\\xbbO*r\\\\xc1C\\\\xd4Y\\\\t3\\\\tH\\\\x1b\\\\xed\\\\xec\\\\xf8S\\\\x06L\\\\xceB\\\\x0e~cJ\\\\x95\\\\x87\\\\xda\\\\xaf\\\\x11\\\\xbfb\\\\xcd\\\\xa5\\\\xa1\\\\nyJJT\\\\xe1\\\\x84\\\\xc8IV\\\\xe7\\\\xaeX\\\\xf7\\\\xd44\\\\x82\\\\x02\\\\x8cB6\\\\x90\\\\x9d\\\\xaaf\\\\x12R\\\\xacR\\\\xd88\\\\x14P\\\\n\\\\xe4\\\\x01\\\\xaf\\\\xccV\\\\xd4\\\\x01\\\\x11/w\\\\x8d\\\\xa1G\\\\xc4\\\\x16\\\\x8c\\\\xdb\\\\xfb\\\\xfd\\\\xdb\\\\xd1\\\\xba\\\\x14\\\\x957 \\\\xc2\\\\xd3\\\\x98y\\\\x83M2T\\\\xa6\\\\xda\\\\x9d\\\\x8aA\\\\x90$l(\\\\x13&v\\\\xd3~\\\\x9f\\\\x0f}\\\\x00\\\\xc5\\\\x92\\\\nAQ\\\\x00\\\\x98\\\\xd3\\\\x9d\\\\x1d\\\\xf2\\\\x8e{\\\\xb3\\\\xa2HR\\\\xe7]\\\\xb9\\\\xd2s\\\\x99\\\\x04\\\\r\\\\xc8\\\\x80dQ\\\\xe2\\\\x0b=\\\\xe5\\\\xd9I;\\\\xae\\\\x00\\\\x11\\\\xcc\\\\xe9Mr#g\\\\xfa) 9\\\\xe9\\\\x11\\\\xd9\\\\xf8\\\\x81\\\\xa5\\\\xc5\\\\xe2\\\\xb5\\\\x8d\\\"\\\\xc6\\\\xe2+\\\\xd5a\\\\xb0\\\\xaf,=\\\\x13\\\\x13>\\\\x91\\\\xbc\\\\x02 \\\\x8c\\\\xaa\\\\xc4\\\\x0f\\\\xb2,n4\\\\xfa\\\\xeb\\\\xd4\\\\xf4\\\\xfc\\\\xd1\\\\xec\\\\xa7/\\\\x02\\\\x89\\\\x86\\\\xf1\\\\xa1\\\\xfdr\\\\xce92\\\\xb3\\\\x13\\\\xfcI\\\\xad]\\\\xc46\\\\x8eZv_\\\\xda\\\\r\\\\xc2\\\\xdd\\\\x91\\\\xfc\\\\x9f\\\\xbeFPO\\\\x88\\\\x96\\\\xcf\\\\x88\\\\xf9\\\\xfb+g\\\\xf1\\\\x99\\\\x1f\\\\xa4-\\\\x81\\\\x9d\\\\x18Q\\\\xff\\\\x00xV&0\\\\xdbL\\\\x7f\\\\x87\\\\xb1l\\\\x17\\\\x13K\\\\xaa\\\\xb0\\\\xc4\\\\xd8r\\\\xda\\\\xe42\\\\xe1m}\\\\xda\\\\xc4+*\\\\x86\\\\xc7\\\\xce\\\\x9c]\\\\x14p\\\\xce\\\\x19\\\\x8a?\\\\x864\\\\x05\\\\xa8n\\\\tJ\\\\xbcy\\\\xa4\\\\x10\\\\x00\\\\xe4G/mX\\\\xa3\\\\x89\\\\xaf|%IiYS\\\\t%n\\\\xe8\\\\x9e\\\\x9f>\\\\xbay\\\\x1e\\\\x8d}\\\\x9e\\\\x00\\\\x02X\\\\xc7\\\\x93\\\\xa4\\\\x7f\\\\xef\\\\xa5\\\\xe9\\\\xfe\\\\xed<\\\\x9fF\\\\xae\\\\xcfA\\\\xd1\\\\xbcx\\\\x7f\\\\xfb\\\\xca\\\\xff\\\\x00\\\\xfak\\\\xb9e\\\\x81\\\\x939\\\\x91\\\\\\\\Aqsj\\\\xed\\\\xb5\\\\xdd\\\\xb5\\\\x9d\\\\xc3\\\\x0e\\\\x1dR\\\\xea\\\\\\\\!=#\\\\xc7\\\\xa4\\\\x1dF\\\\xff\\\\x00\\\\r*\\\\xc3\\\\x80\\\\x1a\\\\xcd\\\\xc7|&\\\\x80\\\\x00\\\\x1f\\\\xa6-\\\\xa0{\\\\x15<\\\\xbd\\\\x95\\\\xd2\\\\t\\\\xf4m\\\\xe0\\\\x004N<:\\\\x7f</\\\\xff\\\\x00\\\\xa6\\\\xa5a}\\\\x85p_\\\\x0f\\\\xe2\\\\xd6\\\\x18\\\\xae\\\\x1c1\\\\x81y`\\\\xfa_c\\\\xbe\\\\xc4\\\\xcb\\\\x88\\\\xce\\\\x99\\\\x8c\\\\xc9)\\\\xd4k\\\\xb5?{\\\\x1a\\\\xd0;\\\\xa34\\\\xc1\\\\xf0\\\\x8cC\\\\xf9Gw\\\\x8a\\\\xdd\\\\xe2Jv\\\\xd5Am\\\\xb1n\\\\x92\\\\xa4\\\\x80\\\\x95\\\\x10ai\\\\x9c\\\\xa4\\\\x824P\\\\xd6\\\\x9c\\\\xbd\\\\xc5V\\\\xdd\\\\xe5\\\\xc2?D^;\\\\x95\\\\xd5\\\\x0c\\\\xe9BaZ\\\\xee*\\\\xef\\\\x0f\\\\x03\\\\xb8\\\\'\\\\xa95\\\\x94\\\\xa1\\\\xb1\\\\x91:\\\\x13\\\\xa0\\\\xd8\\\\xd7\\\\x06O\\\\x88\\\\xd2.\\\\xb99\\\\xb5\\\\xbb\\\\x92@\\\\xf0\\\\x92\\\\xa8\\\\'\\\\xe7T\\\\x96\\\\x9cR\\\\x88!1\\\\'A\\\\xbcUZs\\\\xda\\\\\\\\=n\\\\xff\\\\x00\\\\xcfe\\\\xc2\\\\x92\\\\x0729\\\\xfc \\\\xd5\\\\x83K.\\\\x90U\\\\xae\\\\x9c\\\\xf5\\\\x8f}|\\\\xf2>\\\\x8d\\\\x92\\\\xd0\\\\xaeg_g:}$\\\\xf3\\\\xdc\\\\xf5\\\\x1a\\\\xd3\\\\r\\\\x01\\\\xa1&\\\\x0f\\\\xb2)\\\\xf1\\\\x00}gM*\\\\xd21l\\\\x1a\\\\xc9\\\\xd4\\\\xe9\\\\x14\\\\xb4\\\\xa4\\\\x98\\\\x92O\\\\xe1\\\\xce\\\\x90\\\\x93;i;\\\\x0e\\\\xb4\\\\xf0\\\\x07\\\\xf0\\\\xab\\\\xa3&\\\\xc7[N\\\\xc7\\\\xf3\\\\xb5E\\\\xe2v\\\\x83\\\\xdc\\\\x1f\\\\xc5\\\\x0c\\\\xfc\\\\xee\\\\xf3\\\\x03\\\\xbfLN\\\\xff\\\\x00\\\\xab\\\\xb9R\\\\x90\\\\x9dD\\\\x1d\\\\xcfJ]\\\\xe3=\\\\xfe\\\\x13\\\\x8a5?\\\\xb5\\\\xc3\\\\xee\\\\x91\\\\xaf)eb\\\\xa9\\\"\\\\x1b\\\\xd1\\\\xe65\\\\x82\\\\x8a\\\\xec-U\\\\x05D\\\\xb4\\\\x83\\\\xd3p*Cf.S\\\\xcb\\\\xc2fI\\\\xde\\\\rA\\\\xc2\\\\x95\\\\x9b\\\\x0b\\\\xb3\\\\xd4He>\\\\xed\\\\x05MiQx\\\\xd0W\\\\xd2\\\\x9f\\\\xccW\\\\xa7\\\\x15\\\\xa3\\\\xce{cd\\\\xe9 \\\\x10\\\\x0e\\\\xe3\\\\x90\\\\xd2\\\\x94s(\\\\x00\\\\xa0e\\\":\\\\xfdt\\\\xcf\\\\xcdL*b5\\\\xa3Q\\\\x032I\\\\x13\\\\xa9$\\\\xf2\\\\xfc\\\\xc5Q\\\\x03\\\\xa7:\\\\x92\\\\x94\\\\x92\\\\x14\\\\x94\\\\xc9\\\\t\\\\xe8N\\\\xff\\\\x00e\\\\x00\\\\x0e\\\\x9bo\\\\xa4\\\\x93\\\\xf5Qx\\\\x82\\\\x01\\\\x01P\\\\xad\\\\x01\\\\x03n\\\\x7fe\\\\x16y\\\\xd8\\\\x11\\\\x06|\\\\xe6\\\\x862\\\\x1e)\\\\t\\\\xb3Y\\\\'YA>(\\\\x9di\\\\xdc<\\\\xc5\\\\x9bYw\\\\x010N\\\\x9di\\\\x8cU\\\\x7f\\\\xa8:L\\\\x10JA\\\\x1a\\\\xe8$S\\\\xb8i\\\\xcdd\\\\xd1\\\\x1f\\\\xba\\\\x93\\\\n\\\\xdco\\\\xf8Sz\\\\x17$\\\\xd0\\\\xa2\\\\x1b\\\\xca\\\\xad\\\\xc9\\\\x99\\\\xcd\\\\xf1\\\\xf2\\\\xa0\\\\xdb\\\\x8e2\\\\xe2V\\\\x93\\\\x95i\\\\x98P<\\\\xc8\\\\x8d\\\\xbc\\\\xe6\\\\x92\\\\xa9\\\\x1a\\\\x98\\\\x89\\\\xdc+JFl\\\\xea\\\\tH$\\\\x99H\\\\x11\\\\xa9\\\\xa1\\\\x00y#(\\\\x8d\\\\x00\\\\xd8\\\\xd2\\\\x14\\\\x90T\\\\x9c\\\\xe9\\\\x12\\\\xa1\\\\x11?\\\\x99\\\\xa5)\\\\xc9N\\\\xe4$s\\\\x891HZ\\\\xa4\\\\x83\\\\x12w\\\\xd3\\\\xa5\\\\x1c\\\\x83\\\\x1c\\\\x10T\\\\xdaL\\\\x19\\\"gm\\\\xc6\\\\xbb\\\\xd1_\\\\x1f\\\\x94\\\\xbb\\\\xd4\\\\xfc\\\\xe5k3\\\\x02M (\\\\x95%I\\\\x89\\\\n\\\\x90yo\\\\xec\\\\xa2\\\\xb9Z\\\\x88}BJ\\\\x95\\\\xa9\\\\x8f3\\\\xe5M\\\\t\\\\xb3o\\\\xfa\\\"\\\\xa6}#x\\\\x16\\\\x01\\\\x19[\\\\xc47\\\\xd7\\\\xff\\\\x00\\\\x83to\\\\xef\\\\xafS\\\\xd3\\\\xb0\\\\xf6W\\\\x96\\\\x9e\\\\x87\\\\xa8+\\\\xf4\\\\x8c\\\\xe0\\\\xe3\\\\xbeKlD\\\\x99;~\\\\xac\\\\xa1\\\\xf7\\\\xd7\\\\xa9caU?\\\\x04G\\\\xc9\\\\x84q\\\\xa2\\\\xe3\\\\x12`t\\\\xb6?\\\\xf1\\\\x7f\\\\x85b\\\\xb8\\\\x0bn-\\\\xa5\\\\xa93\\\\xfbCY7\\\\x1a\\\\x93\\\\xfaQ\\\\xb8\\\\x8f\\\\xe8\\\\xa3\\\\xfe%U\\\\x7f\\\\r\\\\xb5\\\\x16S\\\\x1fL\\\\xd0\\\\x9d#BSm8\\\\x00\\\\xd4\\\\xe9N\\\\x86\\\\xdc\\\\xe4jz[\\\\x1eT\\\\xe8lUY$\\\\x04\\\\xa1\\\\xc8\\\\xdc\\\\xd3/\\\\xa1y\\\\x08\\\\'z\\\\xb8\\\\xee\\\\xc4T[\\\\xb4\\\\x80\\\\xd9\\\\xa6\\\\x98\\\\x07\\\\x87\\\\xa7\\\\xf5P<\\\\xeb.\\\\x02\\\\x00\\\\x15\\\\x8bX\\\\t\\\\xb7lu#\\\\xed\\\\xac\\\\xaa\\\\xb3\\\\x9b\\\\x04s\\\\r\\\\xcd\\\\xa3\\\\xa8[\\\"\\\\xf3\\\\xfak\\\\x03\\\\xd5\\\\xae\\\\x93:\\\\xe7l\\\\x00\\\\x15\\\\xefLO\\\\xb2\\\\xa4[\\\\xa4\\\\x822\\\\xc4\\\\x8eCAR\\\\xad\\\\xd6\\\\xe6/l\\\\xdd\\\\xd3\\\\x8d:\\\\xd5\\\\xf3\\\\xb6\\\\x89\\\\x17hu\\\\xbc\\\\x84<\\\\xd0\\\\x80\\\\xbdu\\\\xf1 \\\\rz\\\\xd3-\\\\x0f\\\\x08\\\\x12\\\\x00\\\"\\\\xbc\\\\x0c\\\\x1f\\\\x165~\\\\x0f\\\\xa1\\\\xc9$\\\\xdfr\\\\xe1\\\\xec\\\\x96\\\\x802\\\\xef4\\\\xf0\\\\x1f\\\\x91L\\\\xa1\\\\\\\\\\\\xb6;\\\\xd3\\\\xc8XW\\\\xe1]\\\\x14s\\\\xb6-\\\\x03\\\\x9f\\\\x9fJy \\\\x8d\\\\xf7$\\\\x98\\\\x1d)\\\\x94\\\\x1dA<\\\\xa9\\\\xe1\\\\x11\\\\xae\\\\x9a\\\\xd0K\\\\x1d\\\\x10\\\\'4\\\\xf55)\\\\x91\\\\xdew\\\\x8d\\\\xc7\\\\xcfi\\\\xd4\\\\xc0\\\\xf3B\\\\x84}u\\\\r\\\\x1f8u\\\\x9djv\\\\x1b\\\\xe2\\\\xbd\\\\xb7\\\\x02<J\\\\x03\\\\xe3\\\\xa536yc\\\\x84 \\\\x0b\\\\x16\\\\x12@\\\\xd1\\\\xa0N\\\\x9b\\\\xc6\\\\x95`\\\\xca\\\\x93\\\\xeb\\\\x8cx\\\\xa0\\\\x05\\\\xc9\\\\xe5\\\\xf9\\\\xde\\\\xa3Z 6T\\\\x99\\\\xfd\\\\x9a\\\\xdcl\\\\x99\\\\xd6R\\\\xb5\\\\x0e\\\\x95`\\\\t\\\\t\\\\xd0\\\\x9e\\\\x91\\\\x1c\\\\xff\\\\x00<\\\\xab\\\\xd1\\\\x8e\\\\xd1\\\\xc0\\\\xf9+\\\\xc9NY\\\\x1b$k\\\\xaf\\\\xdd\\\\xd7\\\\xf0\\\\xa5\\\\xa2$\\\\xef\\\\xa0\\\\x8d9\\\\xfb\\\\xa9\\\\xd7\\\\x87\\\\xca\\\\xb8\\\\xa2\\\\t9\\\\xbc1\\\\x026\\\\xdei&J\\\\x912d{y\\\\xd5p!j \\\\xd9!\\\\x06\\\\t\\\\x0f(\\\\xcf_\\\\x08\\\\xe5\\\\xd7JDB\\\\x02\\\\x8e\\\\xa0\\\\x98\\\\x8d\\\\xbf\\\\xe46\\\\xa5\\\\x15\\\\x95[\\\\x86\\\\xc4Fb\\\\xbc\\\\xc4\\\\xf9\\\\x01\\\\x1e\\\\xca\\\\x102\\\\x00\\\\x08\\\\x04\\\\x19\\\\xd0jf\\\\x86\\\\x08\\\\xac\\\\xc5r\\\\x9c=\\\\xc1\\\\x94\\\\'T\\\\xeb\\\\x9b\\\\x7f\\\\x10\\\\xd6\\\\x9e\\\\xc3t\\\\xb1j7\\\\t\\\\x03m\\\\xa2i\\\\xbcX\\\\x84\\\\xd8<t\\\\x1b}\\\\xb4xh\\\\xfeof\\\\x04\\\\x1c\\\\xa24\\\\x9e\\\\xb4\\\\xd8pMX\\\\x92@ \\\\x8f#\\\\xf9\\\\xfc\\\\xcd;\\\\x86\\\\xab&%d\\\\xa3\\\\x00\\\\x07\\\\xd2v\\\\x1di\\\\xac\\\\xda\\\\x92T\\\"u\\\\xd67\\\\xa5[8\\\\x19\\\\xb8a\\\\xc5#8B\\\\x82\\\\x8aN\\\\x84\\\\xc7/*\\\\x16\\\\x85C\\\\t\\\\x11\\\\x94\\\\xe91 \\\\xc6\\\\x94\\\\xda\\\\xe0\\\\xea \\\\xa8S\\\\x91\\\\x1b\\\\x91\\\\xb4I\\\\xe9HY\\\\x88J\\\\x84\\\\'`\\\\x0f\\\\xe7\\\\xdfG\\\\xd0\\\\x1a\\\\x0ey\\\\xe8Na\\\\xbf\\\\x9d&\\\\xe4|\\\\x8b\\\\xc7( \\\\x03 \\\\'`\\\\x0f\\\\xe7\\\\xd9K@\\\\xcc\\\\xa4\\\\x85\\\\x93\\\\xa4hD\\\\xfe~5f\\\\xd5\\\\xab78\\\\x06$\\\\xe9qi\\\\xb8ey\\\\x91\\\\xdd\\\\xb9\\\\x94\\\\xe4\\\\xcc\\\\x01\\\\x91\\\\x1a\\\\x89:\\\\xfbh\\\\x03d\\\\xfa!\\\\xbe\\\\x19\\\\xf4\\\\x8a\\\\xe0u}\\\\x155~\\\\xd9<\\\\xa0\\\\xdb8\\\\x07\\\\xd6\\\\x05z\\\\xa2\\\\x0e\\\\x83H$W\\\\x93^\\\\x8b\\\\xce)\\\\xbe\\\\xdb\\\\xb8i\\\\xe6\\\\xc8+f\\\\xca\\\\xf9\\\\xd4\\\\x99\\\\xf9\\\\xa40\\\\xa2>\\\\xea\\\\xf5n\\\\xde\\\\xe0]0\\\\xdb\\\\xc8##\\\\xa8J\\\\xc0\\\\x1d\\\\x08\\\\x9a\\\\xa7\\\\xb2\\\\x16\\\\x9b0\\\\x9e5_\\\\xf3\\\\xc8\\\\x10|6\\\\x89\\\\xff\\\\x00\\\\x89t\\\\xd7\\\\x0fif?\\\\xb4y\\\\xd0\\\\xe3\\\\x05g\\\\xc6\\\\x9e\\\\x91\\\\xf3m\\\\x9b\\\\x1f\\\\xf1\\\\x1f\\\\xbe\\\\x97\\\\x80\\\\x08\\\\xb2o\\\\xdfG\\\\x82\\\\xcb\\\\x94\\\\x9d)\\\\xc4\\\\x9du\\\\xa6\\\\xd3N\\\\nd\\\\x8b\\\\x9d*\\\\x1d\\\\xe1\\\\xf92*a\\\\xda\\\\xa0\\\\xde\\\\x1f\\\\x05Z\\\\xe4\\\\txx\\\\x94\\\\xdb\\\\xa7\\\\xaa\\\\x93\\\\xf6\\\\xd6O\\\\xadcXv\\\\xf6\\\\xdf\\\\xdaMd\\\\xb5\\\\x9c\\\\x86\\\\x8eP\\\\xe1^\\\\xc9\\\\xac\\\\xbb7\\\\xb2\\\\xb4\\\\xbf\\\\xb6\\\\xc6/\\\\xf1\\\\xdcS\\\\x89-}^\\\\xe2\\\\xe6\\\\xfe\\\\xef\\\\xbd)m>4\\\\xf7Dh5\\\\xd1@\\\\xeb\\\\xec\\\\xda\\\\xaf\\\\x1a3\\\\x1c\\\\x88\\\\xde\\\\xb0;\\\\x1e8\\\\xe2;\\\\xfcQ\\\\xab\\\\x9e\\\\x15\\\\xec|\\\\xe0\\\\xf6\\\\xef\\\\xad+w\\\\x12\\\\xe2\\\\\\\\Q\\\\x0c;\\\\x94\\\\x91\\\\x98\\\\x8btJ\\\\xb3\\\\xc7S\\\\xbcL\\\\xd6z\\\\xe3\\\\x9d\\\\xed\\\\xcb\\\\xae\\\\xe83\\\\xac\\\\xabD\\\\xc6\\\\x84\\\\xf4\\\\xe5^c\\\\x8d\\\\x1e\\\\xbav\\\\x87\\\\xd2|10A\\\\xde\\\\x9eB\\\\x87O\\\\x16\\\\x95\\\\x1d\\\\x00\\\\x90\\\\x0c\\\\xeav\\\\xa7\\\\xd0\\\\x9f\\\\x7f=\\\\xb9\\\\xd2%\\\\xb1\\\\xe4m\\\\xe7O\\\\x81\\\\xf8\\\\xd3hH\\\\xe7\\\\xb8\\\\x15 G=)\\\\x084\\\\xa4\\\\x83Sp\\\\xdd1\\\\x1bA\\\\xfey\\\\x1c\\\\xfc\\\\xea0\\\\x12@N\\\\xa7\\\\xca\\\\xb0\\\\xbc\\\\x7f\\\\xb5\\\\xbe\\\\x19\\\\xe1\\\\xbc\\\"\\\\xeb\\\\x14\\\\xc31\\\\xac3\\\\x19\\\\xc4m\\\\xa16\\\\xd6V\\\\x97Iq\\\\xc7\\\\x1e&\\\\x12\\\\x08\\\\x1a\\\\x84\\\\x83\\\\xaa\\\\x8f \\\\r\\\\x00\\\\x93|#\\\\xcf\\\\xcb\\\\xc6\\\\xc3\\\\x18\\\\xce&\\\\xd2$d\\\\xbd\\\\xbaN\\\\xa7hyc\\\\xee\\\\xa0\\\\xda\\\\xc1\\\\xb8\\\\xb7)\\\\xd0\\\\x15\\\\'\\\\xdf\\\\xaf:\\\\x89t\\\\xfb\\\\xcb\\\\xc6/\\\\xd7z\\\\x92.\\\\x1d\\\\xba\\\\xb8q\\\\xef\\\\x00@\\\\xceV\\\\xa5*\\\\x07!&G\\\\x91\\\\xa7\\\\x03\\\\x92\\\\xeb*\\\\xfd\\\\xd25\\\\xe7\\\\xb8\\\\x8a\\\\xf4#Ty\\\\xd2[\\\\x1c(qe\\\\xe5#\\\\xc4\\\\x1b\\\\nR\\\\x8c\\\\xc4&b\\\\x92\\\\xe2\\\\xf2\\\\xcc \\\\xfbf#\\\\xef\\\\xe7\\\\xca\\\\x9bu\\\\xe2\\\\x97\\\\\\\\\\\\x85\\\\x18VpD\\\\xe8D\\\\xedI\\\\xcefT3\\\\x1d$y\\\\xfeMP\\\\x87\\\\xb3\\\\xc4) $\\\\xf5<\\\\xbf?}\\\\x1fz\\\\x07]\\\\x0c\\\\xc1\\\\xe6)\\\\x80r\\\\xccH\\\\xe7\\\\x1b\\\\x83\\\\xe5\\\\xf7\\\\xd2\\\\xc0\\\\'\\\\xe6\\\\x84\\\\x9d9\\\\x1f\\\\xbe\\\\x98\\\".,\\\\xe2}I\\\\xcdH\\\\xd1$\\\\x81\\\\xa7?\\\\xb0\\\\xd1\\\\xe1\\\\xceN\\\\x1a\\\\xc9\\\\xcc\\\\xaf\\\\x987\\\\xe7\\\\xa9\\\\xa6\\\\xb1P}A\\\\xe0r\\\\xe5\\\\x00\\\\x0f-\\\\xfa\\\\xd2\\\\xb0\\\\xe3\\\\x9a\\\\xc2\\\\xdclJ\\\\x01\\\\x8c\\\\xdf\\\\xc4h{\\\\x0eI\\\\xdd\\\\xf0\\\\x00\\\\x83)<\\\\xcco@\\\\xba\\\\x01\\\\x02U32t\\\\xa6\\\\x82\\\\x9c)\\\\x19\\\\x08O3\\\\n\\\\x89\\\\xf7\\\\xd1)G.\\\\xe0\\\\xce\\\\xbf8@\\\\xf8\\\\xd2\\\\\\\\\\\\x00\\\\xea\\\\x96$s1\\\\xb4k\\\\xfe\\\\x1f\\\\xf3\\\\xa6\\\\x96\\\\xa1 H\\\\x13\\\\xb0=}\\\\xb4\\\\xea\\\\xed\\\\xae\\\\x10\\\\xd3\\\\x17\\\\x0e\\\\xb2R\\\\xd3\\\\xd9\\\\xbb\\\\xb5\\\\x98\\\\x85\\\\x11\\\\xa1\\\\x8dy\\\\x1a`\\\\xe6\\\\n\\\\x03T\\\\x88\\\\x8c\\\\xc0\\\\r>\\\\xbd\\\\xa9]!\\\\xf2\\\\x1e`\\\\xa5@9D\\\\xc6\\\\xe7Mb~4\\\\xab\\\\xc2\\\\xeb6\\\\xebm\\\\xe5\\\\x98$*\\\\n\\\\x8eY\\\\x9e\\\\x9f\\\\n@R\\\\xb3\\\\xa4\\\\x00\\\\xac\\\\xd3\\\\xa1\\\\x06u\\\\x9eT\\\\xc5\\\\xd9\\\\x9bw\\\\x02\\\\xc9\\\\xcd\\\\xa0\\\\x8c\\\\xda\\\\x81<\\\\xbe\\\\xbf\\\\x8dW\\\"6\\\\x97\\\\xa3\\\\x02\\\\xb2\\\\xf6\\\\xc9\\\\x82/S\\\\x97\\\\x0b\\\\xbf\\\\x89\\\\xff\\\\x00BG\\\\xdf^\\\\x93p\\\\x8e<\\\\x87\\\\xb0;&\\\\x14\\\\xb54\\\\xf3M)\\\\xa0\\\\xe1#(!P4>Dm\\\\xf7W\\\\x9a~\\\\x8d\\\\x8a\\\\x8e\\\\xd6\\\\xb0\\\\xe5\\\\xa4\\\\x90Q\\\\x84^*fwl\\\\x0f\\\\xbe\\\\xbb\\\\xbb\\\\x86/\\\\xd4\\\\xb6/\\\\x19\\\\x95JT\\\\xdb\\\\x81IIQL\\\\x9c\\\\xb9\\\\xa0\\\\x1d\\\\xb4\\\\x13\\\\xbd)I\\\\xa5fu\\\\xf1\\\\x99\\\\xa7\\\\x13\\\\xbc\\\\x1e\\\\xc5\\\\xee\\\\x16\\\\x0c\\\\x8e\\\\xe5\\\\xb04\\\\xe5\\\\x94\\\\xef\\\\xf1\\\\xa9x&\\\\x96M\\\\xebX\\\\xc5\\\\xd3\\\\xe4)y\\\\x96\\\\x1c\\\\xf0\\\\xa4fI\\\\xd3n^U\\\\x91`\\\\xaeE\\\\x93[\\\\xedV\\\\x9d\\\\xab,\\\\xbc\\\\x07Jp+\\\\x9dDK\\\\x9a\\\\np9L\\\\x92A0*\\\\x05\\\\xea\\\\xbc5%NiU\\\\xf7\\\\x8b1\\\\xa6\\\\xba\\\\xd5 .0\\\\xff\\\\x00\\\\x12\\\\xed\\\\xc6\\\\xbb\\\\x8d\\\\x8e\\\\xb5\\\\x91H\\\\xea\\\\x7f\\\\xbdX\\\\xe6\\\\x18I}\\\\x80\\\\x9d\\\\xe0\\\\xc781Wa\\\\xc4\\\\x00\\\\x02\\\\xdb\\\\xf1s\\\\xca\\\\xd9\\\\x89\\\\xf2\\\\xd2\\\\xa5\\\\xab\\\\x0b9\\\\xa1)\\\\x98\\\\'S;\\\\xd4\\\\xe6\\\\x81\\\\x81:\\\\x0fn\\\\xf5\\\\r\\\\xb3\\\\x99\\\\t\\\\x93\\\\xce\\\\xa5\\\\xb6\\\\xb3\\\\xa7)\\\\xe7^s=k% \\\\xe54\\\\xfa@\\\\x83Q\\\\x93\\\\xd0\\\\xf2\\\\xa7\\\\xdbpm?_*\\\\x90%$\\\\xed\\\\x14\\\\xe825\\\\x81\\\\xf7\\\\xd4\\\\x13t\\\\x84\\\\'2\\\\x88\\\\xe4j3\\\\xf8\\\\xd5\\\\xbd\\\\xb8%\\\\xc7\\\\x12\\\\x00\\\\xdc\\\\xf2\\\\x15\\\\x00a\\\\x9d\\\\xb7q\\\\xd2\\\\xb8O\\\\x86\\\\xd9\\\\xc3l\\\\x1e\\\\x16\\\\xd8\\\\x8e9\\\\xde4\\\\x87\\\\x89\\\\x8e\\\\xe9\\\\x84\\\\xc7x\\\\xa0\\\\x7fx\\\\xe6\\\\t\\\\x1d&yW7\\\\xd9\\\\xa7\\\\x87\\\\xbfG\\\\xe2#\\\\x13r\\\\xf9\\\\x17\\\\xa9m\\\\x07\\\\t\\\\xfd\\\\x1e\\\\xeb\\\\x1d\\\\xc0X\\\\xdd7\\\\x01~\\\"\\\\x93#T\\\\x19\\\\xf25\\\\x9d\\\\xfaCq5\\\\xae;}\\\\xc3V\\\\x96\\\\x0bC\\\\xcfX\\\\xb7p\\\\xeb\\\\xaa\\\\x0e\\\\x00\\\\x90\\\\x97\\\\nBu\\\\xd7YA\\\\xad4{\\\\xec\\\\xc6\\\\x1a@\\\"4\\\\x0f\\\\xa6kU\\\\xd3K\\\"R\\\\xa6o\\\\x8f\\\\xa9\\\\xc3\\\\x8e=\\\\x8d\\\\xab \\\\xe2|.\\\\x8cF\\\\xf9W\\\\x0c\\\\xa9M\\\\\\\\-_\\\\xb6i\\\\xf4J\\\\x87)\\\\x07C\\\\xce\\\\xb5\\\\xab\\\\xb8\\\\xb5\\\\xd8\\\\xc5\\\\x1d\\\\xb7\\\\xb4\\\\x7f\\\\xd6\\\\x1aB\\\\xc8J\\\\x9di\\\\x01P9\\\\xccV\\\\xd9iO\\\\xa1\\\\xc6\\\\xd6-\\\\xb3\\\\x19\\\\x1f5\\\\xe6\\\\xc9\\\\x1d>\\\\x95`\\\\xec\\\\xf0E\\\\xcf|\\\\xeb\\\\x97v(t\\\\xb8\\\\xb5\\\\x1d\\\\x1c\\\\x07BI\\\\x1b\\\\x1e\\\\x86+\\\\xa3\\\\x1e\\\\x19\\\\xc2\\\\xd3\\\\xb3\\\\x9b\\\\xab\\\\xcd\\\\x87\\\"N5\\\\x7f\\\"V\\\\x0c\\\\xd38\\\\x9d\\\\x9f{p\\\\x8f\\\\x94\\\\xef\\\\x1cA(\\\\xd34\\\\x13\\\\x06*cXU\\\\xbb\\\\xed\\\\x8c\\\\xc9q\\\\x92gE%$\\\\x8dz\\\\xd3,p\\\\x92X\\\\x1e\\\\x1b\\\\x1b\\\\xb6\\\\x89\\\\x92{\\\\xa7\\\\xd7\\\\xef\\\\xe7\\\\xce\\\\x9dW\\\\x0e-\\\"[V.\\\\xd1\\\\x1a\\\\x8c\\\\xaf(\\\\x9f\\\\xac\\\\x1a\\\\xe9\\\\\\\\U\\\\x1eS{\\\\xe4\\\\xc6\\\\xc5\\\\xea\\\\x91\\\\x89^Z\\\\xba\\\\xd3E\\\\xb6\\\\x1eSiXI\\\\x04\\\\x80t\\\\'Z\\\\x98\\\\\\\\l\\\\x03\\\\xf2i\\\\xd7h\\\\'\\\\x7f\\\\x8dIW\\\\x0b!/\\\\xadn\\\\xb5~\\\\xe2\\\\xd79\\\\x96\\\\xe1Q$\\\\x9d\\\\xce\\\\x82(\\\\x1e\\\\x1ed\\\\x11\\\\x99\\\\x9b\\\\xa043\\\\x95i\\\\xf7\\\\xd0\\\\xd0\\\\xd3\\\\x186l_Z,\\\\x12[\\\\n\\\\x94\\\\xa8\\\\x03\\\\xb0\\\\x00k\\\\xa9\\\\xa0\\\\xd5\\\\xa36\\\\x8d\\\"\\\\xdd\\\\xb2\\\\xa2\\\\x9d\\\\x81\\\\xd2LN\\\\xa6\\\\r(\\\\xe0v\\\\xe9)*K\\\\xfa\\\\x0eez\\\\x1fm7\\\\xfa\\\\x16\\\\xd9#)[\\\\xe3Q\\\\xba\\\\xd5\\\\xad:TM\\\\xec\\\\x97\\\\xea\\\\xec\\\\x95\\\\x80\\\\x97\\\\x14\\\\x16O&\\\\xd4`\\\\xeb\\\\xca\\\\xb6\\\\x8f\\\\x0cz?\\\\xe3\\\\\\\\_\\\\xc2\\\\xd8G\\\\x11a\\\\x1cC\\\\x81\\\\xa2\\\\xd7\\\\x15iN%\\\\x87C\\\\xc5\\\\xc6\\\\x8a\\\\x16\\\\xa4)+)I\\\\x19\\\\x81L\\\\xe5\\\\xde\\\\x08\\\\xebZ\\\\x80\\\\xe1\\\\x16\\\\xe4\\\\x13\\\\xeb.\\\\x8e[\\\\xeb\\\\xed\\\\xa3\\\\x1c3d\\\\xf9\\\\xce\\\\xbb\\\\x82U\\\\x9bR@\\\\xe9\\\\xf8}\\\\x94$\\\\xbc\\\\x85\\\\xbfS/\\\\xe3\\\\xde\\\\xceq\\\\x1e\\\\xcf\\\\xb8\\\\x83\\\\xf4/\\\\x10\\\\\\\\\\\\xda\\\\xdc]\\\\x1b\\\\x16/\\\\x12\\\\xed\\\\xab\\\\xcbZ\\\\x14\\\\xd3\\\\xb3\\\\x94B\\\\x90\\\\x14\\\\x14\\\\nT\\\\nH\\\\xac=\\\\xc6\\\\x98KhW{\\\\x97\\\\xc5\\\\x193J\\\\xb4\\\\xdc\\\\xed\\\\xca\\\\x83\\\\x98#V\\\\xe0\\\\xa5\\\\xab\\\\xa5\\\\x80\\\\x12GX\\\\xa6\\\\xbfE\\\\x80\\\\xa0E\\\\xca\\\\xce\\\\x9aL\\\\x125\\\\xdf\\\\xf3\\\\xd6\\\\x8aC\\\\xbd\\\\x04\\\\xb7\\\\x19i\\\\x0b\\\\xce\\\\xa5\\\\x13\\\\x06R\\\\x95D\\\\xc0\\\\x9e\\\\x9b\\\\xd3W\\\\x01\\\\xb2\\\\xc2\\\\x90\\\\x97\\\\nLIQ#m\\\\xfe\\\\xc3O\\\\xfa\\\\x93\\\\xc2\\\\xd6\\\\xe6\\\\xdd\\\\xab\\\\xe7\\\\x1bj\\\\xe5(C\\\\xe9\\\\x00\\\\x10\\\\xa4\\\\xa5ABG8 \\\\x19\\\\xa3\\\\xb7\\\\xc0\\\\x83\\\\xe5\\\\x0c\\\\xaa\\\\xe1E*NUD\\\\r<\\\\x8d*\\\\xa1\\\\xf7*:\\\\x87\\\\xb0\\\\xce\\\\x0f\\\\xc00|-\\\\x18\\\\xce\\\\x1fl\\\\xb71\\\\xa5$\\\\xb0\\\\xbb\\\\xb7\\\\\\\\%A\\\\x04\\\\tJ\\\\x13\\\\xb2A\\\\xf7\\\\xd6\\\\xf0\\\\xc2q/R\\\\xc4[(\\\\xca\\\\x14\\\\xb4\\\\xad\\\\xb4\\\\x95\\\\x80D\\\\x91;\\\\x12&H\\\\x8d\\\\xc5h\\\\xbe\\\\xca\\\\x1f\\\\xb9c\\\\n]\\\\xbd\\\\xbb\\\\xa8\\\\xc8\\\\x02L-\\\\xac\\\\xd3\\\\xa4N\\\\xe3\\\\xa5l[<i\\\\xcb,s\\\\x08\\\\xb8\\\\xbfq\\\\xa1h\\\\xdd\\\\xfd\\\\xbf\\\\xac\\\\x96\\\\xd1\\\\x94\\\\x86\\\\x94\\\\xe2R\\\\xa2\\\\t:@Q=4\\\\xa8\\\\xabM\\\\x10\\\\xb4\\\\xec\\\\xdba\\\\xcc\\\\xac\\\\x93\\\\n\\\\x00\\\\x89\\\\x19\\\\x8e\\\\xb1Yv\\\\x0c\\\\xa2,\\\\x99\\\\xfe\\\\xc8\\\\xac\\\\x7f\\\\x1b\\\\xc2\\\\x11\\\\x83\\\\xdd]\\\\xd94\\\\xe1u\\\\x16\\\\xe4\\\\x00\\\\xb5\\\\x08$\\\\x14\\\\x83\\\\xaf\\\\x9e\\\\xbe\\\\xf8\\\\xab\\\\xac(\\\\xe5\\\\xb2g_\\\\xa3T\\\\xb8F\\\\xaf\\\\x92\\\\xe9+\\\\xf7\\\\xd3\\\\xa9r\\\\xa1%\\\\xcf:p/jd\\\\x93T\\\\xad5\\\\x15_t\\\\xa9#^t\\\\xfa\\\\x97\\\\xa5@}r\\\\xb4\\\\xfbG*\\\\xb4\\\\x06E\\\\x85\\\\xa8%\\\\xf6\\\\x89PH\\\\t?eX\\\\x9b\\\\x9b\\\\x94\\\\x92\\\\x12-H\\\\x06\\\\x01\\\\xd7_\\\\xae\\\\xa9Y^A\\\\x9b(^\\\\x91\\\\xaag\\\\xea\\\\xab$b9P\\\\x90\\\\x19Z\\\\x80\\\\x1b\\\\xe6N\\\\xbf\\\\x1di\\\\x08\\\\xe7\\\\xd6V\\\\x12\\\\x88:{h\\\\xdc\\\\xbfi\\\\xb1*P\\\\x1e\\\\xfa\\\\xc3\\\\xda\\\\x7f\\\\x89q`U\\\\x84\\\\xe0\\\\xee\\\\xb4\\\\xca\\\\xb6z\\\\xf9A\\\\x84{`\\\\xf8\\\\xbe\\\\x02\\\\xacX\\\\xec\\\\xe2\\\\xfa\\\\xf8\\\\x878\\\\x8b\\\\x88\\\\xdc\\\\xc8`\\\\xf7\\\\x18kY=\\\\xdd\\\\xe2\\\\xe4\\\\xfc\\\\x00\\\\xaf2R\\\\x8c|\\\\x9e\\\\xc2\\\\x8c\\\\x99.\\\\xfb\\\\x8b\\\\xec0\\\\xf6\\\\xb3\\\\xdc\\\\xdc\\\\xb6\\\\xd0\\\\x1aj\\\\xa05\\\\x8e\\\\xb5\\\\n\\\\xd3\\\\x89q<x\\\\xe5\\\\xe1\\\\x8c\\\\x1a\\\\xff\\\\x00\\\\x13O\\\\xff\\\\x00\\\\x8a\\\\x96\\\\xb25\\\\xff\\\\x00h\\\\xa8L{\\\\xeb(\\\\xc18\\\\x1f\\\\x86\\\\xf07R\\\\xf5\\\\x8e\\\\x12\\\\xcb\\\\xb7)3\\\\xeb\\\\x17\\\\x84\\\\xdc\\\\xb9>\\\\xd5\\\\xc8\\\\x1e\\\\xe0+6C\\\\xcau )F\\\\x07._\\\\n\\\\xc5\\\\xce\\\\xf8/\\\\xb3\\\\xd4\\\\xc0,\\\\xf8\\\\x1f\\\\x89\\\\xf1@\\\\x15\\\\x8db\\\\x96x;gv\\\\xad\\\\x93\\\\xeb.\\\\x0f)\\\\xd1\\\\x03\\\\xeb\\\\xac\\\\x8b\\\\x0f\\\\xec\\\\xd7\\\\x87\\\\xad\\\\x14\\\\x97/\\\\x98\\\\xb8\\\\xc6^\\\\x1a\\\\xe7\\\\xbfx\\\\xad3\\\\xfe\\\\x8cB~\\\\xda\\\\xc8\\\\xdb#j\\\\x94\\\\x83 \\\\x13\\\\xce\\\\xb2m\\\\xb2\\\\xd2H\\\\xe5\\\\x1fJ\\\\xfbFmx\\\\xb7\\\\x84\\\\xfdN\\\\xdd\\\\x9bV\\\\x97\\\\x81\\\\xba\\\\x9c\\\\x8d6\\\\x10\\\\x9f\\\\r\\\\xc6\\\\x9a\\\\r4\\\\xcdZ\\\\x10\\\\xabC\\\\x96t\\\\xe9\\\\xf1\\\\xae\\\\x89\\\\xf4\\\\xbek.1\\\\xc0\\\\x8f\\\\xc1\\\\xf1X\\\\xdf\\\"A\\\\xe8\\\\xebG\\\\xef\\\\xde\\\\xb9\\\\xc4\\\\xaadD\\\\x82\\\"\\\\xbe\\\\x97\\\\xa3\\\\xde\\\\x08\\\\xfe\\\\xfc\\\\xb3\\\\xe6z\\\\xb5\\\\xfc\\\\xf9~\\\\xfc\\\\x0f\\\\x03:\\\\x05k;\\\\xd2\\\\x81\\\\x1a\\\\x1eQ\\\\xb4o\\\\xf8SAJ=\\\\x08\\\\x1c\\\\xa2@\\\\xa5 \\\\xa4\\\\x8d \\\\xe9\\\\xa9\\\\xdc\\\\xed]G0\\\\xe9!Di;\\\\x91\\\\xce\\\\x7f\\\\x1a\\\\\\\\\\\\x82\\\\x9dI\\\\xd7\\\\xddMI\\\"~i;\\\\x7f\\\\x87Jp\\\\x12z\\\\xc0\\\\xd8PW\\\\x91aJ\\\\x06\\\\x01T\\\\xce\\\\xa3\\\\x95\\\\x17x\\\\xa10\\\\xb5\\\\xf5\\\\xf9\\\\xc4~w\\\\xa2\\\\x1a\\\\x89\\\\x1e\\\"z\\\\xd2H\\\\x12\\\\x01\\\\x00\\\\xc1\\\\'}\\\\xa8\\\\x1a\\\\x1cS\\\\xab\\\\x92\\\\x02\\\\xd5\\\\xed\\\\xcd\\\\xb8\\\\xa4\\\\x97\\\\x8ad\\\\xe7_\\\\xce\\\\xdew\\\\xf3\\\\xa6\\\\xd4u\\\\x04i\\\\xa5\\\\x11W\\\\xd2\\\\xd5$\\\\x18\\\\'\\\\xcf\\\\xad!\\\\x0ew\\\\x8a;\\\\x92\\\\xaeq\\\\xa1\\\\xa6\\\\xcb\\\\x86B\\\\xb4\\\\x1c\\\\xfeh\\\\xfb(\\\\x8c\\\\x11\\\\x1a\\\\xed\\\\xf0\\\\xa6\\\\xc9\\\\xe66\\\\xa2\\\\x91[\\\\x02\\\\xc2U9\\\\x90\\\\x83\\\\x03|\\\\xa3N\\\\xbc\\\\xa9\\\\x0e%9H\\\\xee\\\\xdb)\\\\xe6\\\\x0b`\\\\xeb\\\\xf0\\\\xa5\\\\xa8\\\\t)\\\\x02D\\\\xfci\\\\xa2\\\\x04\\\\x93\\\\xf7O\\\\xd5SH\\\\xa7lB\\\\xdbd\\\\x85fe\\\\xa5\\\\x0e\\\\x7f&\\\\x9f\\\\xc2\\\\x91\\\\x0c\\\\xb23%\\\\x96\\\\x9b\\\\tI$\\\\xe4\\\\x10\\\\x07Zt\\\\xab\\\\xa8\\\\x83\\\\xed\\\\xa6\\\\xc6P\\\\xe2\\\\x16\\\\xe3L\\\\xdc\\\\xa1+J\\\\x94\\\\xd3\\\\xc9\\\\x94,L\\\\x94\\\\xabQ\\\\x124\\\\xfa\\\\xf9P\\\\xd2\\\\xad Od\\\\xdc;\\\\x8c\\\\xf1l%\\\\xa6\\\\x15\\\\x84c\\\\x0f\\\\xd95s\\\\x98[\\\\x94\\\\xa4%\\\\x0e\\\\x94\\\\xc6`\\\\x92\\\\xa1\\\\n#0\\\\xd0u\\\\x14\\\\xbc[\\\\xb4N+s\\\\x0b\\\\xbbK\\\\xb8\\\\xed\\\\xc2\\\\xc7t\\\\xbd\\\\x14\\\\xd3z\\\\x18\\\\xfe\\\\xcf\\\\x9d+\\\\x1e\\\\xe2\\\\xbcC\\\\x1d\\\\xcc\\\\xcb\\\\xed[7b%,[\\\\xb6%\\\\xb6\\\\x04Fd\\\\xa6\\\\x00\\\\xceF\\\\xea\\\\x10$\\\\x98\\\\x00V3v\\\\x80\\\\xeb*l\\\\x82K\\\\xabBc\\\\xda\\\\xb0\\\"9\\\\x9dk<I\\\\xcbs\\\\x8d\\\\x15\\\\x91\\\\xa8\\\\xbf\\\\x86Vzg\\\\xc6\\\\xae\\\\x11\\\\x8b^2n!\\\\xd0\\\\xe3\\\\tuB\\\\n\\\\x80\\\\xee\\\\x9b\\\\xccb\\\\x9c\\\\xc3n\\\\xdb\\\\x16\\\\xe9B\\\\x9cJ\\\\x8aI\\\\x01IX2\\\\x99\\\\xd0\\\\xfbcz\\\\x87\\\\xe9d\\\\xfa\\\\xb0\\\\x9e\\\\xc0\\\\xf8\\\\xef\\\\x13\\\\xb1&\\\\xce\\\\xfd\\\\x8b{r\\\\xc5\\\\xdb?&\\\\xea\\\\x14_i2\\\\x95\\\\x88P0bgj\\\\xd9\\\\xb8F\\\\x19l\\\\xde\\\\x11\\\\x87\\\\xa6\\\\xe6\\\\xcd\\\\x87\\\\x1d\\\\x16\\\\xad\\\\x05\\\\xad\\\\xc6AR\\\\x95\\\\x90I$\\\\x8dL\\\\xd7\\\\t\\\\xd9z\\\\xa3\\\\x10M\\\\xc3f5\\\\x8f}8\\\\x97\\\\xc6\\\\x99L\\\\xfb\\\\xeb9\\\\x18}\\\\x87;\\\\x1bOs)\\\\xa3\\\\xfd\\\\x1da\\\\xff\\\\x00\\\\xc8\\\\xda\\\\xff\\\\x00\\\\xd9\\\\n}\\\\xc20\\\\x95\\\\xbe4\\\\xde\\\\xa8x\\\\x93\\\\x88\\\\x9a\\\\xe1\\\\xdc-\\\\xdcI\\\\xfb[\\\\xab\\\\xb44\\\\xb4\\\\xa7\\\\xbb\\\\xb6Fu\\\\x02\\\\xa3\\\\x00\\\\x91\\\\xc93\\\\x00\\\\x9eS5\\\\xb5N\\\\x17\\\\x87\\\\xaf{+\\\\x7f\\\\xfb1Z7\\\\xb5;\\\\xfcZ\\\\xc7\\\\xb6\\\\xfe\\\\xca8W\\\\x85q\\\\x8b\\\\xbc\\\\x02\\\\xcb\\\\x88\\\\r\\\\xfb\\\\x98\\\\x92m\\\\x10\\\\xda\\\\x83\\\\xa9e\\\\x858\\\\x80R\\\\xb4\\\\xa8\\\\x01\\\\x990b$\\\\x13\\\\xce\\\\rR\\\\x98\\\\xd23\\\\x14\\\\xe3\\\\xcf\\\\\\\\\\\\xf0\\\\xbe\\\\x1b\\\\x8a\\\\x8c>\\\\xe6\\\\xd5\\\\xdb\\\\xc0\\\\xda\\\\xd7h\\\\xeaR]jA*J\\\\x81\\\\xd0\\\\xc0\\\\x07mH\\\\xda\\\\x8d<N\\\\xcc\\\\x0c\\\\xaf\\\\xb4\\\\x94\\\\xc6\\\\x80-\\\\x02>\\\\xbag\\\\x8887\\\\x8a_`\\\\xb4\\\\x8b\\\\xeb\\\\\\\\n\\\\xcd\\\\x0e%hC\\\\x8c\\\\x84\\\\xbe |\\\\xe1\\\\x98\\\\xe5\\\\xcc\\\\x0c\\\\xc6\\\\xbeQX\\\\xaa\\\\xb0\\\\xacE\\\\x95\\\\x16\\\\xd7\\\\x85\\\\xe3\\\\xcbR\\\\x0eR\\\\xa4\\\\xd88A#\\\\x98!$}f\\\\xb9\\\\xe5\\\\x92I\\\\xe9\\\\x14\\\\xa2\\\\x9a\\\\xd9\\\\\\\\\\\\xdd\\\\xdbW\\\\xd6\\\\xd6\\\\xf7V\\\\xaf\\\\xb5ukr\\\\xd0z\\\\xde\\\\xe1\\\\x97\\\\x03\\\\x8d\\\\xba\\\\xda\\\\xb6ZT4 \\\\xf5\\\\x15*\\\\xd5\\\\xc2\\\\x85D\\\\xcaO.\\\\x95\\\\xc3\\\\xbd\\\\x97v\\\\xc1\\\\x8bvcu\\\\xea\\\\xdd\\\\xda\\\\xb1n\\\\x17y\\\\xd2\\\\xab\\\\xac(\\\\xb9\\\\x94\\\\xb6\\\\xa3\\\\xbb\\\\xb6\\\\xeb?\\\\xb3s\\\\x99\\\\x1f5|\\\\xc4\\\\xc2\\\\x87gp\\\\xbe=\\\\x84\\\\xf1\\\\x96\\\\x07o\\\\x8ep\\\\x9e \\\\xde%\\\\x85\\\\xber\\\\x07\\\\x00\\\\xca\\\\xb6\\\\x9c\\\\x1b\\\\xb4\\\\xea7m\\\\xc1\\\\xcd\\\\'\\\\xda\\\\t\\\\x04\\\\x1a\\\\xe2\\\\xc9\\\\x89\\\\xe3\\\\xfa\\\\x1e\\\\xb6<\\\\xab\\\"\\\\xd1\\\\x93$T\\\\xb6\\\\x15\\\\x04MB\\\\xb6+(\\\\tZH)\\\\xe9\\\\xae\\\\x94\\\\xf0VB\\\\x904=+\\\\x1a4-P\\\\xa8\\\\xa9(>\\\\x1a\\\\x8c\\\\xc5\\\\xb3\\\\xee\\\\xa4\\\\x10\\\\x82\\\\x90F\\\\xea\\\\xd2\\\\xa7\\\\xa6\\\\xcd(\\\\x1f(\\\\xb2\\\\xa9\\\\xe44\\\\xa4\\\\x072\\\\xfa_\\\\';|\\\\x04\\\\xf4\\\\xc1\\\\x0eb\\\\r\\\\xf9\\\\xec\\\\xca\\\\xbe\\\\xea\\\\xe6q\\\\xa9\\\\x10\\\\x0e\\\\xbb\\\\xeb]S\\\\xe9\\\\x7fn\\\\x9f\\\\xd0\\\\x1c\\\\x0e\\\\xf3h\\\\x1e\\\\x0cR\\\\xed\\\\xb3\\\\x1b\\\\xc2\\\\x98\\\\x07\\\\xff\\\\x00\\\\rr\\\\xc6S\\\\x1a\\\\xf8\\\\x88\\\\x1c\\\\xc7ME}\\\\x17D\\\\xff\\\\x00\\\\x91\\\\x1f\\\\xef\\\\xf7>o\\\\xacW\\\\x9e_\\\\xd8\\\\t\\\\x12\\\\x90`\\\\xef\\\\xccS\\\\xd3\\\\xe7\\\\xa0\\\\xe5E\\\\x13\\\\x96\\\\x0e\\\\xc7Ju\\\\x08\\\\xd8\\\\x01\\\\xa4t\\\\xae\\\\xbb9\\\\x92\\\\x13\\\\xa4\\\\x01>D\\\\x8d5\\\\xa7\\\\x00\\\\xcc\\\\x04\\\\x82:F\\\\xbfU\\\\x19\\\\x11\\\\x04\\\\x81;F\\\\xc6\\\\x94Fy\\\\x82\\\\x9d\\\\xc1\\\\x03\\\\xf3\\\\xf7\\\\xd0RT$\\\\xc1\\\\x1a\\\\x931:\\\\xfd\\\\x9aR~n\\\\xb4\\\\xb3#P ni+\\\\x92\\\\x0c\\\\xc4\\\\x1f*C\\\\xa1\\\\xa5\\\\x9c\\\\xaa\\\\x13\\\\xf6\\\\xd3e@\\\\x93\\\\xa8\\\\xe7\\\\xf9\\\\xfa\\\\xa8\\\\xd6u\\\\x95\\\\x009{\\\\xa9\\\\x85*\\\\x01:O\\\\xb2\\\\xa9\\\\x10\\\\xc7\\\\t\\\\xf9\\\\xf3\\\\xcc\\\\xd23I\\\\xf0\\\\x98&N\\\\xbbt\\\\xa4\\\\x13\\\\xb9\\\\x1b\\\\xf3\\\\xfa\\\\xe8\\\\x81\\\\xd5:\\\\x90\\\\'q\\\\xf5|\\\\x05\\\\x00\\\\xb9\\\\x1c\\\\x077\\\\xd7\\\\xbf/}\\\\x16\\\\xb3\\\\xa9\\\\x81\\\\x04\\\\x88:\\\\xd0\\\\x06wI\\\\x03m\\\\xf6\\\\xf6Q\\\\x15\\\\x11\\\\x06u>\\\\xea\\\\x82\\\\xc1\\\\xb1\\\\x11\\\\xf5}T\\\\xd9\\\\xd7/\\\\x8b\\\\xca~\\\\xee\\\\xb4\\\\xf1\\\\xd0\\\\x9e@h\\\\x01\\\\xa4\\\\x19#BI\\\\x8d\\\\x0cP\\\\x14Cpr#_m4\\\\xb6\\\\xfb\\\\xd2\\\\x94(\\\\x04\\\\xb6\\\\xa7P\\\\x15\\\\x9bH\\\\x19\\\\x86\\\\xa6\\\\xa58\\\\x93$N\\\\x9bT\\\\xbe\\\\x1d\\\\xb6M\\\\xc7\\\\x14\\\\xf0\\\\xf3.!+m\\\\xecb\\\\xc9\\\\xb5\\\\xa5C0RM\\\\xc2$\\\\x10fA\\\\x1a\\\\x19\\\\xdc\\\\x1a\\\\x1b\\\\xa5d\\\\xf6\\\\xd9\\\\xd1\\\\xde\\\\x94\\\\xdcE\\\\x88^v9\\\\x89\\\\xda\\\\xe18\\\\xc1\\\\xba\\\\xb5\\\\xbd\\\\xbd\\\\xb5E\\\\xc0\\\\xf5\\\\xf2\\\\xe2V\\\\xc2U>\\\\x10\\\\x14f\\\\x16\\\\x94H \\\\xe8\\\\x0f1[\\\\xd7\\\\x86q\\\\xacJ\\\\xc2\\\\xe3\\\\x87_\\\\xba\\\\xbf\\\\xbb\\\\xf5F\\\\x91l\\\\xd3\\\\xcd\\\\x1b\\\\xb5-\\\\x95\\\\x05\\\\xb6\\\\x94\\\\x10d\\\\xc2\\\\xb52\\\\'\\\\x9d\\\\\\\\\\\\xe3}\\\\x9dp(\\\\xb9t5\\\\xc1<.\\\\x08uI$`\\\\xccj\\\\'\\\\x9f\\\\x87Zu=\\\\x98vx\\\\xe0mG\\\\x81xm\\\\nI\\\\nIF\\\\x1a\\\\x84A\\\\x06A\\\\x11\\\\x11\\\\x04\\\\x02:\\\\x11^E\\\\x9e\\\\x8fk6i\\\\x94\\\\xa8\\\\xa6v1G\\\\'\\\\xadU\\\\x9b\\\\xf9$\\\\x93$\\\\xd2\\\\xd1u=\\\\x05Wpv\\\\x98\\\\x87hW\\\\xd8\\\\xbe\\\\x17\\\\x89a\\\\xd7V\\\\x18\\\\x95\\\\xd5\\\\xa5\\\\xa3\\\\xec-\\\\xae\\\\xed\\\\xa5\\\\x80\\\\x8e\\\\xf5*\\\\x07PA\\\\xd4\\\\xa4\\\\x88\\\\xfe\\\\xc9\\\\xeb\\\\\\\\\\\\xc1\\\\xc5\\\\xbcM\\\\xc4\\\\xb7\\\\x9e\\\\x95=\\\\x9f\\\\x17\\\\xee.\\\\x9dF\\\\x1d`\\\\xe9\\\\xb6p\\\\x04\\\\xf7\\\\x88*m\\\\xc0\\\\xec\\\\xa7(\\\\x90e \\\\x8dt\\\\xae\\\\xbf\\\\xc7\\\\xf0\\\\x0c\\\\x1f\\\\x8bp\\\\xdf\\\\xd1\\\\xdcK`\\\\xce%c\\\\xde\\\\xa5\\\\xd0\\\\xcb\\\\xb3\\\\x01i\\\\x98P \\\\x82\\\\x0e\\\\xa7\\\\x9f:\\\\xc3\\\\xcfb\\\\x1d\\\\x9c\\\\xbd\\\\x893v\\\\xe7\\\\t\\\\xd9\\\\x9b\\\\xa6\\\\x7fgr\\\\x1f|<\\\\x8f\\\\xec\\\\xaf<\\\\x8fuGw\\\\xa1]\\\\x8c\\\\xb5\\\\xec\\\\xf7\\\\x89\\\\xf1\\\\x1b\\\\xfb\\\\xcb\\\\xbc?\\\\x1d\\\\xbaz\\\\xed\\\\xc7\\\\x13\\\\xdf\\\\xda\\\\xad\\\\xe6\\\\xd2\\\\x92\\\\x00\\\\xd1m\\\\xf8R$j\\\\x08\\\\x99;\\\\xeb[\\\\x0eW\\\\xd5U\\\\x85\\\\xe0\\\\xfd\\\\x95\\\\xf0\\\\x86\\\\t\\\\x8bY\\\\xe2\\\\xf8V\\\\x1bp\\\\xc6!fTXuX\\\\xa5\\\\xcb\\\\x81\\\\x19\\\\x81J\\\\xbc*p\\\\xa4\\\\x82\\\\x0cA\\\\x15\\\\x99\\\\xc0\\\\xa6\\\\x9b\\\\xa1Q\\\\xe2\\\\x03\\\\x98\\\\xd0QQk6\\\\x9a\\\\xc9\\\\xd2=\\\\xb1\\\\xca\\\\xb2\\\\x1e\\\\xcf\\\\xbbP\\\\xe2\\\\x1e\\\\xcd\\\\xf1\\\\xef\\\\xd2\\\\xdc+t\\\\x96\\\\x1fy!\\\\x17Vo\\\\xa4\\\\xae\\\\xde\\\\xf5\\\\xb1\\\\xafv\\\\xea4\\\\x9f\\\"!I&REk\\\\xe4\\\\x92\\\\x0e\\\\xa7]\\\\xa6)\\\\xc0\\\\xad5\\\\xcd\\\\x04j\\\\x06\\\\xa0\\\\x7f\\\\x8e\\\\xb5\\\\xbbI\\\\xaa\\\\x14[N\\\\xd1\\\\xea\\\\'c\\\\x1d\\\\xa5\\\\xf0\\\\xbfl\\\\xb8J\\\\xefp+\\\\x85\\\\xd8\\\\xe2\\\\xd6\\\\xad\\\\x871\\\\x1c\\\\r\\\\xd5\\\\x82\\\\xfd\\\\xae\\\\xb0T\\\\x15\\\\xfdk3\\\\xb3\\\\x80i ($\\\\xd6\\\\xd4\\\\x0c3lGt\\\\xd2A\\\\xeaD\\\\x9f\\\\x8dx\\\\xfb\\\\x80\\\\xf1\\\\x1e-\\\\xc2\\\\xb8\\\\xbd\\\\x8e9\\\\xc3W\\\\xd78V/b\\\\xef{mwl\\\\xbc\\\\xabJ\\\\xa2\\\\x0f\\\\xb4\\\\x11\\\\xa1I\\\\xd1@\\\\x90dW\\\\xa1\\\\x1d\\\\x80zOa\\\\x1d\\\\xac&\\\\xdf\\\\x87\\\\xf8\\\\xb3\\\\xd5\\\\xf0>8\\\\x10\\\\x96\\\\xd2\\\\x93\\\\x92\\\\xdb\\\\x14\\\\xf3f~c\\\\xbdZ;\\\\xee\\\\x82uH\\\\xf3\\\\xb2\\\\xe0kq\\\\xe0\\\\xf4\\\\xf1fR\\\\xd3\\\\xe4\\\\xdf\\\\xa1}~\\\\xda2ie\\\\x82\\\\t\\\\x07E\\\\r\\\\xc1\\\\x11\\\\x14;\\\\x85\\\\x0eY\\\\xab\\\\x96\\\\x8e\\\\x83\\\\x9f\\\\xfd-m\\\\xfb\\\\xce\\\\x06\\\\xe1\\\\x87\\\\x88\\\\x9e\\\\xeb\\\\x1e)\\\\x9f\\\\xed[9\\\\xf8W\\\\'\\\\xa5\\\\x9f\\\\x103\\\\xa8\\\\xe4+\\\\xb9{q\\\\xe0\\\\x8b\\\\xce>\\\\xe0\\\\xa6p\\\\xdc6\\\\xee\\\\xda\\\\xca\\\\xe2\\\\xcb\\\\x10E\\\\xfek\\\\x94-Iq)mi(\\\\x19\\\\x01!G8\\\\x8d\\\"\\\\xb8\\\\xee\\\\xf3\\\\x84\\\\xf8\\\\x8a\\\\xc9KK\\\\xbc9\\\\x8b.\\\\x0f\\\\xcfn\\\\xc9d\\\\x1f1\\\\xa6\\\\xd5\\\\xec\\\\xf4ya\\\\x1c}\\\\xad\\\\xec\\\\xf1z\\\\xbcRy;\\\\x92\\\\xd1B\\\\x10 \\\\x83\\\\xa7\\\\xb7\\\\x97\\\\x95\\\\x1eX\\\\x89\\\\x1aELs\\\\x0e\\\\xc4\\\\xdaW\\\\xcb`\\\\x98\\\\xc3Z\\\\x9f\\\\x9d`\\\\xba\\\\x8e\\\\xb6\\\\xdeG\\\\xed,o\\\\x9a$}+E\\\\xa6>\\\\xaa\\\\xeeS\\\\x8f\\\\xa9\\\\xc9\\\\xee\\\\xddp \\\\x83\\\\xb8;\\\\xee@\\\\x98\\\\xe8iz\\\\xe8N\\\\x9dd\\\\xe9L\\\\xae\\\\xe1\\\\xb0\\\\xa9Z\\\\\\\\B\\\\xb5>&V>2)\\\\xb5_\\\\xdb$\\\\x8c\\\\xce\\\\xe4\\\\xd7B\\\\xa4\\\\x11\\\\xf7Uw&.\\\\xd6\\\\x89\\\\x00\\\\x00!2@\\\\xd7^\\\\x7f\\\\x9d)\\\\x07P\\\\x92\\\\x9d\\\\xf4\\\\x83\\\\xcai\\\\xaf\\\\xd26\\\\xa4\\\\x81\\\\xeb,\\\\xcfB\\\\xba/\\\\\\\\\\\\xb6P\\\\x94\\\\xdc\\\\xb2z\\\\x1c\\\\xc3nT\\\\xfb\\\\x93\\\\x17k\\\\x12\\\\xb1;\\\\x12i\\\\xb2\\\\x9d\\\\xe6}\\\\xa7zuo\\\\xb0b\\\\x1fom\\\\xf3\\\\x8a@q\\\\xb2~M\\\\xc4\\\\x1e\\\\x9e!O\\\\xba\\\\xc5\\\\xdb\\\\xb1\\\\xb5 \\\\x90\\\\xac\\\\xc10H\\\\xf7R5\\\\xcd\\\\xb6\\\\xbdO\\\\xdbR%\\\\x07D\\\\xa90z+zm@\\\\xa4\\\\xa4\\\\x88\\\\xd3mg\\\\xeb\\\\x9a;\\\\xb4\\\\x1d\\\\xa3ze\\\\xe705\\\\x1e\\\\xdf\\\\xce\\\\x9et6\\\\xe6\\\\x05(\\\\xa4\\\\x80D\\\\x15i\\\\xa7\\\\xe7\\\\xee\\\\xa4(\\\\x1f\\\\x9b\\\\x04r565\\\\x11Z\\\\xc9)\\\\x04\\\\x81\\\\xcb\\\\xdd\\\\xf6\\\\xd2U\\\\x07B$oC6\\\\xc4\\\\xe9\\\\xa6\\\\xff\\\\x00\\\\x9d\\\\xe9\\\\x05Q\\\\xf0\\\\xda&\\\\x80h%I;\\\\x14\\\\xeb\\\\xf1\\\\xab\\\\x9e\\\\x07d=\\\\xc7\\\\x9c$\\\\xd8\\\\x12N=e\\\\x03\\\\xd8\\\\xfaO\\\\xddT\\\\x8e\\\\x18\\\\'\\\\xe7\\\\x01\\\\xb9\\\\xf3\\\\xf8VS\\\\xd9\\\\x9b}\\\\xff\\\\x00i\\\\xbc\\\\x12\\\\x83\\\\x12\\\\xacn\\\\xdc\\\\xfb\\\\x82\\\\xa7\\\\xee\\\\xa9\\\\x93\\\\xa8\\\\xb2\\\\xa2\\\\x95\\\\x9e\\\\x82b7\\\\xaaU\\\\xe3\\\\x8a\\\\x9d\\\\xdcQ\\\\xdf}jK8\\\\x84\\\\xa4A\\\\x8a\\\\xa4\\\\xb9\\\\x05N\\\\xa9G\\\\x9a\\\\x8f\\\\xdbSmm\\\\x9dP\\\\xd1\\\\x06\\\\x0e\\\\xc6\\\\xbc~\\\\x0fR\\\\x8b\\\\xa6o\\\\n\\\\x949\\\\xcdX\\\\xb0\\\\xfa\\\\x88\\\\x15T\\\\xc5\\\\xb2\\\\xc4\\\\x15oV-J|\\\\xa965\\\\x12\\\\xc9\\\\n1\\\\xe2#\\\\xe3Jm@95\\\\x1d\\\\xb4\\\\xad\\\\xc3\\\\x08\\\\x13\\\\xf7\\\\n\\\\xe6\\\\xae\\\\xda=2xk\\\\xb3\\\\xd5\\\\\\\\\\\\xe0\\\\xdd\\\\x9f\\\\x0b~.\\\\xe2\\\\x84J\\\\x16\\\\xf8Y6\\\\x16k\\\\x1f\\\\xbc\\\\xb4\\\\xea\\\\xf2\\\\x87\\\\xee\\\\xa0\\\\xc6\\\\xf2\\\\xa0DQ\\\\x1b`\\\\xd5\\\\x1d\\\\x1f\\\\xc6\\\\\\\\}\\\\xc3}\\\\x9b\\\\xf0\\\\xfb\\\\x98\\\\xef\\\\x1cb\\\\xf6\\\\xf8>\\\\x1c\\\\x8d\\\\x12\\\\xa7L\\\\xad\\\\xe5\\\\xfe\\\\xe3h\\\\x1e%\\\\xab\\\\xf8R\\\\t\\\\xe7\\\\xca\\\\xb9~\\\\xeb\\\\xff\\\\x00H\\\\x7f\\\\x0e\\\"\\\\xe5\\\\xe4\\\\xd9\\\\xf0\\\\x1e2\\\\xf5\\\\xbaV\\\\xa0\\\\xd3\\\\x8e_2\\\\xda\\\\x96\\\\x89\\\\xd0\\\\x94k\\\\x94\\\\x91\\\\xb8\\\\x93\\\\x1bI\\\\xae\\\\x1e\\\\xe3>\\\\xd0\\\\xb8\\\\x8b\\\\xb4\\\\\\\\}\\\\xdcw\\\\x8d\\\\xb1\\\\x8b\\\\x8c_\\\\x11Y\\\\x84\\\\xb8\\\\xe9\\\\x842\\\\x83\\\\xf4\\\\x1a@\\\\xf0\\\\xb6\\\\x9f \\\\x06\\\\xfa\\\\xc9\\\\xaaSz\\\\x12`\\\\x98#C\\\\xado^\\\\x88\\\\xcbE\\\\x1aL\\\\xc8\\\\xe7\\\\x1a\\\\xd3\\\\x89#@w\\\\x1d\\\\x05G\\\\x92\\\\xa2 x\\\\xb6\\\\x1e\\\\xday+\\\\xd69\\\\x08\\\\xad\\\\x8cG\\\\xd0\\\\xa1\\\\xba\\\\x88;\\\\x88\\\\xdc\\\\x13J\\\\x13\\\\x95*BaZ\\\\x9fa\\\\x1d\\\\x0fZB\\\\x0f\\\\x87B`\\\\xce\\\\xde\\\\xcd\\\\xff\\\\x00\\\\xe7KTe\\\\x98\\\\x93\\\\xbfC\\\\x1fv\\\\xbfm/%\\\\x1d\\\\xa7\\\\xe8\\\\xfb\\\\xe9\\\\x82R\\\\xabN\\\\x15\\\\xed\\\\xaa\\\\xf5KL\\\\x06l\\\\xb8\\\\x95\\\\xddT\\\\x824J/9\\\\x91\\\\xcb\\\\xbf\\\\xdc\\\\x18\\\\xcf\\\"T;P\\\\x00R\\\\x85\\\\xa0\\\\xa5hq!hZHRT\\\\x93\\\\xa8P#B\\\\x0f\\\"+\\\\xc5pFP\\\\x15\\\\x05 \\\\x88\\\\xd7j\\\\xe8N\\\\xc0\\\\xbd(\\\\xb1\\\\xae\\\\xc9\\\\x16\\\\xc6\\\\x03\\\\xc4m\\\\xddq\\\\x07\\\\x04\\\\x15\\\\xc8\\\\xb4\\\\xcc\\\\r\\\\xc6\\\\x1f\\\\'U[)Gc2Z$$\\\\x91 \\\\xa4\\\\x92O.L)\\\\xee\\\\'^<\\\\xde$zH\\\\xa5i\\\\xbcR;\\\\xc5\\\\x1d3\\\\x1f\\\\x8dS\\\\xf0\\\\xe7\\\\x13\\\\xe0\\\\xdce\\\\x81\\\\xdac\\\\xbc%\\\\x891\\\\x8c`\\\\xf7bX\\\\xba`\\\\x98\\\\'\\\\x9aT\\\\x93\\\\xaa\\\\x169\\\\xa1@\\\\x11\\\\xce\\\\xac\\\\xb3\\\\xd7\\\\x13^\\\\xa7Zc\\\\xc5g\\\\x9f>\\\\xb4\\\\x85%\\\\n\\\\xf9\\\\xcd\\\\xa1^\\\\xd4\\\\x03I\\\\n\\\\xa5\\\\x05R\\\\xa4\\\\x164\\\\xbb;E\\\\xfe\\\\xd2\\\\xd2\\\\xd9^\\\\xd6R~\\\\xeaax6\\\\x16\\\\xe8\\\\xf9L2\\\\xc1s\\\\xbekd\\\\x1f\\\\xba\\\\xa6\\\\xe6\\\\xa13N\\\\x84T\\\\xb9\\\\xc2x\\\\x03\\\\xc2\\\\x1d\\\\xc0p\\\\xa5\\\\xff\\\\x00j\\\\xc9\\\\xbf\\\\xc2\\\\xa1\\\\xb9\\\\xd9\\\\xef\\\\x08\\\\xbb\\\\xfbN\\\\x17\\\\xc1\\\\x95\\\\xff\\\\x00\\\\xe8Q\\\\xf8VC\\\\xce\\\\xa3\\\\xe2\\\\x18\\\\x85\\\\xa6\\\\x13au\\\\x88b\\\\x97-\\\\xd9X\\\\xda4]\\\\xb8}\\\\xd3\\\\x08m\\\\x03u\\\\x13\\\\xd0S\\\\xd8\\\\xa9z\\\\x18\\\\xd3\\\\x9d\\\\x95p;\\\\xbf?\\\\x84ps\\\\xcb\\\\xfa*ECs\\\\xb1\\\\x9e\\\\xcf\\\\x9c\\\\x9c\\\\xfc\\\\x1d\\\\x84\\\\xeb\\\\xd1\\\\x88\\\\xfb\\\\rO\\\\xb6\\\\xed?\\\\x81oc\\\\xd5\\\\xb8\\\\xdb\\\\x87\\\\x97;\\\\x05b\\\\tA\\\\xf8**\\\\xe2\\\\xdb\\\\x88p[\\\\xd8\\\\xf5\\\\x1cw\\\\x08\\\\xba\\\\x9d\\\\xbb\\\\xacI\\\\x95\\\\x7f\\\\xe2\\\\xaa\\\\xf8\\\\x97\\\\x96\\\\x1d\\\\x8b\\\\xfa\\\\x7f\\\\xc8\\\\xc3\\\\\\\\\\\\xec\\\\x1f\\\\xb3w7\\\\xe0\\\\xfc<N\\\\xe5!C\\\\xef\\\\xa8n\\\\xfa;\\\\xf6f\\\\xe1\\\\xff\\\\x00\\\\xa2\\\\xb6\\\\xe9\\\\xfe\\\\xc3\\\\xce\\\\x0f\\\\xbe\\\\xb6\\\\x82\\\\x1b/\\\\x8c\\\\xcc\\\\x14<9\\\\x16\\\\xdcJ\\\\xfe\\\\xc3J6\\\\x97#v\\\\x1e\\\\x1f\\\\xec\\\\xcd\\\\x1d\\\\xf2\\\\xf0\\\\xd9.\\\\x10\\\\xf2\\\\x91\\\\xa8\\\\x1d\\\\xf4l\\\\xec\\\\xc9d\\\\xcf\\\\x0e\\\\x94\\\\xcf\\\\xee\\\\xdd\\\\xb8>\\\\xfa\\\\x84\\\\xe7\\\\xa3\\\\x17f\\\\xcb\\\\xf9\\\\xb8M\\\\xda\\\\x7f\\\\xb3~\\\\xe0\\\\xfb\\\\xebr\\\\xad*A\\\\x85\\\\xa5I=\\\\x14\\\"\\\\x93\\\\x00\\\\xd1\\\\xef\\\\'\\\\xea\\\\xc3\\\\xdd\\\\xc3\\\\xfaM&\\\\xbfE\\\\xde\\\\xce\\\\xf5\\\\xcbg\\\\x88\\\\xa3\\\\xcd7\\\\xca\\\\xfc*+\\\\x9e\\\\x8b<\\\\x00\\\\xb2\\\\nF,\\\\x82:_\\\\x7f\\\\xfekz\\\\x14M \\\\xb5;\\\\xd5{\\\\xcc\\\\x9f\\\\xd4\\\\'\\\\x8f\\\\x1f\\\\xa1\\\\xa1W\\\\xe8\\\\xa3\\\\xc0\\\\xca\\\\'%\\\\xce4\\\\x93:~\\\\xb6\\\\x0f\\\\xda\\\\x9a\\\\xc9x#\\\\xd1\\\\xe7\\\\x858K\\\\x1e\\\\xb5\\\\xc4\\\\xec\\\\xc5\\\\xc5\\\\xdd\\\\xc3&Z7y\\\\x1c\\\\xee\\\\xd5\\\\xc9i\\\\xd2R\\\\xa1\\\\xc8\\\\x8a\\\\xda\\\\xdd\\\\xde\\\\xb4\\\\xf3)\\\\x85\\\\xa4\\\\xed\\\\xadW\\\\xbc\\\\x9b\\\\xd3d<x\\\\xd7\\\\x08@\\\\xc2Zh\\\\xf8@Y\\\\xea\\\\xa3R\\\\x03yR\\\\x01\\\\x03N\\\\x95%z\\\\xd3q\\\\xe1Z\\\\x94R\\\\x84 \\\\x15-j0\\\\x94\\\\x81\\\\xb9$\\\\xe8\\\\x056$\\\\x84\\\\x01\\\\x1e\\\\xda\\\\xc6;B\\\\xed3\\\\x85{(\\\\xc1?K\\\\xf1\\\\xde(\\\\x8b\\\\x06V\\\\x0f\\\\xabZ\\\\xa0g\\\\xb9\\\\xbaP\\\\xfa-7\\\\xb9\\\\xf6\\\\xe8\\\\x91:\\\\x91\\\\\\\\\\\\xff\\\\x00\\\\xdbW\\\\xa6\\\\x9e\\\\x07\\\\xc2>\\\\xb1\\\\x82\\\\xf6N-\\\\xf8\\\\x97\\\\x1cL\\\\xa1\\\\xccU~++c\\\\xfel\\\\x7f\\\\\\\\\\\\xa1\\\\xd4B<\\\\xd5\\\\xa8\\\\xae\\\\x0f\\\\xe2\\\\x9e-\\\\xc6\\\\xf8\\\\xdf\\\\x1a\\\\xb8\\\\xc6\\\\xf8\\\\xb7\\\\x14\\\\xb8\\\\xc6qK\\\\x83\\\\xf2\\\\x977.I\\\\x8f\\\\xddH\\\\xd9)\\\\x13\\\\xa2@\\\\x00r\\\\x15\\\\xb41\\\\xde\\\\xd9\\\\x12\\\\x9a\\\\x89\\\\xbc;o\\\\xf4\\\\xb4\\\\xe2\\\\x9e\\\\xd5\\\\x92\\\\xfe\\\\r\\\\x82\\\\x95\\\\xf0\\\\xaf\\\\x088J\\\\x15cl\\\\xec\\\\xbfv\\\\x9e\\\\xb7\\\\x0e\\\\x8d\\\\xc1\\\\x1fA>\\\\x1dH9\\\\xa2k\\\\x9fB\\\\xb2\\\\xa4\\\\'H\\\\xf2\\\\x02\\\\x053\\\\x9b6\\\\xa2D\\\\xf2\\\\x1b\\\\x9a-\\\\xcfS\\\\xec\\\\xad\\\\xd5%\\\\xa3\\\\x9d\\\\xc9\\\\xcb\\\\x91\\\\xf2\\\\xe1\\\\x9dg\\\\xafO}\\\\x16ru\\\\x08>\\\\xe4\\\\xd39\\\\x86\\\\xe0\\\\x8d\\\\x8e\\\\xe0\\\\xedG\\\\x03\\\\xa9\\\\x1f\\\\x9fm\\\\x04\\\\t\\\\xe6si\\\\x03j\\\\x08V\\\\xa7\\\\xcf\\\\xad$\\\\x82z\\\\x1d4\\\\xa5\\\\x98\\\\x00\\\\xc9 \\\\xefE\\\\x8c\\\\x90\\\\xd2\\\\xc9\\\\xd6\\\\t\\\\x11\\\\xa1\\\\x9d\\\\xbf:\\\\xd3\\\\x85jYHY\\\\x85\\\\x1d\\\\xa3\\\\x95FI:L\\\\x19\\\\x9d\\\\xce\\\\x94\\\\xeaU\\\\xa1\\\\x8d\\\\xba\\\\xc50\\\\x1eL\\\\x1f\\\\x9d\\\\xa0V\\\\x8a=\\\\x0c\\\\xd2\\\\xd2A\\\\x85\\\\x10\\\\x02\\\\xfe\\\\x96n~\\\\x7f\\\\x9e\\\\xb4\\\\xcaI))\\\\x04\\\\xc9\\\\xd4i\\\\xbe\\\\xff\\\\x00\\\\n^b\\\\xa0eC4\\\\x13:\\\\xed\\\\x14\\\\xe9 \\\\xf0l>\\\\xca;a\\\\xe2\\\\x8e\\\\xc71\\\\xe5\\\\xe2\\\\x1c-r\\\\x95\\\\xd9\\\\xdc\\\\x90\\\\x9cG\\\\x0b\\\\xb8%V\\\\xd7\\\\x88\\\\x1c\\\\x96\\\\x9eKI\\\\xf9\\\\xae\\\\'\\\\xc4\\\\x99\\\\xde\\\\t\\\\x07\\\\xd1\\\\xbe\\\\xca\\\\xbb_\\\\xe1\\\\x9e\\\\xd8\\\\xf0#\\\\x89p\\\\xab\\\\xeaj\\\\xf6\\\\xdd\\\\x00\\\\xe28M\\\\xc2\\\\x87\\\\xac\\\\xd9+\\\\xa9\\\\x8f\\\\x9e\\\\xd9\\\\xfa.\\\\'B49L\\\\x81\\\\xe5(Y\\\\xcf\\\\x9bP\\\\x0f\\\\x96\\\\xa7\\\\xf1\\\\xab\\\\x8e\\\\x1b\\\\xe2lg\\\\x83q\\\\xcb<w\\\\x85\\\\xb17\\\\xf0\\\\x8cf\\\\xcdY\\\\xd8\\\\xbb\\\\xb6\\\\xd1@\\\\xf3\\\\x04l\\\\xa4\\\\x9dB\\\\x90\\\\xa9\\\\x04\\\\x18 \\\\x83X\\\\xcf\\\\x1a\\\\x99\\\\xb42\\\\xb8\\\\xe8\\\\xf5\\\\xf0\\\\x13J\\\\xcdZ\\\\'\\\\xb0\\\\x7fI\\\\xac\\\\x1b\\\\xb5\\\\x90\\\\xce\\\\x07\\\\xc4\\\\x89\\\\xb7\\\\xc08\\\\xde!\\\\x16\\\\xe0\\\\xe5\\\\xb6\\\\xc4\\\\xba\\\\xaa\\\\xdc\\\\x93\\\\xe1_VI\\\\x9dAIP\\\\x90\\\\x9d\\\\xf2Q\\\\n \\\\x88#C=k\\\\x89\\\\xc5\\\\xc5\\\\xd3;\\\\x93RV\\\\x84\\\\xcc\\\\xf5\\\\x14\\\\xb0\\\\x0e\\\\x94\\\\xb0\\\\x9aTt\\\\xa9\\\\x18\\\\x90+OzKq\\\\x0f\\\\xe8\\\\x9e\\\\xce\\\\xda\\\\xc2\\\\x9b^W\\\\xb1\\\\xcb\\\\xd42\\\\xa0\\\\x0f\\\\xf5\\\\r\\\\xfc\\\\xa3\\\\x9e\\\\xe3\\\\t\\\\x1e\\\\xfa\\\\xdc~\\\\xca\\\\xe4\\\\xafH\\\\xccxc\\\\xbd\\\\xa5\\\\xdb\\\\xe0\\\\xed\\\\xbc\\\\x94\\\\xdb`\\\\xb6\\\\xcd\\\\xdb\\\\x92U\\\\tK\\\\xce\\\\x90\\\\xb7\\\\t\\\\xe9\\\\x03 \\\\xd6\\\\xb4\\\\xc6\\\\xaeH\\\\x0c\\\\x0e\\\\xdb\\\\x83\\\\xd8\\\\xbd\\\\xb4\\\\xb4u\\\\xfb\\\\xb7Zy\\\\xe6s\\\\xb8\\\\x82\\\\xca\\\\x16\\\\x91\\\\xcce\\\\x93\\\\xae\\\\x91\\\\xa7\\\\x99\\\\xa8k\\\\xe0;w\\\\x1b\\\\xef\\\\x13sj\\\\xe9 \\\\x1d,\\\\xb3\\\\x19\\\\xd8\\\\x8d\\\\x0e\\\\xdc\\\\xe7\\\\xdb\\\\xd2\\\\xb3 \\\\xf5\\\\xb1y\\\\x01\\\\xa7\\\\x82R\\\\x10\\\\x12\\\\x90\\\\x95\\\\x0f\\\\x02\\\\xb4\\\\xd3\\\\x9c\\\\x02\\\\x07\\\\xb3}\\\\xa8\\\\\\\\\\\\xb8\\\\x9b\\\\x0bg\\\\x9fq\\\\tm\\\\x86\\\\n\\\\x90\\\\xbf\\\\x93\\\\'&\\\\xb23\\\\x04\\\\xca\\\\x86\\\\xba\\\\xc8\\\\x90\\\\x0e\\\\xbb\\\\x1a\\\\xdb\\\\xbeBP\\\\x89\\\\x83\\\\x8e\\\\x05q\\\\xa6\\\\xd2\\\\xab{\\\\xbb$+\\\\xbc(RP\\\\\\\\ADs\\\\xf0\\\\xf2\\\\xf6j\\\\'j\\\\x8ft\\\\xbcc\\\\x00}-3\\\\x8f^%\\\\xc0H\\\"\\\\xd3\\\\x14\\\\xb8\\\\x05\\\\x04F\\\\x84\\\\x124\\\\xd4j$Vd\\\\xde;\\\\x84>D\\\\xe2v\\\\xe9RL\\\\x82\\\\xe80\\\\xa3\\\\x11\\\\x12@\\\\xd2\\\\x0f\\\\xc4V\\\\'\\\\xc4/\\\\xa6\\\\xe2\\\\xfd9.\\\\x9b\\\\xb9d\\\\xa08\\\\x16\\\\xd3\\\\x8b)%[\\\\xc8*!*\\\\x11\\\\x07,\\\\x03\\\\xa6\\\\x82\\\\xb4\\\\x8b\\\\x93t\\\\xc4\\\\xf4\\\\xb4\\\\xce\\\\x99\\\\xf4j\\\\xb9\\\\xc5q.\\\\n\\\\xc5\\\\xaf\\\\xb1\\\\xacO\\\\x10\\\\xc4\\\\xbb\\\\xdcYM\\\\xdb\\\\x9b\\\\xdb\\\\xa5\\\\xbc[J\\\\x1bH!%D\\\\x90\\\\t5\\\\xb9Bk]\\\\xf6\\\\x01\\\\x86z\\\\x8fd\\\\x1c<H\\\\xca\\\\xab\\\\xce\\\\xfe\\\\xed_\\\\xeb\\\\xb8c\\\\xea\\\\x02\\\\xb6Ow\\\\\\\\r\\\\xfcL\\\\xa1\\\\xb8\\\\x11\\\\xa5\\\\x11\\\\x1eT\\\\xe6I\\\\xd7Z,\\\\x9d\\\\rI#p\\\\x05)\\\\x1f<mI\\\\xb8q\\\\x8b+K\\\\x8b\\\\xdcB\\\\xe1\\\\x9b;+t\\\\x17\\\\x1f\\\\xb8}\\\\xc0\\\\xdbm$\\\\rT\\\\xa5\\\\x1d\\\\x00\\\\x15\\\\xc7\\\\xdd\\\\xb4\\\\xfan\\\\xda\\\\xe1\\\\xaa\\\\xb8\\\\xc0\\\\xfb\\\\x16J.\\\\xee\\\\x84\\\\xa1\\\\xce \\\\xb9n[A\\\\xd8\\\\xfa\\\\xbbJ\\\\x1e#\\\\xfcj\\\\x11\\\\xd0\\\\x10f\\\\xb4\\\\x8c\\\\\\\\\\\\xb8&M%l\\\\xe9N\\\\xd4\\\\xbb`\\\\xe1\\\\x1e\\\\xc7p\\\\xa1{\\\\xc6\\\\xb8\\\\x8e[\\\\xb7RM\\\\xa6\\\\x17m\\\\x0b\\\\xbb\\\\xba?\\\\xc2\\\\x8f\\\\xa2\\\\x9f\\\\xe2T\\\\x0f:\\\\xf3\\\\xcb\\\\xb6\\\\xafI\\\\xfe1\\\\xed\\\\x80\\\\xbf\\\\x87\\\\xe7\\\\xfeOp\\\\xa6o\\\\x06\\\\x13f\\\\xe1\\\\xf9Q\\\\xc8\\\\xbe\\\\xe6\\\\x85\\\\xd3\\\\xe5\\\\xa2v\\\\xd2D\\\\xd6\\\\x9e\\\\xc6q\\\\xbcK\\\\x88q[\\\\xacW\\\\x1f\\\\xbf\\\\xb9\\\\xc4\\\\xf1+\\\\xb5\\\\x95\\\\xbfur\\\\xe1q\\\\xc5\\\\x9e\\\\xa5G_\\\\xba*\\\\x0f-\\\\x81\\\\x8eU\\\\xd7\\\\x18(\\\\x9c\\\\x8f%\\\\xf0\\\\t\\\\x81\\\\xa1\\\\'\\\\xa7*\\\\x04\\\\x98\\\\x10Lr\\\\xa2\\\\'A\\\\xb7\\\\xb0s\\\\xa4\\\\xeeO>\\\\x9a\\\\n\\\\xd4\\\\xc0<\\\\xd3\\\\x9a5 \\\\xd0\\\\x92\\\\x08\\\\x8e{N\\\\xb4R\\\"OX\\\\xda\\\\x80:\\\\x18\\\\xf0\\\\xc5!\\\\x86\\\\xa9\\\\x1b\\\\x1d\\\\xe8\\\\x80$l?\\\\xbc(\\\\x01<\\\\xe7\\\\xcau\\\\xa5\\\\x08\\\\x81\\\\xe2\\\\xfa\\\\xcd!0\\\\xc8\\\\x1d:\\\\xe8h\\\\xd2bNa\\\\xa0\\\\xf6\\\\xe9B\\\\x85\\\\x03\\\\xf2\\\\x11\\\\xf2\\\\xd6\\\\x94\\\\x93\\\\x11\\\\xa0\\\\xdb\\\\x99\\\\xa1B\\\\x9ac\\\\xf2:\\\\xd2\\\\xf4\\\\x89\\\\xd2$\\\\xf9{G\\\\xe1J\\\\n3\\\\x13\\\\t\\\\x9dG\\\\xddB\\\\x855\\\\xa2lZV\\\\xa2|*\\\\x88\\\\xfa\\\\xbd\\\\x95\\\"L\\\\xa3Y9y\\\\xec\\\\'\\\\x9f\\\\xe7\\\\x9d\\\\n\\\\x15^J\\\\xa1I*J\\\\x90\\\\xa4\\\\x12\\\\nL\\\\xa7)\\\\x82\\\\x08\\\\xd4\\\\x10G1\\\\xd4Wfv\\\\t\\\\xe9\\\\x82G\\\\xaap\\\\xcfm\\\\x17\\\\xaaq0\\\\x19\\\\xb2\\\\xe2W<JN\\\\xc1(\\\\xbc\\\\x8dT6\\\\x1d\\\\xfe\\\\xfbg\\\\x07U\\\\x01B\\\\xb1\\\\x92R\\\\xd34\\\\xc7\\\\'\\\\x17\\\\xa3\\\\xb2\\\\xdbq\\\\x0e6\\\\x87\\\\x19q\\\\x0f2\\\\xe2B\\\\xdbq\\\\xb5\\\\x85\\\\xa1i\\\"B\\\\x92\\\\xa1\\\\xa1\\\\x04A\\\\x04iK*\\\\xa1B\\\\xbc\\\\xfe\\\\x19\\\\xe8\\\\x01\\\\n\\\\tZI\\\\xd4\\\\x0315\\\\xc8\\\\\\\\E\\\\xd8_i\\\\xb8\\\\xae3\\\\x8ab\\\\xb7\\\\x18U\\\\x8d\\\\xeb\\\\xf7\\\\xf7\\\\x8e\\\\xdc\\\\xb9\\\\xdcb\\\\xcd\\\\x19\\\\xcc\\\\xa3\\\\x00\\\\x05F\\\\xc2\\\\x05\\\\n\\\\x14\\\\xfb\\\\xdc6\\\\x84\\\\xccf\\\\xe7\\\\xb1\\\\x1e\\\\xd0\\\\xedus\\\\x83/\\\\xd6\\\\x00\\\\xfe\\\\xa5M9\\\\xff\\\\x00\\\\n\\\\x8dU\\\\\\\\v}\\\\xc6\\\\x98y&\\\\xe3\\\\x84\\\\xf8\\\\x81\\\\x90\\\\x07\\\\xd1\\\\xb2t\\\\x8fg\\\\x84P\\\\xa1Z.\\\\xa2l\\\\xce\\\\xb6T?\\\\x84bv\\\\x92.\\\\xb0\\\\xbcA\\\\x88\\\\xe6\\\\xed\\\\x9b\\\\x89\\\\xfbE@\\\\xb8K\\\\x8d0\\\\xe9-\\\\xac,!D\\\\x0c\\\\x84\\\\x19\\\\x8a\\\\x14+\\\\xa29\\\\x1b\\\\n\\\\xd9\\\\xe8\\\\x1f\\\\x04\\\\xe1\\\\xc3\\\\x07\\\\xe0\\\\x9e\\\\x1a\\\\xc3\\\\xf2\\\\xe56\\\\xd8]\\\\xba\\\\x08\\\\xe8r\\\\x02~\\\\xb3W\\\\xb3\\\\xd2\\\\x85\\\\n\\\\xe24`\\\\x80kT\\\\xf6\\\\xb9\\\\xe9\\\\x0b\\\\xc1=\\\\x8e\\\\xda-8\\\\xcd\\\\xe2ql}I\\\\x960k\\\\x17\\\\x02\\\\x9eWB\\\\xe2\\\\xb6i>gS\\\\xac\\\\x03B\\\\x85i\\\\x8e*R\\\\xa6D\\\\x9fl[\\\\xf4<\\\\xf7\\\\xed\\\\x83\\\\xd2\\\\x0b\\\\x8c\\\\xfbe\\\\xbb-\\\\xf1\\\\r\\\\xe8\\\\xb0\\\\xc0\\\\xd0\\\\xb9\\\\xb7\\\\xc1\\\\xac\\\\x89M\\\\xba5\\\\x90W\\\\xcd\\\\xc5m\\\\xe2T\\\\xeb\\\\xb0\\\\x1bV\\\\xaa\\\\xd34r\\\\xd2|\\\\xa8P\\\\xae\\\\xe4\\\\x92Z8%\\\\'\\\\'l\\\\x19\\\\xb5\\\\xd6\\\\x04\\\\x9e\\\\\\\\\\\\xa8\\\\xa6t\\\\xe7\\\\xcehP\\\\xa3\\\\x82@I\\\\x024\\\\x93\\\\xf9\\\\x9aL\\\\xc4\\\\r\\\"\\\\x85\\\\n\\\\x00%i$D{(\\\\xf6\\\\x92t\\\\xf3\\\\xa1B\\\\x81\\\\x0e\\\\x00\\\\xaf\\\\x9a\\\\x93\\\\xa0\\\\x07a:R\\\\x82\\\\'\\\\xe8O\\\\x9cP\\\\xa1U\\\\x10\\\\xa3\\\\xff\\\\xd9'\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# The raw content (its a binary file, meaning we will need to use binary read/write methods for saving it)\\n\",\n    \"image_link.content\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Let's write this to a file:=, not the 'wb' call to denote a binary writing of the file.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"f = open('my_new_file_name.jpg','wb')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"22491\"\n      ]\n     },\n     \"execution_count\": 28,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"f.write(image_link.content)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we can display this file right here in the notebook as markdown using:\\n\",\n    \"\\n\",\n    \"    <img src=\\\"'my_new_file_name.jpg'>\\n\",\n    \"    \\n\",\n    \"Just write the above line in a new markdown cell and it will display the image we just downloaded!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<img src='my_new_file_name.jpg'>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Example Project - Working with Multiple Pages and Items\\n\",\n    \"\\n\",\n    \"Let's show a more realistic example of scraping a full site. The website: http://books.toscrape.com/index.html is specifically designed for people to scrape it. Let's try to get the title of every book that has a 2 star rating and at the end just have a Python list with all their titles.\\n\",\n    \"\\n\",\n    \"We will do the following:\\n\",\n    \"\\n\",\n    \"1. Figure out the URL structure to go through every page\\n\",\n    \"2. Scrap every page in the catalogue\\n\",\n    \"3. Figure out what tag/class represents the Star rating\\n\",\n    \"4. Filter by that star rating using an if statement\\n\",\n    \"5. Store the results to a list\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"source\": [\n    \"We can see that the URL structure is the following:\\n\",\n    \"\\n\",\n    \"    http://books.toscrape.com/catalogue/page-1.html\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"base_url = 'http://books.toscrape.com/catalogue/page-{}.html'\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can then fill in the page number with .format()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"res = requests.get(base_url.format('1'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now let's grab the products (books) from the get request result:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"soup = bs4.BeautifulSoup(res.text,\\\"lxml\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[<article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"a-light-in-the-attic_1000/index.html\\\"><img alt=\\\"A Light in the Attic\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/2c/da/2cdad67c44b002e7ead0cc35693c0e8b.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Three\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"a-light-in-the-attic_1000/index.html\\\" title=\\\"A Light in the Attic\\\">A Light in the ...</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£51.77</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>,\\n\",\n       \" <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"tipping-the-velvet_999/index.html\\\"><img alt=\\\"Tipping the Velvet\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/26/0c/260c6ae16bce31c8f8c95daddd9f4a1c.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating One\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"tipping-the-velvet_999/index.html\\\" title=\\\"Tipping the Velvet\\\">Tipping the Velvet</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£53.74</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>,\\n\",\n       \" <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"soumission_998/index.html\\\"><img alt=\\\"Soumission\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/3e/ef/3eef99c9d9adef34639f510662022830.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating One\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"soumission_998/index.html\\\" title=\\\"Soumission\\\">Soumission</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£50.10</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>,\\n\",\n       \" <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"sharp-objects_997/index.html\\\"><img alt=\\\"Sharp Objects\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/32/51/3251cf3a3412f53f339e42cac2134093.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Four\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"sharp-objects_997/index.html\\\" title=\\\"Sharp Objects\\\">Sharp Objects</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£47.82</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>,\\n\",\n       \" <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"sapiens-a-brief-history-of-humankind_996/index.html\\\"><img alt=\\\"Sapiens: A Brief History of Humankind\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/be/a5/bea5697f2534a2f86a3ef27b5a8c12a6.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Five\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"sapiens-a-brief-history-of-humankind_996/index.html\\\" title=\\\"Sapiens: A Brief History of Humankind\\\">Sapiens: A Brief History ...</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£54.23</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>,\\n\",\n       \" <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"the-requiem-red_995/index.html\\\"><img alt=\\\"The Requiem Red\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/68/33/68339b4c9bc034267e1da611ab3b34f8.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating One\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"the-requiem-red_995/index.html\\\" title=\\\"The Requiem Red\\\">The Requiem Red</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£22.65</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>,\\n\",\n       \" <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"the-dirty-little-secrets-of-getting-your-dream-job_994/index.html\\\"><img alt=\\\"The Dirty Little Secrets of Getting Your Dream Job\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/92/27/92274a95b7c251fea59a2b8a78275ab4.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Four\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"the-dirty-little-secrets-of-getting-your-dream-job_994/index.html\\\" title=\\\"The Dirty Little Secrets of Getting Your Dream Job\\\">The Dirty Little Secrets ...</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£33.34</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>,\\n\",\n       \" <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"the-coming-woman-a-novel-based-on-the-life-of-the-infamous-feminist-victoria-woodhull_993/index.html\\\"><img alt=\\\"The Coming Woman: A Novel Based on the Life of the Infamous Feminist, Victoria Woodhull\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/3d/54/3d54940e57e662c4dd1f3ff00c78cc64.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Three\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"the-coming-woman-a-novel-based-on-the-life-of-the-infamous-feminist-victoria-woodhull_993/index.html\\\" title=\\\"The Coming Woman: A Novel Based on the Life of the Infamous Feminist, Victoria Woodhull\\\">The Coming Woman: A ...</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£17.93</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>,\\n\",\n       \" <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"the-boys-in-the-boat-nine-americans-and-their-epic-quest-for-gold-at-the-1936-berlin-olympics_992/index.html\\\"><img alt=\\\"The Boys in the Boat: Nine Americans and Their Epic Quest for Gold at the 1936 Berlin Olympics\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/66/88/66883b91f6804b2323c8369331cb7dd1.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Four\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"the-boys-in-the-boat-nine-americans-and-their-epic-quest-for-gold-at-the-1936-berlin-olympics_992/index.html\\\" title=\\\"The Boys in the Boat: Nine Americans and Their Epic Quest for Gold at the 1936 Berlin Olympics\\\">The Boys in the ...</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£22.60</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>,\\n\",\n       \" <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"the-black-maria_991/index.html\\\"><img alt=\\\"The Black Maria\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/58/46/5846057e28022268153beff6d352b06c.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating One\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"the-black-maria_991/index.html\\\" title=\\\"The Black Maria\\\">The Black Maria</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£52.15</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>,\\n\",\n       \" <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"starving-hearts-triangular-trade-trilogy-1_990/index.html\\\"><img alt=\\\"Starving Hearts (Triangular Trade Trilogy, #1)\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/be/f4/bef44da28c98f905a3ebec0b87be8530.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Two\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"starving-hearts-triangular-trade-trilogy-1_990/index.html\\\" title=\\\"Starving Hearts (Triangular Trade Trilogy, #1)\\\">Starving Hearts (Triangular Trade ...</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£13.99</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>,\\n\",\n       \" <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"shakespeares-sonnets_989/index.html\\\"><img alt=\\\"Shakespeare's Sonnets\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/10/48/1048f63d3b5061cd2f424d20b3f9b666.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Four\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"shakespeares-sonnets_989/index.html\\\" title=\\\"Shakespeare's Sonnets\\\">Shakespeare's Sonnets</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£20.66</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>,\\n\",\n       \" <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"set-me-free_988/index.html\\\"><img alt=\\\"Set Me Free\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/5b/88/5b88c52633f53cacf162c15f4f823153.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Five\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"set-me-free_988/index.html\\\" title=\\\"Set Me Free\\\">Set Me Free</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£17.46</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>,\\n\",\n       \" <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"scott-pilgrims-precious-little-life-scott-pilgrim-1_987/index.html\\\"><img alt=\\\"Scott Pilgrim's Precious Little Life (Scott Pilgrim #1)\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/94/b1/94b1b8b244bce9677c2f29ccc890d4d2.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Five\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"scott-pilgrims-precious-little-life-scott-pilgrim-1_987/index.html\\\" title=\\\"Scott Pilgrim's Precious Little Life (Scott Pilgrim #1)\\\">Scott Pilgrim's Precious Little ...</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£52.29</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>,\\n\",\n       \" <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"rip-it-up-and-start-again_986/index.html\\\"><img alt=\\\"Rip it Up and Start Again\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/81/c4/81c4a973364e17d01f217e1188253d5e.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Five\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"rip-it-up-and-start-again_986/index.html\\\" title=\\\"Rip it Up and Start Again\\\">Rip it Up and ...</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£35.02</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>,\\n\",\n       \" <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"our-band-could-be-your-life-scenes-from-the-american-indie-underground-1981-1991_985/index.html\\\"><img alt=\\\"Our Band Could Be Your Life: Scenes from the American Indie Underground, 1981-1991\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/54/60/54607fe8945897cdcced0044103b10b6.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Three\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"our-band-could-be-your-life-scenes-from-the-american-indie-underground-1981-1991_985/index.html\\\" title=\\\"Our Band Could Be Your Life: Scenes from the American Indie Underground, 1981-1991\\\">Our Band Could Be ...</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£57.25</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>,\\n\",\n       \" <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"olio_984/index.html\\\"><img alt=\\\"Olio\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/55/33/553310a7162dfbc2c6d19a84da0df9e1.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating One\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"olio_984/index.html\\\" title=\\\"Olio\\\">Olio</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£23.88</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>,\\n\",\n       \" <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"mesaerion-the-best-science-fiction-stories-1800-1849_983/index.html\\\"><img alt=\\\"Mesaerion: The Best Science Fiction Stories 1800-1849\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/09/a3/09a3aef48557576e1a85ba7efea8ecb7.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating One\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"mesaerion-the-best-science-fiction-stories-1800-1849_983/index.html\\\" title=\\\"Mesaerion: The Best Science Fiction Stories 1800-1849\\\">Mesaerion: The Best Science ...</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£37.59</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>,\\n\",\n       \" <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"libertarianism-for-beginners_982/index.html\\\"><img alt=\\\"Libertarianism for Beginners\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/0b/bc/0bbcd0a6f4bcd81ccb1049a52736406e.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Two\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"libertarianism-for-beginners_982/index.html\\\" title=\\\"Libertarianism for Beginners\\\">Libertarianism for Beginners</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£51.33</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>,\\n\",\n       \" <article class=\\\"product_pod\\\">\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"its-only-the-himalayas_981/index.html\\\"><img alt=\\\"It's Only the Himalayas\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/27/a5/27a53d0bb95bdd88288eaf66c9230d7e.jpg\\\"/></a>\\n\",\n       \" </div>\\n\",\n       \" <p class=\\\"star-rating Two\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>\\n\",\n       \" <h3><a href=\\\"its-only-the-himalayas_981/index.html\\\" title=\\\"It's Only the Himalayas\\\">It's Only the Himalayas</a></h3>\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£45.17</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>\\n\",\n       \" </article>]\"\n      ]\n     },\n     \"execution_count\": 33,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"soup.select(\\\".product_pod\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we can see that each book has the product_pod class. We can select any tag with this class, and then further reduce it by its rating.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"products = soup.select(\\\".product_pod\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"example = products[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"bs4.element.Tag\"\n      ]\n     },\n     \"execution_count\": 36,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"type(example)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'class': ['product_pod']}\"\n      ]\n     },\n     \"execution_count\": 37,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"example.attrs\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now by inspecting the site we can see that the class we want is class='star-rating Two' , if you click on this in your browser, you'll notice it displays the space as a . , so that means we want to search for \\\".star-rating.Two\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 38,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['\\\\n',\\n\",\n       \" <div class=\\\"image_container\\\">\\n\",\n       \" <a href=\\\"a-light-in-the-attic_1000/index.html\\\"><img alt=\\\"A Light in the Attic\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/2c/da/2cdad67c44b002e7ead0cc35693c0e8b.jpg\\\"/></a>\\n\",\n       \" </div>,\\n\",\n       \" '\\\\n',\\n\",\n       \" <p class=\\\"star-rating Three\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>,\\n\",\n       \" '\\\\n',\\n\",\n       \" <h3><a href=\\\"a-light-in-the-attic_1000/index.html\\\" title=\\\"A Light in the Attic\\\">A Light in the ...</a></h3>,\\n\",\n       \" '\\\\n',\\n\",\n       \" <div class=\\\"product_price\\\">\\n\",\n       \" <p class=\\\"price_color\\\">Â£51.77</p>\\n\",\n       \" <p class=\\\"instock availability\\\">\\n\",\n       \" <i class=\\\"icon-ok\\\"></i>\\n\",\n       \"     \\n\",\n       \"         In stock\\n\",\n       \"     \\n\",\n       \" </p>\\n\",\n       \" <form>\\n\",\n       \" <button class=\\\"btn btn-primary btn-block\\\" data-loading-text=\\\"Adding...\\\" type=\\\"submit\\\">Add to basket</button>\\n\",\n       \" </form>\\n\",\n       \" </div>,\\n\",\n       \" '\\\\n']\"\n      ]\n     },\n     \"execution_count\": 38,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list(example.children)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[<p class=\\\"star-rating Three\\\">\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" <i class=\\\"icon-star\\\"></i>\\n\",\n       \" </p>]\"\n      ]\n     },\n     \"execution_count\": 39,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"example.select('.star-rating.Three')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"But we are looking for 2 stars, so it looks like we can just check to see if something was returned\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 40,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[]\"\n      ]\n     },\n     \"execution_count\": 40,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"example.select('.star-rating.Two')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Alternatively, we can just quickly check the text string to see if \\\"star-rating Two\\\" is in it. Either approach is fine (there are also many other alternative approaches!)\\n\",\n    \"\\n\",\n    \"Now let's see how we can get the title if we have a 2-star match:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[<a href=\\\"a-light-in-the-attic_1000/index.html\\\"><img alt=\\\"A Light in the Attic\\\" class=\\\"thumbnail\\\" src=\\\"../media/cache/2c/da/2cdad67c44b002e7ead0cc35693c0e8b.jpg\\\"/></a>,\\n\",\n       \" <a href=\\\"a-light-in-the-attic_1000/index.html\\\" title=\\\"A Light in the Attic\\\">A Light in the ...</a>]\"\n      ]\n     },\n     \"execution_count\": 41,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"example.select('a')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 42,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<a href=\\\"a-light-in-the-attic_1000/index.html\\\" title=\\\"A Light in the Attic\\\">A Light in the ...</a>\"\n      ]\n     },\n     \"execution_count\": 42,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"example.select('a')[1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 43,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'A Light in the Attic'\"\n      ]\n     },\n     \"execution_count\": 43,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"example.select('a')[1]['title']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Okay, let's give it a shot by combining all the ideas we've talked about! (this should take about 20-60 seconds to complete running. Be aware a firwall may prevent this script from running. Also if you are getting a no response error, maybe try adding a sleep step with time.sleep(1).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 44,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"two_star_titles = []\\n\",\n    \"\\n\",\n    \"for n in range(1,51):\\n\",\n    \"\\n\",\n    \"    scrape_url = base_url.format(n)\\n\",\n    \"    res = requests.get(scrape_url)\\n\",\n    \"    \\n\",\n    \"    soup = bs4.BeautifulSoup(res.text,\\\"lxml\\\")\\n\",\n    \"    books = soup.select(\\\".product_pod\\\")\\n\",\n    \"    \\n\",\n    \"    for book in books:\\n\",\n    \"        if len(book.select('.star-rating.Two')) != 0:\\n\",\n    \"            two_star_titles.append(book.select('a')[1]['title'])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 45,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['Starving Hearts (Triangular Trade Trilogy, #1)',\\n\",\n       \" 'Libertarianism for Beginners',\\n\",\n       \" \\\"It's Only the Himalayas\\\",\\n\",\n       \" 'How Music Works',\\n\",\n       \" 'Maude (1883-1993):She Grew Up with the country',\\n\",\n       \" \\\"You can't bury them all: Poems\\\",\\n\",\n       \" 'Reasons to Stay Alive',\\n\",\n       \" 'Without Borders (Wanderlove #1)',\\n\",\n       \" 'Soul Reader',\\n\",\n       \" 'Security',\\n\",\n       \" 'Saga, Volume 5 (Saga (Collected Editions) #5)',\\n\",\n       \" 'Reskilling America: Learning to Labor in the Twenty-First Century',\\n\",\n       \" 'Political Suicide: Missteps, Peccadilloes, Bad Calls, Backroom Hijinx, Sordid Pasts, Rotten Breaks, and Just Plain Dumb Mistakes in the Annals of American Politics',\\n\",\n       \" 'Obsidian (Lux #1)',\\n\",\n       \" 'My Paris Kitchen: Recipes and Stories',\\n\",\n       \" 'Masks and Shadows',\\n\",\n       \" 'Lumberjanes, Vol. 2: Friendship to the Max (Lumberjanes #5-8)',\\n\",\n       \" 'Lumberjanes Vol. 3: A Terrible Plan (Lumberjanes #9-12)',\\n\",\n       \" 'Judo: Seven Steps to Black Belt (an Introductory Guide for Beginners)',\\n\",\n       \" 'I Hate Fairyland, Vol. 1: Madly Ever After (I Hate Fairyland (Compilations) #1-5)',\\n\",\n       \" 'Giant Days, Vol. 2 (Giant Days #5-8)',\\n\",\n       \" 'Everydata: The Misinformation Hidden in the Little Data You Consume Every Day',\\n\",\n       \" \\\"Don't Be a Jerk: And Other Practical Advice from Dogen, Japan's Greatest Zen Master\\\",\\n\",\n       \" 'Bossypants',\\n\",\n       \" 'Bitch Planet, Vol. 1: Extraordinary Machine (Bitch Planet (Collected Editions))',\\n\",\n       \" 'Avatar: The Last Airbender: Smoke and Shadow, Part 3 (Smoke and Shadow #3)',\\n\",\n       \" 'Tuesday Nights in 1980',\\n\",\n       \" 'The Psychopath Test: A Journey Through the Madness Industry',\\n\",\n       \" 'The Power of Now: A Guide to Spiritual Enlightenment',\\n\",\n       \" \\\"The Omnivore's Dilemma: A Natural History of Four Meals\\\",\\n\",\n       \" 'The Love and Lemons Cookbook: An Apple-to-Zucchini Celebration of Impromptu Cooking',\\n\",\n       \" 'The Girl on the Train',\\n\",\n       \" 'The Emerald Mystery',\\n\",\n       \" 'The Argonauts',\\n\",\n       \" 'Suddenly in Love (Lake Haven #1)',\\n\",\n       \" 'Soft Apocalypse',\\n\",\n       \" \\\"So You've Been Publicly Shamed\\\",\\n\",\n       \" 'Shoe Dog: A Memoir by the Creator of NIKE',\\n\",\n       \" 'Louisa: The Extraordinary Life of Mrs. Adams',\\n\",\n       \" 'Large Print Heart of the Pride',\\n\",\n       \" 'Grumbles',\\n\",\n       \" 'Chasing Heaven: What Dying Taught Me About Living',\\n\",\n       \" 'Becoming Wise: An Inquiry into the Mystery and Art of Living',\\n\",\n       \" 'Beauty Restored (Riley Family Legacy Novellas #3)',\\n\",\n       \" 'Batman: The Long Halloween (Batman)',\\n\",\n       \" \\\"Ayumi's Violin\\\",\\n\",\n       \" 'Wild Swans',\\n\",\n       \" \\\"What's It Like in Space?: Stories from Astronauts Who've Been There\\\",\\n\",\n       \" 'Until Friday Night (The Field Party #1)',\\n\",\n       \" 'Unbroken: A World War II Story of Survival, Resilience, and Redemption',\\n\",\n       \" 'Twenty Yawns',\\n\",\n       \" 'Through the Woods',\\n\",\n       \" 'This Is Where It Ends',\\n\",\n       \" 'The Year of Magical Thinking',\\n\",\n       \" 'The Last Mile (Amos Decker #2)',\\n\",\n       \" 'The Immortal Life of Henrietta Lacks',\\n\",\n       \" 'The Hidden Oracle (The Trials of Apollo #1)',\\n\",\n       \" 'The Guilty (Will Robie #4)',\\n\",\n       \" 'Red Hood/Arsenal, Vol. 1: Open for Business (Red Hood/Arsenal #1)',\\n\",\n       \" 'Once Was a Time',\\n\",\n       \" 'No Dream Is Too High: Life Lessons From a Man Who Walked on the Moon',\\n\",\n       \" 'Naruto (3-in-1 Edition), Vol. 14: Includes Vols. 40, 41 & 42 (Naruto: Omnibus #14)',\\n\",\n       \" 'More Than Music (Chasing the Dream #1)',\\n\",\n       \" 'Lowriders to the Center of the Earth (Lowriders in Space #2)',\\n\",\n       \" 'Eat Fat, Get Thin',\\n\",\n       \" 'Doctor Sleep (The Shining #2)',\\n\",\n       \" 'Crazy Love: Overwhelmed by a Relentless God',\\n\",\n       \" 'Carrie',\\n\",\n       \" 'Batman: Europa',\\n\",\n       \" 'Angels Walking (Angels Walking #1)',\\n\",\n       \" 'Adulthood Is a Myth: A \\\"Sarah\\\\'s Scribbles\\\" Collection',\\n\",\n       \" 'A Study in Scarlet (Sherlock Holmes #1)',\\n\",\n       \" 'A Series of Catastrophes and Miracles: A True Story of Love, Science, and Cancer',\\n\",\n       \" \\\"A People's History of the United States\\\",\\n\",\n       \" 'My Kitchen Year: 136 Recipes That Saved My Life',\\n\",\n       \" 'The Lonely City: Adventures in the Art of Being Alone',\\n\",\n       \" 'The Dinner Party',\\n\",\n       \" 'Stars Above (The Lunar Chronicles #4.5)',\\n\",\n       \" 'Love, Lies and Spies',\\n\",\n       \" 'Troublemaker: Surviving Hollywood and Scientology',\\n\",\n       \" 'The Widow',\\n\",\n       \" 'Setting the World on Fire: The Brief, Astonishing Life of St. Catherine of Siena',\\n\",\n       \" 'Mothering Sunday',\\n\",\n       \" 'Lilac Girls',\\n\",\n       \" '10% Happier: How I Tamed the Voice in My Head, Reduced Stress Without Losing My Edge, and Found Self-Help That Actually Works',\\n\",\n       \" 'Underlying Notes',\\n\",\n       \" 'The Flowers Lied',\\n\",\n       \" 'Modern Day Fables',\\n\",\n       \" \\\"Chernobyl 01:23:40: The Incredible True Story of the World's Worst Nuclear Disaster\\\",\\n\",\n       \" '23 Degrees South: A Tropical Tale of Changing Whether...',\\n\",\n       \" 'When Breath Becomes Air',\\n\",\n       \" 'Vagabonding: An Uncommon Guide to the Art of Long-Term World Travel',\\n\",\n       \" 'The Martian (The Martian #1)',\\n\",\n       \" \\\"Miller's Valley\\\",\\n\",\n       \" \\\"Love That Boy: What Two Presidents, Eight Road Trips, and My Son Taught Me About a Parent's Expectations\\\",\\n\",\n       \" 'Left Behind (Left Behind #1)',\\n\",\n       \" 'Howl and Other Poems',\\n\",\n       \" \\\"Heaven is for Real: A Little Boy's Astounding Story of His Trip to Heaven and Back\\\",\\n\",\n       \" \\\"Brazen: The Courage to Find the You That's Been Hiding\\\",\\n\",\n       \" '32 Yolks',\\n\",\n       \" 'Wildlife of New York: A Five-Borough Coloring Book',\\n\",\n       \" 'Unreasonable Hope: Finding Faith in the God Who Brings Purpose to Your Pain',\\n\",\n       \" 'The Art Book',\\n\",\n       \" 'Steal Like an Artist: 10 Things Nobody Told You About Being Creative',\\n\",\n       \" 'Raymie Nightingale',\\n\",\n       \" 'Like Never Before (Walker Family #2)',\\n\",\n       \" 'How to Be a Domestic Goddess: Baking and the Art of Comfort Cooking',\\n\",\n       \" 'Finding God in the Ruins: How God Redeems Pain',\\n\",\n       \" 'Chronicles, Vol. 1',\\n\",\n       \" 'A Summer In Europe',\\n\",\n       \" 'The Rise and Fall of the Third Reich: A History of Nazi Germany',\\n\",\n       \" 'The Makings of a Fatherless Child',\\n\",\n       \" 'The Fellowship of the Ring (The Lord of the Rings #1)',\\n\",\n       \" \\\"Tell the Wolves I'm Home\\\",\\n\",\n       \" 'In the Woods (Dublin Murder Squad #1)',\\n\",\n       \" 'Give It Back',\\n\",\n       \" 'Why Save the Bankers?: And Other Essays on Our Economic and Political Crisis',\\n\",\n       \" 'The Raven King (The Raven Cycle #4)',\\n\",\n       \" 'The Expatriates',\\n\",\n       \" 'The 5th Wave (The 5th Wave #1)',\\n\",\n       \" 'Peak: Secrets from the New Science of Expertise',\\n\",\n       \" 'Logan Kade (Fallen Crest High #5.5)',\\n\",\n       \" \\\"I Know Why the Caged Bird Sings (Maya Angelou's Autobiography #1)\\\",\\n\",\n       \" 'Drama',\\n\",\n       \" \\\"America's War for the Greater Middle East: A Military History\\\",\\n\",\n       \" 'A Game of Thrones (A Song of Ice and Fire #1)',\\n\",\n       \" \\\"The Pilgrim's Progress\\\",\\n\",\n       \" 'The Hound of the Baskervilles (Sherlock Holmes #5)',\\n\",\n       \" \\\"The Geography of Bliss: One Grump's Search for the Happiest Places in the World\\\",\\n\",\n       \" 'The Demonists (Demonist #1)',\\n\",\n       \" 'The Demon Prince of Momochi House, Vol. 4 (The Demon Prince of Momochi House #4)',\\n\",\n       \" 'Misery',\\n\",\n       \" 'Far From True (Promise Falls Trilogy #2)',\\n\",\n       \" 'Confessions of a Shopaholic (Shopaholic #1)',\\n\",\n       \" 'Vegan Vegetarian Omnivore: Dinner for Everyone at the Table',\\n\",\n       \" 'Two Boys Kissing',\\n\",\n       \" 'Twilight (Twilight #1)',\\n\",\n       \" 'Twenties Girl',\\n\",\n       \" 'The Tipping Point: How Little Things Can Make a Big Difference',\\n\",\n       \" 'The Stand',\\n\",\n       \" 'The Picture of Dorian Gray',\\n\",\n       \" 'The Name of God is Mercy',\\n\",\n       \" \\\"The Lover's Dictionary\\\",\\n\",\n       \" 'The Last Painting of Sara de Vos',\\n\",\n       \" 'The Guns of August',\\n\",\n       \" 'The Girl Who Played with Fire (Millennium Trilogy #2)',\\n\",\n       \" 'The Da Vinci Code (Robert Langdon #2)',\\n\",\n       \" 'The Cat in the Hat (Beginner Books B-1)',\\n\",\n       \" 'The Book Thief',\\n\",\n       \" 'The Autobiography of Malcolm X',\\n\",\n       \" \\\"Surely You're Joking, Mr. Feynman!: Adventures of a Curious Character\\\",\\n\",\n       \" 'Soldier (Talon #3)',\\n\",\n       \" 'Shopaholic & Baby (Shopaholic #5)',\\n\",\n       \" 'Seven Days in the Art World',\\n\",\n       \" 'Rework',\\n\",\n       \" 'Packing for Mars: The Curious Science of Life in the Void',\\n\",\n       \" 'Orange Is the New Black',\\n\",\n       \" 'One for the Money (Stephanie Plum #1)',\\n\",\n       \" 'Midnight Riot (Peter Grant/ Rivers of London - books #1)',\\n\",\n       \" 'Me Talk Pretty One Day',\\n\",\n       \" 'Manuscript Found in Accra',\\n\",\n       \" 'Lust & Wonder',\\n\",\n       \" \\\"Life, the Universe and Everything (Hitchhiker's Guide to the Galaxy #3)\\\",\\n\",\n       \" 'Life After Life',\\n\",\n       \" 'I Am Malala: The Girl Who Stood Up for Education and Was Shot by the Taliban',\\n\",\n       \" 'House of Lost Worlds: Dinosaurs, Dynasties, and the Story of Life on Earth',\\n\",\n       \" 'Horrible Bear!',\\n\",\n       \" 'Holidays on Ice',\\n\",\n       \" 'Girl in the Blue Coat',\\n\",\n       \" 'Fruits Basket, Vol. 3 (Fruits Basket #3)',\\n\",\n       \" 'Cosmos',\\n\",\n       \" 'Civilization and Its Discontents',\\n\",\n       \" \\\"Catastrophic Happiness: Finding Joy in Childhood's Messy Years\\\",\\n\",\n       \" 'Career of Evil (Cormoran Strike #3)',\\n\",\n       \" 'Born to Run: A Hidden Tribe, Superathletes, and the Greatest Race the World Has Never Seen',\\n\",\n       \" \\\"Best of My Love (Fool's Gold #20)\\\",\\n\",\n       \" 'Beowulf',\\n\",\n       \" 'Awkward',\\n\",\n       \" 'And Then There Were None',\\n\",\n       \" 'A Storm of Swords (A Song of Ice and Fire #3)',\\n\",\n       \" 'The Suffragettes (Little Black Classics, #96)',\\n\",\n       \" 'Vampire Girl (Vampire Girl #1)',\\n\",\n       \" 'Three Wishes (River of Time: California #1)',\\n\",\n       \" 'The Wicked + The Divine, Vol. 1: The Faust Act (The Wicked + The Divine)',\\n\",\n       \" 'The Little Prince',\\n\",\n       \" 'The Last Girl (The Dominion Trilogy #1)',\\n\",\n       \" 'Taking Shots (Assassins #1)',\\n\",\n       \" 'Settling the Score (The Summer Games #1)',\\n\",\n       \" 'Rhythm, Chord & Malykhin',\\n\",\n       \" 'One Second (Seven #7)',\\n\",\n       \" \\\"Old Records Never Die: One Man's Quest for His Vinyl and His Past\\\",\\n\",\n       \" 'Of Mice and Men',\\n\",\n       \" 'My Perfect Mistake (Over the Top #1)',\\n\",\n       \" 'Meditations',\\n\",\n       \" 'Frankenstein',\\n\",\n       \" 'Emma']\"\n      ]\n     },\n     \"execution_count\": 45,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"two_star_titles\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"** Excellent! You should now have the tools necessary to scrape any websites that interest you! Keep in mind, the more complex the website, the harder it will be to scrape. Always ask for permission! **\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"anaconda-cloud\": {},\n  \"kernelspec\": {\n   \"display_name\": \"Python [conda env:base] *\",\n   \"language\": \"python\",\n   \"name\": \"conda-base-py\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.12.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "13-Web-Scraping/01-Web-Scraping-Exercises.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Web Scraping Exercises \\n\",\n    \"\\n\",\n    \"## Complete the Tasks Below\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Import any libraries you think you'll need to scrape a website.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Use requests library and BeautifulSoup to connect to http://quotes.toscrape.com/ and get the HMTL text from the homepage.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'<!DOCTYPE html>\\\\n<html lang=\\\"en\\\">\\\\n<head>\\\\n\\\\t<meta charset=\\\"UTF-8\\\">\\\\n\\\\t<title>Quotes to Scrape</title>\\\\n    <link rel=\\\"stylesheet\\\" href=\\\"/static/bootstrap.min.css\\\">\\\\n    <link rel=\\\"stylesheet\\\" href=\\\"/static/main.css\\\">\\\\n</head>\\\\n<body>\\\\n    <div class=\\\"container\\\">\\\\n        <div class=\\\"row header-box\\\">\\\\n            <div class=\\\"col-md-8\\\">\\\\n                <h1>\\\\n                    <a href=\\\"/\\\" style=\\\"text-decoration: none\\\">Quotes to Scrape</a>\\\\n                </h1>\\\\n            </div>\\\\n            <div class=\\\"col-md-4\\\">\\\\n                <p>\\\\n                \\\\n                    <a href=\\\"/login\\\">Login</a>\\\\n                \\\\n                </p>\\\\n            </div>\\\\n        </div>\\\\n    \\\\n\\\\n<div class=\\\"row\\\">\\\\n    <div class=\\\"col-md-8\\\">\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Albert Einstein</small>\\\\n        <a href=\\\"/author/Albert-Einstein\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"change,deep-thoughts,thinking,world\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/change/page/1/\\\">change</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/deep-thoughts/page/1/\\\">deep-thoughts</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/thinking/page/1/\\\">thinking</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/world/page/1/\\\">world</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“It is our choices, Harry, that show what we truly are, far more than our abilities.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">J.K. Rowling</small>\\\\n        <a href=\\\"/author/J-K-Rowling\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"abilities,choices\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/abilities/page/1/\\\">abilities</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/choices/page/1/\\\">choices</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Albert Einstein</small>\\\\n        <a href=\\\"/author/Albert-Einstein\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"inspirational,life,live,miracle,miracles\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/inspirational/page/1/\\\">inspirational</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/life/page/1/\\\">life</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/live/page/1/\\\">live</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/miracle/page/1/\\\">miracle</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/miracles/page/1/\\\">miracles</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Jane Austen</small>\\\\n        <a href=\\\"/author/Jane-Austen\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"aliteracy,books,classic,humor\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/aliteracy/page/1/\\\">aliteracy</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/books/page/1/\\\">books</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/classic/page/1/\\\">classic</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/humor/page/1/\\\">humor</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“Imperfection is beauty, madness is genius and it&#39;s better to be absolutely ridiculous than absolutely boring.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Marilyn Monroe</small>\\\\n        <a href=\\\"/author/Marilyn-Monroe\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"be-yourself,inspirational\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/be-yourself/page/1/\\\">be-yourself</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/inspirational/page/1/\\\">inspirational</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“Try not to become a man of success. Rather become a man of value.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Albert Einstein</small>\\\\n        <a href=\\\"/author/Albert-Einstein\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"adulthood,success,value\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/adulthood/page/1/\\\">adulthood</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/success/page/1/\\\">success</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/value/page/1/\\\">value</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“It is better to be hated for what you are than to be loved for what you are not.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">André Gide</small>\\\\n        <a href=\\\"/author/Andre-Gide\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"life,love\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/life/page/1/\\\">life</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/love/page/1/\\\">love</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“I have not failed. I&#39;ve just found 10,000 ways that won&#39;t work.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Thomas A. Edison</small>\\\\n        <a href=\\\"/author/Thomas-A-Edison\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"edison,failure,inspirational,paraphrased\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/edison/page/1/\\\">edison</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/failure/page/1/\\\">failure</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/inspirational/page/1/\\\">inspirational</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/paraphrased/page/1/\\\">paraphrased</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“A woman is like a tea bag; you never know how strong it is until it&#39;s in hot water.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Eleanor Roosevelt</small>\\\\n        <a href=\\\"/author/Eleanor-Roosevelt\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"misattributed-eleanor-roosevelt\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/misattributed-eleanor-roosevelt/page/1/\\\">misattributed-eleanor-roosevelt</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“A day without sunshine is like, you know, night.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Steve Martin</small>\\\\n        <a href=\\\"/author/Steve-Martin\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"humor,obvious,simile\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/humor/page/1/\\\">humor</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/obvious/page/1/\\\">obvious</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/simile/page/1/\\\">simile</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <nav>\\\\n        <ul class=\\\"pager\\\">\\\\n            \\\\n            \\\\n            <li class=\\\"next\\\">\\\\n                <a href=\\\"/page/2/\\\">Next <span aria-hidden=\\\"true\\\">&rarr;</span></a>\\\\n            </li>\\\\n            \\\\n        </ul>\\\\n    </nav>\\\\n    </div>\\\\n    <div class=\\\"col-md-4 tags-box\\\">\\\\n        \\\\n            <h2>Top Ten tags</h2>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 28px\\\" href=\\\"/tag/love/\\\">love</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 26px\\\" href=\\\"/tag/inspirational/\\\">inspirational</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 26px\\\" href=\\\"/tag/life/\\\">life</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 24px\\\" href=\\\"/tag/humor/\\\">humor</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 22px\\\" href=\\\"/tag/books/\\\">books</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 14px\\\" href=\\\"/tag/reading/\\\">reading</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 10px\\\" href=\\\"/tag/friendship/\\\">friendship</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 8px\\\" href=\\\"/tag/friends/\\\">friends</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 8px\\\" href=\\\"/tag/truth/\\\">truth</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 6px\\\" href=\\\"/tag/simile/\\\">simile</a>\\\\n            </span>\\\\n            \\\\n        \\\\n    </div>\\\\n</div>\\\\n\\\\n    </div>\\\\n    <footer class=\\\"footer\\\">\\\\n        <div class=\\\"container\\\">\\\\n            <p class=\\\"text-muted\\\">\\\\n                Quotes by: <a href=\\\"https://www.goodreads.com/quotes\\\">GoodReads.com</a>\\\\n            </p>\\\\n            <p class=\\\"copyright\\\">\\\\n                Made with <span class=\\\\'sh-red\\\\'>❤</span> by <a href=\\\"https://scrapinghub.com\\\">Scrapinghub</a>\\\\n            </p>\\\\n        </div>\\\\n    </footer>\\\\n</body>\\\\n</html>'\"\n      ]\n     },\n     \"execution_count\": 32,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Get the names of all the authors on the first page.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'Albert Einstein',\\n\",\n       \" 'André Gide',\\n\",\n       \" 'Eleanor Roosevelt',\\n\",\n       \" 'J.K. Rowling',\\n\",\n       \" 'Jane Austen',\\n\",\n       \" 'Marilyn Monroe',\\n\",\n       \" 'Steve Martin',\\n\",\n       \" 'Thomas A. Edison'}\"\n      ]\n     },\n     \"execution_count\": 37,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"authors\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Create a list of all the quotes on the first page.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”',\\n\",\n       \" '“It is our choices, Harry, that show what we truly are, far more than our abilities.”',\\n\",\n       \" '“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”',\\n\",\n       \" '“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”',\\n\",\n       \" \\\"“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”\\\",\\n\",\n       \" '“Try not to become a man of success. Rather become a man of value.”',\\n\",\n       \" '“It is better to be hated for what you are than to be loved for what you are not.”',\\n\",\n       \" \\\"“I have not failed. I've just found 10,000 ways that won't work.”\\\",\\n\",\n       \" \\\"“A woman is like a tea bag; you never know how strong it is until it's in hot water.”\\\",\\n\",\n       \" '“A day without sunshine is like, you know, night.”']\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"quotes\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Inspect the site and use Beautiful Soup to extract the top ten tags from the requests text shown on the top right from the home page (e.g Love,Inspirational,Life, etc...). HINT: Keep in mind there are also tags underneath each quote, try to find a class only present in the top right tags, perhaps check the span.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\n\",\n      \"love\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"inspirational\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"life\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"humor\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"books\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"reading\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"friendship\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"friends\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"truth\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"simile\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Notice how there is more than one page, and subsequent pages look like this http://quotes.toscrape.com/page/2/. Use what you know about for loops and string concatenation to loop through all the pages and get all the unique authors on the website. Keep in mind there are many ways to achieve this, also note that you will need to somehow figure out how to check that your loop is on the last page with quotes. For debugging purposes, I will let you know that there are only 10 pages, so the last page is http://quotes.toscrape.com/page/10/, but try to create a loop that is robust enough that it wouldn't matter to know the amount of pages beforehand, perhaps use try/except for this, its up to you!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There are lots of other potential solutions that are even more robust and flexible, the main idea is the same though, use a while loop to cycle through potential pages and have a break condition based on the invalid page.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "13-Web-Scraping/02-Web-Scraping-Exercise-Solutions.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Web Scraping Exercises - Solutions\\n\",\n    \"\\n\",\n    \"## Complete the Tasks Below\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Import any libraries you think you'll need to scrape a website.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import requests\\n\",\n    \"import bs4\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Use requests library and BeautifulSoup to connect to http://quotes.toscrape.com/ and get the HMTL text from the homepage.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"res = requests.get(\\\"http://quotes.toscrape.com/\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'<!DOCTYPE html>\\\\n<html lang=\\\"en\\\">\\\\n<head>\\\\n\\\\t<meta charset=\\\"UTF-8\\\">\\\\n\\\\t<title>Quotes to Scrape</title>\\\\n    <link rel=\\\"stylesheet\\\" href=\\\"/static/bootstrap.min.css\\\">\\\\n    <link rel=\\\"stylesheet\\\" href=\\\"/static/main.css\\\">\\\\n</head>\\\\n<body>\\\\n    <div class=\\\"container\\\">\\\\n        <div class=\\\"row header-box\\\">\\\\n            <div class=\\\"col-md-8\\\">\\\\n                <h1>\\\\n                    <a href=\\\"/\\\" style=\\\"text-decoration: none\\\">Quotes to Scrape</a>\\\\n                </h1>\\\\n            </div>\\\\n            <div class=\\\"col-md-4\\\">\\\\n                <p>\\\\n                \\\\n                    <a href=\\\"/login\\\">Login</a>\\\\n                \\\\n                </p>\\\\n            </div>\\\\n        </div>\\\\n    \\\\n\\\\n<div class=\\\"row\\\">\\\\n    <div class=\\\"col-md-8\\\">\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Albert Einstein</small>\\\\n        <a href=\\\"/author/Albert-Einstein\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"change,deep-thoughts,thinking,world\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/change/page/1/\\\">change</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/deep-thoughts/page/1/\\\">deep-thoughts</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/thinking/page/1/\\\">thinking</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/world/page/1/\\\">world</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“It is our choices, Harry, that show what we truly are, far more than our abilities.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">J.K. Rowling</small>\\\\n        <a href=\\\"/author/J-K-Rowling\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"abilities,choices\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/abilities/page/1/\\\">abilities</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/choices/page/1/\\\">choices</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Albert Einstein</small>\\\\n        <a href=\\\"/author/Albert-Einstein\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"inspirational,life,live,miracle,miracles\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/inspirational/page/1/\\\">inspirational</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/life/page/1/\\\">life</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/live/page/1/\\\">live</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/miracle/page/1/\\\">miracle</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/miracles/page/1/\\\">miracles</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Jane Austen</small>\\\\n        <a href=\\\"/author/Jane-Austen\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"aliteracy,books,classic,humor\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/aliteracy/page/1/\\\">aliteracy</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/books/page/1/\\\">books</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/classic/page/1/\\\">classic</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/humor/page/1/\\\">humor</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“Imperfection is beauty, madness is genius and it&#39;s better to be absolutely ridiculous than absolutely boring.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Marilyn Monroe</small>\\\\n        <a href=\\\"/author/Marilyn-Monroe\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"be-yourself,inspirational\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/be-yourself/page/1/\\\">be-yourself</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/inspirational/page/1/\\\">inspirational</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“Try not to become a man of success. Rather become a man of value.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Albert Einstein</small>\\\\n        <a href=\\\"/author/Albert-Einstein\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"adulthood,success,value\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/adulthood/page/1/\\\">adulthood</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/success/page/1/\\\">success</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/value/page/1/\\\">value</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“It is better to be hated for what you are than to be loved for what you are not.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">André Gide</small>\\\\n        <a href=\\\"/author/Andre-Gide\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"life,love\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/life/page/1/\\\">life</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/love/page/1/\\\">love</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“I have not failed. I&#39;ve just found 10,000 ways that won&#39;t work.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Thomas A. Edison</small>\\\\n        <a href=\\\"/author/Thomas-A-Edison\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"edison,failure,inspirational,paraphrased\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/edison/page/1/\\\">edison</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/failure/page/1/\\\">failure</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/inspirational/page/1/\\\">inspirational</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/paraphrased/page/1/\\\">paraphrased</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“A woman is like a tea bag; you never know how strong it is until it&#39;s in hot water.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Eleanor Roosevelt</small>\\\\n        <a href=\\\"/author/Eleanor-Roosevelt\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"misattributed-eleanor-roosevelt\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/misattributed-eleanor-roosevelt/page/1/\\\">misattributed-eleanor-roosevelt</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <div class=\\\"quote\\\" itemscope itemtype=\\\"http://schema.org/CreativeWork\\\">\\\\n        <span class=\\\"text\\\" itemprop=\\\"text\\\">“A day without sunshine is like, you know, night.”</span>\\\\n        <span>by <small class=\\\"author\\\" itemprop=\\\"author\\\">Steve Martin</small>\\\\n        <a href=\\\"/author/Steve-Martin\\\">(about)</a>\\\\n        </span>\\\\n        <div class=\\\"tags\\\">\\\\n            Tags:\\\\n            <meta class=\\\"keywords\\\" itemprop=\\\"keywords\\\" content=\\\"humor,obvious,simile\\\" /    > \\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/humor/page/1/\\\">humor</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/obvious/page/1/\\\">obvious</a>\\\\n            \\\\n            <a class=\\\"tag\\\" href=\\\"/tag/simile/page/1/\\\">simile</a>\\\\n            \\\\n        </div>\\\\n    </div>\\\\n\\\\n    <nav>\\\\n        <ul class=\\\"pager\\\">\\\\n            \\\\n            \\\\n            <li class=\\\"next\\\">\\\\n                <a href=\\\"/page/2/\\\">Next <span aria-hidden=\\\"true\\\">&rarr;</span></a>\\\\n            </li>\\\\n            \\\\n        </ul>\\\\n    </nav>\\\\n    </div>\\\\n    <div class=\\\"col-md-4 tags-box\\\">\\\\n        \\\\n            <h2>Top Ten tags</h2>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 28px\\\" href=\\\"/tag/love/\\\">love</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 26px\\\" href=\\\"/tag/inspirational/\\\">inspirational</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 26px\\\" href=\\\"/tag/life/\\\">life</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 24px\\\" href=\\\"/tag/humor/\\\">humor</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 22px\\\" href=\\\"/tag/books/\\\">books</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 14px\\\" href=\\\"/tag/reading/\\\">reading</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 10px\\\" href=\\\"/tag/friendship/\\\">friendship</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 8px\\\" href=\\\"/tag/friends/\\\">friends</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 8px\\\" href=\\\"/tag/truth/\\\">truth</a>\\\\n            </span>\\\\n            \\\\n            <span class=\\\"tag-item\\\">\\\\n            <a class=\\\"tag\\\" style=\\\"font-size: 6px\\\" href=\\\"/tag/simile/\\\">simile</a>\\\\n            </span>\\\\n            \\\\n        \\\\n    </div>\\\\n</div>\\\\n\\\\n    </div>\\\\n    <footer class=\\\"footer\\\">\\\\n        <div class=\\\"container\\\">\\\\n            <p class=\\\"text-muted\\\">\\\\n                Quotes by: <a href=\\\"https://www.goodreads.com/quotes\\\">GoodReads.com</a>\\\\n            </p>\\\\n            <p class=\\\"copyright\\\">\\\\n                Made with <span class=\\\\'sh-red\\\\'>❤</span> by <a href=\\\"https://scrapinghub.com\\\">Scrapinghub</a>\\\\n            </p>\\\\n        </div>\\\\n    </footer>\\\\n</body>\\\\n</html>'\"\n      ]\n     },\n     \"execution_count\": 32,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"res.text\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Get the names of all the authors on the first page.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"soup = bs4.BeautifulSoup(res.text,'lxml')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[<small class=\\\"author\\\" itemprop=\\\"author\\\">Albert Einstein</small>,\\n\",\n       \" <small class=\\\"author\\\" itemprop=\\\"author\\\">J.K. Rowling</small>,\\n\",\n       \" <small class=\\\"author\\\" itemprop=\\\"author\\\">Albert Einstein</small>,\\n\",\n       \" <small class=\\\"author\\\" itemprop=\\\"author\\\">Jane Austen</small>,\\n\",\n       \" <small class=\\\"author\\\" itemprop=\\\"author\\\">Marilyn Monroe</small>,\\n\",\n       \" <small class=\\\"author\\\" itemprop=\\\"author\\\">Albert Einstein</small>,\\n\",\n       \" <small class=\\\"author\\\" itemprop=\\\"author\\\">André Gide</small>,\\n\",\n       \" <small class=\\\"author\\\" itemprop=\\\"author\\\">Thomas A. Edison</small>,\\n\",\n       \" <small class=\\\"author\\\" itemprop=\\\"author\\\">Eleanor Roosevelt</small>,\\n\",\n       \" <small class=\\\"author\\\" itemprop=\\\"author\\\">Steve Martin</small>]\"\n      ]\n     },\n     \"execution_count\": 35,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"soup.select(\\\".author\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# I used a set to not worry about repeat authors.\\n\",\n    \"authors = set() \\n\",\n    \"for name in soup.select(\\\".author\\\"):\\n\",\n    \"    authors.add(name.text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'Albert Einstein',\\n\",\n       \" 'André Gide',\\n\",\n       \" 'Eleanor Roosevelt',\\n\",\n       \" 'J.K. Rowling',\\n\",\n       \" 'Jane Austen',\\n\",\n       \" 'Marilyn Monroe',\\n\",\n       \" 'Steve Martin',\\n\",\n       \" 'Thomas A. Edison'}\"\n      ]\n     },\n     \"execution_count\": 37,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"authors\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Create a list of all the quotes on the first page.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"#CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"quotes = []\\n\",\n    \"for quote in soup.select(\\\".text\\\"):\\n\",\n    \"    quotes.append(quote.text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”',\\n\",\n       \" '“It is our choices, Harry, that show what we truly are, far more than our abilities.”',\\n\",\n       \" '“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”',\\n\",\n       \" '“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”',\\n\",\n       \" \\\"“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”\\\",\\n\",\n       \" '“Try not to become a man of success. Rather become a man of value.”',\\n\",\n       \" '“It is better to be hated for what you are than to be loved for what you are not.”',\\n\",\n       \" \\\"“I have not failed. I've just found 10,000 ways that won't work.”\\\",\\n\",\n       \" \\\"“A woman is like a tea bag; you never know how strong it is until it's in hot water.”\\\",\\n\",\n       \" '“A day without sunshine is like, you know, night.”']\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"quotes\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Inspect the site and use Beautiful Soup to extract the top ten tags from the requests text shown on the top right from the home page (e.g Love,Inspirational,Life, etc...). HINT: Keep in mind there are also tags underneath each quote, try to find a class only present in the top right tags, perhaps check the span.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"soup = bs4.BeautifulSoup(res.text,'lxml')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[<span class=\\\"tag-item\\\">\\n\",\n       \" <a class=\\\"tag\\\" href=\\\"/tag/love/\\\" style=\\\"font-size: 28px\\\">love</a>\\n\",\n       \" </span>, <span class=\\\"tag-item\\\">\\n\",\n       \" <a class=\\\"tag\\\" href=\\\"/tag/inspirational/\\\" style=\\\"font-size: 26px\\\">inspirational</a>\\n\",\n       \" </span>, <span class=\\\"tag-item\\\">\\n\",\n       \" <a class=\\\"tag\\\" href=\\\"/tag/life/\\\" style=\\\"font-size: 26px\\\">life</a>\\n\",\n       \" </span>, <span class=\\\"tag-item\\\">\\n\",\n       \" <a class=\\\"tag\\\" href=\\\"/tag/humor/\\\" style=\\\"font-size: 24px\\\">humor</a>\\n\",\n       \" </span>, <span class=\\\"tag-item\\\">\\n\",\n       \" <a class=\\\"tag\\\" href=\\\"/tag/books/\\\" style=\\\"font-size: 22px\\\">books</a>\\n\",\n       \" </span>, <span class=\\\"tag-item\\\">\\n\",\n       \" <a class=\\\"tag\\\" href=\\\"/tag/reading/\\\" style=\\\"font-size: 14px\\\">reading</a>\\n\",\n       \" </span>, <span class=\\\"tag-item\\\">\\n\",\n       \" <a class=\\\"tag\\\" href=\\\"/tag/friendship/\\\" style=\\\"font-size: 10px\\\">friendship</a>\\n\",\n       \" </span>, <span class=\\\"tag-item\\\">\\n\",\n       \" <a class=\\\"tag\\\" href=\\\"/tag/friends/\\\" style=\\\"font-size: 8px\\\">friends</a>\\n\",\n       \" </span>, <span class=\\\"tag-item\\\">\\n\",\n       \" <a class=\\\"tag\\\" href=\\\"/tag/truth/\\\" style=\\\"font-size: 8px\\\">truth</a>\\n\",\n       \" </span>, <span class=\\\"tag-item\\\">\\n\",\n       \" <a class=\\\"tag\\\" href=\\\"/tag/simile/\\\" style=\\\"font-size: 6px\\\">simile</a>\\n\",\n       \" </span>]\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"soup.select('.tag-item')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\n\",\n      \"love\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"inspirational\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"life\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"humor\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"books\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"reading\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"friendship\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"friends\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"truth\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"simile\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for item in soup.select(\\\".tag-item\\\"):\\n\",\n    \"    print(item.text)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**TASK: Notice how there is more than one page, and subsequent pages look like this http://quotes.toscrape.com/page/2/. Use what you know about for loops and string concatenation to loop through all the pages and get all the unique authors on the website. Keep in mind there are many ways to achieve this, also note that you will need to somehow figure out how to check that your loop is on the last page with quotes. For debugging purposes, I will let you know that there are only 10 pages, so the last page is http://quotes.toscrape.com/page/10/, but try to create a loop that is robust enough that it wouldn't matter to know the amount of pages beforehand, perhaps use try/except for this, its up to you!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# CODE HERE\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Possible Solution #1 ( Assuming You Know Number of Pages)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"url = 'http://quotes.toscrape.com/page/'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 40,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"authors = set()\\n\",\n    \"\\n\",\n    \"for page in range(1,10):\\n\",\n    \"\\n\",\n    \"    # Concatenate to get new page URL\\n\",\n    \"    page_url = url+str(page)\\n\",\n    \"    # Obtain Request\\n\",\n    \"    res = requests.get(page_url)\\n\",\n    \"    # Turn into Soup\\n\",\n    \"    soup = bs4.BeautifulSoup(res.text,'lxml')\\n\",\n    \"    # Add Authors to our set\\n\",\n    \"    for name in soup.select(\\\".author\\\"):\\n\",\n    \"        authors.add(name.text)\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Possible Solution #2 ( Unknown Number of Pages, but knowledge of last page)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's check what the last invalid page looks like:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Choose some huge page number we know doesn't exist\\n\",\n    \"page_url = url+str(9999999)\\n\",\n    \"\\n\",\n    \"# Obtain Request\\n\",\n    \"res = requests.get(page_url)\\n\",\n    \"\\n\",\n    \"# Turn into Soup\\n\",\n    \"soup = bs4.BeautifulSoup(res.text,'lxml')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 46,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<!DOCTYPE html>\\n\",\n       \"<html lang=\\\"en\\\">\\n\",\n       \"<head>\\n\",\n       \"<meta charset=\\\"utf-8\\\"/>\\n\",\n       \"<title>Quotes to Scrape</title>\\n\",\n       \"<link href=\\\"/static/bootstrap.min.css\\\" rel=\\\"stylesheet\\\"/>\\n\",\n       \"<link href=\\\"/static/main.css\\\" rel=\\\"stylesheet\\\"/>\\n\",\n       \"</head>\\n\",\n       \"<body>\\n\",\n       \"<div class=\\\"container\\\">\\n\",\n       \"<div class=\\\"row header-box\\\">\\n\",\n       \"<div class=\\\"col-md-8\\\">\\n\",\n       \"<h1>\\n\",\n       \"<a href=\\\"/\\\" style=\\\"text-decoration: none\\\">Quotes to Scrape</a>\\n\",\n       \"</h1>\\n\",\n       \"</div>\\n\",\n       \"<div class=\\\"col-md-4\\\">\\n\",\n       \"<p>\\n\",\n       \"<a href=\\\"/login\\\">Login</a>\\n\",\n       \"</p>\\n\",\n       \"</div>\\n\",\n       \"</div>\\n\",\n       \"<div class=\\\"row\\\">\\n\",\n       \"<div class=\\\"col-md-8\\\">\\n\",\n       \"\\n\",\n       \"No quotes found!\\n\",\n       \"\\n\",\n       \"    <nav>\\n\",\n       \"<ul class=\\\"pager\\\">\\n\",\n       \"<li class=\\\"previous\\\">\\n\",\n       \"<a href=\\\"/page/9999998/\\\"><span aria-hidden=\\\"true\\\">←</span> Previous</a>\\n\",\n       \"</li>\\n\",\n       \"</ul>\\n\",\n       \"</nav>\\n\",\n       \"</div>\\n\",\n       \"<div class=\\\"col-md-4 tags-box\\\">\\n\",\n       \"<h2>Top Ten tags</h2>\\n\",\n       \"<span class=\\\"tag-item\\\">\\n\",\n       \"<a class=\\\"tag\\\" href=\\\"/tag/love/\\\" style=\\\"font-size: 28px\\\">love</a>\\n\",\n       \"</span>\\n\",\n       \"<span class=\\\"tag-item\\\">\\n\",\n       \"<a class=\\\"tag\\\" href=\\\"/tag/inspirational/\\\" style=\\\"font-size: 26px\\\">inspirational</a>\\n\",\n       \"</span>\\n\",\n       \"<span class=\\\"tag-item\\\">\\n\",\n       \"<a class=\\\"tag\\\" href=\\\"/tag/life/\\\" style=\\\"font-size: 26px\\\">life</a>\\n\",\n       \"</span>\\n\",\n       \"<span class=\\\"tag-item\\\">\\n\",\n       \"<a class=\\\"tag\\\" href=\\\"/tag/humor/\\\" style=\\\"font-size: 24px\\\">humor</a>\\n\",\n       \"</span>\\n\",\n       \"<span class=\\\"tag-item\\\">\\n\",\n       \"<a class=\\\"tag\\\" href=\\\"/tag/books/\\\" style=\\\"font-size: 22px\\\">books</a>\\n\",\n       \"</span>\\n\",\n       \"<span class=\\\"tag-item\\\">\\n\",\n       \"<a class=\\\"tag\\\" href=\\\"/tag/reading/\\\" style=\\\"font-size: 14px\\\">reading</a>\\n\",\n       \"</span>\\n\",\n       \"<span class=\\\"tag-item\\\">\\n\",\n       \"<a class=\\\"tag\\\" href=\\\"/tag/friendship/\\\" style=\\\"font-size: 10px\\\">friendship</a>\\n\",\n       \"</span>\\n\",\n       \"<span class=\\\"tag-item\\\">\\n\",\n       \"<a class=\\\"tag\\\" href=\\\"/tag/friends/\\\" style=\\\"font-size: 8px\\\">friends</a>\\n\",\n       \"</span>\\n\",\n       \"<span class=\\\"tag-item\\\">\\n\",\n       \"<a class=\\\"tag\\\" href=\\\"/tag/truth/\\\" style=\\\"font-size: 8px\\\">truth</a>\\n\",\n       \"</span>\\n\",\n       \"<span class=\\\"tag-item\\\">\\n\",\n       \"<a class=\\\"tag\\\" href=\\\"/tag/simile/\\\" style=\\\"font-size: 6px\\\">simile</a>\\n\",\n       \"</span>\\n\",\n       \"</div>\\n\",\n       \"</div>\\n\",\n       \"</div>\\n\",\n       \"<footer class=\\\"footer\\\">\\n\",\n       \"<div class=\\\"container\\\">\\n\",\n       \"<p class=\\\"text-muted\\\">\\n\",\n       \"                Quotes by: <a href=\\\"https://www.goodreads.com/quotes\\\">GoodReads.com</a>\\n\",\n       \"</p>\\n\",\n       \"<p class=\\\"copyright\\\">\\n\",\n       \"                Made with <span class=\\\"sh-red\\\">❤</span> by <a href=\\\"https://scrapinghub.com\\\">Scrapinghub</a>\\n\",\n       \"</p>\\n\",\n       \"</div>\\n\",\n       \"</footer>\\n\",\n       \"</body>\\n\",\n       \"</html>\"\n      ]\n     },\n     \"execution_count\": 46,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"soup\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 47,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 47,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# This solution requires that the string \\\"No quotes found!\\\" only occurs on the last page.\\n\",\n    \"# If for some reason this string was on the other pages, we would need to be more detailed.\\n\",\n    \"\\\"No quotes found!\\\" in res.text\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 48,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"page_still_valid = True\\n\",\n    \"authors = set()\\n\",\n    \"page = 1\\n\",\n    \"\\n\",\n    \"while page_still_valid:\\n\",\n    \"\\n\",\n    \"    # Concatenate to get new page URL\\n\",\n    \"    page_url = url+str(page)\\n\",\n    \"    \\n\",\n    \"    # Obtain Request\\n\",\n    \"    res = requests.get(page_url)\\n\",\n    \"    \\n\",\n    \"    # Check to see if we're on the last page\\n\",\n    \"    if \\\"No quotes found!\\\" in res.text:\\n\",\n    \"        break\\n\",\n    \"    \\n\",\n    \"    # Turn into Soup\\n\",\n    \"    soup = bs4.BeautifulSoup(res.text,'lxml')\\n\",\n    \"    \\n\",\n    \"    # Add Authors to our set\\n\",\n    \"    for name in soup.select(\\\".author\\\"):\\n\",\n    \"        authors.add(name.text)\\n\",\n    \"        \\n\",\n    \"    # Go to Next Page\\n\",\n    \"    page += 1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 49,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'Albert Einstein',\\n\",\n       \" 'Alexandre Dumas fils',\\n\",\n       \" 'Alfred Tennyson',\\n\",\n       \" 'Allen Saunders',\\n\",\n       \" 'André Gide',\\n\",\n       \" 'Ayn Rand',\\n\",\n       \" 'Bob Marley',\\n\",\n       \" 'C.S. Lewis',\\n\",\n       \" 'Charles Bukowski',\\n\",\n       \" 'Charles M. Schulz',\\n\",\n       \" 'Douglas Adams',\\n\",\n       \" 'Dr. Seuss',\\n\",\n       \" 'E.E. Cummings',\\n\",\n       \" 'Eleanor Roosevelt',\\n\",\n       \" 'Elie Wiesel',\\n\",\n       \" 'Ernest Hemingway',\\n\",\n       \" 'Friedrich Nietzsche',\\n\",\n       \" 'Garrison Keillor',\\n\",\n       \" 'George Bernard Shaw',\\n\",\n       \" 'George Carlin',\\n\",\n       \" 'George Eliot',\\n\",\n       \" 'George R.R. Martin',\\n\",\n       \" 'Harper Lee',\\n\",\n       \" 'Haruki Murakami',\\n\",\n       \" 'Helen Keller',\\n\",\n       \" 'J.D. Salinger',\\n\",\n       \" 'J.K. Rowling',\\n\",\n       \" 'J.M. Barrie',\\n\",\n       \" 'J.R.R. Tolkien',\\n\",\n       \" 'James Baldwin',\\n\",\n       \" 'Jane Austen',\\n\",\n       \" 'Jim Henson',\\n\",\n       \" 'Jimi Hendrix',\\n\",\n       \" 'John Lennon',\\n\",\n       \" 'Jorge Luis Borges',\\n\",\n       \" 'Khaled Hosseini',\\n\",\n       \" \\\"Madeleine L'Engle\\\",\\n\",\n       \" 'Marilyn Monroe',\\n\",\n       \" 'Mark Twain',\\n\",\n       \" 'Martin Luther King Jr.',\\n\",\n       \" 'Mother Teresa',\\n\",\n       \" 'Pablo Neruda',\\n\",\n       \" 'Ralph Waldo Emerson',\\n\",\n       \" 'Stephenie Meyer',\\n\",\n       \" 'Steve Martin',\\n\",\n       \" 'Suzanne Collins',\\n\",\n       \" 'Terry Pratchett',\\n\",\n       \" 'Thomas A. Edison',\\n\",\n       \" 'W.C. Fields',\\n\",\n       \" 'William Nicholson'}\"\n      ]\n     },\n     \"execution_count\": 49,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"authors\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There are lots of other potential solutions that are even more robust and flexible, the main idea is the same though, use a while loop to cycle through potential pages and have a break condition based on the invalid page.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "14-Working-with-Images/.ipynb_checkpoints/01-Image-Exercise-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Image Exercise\\n\",\n    \"\\n\",\n    \"In the folder \\\"Working with Images\\\" (same folder this notebook is located in) there are two images we will be working with:\\n\",\n    \"* word_matrix.png\\n\",\n    \"* mask.png\\n\",\n    \"\\n\",\n    \"The word_matrix is a .png image that contains a spreadsheet of words with a hidden message in it.  \\n\",\n    \"\\n\",\n    \"Your task is to use the mask.png image to reveal the hidden message inside the word_matrix.png. Keep in mind, you may need to make changes to the mask.png in order for this to work. That is all we'll say for now, since we really want you to discover this on your own!\\n\",\n    \"\\n\",\n    \"This exercise is more open-ended, so we won't guide you with the steps, instead, letting you explore and figure things out on your own as you would in a real world situation. However, if you get stuck, you can always view the solutions video or notebook for guidance. Best of luck!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAA/cAAAIvCAYAAAAxnCs5AAEAAElEQVR4nOzde1wU5f7A8c8saODt\\nYJlnMUsotfSUgd3AsgLT1LIShULNAi8F5v3S0UINSktTS1MrFcoLdDSxoyWlCXVM4ddFOGbqURNN\\nk80stiShhH1+fywsC7sLu4DKwvf9es3rpezMzux8n3lu88wzmlJKUerEyZNc3b49onGRuDdOEvfG\\nSeLeOEncGyeJe+MkcW+cJO6NU+W46y7hsQghhBBCCCGEEKIOeAJomnapj0MIIYQQQgghhBAuKhuM\\nL3fuhRBCCCGEEEIIN+d54uTJS30MQgghhBBCCCGEqIGyNr2mlFIyLF8IIYQQQgghhHA/ZcPyPav6\\nUDRslTt1JO6Ng8S9cZK4N04S98ZJ4t44SdwbJ4l74+To5rw8cy+EEEIIIYQQQrg5adwLIYQQQggh\\nhBBuThr3QgghhBBCCCGEm5PGvRBCCCGEEEII4eakcS+EEEIIIYQQQrg5adwLIYQQQgghhBBuzq0b\\n92e+TiE++j5u8NWhaRpNfLvSJ+IZ3k7bj7E4k1lNm6FpWpVLC88X2UP5KyNMxlw2LxnLwODr0DQN\\nnXYtd0c8w+JN+/nd5ggMvPPo3+x+b+fgQUxasoPTxRfzjDQunye0cSm2AKc3PWX5fGjSUbvf+1fW\\nXMs6i7LM25ecTOFhD0+bfZSljxUZeRf89zYGpoKK15+maXQK7kVMwjq+Ollos36JIYO3po0i5KZ2\\nFeLxdtpRO9cr/JhVMc9of1Mvnpq2ip0G29fGWKcD66WJb1f6Rr/Iln35Tq1vvZSlJ1EVx/lq2eIX\\nsY6fce1atV5GpOTZrFv2N3scx9aXbqEjmZEkeX1NKbKYdZW5rP7HtB38Wenzv7Lm8vfS8/3PLfk2\\n2//f/DvQNI2r+qzkhNXfa1qWl6Ute1xJW8L5/LysLG8b/CrfUTmPrD4253MWcbPOnKffMqNiGlJk\\n1agu6FzZUvWxWe87IGF3jc9j4+Fandp+/u18+SF1+Iuj9uWnkfdG+KBpGp66B0g+UjGPqOsypLb5\\nUb2gzC9DrLC4g4PJj6u2lY67bPHQ+qs1h3ermU287X5uvTT3SFDfKJNSSqnT2+LUPXqdw3WvDZmh\\ndv5ssjqKPJUU0arK728TlKC+Omuy/yMuMXeMu7XP4q9wOrZmR9Wy/i0tn18ekKC+LrSNzZ+Zcyzr\\nLMw0f158Ilk9pPOoYn969fCcXaroIv322qivcS85m6lmBTu+ZrtP/dTq/Baq/yaOUh3QHK7facB8\\ntfds2XfvV8ujOjlcV8NfjU38rkL8rNOBo23Gr//e6fWt09OlUF/jbqv6fLVD+Fp1WtX0WkVFJ5+y\\nWbfsb/Y4E9vmHaPV2gPnLsYJcok7xP2zeH8FKG/dJPVFpTw5a97tlmPvWiEPUMqkstWcwGYKUIPf\\nLr8Wa1OWl6Ute1xJW5fapY67K/m5dVneN75yOVpdbApV2nQ/y/aeWpjaeKI8tiaV6WJd0JWypepj\\ns973zfG76vL0OnSp4147rtWp7effzpcfzqx7bUj9rcNbq89xr235ef5woupjle/2sskj6rYMqV1+\\ndHE5irtb3rk3GdNY+Pi/OA3cFbOW/+blU1hYyK95+9mW/BJhTw7h/o7BvPDXOZRSKKX4M3OOZfuF\\nmSbL3wuKn6c7GudzFvHg/S/xucFE66BYVmd+T/7ZQs7lH+U/iVO4R6/jaMYcBg54iX1FtsfUIXwt\\np0u/81x+Hv+XOIoOaJzJimPG8uyLd3IaoeYeCXyjymNaObZlzud8wJtpBZb//5oTx9o0o8v7i04+\\nVbqPQn7N28PyqE6Agc0zniExR9XBL2qcvloxnhcyC/HQ+vNqetn1l8+R7FReG/UAw8JCuax03R82\\njKZ39AqOo+g0IIFPDpzCWGi+Xj+eN5gOaFx3Ww86tAAwsvnZ/sQkHQb0DJ7zIQfz8jl3Np8fD2xl\\nbnhHFLksie7FhA3277pZ8ozzhfySu5VpIe1R5LL8sZfYesY25tZ5jPUyMUiz8+3CEet81Xo5tn4o\\nVzqxffm1WnFZFelb42Oyju25/Dy+TJ7KPXodfxxJZHToFHbYSQ+iaoF3DaMtUGhK5suc8r8rckhP\\n2Wf5f+6CrXxdVH5+i3MyeC+nEI1AQm/zB6h1We6sC5G2GhJX8nNrH88cxPgU+6Pq7Ck5k0bKvB8t\\n/y9WqbyZUl7n0ghyqS7oWtkiLpS6qFO7Un442t/RDKnD16WalJ/fbHqTbaYSy/93zl5ls15dliHW\\nXM2P6gu3bNwXH8zh7ZK/AOg/ZAjd9D54eXnRWt+F3pEzWJ/oXMWvXC4rn5vFl8pE64AZbNv+Bo8H\\nXYtPCy+8ffzpGTWfLRueo5tmzljmVhNobx89t0fN4+XoVgD836KtdoZ2iIuriB3rF7NXKfT9Epgd\\n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\\n69x0+9d5/Bg1dw53aTp+y19Cv9An2ZB1HGNhMUXGXPYmTaNfxFwOKkXbwARm2M2h6xY62rrIwuzp\\nyRw0FFNcbOTbjHlMfOY9ALo+EeP0+BNHXtwbt846/7Y8nVcwT74UQTvgh7TR9Or/PLuO5vNrcTFF\\nRgNfZ2ZXOkJACAGtg2N5uSyfpYy5m4j57/Ffg5Hi4mJ+ycvktQmD6OQXwpJPC5z2re3yo+RYCo92\\n7WVd2Mm8vZFv05J4Y/dvANzSQX/5fhzhVpHRwP6U6fQb8CyfKxPNfWJ5Oto8jE/Dn5AnbgMgZ34c\\nz6Yc4Mey2H8wfyLP7TwH6Hl0WJjcjW0E7httXlTT0zeKNanx3KXpKMiZx4jYZLkwf0UVs2tBAH+P\\nfN68eKnRXO4XGLJJ3vAmAF76m7m2LVzISWJ+UuXrLfycvZjtGbZemkeHvkSVLaz3RdpODipF+76x\\nPOQvF/Xqq9bBk3kt1hdwbDMUFRo5fTSNFyJ7l63NoWfoy09yd1kn8dyn86yPuh26biERtwYxZUkc\\nd2k6zmbFMW1hw3nmeV3i0SGYAYNaAJB7zHwx5t6IEOtceE//YB71N19kySpbq6hfz27Wi2+lZ7ex\\nckblT8KxH7lzY9Qc6/ppCb17MTVpHyeM5r7gL3mZZH7VADv8SikFOLwup5KTyaq/zsPpHCwvTy1c\\nbT1pUkopdWZXnLpXr3O77fXBM9Xen0zlPqFIfTQvVLVzs0+LTjHq3VyTy/OJST7tcKTSc5lqdlAz\\n675LMk0On/OfxNGqI5rb89MRpNZ+Zd7nfOY8t9tZXuU/v7ZdybjXrnyVFNlaAapjxEZ1pty7FcVU\\nKcdYWGJaWboE1B3xn12G71b76nrcS88dVquiO1fw2+vVI0u+VMXq0pYfOcvuqTD+1wcnqP3nzNt/\\nFH91hdvan8eVUtfjXhVVKTdbdIpRG4/87rBf6blMNTukg9t9AqLfVt/bbd+Q8n99jrslX7XwSFBf\\nqvL5x3W5X1l5Xr4OOJo8zNo+iHr9O6ft62v861vcS8/tVGM8mrr9vTX81MTN3ymlilTaDF8FqKa6\\nGPWeU5tPqdJz6WpC+6sUoG6Iflv9avfer+lxDu3Bp1J/cdq/LrTPaqq+xd0dV/nYncraDBp+anzi\\n16rYur0tfVzXd7Vd2V+kPorvqcDcXl+S+bvrD6yD6lPcjyb2t56nhxaiNn3rGN+sBXdZ379KF6v2\\n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\\nIYQQQgghhBDCNRncCyGEEEIIIYQQjZwM7oUQQgghhBBCiEZOBvdCCCGEEEIIIUQjJ4N7IYQQQggh\\nhBCikXO6Wr4QQgghhBBCCCG8n6yWL4QQQgghhBBCXCR8jx0/fqGPQQghhBBCCCGEELVgGdPLtHwh\\nhBBCCCGEEKKRskzL963uRXFxq3pSR+LeNEjcmyaJe9MkcW+aJO5Nk8S9aZK4N02uLs7LPfdCCCGE\\nEEIIIUQjJ4N7IYQQQgghhBCikZPBvRBCCCGEEEII0cjJ4F4IIYQQQgghhGjkZHAvhBBCCCGEEEI0\\ncjK4F0IIIYQQQgghGrlGN7g//U0q8TH3cb2/Dk3TaObfk/6RT/NW+j7OlMEXCR3QNK3GrX8vHzRN\\nIyByPacc9lLK/y24B03T6BjyCnsx8M4jf6omvUVlOldb9e8X1fkje4H1d1ySXfNjPkzGPLYse4ah\\nIdegaRo6rSt3Rz7N0s37+F817/sp2z6Pde7Vlyemr2KHwX6f7uY1d45VuFvGLIwcSl9BbOQdBGjm\\nOF0bMoznFm3ioNExtatYNfPvyf0xU1mTWVDt3qrmCb/ufRgQ8yIbs+3fV1OeaO37IruR/OApy+9a\\nU94oyl7AzTodzXTDSDtu/p3Lj6fykI8vmqYxJtUSL6nTzyfburtq+RsQ8yIf7C20S++qHHXu1ZcJ\\nCc7LuMXJzU9Y049MPmL/2gfPcoWmodNuYUl2icN7y49v5pFOzdA0f/72QaFd3nG1WfKUq7SWdmdl\\nDXXMxawu5deWu20zVOY5H60Pr+c6vv5j6iPmPFixL0/ac+d1iuO+m3r7r8hmdvOWNf6mlnbR03rC\\norZ9vXJDNmsSxhHaq1ON/QEp3w2jujGdsSzLo/xj4Vl+cN3GXxsyjMnLPuNk2fn8ReqJMj8M0W7z\\nVgdSHlUdqxyrZfPRBqn1h0zq8/jLnL5edZv72pSKz9Kr2dvO2u3n3KEk1V/nY/NagUqObKsA1SVi\\nnTrp8ggr07naqn//+dVY4m7xe9Z867EmZpmqTXtyW5y6R69zGYeuoTPVjlP2n1FetE+9Ht3d5Xs0\\nAtUzSd+r0or07ua1mo71fPPOuLtbxpQqO5Whpod2dvl7N9OHqXnbfrV7jzuxCopeqf5bZL+vmvIE\\noHpHv6d+dHM/rXwS1LfqwuQH74y7eyp/V8f6utIRtWJQGwUoXy1cbTpm/p3LjqWoITofBaiYlBMV\\n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\\n\",\n      \"text/plain\": [\n       \"<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=1015x559 at 0x21058C3B780>\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAfkAAAD7CAYAAABpCe1bAAAEiElEQVR4nO3dwa3kMAwFQXLh/FPW\\nRvFHQKsqggf40OBF3nPOGQAgZ2dG5AEg6N/tAQDA3xB5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5\\nAIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIj6bg+47Zz3/rS7u7cnAPADLnkAiBJ5AIgSeQCIEnkA\\niBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiNqZee9dVwB4gEseAKJEHgCiRB4AokQeAKJEHgCiRB4A\\nokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgCivtsD4IZz3vvD8u7engD8mEseAKJEHgCi\\nRB4AokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJ2Zt573xMAHuCSB4AokQeAKJEHgCiRB4Ao\\nkQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgCiR\\nB4AokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgKjv9gCAXznn3J7wc7t7ewIXueQBIErk\\nASBK5AEgSuQBIErkASBK5AEgSuQBIErkASBK5AEgSuQBIGpn5r13HgHgAS55AIgSeQCIEnkAiBJ5\\nAIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkA\\niBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCI\\nEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIj6bg8A4O+dc25P+LndvT3hOpc8AESJPABE\\niTwARIk8AESJPABEiTwARIk8AESJPABEiTwARIk8AETtzLz31iEAPMAlDwBRIg8AUSIPAFEiDwBR\\nIg8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUd/MzDnv/W12d29PAIA/5ZIH\\ngCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgKidmffetAWAB7jkASDquz2Ae/yY\\nCKDNJQ8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUX5QAwBRLnkAiBJ5AIgS\\neQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIj6bg8Afuuc9/4u\\nvbu3J1znu7/JJQ8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUTsz7711CAAP\\ncMkDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CU\\nyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTI\\nA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQNR3zrm9AQD4A/8B\\ni5wo7x6tDuUAAAAASUVORK5CYII=\\n\",\n      \"text/plain\": [\n       \"<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=505x251 at 0x21058D92908>\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "14-Working-with-Images/.ipynb_checkpoints/02-Image-Exercise-Solution-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Image Exercise - Solution\\n\",\n    \"\\n\",\n    \"In the folder \\\"Working with Images\\\" (same folder this notebook is located in) there are two images we will be working with:\\n\",\n    \"* word_matrix.png\\n\",\n    \"* mask.png\\n\",\n    \"\\n\",\n    \"The word_matrix is a .png image that contains a spreadsheet of words with a hidden message in it. \\n\",\n    \"\\n\",\n    \"Your task is to use the mask.png image to reveal the hidden message inside the word_matrix.png. Keep in mind, you may need to resize the mask.png in order for this to work.\\n\",\n    \"\\n\",\n    \"This exercise is more open-ended, so we won't guide you with the steps, instead, letting you explore and figure things out on your own as you would in a real world situation. However, if you get stuck, you can always view the solutions video or notebook for guidance. Best of luck!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Import Images\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from PIL import Image\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"words = Image.open('word_matrix.png')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAA/cAAAIvCAYAAAAxnCs5AAEAAElEQVR4nOzde1wU5f7A8c8saODt\\nYJlnMUsotfSUgd3AsgLT1LIShULNAi8F5v3S0UINSktTS1MrFcoLdDSxoyWlCXVM4ddFOGbqURNN\\nk80stiShhH1+fywsC7sLu4DKwvf9es3rpezMzux8n3lu88wzmlJKUerEyZNc3b49onGRuDdOEvfG\\nSeLeOEncGyeJe+MkcW+cJO6NU+W46y7hsQghhBBCCCGEEKIOeAJomnapj0MIIYQQQgghhBAuKhuM\\nL3fuhRBCCCGEEEIIN+d54uTJS30MQgghhBBCCCGEqIGyNr2mlFIyLF8IIYQQQgghhHA/ZcPyPav6\\nUDRslTt1JO6Ng8S9cZK4N04S98ZJ4t44SdwbJ4l74+To5rw8cy+EEEIIIYQQQrg5adwLIYQQQggh\\nhBBuThr3QgghhBBCCCGEm5PGvRBCCCGEEEII4eakcS+EEEIIIYQQQrg5adwLIYQQQgghhBBuzq0b\\n92e+TiE++j5u8NWhaRpNfLvSJ+IZ3k7bj7E4k1lNm6FpWpVLC88X2UP5KyNMxlw2LxnLwODr0DQN\\nnXYtd0c8w+JN+/nd5ggMvPPo3+x+b+fgQUxasoPTxRfzjDQunye0cSm2AKc3PWX5fGjSUbvf+1fW\\nXMs6i7LM25ecTOFhD0+bfZSljxUZeRf89zYGpoKK15+maXQK7kVMwjq+Ollos36JIYO3po0i5KZ2\\nFeLxdtpRO9cr/JhVMc9of1Mvnpq2ip0G29fGWKcD66WJb1f6Rr/Iln35Tq1vvZSlJ1EVx/lq2eIX\\nsY6fce1atV5GpOTZrFv2N3scx9aXbqEjmZEkeX1NKbKYdZW5rP7HtB38Wenzv7Lm8vfS8/3PLfk2\\n2//f/DvQNI2r+qzkhNXfa1qWl6Ute1xJW8L5/LysLG8b/CrfUTmPrD4253MWcbPOnKffMqNiGlJk\\n1agu6FzZUvWxWe87IGF3jc9j4+Fandp+/u18+SF1+Iuj9uWnkfdG+KBpGp66B0g+UjGPqOsypLb5\\nUb2gzC9DrLC4g4PJj6u2lY67bPHQ+qs1h3ermU287X5uvTT3SFDfKJNSSqnT2+LUPXqdw3WvDZmh\\ndv5ssjqKPJUU0arK728TlKC+Omuy/yMuMXeMu7XP4q9wOrZmR9Wy/i0tn18ekKC+LrSNzZ+Zcyzr\\nLMw0f158Ilk9pPOoYn969fCcXaroIv322qivcS85m6lmBTu+ZrtP/dTq/Baq/yaOUh3QHK7facB8\\ntfds2XfvV8ujOjlcV8NfjU38rkL8rNOBo23Gr//e6fWt09OlUF/jbqv6fLVD+Fp1WtX0WkVFJ5+y\\nWbfsb/Y4E9vmHaPV2gPnLsYJcok7xP2zeH8FKG/dJPVFpTw5a97tlmPvWiEPUMqkstWcwGYKUIPf\\nLr8Wa1OWl6Ute1xJW5fapY67K/m5dVneN75yOVpdbApV2nQ/y/aeWpjaeKI8tiaV6WJd0JWypepj\\ns973zfG76vL0OnSp4147rtWp7effzpcfzqx7bUj9rcNbq89xr235ef5woupjle/2sskj6rYMqV1+\\ndHE5irtb3rk3GdNY+Pi/OA3cFbOW/+blU1hYyK95+9mW/BJhTw7h/o7BvPDXOZRSKKX4M3OOZfuF\\nmSbL3wuKn6c7GudzFvHg/S/xucFE66BYVmd+T/7ZQs7lH+U/iVO4R6/jaMYcBg54iX1FtsfUIXwt\\np0u/81x+Hv+XOIoOaJzJimPG8uyLd3IaoeYeCXyjymNaObZlzud8wJtpBZb//5oTx9o0o8v7i04+\\nVbqPQn7N28PyqE6Agc0zniExR9XBL2qcvloxnhcyC/HQ+vNqetn1l8+R7FReG/UAw8JCuax03R82\\njKZ39AqOo+g0IIFPDpzCWGi+Xj+eN5gOaFx3Ww86tAAwsvnZ/sQkHQb0DJ7zIQfz8jl3Np8fD2xl\\nbnhHFLksie7FhA3277pZ8ozzhfySu5VpIe1R5LL8sZfYesY25tZ5jPUyMUiz8+3CEet81Xo5tn4o\\nVzqxffm1WnFZFelb42Oyju25/Dy+TJ7KPXodfxxJZHToFHbYSQ+iaoF3DaMtUGhK5suc8r8rckhP\\n2Wf5f+6CrXxdVH5+i3MyeC+nEI1AQm/zB6h1We6sC5G2GhJX8nNrH88cxPgU+6Pq7Ck5k0bKvB8t\\n/y9WqbyZUl7n0ghyqS7oWtkiLpS6qFO7Un442t/RDKnD16WalJ/fbHqTbaYSy/93zl5ls15dliHW\\nXM2P6gu3bNwXH8zh7ZK/AOg/ZAjd9D54eXnRWt+F3pEzWJ/oXMWvXC4rn5vFl8pE64AZbNv+Bo8H\\nXYtPCy+8ffzpGTWfLRueo5tmzljmVhNobx89t0fN4+XoVgD836KtdoZ2iIuriB3rF7NXKfT9Epgd\\n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\\n69x0+9d5/Bg1dw53aTp+y19Cv9An2ZB1HGNhMUXGXPYmTaNfxFwOKkXbwARm2M2h6xY62rrIwuzp\\nyRw0FFNcbOTbjHlMfOY9ALo+EeP0+BNHXtwbt846/7Y8nVcwT74UQTvgh7TR9Or/PLuO5vNrcTFF\\nRgNfZ2ZXOkJACAGtg2N5uSyfpYy5m4j57/Ffg5Hi4mJ+ycvktQmD6OQXwpJPC5z2re3yo+RYCo92\\n7WVd2Mm8vZFv05J4Y/dvANzSQX/5fhzhVpHRwP6U6fQb8CyfKxPNfWJ5Oto8jE/Dn5AnbgMgZ34c\\nz6Yc4Mey2H8wfyLP7TwH6Hl0WJjcjW0E7httXlTT0zeKNanx3KXpKMiZx4jYZLkwf0UVs2tBAH+P\\nfN68eKnRXO4XGLJJ3vAmAF76m7m2LVzISWJ+UuXrLfycvZjtGbZemkeHvkSVLaz3RdpODipF+76x\\nPOQvF/Xqq9bBk3kt1hdwbDMUFRo5fTSNFyJ7l63NoWfoy09yd1kn8dyn86yPuh26biERtwYxZUkc\\nd2k6zmbFMW1hw3nmeV3i0SGYAYNaAJB7zHwx5t6IEOtceE//YB71N19kySpbq6hfz27Wi2+lZ7ex\\nckblT8KxH7lzY9Qc6/ppCb17MTVpHyeM5r7gL3mZZH7VADv8SikFOLwup5KTyaq/zsPpHCwvTy1c\\nbT1pUkopdWZXnLpXr3O77fXBM9Xen0zlPqFIfTQvVLVzs0+LTjHq3VyTy/OJST7tcKTSc5lqdlAz\\n675LMk0On/OfxNGqI5rb89MRpNZ+Zd7nfOY8t9tZXuU/v7ZdybjXrnyVFNlaAapjxEZ1pty7FcVU\\nKcdYWGJaWboE1B3xn12G71b76nrcS88dVquiO1fw2+vVI0u+VMXq0pYfOcvuqTD+1wcnqP3nzNt/\\nFH91hdvan8eVUtfjXhVVKTdbdIpRG4/87rBf6blMNTukg9t9AqLfVt/bbd+Q8n99jrslX7XwSFBf\\nqvL5x3W5X1l5Xr4OOJo8zNo+iHr9O6ft62v861vcS8/tVGM8mrr9vTX81MTN3ymlilTaDF8FqKa6\\nGPWeU5tPqdJz6WpC+6sUoG6Iflv9avfer+lxDu3Bp1J/cdq/LrTPaqq+xd0dV/nYncraDBp+anzi\\n16rYur0tfVzXd7Vd2V+kPorvqcDcXl+S+bvrD6yD6lPcjyb2t56nhxaiNn3rGN+sBXdZ379KF6v2\\n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\\nIYQQQgghhBDCNRncCyGEEEIIIYQQjZwM7oUQQgghhBBCiEZOBvdCCCGEEEIIIUQjJ4N7IYQQQggh\\nhBCikXO6Wr4QQgghhBBCCCG8n6yWL4QQQgghhBBCXCR8jx0/fqGPQQghhBBCCCGEELVgGdPLtHwh\\nhBBCCCGEEKKRskzL963uRXFxq3pSR+LeNEjcmyaJe9MkcW+aJO5Nk8S9aZK4N02uLs7LPfdCCCGE\\nEEIIIUQjJ4N7IYQQQgghhBCikZPBvRBCCCGEEEII0cjJ4F4IIYQQQgghhGjkZHAvhBBCCCGEEEI0\\ncjK4F0IIIYQQQgghGrlGN7g//U0q8TH3cb2/Dk3TaObfk/6RT/NW+j7OlMEXCR3QNK3GrX8vHzRN\\nIyByPacc9lLK/y24B03T6BjyCnsx8M4jf6omvUVlOldb9e8X1fkje4H1d1ySXfNjPkzGPLYse4ah\\nIdegaRo6rSt3Rz7N0s37+F817/sp2z6Pde7Vlyemr2KHwX6f7uY1d45VuFvGLIwcSl9BbOQdBGjm\\nOF0bMoznFm3ioNExtatYNfPvyf0xU1mTWVDt3qrmCb/ufRgQ8yIbs+3fV1OeaO37IruR/OApy+9a\\nU94oyl7AzTodzXTDSDtu/p3Lj6fykI8vmqYxJtUSL6nTzyfburtq+RsQ8yIf7C20S++qHHXu1ZcJ\\nCc7LuMXJzU9Y049MPmL/2gfPcoWmodNuYUl2icN7y49v5pFOzdA0f/72QaFd3nG1WfKUq7SWdmdl\\nDXXMxawu5deWu20zVOY5H60Pr+c6vv5j6iPmPFixL0/ac+d1iuO+m3r7r8hmdvOWNf6mlnbR03rC\\norZ9vXJDNmsSxhHaq1ON/QEp3w2jujGdsSzLo/xj4Vl+cN3GXxsyjMnLPuNk2fn8ReqJMj8M0W7z\\nVgdSHlUdqxyrZfPRBqn1h0zq8/jLnL5edZv72pSKz9Kr2dvO2u3n3KEk1V/nY/NagUqObKsA1SVi\\nnTrp8ggr07naqn//+dVY4m7xe9Z867EmZpmqTXtyW5y6R69zGYeuoTPVjlP2n1FetE+9Ht3d5Xs0\\nAtUzSd+r0or07ua1mo71fPPOuLtbxpQqO5Whpod2dvl7N9OHqXnbfrV7jzuxCopeqf5bZL+vmvIE\\noHpHv6d+dHM/rXwS1LfqwuQH74y7eyp/V8f6utIRtWJQGwUoXy1cbTpm/p3LjqWoITofBaiYlBMV\\n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\\n\",\n      \"text/plain\": [\n       \"<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=1015x559 at 0x21058C3B780>\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"words\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"mask = Image.open(\\\"mask.png\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAfkAAAD7CAYAAABpCe1bAAAEiElEQVR4nO3dwa3kMAwFQXLh/FPW\\nRvFHQKsqggf40OBF3nPOGQAgZ2dG5AEg6N/tAQDA3xB5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5\\nAIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIj6bg+47Zz3/rS7u7cnAPADLnkAiBJ5AIgSeQCIEnkA\\niBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiNqZee9dVwB4gEseAKJEHgCiRB4AokQeAKJEHgCiRB4A\\nokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgCivtsD4IZz3vvD8u7engD8mEseAKJEHgCi\\nRB4AokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJ2Zt573xMAHuCSB4AokQeAKJEHgCiRB4Ao\\nkQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgCiR\\nB4AokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgKjv9gCAXznn3J7wc7t7ewIXueQBIErk\\nASBK5AEgSuQBIErkASBK5AEgSuQBIErkASBK5AEgSuQBIGpn5r13HgHgAS55AIgSeQCIEnkAiBJ5\\nAIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkA\\niBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCI\\nEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIj6bg8A4O+dc25P+LndvT3hOpc8AESJPABE\\niTwARIk8AESJPABEiTwARIk8AESJPABEiTwARIk8AETtzLz31iEAPMAlDwBRIg8AUSIPAFEiDwBR\\nIg8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUd/MzDnv/W12d29PAIA/5ZIH\\ngCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgKidmffetAWAB7jkASDquz2Ae/yY\\nCKDNJQ8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUX5QAwBRLnkAiBJ5AIgS\\neQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIj6bg8Afuuc9/4u\\nvbu3J1znu7/JJQ8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUTsz7711CAAP\\ncMkDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CU\\nyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTI\\nA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQNR3zrm9AQD4A/8B\\ni5wo7x6tDuUAAAAASUVORK5CYII=\\n\",\n      \"text/plain\": [\n       \"<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=505x251 at 0x21058D92908>\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mask\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Resize Images to Match\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(505, 251)\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mask.size\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(1015, 559)\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"words.size\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"mask = mask.resize((1015,559))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(1015, 559)\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mask.size\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Add in alpha parameter\\n\",\n    \"\\n\",\n    \"Now we can't just paste them over, otherwise we won't see what is underneath, we need to add an alpha value.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"mask.putalpha(200)\\n\",\n    \"# links.putalpha(128)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\nAwAAQNxfxaEjW03OYssAAAAASUVORK5CYII=\\n\",\n      \"text/plain\": [\n       \"<PIL.Image.Image image mode=RGBA size=1015x559 at 0x2105909B400>\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mask\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"words.paste(mask,(0,0),mask)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAA/cAAAIvCAYAAAAxnCs5AAEAAElEQVR4nOzd6VciWbqw/QuQeZ5B\\ncNYca+ru9znZ//+nzj7dXae6KisnTVMFmacgGEPg/RCooKCgZqYk92+tXl0JERCyI/Z4770Ng8Hg\\nD4a63S4WiwWxXCTdl5Ok+3KSdF9Oku7LSdJ9OUm6LydJ9+V0Nd2N3/BahBBCCCGEEEII8QBW/v73\\nv/P69etvfR1CCCGEEEIIIYSY06tXrwAZuRdCCCGEEEIIIRbeSrfb/dbXIIQQQgghhBBCiDs4b9Ov\\nyMILQgghhBBCCCHEYjpv069MevM8Zl98366utSDpvhwk3ZeTpPtyknRfTpLuy0nSfTlJui+naWvm\\nyZx7IYQQQgghhBBiwUnjXgghhBBCCCGEWHDSuBdCCCGEEEIIIRacNO6FEEIIIYQQQogFJ417IYQQ\\nQgghhBBiwUnjXgghhBBCCCGEWHATt8JbFGeNErlcnmJVoa2BwWzH4/YQCEcJentk/vct6UH/xs8w\\nGpK8+J8EzvMXeh0qhQyFUpWK2gGsuAM+AqEoYb8d09jZGoX93/hU6l37XJsrgC8YZTXqwWx4mL9X\\njFPS/+Zt6mzq+9fSFtAqh/znQx6A4PYv7Iat184bqKf8880JABsvXxFzwaBb4uOvB1QYXDlavz9C\\n0QQRj/m+f5K49vyBzeXB4wsTCQdwWsb7IweaQiFTolStoLQ0LtIjHCfos155XqGrlijkL/MMi92D\\nzxciFA/jvpJ8o/fBKIPZjscXJBqP4rev3Hr8qPP7Sdxker56zhrY4eVeiJW5ntVL4d2/sh00jx17\\n/tok09PWjMPjwxcKEQtJXn83Kqlf35Lu9rHHn/PDumds1GGgnvLrmxM0YPXJ31jzj1db1Mwb3hyr\\nWLxbvHwWwXL+xh3L8vN7a9KdMM+9JZg5Pz8vy82udZ6/jGMf+5Db02bQzPLH70c0Aefqc16sjd5D\\nKql/zl8XnK1sue3aLr/bkXzBjwn3XD/f8pmvTj05/569/DBLHf6ruH/52aP06Vf2Cz0M+Nj5+SlB\\n2+j7D1uGtO+ZHz0GC9u4b5cO+HO/iDby2kBrUSu3UModjD8n5v5MrZZi/yCNMvqhdKiXc9TLObKe\\nVXb21nDP8Ku11TJZtUyxlOTZswTOq60M8Q10KOdLF/+qZYs0ggmc94pfOb8/ylTX9thddUs4zF31\\nVFLv3pJWxythbVWhrSo0ehZeXGTafZqFIz58ytMZO/ryec3419nbieMwAb0W+aMPHBbaY0d3Wwr5\\nlkI+kya2/ZS1sP3W9BtoLWqFFLVCgdjeczYC1zuIxLLQaCoFmkqB7GmYrSebhOySA8zHhSdiJp3q\\n0MlUaSQ9uEd+wka9clHOV+pNEv7RilsTpdTUPyXgvWjYP2RZLu5orvxcp6nHHKdd7CXmKUf71EpZ\\nmsN/NU9zVKMeApYbT7rx8+YqW8RX8bXr1OffV6kk2XsidfgvY7byc9AuUyjo+ciAKvlSHf9YHvGw\\nZch5LfFu+dHjsJhFW69K5qCEBrijO2wm/NhMBvq9Dg2lQr5mwWtzEfqf/0dyeMqk0dhRg2aWD+/S\\nqMCKK8rGRhy/3YwBjUY5R+okg6Kc8uG9kRfPE1y9/0Z7cPo9jWY5xf6nPB01xUnex7O4E/FlTBqh\\nn2TQrJCvXvbQnjVTFGtRnP75HoPLHuI+Z1qL8sk+h4U2lZMjCr4fiDrm/xsEqIUj0mofAz7Wnm8S\\ncZoxMKDbUajm8hC4zJC75UPefdI792z+JJtrEVxWE4aBRj1/zOFxGZvThdUE0KNy8p7DQgcwE1jb\\nZi3sxmKEs26dYuqIk3Kb7Ke39E0/shW43g97kWcM+px1FU4/HZJROuQ+pvH+bRvfypTjxb3c1jM+\\nffxU9yVGUUfTtt/TaFUzHB9lUNoFDt8asfy0iWcxS9ZvxukOYSaNRpFGcx33xbNzWfECrlXcBk2F\\nUqMPOPG4rMPX7leWz0pG6G82T34+qpr6yJHtJVvB2TpNB2c1Spnu5b8pky81CFzUuVwk56gLzle2\\niC/lIerU84ysTv0+RerwD+ku5Wejkqc2UtrXUwWUqHus3vWQZcioefOjx2LROiMAGLSa5Ad6QvuC\\nIRxmE0ajkRWzHW9wlb3tecMkOuRPUnplwLHKs2ebhFxWTCYjRpMVd3idJ3sJHMCZmiJd6tz4aUaT\\nGVd4nbWwnvurmSqtu/yh4gFd9u6bfUmSYf3WL+fLdG8+8QZGVsxOwuvrhAwGoEFFaTzM5S4djZaq\\nPyVmf5Cg5/z5M2Fz+IltPb2shPUVskdlNPQC+fmTBF67GZNRf1698T2e//QTuwk3JqCnZDjM6c9s\\neOcle6s+bGYTRpMJi93H6t4ztoMmQKP0OUv9puhNg5EVq4+1jTgOYECBen361BDxfTOazDiD6zx5\\nsoYL6Gs5TguSB8zL5PIQNBgBjWKtfvH6ZcVL16dI47KeRket0gRWnEE8Dnjoslzc1Rz5+YRzC/vH\\nlGdMmk6lQHEwwGiOk0zoDTA1U745H59mzrJFfB1fu0599fsaJUXq8F/ATOVnX6Gc1TP9QDJJyGBg\\nQIFiZTyDeLgy5Kr58qPHYiEb96yYOZ+5lE99Il9p0OndJSfXDboqtap+vicamRh+Y3JHiQX1N+ql\\n2gwNQhNmqz6BZHAGd7868RBGe/d9oQgRfwSAbjVPpXnTmbczrJixoqe1do/7cLmZMFv037BbSXGc\\nLqK0NPoThmYHTZViV/+dQ5EAk6IvrfbLObWNuj4KYyROeGIIvZVQbBUz0NNOqc1SKxxN80kXKZaK\\nyRVlNSoVwTszuvDG9OpIp6Je/H4NpUQTsIbXWQtcrbh1qJVVAKx+F3a+VFku5jd7fj7JgDKH+2ka\\n06dNDzUp52oA2KN+VgMhHOj5eLk2f6frvGWL+Jq+dp368vv6zb7U4b+gm8pPrVYi0+1jIEAwHCUQ\\n0cuJWq48Xs4+UBkyyez50eOxkMGDBluQZLLA21SdjlLgUCkAYLH7CISDhEIhnPMM3Xc7FwvkuB3T\\nQi/M2B0rUOpxpmhoMDHjv9RD6+ifaVhZ1F6U78d5776BMAGvGbPRT9ySJ9NtUCgphB2TQwRnMTjT\\n6AzvH6NBUvpujHijmwSLB5S0DqXUAaUUgBVPOEA4EMU/XMRI6zTRAAMBHLfG1Gp0WnolzxxwYJt2\\nuNWOGwNlBnTPetz6xI6kuWHCIjBHb15zdOU1WVDp6yvs/4fC/vhrX2YRHBN2hwuo0Ws06Ghgl4jt\\nORhxukOQyXLWKKE049gdHRpVvYrm8YYI9OuclCt6xS3hxtZVqdX6gJmQd/hcfZGyXMxv9vx87CzD\\nKls7XY73i2hqioPPVp7teKd+S08pkx2G1Ib9bgwOCxFfis/VHuV8mbg/Mlfazle2jOuUD/jP64O5\\nzhHzmL9OPSlNDATY/cveDGsySB3+65lWfl6uk2UNB/FaViAQw5xLozUyVJQods95yjxQGTJi3vzo\\nMVnIxj0Y8SSe8bOzQCafo1JpoQHdVpXscZVcpsDG06dE77dS2p2dz9c5KejdPK64b2qPkLi//iDF\\nH69T116/nNtz2btvDfuGiyi58ITMZE47NE+LKHHPtXnTM3yzPuf++DPFwQBwEvRISt+VwRpk9yc7\\nvlyOXDGP2gbooBQyKIUMzvAeT7cD3/Yiz+fcH57QRK8oeF3SivtS7lc5E4vE7PESMeTIDxooaoeI\\nUaFU62EggM9txtr346ZCfVhxM7UqVBhgModxfoN1Tr5ex9FimjU/H/+tjNiDW+y2O7xN1WkVj0n7\\n9pgcwd+jWsyiMRpSa8Ub8EC1MozKi8gaON+BaXXqLxUz1+9pNEvHHA2/zxn1sFgzrr8Po+tk+fwe\\nvTPQ5SFkyZDpahSKVaKewEUn4cOXIfPkR4/LgjbuAYzYfFG2fFG2Bn3aLQW1lOP4tIqmKWQLCiGn\\nb7bwKYsVPwYqDKg3O8QmLKoAGq2mPgK44jFfK7yn9dquuJKsRWQhjm/psncfgsHze8KINxjDcXpE\\nkwLFSgLfhG3xJplUqQPwJTeIuKR/915WHIQSW4QSW/TPWjTqCvnTI4rqgEbhlHIsQMTqwEwJjTLN\\nVp+A5abf3IzVvgL00MpN2n0wTzq806I+rCpYVq7nGpNG4sFMeHd9YiNTFtR7HL7eomc9Wk09vM/k\\ndGKV1t38TG48ISP5Qg+1UqNqqFAHrAE/bgsY8BD0mqjXGihqnRW1CoAl5L3c8eQBynLxgGbIz683\\nvo14Ejtsqr/zuaqR3/9IxXw9HnZ0BW1PJHAxgGL1hwkZqhQH80flmecqW8bdthWemM9D1Knn6Wy7\\n6fvWY4u3WvpimVR+Xq6TZSROwDtsrho9BGIOMscqnUKB6mrgclu8hyhDrpktP3psFrZx3+v1MZmG\\nqWEwYnP4sDk8rAx+5X3mjIF2Rh9matwbLC68PiOVao9qKkc9uI77yom9eo7scC9Md9B7a6iX7JH5\\n9dy8Wv5l7z5A+t3/kp5wVC1XphW+up/l7IIbP7Adc0oBcB+9Hj2T6eKZNa7YcfvtuOxGOr99ok6D\\nQR8MDhchi5FMt08hWyTivR56qbU7mGxWjIyuopohV4zijlyt8HcoZk/RAJN5Fa97llS0E3/ynHW/\\nNA2+pEUZCe2pOU5zw1GeoEcite7EhNvrg0KJbvWUo7a+gpHL5x6mvxWnzw41lVrhmK6q/94Br+si\\n3/0SZfk0slr+LWbMzyezEtncov7mgJKmoWnXjxhdQbt8+H+8Prx+zLxRefOWLeLr+RZ1aot/naey\\n5eEXN6n8HF0nq0+GP/83c+28AVUKlQbBi50M7l+GTHZ7fvTYLGbjvq+Q/u8h3UiCSMCL02LCwICz\\nTpliUU+sFZtljkVPrETWkhSrR6hahg/v+hO3z2mi9+IlJmyJsCiV0GUzaBY4Ldzey3Z2bf7OdKNb\\n4VWP/8v7TIfKaQE15JQtsO6hXT7gXXGF1VgUr8eG2WBgMNBQCgXqgAEf5hXA6CG2EaD4sUi3esjb\\nD9rYdkWNcpbjT1lWki/0VY09cbaiRT7kOpQO3zA4m7QVXg8wE9yMMaltfzkS3yH3/nc+V1sUT4uE\\n/XfvEBKPy6B3Rq93PfENJhPT6pKjW/mogNEcZTUskVp3ZXb78VOmQodOW3/m/e7L8tbpCeJApamq\\n+u9NFM9YtNT9y/LBoE+v17te2TOYpEE3h5nz8ykM1iBbTzp03pygXnlvcFYhd3L7rhSDOaPy5i5b\\nZvtUcQdfu049+n292jG/vcvQrWQoKWEcc26XLGZzU/nZKJwOp7veTM2UqUedF/W2+5chk92UHz1G\\nC3nH9pQKmW4bLhZpGWe0hUlG5lsgzeCI8eTZGfsHaRQ1x8Gb3LVjrJ5Vdvbuvi+u+Nouw3oMhHky\\nYT9yegpH/31PdmT+zuzJa8SX2CVRf0tazfH5yMWznZAsznQnLar5Gh21f7FA5jgzvrVV/MPwK0tg\\ni2fbRj58ytOupHhXuZ4R2BoqnZ4bh8mEf+0pW/0PHBbalE/eUz65erSV2PZT1ibscX/1uIseXPWY\\n47SLvcT1kL3JYfwy2ve1TZtCM2lxw+LhfyleGf07n9/vH3ltWtoabWG2nqxLB989jI68A5i9fty2\\nkfcdHoJOI83hNCtL1HdtRfz7luXdyiG//ev6MHB4969syXqYM5ovP5/G5FplZ7fFn/tFRgfLzhfI\\nBSebP/4wIbT/vBO2N3dU3nxly4wfKr6JaaH2N0d7gsmbZDep8jZVJ3v4Gadjl4kb7Yi5zVR+jmx/\\nZwvv8cN24FpH2nkHjKadUq7FcQ87YB6iDJlmWn70GC1kNcTk2+BvP3sp5yuU6jUUVQ+9sLkC+AJB\\nopEAtjtkumZvkuc/h6kUMhRKVSpqB7DiDvgIhKKE/bIFyiIZDevxrEcnh+aZPEQTXrKHlYv5O3Mt\\n2WZyEd9MUPvjBLV4QMrjZnvWUQIxwk7sxS84y0VK5Sq1ukJbA4PZjsfnIxSKE/KMNoqNOMJb/OwL\\nUsiUKFUrKC2N8+c1FI4THF2N2WQnsv0zvkiJQj5Psap/vsXuwecLEYqHcc/Y5jZYg6xvVlE+Fqmm\\njsi6n7EqLbolZcbh8eELhYiFZArW/Vnx+l1Q1RdAdQWuhs07cPnN0NDLfJ/XNbFMlrL8W5s3P5/O\\nFlxno1pnv3i+0XTjYoFcW3iV0MSFsKyEYhHS1QxaI0OpFiXpnbXbfs6yRXyHjHjimySqb0irJY6O\\nPbh2I1gkf39gk8vP8+3vwEksdr1hD2DyRkn48hN2xniYMmSa6/nR42R49erVH69fvx578dWrV9/o\\ncsTXJOm+nCTdl5Ok+3KSdF9Oku7LSdJ9OUm6L6dp6S4B5kIIIYQQQgghxIKTxr0QQgghhBBCCLHg\\npHEvhBBCCCGEEEIsOGncCyGEEEIIIYQQC04a90IIIYQQQgghxIKbuFq+EEIIIYQQQgghHj9ZLV8I\\nIYQQQgghhPhOrHS73W99DUIIIYQQQgghhLiD8zb9isVi+caXIoQQQgghhBBCiLs4b9OvTHrzPGZf\\nfN+urrUg6b4cJN2Xk6T7cpJ0X06S7stJ0n05Sbovp2lr5k1s3Ivl8o9//AOQzOB79/e///1bX4IQ\\nQgghhBDiC5EF9YQQQgghhBBCiAUnjXshhBBCCCGEEGLBSeNeCCGEEEIIIYRYcNK4F0IIIYQQQggh\\nFpw07oUQQgghhBBCiAX3aFfL75b2+XW/hAEPOz8/J2gbfVejsP8bn0o9VpzrvPghjn3k3cFZhU//\\n+UhxMCDx7P+R9F72YXTVEoV8nmJVoa2Bxe7B5wsRiodxm6ddTY92tUi2UKJartMBbK4AvkCQaCSA\\nzTR+tJL+N29TZ9c+xWC24/H5CIXihDxTv0yM6nWoFDIUSlUqagcw4/C48fjDxMI+rBe//eU9cZXN\\nFcAXjLIa9WA26K8NuiU+/npAhcHUrw7v/pXt4NV06lH69Cv7hR4GfOz8/HTs3pyW9ldtvHxFzHXr\\nYYLRtHKw8fIFMde0PsnLe8CRfMGPCff1z2pm+eP3I5qAc/U5L9Y813o4B+op/3xzAoym0/T7y2hz\\n4fMGCEXD+O2PNkt9FM4aJXK5y/zXYLbjcXsIhKMEvXYap7M/P1Eu02mUns8GicajU9Jjnvx85J6K\\nPuXFpo/x7F4l9c+3pAf9yffczPnX8hl9zqbZePmKqGVaXm3FHfARiiaITClP5ynvL6/HxeaPL4k6\\nrnzWRZ0kwO5f9lgpSF7/EOYpM6c981ePu/57Nzn94w0njT4m8ypPf1nDfa0YuXzWPckXPE24p45+\\nnd8LRkOSF/+TwHnr1S+ngaZQyJQoVSsoLY2LZzYcJ+izDvPSy9/dGtjh5V6Im2vH89XH4fZyx2SY\\nr044Pe8y4/D48IVCxEKX9U1x7u719PDuX9lyK7emEXDtPprlPrz6XVfr/pPrhY/Xo62Jmt1+/JSp\\noFBWOgRt1ov3BmcqSrkPQK9RpdmOYx9pYJ3VFYqDAUbieM9z8F6L/NEHDgvtse/pthTyLYV8Jk1s\\n+ylrYftYhj44Uzj5eEBG6Y6d11bLZNUyuYyH5M4eq97bf8qB1qJWaFErZMiEt9jbiEzMiIROq6XY\\nP0ijaGOv0lTKNJUyuVMP60+e3tDY052nVaWSZO9JAuc9fvNBu0yhoN97A6rkS3X8N1QCxENqkEkX\\nCTyNYJnwbq+W4WRCoXGpT62UpTn8V/M0RzXqITDpw+bQb6uU2yrlXAZ/YpedpAd5rK9rlw74c7/I\\n6OM80FrUyi2UcgfTz09vqdTNRs9nU9QKBWJ7z9kIjJYdd8/Pm7lPHLtfshW0XntvkofKv8Q0Herl\\nHPVymeraHrurI/nwHct7nUrqMI3r2f3KCvF49JQy2cawzqidUqjEcF/ruL9UT51SCT69Mqh08WFk\\njitf6Eq/F32ahSM+fMrTGXv9/JnNkfGvs7cTxzHHM3aX/HuWcmdiOt+JRlMp0FQKZE/DbD3ZJGSX\\n/H0W52lYLCV59mB57+z3oX3KJyyqR9u4N1hceH1GKtUejVodLWK9qPidN94BBtca/z3UWgEAS9SD\\nw6i/Vjl5z2FBHzkJrG2zFnZjMcJZt04xdcRJuU3201v6ph/ZCpx/U5PM+/dk1D7gIr69TjTgxMyA\\nbqtM7iRFVlE4efce4w/PiTnHH+KxXt1Bn7OzFtXTE46zNZqFQz4aLRNGggRAr3HKh3dpVGDFFWVj\\nI47fbsbAgG4jz/HhCU2LB/eEjHO0167f02iWU+x/ytNRUpzkfTyLj/ezTx6hn6xRyVMb6TWspwoo\\nUTe+4ZPkSfyNV4nzd28Z1RNz61ZT5CoB1vxXs64muVRurAC/anBWo5S5rBQMKJMvNQjE5xt3GesV\\n7vc40xrkjw85KbeppN+yv/IDT2MyljOmVyVzUEID3NEdNhN+bCYD/V6HhlIhX7PgsYF5judnoF7+\\n90VP+qDPWVfh9NMhGaVD7mMa79+2h8/n/fJz0Mjv72O3Pr+1QX6f/GsZ3TQSMhipx1/m1X3OtBbl\\nk30OC20qJ0cUfD8MR9vvWt5fOlNTHHy28mwnNLEjESSvfyjz/I4Tn/lb9agWs2NlQyVTpBWcXqEf\\nUOU0W8U3oX6mFlJku/1ZvnhpdcuHvPukN6ht/iSbaxFcVhOGgUY9f8zhcRmb0zVn5NId8u8Zy52r\\n5qkTjt6H/Z5Gq5rh+CiD0i5w+NaI5adNPI+2pfXtTK2nq5Pr6QAGS5Anr4IX/74aTXV1oGau+/Cm\\ncaEF9IhrFla8fv2J6ZYr1C8K+MvG+7lGrX6ZcfcbKHm98RXwujABPSXDYU7vtwnvvGRv1YfNbMJo\\nMmGx+1jde8Z20ARolD5nqQ/z7XYhxYnaB5ysvXjOetiN1WTEaDJhc4XZeLJH3GkEVDKpIuN9iVcY\\njKyYnYQ2nrCb1AusZi5FsXnTScuqQzF1qleMHas8e7ZJyGXFdP7be+I8+eEvvJxhFN5oMuMKr7MW\\n1g9slBRad72svkI5qydYIJkkZDAwoECx0rnlRPFwNPKpHI0rdatu6XT4rE7XqRT0iB5znGRCLzjU\\nTPnieb8To4kVq0fPQ0J6B2PtKEf19ijTpTJoNckPO2R9wRAOswmj0ciK2Y43uMre9m2hmDMyGFmx\\n+ljbiOMABhSo1/XEeJj8XCV9mKZxY0Xg4fIvMY1enobX1wkZDECDitIA7l7eX9UqHpAqSt6+6C6j\\n7czEkwkcwFkjQ0W5OeNv5lIUrpQpg26J0yN1yhkCgL5C9qiMht6Ae/4kgdduxmQ0YjRZ8cb3eP7T\\nT+wm3HMNbN0l//5q5c6Q0WTGGVznyZM1XEBfy3FaaDzgN3yfrtbT1Uz17vX0c1/oPlwUj7hxD1ZP\\nEDf6CFujMawt9+pU8/oDnlxPYGa88d+rV8kO+hgI4HTq3WWNut5zYyROODAppNJKKLaKGT1kq1bv\\nAxr1mgKAxRshdH2CFphcxOJ+ALRqiXr7+iHXGfHEVolcqZCIS4OuSq2qF6reWGRyBdhkxjzzE2nC\\nbNUn8fSbfe7altNqJTJd/d4KhqMEIvo9UcuV758RiZmdNVNkRivdM4VJNinnagDYo35WAyEc6M97\\nufYQLXEroXjsWoNSDK2YOR+Dy6c+ka806PS+4OjXihkr+jOv9Qc8ZH5+1jzl4PP0ztyHz7/ENIbR\\ndB7eT3cr7ycrHOyTvaXTUDxu59F2JnOUYMJP0GkENArF6i2Ddfo0sMvnvE8te3LrfN9lN2iqFIeR\\nDaFIYGLki9Vun7NBdcf8+2uXOxeXEmU1+gADSkvlsp4+OOPO9fRzX+Y+XByPOljEYHPicxqpN/qU\\nayqrfh+oCvnBAJPZjy/ippfNkOnqjf+AZYWGWgbAEvDjtgBodFp6RdsccGCb1p1htePGQJkB3bMe\\n0KFT1jPxFbd9amie2ebATAkNBW3W+rzJjsNjhFqPdqODhvNBew8XXrdzUYC67JPnt/Z7Pf0IgwnT\\nrV1UPbSO/nmGles9WoX9/1DYH3/t+sIuHcr5kv5eOIjXsgKBGOZcGq2RoaJEsXsedV/ZdyEaj1PO\\nZCgfHlP26WFY52GSlkCSCKekyteLhcs5l07CfjcGh4WIL8Xnao9yvkzcP3ke/zwMNgceg5HmoI/S\\n6sC1qQPLy2ALkkwWeJuq01EKHCrDqVN2H4FwkFAohPMhM8Ezjc4wDzEY4CHyc0tgkzVHiYNUnVbx\\ngEOblb3EhBWTHjz/EtMMRtLZaNAbbXcr78cPTO7s0jo+oKSpnHz4hOXlLo98/aSlc/TmNUdXXrsW\\nyj8SbeeK+3DixBT1cvKpQqdQoLoamDjf2hqL4y/nyFYPSZX8+iJqzTzpTAcDARJJSKXKX+6PW2Ba\\np4kGGAjgeLBpR3fLvw2uu5U7s9UJb2LC7nABNXqNBh0N7FLJv8XN9fR53ec+nJT+i+aRVysceEL6\\nkrXdnEKz36c+DMm3RT04TS48Qf1PKNdUeqgoeT1A3+VzS4P5u6Vy+u//8K9//Yujyk2zrPW5PGr+\\nM0cFvY/eGfUw23JY4wbNCvmq/hk+v75gmsnlIWSZdRRAPARbIM5a0MSAMqdZhf5FmKSL1UQIi2HS\\n8rSXcy5XnEE8DgAr3oAHgG41T0Wmx3xhRjyJZ/z8dJOI336RN3dbVbLHB7z5/S25q3Mt7mLQ56xT\\n5eTwhCZ6we51PUxJYMCEN7FzMf2imjomp94lQmP2/GtZHL15zevX4//7PV2/4Yw+Z1qDwtHn4fo7\\nToKeh1sSyWQLsvUkOQytLZFKFekMZMR20ZxH24ETv1efimV1+/FiYECVQmVy5KRpxU98XR8FLh1l\\nqPc0iqcpVMC7sfqAC7CJL+srlTviXvo9DbVwzMmwnu6K+767Be6+tkc/tOT0BHGg0qSIUvPQK+lz\\np0JevXfW7Q1DJkM3p1APmql0+xjw4HefN+HMWO0rQA+t3KTdB/OkLo1Oi/pwBMCyYgKsWAMGKMFZ\\nvUUX98TeQq193jvkwTzrr9lr0RzO97I5rdIJcZXFih8DFQbUmx1irvma453yAf95fXDt9RVXkvWY\\nvqLyaDXt9sVTLldZNxIncL4Sq9FDIOYgc6zeOAogHpKZUHKDUumQWuaE940OCgM8yXXCDiOlCWeM\\n7nDgiQQuCg2rP0zIUKU4aFAoKYQd17fFm8eg3UQZDL9nyojtcjNi80XZ8kXZGvRptxTUUo7j0yqa\\nppAtKIScd1tgdNIoHpgJ764PF9l5qPzcSnhzm6bynmxXH9VdGVypHN4z/xLTTRtR8SU3iLiMgPGO\\n5f11JtcqO1sqvx1WaBUP+FiTkvoxuX1BvctoO4s3gn+4taHBFiAcPqJW6OlrrkSdE7bFA0twjc1i\\nlc/VDCcfGrSVHiuOJMmIE2NF9jibxmw9Hz0v02z1CVgeYgzxPvn3bOXO6FXOs6DeZD1aTX1tBpPT\\niVWyjmtuqqevRe6/IPF97sPbtsJbBI++cW9wuPBbjDS7Grnjz9DtYzLHcA4zapPLQ8SQJT8okj62\\n0AQs3iDukUaW0x3CTBqNDLliFHfkamWrQzF7igaYzKvD7fOMuL0eKFXo1lLkayGS3is3R08lm9Hn\\n+pp94985XR8lezpc5MOJ3yOral81ulNCNZWjHlzHfc+JMRb/Ok/n3Hbl3Ogq630y/Pm/mevHDEcB\\ngnOuvC7mZ7AFSa4VqJ3UURQwmqMkom6MU9bKH93hoHz4f7w+vH5M87SIEvdc7Howvw7FTHY4WhzG\\n7X70WetX1+v1MZ3HoBuM2Bw+bA4PK4NfeZ85Y6Cd0YcHmgNnJ/7kOev+8wLa/HD5uclDci+B+uYE\\nVdOu3XVfIv/63t1n3+Dgxg9sx5wXlfO7lfeT2SIbbNebfCp20DSJslgko9F23dohv07I+PU1V+K4\\nJ06hshJKrlKsnlBXFMDMajKK08jNiycvOYPDRchiJNPtU8gWiXivT3nT2h1MNuscnel3z79nLXce\\nMoy5p+Y4zQ2jRYMeGYWewaR97u/jy9yHi2MB/iYXnoheQdPaHX1Lg7CXi12KTG58ET00WlX1ECu7\\nzzmWiCZPnK2oXsCXDt/w8bRKW+vR7/XotqqcfnzHp1IPMBPcjF304trCSdZc+men373luFCn0+vT\\n7/VoqwWOPnwk0xhuy5GcvmUOoIeLag2KRx/YT+nhho5okuGsAzFGL1T1kMgMH959pqh26F389nWa\\nN4RIWgM7/PXVK169esX/9yyuL7pYyVBS7rbIWaNwerH14k3uvfK6mJERVzRJbNgT60/Gp241Mzir\\nkDu5fdHKO+960O9x1lH0PGS4yJ93I3qPToLvVF8h/d/f2U8XUVraxbPcbZYoFvVK0IrNcueG/cZL\\n/Xl/9eoXNn0moEXxtDi2kNFD5ucm1yo7u9PmX94v/xLThXf/Okzn/8fTuF6mV04LjM6OuGt5P5mV\\n8OYuiVu2PhSPTY9yNsUss63K+fLUxrrJGSMxvM8sviRRWUfldkYPsY2AXu+qHvL2Q5paS6PX79Pv\\ndagXjvjw2//xMV2/NpVxMOjT6/Wu/69/x/z7C5c7V/V7Go3SMR8+nKCiDzyshmXAZ5LRevqrV6/4\\n+eUeG7GHadgD97oPvwcLkVNd9sTrfB7XSK+ECZc3CLn8+dETRsNN+NeestX/wGGhTfnkPeVr0RVW\\nYttPWRvb89ZB/OlTzj4ekFFUMp/+JPNp/CyD2UNyZ2/CnsjQH6T443Vq4t/kCG+xtyZ73E9jcq7y\\n5Fmf/YM0iprj4E1uwlFmzKabcwKTN8luUuVtqk728DNOxy5XF1CeFurpSL7gx/jgYkEeW3iPH7YD\\n19KsVzvmt3cZtBtHAcSDMnmIb0ZoFS0kQtPDns+3vwMnmz+e74M9dgS597/zudrTdz0Ix7ktAGda\\nOBmY8Sd22ZE97q/pKRUy3TakDihNyBKNtjDJyP2mReisRDa3qL85oKQec5x2sZdwDz/3fvn5Vbbg\\nFrvtDm9T1+eGP1T+JaYx4kvskqi/Ja3m+HzkGtmT/q7l/RQmF4ndbdpvDihp0inzWEyeiqN3AG05\\nqxdTsbzrP0zcM7ud/8Bvh5XhmiuRCWUDgBFvbINIs4jjtgEcccES2OLZtpEPn/K0KyneVa5n+raG\\nSqfnHoum7FYO+e1f1yMs9DDp+fPvecqd0Sf7xjrh6IKNTL8PjbYwW0/WZY/7b2ie+/B7i65YiNvO\\n5PIQNGTIDvoYiV8Lo1txevBToMJgZMGsqx9iJ7L9M75IiUI+T7Gq0NbAYvfg84UIxcO4J5TzhhUP\\n689/IlItki2UqJbrdBiGkASCRCMBbDO20A1mOx6fj1AoTsgjk3BuY/Ymef5zkFI+R6lcpaJ2ADMO\\njxuPzz/jCttGPPFNEtU3pNUSR8ceXLuRmdc5GF2QJxa73rAHMHmjJHz5B115XdzO4t/gmf+mIy63\\nv7OFV6dEyVgJxSKkqxm0RoZSLUpizh43o82FzxsgFA3jty9ElvrVmXwb/O1nL+V8hVK9hqLqUQ53\\nyUdvY7AGWd+sonwsUk0dkXU/Y3VYw3rI/Hw8b7kesvMw+ZeYyuQivpmg9scJavGAlMfNdnjY0XfH\\n8n6a0XtKNrl8/M6nYhkIE5sycmoLxoila2S7DQpFhfD65Oq9weJn6+aCRlxjxBHe4mdfkEKmRKla\\nQWlpgBV3wEcoHCfos849uDVv/v01yx2dGYfHhy8UIhZ6wFFocUez34eD72z43vDq1as/Xr9+Pfbi\\nq1evvtHliK/pPN3/8Y9/AJLu37u///3vwGW6n5N0Xw6S7stJ0n05SbovJ0n35STpvpympbtMJBNC\\nCCGEEEIIIRacNO6FEEIIIYQQQogFJ417IYQQQgghhBBiwUnjXgghhBBCCCGEWHDSuBdCCCGEEEII\\nIRbcxNXyhRBCCCGEEEII8fjJavlCCCGEEEIIIcR3YqXb7X7raxBCCCGEEEIIIcQdnLfpVywWyze+\\nFCGEEEIIIYQQQtzFeZt+ZdKb5zH74vt2da0FSfflIOm+nCTdl5Ok+3KSdF9Oku7LSdJ9OU1bM0/m\\n3AshhBBCCCGEEAtOGvdCCCGEEEIIIcSCk8a9EEIIIYQQQgix4KRxL4QQQgghhBBCLDhp3AshhBBC\\nCCGEEAtOGvdCCCGEEEIIIcSCm7gV3uOlUdj/jU+lHtbADi/3QpjH3ldJ/fMt6UEfR/IFPybcY+8O\\nNJVSvkChVEFpaRjMdjw+H6FQnJBn/JMG3RIffz2gwoDw7l/ZDo6/f3Gceso/35xMeMeMw+PDFwoR\\nC3kwG+71h4srukqBTLFItarQ1sBoc+H3hgjHgnht+m09mjYbL18Rc135jNI+v+6XMBqSvPifBE6m\\np6d+rwSJxqP47ZePjZL+N29TZ2OfIe5m+rMEFrsHXzBKPBbAZjp/9TI/uMrmCuALRlmNTn/2tMoh\\n//mQByC4/Qu7YeuE98ysPf+FVc+EftC+wvFv78l0+wS3fmHHUZp6/ecm3Ydiil6HSiFDoVSlonYA\\nsLk8eHxhIuEAToueJufP4FW33TN6GWIjNywzbnL+fPemfNfV4yQfuLvRsvcqmyuALxAkGhlNU7gp\\nLzg3Xmfo064WyBZKVMt1OuhliNvtIxKJ4HOZMXJz/t4uHfDnfhENM5Gdl2yFrJO+VszopnQ/d70u\\n1uT0jzecNPqYzKs8/WUN97Wsevq9YbS58HkDhKLhsXIdbi6Pzkl+fleXaeKIPuXFpo+xx/mWujzA\\noJnlj9+PaALO1ee8WPNcG608T0MDAXb/skfAMuVy+iqpP9+SbvRH7rF58xTxEGarU9/QFjxrUszl\\nLtp5elvMjccfJhryYazp9f7b3NTuWwQL1ri/qz7NwhEfPuXpjLw60FrUCi1qhQyZ8BZ7G5ErFYb7\\n0GgqBZpKgexpmK0nm4TsEihxb70W+aMPHBbaYy/32yqltkoplya48ZTtmJOH7E/R75UUtUKB2N5z\\nNgJSkfuaui2FfEqhXE3y7FkC5y3PaVstk1XLVCpJ9p5MOr5DOX+ZwdeyRRrBBM7hI2r2BolbimS6\\nGoVilagnwNWP0GolMt0+BgIEfFbo3vevFBd6Kql3b0mr443utqrQVhUaPQsv1q9X5kad3zPFXJCd\\nl7vII7v4zp/rXMZDcmePVe9dqjB9lPQ73qbq46+2VWptlXq1x7Of13HfkMf01FMO9otogC+5x4Y0\\n7L+JnlIm29DziJ52SqESwz1HhbzfVim3Vcq5DP7ELjtJz7V8XnxZzdwnjt0v2QrO8wz1qZWyNM8/\\n4zRHNeqZ2ngfUOY0q+CbUma0i6ekGzd38IrHb9ApcfDmgJI22kGo0VTKNJUymvEX1pfkAV+Kxr1W\\nOeHdpzwaYPMn2VyL4LKYGPQ71Ispjo7LNAuHfBis8HwncOdeuNFe3H5Po1XNcHyUQWkXOHxrxPLT\\nJp6l+MW/FI3S5/ccFjuAmcDaNmthNxaTgb6mkj8+5KS8gtNpxQg39P/P5iI9B33Ougqnnw7JKB1y\\nH9N4/7aNT9Lyi7n6LDVLx3w4LKKpKfK1CFuB8ad0tPe239NollPsf8rTUVKc5H08i4/3/w6aFfLV\\nyx75s2aKYi2K0z9MVKOHQMxB5lilUyhQXQ0QtI1+wmXngDUcxGthrHEvIzr3oxaOSKt9DPhYe75J\\nxGnGwIBuR6Gay0PgeiVtrKe/16Ndz3D4KY2ilThJB/BuX++gARfJ//l/JIf/ui3aR5n0XeKLGR09\\n6fd6dBt5jg9PqLQVTt69x/TjS6KO8XNuG00bNPMcDRv2geRz1mMuzIYBfa2NUslT6vtvbNgPOiUO\\nP6RQAe/qc3YTbpnf+MBmGzXrUS1m0UZeqWSKtIJx7FPOGLs3+j3OtMaw3tCmkn7L/soPPI1df6ol\\nP/+SNPL7+9itz4m5ZnuSBmc1SpnLAndAmXypQSA+PUduZE4ohK7nF4OzKpl09cbvkxH6RdCjmjmk\\npA0wOaJs7yTw2kwYBj06DYVyrobdZ8Vi2eVVcHd4zm3R4Ivr+y+T+gqZz3rD3hrY4fmTBF67GZPJ\\nyIrZjj++x7OdAACt4mcKysP03hlNZpzBdZ48WcMF9LUcp4XGg3z2suopOY6KeuxFeOcle6s+bGYT\\nRqORFauH1b1n/PTTM+LuB251G4ysWH2sbcRxAAMK1OvTQ3PFwzKazDh9PlzDWIzBLb02RpMZV3id\\ntbBeQ2+UFFpjR1z2+pt9SZJhPRss58tjg+9OfwQvBgZUKVTGn93LzgEz4dDVkEJxPxotVU8xsz9I\\n0GPFZDJiNJmwOfzEtp7eXtE2mbD5kqzF9QM7hTJ17ZZzxKNmNJmweeLsPdshaDYAKtlsmelBs5Np\\nLZUmYCBAMOTBajJiNJpYsToJxLbYW70eAnxu0Knw6Z0+MmQP7bC9JiO938qgXaZQ6ANm4skEDuCs\\nkaEyax3OaLqoN2wPIy9qRzmqUrR/AyrpwzSNGR/mTqVAcTDAaI6TTOgNejVTpn5j0qtk0kXGi4E+\\n9VyafPe+Q0Hi22vRyOvpaPUHCTjMmIxGjCYzdk+QxN729GkZ36HvvnE/aKoUu/oTH4oEmJS2tlCc\\nhMUIaBSrKg8ZnGNyRVmNTmtkiHk06nrGbCROeGKMrRW7/QtWtVbMWIcNTK0vhcHX06ejVFEZAC6c\\n9ln6Vk2YrXpa9Zv9sWd6tNffF4oQ8UcA6FbzVJqXxxlsAcLDhv/VikO9oncOrDjj+CfNxxf3YMJs\\n0dOuW0lxnC6itDTu8shZLOf5xOBO54vHx2ANElvVK/TdgjJzg+CcaUWvBQwokzpOU1JaaLN8Rk8l\\nvb9PsT1gxZVkZzM0sT4hvo5GJU+NASZzlGDCT9Cp1+EKxeqcHT5WQvGYdNx/Y2fNUw4+F2eY3dak\\nnKsBYI/6WQ2EcKBPyyjXbk67TvmYXO2yIB+0S5ymZNDt+2DG7NHrDa18is/ZMs1O70Hbc4tkYQOL\\nO+UD/vP64NbjtE4TDb2X3jF1zrsVu8cAReh3uvR4yB/GhN3hAmr0Gg06GszUNhFXaHRaesZtDjiw\\nfYv21JlGZxjsb5AFEr+oozevObr2qpnI1jZhx4QTrumhdYZptTLei3ne628gTMBrxmz0E7fkyXQb\\nFEoKYcd5yLcJXyiGuZBG0wrU1QRujxH6CtW83v/vjQYmhoBOuv5pCwOJq4x4o5sEiweUtA6l1AGl\\nFIAVTzhAOBDF77PONGLa7Z6vsmLA+IDPbH+Q4o/XqWuvS/ju12G3uwGVPmWa7U08I9G4k+oGowtq\\nmbxRtkNlPhU7tMop9st6OtpcYQKRAJGAD+uVm2swaJL5nKc0XAMishq9dd0P8QX1FcpZvSfWFffh\\nxIkp6uXkU2XKNKqbGWwOPAYjzUEfpdUB/3gNUPLzL8cS2GTNUeIgVadVPODQZmUvMT2zvlxnwUnY\\n78bgsBDxpfhc7VHOl4n7I9c63QwEiMX7ZDJVcscZ/C8TOI09qtk0NQZ4kkkc6VOyUxZWvS1PEY+B\\nlVBylWLtBFVTyB0p5I70xbB9gTChUIiAa3kaXzLkJL5fRiMztQNvM+hz1qlycnhyEc7pXaJM4vHQ\\nqJUK1Ds3H9Xvaaj5zxwV9PEbZ9TDZZzHZa+/NezDvQIYXXhCeno2T4soI53/Jk+A2JURocuF9MKE\\n/LKQ1pdgsAbZ/ekHdpIRXBeV9A5KIcPB+//j7acyN0bZ93q0qylOMioA1nAAtzyyAgAr4Z0f+WF3\\njdDlzUVbLXD66T3//eMT1SvDhwPKlIqXL+ZPc3NHDIjZFfb/w+vXr8f+938fL0Oqz/NgcOL36j07\\nVrd/6jQq8XgZMOFN7FxMjaimjsmp00bgL9dZWHEG8TgArHgDHuB69N0oVyRBwmnkrJkiU+zQU3Ok\\nch2M5iirUa9Mr/kOmFyrPP/lKRtRH7ZheT/QWlRyx3x88zsfMo2lGclf2JH727bCO2e2OjBTQqNM\\ns9UnYJnUn9GhpeijfEar5YEf8h6tpl7BNDmdWKWCeUdmrPYVoIdWbtLug/m2rqlhGH2TAa2uviXG\\nqK52cytx2uhxeHddemu/sLER0PMFDfc/klEyfPps4+XT8d75aZE8K64k67HLBa9GV1cOBs/nyhvx\\nBmM4To9oUqBYSeC72BbPQWBkRKiy6qQ3XEjPsRqaukCmjOA+gBUHocQWocQW/bMWjbpC/vSIojqg\\nUTilHAuMLY40bTTdaA6ylpi0mN7dyYJ631arpS+IZySA48oI7WwLI5lwBlfZCa6y0+/RairU8hmO\\nCnX67QLZchTftYXVXERjVsrZEpqa4uCzlWc7Epr/9V0uZmrxRvAP8wB9GtURtUJPn0YVdU7YFm+y\\nQbuJMqw3euzXO2wlP//SrIQ3t2kq78l2VU4+fGJlwij65ToL4IlcRs1Z/WFChirFwdXouxFGF/G1\\nKPl3GcqpT2hWhSYQ3kjgXelQv3r86NV9Z4utfc+MVh+xTR+xTeh3mihqmezRKTVNo3ZcQI048SxB\\nT87CNu5nZXC4CFmMZLp9CtkiEe/1kJ12MUO6qy/MEvK5HmSl9XM9NcdpbjiCGPRMXcVV3M7pDmEm\\njUaGXDGKO3K1ENbodExYrXq2brBYcVgMVLoDGo0W/YB5JMPv0KidL9plnbGCZif+5Dnrfsniv6rh\\ngoaRiJeMWkGrKjS1CJZbksHiX+fpThzHRUY+vrpy+t3/kp5wXi1XphW+XHHZ6g3ip0qFKtmjzwyq\\nPcBJOHjzVmziHno9eibTRYPcuGLH7bfjshvp/PaJOg1u2Zp+yj73YtENOiWyp/rIrCXsuUN4fJ9e\\nz4jp4uYyYXf5sbscGLq/87nWQ+tdvbmsxPZ22QiYCax0eTsMIU553RcjjuLh3LRa/uhOJ93aIb++\\nPrx2jD7/Oo7bP0sVt0Mxkx1G5YVxP/SCvGI2Jg/JvQTqmxNUTZsYmXW+zgJA+fD/mJD0evRd3DNx\\nNyOTN85GqMx+UUHRwOxaJx40A7eEA4rF0OvRN5ku6mVGqwOf1YF7pc+/3mUYoHHWg2UI0/j+czGj\\nh/hmhOKHLN3qIW8/aBO3wgOwhzYJT1gca9A7o9e7/rrBZJq6l/roVngq6KE/YRnnuQ+TJ8pGqMh+\\nsUPp8A2Ds9Gt8JqUs8ccZgesv3g6XDHfgSfiIJ1SaZyekHJsEvfZMaFRzx2RHq52Hgz5JvbIXvbW\\nd8i9/53P1RbF0yJh/6Stdvr0emf0rt0RpstKpLib4ch9Pq+H0xsMVsxXEmy0Z71XO+a3dxm6lQwl\\nJYxjWMEbNAucFm6PpdVXXI5i95x3EvkIho1UCj0a1SoAFt/liJF4eO3yAe+KK6zGong9NswGA4OB\\nhlIoUAcM+DBfKb1kNP37NrYVnqYvrhmLzR+RMWiX+PhnEdtqlIjfi3XFoG+zWC9QrOn5g90y3t1r\\nNIQJDRdx9SR22G6/5VOxQ+FgH4dt9i28xH31KGdTTIm8HjNt/vWFsa3w9MaddyMqW9x+QybXKju7\\nLf7cv7qqPQzOKuRObp9uMbgWfTfKTCCRwFs8pMYKkWRUBtwerXnr1H2qp79z3A6TiAbwOC2YDAb6\\nvRbloh7pYzTbrtUbvldL8Wea/Ws82+7z4VOediXFu8r10E1HeIu9jcl73BcP/0vxSg/h+WIa/pHX\\nJodxg9EWZuvJuuxxf29mgptP6Rk+cFhoUz55T/nk+jGNRoe+ewUjRjyxDRLKR9KKSmb/DzJXjnaG\\nN4ne2rtvJbK5Rf3NASX1mOO0i70rexv3B6e8/dfptTNl0Z27mfYsAXjWAzc24EzeJLtJlbepOtnD\\nzzgduwSsl9vfGQjz5G/b1ytxPYWj/74n29Xn10c95w2HkYX1hocGpuy8cdv1z7Z/87JrUc3X6Kh9\\nDpXChPfN+NZW8c+xYNZDmzYFQBZZeliF/f9Q2L/+usHsIbmzd23Papg+Ree888dQLVDT6tSGCy5d\\nZfUkiU/cjeXiCMKbu3Tab0mrKicfUjh/Xsctnbhf3GhYtnf9B55N2Ne8nf/Ab4eV4fzryNg9Mn0h\\nZjP+xC47E/a4B8nPvyZbcIvddoe3qfFA+fOFcMHJ5o8/THj2zwdhehfRd5OKCIMtSHKjiqEdJOqd\\nrVPutjxFOpQf3s116gkp21OoZLq0BpeLpI6zEt6MzDxVZ9EtSXPTiCO8xc++MKV8gUKpgtLSMJjt\\neHw+QqE4Ic9DZ9BmHB4fvlCIWMiDWVZXfxgmO5Htn/GFCmSKRapVhbYGRpsLvzdEOBbEaxu5rU0u\\nks9+wJ1LkytVqagdztMmFIsT8dtnGvkxWIOsb1ZRPhappo7Iup+xKr01X5EVd8BHKJogcuuzasQT\\n3yRRfUNaLXF07MG5ab7Y/s6zPmV0xuQhmvCSPby+4rK+sF6Gk0Yfk3mVgFfS/suxE3vxC85ykVK5\\nSq2uP+NfNr8Wi8DmCuALBIlG7j7VwhF7wV9cJUrFMlWljtLS12OZq7w2uYhvJKi9OUHVMhx+dsj8\\n+6/gPCzbQJjYlEhIWzBGLF0j221QKCqE16ePzRptLnzeAKFoGL9d8vTHYbT8Pp8ec7kQri28Smhi\\n1JyVUCxCuppBa2Qo1aIkJuYRRlyxPZ5+mYsX34rJx9bffsZXzlEpqSi1Oh2W9xk3vHr16o/Xr1+P\\nvfjq1atvdDnia5J0X06S7stJ0n05SbovJ0n35STpvpwk3ZfTtHRfkgAFIYQQQgghhBDi+yWNeyGE\\nEEIIIYQQYsFJ414IIYQQQgghhFhw0rgXQgghhBBCCCEWnDTuhRBCCCGEEEKIBTdxtXwhhBBCCCGE\\nEEI8frJavhBCCCGEEEII8Z1Y6Xa73/oahBBCCCGEEEIIcQfnbfoVi8XyjS9FCCGEEEIIIYQQd3He\\npl+Z9OZ5zL74vl1da0HSfTlIui8nSfflJOm+nCTdl5Ok+3KSdF9O09bMm9i4F0II8f36xz/+IYX/\\nEvj73//+rS9BCCGEEF+RLKgnhBBCCCGEEEIsOGncCyGEEEIIIYQQC04a90IIIYQQQgghxIKTxr0Q\\nQgghhBBCCLHgpHEvhBBCCCGEEEIsuAVfLV+jsP8bn0q9qUdYAzu83AthHj2rcsh/PuQBCG7/wm7Y\\neu08Jf1v3qbOMBqSvPifBM4pnz/rceJLuEz/SekMKql/viU96ONIvuDHhHvqOQP1lH++OQFg4+Ur\\nYq7J3yjp/fUNuiU+/npAhcGNx52nZ2uYRldZ7B58wSjxWACb6fzVefKQu+U34nZK+v94m+pgJM6z\\n/7eOe6zbWSX161vS3T626FN+2PRhGnl30Mzyx+9HtPCw8/Nzgrbzd3q0q0WyhRLVcp0OYHMF8AWC\\nRCOj98D5Ndztvrme5n2U9DvepuqAi/UXT4m7F7yofQhnTYq5HIVSBaWlAWYcHjcef5hoyIdtBW56\\nHm2uAL5glNWoB7NBf+22fLtb2ufX/RIGAuz+ZY+AZbb8JLz7V7aD5huOteIO+AhFE0Q8lyk/ej3T\\n3FS+LIOBplDIlChVz++D4W8ZjhP0WTExnkbnaTH2Gbek+0BTKeULF/eawWzH4/MRCsUJea581rxp\\nfMP9c1P+Ii7Ncg+M6qolCvk8xapCWxvmyb4QoXgY9w2F7XnZ0AScq895seaZPKLZ61ApZCiUqlTU\\nDgA2lwePL0wkHMBBZa46iJT/N5tW1uplgo9QLE7Eb792H8B898K89fqrbso3HrslrHF0KOdLF/+q\\nZYs0ggmcEsMgxHet21LIpxSKxTB7z7bxXe/TE9+I2xvBnDpBI0OtnsTtvcyQB02VSrcPQDen0Fz3\\njTX+G0qJJmDxBnEPG/aDM4WTjwdklO7Y97TVMlm1TC7jIbmzx6r39iJw3vumXTpkP1UHzER2d6Vh\\nDww6JQ7eHFDSRivHGk2lTFMpoxl/YTdy8w97nnbFUpJnzxI4v2njqUO9nKNeLlNd22N31S1hkLfq\\n0ywc8eFTns7Y6+e/ZY6Mf529nTj2B/6OgdaiVmhRK2TIhLfY24jM0PieP43vkr8sl9nvAYcJ6LXI\\nH33gsNAeO7rbUsi3FPKZNLHtp6yF7RPSpk+tlKU5/FfzNEc16iFguXJYTyX17i1ptT/2cltVaKsK\\njZ6FF7F7/tliRhpNpcCxUkBJvmAvMfLM3eteuJu75RuPw3eT88zaYzZoVshXL0cFzpopirUoTv93\\n81MI8V0xWII8eRW8+Pek0bhRreH/j0VX9Hq06xkOP6VR2gWO0j7c24GxnuF5et2lh/5hGRwuQhYj\\nmW6fqtog6XVfvHfeeAfoX2v8N1GK+rt2nxPL8LXM+/dk1D7gIr69TjTgxMyAbqtM7iRFVlE4efce\\n4w/PiV3p2Z33vhnVU0852C+iYSay9ZyNoPQgQY9q5pCSNsDkiLK9k8BrM2EY9Og0FMq5GvYJPSaj\\nz1i/p9Esp9j/lKejpjjJ+3gWv3/c1KRR4duP7XOmtSif7HNYaFM5OaLg+4GoY/z4ZR+hv6pbPuTd\\npyIaYPMn2VyL4LKaMAw06vljDo/L2JwurCZgenDUjbTKCe8+5ce/w2Ji0O9QL6Y4Oi7TLBzyYbDC\\n853Atfx73jQevX/6vR7dRp7jwxMqbT1/Mf348to5y2yue4AelZP3HBY6gJnA2jZrYTcWI5x16xRT\\nR5yU22Q/vaVv+pGtwJWIjLMapcxl5+6AMvlSg8CVfEMtHJFW+xjwsfZ8k4jTjIEB3Y5CNZeHgAej\\nhbnqIGI24xGww2fu+AOHxS61VA4l4sZnhvveC3e6nkGfs7MW1dMTjrM1moVDPhotvLgSOfhYLVln\\n82VPntmXJBnW//xyvkz35hOFEIvMZMLmS7IW12vb3YJC444VSPEFGF14gnp+3M4pNC7euGy8n6uq\\nl+8O2g2qjT7gxO/RqwjtQooTVX9t7cVz1sNurCYjRpMJmyvMxpM94k4joJJJFW/O++e4b3rqKR8+\\nnKACvuQeG5GHG0FYbC0aeX3E3uoPEnCYMRmNGE1m7J4gib3tWyvHRpMZV3idtbBerVIz1YtOvK/P\\nyIrZSXh9nZDBADSoKI1bz1pqfYXsURkNvdPm+ZMEXvv5fWDFG9/j+U8/sZtw373i3FfIfM5f/w6T\\nkRWzHX98j2c7AQBaxc8UlP4NHzZ/GhtNJmyeOHvPdgiaDYBKNlu+az/F92fOe6CnZDjM6eP74Z2X\\n7K36sJlNGE0mLHYfq3vP2A6aAI3S5yz1K8nZqRQoDgYYzXGSCb1sUDPlK8dptFQ9JzH7gwQ9Vkzn\\nZYXDT2zrqXTQfTX6M+fznXfsD+gPA73uey/ciUG/ntDGE3aT+jU1cymuVEceraWqe4z25PlCESL+\\nCADdap7KgiSYEOLuLBZ9hHCAxpnUuh4RI25vGICeVkEd5seDpkKp0cdAmPV1vWI+2vjvKCXqgMns\\nx+UA0KjXFAAs3ggh94QizuQiFvcDoFVL1NvXD7nqtvum3ylx+CGFooE9tMNWQsK0L5kxe/RJ8q18\\nis/ZMs1Oj/nrXybMVv1zBmfc4fyHZVgxY0W/Hq33ra/mcRs0VYrDqTWhSIBJfTlW++Q5tg/5HbZQ\\nnITFCGgUq+qt99Bd0thgDRJb1RuT0ol8ad57oFHXR/iNxAkHJkVAWQnFVjEDPe2U2liLrkk5VwPA\\nHvWzGgjhGB5Xro3OrTZhtujp262kOE4XUVraRaNSfGX9DrWqCsCKy4V9eJPc7164LyOe2CqRBevI\\nXapY9POePANhAl4zZqOfuCVPptugUFIIO6YstiEevU75gP+8PvjWlyEeuW73fKafAaNh/L1J99C0\\nsLt5jhWzMbk8RAxZ8gO9AI06nHTUKk3AGvAQ9A+oHVeoaRXUZgKnQ6Ou6BUBW9QzDO3r0CnrNbMV\\nt31iBRLAbHNgpoSGgjZpXZ8rbrpver0qJ/vl4XxyF/HV0NTvXU5WQslVirUTVE0hd6SQO9IXK/IF\\nwoRCIQKuWcIoe2gdPW0NK9dHJo7evOZozisr7P+Hwv6Vq511it+ZRme4wJbRcL3mMOl6Lhd2XS5a\\np4mGnkc67PPVsial0d2/w4rdY4Ai9DtdetxcCb4tjaex292ASp8yzfYmHll5d857QKPT0jNmc8CB\\nbWpy2nFjoMyA7lmP81yhp5TJDiO6wn43BoeFiC/F52qPcr5M3B8Z5tFGvNFNgsUDSlqHUuqAUgrA\\niiccIByI4p+wwJ94GP1Bij9ep669bjQHWd+ODtfeuN+98CBMdhweI9R6tBsdNJyPfkrmd9O4v72y\\nfdmTZw370Nc4cuEJmcmcdmieFlHiHnzfzS8ihLgwnDt9dKw3Bi0BH87HnjsvG5MbX8RIPtejVW3Q\\nja1QK+vp5Ql4sdj6+L1GajW98R9ZaVMp9QEzAfcXqj3PcN+c1UpcLtGqkjkt4t2RBv4ok2uV5784\\nyGdy5MpV2pq+WFEld0wll8G//pTduHNqdex8zv1JQR8GdcV92OGWtau/lPO5oZ8pDgaAk6Dn7kvA\\nicdI0nhx9agWs2jAijOIxwFgxRvwQLUyjNSNXKyFYLAG2f3Jji+XI1fMo7YBOiiFDEohgzO8x9Pt\\n6+sziC+nrymU8gqeDZ+Uo3e0NE3Zy548CAbPF0Qw4g3GcJwe0aRAsZLAN2FbPPH43bYVnlg+N/YK\\nr18fmZMF9b41Ey5vEHJ5tFqFWtVApdbHQADfcI8bb8AFtRqtagPV2qDCACMh3K7zZqEVa8AAJTir\\nt+jinlg50Nrno0gezFdKwXnvm/P3osEumWydVvGAQ5t1fKVfgdHqI7bpI7YJ/U4TRS2TPTqlpmnU\\njguoESeekSGyadFYK64ka5HrnTk3bYU3zTwL6k0bQfYlN4i4rqe0LKh3yWw9j5Qp02z1CVhmfzJu\\n2wpvvu/o0FKGI/FWy7UR2XnTeJpWq65/BwEctlsOXhLz3QNmrPYVoIdWbtLug3licraoD7v4LCt6\\nag7aZQoFvc7niQQudl6w+sOEDFWKgwmRuisOQoktQokt+mctGnWF/OkRRXVAo3BKORaQhRG/gGtb\\nSg870w/ep6lm33Ps0Lcqv+u98GB6LZrDNTpsTutC1Pu+m8b9zZXty548gPS7/yU94aharkwrfJ9t\\nWIQQj5nJHmXv+SbeRcidl9CK04OfAhWqpI9adBhg8XlxDVvoVpcPBzWatQLHPX003Rr3jWxlasbt\\n9UCpQreWIl8LkfReqQn0VLKZin6073L7vJvcdN8YzB7WnmwTc2nYz97yqdihmjoi63nB6qQ5/8uo\\n16NvMl1Upo1WBz6rA/dKn3+9y1yuZXBDnWzSPvffWnDjB7Zj0yMOhG50N4xCtkjEG7nW6aa1O5hs\\n1jv/lrN8R7uYId3Vo31CPhdGbo/+mDeNB50S2VN9Xq4l7PnGWzY+HvPeA053CDNpNDLkilHc17bK\\n7FDMnqIBJvMq3mFe26jkqQ1TtXz4f7w+vH4tY5G6vR49k+ki6zGu2HH77bjsRjq/faJOAxkf+kpM\\nJmy+MCF/FrXSQ1UaaGHrne+Fh9FHyZ6SH0bw+Bdkjs1307i/yaBZ4LRw+6omZ40MFSWK3TN6Y/Tp\\n9c7ocbU2YcI0lmnPepx47HpnZ/R6V9PRgMl0l/tCfCujvcKDdoH3vx1Sa+XIlsJ4Y4uRQS8bg8WD\\nP2ikUurRaevz3N0B70Ul0ODwEHQaaTZUVL1tj9/tGKt428JJ1vI1TlSN9Lu39CdthdcYbpOXvB4+\\nP+99Y3GHCbqMgJXw5i6d9lvSaoP0x0/YXu4ycf2fpdKnevo7x+0wiWgAj9OCyWCg32tRLuqj6kaz\\n7VoExWOLjhndJq16/F/eZzpUTguoISeepahJ3YPRQ2wjQPFjkW71kLcftLFt0BrlLMefsqwkX7B7\\n14gXo4f4ZoTih+z4d1zZCg/AHtok7Ln+LfdJ47Gt8Ibrb8Ri07fNXDpz3gMmT5ytaJEPuQ6lwzcM\\nziZtf9YDzAQ3Y7iNMDirkDu5fcGzwUikbrt8wLviCquxKF6PDbPBwGCgoRQK1AEDvmt5k/hCej3a\\n9QLFit5eM1nNev5/h3vh2kfPVK8fMbYVnh6J44gmCS1IBMcS3LKX298ZCPPkb9vX59X3FI7++55s\\nV6NQrBL1BC7PHpzy9l+n1z716sI4sx4nHr/U+39zNSj3vMJ/TtJ7sRhsYTZ3Ff7cL1I9+kzW9ZzY\\nlTDLaWHA10LH5jxWzONy5B30sHm/e7R17MATdEBDb9kbieK9Vut2EH/6lLOPB2QUlcynP8l8Gj/C\\nYPaQ3Nm7tsf9VbPcN2NMLhK727TfHFDSShx99uB6en2Eaqn0FCqZLq1Biv3y9ekOeqdIZGKF7Eub\\nFoZ9cz5uxJfYJVF/S1rN8fnIxbMJayxMW+BvnqkA3xNLYItn20Y+fMrTrqR4V7l+L9gaKp2e+87R\\nk2b/Gs+2+zd+hyO8xd7GbXOoZ0vjaffPef4iodzj5rkHHCYT/rWnbPU/cFhoUz55T/nk6tFWYttP\\nWRvua36+aDY42fzxhwm/f4fc+9/5XO0NI3V91PI1OmqfQ6Uw4YrN+NZW8cvUii9i2hQ4nYtI4DwP\\nnv9euGq2ev3063GEt9hbW4w97mEJGvej29951qOTF8wzeYgmvGQPK3QKBaqrsniGEN8bW3CdjWqd\\n/aJK+jCN88Ua7kXJqZeI1e3HTYU6YPZeD5t3uv2YUdGYHvZqWPGw/vwnItUi2UKJarlOh2FodyBI\\nNBLANmPaz3vfGKxBkhtVlH19hOowbV/u+fcmH1t/+xlfOUelpKLU9LQw2lz4vAFC0TB++4JVRUwu\\n4psJan+coBYPSHncbMt6Pbcw4ghv8bMvSCFTolStoLQ0wIo74CMUjhMcrkw+uPP2ceffEaaUL1Ao\\n6d9hMNvx+HyEQnFCnhlrd3dI47vkL8tl9nsAAJOdyPbP+CIlCvk8xapCWwOL3YPPFyIUD+O+SM7L\\nRbNt4dUpI6xWQrEI6WoGrZGhVIuSfPELznKRUrlKra5//p3uF/EgjDYXfm+IaCI6krbMeS88jEW+\\nDwyvXr364/Xr12Mvvnr16htdjviaJN2Xk6T7chpN93/84x+S7kvg73//uzzvS0rSfTlJui8nSffl\\nNC3dl3YwQQghhBBCCCGE+F5I414IIYQQQgghhFhw0rgXQgghhBBCCCEWnDTuhRBCCCGEEEKIBSeN\\neyGEEEIIIYQQYsFNXC1fCCGEEEIIIYQQj5+sli+EEEIIIYQQQnwnVrrd7re+BiGEEEIIIYQQQtzB\\neZt+xWKxfONLEUIIIYQQQgghxF2ct+lXJr15HrMvvm9X11qQdF8Oku7LSdJ9OUm6LydJ9+Uk6b6c\\nJN2X07Q182TOvRBCCCGEEEIIseCkcS+EEEIIIYQQQiw4adwLIYQQQgghhBALThr3QgghhBBCCCHE\\ngpPGvRBCCCGEEEIIseCkcS+EEEIIIYQQQiy4iVvhPVaDsyqff/9AvjvAk3zB04T7Su+ERungDfvF\\nDo7oU15s+jCdn9vM8sfvRzQB5+pzXqx5rvVsDLolPv56QIXBlXesuAM+QtEEEY95huPB5grgCwSJ\\nRgLYTNfeFnMaqKf8880JABsvXxFzzXJWk9M/3nDS6GMyr/L0lzXc17qzNAr7v/Gp1Lt2z+hUUv98\\nS3rQx5F8wY8J99g5VxltLnzeAKFoGL99oR6vr6hHs5InX6xQLdfpABa7B18wTCQSwjl8xG5L825p\\nn1/3SxgIsPuXPQKW2c8xGpK8+J8EzivfM8pgtuPxBYnGo5PTsteilM9RKlepqB3AjMPjIxQJEwq4\\nMRv0w5T0v3mbOhv7zkuX95I1sMPLvRDm69+01Ebz2fDuX9kOzvIL3fzsn6fJbTZeviLK5Pvj6nGz\\n5UniNufP6G3Cu39ly63MVWaP61H69Cv7hR4GfOz8/JSg7fJdNfsnb47qY/nL2NmNU979cYKKi80f\\nXxJ1zPVnLrHp5afNFcAXjLIa9Vzkn7M9/7flo5fl+MTPmCkvv+k7+ijpd7xN1QEX6y+eEndL+X+b\\nh6hDa5VD/vMhD0Bw+xd2w9br3zNnGX9b+TC5LBez6KolCvk8xapCW9PrzG63j0gkQsB1+URNSwO9\\nrhglHhu/LybVsy7vrxVWn/zEmn/8mZxUX/xe2nULNXJvWPERT/gAqKdOqbTH3+/VMhwVOxjwsRob\\nbaT1qZWyNIf/ap7mqHbn+eYO9XKOw7e/8+G0Tn+GM9pqmezxR/7721tOa7dXIsXD6yllsg09tXra\\nKYWKduPxzdwnjkude31nv61Szh3z4b//5UNK4Xr1ZbkNzhSO3/6X3z8ckxs27AG6LYV86oA//vOG\\n48r90uChDLQWtUKKD//9g6Py+DVptRRvf/sv+8e5YWUQQKOpFDje/5P//vmZ2uP4M5bSvM+++N7c\\nXmYP2mUKBf2dAVXypfHjXOEkMYuRAWVOs8qVz+hQTJ2iAs74GmFp2D+Itlome/SW//6ZpvGVCs+H\\nyMvbpUP2U3XATGR3Vxr2D2C2OnSHcv6yI7CWLdKYpYI+dFMZLx5Yr0X+02/8+mafVEFv2INeZ64V\\nUnx88x/++FTmtqaZXlf8yO9/fKI6c5JpZA8/c98kXqR23cLlQLbQKol8jXSjSjpdxrMTGPaeNsml\\ncmiAJ7mKf6QHfnBWo5S5vGUGlMmXGgTi0/vdLnt3+5xpLcon+xwW2lROjij4frjWSz/aG9zv9eg2\\n8hwfnlBpK5y8e49Jeva/sh7VYpbRKn0lU6QVjGOfeo5Gfn8fu/U5Mdds/V5jPfj9Hmdag/zxISfl\\nNpX0W/ZXfuBpTPp3Aeg3Sb9/T0btAy7i2+tEA07MhgFn7SqZo2PyLSsux/We96/lYgR20Oesq3D6\\n6ZCM0iH3MY33b9v4VvQRuw/v0qjAiivKxkYcv92MgR6taobjowyazYXdctu3iS/j9mffk/gbrxLn\\n706Kzrk0UC//W0bovzxLcJdXwd3hv24ekR2M1ATnLbMblTy1kdGZeqqAEnXjO68VmTzE1/1k90s0\\nMifkg8+JOfVyQatkSVd7GAiwGrseBShmM5qm/Z5Gs5xi/1OejpriJO/j2Q11tIfwEHl5Tz3lYL+I\\nhpnI1nM2gt+u/Fpkd6lDD5oV8tXLXqCzZopiLYrTP71pM0sZf05G6B+KRunzew6LelRMYG2btbAb\\ni9FAv9+ienrCcbaN2+fk6qM2lga9Hu16hsNPaZR2gaO0D/d2gFkG0ftaicN9O9ZnCZwzjrovcrtu\\n8coko4v4WhQz0Cp+JlfTu+m6pVNO1D5Gc5xkbDxcv1MpUBwM9PcS+mOqZsrUZ+rhM7JidhJeXydk\\nMAANKkrj5jNMJmyeOHvPdgiaDYBKNluWUdyv6HJUxkw8mcABnDUyVJTbEl0lfXjHUQOjiRWrh9W9\\nZ2yH9AK+dpSj+rg7+L6adilFWu0DTtZePGc97MZqMmI0mrA4gmw8ecbLl7sEHkPdyGBkxepjbSOO\\nAxhQoF4/Y3TEbsWxyrNnm4RcVkwmI0aTGWdwnafPf+TZdgiL4Rv/DUvq7s+++D7MUGb3FcpZPZYv\\nkEwSMhgYUKB4JWrIElxj02cCVDKpoj6q1FfJpfNoQGBr/Vq4vrgbo8mMK7zOWliveauZKq0v+o33\\nz8t76ikfPpygAr7kHhsR+wJWqh+f2erQlxG5Zl+SZFj/5cv520d/gRvKePHQekqOo6Ket4Z3XrK3\\n6sNmNmE06Xl1aOMZP/31RzZuq/yZTNh8Sdbieg97t6DMVVc/U1McZ2aLvr5q0dp1C5kPmbxx1oIm\\nQCOfytHsKWSOKwAEN+K4x3plmpRzNQDsUT+rgRAO9FDN8hxhFYYVM1b0HF7rzXZrGKxBYqt6Z8K8\\nN6G4n/NRGZM5SjDhJ+g0AhqFYvXWh/GsecrB5+JsBcREVkLxmBQYYzTqNQUAizdC6PriB2Cy8w0H\\n7Scbfe77AwZdlVpVf/490cjEHmCj3SEN+2/oPs+++H7cVGZrtRKZbh8DAYLhKIGInh/VcuUrDUor\\nocQqDqBbTZGtaLSLp6QbfVYcSeKhx5ZhLToTZqueZoMz7lQJn9V98/J+p8ThhxSKBvbQDlvX1oAS\\n93VTHXo0ItcXihDxR/TjqnkqzWsfNd2VMl48vEa9iAaYzKuEpzTgV8yzT2K3WPTPGKBxNmehrqQ/\\ncnSP6beL0q5buLB8nZnQapJ86QhVPebwnQu128fsWid+ZaGUy7mXTsJ+NwaHhYgvxedqj3K+TNwf\\nuRYGMsngTKMzDOEzGmbPwu12N6DSp0yzvYlH4nu+vJFRGVfchxMnpqiXk08VOoUC1dXA2MJJ5yyB\\nTdYcJQ5SdVrFAw5tVvYSd2ulGWwOPAYjzUEfpdWBG8LElkOHTll/flbc9pmeuVFHb15z9PAXdbuR\\n595gALqdi4VW3HP2RPQHKf54nXroKxSj7vjsz2rSfTgplF98e9PL7Mt5utZwEK9lBQIxzLk0WiND\\nRYli91web3JFSUbzfMh1yKU+UNdUwEwkGcUprbkH1kPrDPPblS88+nSPvLzXq3KyX6akDQAX8dXQ\\n3GWamM20OvR5RK6BMAGvGbPRT9ySJ9NtUCgphB0zTpe5WsaPmFZmy/SseWh0WvoA14rbjm1SovR7\\n9AYABkym21Ot2z1vnBswzlhFD23uYC0eklYvp99GZzv1mkVo1y1s0WRwREjE9QxZVS8L2/H51Jdz\\nL1ecQTwOACvegAeYtYevz5nWoHD0meJgADgJeqbP2hbf3vmoDDjxe/Wnzur248XAgCqFyuRpFQZM\\neBM7FyH11dQxOVVG3ReK0ciDTIEa9DnrVDk5PKEJGAjgdck69o/dXZ998T25ucwenafr83swASaX\\nh5BlWoSHCV8sgRcD/aaKqoHFlyS69B22D6vf01ALx5wU9F/fFffdsD7OVUZWvmJynNVKlNTzUV6V\\nzOl9Iv3E/C4jcq1hH+4VwOjCExquwHVaRLmt6iZl/KPRrRzyr3/9i//8O8ONJXSvR7ua4uhYXwjH\\nEvBd7K50G8OKl8Tu9kVIffoow/dcvV/g0smIN7aGP6NvWWANrBP1jvdVjK6G64kELgoKqz9MyFCl\\nOJjew1fY/w+F/evf6ktuEJlxsTWAVqs+vNoAjnuMGIlZXY7KWLwR/MOWnsEWIBw+olbo6estRJ0T\\ntsUDsBLe3KapvCfbVTn58ImVwfzBgYN2E2V4nscuoZtgxRowQAnO6i26uOca6bhpW7sxwxC7JgNa\\nXQ2ubIjU1W4Ox5ocIWAmvKvPrR1gxY+BCgPqzQ4x1+xpe9tWeOK+7vvs305GbB6v2crsy3m6RuIE\\nvMMqkNFDIOYgc6xOjPAw2IKsJvPUUirgJJ6QkdqH0Ckf8J/XB9deX3ElWYvMMxxmwjTcO++s3uGM\\nKzl/7wzt6tZWlrvn5QBGc5BosEsmOxrpJ6H5D21SHXp0N5Rg8HxnLCPeYAzH6RFNChQrCXwTtsW7\\nrYwfJQvqPQQzVvsK0EMrN2n3wTzHQzItesJoDrK+Pt/WwQZrkK2dBsq7DJqa4uOnu3XmLEK7boEb\\n92CwWHEYDFQGA0wO67VEHl0Nt3z4f7w+vP4ZzdMiStwztkLmNMGNH9iOOWfOvAedEtlTvR/KEvbM\\nvEKjuLvRUZlu7ZBfJyS6vt5CHPe0kReTh+ReAvXNCaqmMf8mWh2KmeywNziMW7bFAcy4vR4oVejW\\nUuRrIZJXOuMYdOh0rVjv0RdisFhxWAxUugMajRb9gHnkee3QqOkzas1+64yVczvxJ89Z95uHn+/C\\n6zNSqfaopnLUg+tX1viAQaeDZp3188VDeZBnX3xXrpbZo/N0+2T4838z1845j/AIjq3UbsRmswIq\\nBqxYLNKE+xIm7XM/87k2L1Cir6k022AfqXT3GiqVwQAw47DePy83mD2sPdkm5tKwn73lU7FDNXVE\\n1vOC1bv2HIprJtehx3dDSb/7X9ITzq3lyrTCN+2OdG68jBcPz+kOYSaNRoZcMYo7cr8BL5M9yt7z\\nTbx3SDKTN8luUuVtqo6mzV+7X5R23XdbwxmcVcid3B6COZjSwze6rU71+L+8z3SonBZQQ048t/xq\\nY1smDOdkxWKzbdcgbtc7O6PXu1ryGzCZBpSzKWZZS+W29RZMrlV2dlv8uV+cvXE/thWePkLs3YjO\\n1HG0DGzBpL6NpaqRfveW/uhWeJ06+ZNDMqqbnXutmO/AE3GQTqk0Tk9IOTaJ++yY0KjnjkhXe4CZ\\nYMg3scf3cmS2Q+7973yutiieFgn7zysJVkLJVYrVE1Qtw4d3/bHtk9r1AsefUnS927Ji/hcw6J3R\\n612vPBtMUHmgZ18splnK7EbhdBiqf7P7RniI2Uza3vAm059/E2a3Hz9lKlRJHaexbMRwmg2ctSuk\\nT07RALMrjvci8ubuebnFHSboMqJH+u3Sab8lrTZIf/yE7bHs+LLAbqpDD5oFTgu3R7qdTVg/A2Yp\\n48VDM3mibISK7Bc7lA7fMDgbboVnMtDvdag32lPPHY2eGLQLvP/tkForR7YUxnunbaaNeBI7bLf1\\nTrlZLVq77rttdpwvtgFONn+8vsft5YPdu+jhmxxdYcSX2CVRf0tazfH5yMWzneshedNCAg1mD8md\\nvUe7F+IiSr3/N1eDdIyGJM9/slxMw/Cu/zBxj9x2/gO/HVaG6y1EbkwXW3CL3XaHt6n61GOmhRWC\\nGX9ilx3Z4/6S0UHi6VP6Hw/IKCqZT3+S+XT1oA5qs0PgzsP3RjyxDRLKR9KKSmb/D66OzTnDmzPM\\nl7US2dyi/uaAknrMcdp1EXJpcq7y5Fmf/YM0iprj4E3u2tkrbZVWN4RFKnkPqnj4X4pXBuQNBNh5\\n4XvQZ3+aaQs7ju6HK761KWX2yGKLtvAeP0zYH7lXO+a3dxk0ifB4lKY9/7t/2SNgCbK+p9D8mKdd\\nSfFnZbyWYDB7WN0YX5fpQfJyk4vE7jbtNweUtBJHnz24nkrn4bxmq0NfTqsxEObJlX3pAegpHP33\\nPdmuvn5G1BOYEm07vYw/Ny0k/PKeu+Mfu3TMBDef0jN84LDQpnzynvLJ9aNMzpUbG8sGW5jNXYU/\\n94tUjz6TdT0nNsc06UujnXLTp90ucrvuO+2XvlxswxZeJTQxAayEYhHM6D18pdoN86pNLuKbCVxA\\nq3hAqnB7b4/NFSC2vsdPPz9n1SsVhK+hVclRQ189NRae3Ki2BWPELEagQaGo3LLVjhFPfJPEHJmH\\n0eYiEF3nyU8/8STpebS9et+KYcXD+vOf+PHJOtGAm/P6ksXuIZLc4Ye/vmTdf88WsclF8tkPPNuI\\n4r+YR2nG4Qmz/uQnnm8HZqp4GaxB1jeDmEEPuRxZocfsTfL855/YXZ/wHbsv+OnFJl5p2H817dpD\\nP/tioU0os0cXW5w24mLyRkn49Hdm3i9bPBq2wBY//PSEZNiDbdjXZrS5CEY3ef7j5IbAQ+TlBmuQ\\n5IZeVnSrhxym77aXtrg0qQ49Oq3Gsz4lKtLkIZrwAujrZ0wfFL6xjBcPzGQnsv0zf3m+TezK8+kN\\nx9l5+gs/v4xOGWS9ZAuusxHSp0ilD9PU77pc0UgZMatFatcZXr169cfr16/HXnz16tU3uhzxNUm6\\nLydJ9+Uk6b6cJN2Xk6T7cpJ0X06S7stpWrp/pyP3QgghhBBCCCHE8pDGvRBCCCGEEEIIseCkcS+E\\nEEIIIYQQQiw4adwLIYQQQgghhBALThr3QgghhBBCCCHEgpu4Wr4QQgghhBBCCCEeP1ktXwghhBBC\\nCCGE+E6sdLvdb30NQgghhBBCCCGEuIPzNv2KxWL5xpcihBBCCCGEEEKIuzhv069MevM8Zl98366u\\ntSDpvhwk3ZeTpPtyknRfTpLuy0nSfTlJui+naWvmyZx7IYQQQgghhBBiwUnjXgghhBBCCCGEWHDS\\nuBdCCCGEEEIIIRacNO6FEEIIIYQQQogFJ417IYQQQgghhBBiwUnjXgghhBBCCCGEWHATt8J7rJT0\\nv3mbOpv6vtGQ5MX/JHB0S3z89YAKA8K7f2U7aB47bqCplPIFCqUKSksDrLi9HvzhMKGAG7NheJx6\\nyj/fnACw8fIVMdf493VL+/y6X8JAgN2/7OGq6/++zaRrEg9ncJH+DjZeviDmmtaHpVHY/41PpR6O\\n5At+TJg4ffOGE7WPNbDDy70Q46nURz19x5uTOmbXOs9fxrF/+T9nqUx7xi12D75glHgsgM006cwm\\np3+84aTRx2Re5ekva7ivJPusz/N5PuI8f+OsSTGXG8kvzDg8bjz+MNGQD9vK6D03mPq3yXN/P9Pu\\nDYPZjsfnIxSKE/JM+317tKtFsoUS1XKdDmBzBfAFgkQj0+4poNehUshQKFWpqB1G0z4W9mGddp6Y\\ny21l+7mNl6+IcstzrJYo5PMUqwptDYw2F263j0gkQsB1eX+cf+e15x0YLRvOy4LWHNd49ZrE3Y3m\\n29PMdF9MyN+nfbaepwSJxqP47QtVTX4cbikzjbXZ68pbbmVK2WrFHfARiiaIjOT7dy+Lb69DjOYL\\nnuQLnibcU0dIp9YnxHxmqH9Nyq/NXObxk+vrk8/5XixZrtWnWTjiw6c8nbHXO9RrBeq1AilbmL1n\\n2/is3+gSxQNqkEkXCTyNYJnwbq+W4aTUG3nFQTQZJfsuQ6d8TK4WIOm9zLoH7RKpExUwE0lGpWH/\\nFXVbCvmUQjEXZOflLoErz2dPKZNt9PX/1k4pVGK4H6AhPeiUOHhzQEkbrShoNJUyTaWMZvyF3Yhk\\nFt/SQGtRK7SoFTJkwlvsbUTGGuuDM4WTjwdklO7YeW21TFYtk8t4SO7sseodLw61Wor9gzSKNvbq\\nRdrnTj2sP3l6Q+eh+Kp6LfJHHzgstMde7rdVam2VWiGFM7zHk+3AxPJAiHN6npKiVigQ23vOxtUC\\nR0w1S5m5/iCdoh3q5Rz1cpnq2h67q9Mb2rOYtw5RT51SCT4laJv4YWSOK/e4GgEPV//S1GOO0y72\\nbuiM+d4sZOP+tp6waf113fIh7z4V0QCbP8nmWgSXxYSBHq1qhuOjDD23D8cd83FLcJdXwd3hv77v\\nXqFF0a2myFUCrPmv3upNcqkc2pVXTd44a8E8n0oauVSGoDuB3QjQo5pNU2OANbBO1LssWcS3MfaM\\n93q06xkOP6VRtBIn6QDe7QCX9YMe1WJ2LC0rmSKt4H0jK3pUM4eUtAEmR5TtnQRemwnDoEenoVDO\\n1bBP6AWUEfova+zeGPQ5O2tRPT3hOFujWTjko9HCi03f8P5oknn/nozaB1zEt9eJBpyYGdBtlcmd\\npMgqCifv3mP84Tkxp/5c9xqnfHiXRgVWXFE2NuL47WYMDOg28hwfntC0eHDbJR94CJ7E33iVOP+X\\nSuqfb0kP+sOIKvfYsQN10idolD6/57CoR1cE1rZZC7uxGA30++f3Rxu3z3nnhv081yi+jJuiIibf\\nF3f47EGfs67C6adDMkqH3Mc03r9t41vI2vLXNluZabHMXlcejPTJXpatfc60FuWTfQ4LbSonRxR8\\nPxB1jF/N7GXx/HWIAVVOs1V8F2XNJbWQItvtz/C9Yrq71b+mqaY+cmR7yVZwOTrqlqdm0lfIHpXR\\nAGtgh+dPEnjtZkwmI0aTGWdwnec//ZXn0qv/ndHIp3I0ruSz3dIpJ+qkzNdMKLmBFwNnaop0UY/x\\n6Kk5UrkOBnysrUlHzVdlMmHzJVmL67W6TqFMfaQUHrTLFAp9wEw8mcABnDUyVJT7Fq4tGnm9q9Dq\\nDxJwmDEZ9fzC7gmS2NsmIJnFt2UwsmJ2Etp4wm5Sb2A1cymKTf3tdiE1fM6drL14znrYjdVkxGgy\\nYXOF2XiyR9xpBFQyqSJ6PbJDMXWqN+wdqzx7tknIZR2WFSZsnjhPfvgLL58kcEpY/qPQU3IcDfPq\\n8M5L9lZ92MwmjKbz++MZP/31RxmBFbczGFmx+ljbiOMABhSo12+fjiHg65WZ+nMdXl8nZDAADSpK\\n486fdtc6RDOXonClHjnoljg9umdPk+Dh7yWNwv4x5c7tR34PlqZxP2iqFLv6wxuJTmnAr5iv9cCJ\\nxXfWTJEpjjzRt4RMGWxBVpN6XEgllaGmdSimT2kC7uQq/klhWOKLs1jOK+YD+iPhOY1KnhoDTOYo\\nwYSfoNMIaBSKVXqTPmhmZswefQGOVj7F52yZZqeH9Mc/RkY8sVUiYxU9jXpNAcDijRC6PoESTC5i\\ncT8AWrVEvQ2DrkqtqqeyNxaZ3IA3mTFLYfFoNOp6RJ7JvEp4SgN+RRJMzGPFjBU9/9f60+dvi1Ff\\nt8w0jKZR7+7fcvc6hD718zK4oE8te3LjfH8xq4e/lwaUOdxP07hfxXAhLE2gkdZpogEG3Nhsk/o0\\n+vR6+gNpMJowGsbfPXrzmqMvfpXioUXjccqZDOXDY8q+PQKWy5ApSyBJhFNS5avZhRF3NEEk/4F8\\nN8fJhwZdtYfRHCURXZ45O49Nt3veQWO4fD77CuWsPkzrivtw4sQU9XLyqUKnUKC6Gpg8J24mVkLJ\\nVYq1E1RNIXekkDvSF1vyBcKEQqGxBbrOFfb/Q2H/yifJ1Jwvz2TH4TFCrUe70UFjQKes5+krbvvU\\niCyzzYGZEhoK2hlA56Jy5rJPbij2ez39CIMJk2QI35hGp6WPrK647Uwu3nvoxbsB05UE6w9S/PE6\\n9cWvUiyYM43OMB8wGG45Vgzdrcy8q8FIGhkN1x/8mcriO9YhrLE4/nKObPWQVMnPdtDMoJknnelg\\nIEAiCalU+cH+1uXzcPeS0bDK1k6X4/0impri4LOVZzveL3z939ZCNu6nFcb3WaV20K1wMFxhU1a7\\n/X7YAnHWunk+lcqcZhV8MW0YMuViNRHCeJqZeJ5hxUc84SN/WKGh6iFWwWQcz0I+MQtuOOf+JKOn\\ngzUcwD3M07VaiUxXD7v2e/VoC6vbj5cqNaoUKg2C8eHqHEYjDqA5x1ebXKs8/8VBPpMjV67S1vTF\\nliq5Yyq5DP71p+zGnUjdb5monP5bn28t6ysshm7lUFau/g5MGmS5WPPgDvn7ROdz7g9PaAIGAngf\\nsEH6vZu1zLxfn+hwzv3xZ4qDAeAk6LnbCjtz1SFGmFb8xNe7ZPdLlI4yhH1x2qcpVMC3sUrQfIp0\\nGd7Pw91LRuzBLXbbHd6m6rSKx6R9e3zPzbylaaqYreejM2WarT4By3xZy01bq4jHTJ9DXyodUsuc\\n8L7RQWGAJ7lO2GHkptSzhVZJ5GukG31WHEniIZmv+bVM68AzmoOsJc4X0+tQzuspaPFG8A8X0zHY\\nAoTDR9QKPdRMmXrUqW9pMwzhazKg1dW3VBnV1SZPxjJafcQ2fcQ2od9poqhlsken1DSN2nEBNeJk\\ndDktafB9I70WzeEcSZvTihkL1oABSnBWb9HFPXH0XmufR3V5MK8ARit+DFQYUG92iLnkuX/czFjt\\nK0APrdyk3QfzHMX7bVvhiQVxx/z93OToTDPh3XVZW2VOs5SZnjvMkpk0Eg/gS24QmbBrye1l8Zx1\\niCsswTU2i1U+VzOcfGjQVnqsOJIkI06MFenyfwgPdy8Z8SR22FR/53NVI7//kYr5+83fF7Jxf5fe\\nd4PDRchiJNPtU8gWiXgnb48mvj8GW5DkWoHaSR1FYSS8/upa+VcYrVhtBmiAyWZlzv4g8YAm7XM/\\naFbIV/XMuVs75NfXh9fO62mnlGtx3P4VDBYrDouBSndAo9GiHzCP9Ph2aNRaAJj91su8odejbzJd\\nHGe0OvBZHbhX+vzrXYYBGmffb/mwQPoo2VPyw1Ecv0cvHdxeD5QqdGsp8rXQ2NaWAPRUshl9/Q2z\\nL4jbBgZceH1GKtUe1VSOenAdt0zXftSc7hBm0mhkyBWjuGV7yu/STVGVd8rfb2Qn/uQ5637pqJ3L\\nrGXmA+WpwY0f2I7dLRJg3jrEdcPQ8eoJdUUBzKwmoziN0J1wtJjTg99LViKbW9TfHFDSNLRbmgCL\\nbHmaK0YPsY0AZqBbPeTthzS1lkav36ff02ipjYu5O+J7Y8QVTRIbts79El7/6BkNSX549YpXw//9\\n5afnbCUCI/uX9yhnUzOFYJbz5WFB68AT0bvmG6cnpEoNtF6ffq9D7fSIdLUHmAmGfMMxnz7V09/5\\n42OaktJC6/Xo9/ucaQ1KRb2332i26aO94tsY6OlRPPrAfqoOgCOaJDQcgbGFk6y59MWR0u/eclyo\\n0+n16fd6tNUCRx8+kmkMt8lLhoaVfr3C5gL6WoYP7z5TVDv0Ls6r0xxIWfGYmDxRNoaRVaXDN3w8\\nrdLWzp/XFvVG+xtfofjy5s3fx228PC9vfmHTZwJaFE+LtL7mn7DwvmyZGd796zCN/h9P4/rzXjkt\\noN5pM4O71CGuMzljJIbXYvEliU7sBBDz+zL3ksEaZOtJ8rsOyYcFHbm/K0tgi2fbRj58ytOupHhX\\nmTQjxoVJRmm+PyYP8c0IraKFhITXL7zLrWvAu/4DzybMiWvnP/DbYYVuNU+lGSHqMOKJbZBQPpJW\\nVDL7f3B1xQVnePOycO4pVDJdWoMU++VJeYWV8GYEt5GxbsFpoYOyH/bDuGkBNEd4i7210X2HHcSf\\nPuXs4wEZRSXz6U8yn8bPMZg9JHf2Lva4BzA5V3nyrM/+QRpFzXHwJjfh28yYTRJ6+TiYCW4+pWf4\\nwGGhTfnkPeWT60eZnCuyI853a878faqR0T31mOO0i72ELKQ7kznKzPsx4kvskqi/Ja3m+Hzk4tlO\\n6FpExk1l8Q/B9h3qEJOvxRvbINIs4khevwZxR1/wXjK5VtnZbfHnfvG2+N2FtVSNezDiCG/xsy9I\\nIVOiVK2gtDTAitvrwR0MEAn4sErp/12y+Dd45v/WVyEewvnWNQbCxMKTJ+jYgjFi6RrZboNCUSG8\\n7sFocpF89gPuXJpcqUpF7QBmHB4foViciN9+Wfk3+dj628/4yjkqJRWlVqcDGG0ufN4AoWgYv33J\\nstBHyGC24/H5CIXihDzXx+QMKx7Wn/9EpFokWyhRLevpaHMF8AWCRCOjESGXzN4kz38OUsrnKJVH\\n7xU3Hp+fUCiEUyJ2Hw+Tncj2z/hCBTLFItWqQlvTn1e3200oEMXvs0rj/ns2T/5+A4M1yPpmFeVj\\nkWrqiKz7GasS7ne7r1lmmlzENxPU/jhBLR6Q8rjZDs8+cHO3OsTkRfsMFj9bUrl8WF/4XrIF19mo\\n1tkvfp8b3xtevXr1x+vXr8defPXq1Te6HPE1SbovJ0n35STpvpwk3ZeTpPtyknRfTpLuy2laukuk\\nkRBCCCGEEEIIseCkcS+EEEIIIYQQQiw4adwLIYQQQgghhBALThr3QgghhBBCCCHEgpPGvRBCCCGE\\nEEIIseAmrpYvhBBCCCGEEEKIx09WyxdCCCGEEEIIIb4TK91u91tfgxBCCCGEEEIIIe7gvE2/YrFY\\nvvGlCCGEEEIIIYQQ4i7O2/Qrk948j9kX37eray1Iui8HSfflJOm+nCTdl9PVdB8MBt/oSsTX9Pr1\\na/7+979f/Fue9+Ug+fxymrZmnsy5F0IIIYQQQgghFpw07oUQQgghhBBCiAUnjXshhBBCCCGEEGLB\\nSeNeCCGEEEIIIYRYcNK4F0IIIYQQQgghFpw07oUQQgghhBBCiAU3cSu8RdNVCmSKRapVhbYGRpsL\\nvzdEOBbEa5v0JzY5/eMNJ40+JvMqT39Zw32tm0OjsP8bn0o9rIEdXu6FME/4pEG3xMdfD6gwfZuZ\\n8O5f2Q5OOlvclZL+N29TZxgNSV78TwLn2LuT026gnvLPNycAbLx8Rcw1nn7X0qmnknr3lrTaZ8WV\\n5NmzBI6epPfXNJpm48w4PD58oRCxkAezYdon9Ch9+pX9Qg8DPnZ+fkrQNum4Pu1qgWyhRLVcp4Oe\\nj7jdPiKRCD6XGSOT76FR3dI+v+6XMBBg9y97BCx3/cuXw/T0vaT/zrPlx5d6tKvFsfS0uQL4AkGi\\nkQA207TTOlQKGQqlKhW1A1hxB3wEQlHCfjvjp11e01VGmwufN0AoGsZv/y6K2S9AJfXPt6QH/RuP\\nOs/je8M8/7bjnFyWD2bXOs9fxrGPHXnDvXTWpJjLUShVUFoaej7jxuMPEw35sK1Imf8ljP6mga1f\\n2ItYx94/z1fByeaPPxB1jL57mcfb48/5Yd1O6Ur6tm65d85tvHxFFMnjv7zpeafNFcAXjLIavSzX\\nZy13R/OA83NuTae+SurPt6Qb/ZHndr7rEw/npvz1vG0XTURxT8leB80sf/x+RBNwrj7nxZpnZBR7\\nvjLHeeNRj9ti1zp6LfJHHzgstMde7rdVSm2VUi5NcOMp2zHnWIhCTymTbeiJ29NOKVRiuKUgFmM6\\nFD7vk1b7GM1BtnYTOE0wuJ7Xi29Co6kUaCoFsqdhtp5sErJfD0QatMsUCvqzPqBKvlTHn3BfCVnq\\no6Tf8TZVH3+1rVJrq9SrPZ79vI57WoNQPCqDM4WTjwdklO7Y6221TFYtk8t4SO7sseodL/60Wor9\\ngzSKNvpqh3o5R72cI+tZZWdvDfcMpWa/rVJuq5RzGfyJXXaSHuT2+fo09ZjjtIu9a8/8dYNOiYM3\\nB5S00UqlRlMp01TKaMZf2L3S6BQPw2Dx4A8aqZR6qOUa3UiEy7ZYj3qtOvzvBoraIeoYSYdeHaWo\\n5/EBrwsjUkgvsvN8uljSB1Sc98w4B5Q5zSr41j0T84B28ZR04+bG3pe8PjG787ZdpVxn5+UugWvZ\\ncZ9aKUtz+K/maY5q1LOUHXAL3LjXKH1+z2GxA5gJrG2zFnZjMRnoayr540NOyis4ndYrD3SPajHL\\naP2tkinSCl7t3Z+f9NZ/L/oo6QM+FTt6w/759oRMRNL7axvtse/3NFrVDMdHGZR2gcO3Riw/beK5\\nkqM1KnlqIz3A9VQBJerGN3LcoJnnaNiwDySfsx5zYTYM6GttlEqeUt8vDfuvYNKIzPyaZN6/J6P2\\nARfx7XWiASdmBnRbZXInKbKKwsm79xh/eE7MqZcOg2aWD+/SqMCKK8rGRhy/3YwBjUY5R+okg6Kc\\n8uG9kRfPE1ztRxobAe73ONMawzKoTSX9lv2VH3gaW+RxgC/BRfJ//h/J4b9uG51Thv8/76hKNfWR\\nI9tLtoI3Ncx7VDOHlLQBJkeU7Z0EXpsJw6BHp6FQztWw+66fL2XAQzHj9nqgVEGr1VC7kcsK+Ujj\\nHbjW+NeUGvnBACNRPC4jTGjcexJ/41Xi4hMuRu8cyRf8mHCPHTtQH/pvEzcZzTv7PY1mOcX+pzwd\\nNcVJ3sez+P3zzUbmhELo5ZWIDxicVcmkq9/8+sRkY/lrr0e7nuHgfRpVK5EpxQmsjv/2g7Mapcxl\\np/6AMvlSg8BFGs1X5iyyhZ1z31NyHBU7AIR3XrK36sNmNmE0Glmxeljde8ZPPz0jfmWY5XIkz0w8\\nmcABnDUyVJTZe+7E96yPcvqB/VQdcLH2ZHviiLD4towmM87gOk+erOEC+lqO00Jj/KC+Qjmr9+EG\\nkklCBgMDChQrnbHDtJZKEzAQIBjyYDUZMRpNrFidBGJb7K2OV/7E49UupDhR+4CTtRfPWQ+79fQ0\\nmbC5wmw82SPuNAIqmVQRvRrQIX+S0hv2jlWePdsk5LJiMhkxmqy4w+s82RuWFWqKdKlzwxUARtNF\\nGbQd0huEtaMc1dujgsUXoVHYP6Z8Y7K1aOT1TkCrP0jAYcZkNGI0mbF7giT2tpdy9Odrsrr9uNEr\\n5NX65fDLeeP94t+1GupF/b1Po14EwBL1ySjqgjOazLjC66yF9YRUM1VaD/LJKpl0cWxQD/rUc2ny\\n3enTa77e9YlbmUzYfD68Br0+3p8QWt+pFCgOBhjNcZIJvUGvZsrUl7B5t7CtlkZdf1CNxAlPGlbF\\nit1+Pac/H8kzmaMEE36CTiOgUShWJZhr6fVplw7ZP6mhYSayu0vMtbCPyFIwuaKsRvXnvFFSxgpa\\nrVYi0+3rjfZwlEBET8tarjx2nGlFr7UPKJM6TlNSWmiSGSwgjXpNH9+1eCOEri+kAiYXsbhfP7pa\\not6GQVelVtVLf080MrGBYHJHiQX1N+qlGt3rh0xgJRSP4QAGFKjXpXX/rQwoc7ifpjH1uTZj9ugT\\naFv5FJ+zZZqdHktYJ/xmDDYPQe/wGas3hvWxHmqtAIBnbZ24xTje+O+r1LJ6KrndTpn68l0wYbbq\\nz+LgjAd7BjvlY3K1y08btEucpho3nPF1r0/cTlMUagN9cNbnuBpr3aScqwFgj/pZDYRwoE+9LteW\\nr+xd0LB8jU5LTyxzwIFt1vbXyEieK+7DiRNT1MvJpwqdQoHqamDKYlviseoPUvzxOvUgn9WtnnBQ\\nLKEBZneC+I1hnFDY/w+F/fHXZlvsSzwcE3aHC6jRazToaGA3A3Qo50sAWMNBvJYVCMQw59JojQwV\\nJYrdo2ccJm+U7VCZT8UOrXKK/bJ+P9lcYQKRAJGAD+uEWuPRm9ccfZ0/UsykQ6esj8KsuO1MG2g1\\n2xyYKaGhoJ3p550v3uN2THvmzdgdK1DqcaZoaDD180cZbA48BiPNQR+l1QH/gha5j8i0PH9SWKXR\\nsMrWTpfj/SKamuLgs5VnO94Jn2ollFylWDtB1RRyRwq5IzCY7fgCYUKhEAHX9VxdyoCHZMXps0NN\\npZur0ljz4TE0UPIDwIzfE8XWy5E57eiN/6APY1OlNNA7cH3TVti6B8njv4UeWkfPjw0r9x+BNBAg\\nFu+TyVTJHWfwv0zgNPaoZtPUGOBJJnGkT8nessjal7o+Md2k/BXAu7rL6pWy9HItNSdhvxuDw0LE\\nl+JztUc5Xybuj8xUZn8vlqqmcT6SB078Xj1kw+r246VKjSqFSoPgPebPSEG/2GrF0sV/a/U0mZLv\\nlnma4rEaNCvkq/rYj88/XMzM5SFkyZDp6pE6UU9gONJjJbzzIw5fjmy2QFHVF+hsqwVOVX3Bvr3n\\n2/iWqWT4BiZVpCfNiRVidkbswS122x3epuq0isekfXtMmlppcq3y/BcH+UyOXLlKW4OB1qKSO6aS\\ny+Bff8pu3IkskP3lOD1BHKg0yaGo6zipkh3ouxq5XUZsvQCcZi4a/9Tyekebz4tL8ueFdz6n/aSg\\nl92uuA87MDAaccDFQmnzckUSJBSFdCNFphhiy1EiletgNEdZjXqpp0/vdX3i66qXc5SDLsKO866V\\ny7XUVpxBPA4AK96AB6oVutU8lWbk2poL37MFbdybsdpXgB5auUm7D+Zbu88uR/Is3gj+YSIbbAHC\\n4SNqhZ4+NyPqnLAtnnisbtsKb162UBxPO0te1cjv72O3Pp8ami+LKT0GPVpNfQUkk9OJVV/R7GLF\\nVCNxAuerohs9BGIOMsfqhEgdE87gKjvBVXb6PVpNhVo+w1GhTr9dIFuO4ruyINpNW/KIb8GKNWCA\\nEpzVW3RxT+yp19pNNMCAB/MKYLTix0CFAfVmh5hrUoeeRqupR4uteMwzd9YO2k2U4YiQxy4dhQ9h\\n/m2KjHgSO2yqv/O5qpHf/0jFPLlsMFp9xDZ9xDah32miqGWyR6fUNI3acQE14mS0q0nKgIdlcHgI\\nOo00G32qioKTMgC2qEdPb7ePmCFHdpBDqQcxVvTwfJff+0VG5SSP//I65QP+8/rg2usrriRrkeFT\\nvmLGioEmA1pdfYvKUV3ttnVQXMTXouTfZSinPqFZFZpAeCOBd6VD/YZTZ7o+8UWM5699zrQW5eMP\\nHBbLHL2zYRtuYz66K5InErjocLH6/3/27vQrjTVd/P4XsJgp5klxipppj939nJPz/7866dO/3r17\\n73Qmh6gg81QUIJQFz4tCBQGnmETj9Vlrr7UDVYjedQ/XPcaJ2RpUhm3KVY24d/aJCd+jBxrcgy8Q\\nQyGHQZ5iJUlg6ogag17Pgct1uhvy+Uhev7nHb6/3pj7TWpuRJnDLqZNS0T9sLjXD5toS3hMf5psd\\nqoZObi9H4OWybNRzT5l6kaOila99UdXq5R/bMXVAnv/8X37qvuHETJ0BpmnHcZrGdgcefxiP34ut\\n/wefmiaGKSvrvrTP3632fMftfjNLqRkjE7xQlZs6hXzdujoUJeAGG36CITv1hkkjW6QVnT720GwV\\nKYw6CwPR6wYSPSr5wmizxjiB65yhJ74QF4m1dVpvdqgaBoYx4xLTZOBwnDX+7C4vIZeXwMKAf7zL\\nM8TgRPbi+MK8+MMKtHt0yp/YZ3QaUmAURNl9qAkbhSKUcwcstAfYUImo0nH2vZh1jrzN6cLrtFHv\\nD2m3uwwiyliQ1qPdtHbRUcKuuWWzI5hmNVZju6KhGaD4V0hHFeCKjoFrfD/xNdhZUHzE43H2KjlM\\no0y7u0zAN3kqUm3vX8wI7+gcVdDS6sRJSd+zB/trOtQkq7EK25Ue1b03DE/Gj8LrUCscsFcYsvLy\\nGemAjVohe60pPbPWZgyHA0zTnO7xsTkeTS/QY6AmRptpOaKsP+3Re3OI3jli55OH5xuxR7Ve574b\\nPwpPB2t6XdxqALbLR1SGV++AezpTx9+v8vE/FdyLSRLhIK4FGzaG9FtlKk2rNe9xSurfF5eVx+54\\nhuVSk0PdIPfuLYNZR+G1R8fkZU7ztIvEcoZKYx/dyPPh3WDmUXgdrNGapauW6kwchWc1HIOryUfT\\nqLivbK6xcn3q3QGNoz84OI6zlIyg+pw4bDYGZpfaaLmWXXFbMz0e395MX1UgmEDJHmIYPXqAQ4kT\\nOJs958AfjEOxQF/X6QMLvhBe2Svpwbre0lUvasJLLqvTPjok610jHfLgwKBV3CfXMAGFaCx0yeco\\nRJaWCFb2aLJAIpO81pR6WVp7X4xG7svWBps2AjgXYHhSp3h49caI1klJS4Tij6Mj8AE3NxSia88w\\nbR/YKx9TO3xP7XD6mna7x0DpnE3ZCK78OPNcyuPSB37fm702o1/f4/d/THcFxTf/yrosB/0uOfyL\\nbGx2+c92hW5lh4NAgM0Ls0PmbfYh64S/jHmbG9ndcdafrlhn3I9tmumOb/Hjk8jUDspm84Df3+Ux\\nRjN1HL0yTaNFc7SJ1kUuNUN65okc4lu4rDx+EvWSfvaMk4875DWd/O5/yO9OXmdTVDIbW2dn3APY\\nvCmePj9heyeHphfZeVOc+nyXusjG1vQZ9zB/6iYohJc22ZAz7u/MvA31bETY/MvWpUfWjZfrE4P3\\npkY936c7PN9Qc5KL+FrCmgI69qrUAXfP5vUTc9pH+yOBMxZkLKuyEFCJ2YpnHbi+mCrrnr97dtTU\\nKkvaR3KaTn77Ty7Ox/PF10heMevW5o6SWW1gO46SvDirS9w788pXAE8yTtAFvXJ5VBb4WPvpxxnr\\n6nsU3//Bp4ZpnZQUTz+K8uIBB/eAw0PiyS+EYmXylQqNhsaxAXa3n3AwRjwVJeheQM9/oskQG3FS\\n8dmNLHc0RSrXpNBvU65oxFceQ/KLy7ijGZYbLXYrPap72/i9L0jKAO49oeBVQ4RiMVKx8+lx45tm\\nplLTgT1Yu+MvhUrnu6g+e8lf/FWqlRoNrYXWNeZ+vrj/bAsqKy9+JtGoUChXadRa9BhNp4xESSYi\\nuGc8GEoww4tf4tTLecrVBnW9B7gIREJEYkniYc+1j9qyu/2EghFiyThhz8OuZr837ugKq40W25Wx\\n6biOEOt/+4VQrUi9qqM1rWdG0vEbsPtRo3byeSu4jwT9E7N0bAt+1IidStUEfIRV6Th7FBx+Ms9/\\nJFDMUTwrn616OpZKk7hW+WzHn9ri2Zf/tuKLuJjeHYqj4+/c8UViMzfMcxFLJcg18hjtPNVmcnq5\\n3nfI9urVqz9fv3498eKrV6++0dcRX5Ok++Mk6f44Sbo/TpLuj9PFdB9eY6mSePhev37N//zP/5z9\\nW/L74yDl/OM0L92//+4LIYQQQgghhBDiOyfBvRBCCCGEEEII8cBJcC+EEEIIIYQQQjxwEtwLIYQQ\\nQgghhBAPnAT3QgghhBBCCCHEAzdzt3whhBBCCCGEEELcf7JbvhBCCCGEEEII8Z1Y6Pf73/o7CCGE\\nEEIIIYQQ4hZOY/oFp9P5jb+KEEIIIYQQQgghbuM0pl+Y9ebpnH3xfbu414Kk++Mg6f44Sbo/TpLu\\nj5Ok++Mk6f44Sbo/TvP2zJM190IIIYQQQgghxAMnwb0QQgghhBBCCPHASXAvhBBCCCGEEEI8cBLc\\nCyGEEEIIIYQQD5wE90IIIYQQQgghxAMnwb0QQgghhBBCCPHAzTwK7yEb6kf8/c3hpdes/vCKlN+g\\nvP07u1UTV2SDH7ZiKDOu7Ve3+W27io0Im3/ZIuKcfF/L/T/eZk8u/QxxWzrZ396S6w/wpF/w44o6\\n0Rs11I/47c0hBrD49G8shycfZz3/hjcHOs7gOj88T3A8Sqt57LYML/97CR/n6ar4V3jxQxrPxJUX\\nnx03xb+/JTccXPrbjH++uCWzR72cp1xtUNd7ALj9KmooTiIeweec7K8cGjrVUplytY7WNbApHtRQ\\niFgsTUw9z63DfpWPv+1QZ0hk/Ve2Eq6JzzktB8DH2k8/kvROfCmqu7+xXTZnPqfiOkw69RKlSp1G\\nrUUPcHpUQtE4iUQM30TBelXZrZMd5cf45l95Ep1897rPhHZFeXFq9YdXJLluvXPlxz1443npIrc/\\nQigSJZmI4HaMv3OepjPviSZZTKoottk/06jv8c8PJQCiT35lMz6ef++2HlGu3caY3x6xnrkoyXSS\\nsOe7a4bNNf73mJUfrmpv9fUq5VKJSkPj2BiVEaEYsXScgHKzz5rXdjtpVykWz3+GTfGgBlQi8STR\\noAeH7SbtzBv+gb4752XxZabaRlP1vItAJEQkliQe9jBedFz3mZrX/uprZfKVCo1RetvdfsLBGPFU\\nlKB74UY/Y96zJm7gWm2827QBzu/xJp/xci008RyN3+PNvOSnpcBX+oW/jMdTq4gHyI+aUMhle/Ty\\nDdoZlcBYq6zdqmOM/r/e6rAUHm+0ddCqHetTIkGcwPEtvoGhH3CQ87O1FJCA7VszdbLv3pLTJxsK\\nx7rGsa7RNp28PGu4D+iU9/mwW6I3du3Q6NIsd2mW8+Tj62ytJnA7wOZUCUft1Ksmeq1JP5HgvH42\\naTUbo/9vo+k9kt6x4MFsoVWs7xQJ+uU5uaFhr8HB7h4FrT/xer+rUcpqlLJF0k83WQm75nzCdd3s\\nmRB371ivUdBrFPMqmY0tFoNXN0FO76nXM2w9XcI3lTY9aqXq2b+ahQrt6BK+s4x4t/XIdJfFzVnP\\nXJZmuUxq6wWrkc99tr9zZpfS/gf2ypO1eL+rUepqlPI5Uk+esRz3fFb5e1zd4T/blbPnAUZpVeui\\n1Xo4fnlG1P0ZP0BcyWhm2d7JoY0nAj1atSKtWpGCusjG1jKBz41e5jxTg2Od6rFOtZgjuvqMJykf\\nc/oUxV27URvv9jrFXQ4CP7Ae/X7L3e86uJee04fPF4ihkMOgQruzQuAsPc8bXcBUo23Y0ai2B4AP\\n1T+ZgW86gt7IfmTffVlB4Cfz3/9FZvSvq3p5xe3o5X1y+gAbIZZfrJHwKdgY0u9pNIoliJwX+kb9\\nkHe7JQzAHc6wtpzA73QwHPRoVbLsH9TolPf4MFzgxUYEBYVAUIVqHaPZRO8nznvfx4J3YCr4N7Qm\\npeEQO0lUv4T2N2Lq5LY/UtAH2BSV9HKGRMSHYhtyctwgv39AQdPJf9jG+cMLUp/x973pM6Eu/Y1X\\nS6d3X96rP9TP/1/y/LnxmRMD06TfLnGwd0j9WOPw3XscP/1wYRYMEyMxA9OgU8uyvVuip2U5LIV4\\nnp4suYedOqXG+Yj/SSdLpZnENzYC/yXqEbhZWp9dOxxw0tc42t0jr/UofswR/NsTQt91a+xzmNQP\\n37NX7gEKkeUnLMcDOO1w0m9Rye5zWDumsPuWgeMn1iO3nD9pNsjvVDGAQHKDtaUwboeNgdmjrdUp\\nNZ2oMwJ7ye+XuVnbaNgp8OFdDh1Y8CdZXU0T9ijYMGjXimQP82jaER/e23n5YgnPrasDg+qn9+xV\\nLjxTDhsDQ6d0sMdhbQGfz4Wdu+nQE1e7SRvv8xiUtrfxuD6vTXGffZ+/lfhuOPwqUZs1DafSbJ29\\nft7osgyo0D5vo9HTG3SABV8U9ULj8eYMytsH1HpXXym+FIOu3gVACUeJqi4cDjt2hwO3N0xq/dl5\\nQ2Ggkf9kBXGuyAYvni4R9Cg4HHYWFA/h9BbPNyIAdCufKGvWc+QKhAkAQ2o0WufDBqfB+9m/m030\\ns0HmAe1WBQBnMjRjVFFc5rh2NOql97Py9BnL8QAuhx273YHTG2X16RZLfjugk/tUpHvbH3TLZ0Lc\\nHbvDgVtNs/V8g6hiA3QKhRrTE/HH71Hwx1dYjlsZq13VLjwDA5rVAh1ACWXIxK0mTa1UY3weyP2o\\nR0ZsdhZcIZZX03iBIWVarauXfzxWppZnr2hVvvGNH9haDOFWHNgdDpyeEItbz3kSdWAFbAVat8y6\\nw27nrJwPRWN4FQd2u1U+BKOLbD2RZZdfVo/SYdYK7L2LPH++Rsx/Ws+7CMRXeLq1hBc40bPkqrdv\\nkJlakf3KjGfKbmfBpbK49Zyff35O+rOnB4jru0Eb707o5PZytC+rgB4wCe7F/Wb3E0xZj2mvrp81\\n7NpalQ7giq+wHLnYaOvRrFlDaa6w/8J6+dsZUmNv+/stCO4/B4rTmhzXr2c5yFXQugaDGV3qw45O\\npW+18GKJCLOWv7ljaZZGa7cqDZ0BYHOrRINWENFqtUdBh4neLAOgLq+Qdtong/+BTrNg/axAwIfE\\n9jfRo1nVAHDH08Rn9aA7/CQXE4C1FlbrTF9yHbd9JsTds7mipBat0fd+WbtGmepAcVl5f9AZTKTL\\n8KRJNW+F8aFYgkTYelb6jRL18WflntQjExYUXKMJv8asgkwA0G5Z0+TtpInPXL7gIpZaRAFM44jm\\nbaP7BYXT+Til7C6lepueKaXA1zLs6zQb1t9bTSZmdpQ7AklS0VEdXW3Sn77kWq7zTHk8Upt/Xddv\\n492Vk84RO58qt36O7jPplhL3nB1fIAb5wqhxn8bj7dFuWM0zNRgjMmhxWKtbjbalAO6+TrM5ABRi\\nwelNMQbDLH++zk69PmuamN22yPpGn4PtCoaeZeeTi+cbwS/xi4pL2Qkm14hWdqgaParZHapZABdq\\nPEI8kiQccuEAjF4HA7ARwTt33p4Lj2qDCgx6fUzAjgtfyANNnX6xQXs5hGpro5WGgEJYTeI2i+SP\\nelbwHw1h7+hUhwNsRAhd3NFJXMHA0Kya2+5S5naMLHi8BIAWba7Yl2n+T7r1M3Fz+29es3/hte9h\\ng5675PEEAJ0BNTrHa6iXrpEyMXrWc2JbmEyTXr1MZTjERpxIUEGxh0k7S+T7bcpVjbj3dBrn3dcj\\n8JlpfWLQG034tT3CRb2z/nbTDHpda1aDEvHinpt1PQSwUWNI/+R2OdfmjpLJlHmbbdHTyuxpVqeu\\n0xMiEo8Si13c2HP+7yH5/Rb6vbNNOAPeeUsgFTzeBaianGgGBtxiNsU1n6k5rvfcipu7fhvvczkj\\nayx7q+xkW3QrO+y5XWwtfV+F8Hc9cr//5jWvX0/+90eudfWNY2x2abB/a4oaJGGzcbqZ2fBYo9o0\\nzwKq0+nUpyN7RqtOnSEOJY7vs6dS2vFE19nMWBV1t3JArnqbrfnE57K5omz+/CMbmQT+s7WPPbRy\\nnp33/+Ltbm1iI6Tb8KlRvMCAIpo+wGw1KAwHOJQkAb+dgGpN3e4XG7RNaDWtqd5KKIhfdsi9vct6\\n508MJkttOwvSLf0oDEwDvfSJ/bI1vO9Lqpw3+zvUik0AXPGQtcGW3Y8as+rszlEFbWy2+7etR8YM\\nB5z0GhzuHdLB6nAK+qWdcddu3nazoy4955dnayTCnrOgsd9tUDjY4c0fbym2ZST/3rHbucvsKb6d\\n67fxPq8NYMNBcGmDJzGrNmlkDyjq39fSKGkiXWFBsYr4IS36BkzO5zQxDZlO98U5AqgxO6WyiV5v\\n0rDVaQGuSJiAE2xY06lbzTaa3mJBbwDgjAXHdkw+d/Mj6eyoSxus6X/wqWFQ2v5IXZH5+d/EgpfY\\n0jqxpXUGJ13aLY3S0T4VfUi7fEQtFSHh8qJQxaBGpzsg4pzVh9mjezZq7DzrDbZ5VaI+O532gIam\\n4aMGgDupWs9LIETKVqQwLKK1otjrVlXjDwdnTvUWl/HgS9igCMelOq10gMBUt/yAVrMOWEGQ0wng\\nwDE6E+2k1eOEC6M35gnGhd4C5TOeiZuSDbau1u1a3TV2IngvbFLWq+3wz9c7U/cs+DOspM5PLTG1\\nGoVRsBWNnh5rZCcYTeE92qdDmUp9idDpsXh3XI/AzdJ69oifQnxz5VEenXXZkWLnFFyeBcDEqHU4\\nHoAyM+t2aY3yvHPBehJu13az4w4lWQ8lWR8OOO5q6NUiB0cNDEOjUNaI+UITo2KS3++I00UYG3WG\\ntDo9UjM2sASDbscKwhZUxSr3R8tbOgzp9qfH8vvGxbX513ym5rjecytu7RptvKT35m2AaS7ia0/o\\naO8p9HUOP+yycNupgffQdx3c30mhe1bgGOidHvjGCpxBm1bdeoAWvC7ZbOWLcRAIhqBcpd84Yv/Y\\nKqz9ocDob34+nbpZPqCvW4H33R5L5iKxtk7rzQ5Vw8D43CFicXOmielwnAVd9gUPgbAHv8dO7/fd\\ns2nbNq+fmNNOvj+gXKiQCCamAu/jSp5cfzTlNjT+nHjxhxVo9+iUP7HPaDfdwKgryO5DTdgoFKGc\\nO2ChPcCGSkT9fo9U+XIcqOEESjGPYeTZ++Tm6drkMXTH1X12s9a6Z08yTnCUkG53EKgyMHQ6x+AZ\\nCxDNtk59aC2l8LqsEuLznglxl4a9KoWjNgDOuHqtTSid4RWebaTxnl1r0qgUzmbq5N79H7kZ9zWL\\nNbrx9Gi9/H2oR8Z5SD99wUpYWg6XOT/pIE+xkiSQuFjW9qgUjjAAh7JI8PSog1u03UxzgMMxut9m\\nx+0N4faqLAx/433+hKFxwoDvfMrrN2Jz+gmG7NQbJo1skVZ0Zaqz12wVKVStfBmIjjrUnS68Thv1\\n/pB2u8sgooylT49283STNtdZmX/1M2XQ6zlwuSSlv6prtvHg5m2AmRwqma0l9DeH6Ibx2TM/7xN5\\ncoHhcIBpmtP/Dc7PvwaoHX4ir/UwBwMGRofKYZZ839rpOR6W9VVfkhIIE8YG9Ogdg40Q4cB5gXw6\\nndrUdXT4IseS2VxR1p9mkE76b+O4tsMfb083OjIZDAaYZo9GuUwL65lQFgC7SnotgQL0G3u8/ZCj\\n2TUwzQEnRpd6/iPvdqwReU9sjbg6+ZwEgta9Q6NHzwCHEidw9iw58AfjAPR1nQ7g8IWmRh/F9TiC\\nS6ynrD9et7LHv3//N+92D8gf7PH23//k923rTPoFf4Yny6GzSv+0PBjSIHuQo9Wznod+p8rBodXQ\\nV/xpgqeZ9TOfCfH5BqbJsZbn47sdqsYQ8JNKRaZmSLgiG/z11StevXrF//c8baVZPU91bI79sFPm\\nqHz17KmTdp762MkH37IeWf3B+p1evfqVtZAD6FI5qtz+BIhHwqGmWU9aaVTde8PHowbHhmkdrdht\\ncPTxHbtVE1CIrqXOjjG8cdttoJH79x9sjzbyMs2B9TM6VSoV61lbcN9+Ro+4iovEstW+Ghh5Prz7\\nREXvjdKhR6t8wIePOev0Cn+GpbOjib2oCWtifvvokGy1jTG6p3m0T64xejZiobNOHIeaZDU245ka\\nDDjp6ZT2P/Kvf70lL6dYfFXXbuNxizbAHA7/Ihub399JGN/1yP119et7/P6PvanXT8/ojS1voLU/\\nUjlucPD2XxxMXKUQXl4hLot+vqjxXl0AJRgmMBZQjU+nhsuPJZu3oZ6NCJt/2bp0iqRVEHT5z3bl\\nu+rlu/+6NEpNevrgbKOjSQqh5UXCo2dCCS/z/MmAD7sljutZ3tWn09sbX2drNTJVqI+P8sL0tNyF\\ngErMVqQyOjbJF1PvfiftR8NBePVHXjh32T2o0TO6NMtdmmfvK/iiSzxZT46N2oLNGWVlS6Pz0Urf\\n/1xIX5uisrianEiXz3kmbmLehkvjZ74/FuXtf1Lenn7dpqhkNramzri/yBHMsJnReZttUdj7hM+7\\nScR1fvydjThPZ50Rb2rs//s9hb5BudIgqVqdCHdZj8Bt03psFph+wEHOz9ZSQEZa5nIQXn7G+uAD\\ne+VjaofvqR1evMZF6skzlifOuL9Z283U6uT7x3C2kdckuztOJqFOnXsu+f3u2Lwpnj4/YXsnh6YX\\n2XlTnLrGpS6ysTV+xr0dNbXKkvaRnKaT3/6T/IV7fPE1kuHxQkIhuvYM03bZM6XQbvcYBBb4vrZa\\nu69u1sa7TRtgHnd0nc3jHm+zN9uT7T6T4P4abK4wGz/+RKhQoFSto3UNwEUgEiKWXCKhSgH+5bkI\\nhv3QsJr9/sjFNc7n06kBQkH/F+thd0dXWG202K7Iwfdfj4fUy1/x1SpUaw2aLY1jA2yKBzUUIhZL\\nE5vIh3a88XV+CcWplsqUR/l2/vXjt/pRo3byeauBf3Farm3BjxqxU6magI/w5Vt9iys5UNNb/Brv\\n0mxqNKpHFOrW4TTB9BM2lkMomLSrDQhFz4Itd2SdH38OUcwXqDSs58Hu9hMOxkguJZk+vOAznglx\\nJ9z+CKFIlGQiMrH8Yj47anqNpcYbcnqV/QMV35pydvydupKcDuwBHCrJpSCFvTq9cpnGYoSoG+5L\\nPWJzRVlZa6B9rNDI7lMIPGdRlebYXA4PiSe/EEpUKZdKZ/nd6VEJhWLE0vEZ+f1mbTdHaJW//RKk\\nVqpTbTXRdOsZuPkzKz6HEszw4pc49XKecrVBXe9xmmaRWJJ42DOdJx1+Ms9/JFDMUTy7R8Grhoil\\n0iRm3jN6pmJl8pUKjQt1SDwVJei28qTsrPU13LSNd5s2wDzj9cz3se7e9urVqz9fv3498eKrV6++\\n0dcRX5Ok++Mk6f44PZh0H/Yo771jtzx9KoUnvsWLJ583sv7YPJh0F3dK0v1xknR/nCTdH6d56S4z\\nwYQQQtwfNhfxJz/y09Nlop7TcVUFX3SFjRUJ7IUQQggh5pF5YEIIIe4ZB97wIpvhRTa/9VcRQggh\\nhHggZOReCCGEEEIIIYR44CS4F0IIIYQQQgghHjgJ7oUQQgghhBBCiAdu5m75QgghhBBCCCGEuP9k\\nt3whhBBCCCGEEOI7sdDv97/1dxBCCCGEEEIIIcQtnMb0C06n84pLhRBCCCGEEEIIcR+dxvQzz7k/\\nnbMvvm8X91qQdH8cJN0fJ0n3x0nS/XGSdH+cJN0fJ0n3x2nennmy5l4IIYQQQgghhHjgJLgXQggh\\nhBBCCCEeOAnuhRBCCCGEEEKIB06CeyGEEEIIIYQQ4oGT4F4IIYQQQgghhHjgJLgXQgghhBBCCCEe\\nuJlH4X1Nw36Vj7/tUGdIfPOvPIkql99g9qiX85SrDep6D3ARiISIxJLEwx4cExfrZP/+ltxwgDfz\\nkp+WAnN/9uoPr0j5x19bYPHpzyyHJ/9EQ/2Iv785BDi7Z+J9Q6daKlOu1tG6hvX9girheJxYJIBi\\nm/6ceWZ9vrD0q9v8tl298rr45l9ZD2iXPmOz0nT82bjss698XsWt9bUy+UqFRkPj2AC72084GCOe\\nihJ0W/nyy5YfAAOOG2UK5SqNWose1vcIBEIkEglCfgU7oOX+H2+zJ3N/rN2W4eV/L+G7/Z9DcFm5\\nqeBVQ4RiMVIx9aycvXjPrDL1tCwZTyPJ//fDab6anX8Mytu/s1s1cUU2+GErhsLV5flUupk62Xdv\\nyekDFvwZnj9fwmtK+n8zJx0qxeJYG0rBqwZQw3GSsRDuGa1Wo77HPz+UAIg++ZXNuGvGewrLL35l\\nUZ0xpjXQOPj9Pfn+gOj6r2x4q9I++8Zu00bu61XKpRKVUZvB6VEJhWLE0nECY1n1uPSB3/fqgMLS\\n81/JBMeeCVNj/9/vKfQHeJNbPF+LILn882m5f/E228NOmuf/tUJgIhvqZH97S64/wJ18xo9roYm2\\n2LBT4M8/9umisvHLC6Lu6fc6gG/xBS+X1UtGrU2OG5WJ9pzToxJQIxPtyvG6ZZ7xOuc++ubB/U0Y\\nzSzbOzk0Y/zVHq1akVatSEFdZGNrmcCd/FYGhb1P+LybRFxXXw0DOuV9PuyW6E283qPVLNNqlsm6\\n42w9f0LoWp8nxCNldintf2CvfDzx8uBYp3qsUy3miK4+40nKh23OR8xy8/JjgJZ7x9tsa+p7NI91\\nWg2T57+sEJjuERBfnUFHK9PRyhSO4qw/XSPmkYlp4io9yp+2yekD7EqU9c0lfA4Yzm/TiS9o2Kuy\\n82aHqjHeqWLQ0Wp0tBqG/Vc2ExcbUD1qpfOO/mahQju6hG+U/ZVglLSzQr5vUK40SKqRqU5co1kl\\n3x9gI0Ik5IL+l/jtxBczp83Q72qUuhqlfI7Uk2csxz3YAXdilbW6xqeGQX4nS/CsHh+g5Q8p9AfY\\nlSSrGQns70ogmEDJHmKQp9nKEBjrUBl2dOr9AQD9okZnJTQR/Le1Kh3AGYwScI9/6oBmtUBn9K/O\\nUZFGUiXinP75wxONw4875LXJzN3valS7GtVijvDyFpuLge9iSvuDCe6HnQIf3uXQgQV/ktXVNGGP\\ngg2Ddq1I9jCPph3x4b2dly+WuIt23cCosrftwfXcqvAv06/t8W63ggG4wxnWlhP4nQ5smHQbeQ72\\n85iBEN4Zgb30AN+cM7rJq+jm6F+zR3BODT+zopYRmq/JoPrpPXuVHqAQWX7CcjyA02FjYOiUDvY4\\nrC3g87mwwyXjapNuU34MOyX2R4F9JPOClZQfxTZkYByj1UtUB+GpwF5G6L+e8XJzYBpn5ax2XGbv\\nrR3nz2uod1DDSf7/Xg3QcjvsVnpWYP/iycyOfEn/r8Wkkd+jagxxeJM82Vgi6HZgG5r02hq1YhPP\\njJGRYadOqXHeG3PSyVJpJvGdzrq0q0RSXvIHOr1ymcZiZGLkb7xzwBWPEnQyEdxL++zbuzwNTOqH\\n79krX2gz2OGk36KS3eewdkxh9y0Dx0+sRxTARWJ1lXpjj6aRZz8X4uWKyrB1xH5OBxRS65k7qT+E\\nxeb1E3PayfcHNPQ2meD5TOrT4B1gMBX8d9Aq1ruekI/xuH140qSaP8+sQ2qUqm0i6QstsEGH3Pv3\\n5PUB4Cf9ZIVkxIsCDE7alA72yLacqKpvKrC/7yP08zyQDooepcOs1TD3LvL8+RoxvwuHw47d4SIQ\\nX+Hp1hJe4ETPkqv2rvrAazvRsxzkWwwuu2igUdivYWA9CC+eLhH0KKPvp+CLrvDi57/y4kmEGR1K\\nQogRUyuyX7Hyb3zjB7YWQ7gVB3a7nQWXyuLWc37++TnpG03PuV35YXR1OoCNCNGYisthx253sODy\\nEUmts7UYuOyHiq/otJx9+nQZPzAwihyV29/6a4l7a4B29IHtbAvws/z0icz0+Oa6tEtWd60rHCXi\\nVXDYrTaUR42ytPVkxojc+cidEsqQiVtpWCvVJgbffeEEQWwMaVCuT5YL550DCvFYaMbSLHGfmVqe\\nveKMNoPDgdMTYnHrOU+iDqyBgwKtUWPe5o6zth4CoJ3fJldrkD/IW9O705sshSWyv1N2P2rUyp/H\\nRY3zXHgevJ9q6OfvDo/bNNoDwEdYnQzae/UyleEQu5Ims2S9p+drZ2l86riaJadbn7H88gUr8QAu\\nh/WMWO3Kn/jLT89I+b+fOuBB/CbDvk6zYaWWmkzMHEV3BJKkotYbrWrzTmdVabmP7F/SYTDs6FT6\\nA0AhkZwTwC8oUmkIcYV2y5r9YidNfOZ6GBcez81y0m3LD8eClZOH1Mge5KhqXQyZrnuvOfxJFpNW\\nOrarGt1v/H3EfTTguLrH9mETA4XE5uZ31ah7uBQU1Vpo1S1l+VSo0emZlw6sjI/chWIJEuEEAP1G\\nifpYvGBzR4iPAv+Ljf9W3eocWPClCc9ajy/uteu0GWKpRRTANI5ojiW+O7HKWsgK/I8+vh8tz0mz\\nunTZum1xO3YCwTgAplFHH+XPYUej2h5gI87KSgSYDP57WpUW4FDC+L3jn9ehVmwC4EmGWYzE8GKl\\nca05vv+RQaupAeAMJYgFZqWsHUX5vlL8YXRN9XtnG9sEZs1rB0DB412AqsmJZmDAZ4+Sx9Y2cFX2\\nyOkGpe1tPK4XJGdcZ/Q6GICNAG73rAdkgGla399md2C/sFB4/81r9i/cMWsDQPH5ytv/pLz9+fc8\\n1Kk695tBr2sVykrEy8ysdBu3LT+CSZ7EauxWenRrWbZrWQDc/jiRRIREJITrQkfBYJjlz9fZqU+X\\nqZ1fiwOP1w80Mdttega4r7zncpL/v715+eo2+o1DdipVDEAJLJGOXr4JjqT/1+Iillmk0jxENzSK\\n+xrFfbApHkKROLFYjIh/8i9+OnJnI04kqKDYw6SdJfL9NuWqRtx7GqQ5CMVSKOUchlGmpS8RUO0w\\n0GiUrE1YgskInhnfStpn99k12wwuDwFs1BjSPzE5H9ccm57PEFBIb2RkH50vxOFXSdgKlIZt6lqb\\npNdHT2/QAVwRlWh4SPOgTtOoo3eW8HkNWpoOgDupTix3NLUahdGIfjwcwOZ1kghl+dQwqZVqpMOJ\\nUQzYo1ez2n8Lfs/suNA0scZtbDgckw9Rr7bDP1/vTLxmI8LmX7Zmru2/L76vroopduzeq6+ax7YQ\\nZGnzCVHFBujk9vPo8zfEnmvYr7Pzj//HP/7xD0oyU1SIB8JFfOMnftxcJuY/DxGP9TJHu+/595+7\\nNGTjpfvPbuczqgHxnWlWquij/zdaOfJ3uIxPfB6Hf5EXvz5jNRnCPYrjh0aXevGAj2/+4EO+PTaS\\nfz5y54qHrI1Q7X7UmHVj56iCNtZec6gRUj47YG2sZzK+kV6cWFh2Or6v9t+85vXryf/+yLWuvvEa\\nBqaBebZ7j0G7K/O9vhhHgFDCCju7jTZ9ejRrVmmsRoI43SrhoB2wgv9hX6NetWZFRwIToT2NSgED\\nWPBFUb0ALoIRFZieuXMVrfAv/vGPf/DHrrW8+nvwMEbunS7C2KgzpNXpkfLPKoQNuh2rJF9QlVGP\\nuoLitkEbzGNrNG6i3/fEoHfFllw2V5T1jTbauzyGnuXj7nRfveLyolDFoEanOyDivFmfiYzqfT1X\\nHYV33XvEl6Dg8iwAJkatw/EA7mSm1K3LDwAHvugiG9FFNgYm3Y5Gs5Rnv9xicFymUEsSSp1XOrKh\\n3rdm0u1YjQWHz4dLAYYKLmx0GNLtT9UC9I3LgzvJ/9/eVUfh3ZQ7lkY9LlAam5U3b2q+pP/XZXeF\\nSK2FSK3BoNdB02sU9o9oGgbNgzJ6wofqGB+5g2j0dK28nWA0hfdonw5lKvUlQmfH4nmJJIMc7tbp\\nlcvUF32Yo430vIuxuZunSfvsPrtmm6HXpTVq6zsXxoblTZ38J2ujXUVRMAyDxv4niuoPJKVH+Atw\\n4A9GoVjCaNZpNmzUm9YpFaHRWYXBiB+aTbqNNrqrTZ0hdmIExsrn4XGNcnm01DJxPuPGFY4TszWo\\nDMdn7rhwRWxQhZNWlz6BG83qfqiztB5EcG9z+gmG7NQbJo1skVZ0+vgps1WkMKrkA9HgKPHOM/5J\\ns83xIDKR8Xtt7WzDLOclqe0IZtjM6LzNtjCM6X6d8V0gy4UKiWBCNs4T4hZ8gRgKOQzyFCtJAlPH\\nHhn0eg5crutH/bcvPwaYph3H6bV2Bx5/GI/fi63/B5+aJoZ56Vab4isz9SJHRSsdfVHVqvSdLrxO\\nG/X+kHa7yyCijE1Z69FuWiM1Stgl5fYj4FIzbK4t4T3xYb7ZoWro5PZyBF4uX3kqjvjCTJOBw3GW\\nP+0uLyGXl8DCgH+8yzPE4MQEHOcjdwC5d/9HbsbHNYs1uvH0eeM/GCVMgzoNCvufGDZMwEc8Kmus\\n77PLOliubjP0qBSOMACHskjwbM31AK1wQE63gsu1F2k6u2/J6TrZvRzqHZ26JSYt+FTClKnTILff\\npccQZyiIf1T5uvwhvDTpNMscmFZHvSsdOjvaEqBdL42WUUBt71+83pv+OZ2jClpaJbSgEAiqUK3T\\nb2YpNWNkgt9/wt6r33BonmCa5tR/A1wkljOjXZDzfHj3iYrewzQHDMwerfIBHz7mrE1R/BmWxtbQ\\n+YKJs00WsocVOsaAwcDkWDvi02EDAE8ybh1/MpcddWmDJ7E507bsKqlV6zzMfmOPtx9yNLsG5mBg\\nHdGkt6+cISCEAIeaZHWUz6p7b/h41ODYMBkMBpz0dEr7H/nXv96Sb02vj7nr8mN4XOXj72/PNnay\\nrjc5bpSpNK0A0nNZr6D4agamQbt6wIcPh+iAXUmyGD8d5/WiJqxhmPbRIdlqG2OU9s2jfXKjnbKj\\nsdCD650XN6cmrE01ba4o60+tcuGkc8TOp4ocb/5NDWgc/cGfH083Lx2V+0abasUaYbcrbpQFGHbK\\nHJWvnrFx0s5T1847YG3OENHRxnrthrXW1xlKEJZR2gfLoaZZT85oM5gm/W6Do4/vRrN7FKJrqbPz\\n083W0dlRt7GNFSIeP+nVJas8uM4pWeJWbE6V8GjX/N6xNWsuEAmedazbvCpRnx3Q0Ufrp8IB71mw\\nOjypUzy8en3zkDKVuvX57miGJb+1JCf37i0H5RY904oFT3o6euf7S+l7NXJf2fs3lQs9MGcbF3hT\\nPH1+wvZODk0vsvOmOHW/S11kY2uyt83hT7G6rLF92EQr7PBHYXJjBLs7znL6OsefuIivbdI7fjs6\\nUmGSM7LO8yd2PuyWOK5neVeftfmP/3wUcMysDVtApgPeF/M24ZNNdb4EhejaM0zbB/bKx9QO31Ob\\nWjGh0G73GAQWGN+b8q7Lj26jTNNo0Rxt7DR9fYb0hd1552389RA2YHlo5pWbdnec9acrY9Ns7aip\\nVZa0j+Q0nfz2n+Qv3OOLr5Gcc/SR5P/vl8O/yMZml/9sV+hWdjgIBNi8MPIn6f+VmBr1fJ/u8Hzz\\n0kku4msJAvYBjdHxdzbiPP3bE0IXs66psf/v9xT61vr6pBoZtfHGNtYbXRpJXH5EsbTP7jsH4eVn\\nrA8uazO4SD15xnJklF6mRnY7P+rcWSczGlBw+FMsZxq8zbZoZA8oBecv1xG3dT6SDmBDJRwYL3O9\\nqFEvtK3I3k6S4NiamdNNNMHH2k8/zlg+0aP4/g8+NczzmTt2L0vPnjH4uENe08nv/of87vQ3czgX\\npka8Z22oB/d/Cea9Cu6vogQzvPglTr2cp1xtUNd7gItAJEQkliQe9swI0u2oi8/50V/kqFilUWvR\\nA5welVA0SToVwX3dqXgOP+m1JZp/Hp5tyDP+c7zxdX4JRSnnq1QbdbSuYX2/oEogOnt3bSHEBQ4P\\niSe/EIqVyVcqNBoaxwbY3X7CwRjxVJSg2yq6bjIf5qblhzf1kr/4q1QrNRpaa5SfFbxqiFAsRiqm\\notjm/DDxlV2RLg4/mec/EijmKJ6lvXVPLJUmMbPuEI+BO5phudFit9KjureN3/uCpHTCfX2OEOt/\\n+4VQrUi9qqM1rbaa3e0nFIwQS8YJexYYntTPjr9TV5LTgT2AQyW5FKSwZ62vbyxGiLpP34qQ8uU5\\nbA9wKItEgg+qGSxmOW0zJKqUSyUqozaD06MSCsWIpeMEzvphDKqHuxT6A2yEWFkdX0ZrR02tsNSw\\npufLcp0vwxUIE6BOC1CCUQIXjrTxBcIo6NapRXF17O9/vommO75IbOaMGxexVIJcI4/RzlNtJskE\\n7dgWVFZe/EysXqJUqU/Egn41RHTGaRwPme3Vq1d/vn79euLFV69efaOvI74mSffHSdL9cZJ0f5wk\\n3R8nSffHSdL9cZJ0f5zmpbvMNxFCCCGEEEIIIR44Ce6FEEIIIYQQQogHToJ7IYQQQgghhBDigZPg\\nXgghhBBCCCGEeOAkuBdCCCGEEEIIIR64mbvlCyGEEEIIIYQQ4v6T3fKFEEIIIYQQQojvxEK/3//W\\n30EIIYQQQgghhBC3cBrTLzidzm/8VYQQQgghhBBCCHEbpzH9wqw3T+fsi+/bxb0WJN0fB0n3x0nS\\n/XGSdH+cJN0fJ0n3x0nS/XGat2eerLkXQgghhBBCCCEeOAnuhRBCCCGEEEKIB06CeyGEEEIIIYQQ\\n4oGT4F4IIYQQQgghhHjgJLgXQgghhBBCCCEeOAnuhRBCCCGEEEKIB27mUXj3zVA/4u9vDme+5/So\\nhKJJ0qkIbsfpqwbl7d/ZrZpT17v9EULRJItJFcU2fb0rssEPWzEUQMv9P95mT1D8K7z4IY1n4pNm\\n3zP+XVd/eEXKP/Z79KrsvNmhagzxxDZ4/iSG04aYx+xRL+cpVxvU9R4Abr+KGoqTiEfwUufjbzvU\\nGV76MePpA9DXq5RLJSoNjWNj9AyFYsTScQLK5L3znj2b4kENRUmmk4Q9C1deP+7icyGuMjuvndPJ\\n/v0tueEAb+YlPy0FgPP8O4/dluHlfy/hu/jT6nv880MJgOiTX9mMu87eG/art3rmxN2Yl6az64Ex\\nU2WJi0AkRCSWJB72MH7L/DS27okll0iokrJf2pfIvxNOOlSKRcrVOlrXABS8agA1HCcZC2FvbvPb\\ndvXK7xnf/CtPovI83Kkr6n6fc3JcamjoVEvls7S06ucQsVia2FheHc/bkfVf2UpMPhv96mma+1j7\\n6UeS3okvRXX3N7bLJp70C35cUWV07M6d1/Vq5iXPlgJz/8anaTWvHIAOR3++4bA9wKEs8uzXZQJT\\nH3bTWEF8OybHjQqFcpVGrUWPURpFoiQT0/X+af0x+/m4qk358D2I4P4y/a5GKatRa2R4/nwJ36yG\\n3ZhjvUZBr1GvZ9h6evX1AIZ+wEHOz9YlBc2VTJ3c9i5VY8iCP8PGmgT2lzJ1su/ektMHEy8f6xrH\\nukbbdPIyddPP7FLa/8Be+Xji5X5Xo9TVKOVzpJ48YznuuTKdh0aXZjlLs1wmtfWC1cicBqR4YHrU\\nSucN+mahQju6hE9acffaaT1QKUbZ+GGT8exoNLNs7+TQjPE7erRqRVq1IgV1kY2tZQJX1obn99Qz\\nLz+vPhBfyPXy73hH+zmDjlajo9Uw7L+yco22gfgCrlP3nwXWAzrlfT7sluiNXWvVz12a5Tz5+Dpb\\nqwncDrA5VcJRO/WqiV5r0k8kcJ7/YFrNxuj/22h6j6R3rCAxW2gV6ztFgn7J+19YK3tEPfqMqHvG\\nm6ZG/qB+6f2mVqPQttLLNI4o11MEbtAJdxorVKrXiy3ElzM80Tj8uENe60+8fppGxbxKZmOLxeCD\\nD2nvzIP7S4yPeg5Mg071gA97FQw9S6mZYD0ymXnHe2UGpkGnlmV7t0RPy3JYCvE8Pd3fN0sj+5F9\\n9w+sR28TxPUof9ompw9Y8C/y9JkUFFfRy/vk9AE2Qiy/WCPhU7AxpN/TaBRLEFGxO+Hpq+jZPac9\\nuTYibP5li4hz/BNN6ofv2Sv3AIXI8hOW4wGcdjjpt6hk9zmsHVPYfcvA8dPUcwRjz95wwElf42h3\\nj7zWo/gxR/BvTwgtzLlefFPze/anDTt1So3zXvyTTpZKM4kvbCWuzRm9wTMnvpSJNDVNjlt59nZz\\naEaVw1yE4JMIDmDYKfDhXQ4dWPAnWV1NE/Yo2DBo14pkD/No2hEf3tt5+WIJz4UW+/mo7IATo0vt\\ncJu98jGN7D7l8MWRPfEl3GX+tZg08ntUjSEOb5InG0sE3Q5sQ5NeW6NWbOIJuXA6N3kV3Rzd8/2P\\n9NwX16r7R9ca9UPe7ZYwAHc4w9pyAr/TwXDQo1XJsn9Qo1Pe48NwgRcbERQUAkEVqnWMZhO9nzgv\\ns8eCd2Aq+De0JqXhEDtJVL+E9l/akAZHhQahtRAXm8t6OUuhP5h5n8WkUSkw3p9bz1foRi/OwD03\\nN1bQbxYriLvWIf/+PXl9APhJP1khGfGhMKTfrVE8zFLQNA7fvcf+4wtSMhIDPPA193aHgi8Uwo81\\nBD68fKYsdoeCP77CctwqKtpVje61f5pBefuAWu/qKyf1qO6+Y7fSw65EWd+8zgjRY2fQ1a2UUcJR\\noqoLh8OO3eHA7Q2TWn9246DZ1PLsFa3Ei2/8wNZiCLfiwO5w4PSEWNx6zpOoAzCofirQuqzesNlZ\\ncIVYXk3jBYaUabXmTx8VD8WAZrVAB1BCGTJxq3islWr0L79RfEsOB+5QhuW0VSj0yjVaBkCP0mHW\\nCuy9izx/vkbMf1qWuAjEV3i6tYQXONGz5KqXFe52FhQf8ZUVYjYb0KbSaH/xX03cxHXzb5d2yWos\\nuMJRIl4Fh92O3aHgUaMsbT2RTrpv5gZ1/0Aj/8kK7F2RDV48XSLoUXA47CwoHsLpLZ5vRADoVj5R\\n1qxK3RUIEwCG1Gi0zsO/0+D97N/NJvrZgzOg3aoA4EyGZHDmK+kUs5QvzOAY9qsc7euX3jc8rlEu\\nDwCFdGZUxrfz1LXLGnbnLsYKer5xg1hB3KXjcpZDfQD4WH75gpV4ANdpmeCPs/p0i7TPDujksxVp\\nq4086OAeBvS0BjpDwI/Pc52+dAeKy+oMGHQGXC+rW4bU2NvO0Z5enjP3+2m5HbbLx4Cf5adPkNnb\\n1+FAGa1Z6NezHOQqaF2DwRWdN5dptyoYgJ008ZmJ4CKWWkTBmsLVvDS6H1lQcI06lozP+XLiXhie\\nNKnmraohFEuQCCcA6DdK1Dvf8puJ63A6T/P1kMEQhn2dZsPKx2oyMbNB7ggkSUWtN1rV5pUNA9tY\\nnh8Mb1J7iC/t+vlXQVGtNOyWsnwq1Oj0zBu1BcSXcv26f9jRqYxGb2OJCLP6Y9yxNEtOO2BQaegM\\nAJtbJRoc5flWG6s5Z6I3ywCoyyuknfbJ4H+g0yxYPysQ8E2NJIsvpU0+Nx6wDWgWDq/c86ZdL9Fk\\niENJEl0KE/VZz0C50uDazfexWGF4gpQP34RBq6kB4AwmiE1vmgAOP6l02Lq6UaV1PH3JY/TgxpD3\\n37xmf+pVhcT6E+LXmiJpYvSsgsG2cL3eDbttkfWNPgfb1vT/nU8unm8Er7yvVdzlqNICwJ1cIi5T\\nua7JTjC5RrSyQ9XoUc3uUM0CuFDjEeKRJOGQ6wYVrEGva42sKxEv7nnJ4PIQwEaNIf0TkyufjhOD\\n3qiSsc3YP2HWszq+4Zu4uV5th3++3rnRPYNhlj9fZ6dev7hsolcvUxkOsREnElRQ7GHSzhL5fpty\\nVSPulQ2U7rN+/3Tk3YbdBvR6Z43AgHder6qCx7sAVZMTzcDaVm2+4Viet9vkafga7j7/uohlFqk0\\nD9ENjeK+RnHf2iQ1FIkTi8WI+GXS/bdx/brf6HUwABsRvBfX05xx4VFtUIFBr49Vq7vwhTzQ1OkX\\nG7SXQ6i2NlppCCiE1SRus0j+qGcF/9EQ9o5OdTjARoTQxV13xRfhSqUJ14oUGntkq2GeRBWGnRK5\\nfA8bEZYykM3Wpm8caNQKVm+ePx3Chw9HMsjhbp1euUxjMTJ7Hf+Um8cK4q716NWsNFgIeGZ24AEo\\nbi8KVQw0jAuTaOfVH9+77+R5NWhWy7SumDI/MA300if2y1bfnS+pcr2BdDue6DqbGSso61YOyFWv\\n7h6qVapna36Oi7mp6UViPpsryubPP7KRSeA/K4h7aOU8O+//xdvd2sR6qq9qOOCk1+Bw75AOVuMi\\nKI3BB65DrdgEwBUPWUtn7H7UmJWunaMKmqy8uJ9Mk+NGlsO8NVXTFY9MnXrx+QacGG3KBwdUhkPA\\nRywkazDvj5vlX4d/kRe/PmM1GcI9elaGRpd68YCPb/7gQ74tI3XfyNeo+31qFC8woIimDzBbDQrD\\nAQ4lScBvJ6Ba0/n7xQZtE1pNa/q/EgrilyUbX4VjIUx6xRqRre7naZkGlSNrmVVwdXFugG40q+T7\\n1jTucNAqo12BMEFsDGlQrl+9nGpgGujlAw5HsYI/HZq7Vl+I++jBjdxP9Nafbmy2/ZG8lmf3k5sf\\nniUmenfmjfQt+DOspG6y27EddWmDNf0PPjUMStsfqStXT/BRU2mUaoGqoXP4YRfnhZ2cxSUWvMSW\\n1oktrTM46dJuaZSO9qnoQ9rlI2qpyDU3tFJweRYAE6PW4XgAyqyE73VpjUblnAvT8wLmzRqJb67M\\nXKMpG+rdvauOwpvlOhtyje+sG42ebuBjJxhN4T3ap0OZSn2J0LxjtcRXNa833q5EWV4ababndBHG\\nRp0hrU6PlH9W2hl0O1bUt6AqU6P25e1/Ut6eviuUWb3mTDHxub5U/rW7QqTWQqTWYNDroOk1CvtH\\nNA2D5kEZPeFDlfnX38Y16v6E63S0rkanOyDinFmp09VGM21czrPZfjavStRnp9Me0NA0fFgjwO6k\\naj1ngRApW5HCsIjWimKvW90J/nBw7uihuHvO6DJrlQafGnkOP7Q51kwWvBkyCR/2+qzjps5Py3AG\\nE4RHZbTNHSEe36dZNtHzNVpJ39SxeJfFCssJ6cj9Nly4IjaowkmrS5/AzPxnHJ/O4lFRLkS1Vx2F\\n9716cMH9hNHGZolEkLxex2hodIwEzitGbZzhFZ5tpPHeuOJ2kVhbp/Vmh6phYFzRfeyLb7GxGsER\\nXaD35hDdqHJwEMK/FZMK4iqmielwnFXG9gUPgbAHv8dO7/ddWrS5yZJXXyCGQg6DPMVKkkDiYkO/\\nR6VwhAE4lEWCs9b2TPGQfvqClbCM2j9skzvr5t79H7kZVzWLNbrx+bvtim9n1jn3NqefYMhOvWHS\\nyBZpRVcIXCjzzVaRwqiCD0Sthvv81Zxyzv39dIv8a5oMHI6zzn27y0vI5SWwMOAf7/IMMTgxQRZX\\nfwPXrPttXj8xp518f0C5UCERTEy1q44reXJ9a2O1WGj8+Dov/rAC7R6d8if2GZ2iExiFAHYfasJG\\noQjl3AEL7QE2VCKqdO5+XaMlNI1DWpoGKCxmkvjszNwfZfy0jH5zj99e701dYxpH1JppAuHLwx85\\n5/4+OD/dot/MUmrGyAQvtM1NnULeOhZRCUUJXGvJxffvYQf3o5H7UsmajmezuVAutLnGR/rM5gG/\\nv8vTr+epanG8V2TuWWyuKOtPe1awfsW1Z5u8+BfZ2Ozyn+0KvdoOezmXnJF8hePaDu8qCyymkgRV\\nN4rNxnBooJXLtAAboakeuss41DTryQofij2qe28Ynsw6Cs8EFKJrqaleXRgfie9RfP8HnxpdKkcV\\n4mEJ+B6yYafMUfnqHlxrt90kHlVy7rd2vePRXCSWM1Qa++hGng/vBjOPwutgjc4szTjm9PwoPHFf\\n3Tz/QuPoDw6O4ywlI6g+Jw6bjYHZpVaxRv3sivtG9Yu4O9eu++0q6bUElQ8F+o093n4wZh6FB+CJ\\nrRG/UG4HggmU7CGG0aMHOJQ4gbN9kRz4g3EoFujrOn1gwRfCK4HDV+fwpVhKl3if7+EMZUjObbeb\\n1ApZrrP3ba1UIx2e7AySIy7vJ3c8w3KpyaFukHv3lsGso/Dao2PyMjJweurBVV+zp0Zb1JXIpY09\\nRzDDZkbnbbZFYe8TPu/tpsg7xoL16679ckfX2Tzu8TbbopH9yJH/1+keKDHSpVFq0tMH7GnlGe8r\\nhJYXCd+oonUQXn7G+uADe+VjaofvqR1evMZF6skzlmeccX/xurMZHPoBBzn/zM6aec+qBAxf17wp\\n3NbZ9BvYR8dn2Yjz9G9PCF0sFU2N/X+/p9C3dttNqhEZ0HsgbN4UT5+fsL2TQ9OL7LwpTl3jUhfZ\\n2Jo+417cD3eef3126vk+3WGW7dqsjZZcxNcSMzt4xZd2s7pfCS/z/MmAD7sljutZ3tWn09MbX2dr\\nNTIVtI2P/AM4Y0HGj8heCKjEbMXRHhvgi6nSif9N2AmmVkl0KngvCd7Oj7+D4MqPM8+lPy594Pe9\\n+ugEjcQ1l3WKb8tL+tkzTj7ukNd08rv/Ib87eYVNUclsbMkZ92MeXHA/7SZTJe2o6TWWGm/I6VX2\\nD1T8mwmct5hy446usNposV257sH3dtTUCkuNt+R0g/zOLl5Zfz+Hh9TLX/HVKlRrDZotjWPD2s1Y\\nDYWIxdLEbjMt1uEh8eQXQokq5VKJSsP6XKdHJRSKEUvHr70Rl80VZWWtgfaxQiO7TyHwnEX1O8hO\\nj81J4+z4LHUlOR0YADhUkktBCns33W1X3AdKMMOLX+LUy3nK1QZ1vcdpvRGJJYmHPdJZ81DdKv8+\\nY/1vvxCqFalXdbRmix5gd/sJBSPEknHCHinLv42b1v12vPF1fgnFqZbKlKt1tK5xvbaC3Y8atZPP\\nWwFhJOif6KC3LfhRI3YqVRPwEVZl3fW3YnOGWX8evvSa0+PvbMRJxWenlTuaIpVrUui3KVc04ivS\\nXfMQ2BZUVl78TKJRoVCu0qhZZbbbHyEUiZJMnC/HExbbq1ev/nz9+vXEi69evfpGX0d8TZLuj5Ok\\n++Mk6f44Sbo/TpLuj5Ok++Mk6f44zUt3mcMghBBCCCGEEEI8cBLcCyGEEEIIIYQQD5wE90IIIYQQ\\nQgghxAMnwb0QQgghhBBCCPHASXAvhBBCCCGEEEI8cDN3yxdCCCGEEEIIIcT9J7vlCyGEEEIIIYQQ\\n34mFfr//rb+DEEIIIYQQQgghbuE0pl9wOp3f+KsIIYQQQgghhBDiNk5j+oVZb57O2Rfft4t7LUi6\\nPw6S7o+TpPvjJOn+OEm6P06z0v1///d/v9G3EV/L69ev+Z//+Z+zf0t+fxzm7Zkna+6FEEIIIYQQ\\nQogHToJ7IYQQQgghhBDigZPgXgghhBBCCCGEeOAkuBdCCCGEEEIIIR44Ce6FEEIIIYQQQogHToJ7\\nIYQQQgghhBDigZt5FN79YlDe/p3dqjn1jt3tJxSMEEvGCXsmf5WhfsTf3xxO3WNTPKihKMl0cuKe\\n8etXf3hFyg/DfpWPv+1QZ4HFpz+zHJ7/M07vGf++rsgGP2zFUM7uGKDl3vE22wL8rLx8RjrwAJLg\\nq9HJ/v0tueHg0qvstgwv/3sJ3+jfQ0OnWipTrtbRusYojUPEYmliqjJx73maDqc+1+2PEIpESSYi\\nuB3zf75R3+OfH0oARJ/8ymbcNfbePn98KGDgY/WHl6T8k/1nw36dnT8/UjVmP1NijpMOlWLxLI1B\\nwasGUMNxkrEQ7oXJtI1v/pUn0QtpPzO/jr1/zedIy/0/3mZPrvzKs36GuMyA40aZQrlKo9aih1XG\\nBwIhEokEIb9yoTfa5LhRmbj+sjx8mm4Xyw9Lh6M/33DYHuAMrfPDswTOGd/wuPyB33fr2JU0z39J\\nc7w3u246NV0HiKucppPiX+HFD2k8E+9eVr8CZo96OU+52qCu9wAXgUiISCxJPOzh9JHoV7f5bbt6\\n5XexyhHmtkFOSTrf3Hh5HVn/la2Ea+L98zTysfbTjyS94++aVHd/Y7ts4km/4McVdaxsOH/PRoiN\\nX54RdZ/feV5/Kyy/+JVFdcYY10Dj4Pf35PsDouu/suGtzmxPjpPyftLlbWrvzPbRufN87s285Kel\\nwIxrzstsh7LIs1+XCVwyXNnXq5RLJSoNjWNjsm6J+K9fv0/WHzetsx6fm7SXktwsbpt0w+dBK5Ov\\nVGiMPQ/hYIx4KkrQbf2My+KFU7PamvfBg44sBsc6tWOdWjFPeGmTjYzKJTEZAEOjS7OcpVkuk9p6\\nwWrEdcUdAAaFvU/4vJtc6/I5jqt7bGdbgEJic1MC+882oFPe58Nuid7Yq1Yad2mW8+Tj62ytJi4N\\n1k8d6zUKeo1iXiWzscVicFb69KiVzhuFzUKFdnQJ36gQUcIplkJlPjXa5HMVIhNBwoBmYZ+qMcQZ\\nypCUwP5ahr0qO292qBrjBaxBR6vR0WoY9l/ZTHxGxrzj50jcxnjH59irxzrNY51Ww+T5LysERn//\\n4YnG4ccd8lp/4vrr5eFZvESSQQ536/QbJeqdxIVgAqBDrdgEwJMME3DA8c1/UXFNhn7AQc7P1lLg\\nWg1ko5lleyeHZoy/2qNVK9KqFSmoi2xsLSPV7v1gc6qEo3bqVRO91qSfGK8rTVrNxuj/22h6j6R3\\nrIw3W2gVaxAgEvRPPB/D4xrlsvXekAalaovw2DOkBKOknRXyfYNypUFSjUy1G41mlXx/gI0IkZAL\\n+og7Nat9dM5s5jm8pDMNwNRqFNpWOpvGEeV6isCsIMvsUtr/wF55srQ+rVua5Sy++BZPn0Rmfpf5\\nblZnidu7Ttx2F89D9VinWswRXX3Gk5QP2xf5bb6OB1XNTfSOD0xOjDalgz0Oa8fUc2/ZXviRZynf\\n1H1nParDASd9jaPdPfJaj+LHHMG/PSF0jb/CwKiyt+3B9XwJ3y0yq6kfsbNdwUAhsf6C1ejnBCPf\\nKz+Z//4vMqN/XTXSatQPebdbwgDc4Qxrywn8TgfDQY9WJcv+QY1OeY8PwwVebESmRlXGe9wGpkm/\\nXeJg75D6scbhu/c4fvphqoE/7NQpNc4rnZNOlkozie8sUHcRW1qk1Dik08iSq4VZjyije0vk8j3A\\nR3opdsOK5LEyaeT3qBpDHN4kTzaWCLod2IYmvbZGrdjEE/q8vHTT50hd+huvlk7vPp9tMn+EQVxl\\n2CmxP2okRTIvWEn5UWxDBsYxWr1EdRAeayR1yL9/T14fAH7ST1ZIRnwoDOl3axQPsxQ0Kw/bf3xB\\nyne9sRNXOE7M1qAybFOuasS96kTQcN548BEPB4DzKFJGbr+MRvYj++4fWL+ivhx2Cnx4l0MHFvxJ\\nVlfThD0KNgzatSLZwzyadsSH93ZevljCE93kVXRzdPcVswEknb8QhUBQhWodo9lE7yeInFaKY8E7\\nMBX8G1qT0nCInSTqhdHfdr1Ec2ykrZUtoyUD5+08u0ok5SV/oNMrl2ksRiZG9sc78F3xKEEnE8G9\\njNDfjX4jS7EemTF7sUMxW8SYedcpk0alMHFNPV+hG52e6VP99J69Sg9QiCw/YTkewGm3MRh0aRwd\\nclA4JhDyTbXHZs/wOnezOuvxukl7aaif///N4rbPfB4cNgaGPoonF/D5XNhhYrz+vo7Qz/NwZ4zY\\nHSy4VBa3nvMkZlX8zf0ijctmf9jsLLhCLK+m8QJDyrRaV08XOXWiZznIt7h80vg0Uz/iw4dDdCCU\\n2WI14XnAf/h7YqCR/2QFZK7IBi+eLhH0KDgcdhYUD+H0Fs83IgB0K58oa1dM9Xc4cKtptp5vEFVs\\ngE6hUGOy73hAs1qgAyihDJm4lYq1Um2iY9/hT7GcdgEGlU95WibW/x9l0QFfeoXE3OloYlKXdskq\\nYl3hKBGvgsNux+5Q8KhRlraenDcIb+OOnyNxO0ZXpwPYiBCNqbgcdux2BwsuH5HUOluL542A43KW\\nQ90KspdfvmAlHrCudzhw++OsPt0i7bMDOvls5dqDbraFING09TB1jipoE1XDeePBGUoQnhrVF1+G\\nQXn7gFrvsmt6lA6tsnXBu8jz52vE/C4cDjt2h4tAfIWnW0t4serwXPXSDxNfkSsQJgAMqdFonTfN\\nT4P3s383m+hnGXlAu1UBwJkMTQ62DDRqhQ4AkUyGmM3GkDKV+mSa+8IJgtgY0qBcb0+8d96BrxCP\\nha6cDSpuy6CULdK+UKX2q0ej8n2+89kZCunMKG+389Qv1M+mVmS/YqV9fOMHthZDuBUHdoedBcVH\\nbPU5P//1p2vO4L3w7W9QZ4nPcI247bOfB7v9LJ78+efn38Ws6u8gwnARS6duFqwvKLhGEy6Mwfy1\\nFLNouY/s36BxMOhV2fuQRTPAE9tg/ZpTDMXlhh2dSt/KuLHE7OlU7liaJacdMKg09Gt1ythcUVKL\\nVl9tv6zRHovuhydNqnmrhRGKJUiEE9Z1jRL1zvin2AmmlgljY2DkOSq3MUbTzGxEWEyp8gxcm4Ki\\nWnm1W8ryqVCj0zNv3ME2z5d6jsTNOBasv/yQGtmDHFWtizFzVqZBq6kB4AwmiM1aVOfwk0qHrasb\\nVVrXnjtvJxg9r0vGA4Jhv0F1NNU3Muc5EV/GkBp727mJsnji/b5Os2GljZpMzJxZ5wgkSUWtN1rV\\npsyyvidsbpVocJQurfaoM91Eb5YBUJdXSDvtk8H/QKdZsNI7EPBNBN/j0+mj8SSRhFU+NIs1uhM/\\nN0J81Dmv52u0xgr1Vt3qwF/wpQnPWo8v7sxJJ0u+MtaeNjXyB/Ur7zudneFQkkSXwkR9Vv1crjQm\\nBmTarQoG4FAWic8J4BeU23XfXL/OEnfikrjtps+DnfSc58GFx/N9dOc9/O4JwOb2otrsdIYDtG4P\\nrlrLfGLQG024sF1zUUVsbQNXZY+cblDa3sbjekHyintMs8Hhdm20VthPelGmYt8Vo9fBwOo19Xrm\\nVcAuPKoNKjDo9TG53gPv8QQAnQE1OsdrqKN5Wb16mcpwiI04kaCCYg+TdpbI96en8dqcURZXi9T3\\nWzT2P/HBr2MAodXFzxtpfnRcxDKLVJqH6IZGcV+juG9tsBKKxInFYhOb4Zwqb/+T8vbVn37b50ia\\nfHfLEUzyJFZjt9KjW8uyXcsC4PbHiSQiJCIhXA6AHr2aVXYvBDxzy1PF7UWhioGGcf3JWdi8YRKh\\nLJ8aJq1ak37cmgrca1apM8ShLBKZsY6/V9vhn693Jj+LCJt/2ZL8fkt22yLrG30OtisYepadTy6e\\nbwSnL+z3zjY8CnjnjcApeLwLUDU50QxrBsYtvpOk811z4Qt5oKnTLzZoL4dQbW200hBQCKtJ3GaR\\n/FHPCv6jIewdnerQCuBDgfGy/+J0+gWIpFCKOYx2nrqWxHMWrDsIxVIo5RyGUaalLxFQ7TDQaJSs\\nToRgMnJhSq9l/81r9i+8Jkuybi6ZTlPL56ntHVALWflHL2cp9Ac4IxkSHJGtzehKH5ud4U+H8OHD\\nMdovZXKZhUGvaxX+CwEP7lmV9sDEHALYcDgmLxgMs/z5Ojt1y+l08evXWeJOzIvbbvE8KBHv7Ofh\\nErPalPd5mdbjaqMOB5z0GhzuHZ5NpwnOCAxmsS0EWdp8cjZlO7efR7+i0XjSrFLVT3uYdPJH158i\\nKu6b8820XPGQtSmT3Y8as56f6Wm84I9nSDmt6cG6DnYlzWJ83gouMY/Dv8iLX5+xmgzhHmXXodGl\\nXjzg45s/+JBvy2j6g+civvETP24uE/OfL4A91ssc7b7n33/u0vgqhaeLSCIKjM/IOc/7/nTk0h14\\nxV2y44mus5mxgqZu5YBcVbYw/N741CheYEARTR9gthoUhgMcSpKA305AtZZF9YsN2ia0mtYyKiUU\\nxD/WoTK+H04obG2u7PCrxJyzR/EcamS0H8f5e+cj/3FiYdkX6UtyR9IsRx0MqXFU0Bj0qxzt64Cf\\nxaUYzjkjb6dpBD7CQas95QqE5y6zuEy/vsc//vEP/vn/8lz/rlP3pc76zl0Rt93l8/A9+S5G7ofH\\nHbTR8WmqZ7pAntXTCgrxzZUb9bbbXFHWN9po7/IYepaPu1d3DNiVKMlon3yhRbeyw57bde3df8V8\\niut0ZK5Gpzsg4pz1F+3R1azOFbvLee21c92utUmKnQjeUZk9vhNnNHq6Dm80jfdonw5lKvUlQmPH\\n4uFQSa+EKYyOXIqupmWDlVuyu0Kk1kKk1mDQ66DpNQr7RzQNg+ZBGT3hY3zc5Kqj8E59yedI3JQD\\nX3SRjegiGwOTbkejWcqzX24xOC5TqCUJpVy4IjaowkmrS5/AzBFY4/h0RoaKcsNa7nw3bWtGTuRE\\no9AeYCNEPDy7c+4+9+A/bHbUpQ3W9D/41DAobX+krlyY++p0EcZGnSGtTo+Uf1ZQZtDtjEbxVOXW\\n6STpfPdsXpWoz06nPaChafioAeBOqtZmZoEQKVuRwrCI1opir1sj6/5wcPIkmtF+OHbS57NrLt08\\n7/yEjF65TH3Rhzka+fcuxlDnlBuyod5dUYhlVqlW92jmD3nf7qExRM2sEPfamX1Q5fnsDGfwfO8T\\na5nFPs2yaS2zSPoI2BVcngXAxKh1OB6AcoOG91Ub6lmuU2fJgM5tXC9u+3rPw0PbUO87CO57VPKF\\nUY9OnMC1NkLwkH76gpXwzRPKEcywmdF5m21hGJfv52lTVJafPiHlN/CcvGW30qOR3aegvmRRhn8+\\ni83rJ+a0k+8PKBcqJILTR6ocV/Lk+tYmG7GQf2r3y1mGvSqFI6unzxlXR+s3J3fizL37P3Iz7m0W\\na3Tjk7tzKi4vjKopr+vhFAz3imkycDjOOsTsLi8hl5fAwoB/vMszxODklmvdbvscibs2wDTtOE57\\nTuwOPP4wHr8XW/8PPjVNDNNKg9MdtvvNLKVmjEzwQoqYOoW8tW5TCUUJuLkZu0oooZDP9ugc5dnt\\nNKyTFOJxQjf9LHEHXCTW1mm92aFqGFysdm1OP8GQnXrDpJEt0opOHz9ltooURkdrBaJBWR53r3jx\\nhxVo9+iUP7HPaCfrwCgosvtQEzYKRSjnDlhoD7ChElHPO3HG98MZkOc//5ef+imno3jR9Hmw5QpG\\nCdOgToPC/ieGDRPwEY/Kvjhfg80dJbNcpnnYQtPAriRZSgawz9krf3x2Rr+5x2+v96auMY0jas00\\ngfACvkAMhRwGeYqVJIHPOjL3ouvWWeJuTMdtd/88GPR6Dlyuh5/7H+5vMDA56WkcfXzH7mhDjuBq\\ncuaxdqs/vOLVq1e8evUrayEH0KVyVJnYYOX6rJGE0x36L+MMxIn67YCL+NomS3470Cb3cfeK3X/F\\nlewq6bUECtBv7PH2Q45m18A0B5wYXer5j7zbsUYAPLE14ldsjDMwTY61PB/f7ZztkZBKWeffDjtl\\njspXR4+zducUn2tA4+gP/vx4umGNyWAw4MRoU61YnSZ2xX3j0dkzd/wcidsZHlf5+Pvbsw0TTXNg\\n5clGmUrTynsepxWSueMZlv3WdNrcu7cclFv0Tq/Xy+x/+Ei+PTomLzNrn5MBpnmCaZoX/ju/IhA+\\n3VivQaMBsnP2t2VzRVl/mmH2gKmLxLL13sDI8+HdJyp6b/QM9WiVD/jwMWdtkubPsCTH0N47gaBV\\nBg+NHj0DHEqcgP98fbw/GAegr1s7lDt8obNZdQDt8hGV4dWbI1/cPM/mDBEdbazXbjToIKdhfF12\\n/MnT5YsQzqTnzpgAk1ohS2fe22NOTzByqElWR2316t4bPh41ODZO2xBdWu3bL/O5SZ0lbu7quO2O\\nn4eeTmn/I//611vyNzhF7b56UCP3szazsSiElzbZuHL6y9gIgH7AQc5/yynyVrDeO35L7oojO844\\n/CxtPuH4zQ5Vo8r+JxX/s+lRQnF9SniZ508GfNgtcVzP8q4+vfmJN77O1ur0Gfcwf9M1m6KS2dga\\nnXF/Pt3PRpynU+drAqbG/r/fU+hba/eSakSCgLtiatTzfbrD8w1rJrmIryUI2K+elTHP5z5H4vN1\\nG2WaRovmaMPEi1xqhvTZ7rZe0s+ecfJxh7ymk9/9D/ndyetP8/CsM+4HwyPe/uNo6vXxTbHGN9aD\\nq3fOnlc3XW9qp7gOh3+Rjc0u/9muTI3r2bwpnj4/YXsnh6YX2XlTnLrfpS6ysbXE3H0zr0HS+csY\\nn0EF4IwFGc+6CwGVmK14FsD7Yur5DLmxDbXc8S1+fDJd/5rNA35/l8cYG8WzjG2sN3rlqtMwZk8X\\nfnjTdu8Nh9XB3q04Wbpk0Oz8uDMIrvzI8/R0bjsufeD3vfpov5QESa9CdO0Zpu0De+VjaofvqR1O\\n3YbDtzD1zMzbUO90A033jeoscXuz4zbbF3seFNrtHoPAAuO7PsyLF+7rZpoPKri/yO72EwpGiCXj\\nhD3X+1Vsrigraw20jxVrinzgOYvzuwrnc/hJry3R/NM6v/66Pzuz2kDbrtBv7LGX88j6+89ixxtf\\n55dQnGqpTLlaR+sa2BQPaihELJYmpl6/snX7I4QiUZKJCO5RST8+3U9dmT0zBIdKcilIYe/i7pzi\\nszlCrP/tF0K1IvWqjtZs0eN2eX++u32OxM15Uy/5i79KtVKjobXQugag4FVDhGIxUjEVZaymtS2o\\nrLz4mUSjQqFcpVGznotZefh2rI31PjVKwPyds8XX5Y6usNposV2ZnvqmBDO8+CVOvZynXG1Q13uA\\ni0AkRCSWJB72SKfrfWX3o0bt5POj4yaDk8ufbAt+1IidStWaNh9Wzxvy4xtqnc62u8gRTLIUKvGp\\nYVIr1UiHzwdWrI318hy2B3NPwxBfljO8yvPw5decHndmI05qzsbE7miKVK5Jod+mXNGIr6jYHR4S\\nT34hFCuTr1RoNDSODasNEQgEiEWShEOuG5cNN62zxO3NitvU9t0/D+FgjHgqStBtlQG3HTC6D2yv\\nXr368/Xr1xMvvnr16ht9HfE1Sbo/TpLuj5Ok++Mk6f44Sbo/TrPS/X//93+/0bcRX8vr16/5n//5\\nn7N/S35/HOaV8zJoLIQQQgghhBBCPHAS3AshhBBCCCGEEA+cBPdCCCGEEEIIIcQDJ8G9EEIIIYQQ\\nQgjxwElwL4QQQgghhBBCPHAzd8sXQgghhBBCCCHE/Se75QshhBBCCCGEEN+JhX6//62/gxBCCCGE\\nEEIIIW7hNKZfcDqd3/irCCGEEEIIIYQQ4jZOY/qFWW+eztkX37eLey1Iuj8Oku6Pk6T74yTp/jhJ\\nuj9Oku6Pk6T74zRvzzxZcy+EEEIIIYQQQjxwEtwLIYQQQgghhBAPnAT3QgghhBBCCCHEAyfBvRBC\\nCCGEEEII8cBJcC+EEEIIIYQQQjxwEtwLIYQQQgghhBAP3Myj8O4vnezf35IbDi69ym7L8PK/g9RH\\n13ozL/lpKTBxzbBf5eNvO9QZsvrDK1L+ydcmuQhEQsSSSyRUZcZnLLD49GeWw5N/zqF+xN/fHAKc\\n/Qxx1wzK27+zWzXnXuGKbPDDVoyzlDN71Mt5ytUGdb3HafpGYkniYQ+Oa36+2x8hFE2ymFRRbHf3\\nG4mr9avb/LZdnXrdyvtL+C68PuwU+POPfTqAb/EFL5fVqZ7N8/zsZfWHl6T88/o+z5+JWWWLuAvz\\n853d7ScUjBBLxgl7JstcLff/eJs9mfupM58Ps0u1VKRaOy0PFLxqiFgiTiwSGOXt8+8zVZ4wQMu9\\n4222BfhZefmMdOCBVa33yVT5DG6/ihqKk4hH8DntV1x/WXk+cSPV3d/YLpvYCLHxyzOi7umrTp+p\\nWc/OcXWH/2xXMFBIbPzAesz1+b//Y3dF+nupz2mnTZrOpx2O/nzDYXuAQ1nk2a/LBC48SvPbgFa5\\nEw7GSC4lCShTb4u7cq38f7N22Xi6xjf/ypOolYCneVvxr/DihzSeiU+6rMwXp7Tcv3ib7WEnzfP/\\nWrmQp3Syv70l1x/gTj7jx7XQRHl82i7rorLxywsi9vn579R4+p27Om9flZ7z2pSzfv56QJv5PJ39\\nXvcg9pMWyLX0aNWKtGo1GstbbC4GLgQGBoW9T/i8m0Skbr/XjGaW7Z0cmjH+6mn6Fimoi2xsLXOd\\ntvmxXqOg16jXM2w9XcI3vxUpvqkBzWqBzuhfnaMijaRKxDnv+jb5XIXIswSzLjGbeQ4v6UwSX9bg\\nWKd2rFMr5gkvbbKRUS8J4C43uzww6GhlDrQyR/4km5trBC8p14+re2xnW4BCYnNTAvvPYepk370l\\np0924B/rGse6Rtt08nLlvGPuc8rz4XGNctn6OUMalKotwksX6/bLvuoRO9sVDCCU2WJVAvvPd530\\nT93yo7Uahbb1uaZxRLmeIjAVJMw3ONapHuvUay02fpC23hdxw/w/y2m7rFLN8Pz59dplhn7AQc7P\\n1g3yv7AEggmU7CEGeZqtDIHg+V9w2NGp96207Bc1OiuhiaC7rVXpAM5glIAb6N/uO3xu3v4ePbBW\\niJ/Mf/8XmdG/Lu8d0al/xk86740ZcGJ0qR1us1c+pn64Tzn0I0nv5PUDo8retgfXNQsTcfeu6l0d\\ndgp8eJdDBxb8SVZX04Q9CjYM2rUi2cM8mnbEh/d2Xr5YwnOhlB///IFp0Kll2d4t0dOyHJZCPE9f\\nHC8WX4ozusmr6ObZvy/rdR2eNKnmz2uNITVK1TaRS9Kr38hSrEemZuNAh2K2iDHzLvElTOTrgcmJ\\n0aZ0sMdh7Zh67i3bCz/yLDWZlvNmcIwz20dzygOTbiPPwX4ew+3HM7cTaDzAU0isv2A1Ki3+z6GX\\n98npA2yEWH6xRsKnYGNIv6fRKJYgct6w/9zyvF0v0RwbIWply2jJAKFrtIqGvSp7H7LoQHDxBZsS\\nFNyJa6W/E56+ip7dc1r224iw+ZetOZ22Jo1KYaLcrucrdKMXR2vPTYzImSbHrTw773PoRpV8NU1k\\nUer7u3aT/H9qbrtMv1m7rJH9yL77B9alDL8Rm9dPzGkn3x/Q0NtkguczGU+Dd4DBVPDfQatY73pC\\nPpwwMV4/e4R+lpvn7Vkm25SXj/IPb9kJ8TVJfXQlOwuKj/jKCjGbDWhT19ozrzzRsxzkW1y+aEB8\\nGz1Kh1ZjbMG7yPPna8T8LhwOO3aHi0B8hadbS3ix0jFX7V36aXaHgj++wnLc6slpVzW6X/6XELfQ\\nq5epDIfYlTSZJaui1/M1WpdmVINStkj7wjX96hGHuuTwb8buYMGlsrj1nCejkdLmfpHG/Jn4c/So\\nZI/mlAcKvugKz178xPMnMZxzltyY+hEfPhyiMxq5TXikQv0sBl3dKkWVcJSoepoeDtzeMKn1Z2Md\\n+J9Zng80agWrYRnJZIjZbAwpU6lfXu4DDHt1dt/tUDWGeGIbPFm+/cwRMe4m6X8z57M0FNKZ0XPR\\nzlPXrlmWOxy4QyGCNiuHD65YGipu4/PT/2K7TM83btAuMyhvH1C7uggQ4+x+1KiVL46LGufR0Xnw\\nfqqhn787PG7TaA8AH2H19h1ln523v1PSFrkm24KCC6uVZ5jzHxot95H9KwJD8fUN+zrNhpVuajIx\\nc3aFI5AkFbXeaFWb15gh5EBxWc/EoDOQTp17qUOt2ATAkwyzGInhxZq6VWteHhGedLLkK2N52dTI\\nH3zOfCBxd1zE0im8wJAyrdbNovvrlAd2j3duYD8YjdxqBnhiG6zLyO0dcKCM/uD9epaDXAWtazCY\\nsfzyc8tzo1kl3x9gI0I0niSSsFKvWaxdHgyYOrntbSrHQxb8GTbWYjOX7ojbuH7639TpLA2HkiS6\\nFCbqG63brjS47gIrQ9NoDq0gIuS9yZiguJ67Sv/zdtnwhBu1y4bU2NvO0ZZVdzdgJxCMA2AadfRR\\nPD/saFTbA2zEWVmJAJPBf0+r0gIcShi/d/pTr+su8vb36IFNy/92hicGvdGkEbttuhkXW9vAVdkj\\npxuUtrfxuF6Q/NpfUszX751t0hHwzpt2peDxLkDV5EQzMOCKhpuJ0bM+07YgPWX30flaLB/xcACb\\n10kilOVTw6RWqpEOz15Xn0ynqeXz1PYOqIWsqZ56OUuhP8AZyZDgiGxNunO+JZvbi2qz0xkO0Lo9\\nGFtCMRhm+fN1duqes+Vb1yoPZjPNBofbNarGEPCTXpQA727YCSbXiFZ2qBo9qtkdqlkAF2o8QjyS\\nJBxyWaPkn1We96iVrCU8rniUoHMBIimUYg6jnaeuJfGo06X5cNgh/6lEdTRzJ7GYlCV4d+oG6X8T\\nY7M0/OkQPnw4kkEOd+v0ymUai5GZGymWt/9JeXv69eDiJotTy7XE57ur9L95u8xuW2R9o8/BdgVD\\nz7LzycXzjeBn/TaPicOvkrAVKA2tmc1Jr4+e3qADuCIq0fCQ5kGdplFH7yzh8xq0NB0Ad1KduXxu\\nVv6bmiJ/y7x9l+aVE9/adxyP2LF/Rm/QuQEnRpvy/icqwyHgI6pO99raFoIsbT4hqtgAndx+Hv3G\\nU0XF5+jVdvjn69e8Hvvv768/UvsC62MGpoFe+sR+2eob9CVVZKXWfXO+FmvBF0X1ArgIRlQA+o0S\\n9c7sO92RNMtRB0NqHBU0Bv0qR/s64GdxKYbTJscjPFYnzSpV/XQ4SSd/VLntPkDiApsryubPP7KR\\nSeA/a5T10Mp5dt7/i7e7tc/e72LYqVNqWOV2KGxNqXf4VWLOy0d8htSoVs5TunRUlBG+O/Yl0v90\\nlgb4CAetMMIVCBPExpAG5frsZZbztGpFah3p2P0SPjf9B6aBXj7gcNQu86dD11x3bccTXWczY60X\\n71YOyFWPb/+LPDaOAKHR7Kduo02fHs2aFbyrkSBOt0o4aOd0WfOwr1GvWrNgIoHbT8m/67z9PfmO\\nux8VFLcN2mAeW732E1szjI3EzzKvNyaUWSUx54gsmyvK+kYb7V0eQ8/ycfdx79Z4rzhdhLFRZ0ir\\n0yPlnxWKG3Q7Vo/MgqpMbcxndR7sTN214M+wkpJpuffN+G7YaiJyVsm7wnFitgaVYZtyVSPunbX7\\nrkIss0q1ukczf8j7dg+NIWpmhbjXztUHpogvbXjcQRutfVU9k/n5yg31rlUezGdXoiSjffKFFt3K\\nDntul+y0fFcWvMSW1oktrTM46dJuaZSO9qnoQ9rlI2qpCIlbl+fnJ2fYSRMJjppAdpVIykv+QL9i\\nxMdPMuWiVqiOjfDJzI07dY30v7ih8XznszScwQTh0X02d4R4fJ9m2bT2X0n6po7OmtzQa7Sx8sEH\\n9io19t+5cc88bkt8thum/2XtsuXETQJHO+rSBmv6H3xqGJS2P1JXpPfuehz4g1EoljCadZoNG/Wm\\ntewpNDo3MhjxQ7NJt9FGd7WpM8ROjMCceOrqDfVun7fv0lVH4X0r33Vw7/IsACYnzTbHgwjKWAL3\\n2hodwEYE5zVr5ujqjzxJ+S5twDmCGTYzOm+zLQxD9tT+mi7fLd9PMGSn3jBpZIu0oisELszvMltF\\nCqMjzgLR4LUabM7wCs820nhleubXZZoMHI6zvNjv6VOXjO+GXdv7F6/3pj+mc1RBS6szd8i2uaNk\\nlss0D1toGtiVJEvJAHbZK/8e6FHJF0ZleJzADY+fszmvLg+GvR6GyzVVDtgUleWnT0j5DTwnb9mt\\n9Ghk9ymoL1mU1v7nMU1Mh+Ns6q19wUMg7MHvsdP7fZcWbYaD66XfrPJ8/OSMAXn+83/5qa9wOuIT\\nndpl20Vqa5PViEJkoc/brNWxkw0GzjZ3FJ/pmul/XeOzNPrNPX6bUQlY+6+kCVw61X60sXI8zl4l\\nh2mUaXeX+YxBRzHLHaT/rHPur89FYm2d1psdqoaBNOGvb8GnEqZMnQa5/S49hjhDQfyjCtTlD+Gl\\nSadZ5sC02muudAjfLavMu8vb36fvuiXiCybONs/KHlboGAMGA5Nj7YhPhw0APMk4wRlRXHzzr7x6\\n9YpXr/6LZ2mr4q4fla8x1d7q/ZPK/r5xkVjO4AcGRp4P7z5R0XuY5oCB2aNVPuDDxxwdrB7fpRnH\\nobgiG/z11StevXrF//c8jQL063mqmqy/+KpMney7f/Op0KJnDhj0GlRrVi3sTPhwA8OTOsXDq6dk\\nXb5Dth1/MkPKaRWT4Uwa9fHVEffLwOSkp3H08R27o80Og6vJax1fNslFLLM4pzww6DSOeP/md97t\\nVOhfmODlDMSJ+u2Ai/jaJkt+a7ph7uOu7LT8mY5rO/zxdpdSvU3PNBkMBphmj0a5TAuwEUJZgNuW\\n5+3y0Wh53eVmnaZht8WJRVxcrOPLO9sU5ASNO3H99L8Ok1ohy5yVVxNqpdoVS2tGyzPLZQBsBHBK\\nXXDnbpP+4+2yV69e8csPW6ymbhPYW2yuKOtPrbJFXJ/NqRIe7ZrfO7YqwkDkfJDM5lVHm93p6KOx\\nmHDAe8sg9PPy9nA4wDTN6f++o2L8uy6eHP4Uq8sa24dNtMIOfxQmp+7Y3XGW06ErNuiwE1raZKn1\\nlpxe5NO+/xrT8KxGX+/4LTmp9O8NmzfF0+cnbO/k0PQiO2+KU9e41EU2tqbPRL5ofIZGYe8TPu8m\\nEenP+Sr0cpac3gf9P5T3x9/xk4xba2iPR8ffgY+1n36cMY2zR/H9H3xqmNYO2fE0M2fhOlTSawm6\\nFSdL0mH3TcybdgkK4aVNNlLTw2fzNtQbPwvb4Vvk6fPBpeXBwrFOtx/DOS/pHX6WNp9w/GaHqlFl\\n/5OK/9nsTRrFVbo0Sk16+oA9rTzjfYXQ8iLhUUa9cXk+tvmSO77Fj08iU3W/2Tzg93d5jCtHfMbr\\neJ3DD1l8v0zPHhA3cbP0v8r4sqzgyo8zzzs/Ln3g9736aP+VBImx5L5soyxPMk5QqoM7drfp/zkc\\n/kU2Nrv8Z7si8/SuTSEQVKFqnShkQyUcGM8kXtSoF9pWZG8nSfCS0ZJ5+c+becmP0eMb5+3xNmC/\\nvsfv/5ge6b96KcDD8V2P3IMddfE5P75YIxkJnG145vSoJDJb/PTjE0LXKaAdftJrS/jBmoZXvsbw\\nzNg94v5Qghle/PIrT1eThM/WaboIRJKsPv2Zn14sc70ZvnbU9BpLfjsDo8r+QWlqhE98Gf7Uc/7y\\nYo1E2DNaguEiEEmz9fMzUj4748ffueOLxGauz3QRSyVQsM5ErTbnd8I5w6s830pf2eEjvg67208k\\nucLTn3/maebzzhi3yoOf2VwZLw8UvGqclc2X/Pxy7cpGvM0VJbMatWbyNPbYy7XkWMxb8ZB6+Ssv\\nN1dIRlTcozaWTfEQjKfZePETTxcn9zW4SXk+vvlSKjUd2AM4gkmWQtY7V47mOvykV5fOZg/sfZKN\\nFT/PzdP/MqfLsmzEScVnz593R1OjmVltyhXtkl2Y4KxcePozL9euGhQSN3e36f+53NEVVqVD/0Zc\\ngTCB0f8rwSiBCx0xvkD4bNmsM67e+rSR2+Ttx1Yn2169evXn69evJ1589erVN/o64muSdH+cJN0f\\nJ0n3x0nS/XGSdH+cJN0fJ0n3x2leustYlBBCCCGEEEII8cBJcC+EEEIIIYQQQjxwEtwLIYQQQggh\\nhBAPnAT3QgghhBBCCCHEAyfBvRBCCCGEEEII8cDN3C1fCCGEEEIIIYQQ95/sli+EEEIIIYQQQnwn\\nFvr9/rf+DkIIIYQQQgghhLiF05h+wel0fuOvIoQQQgghhBBCiNs4jekXTl/43//937M3T+fsi+/T\\n//zP/wBwca8FSffHQdL9cZJ0f5wk3R8nSffHSdL9cZJ0f5zm7Zkna+6FEEIIIYQQQogHToJ7IYQQ\\nQgghhBDigZPgXgghhBBCCCGEeOAkuBdCCCGEEEIIIR44Ce6FEEIIIYQQQogHToJ7IYQQQgghhBDi\\ngVu4+pL7Ty/8hzf7LWxE2PzLFhHn5Ptm+4h3fx6i42ftpx9Ieq3Xh4ZOtVSmXK2jdQ1sigc1FCIW\\nSxNTlYnPGOpH/P3NIQCrP7wi5Z/8Gf3qNr9tV7HbMrz87yV8X+qXfeS03P/jbfYExb/Cix/SeCbe\\nNShv/85u1cQV2eCHrRiTqWhy3KhQKFdp1Fr0ALc/QigSJZmI4HacXqeT/e0tuf4AT/oFP66oE71g\\nQ/2I394cYgCLT//GcngyG+n5N7w50HEG1/nheYILj6O4hvP8NplnT53mt/E8P+xX+fjbDnWGcz83\\nvvlX1gPa2XWR9V/ZSrhmfjb4WPvpxws/26S6+xvbZXPs2Rhw3ChPPFd2t59AIEQikSDkV6QX9ZqG\\nhkY5X6XasMpkcBGIhIjF00RDLqwselU+18n+/S254QBv5iU/LQUm7pln9meBUd/jnx9KAESf/Mpm\\n/Px5uc4zd9lni/nG/7bxzb/yJHqdv16Hoz/fcNge4FAWefbrMoGZme+qPNvjaPQMXUbq+5sZb0fN\\ns/rDK5LOeflqVB4kl0io856H8zLaRoiNX54RdU9fddqWuCpvmvoR/3lzSPcWdc31ntnv33mdermL\\n9fOk2Wk/qy0w7vJ0NunUS5Qq9bNywOlRCUXjJBIxfMrkZ8zK78fVHf6zXcFAIbHxA+uxyfbE9+t6\\n7Z55ed6Kt6Ik00nCnvM29GV/61O3icdu+j3OTccNTo9KQI0QT0UJuk/vuX0b40v4LoJ7fzxDKv+e\\nQr/GUUEjNBGM9ahkj9ABX3qZuBdgQKe8z4fdEr2xzxkaXZrlLs1ynnx8na3VxFjAJ+4TQz/gIOdn\\naylwrcBpeKJx+HGHvNafeP1Yr1HQaxTzKpmNLRaDC4AfNaGQy/bo5Ru0M+pEA7HdqmOM/r/e6rAU\\nHn/eOmjVDgD+SFAC+8+mk93L4X++hO+O8qLNqRKO2qlXTfRak35ivAPGpNVsjP6/jab3SHrHKmuz\\nhVaxGvyRoB87A7TcO95mWxM/Y3Cs0zzWaTVMnv+yQkDKkSvMLpOhR6tWpFUrkg+vsLWRxvtV/5Y9\\naqXzRmmzUKEdXcInvTX3kqnVKLSt/GkaR5TrKQJTAdZ18mzkK31jcTOn5UGNxvIWm4vT9f/wuEa5\\nbD0DQxqUqi3Cl7QTerUDis0ImeCsK3pUckd0ANsd/hbiNq5O+5uY1ybsdzVKWY1Stkj66SYr4fnB\\nuqkfsbNdwQBCmS1WH1Fg/7ntHiveytIsF0ls/sB69Nv87c6/R5nU1gtWI2Od95c8I9WuRrWYI3wH\\nz+KX8F0E9zhU0ithCttV2vlDStEXpEatL6NeINcwsRFhMWUFYUb9kHe7JQzAHc6wtpzA73QwHPRo\\nVbLsH9TolPf4MFzgxUZERlvuqUb2I/vu6xQKHfLv35PXB4Cf9JMVkhEfCkP63RrFwywFTePw3Xvs\\nP1rPji8QQyGHQYV2Z4WA//yzToN3YCr4H3Y0qu0B4EP1P5aC/ss60bPsfHLxfCN27c6Sq0ZNAkEV\\nqnWMZhO9nzjv7R8L3oGp4N/QmpSGQ+wkUf12hp0C+6MKLpJ5wUrKj2IbMjCO0eolqoOwBPbX0K/t\\n8W63MlkmuxzYhgat0gF7BzXcPj+uO/hb3qT3fNipU2qc98SfdLJUmkl8o9k6NmeUp6+i57/HFaNI\\n4ksyaVQKZx2vAPV8hW50cobXsFO6Rp71E/jv/yJzes8VI0Xi5i77Ow7H2tLnZfmAE6NL7XCbvfIx\\n9cN9yqGLM6ugXS/RHBv1bWXLaMkAobmtXYNStkg0eHEm4Hn78TIyQn81Z3STV9HN0b8un3n1OWl/\\nbYMOuVltQtuQk+MG+f0DSl0Xfu/8NtywV2XvQxYdCC6+YPOaA03fg+uVodP3neX54YCTvsbR7h55\\nrU95O0c4+OSSPHq3Zn+PHsWPOYJ/G32Pmc+IFwUYnLQpHeyRbTlRVd9Uut+HmXrfzbPojC6zFnIA\\nOvlshT7AQKeYs4L4yPqK1dAaaOQ/Wa+5Ihu8eLpE0KPgcNhZUDyE01s837B67buVT5S1y6fliW/J\\noLx9QK13+VXH5SyHuhVwL798wUo8gMthx+5w4PbHWX26RdpnZ/zZcfhVojY7YFBpnvdOngfvlgEV\\n2uexPj29QQdY8EVRb1vxiCndyg7ZyhUJfQOuQJgAMKRGo3UeDpwG72f/bjbRzxobA9qtCgDOZAif\\nA4yuPhrViRCNqdZzZXew4PIRSa2ztRi4s+/83RpoFPZr02Wy3Y7d4SKY3uLFzz+zuRTg6/aTDGhW\\nC3QAJZQhE7eqy1qpRv/yG8U3cD5iq5DOLOEFTtp56hfqcMmzD5WdBcVHfGWFmM0GtKlr7clLBhq1\\nglUhRzIZYjYbQ8pU6pfXHYZ+QL5qTL441n4U39o10v4GjqtZcrPahHYHTm+U1afP+eGHTSJzYvth\\nr87uux2qxhBPbIMny+pXrpu+rc8uQ212FlwhllfTeIEhZeraN8hpM75Hq3UCzHtGHNgdDhZcKotb\\nP/GXn56R8t/PMPp+fqtbcRFbWsQL9BtZCnWD48oRufaABW+G9Gi6zLCjU+lblX0sEZk5EuiOpVly\\njgK7ho6E9/fXkBp72znaczvXDVpNDQBnMEFs1gJMh59UOmxd3ajSOgbsfoIp69peXac7urStVekA\\nrvgKy5GLwX+PZk0HwBX2T40CiM9T3tmmoN9NbrS5VaJBqzputdpYj4+J3iwDoC6vkHbaJ4P/gU6z\\nYP38QMCHA3AsWCXIkBrZgxxVrYtx+UCPuOA6ZbLL4/nqjafhSZNq3grjQ7EEiXACgH6jRL1z2Z3i\\nWzgdsXUoSaJLYaI+q3wuVxqMZ0nJsw+bbUHBNZokb5gXOm6aVfL9gRV0xJNEElYd3izWzurwear7\\neVpjz8Fp+1HcH5el/fVdp03oYe6gvamT296mcjxkwZ9hY+36Mwq/F3dWho6l5/DybWu+rPHnajBk\\n4hkJzXlGsKMo9zeE/j6m5Y84/EkyyRIfij2K2Q+0DB1QSGSSZ2skjV4HA6vHyeuZlzAuPKoNKjDo\\n9TH5zv5Q3wG7bZH1jT4H2xWMs2nbwRlX9ujVrFJjIeCZWwgrbi8KVQw0jBMAa2o++QIn7SpaJ43H\\n26PdsJoIajBGZNDisFa3gv+lAO6+TrNpjRzFgjL6c1cyG5t0D3aoGjqHH3Zx/rDJVbNiy9v/pLw9\\n+drkVCkXvpAHmjr9YoP2cgjV1kYrDQGFsJrEbRbJH/Ws4D8awt7RqQ6thmMoYH2KI5jkSazGbqVH\\nt5Zlu5YFwO2PE0lESERCdzKV/Ht2vTJ5tl5th3++3vnse2ZNo+/Vy1SGQ2zEiQQVFHuYtLNEvt+m\\nXNWIe9XvqXf8YRsbsfWnQ/jw4UgGOdyt0yuXaSxGzjZVkzz7sA1PDHqjafd223gOPN8fwxWPEnQu\\nQCSFUsxhtPPUtSQedTrHKuE00WGBQiNPthDm2VIA20mDfK4B+MhkVLLZ/Nzvc3VdI+7K/LS/ieu1\\nCWf+/GGH/KcS1dEgQ2IxeWd7AT0kd1aGjqWn7VtuajH1PcaeEf+cZ8Q0R53GNhyOyWfxum2ML+k7\\na5s4CKWWCGJj0NHRDXCGMiTDdxCa2+3ILOv7xI4nus5mxgqiu5UDctXjO/0JihokMZoCpuk9hsca\\n1aZ5FtydTu22gn8wWnXqDHEocXzysNwZhzvK+tMMfmBgVMlmK/TuoJvXp0bxAgOKaPoAs9WgMBzg\\nUJIE/HYCqrU8p19s0Dah1bSmaCqhIP6zAtpFfOMnftxcJuY/35L5WC9ztPuef/+5S0PmcD9AHWrF\\nJgCueIjAAmD3o8as5nrnqIJ28g2/nphwOmILPsJBa39lVyBMEBtDGpTr41N4Jc/eB/tvXvP69eR/\\nf+Ral9wx4MRoU97/RGU4BHxE1fP5ceP7Y4TC1jRph18l5pw9g+OU3eYluZTBC7SyR9SPB7SKOUr9\\nId5khmRQhna+vflpb7N/vS6UITWqlfPCoXRUvGTW6PfsM8vQ4YCTXoPD/fxoen+c8NzTL2a4q3js\\n9HvsHZ4tMwj6r/c9tMK/+Mc//sEfu7V7uXTnuyu1bO4oi5kSzawO+EgvTU6ZUVynI7Q1Ot0BEefs\\nHVK72qh30OW0poOOpm10GNLtG3ChT7Zv3N16YHFddtSlDdb0P/jUMChtf6SuXCxpXbgiNqjCSatL\\nn8DMXjjj+HT0UEU5zRWOAGrMTqlsotebNGx1WoArEibgtK6NBh20mm00vcWC3gDAGQvKbtp3zOFf\\nZGNd5/e9Ot3KDh+blxfA19nkyOZVifrsdNoDGpqGjxoA7qRqHb8SCJGyFSkMi2itKPa6VYT7wxdP\\nQXDgiy6yEV1kY2DS7Wg0S3n2yy0Gx2UKtSShlByWNc/1yuTZrjoK7/r3TBrfdT0aDY2WBNgJRlN4\\nj/bpUKZSXyIUl00zv73zEVtnMEF41OqzuSPE4/s0yyZ6vkYr6Rs79UTy7EMxa2QcIJRZJXG23vV8\\nfww7aSKnAbldJZLykj/Qp2ZwjHP4UyynS7zPNzjce4+i6diIsLQYwtG/fA2ObKj35Vwn7RcU628/\\npEXfgMnK2cQ0po/Uu06bcD4/yZSLWqE6Nmv08U3Nv00Zuv/mNftTn6MQ31y62WZ6nxmPzf8eo73Z\\nPvMZuQ8zd7674B7suN0uQMeGC+eFhqLN6yfmtJPvDygXKiSC0+eQH1fy5Pqj6dUhvzW9wenC67RR\\n7w9pt7sMIsrEcXvtpjVdWwm7HmEm/5ZcJNbWab3ZoWoYGFNdaMrZzuj9ZpZSMzZ95I2pU8jXratD\\nUQJnlb+DQDAE5Sr9xhH7x1aB4Q8FpqZ2N8sH9HWrY8E6Ik3cNXdilSetDruVHsZ0Qt+CF39YgXaP\\nTvkT+/QAhUhgVCHZfagJG4UilHMHLLQH2FCJqOMB3QDTtOM4nYJmd+Dxh/H4vdj6f/CpaX7G2sDH\\n4TplsnHcw+F2faV8Nbnreu7d/5GbcVWzWKMbn95hW3xd4yO2/eYev73em7rGNI6oNdMEwgtInr0f\\nPufUgejqjzxJne9SPb4/xoA8//m/6Wn0pzM4oulZnTZ2gqlVopWPVDWNHhBaXRydaX+77yi+jItp\\nj9NFGBt1DPROD3xj9fOgTas+ml7tdY3abddoEw579PouXFN9ty5SW5usRhQiC33eZlvWZr/BAE8e\\nzTF4cBdl6NXny19y753HYx7ST1+wEj4Nx6/xjNxzD+vb3gW7SnotgQL0G3u8/ZCj2TUwTeuojXr+\\nI+92rBE8T2yN+NkaLS9qwhoSaB8dkq22McwBA7NH82h/dFyKQjQWknVWX5nNdT5texZ3PMOy35qa\\nl3v3loNyi545YGCaHOtl9j98JN8eHXeRuTDTIxAmjA3o0TsGGyHCgfNC/HRqt6nr6HB2RJr4ElzE\\n1zZZusO/byBolQVDo0fPAIcSJ3D2+Q78wTgAfd3aHdbhC+EdG/kZHlf5+PtbPhVqdHom5ulz1ShT\\naVoBh8cp3X2XsqukViPTZfLAKl9b5X0+/P4vPuZaM6fV3rVhp8xR+eqfNGsndvFlDM0TTNOc+m+A\\nSa2Q5Tr7G56eciB59mGJb/6VV69e8erVf/EsbdW99aMy+tiymHb5aDRd+3J6vkZrTpa1OcNkMiEA\\n7EqaxbjM3PjWrpP2NqdKODo6yeTwE3mtZ9UdRofKYXa0XMdPPHy+D5I7mhm1Iy60CQcm/W6D7Mf/\\n8O8321MnMdltcWIRF6ezRk8D+rvc7PchuG0ZuvrDq1F6vuK///ozz58sXRLYDzBnlvv/f3v3+ZXI\\nljZ+/wtIzhkEQxs6nTgzz333/P+vpuc398ycOaenk6FVkJyKIpYFz4tCBQFFW1ttr89aZ63TUATZ\\n8dp7197wtfHY+ff4dXTKWofycXli083L8shJT0VtP+z0/g5n7q9mDa7wcmPAp70i3VqGD7XM1DWu\\n6DO218bPuDfjS6yRUj6TVVRyO39wcWzYHV2/nfv7xbVZPMtsbnX47055xv0vLpIvXnDyeZecopLb\\n+y+5vckrTFYf6c1tEhfW05tsHvwBM7XRzJDVHxyb2Z9c2g3nR6SJO2LxkNraoPvOOIZmnnnL+Vzp\\n1/yUOm/kx2eNYfqWiiWvj4ipcNZxdEd8EzO1nXqJhtakcaBQmF7nhd2XJjnvPB1xxhZ6xssN86V1\\nsqOl0tO9uL6yfM3bhM9sSvP6f5Noo+W9JqI8/8uMs3d1hYP/fCTfN+7jjftCT+oYpPtQ3v8P5QsT\\n8iZCbL4OjI6/A//qj7ycMSvbLX7it/3a6JSDGF5FyuzjZCaQ2iLVfE9WLfDlwGMshx7bTNER3ebH\\njenyqDcO+e1DDm1iBcc0RyTNSkPnJJKceU73LIu2NeJrzEl7AKxEVjZRWp8pd+scvv83hxOvtRJc\\nWSU6fpO22UXqxQsGl/QJoYfa7hGanr4fMSYbet33ZFWVo08Z3L+sLpxvHrNv0e8ZDI95/4/jqcdP\\ny9XtxGNjK3/VQw6zHrZTXmPWe6E8Ahbb0tQs+eV9jBTfYtjwiUaiZlzRZ/wSiFIplihVaigdbbRM\\nJEAkkiQya3MHi4f0yx/xFrIUKnVqqrGM1+ULEEkkiQW//XFN4pwjvMpavcnOjPPQTUs+Vl/9TKxe\\nJl+qUK826QEOT4hAKEw8FsIxM/Hs+IMeqBuba3lCF++3Pl/aDRDweyQP3DGTPczqeh3lc5mv3tPM\\n7MEXNpPLGQHCxVsqTEsefCEz5YoOuAn6JqtlV+I1f/JUqJSr1JUmSse4/8vlCxCIREhEfFjvcxfY\\nR+O0Tg5TylWo1Guj39KONxQgEk0SDtjvvGwNvqXnIAAAc4BJREFUT+pny3t9q/HZ9wFafMRTfvL7\\n0zuxi2+r2yjQwDjRIDFnptURTpDINsj3W5TKCtFVKbOPlsVDcj1F448j1PIuGZ+XlaXzzRQTidkD\\nbRZ/nFSgyJe6TrVYJTk61nKK2cXy9qu7/AvETc1I+43Rnicme5DNH38ikM9TrFxoO+IpYjP686d9\\nwkitSLFcO+sT2pw+AuEosVgE91XLcC0ekmspGu+OULUc+19cT+L++wfR77mleGy8P1nPHJD3vmTZ\\nZzT8l+URjy9AOBIhtOAGfN+a6c2bN3+8ffuWv/3tb2cPvnnz5h6/krhrf/3rXwF4+/btxOOS7k+D\\npPvTJOn+NEm6P02S7k+TpPvTJOn+NM1Ld7k5WAghhBBCCCGEeOQkuBdCCCGEEEIIIR45Ce6FEEII\\nIYQQQohHToJ7IYQQQgghhBDikZPgXgghhBBCCCGEeOTOdssXQgghhBBCCCHE4yK75QshhBBCCCGE\\nEN+JpX6/f9/fQQghhBBCCCGEEDdwGtMv2Wy2e/4qQgghhBBCCCGEuInTmH5p1pOna/bF9+3iXguS\\n7k/Dabr/7W9/AyTdn4K//vWvUt6fKEn3p0nS/WmSdH+aJN2fpnl75sk990IIIYQQQgghxCMnwb0Q\\nQgghhBBCCPHISXAvhBBCCCGEEEI8chLcCyGEEEIIIYQQj5wE90IIIYQQQgghxCMnwb0QQgghhBBC\\nCPHIzTwK70HSe9RKOUqVOjW1B1hx+bz4glES0QB2i3HZsF/h8792qTEkuvVnNsLWBd68zfEf7zhq\\nDbBYl3nx6wreqWEPjdLOb+xV9KlXOzwhAuE4y3EfVtPV15+yhzb5YTvCIt/we9Wv7PCvncqV10W3\\n/swzr3KWtpPseEMBIvEUMd+8X1Onsvcvdko6JgJs/vKCsOP8WTX3jneH6sznTg27JT7+tk+DJVIv\\nfyVlyfP3d0eXfu+1H96Q8MBQPT679vQxcXuG7Tx//H5AG3Avv+L1im9q5HK8bpg0O//Mv/7c4nWM\\nuA4l+3+8z5xMPW5z+giE4yQTIRyWGS+caieMtA1F4kSDTma9BGCoqVSKJUqVGkpHw2R14gsEiESS\\nRMbyxLzvdZGU8TEnbcqFwtlvO952xyMBHBd6IX2lRK5cpl5X6GpgdngI+iNEE2H8o4u/XVm+Xt/A\\nl37Ni5R37qzJaXtnNqV5/b8p3HO/zRNwS326q9rWvlqhVCxSHuUnm9NHIBAhkozinVV1X5FfzY3F\\n+yzSNhjm15tWXL4AkUSS2Fj9fJ3yep7+HtZ/+oG4a/K60zJnIsTWn7YJ2S48v0h9c1Ueu+Izvmc3\\naxN1uvUy+VKFerVJj1EcFQoTj11s28/rV1f8Ba/XAxfacZXM39+THQ5wpV/zU8o7+cGL1jMLpvF4\\n3T3+msX+7m/nUQT3WiPDzm4WRZt4lLZSpa1UKRz7WH3+goTnZgsRdKVKvjUw/l87plRL4L1GpdxV\\nq+TVKrVamu3nKdzzepDijvRoVgs0q1XqK9tsLU93robdKqWSkcZD6hQrTYJjnTB3MIb/sEWDOqVa\\ni3ByutvVqhVpMMRijRP0m0G9279KLGpAo5KnPfpX+7hAPe67RgN7df4RD0O/o1DMKJTLUbZfbhCw\\nnz83u504TdsCed8ym9sreCdavQHt0gGf9or0xh4dah0apQ6NUo5c9Bnba7HZgwniUsNehd13u1S0\\n8U76edutmX9lKzZKRL1D8eAT+6XuxHsMuiqVrkqlkCW89oKNhBsT89xuWb5u36CZOaYWnj04jK6Q\\nO6x9xbf5ftx1nw6Ym5/6HYViR6GYy5LYeMFK1HmWRxbJr6tSD9wijbZS4lApoaRfs33JwNjVVDL7\\nWTwvF+yD30p9I65reKJw9HmXnNKfePw0jirkfKQ3t1n2T4en7cIeh94feBa2Tz03yzepZx6oBx/c\\n661jPn3IogJLnjhra0mCTismhvRbRQ73j2jbfHidN00cnXo5z3ja13JlOuEkzjmvGJ9xH+ga7WqG\\nnb0iPSXDUTHAywuBoczQz2cLb/EmvDX61/kI3azfbDhWF5yPig840TpUj3bYL3WpHR1QCvw4NXp7\\nGpifamZKKHEvgVEJMDlCRKMHNEo6aq5KM+6enKEZKFTzRvjoSQaMUbuxp2Wm7v4MTxpUcueZY0iV\\nYqVFaMYAzanr5h+ZhbkfEzOcuk63mWN/L4vSLXGQDeDdCGHBWLkxu53QaFULZI5yKMoxnz6aef0q\\nxWlzodWO+LBXRAMcwTTrKzE8NgvDQY9mOcPBYZV2aZ9PwyVebYbwpf7Cm9Tpt7tixuDJ06nn9qlo\\nQyyuOBubKfwOC6ahTq+lUC00cJ6NzmhUvnxkv2zMrIRWNliJerFZTAw0leLhPkfVJdxuO2Ym6967\\nK8vX7xsMqXOcrxOYml0CtZQh3x8s8Lnft7vv0wHo1I4+sl+6kJ/McNJvUs4ccFTtkt97z8DyE89C\\nVhbNrzbb4n0WMWlyxcqovB5+Yr/cp5EpoMS8BC78gNdpe0/UDLtf7LzcjHD52P7N6xsx6XptYpvc\\nx4/k1AHgIbmxSjzkxsqQfqdK4ShDXlE4+vAR84+vSLgv1gEaxZ0dnPZXVwbk36aeOffQYoAHPlzR\\no5w5NhLHtczLl+tEPHYsFjNmiwWHL8nzH//ED18xW34+o2slmU7hAk5aOWrKYo2w2WLFE11lJWp8\\ngVZFoXOzryJuxMyS1U10dZWIyQS0qCmtyUvGAvNQOk3EZGJIiXJtfK7OQiCSwIoxQ1NtTC4z0hoV\\ncv0BJgJEg096MeWD06uVKA+HmK1J0ikjbdRcleZCRXiB/CMeBosFRyDNStJoQfslhZYO0KN4lJnT\\nTtjxRld5vj2q29UM2cqo3A8Ucl+MwN4e2uTV8xR+pxWLxcyS1Ukwuc3LzRAAnfIXSgu2CeJUh1bR\\n6Bbbg2FCLisWsxmzxYrTFya1vXG2ukZXChyUjXSJbv7A9nIAh9WC2Wxmye5jefslP//8kqT3svmI\\n2y3LN+0btAsZSurkNcN+heMDWer1Lfp0ALqSY78wIz9ZLNicAZa3X7IRtmAEeflRW7F4fhW3wSiv\\ngcBpADhkcAtRdKe8S6bcu/Sa26lvxHV1SxmO1AHgZuX1K1ajXuynZd8TZe35Nkm3GVDJZcr0Z76L\\nSnY/O2r75/k29cxD9qCD+2FfpVE3Gkl/IjY7ESxWrF+ROONLrcOpIGG3GdAoletcmncmvwRWu7Fw\\nZ9AeIF3Ab8+0ZMU+Wjyl6ZMpcB6YhwhH44RiRrZvFKoTAzEWX+hspLBarI5VLBr1inGPnT0aJTBr\\nyaW4J22qhQYAzniQ5VAEF7MHaC5zWf4RD4vNZsz2DtE40SfbCV98djth8cZJhI0nmpUGfWDYVimP\\nZlIjsdDMmR5HJEnKZrQJ5boqdfu1WLH6jDLVKWb4kq/S7ukzf8NWs4wGmEkSDc1acmnH6Vysob+t\\nsnzzvkGLXHa8YzqgkT+69P7hp+Jb9OlgsfwUSSyfDeY3msYgzqL5VdySQY9G3Rj0WvJ4cN7S4Elp\\nd4e8Oj/lbrO+EYvSaDYUAGz+GJHpzUvA4iGRDBpX1ys0u9OXAJy0j9n9Mi/4/3b1zEP2sIel+r2z\\nBtHjnH2PxUDXjStMFizXHaqYWmrtxhL3c7RXo1cqUV8Ozb53boqO1jO+p2lpesSkV93ln293Jx57\\nihtv3KXhiUZvlFfMpvEU6FEtngbmYfy2JQglsBayaK0cNSWO03d6vYvQKP21eo1mN0bYAcNunUrF\\naPyjkenllgAH795ycOExWap7987viXUTDXoxuWzEAhm+1HWqxSrJYOyK5XmG+fnHUNr5J6Wdycdk\\nGeb96PdPZ2VMmE1A77yd8Lrm3YtnxelagorOiaIZS617bTSMutg1d2meHafPBGUY9ProPPAR8QfF\\nTiS9TLlxhKopFA4UCgdgsjoJhKJEIhFCHiug0esYA3HWkAvHV/7At1KWb9g3sCeSBKsF8vV9MpWg\\nseFXu0g218NEiFQaMpnq1/2Bj9lX9ulmpd20BfOT3YkXE1WG9E90Fs+v4qYGwwx/vM1MPW62hlnd\\niM+83eU6bW96c4vO4S4VTeXo0x62H7aYXin9dfXNrL6eWESPXtUo+0te59x+mdXhwkoFDQXtwvyM\\nLbTOiqvCbqZJp7zLvsPOdmrGjgh3HTvO8NBigEfeT1E5/r9/8o9//IODmnb15ReczuiCm6DfWM5r\\n9wbxY2I42ljtKgNdQy1+4aBkjOW74z4W2+pB3I4BJ1qL0sEXysMh4CbsO28ihu0axbqRNoGgDwtg\\n8fiI2GbPwtiD0dGy/fP0P53BWXInCfoeeZH5rpzfE7vkDuNzAdjxh3wA9OtFau3LXg9X5R/xgOg6\\n3XqGg0NjpscWCuCWvvaDZvEs8+rXF6zFAzhGaTXUOtQKh3x+9zufcq1bnBm9vbJ8076BZSlIctWY\\neaoc5GjqGuVj45YR/9rygpMFT9nX9em+1rfNr+LUQFOoFJW5M7GLsjjCPHuexgMMtAqZTJneUFbM\\nfC9MWPCnNtmIGFFWPXNIQV18hea5GfWM2Yzr8hc9Kg975t5mJ4iJGkOa7R4Jz22GzeczujZ/jOAo\\nVa/cWI3ZM/EAS540q4np3T5lhu/2zRvBD6TXiJ1ttHG+i7qZJKHT3TfNPkIJF7lDdWoWxrTkJ5y0\\nUT7uGekf1amNZnD88dDcjZQe2mYaT8H4CQi+2HnaGAM0dcrDFqWKQtQ1fSzeYvnnnGyodz8unelZ\\nNerU4ULthEanbXQClnxWrIDVfjpDUKXdGRCyzRq469FRRrPAdtvco/TEfGZ7gMR6gMQ6DHptFLVK\\n/uCYhqbROCyhxtaxO5cAHa3apjsA6zXGUG+/LN+8bwBgC6+wXq7zpZ7j6FOLrqKz5EqTjrkx1574\\nvttf2ae76ig8g3Wx/NTr0BzN7tmWzkv21fnVjU8qghuZOgJytEnq7scs9fxHDl2/shWdzBPXbXst\\nnmU2n6n8tl+jU97lc+PiaxfMH3NcdkyauIwde8gEFThpdujjnTl7r3VPV9T5sM6MUO1E1zdoKx/J\\n940VGkvDC0NuN6lnRrdztRnS6RtHYI7ra5fv4/DQYoAHHdybbB78ATO1uk49U6AZXsV7S5Xq+Ixu\\nv7HPv97uT11j3LebxBu8+meyBVd5sZnEJZX+vQmv/chGwn1+rM3YLuoDcvz3/+WmXjOcOvrOjD8Y\\nw3p8hKYdc7zbpt4fYCJKJChrMh6S8RMQqvv/ZkYRpn1cRkn6zk5FuMzF/CMeJoszzvardfyjtneR\\ndkJvFshXjPreG/YbnQqXh4jNTK4/oJQvE/NP38LRLefI9o1bciIBj+SN69J1BhbL2e9mtrsI2F14\\nlwb840PubN8EvzeClSwaOQrlON7YxbpWo9ezYLcvlgJfU5a/vm8wWt5dP6KpKICV5XQct5mvnpl8\\n7O6yTzfOfWV+6lHOH6MBFusy/tNRmgXzq4zy3RKLBUcgSiSYR63pqEoLLWr/6sDEEVtjo9lmr9xD\\n06ZXgFydP65X34hFWPH6fVCp0W9kKDYipP0Xfl9dJZ8zjgu1BsJ45610svhIb6dQ3x2hahoXU/gm\\n9YzJZsdlM1HrD2m1OgxC1rH2o0erYezQZQ3aF7rV87498JxrNJLGEpscnz58oaz20PUBA12nqzZp\\nX7LkZqifoOv61H8DdKr5DFeu2OXixmqjbxXa5M9v3vDmzRv+v5dJrEC/lqOi3GR5iLiJ6NafefPm\\nDW/e/A8vkkbFXDsuMb5Cp1U6Hi3PvNzFndVNnsDZxnr1eh0A13IE3y0Nhekns/KlLPa7juFJjcLR\\n1bfNTJ+KYFgk/4j7Zzal+XFU1/7vLxv4MaF3CuQr42lvJ7aSntNO9GiWDvn0OUsbY3VV6vSMXLOP\\n5HrMqL/r+7z/lKXR0dB144imWu4zH3aN+6OdkXWickvONQ2oH//OH5+zVJQOmq4zGBhL5ytlY5bL\\nbHVgXQKLL87aaKllZf8dn4/rdLXR9T2V4sFn/v3v9+Sa0wX0dsvy1/UNTlncCVKj72ILpIkvMEHw\\nNHxdn25RFl+SZ/EZ+UnX6XfqHH/+wF5FB6yE1xOjFRiL51dxS3Sdbr1EuWYMplns1lta4Wonur5F\\nas5xaV9T34ibc0TTrHiMW2KzH95zWGrSOyv7JQ4+fSbXGh2Tl778OEOLZ5nNrXkrom9Sz7jwxYxl\\nWq3jIzKVFtqoD9E4PiBbH9UXkcCjWIX94Kspi3uZ5y8H7OxmUdQCu+8KM66yYrVML3cr7/+H8oVB\\ndxMhNl8Hzpbz+ld/nDqXHqBb/MRv+7XRfbuxqbNyz76fP81WWuV9pkl+/wtu1xYXN9+ct4x/aomS\\nuAEzgdQWqeZ7smqBLwce44zTsQ2RHNFtfhydhz1Obxzy24cc2tQszPnGegY30fD00u5x8zZZmbWk\\nLPPx/7i40FjywvWcHn8HbtZ/mj7LGnoUPv7Ol7punIoQTTJ7EHhO/rlw1bylv7Jp4rdjckRZ31L4\\n706Z+sEX8p7zs25NrgTPX55c2k7Yfctsbp+fcQ9gDa7wcmPAp70i3VqGD7XpWwBc0Wdsr4UeRYP+\\noOgKtVyfzjDDTnX6dzU64LFRYGUlvP4C3fSJ/VKX6tFHqkcXr7fSavUYeJeYvbj968vyj+HuLfUN\\nzPgTa8TaZVxXdFKfmq/p013jUwiuvODZ4LL8ZCex8YKV0KhkXyu/ipuYd5uVwUMsNN2W3rjttXhI\\nbW3QfbdLRbsYyN1GfSOuz0XyxQtOPu+SU1Rye/8ltzd5hcnqI725PeOM+2mO8DO2uj3eZ5pTz12/\\nnjHjS6yRUj6TVVRyO39wca2vO7o+d6D2OjHAt/Dgg3sAqz/Nq1/CVIoFKtU6NbUHWHH5vPgCQSKR\\nyLU2Vuo2CjQYYiJKIjo7nHKEEySyDfL9FqWyQnR13t3WZnzJdVL1d2TVCgeHPjxbMWxSG3w7Fg/J\\n9RSNP45Qy7tkfF5Wls43REokpgN7AIs/TipQnLmz+vl920NsgfP7LsVDcH78nSO6TGRm2tiJJGJk\\n6zm0Vo5KI05qXhGekX82onILxkPkCK+yVm+yUzbOunW/Xjlbbme0E1FqpRylymk7YccbChCKxIkG\\nnTPqATOu6DN+CUSpFEuUKjWUjobJ6sQXCBCJJIn4JKy/EUuAZ3/5hUC1QK2iojSa9ACzw0PAHyIS\\njxJ0jnVBLE5iG78QiJTIlcvU6wpdzbg+6I8QTYTxO4zr587tfmVZPr3V5zb6BiZbkGcvgwt/9lNy\\n2326mU7zU6xCqVikPMpPNqePQCBCJBnFO/4Z182v4laclu94Kj6ZHrfAZA+zul5H+Vxmag7+Nuob\\ncW2mJR+rr34mVi+TL1WoV41y5vCECITCxGMhHAvf9jIef02vfr12PWPxkH75I95ClkJl/PoAkUSS\\n2Mw+xMNkevPmzR9v376dePDNmzf39HXEtyTp/jSdpvvf/vY3QNL9KfjrX/8q5f2JknR/miTdnyZJ\\n96dJ0v1pmpfussBICCGEEEIIIYR45CS4F0IIIYQQQgghHjkJ7oUQQgghhBBCiEdOgnshhBBCCCGE\\nEOKRk+BeCCGEEEIIIYR45Gbuli+EEEIIIYQQQoiHT3bLF0IIIYQQQgghvhNL/X7/vr+DEEIIIYQQ\\nQgghbuA0pl+y2Wz3/FWEEEIIIYQQQghxE6cx/dKsJ0/X7Ivv28W9FiTdnwZJ96dJ0v1pknR/miTd\\nnyZJ96dJ0v1pmrdnntxzL4QQQgghhBBCPHIS3AshhBBCCCGEEI+cBPdCCCGEEEIIIcQjJ8G9EEII\\nIYQQQgjxyElwL4QQQgghhBBCPHIS3AshhBBCCCGEEI/czKPwHrKTVoVCoUi5rtDVwGR14vP6CEXj\\nhP1OWsf/x/vMyZXv43dCowP20CY/bEewTjw7QD3+wLujJlbPKq9+iKDu/MZeRZ9z/SmN0ui6eS5/\\nvbjMUD3m7++OAFj74Q0JzxUv0HvUSjlKlTo1tQfY8YYChCJxokEnljkv66sVSsXzPGZz+ggEIkSS\\nUbxjCadkF8trC33XJ++87CxWRnS69TL5UoV6tUkPcHhCBEJh4rEQjguJOy+tTFYnvkCASCRJxDf/\\nEy/mCbPDg9cbIBaLEfKcv+6qPGE2pXn9vyncl/5t4qLT3/WqvKGrx/z33REdQmz9aZuQDYb9Cp//\\ntUuNIdGtP7MRtrJ4fpM6/TaM193jjPIXJp6ME3Sed0fmlSOb00cgHCeZmC7jp7TaPv/8VAQgvPEr\\nW1H72HMH/P4pj4abtR9ek/BMzm8M+zV2//hMRVti+fnPpN2Ns7wzz2meGs9nk4x2JxJPEbukjvme\\nfU35Hbdo2wzjec7D+k8/EHddeK/KDv/aqWAafdZSafH2PG6bVafM+uyn3v6rZP7+nuxwcOlVp+2i\\n65r1xJkb9vWGmkqlWKJUqaF0tEv7A1K+78blMZ1O7v8tnn/O+lXXyg/z23iHJ0QgHGc57sNqup2/\\n91t5VMF9t7LLf3fKaGOPDbUOjWoHpdrD8suLhTtY3liS9kGOXvWQQiNE2n/eyA+7FTJHKmAllo7j\\nREe9zT9E3DmtkWFnN4synlno0awWaFYL5H3LbG6v4B0vAXqH4sEn9kvdiffqdxSKHYViLkti4wUr\\nUacseblHwxOFo8+75JT+xONdtUperVLI+UhvbrPsv7p6G2odGqUOjVKOXPQZ22uxyaBhTp4YdFUa\\nXZVGKYM7us3zjRAX+qHiDsyqr8eepZw9pg08snb4yTLKX4ZGqUBs6weehe2XXt/vKBQzCuVylO2X\\nGwSmLu9RLVbO/tXIl2mFU7hH2cUaTJAKlPhSb5HLlgm9iI2V2wGN/AEVbYgtkCYeXIL+xfe/idN2\\np0p9ZZutZe+TbT9uXH6/qm1Wyexn8bxM4Z4X5YkH7byeKJHYfsVaaGzA7iZ9PQa0Swd82ivSm/qc\\nS/oDM51/Vi39mu3U0y3f13VVTGf+JXXt97xZfpjz/UZ9ynIlzctHVn88nuBer5PbraAB3vgm66kg\\nDouJgd6jpdQoNmz4HGBN/YU3Z/nhfNTQlX7NTynv2Btq2NQiexWNQiZH2JvCaQbQqeezNBhiD60S\\n95uB+bM288hszv0ZtvN8+pBFBZY8cdbWkgSdVkxotKoFMkc5FOWYTx/NvH51nu61o4/sl3qAldDK\\nBitRLzYznPSblDMHHFW75PfeM7D8xLOQFd/CeU3cnja5jx/JqQPAQ3JjlXjIjZUh/U6VwlGGvKJw\\n9OEj5h9fkXBPNrMTI7zDAScnHerHRxzmG7RL+3w223i9HhiN7GpUvnxkv3wxT5gYDE5f18UbcE8F\\n9jJDf1c0ipkCYX8S58Vnanmy9evX1YuSOv12nM1kDgec9BWO9/bJKX1KO1mC/g0CY72SiXKk63Sb\\nOfb3sijdEgfZAN6N0MQszLBdoziWB07aGcqNOO7g6ZvaiaSWKdaPaNczZKtBnoWso9cWyeZ6gJtk\\nKoINJuboZs3QznN+7YATrUP1aIf9Upfa0QGlwI9Ts8hPx03K7/Xb5otO1Ay7X+y83IzMHYS9Tns+\\nvJVBn6fAQ/p//4f06F9XrWgYL2+z64kehc9Z/H8x6omb9fVAqx3xYa+IBjiCadZXYnhsFoaDHs1y\\nhoPDKu3SPp+GS7zaDE3V+fPKdz1zQCn4lMv3NSwQ0/kdHiLXyT83zA+nxtv4ga7RrmbY2SvSUzMc\\nFQO8TD6eHt2jGWAadtoUh0bRD4QjuKwWzGYzS1Yn/vAy2xvX7XRZiaTX8GPiRM2QLRvjd7paIFPo\\nYSLAyop05B6fHsWjjFG4Xcu8fLlOxGPHYjFjttjxRld5vp3ChdHgZyujdFdy7BeM/49u/sD2cgCH\\n1YLZYsHmDLC8/ZKNsAUj4MvTvHyVkLgj3VKGI3UAuFl5/YrVqBe7xYzZYsHhibL2fJuk2wyo5DLl\\nyyfeTGaWrG4ia8/ZShudt3YhQ7ltPK0rBQ7Ks/LE6ete8vOff5qYRRB3T1MPyVW0yQcHKoVsEW32\\nS8RDZDKzZA+wspbEBQwpUVMuSUGLBUcgzUrS6NH1SwqtiVhwQKOSpw1YA2nSUaN7Uy1WJ+oBiyfB\\nStIOaJS/5GjqGP9/bLQb7uQqMc9tdY2MuiK6ukrEZAJa1JTWLb3343Td8ntbbXOnvEum3Jv9pHi4\\nZtQTzeYJN+3rMVDIfTHymj20yavnKfxOKxaLEU8Ek9u83AwB0Cl/oaRc1tmbLt/l+tMu34u6/Zju\\nhvlhDrPFiie6ykrUGD5Wc3U6N/lD78mjCe5ZsnI6dlrM7FGstejpXxdhmRxhltPGSEwtk6OhnS8L\\n86aXCTq+7iuLb2/YV2nUjXzhi8dmLqOxeOMkwsYTzUqDPtBqGkuDzCSJzgzW7EQSy1gBXTumIdH9\\nPdBoNhQAbP4YEe+M6sviIZEMGlfXKzS705dMM+NLLBO70Pk+zRMW6/KcPAFL1ke0Tus7Ujk4DcoM\\n3fIx2ZaUyUdpyYp9tBB7OP/W9jM2m1EWh2icjOWB4UmDSs4I4wORGLFgDIB+vUitPf4OZvyJFYKY\\nGGg5jksttEaOo4qOiRDLCd+td4xMY3+j9pX9lu/BdcrvbbbNpd0d8qr8/o/SeBkaDG/c1xu2Vcp9\\n43WR2Ozb6RyRJCmbGdAo11WuyjHj5Xtwxf3hYuSWY7qb5ofLWbDaR23TCVfmg4fk0SzLNznCpNMl\\n3mea9JQS+0oJAJszQCgaJhKJ4L72NLsZbzxFrPiJYr/A0acWfVXHbI2Tin/dfTO96i7/fLs7+TfM\\n2SRG3KJ+72zDE69r3oyqFadrCSo6J4qGhkavY2ykYw25cMxLeLsTLyaqDOmf6DymsbHvQ49e1Ujb\\nJa9z7vJKq8OFlQoaCtrV+yMZLE5cPjM0dLqtHhq2szyx5HXOzhMDHX0IYMJimbxgMMzwx9vM1Eue\\n9uZKX88aTBIe5snXc2TyQV6kvJhO6uSydcBNOu0jk8ndyWdLnX5HTjR6ozrbtMBmCf3+6YyLCfPY\\n9b1aifJwiIkoIb8VqzlI0lYk129RqihEXedBu8kWZnmtQO2gSf3gC588KhoQWFuem5alnX9S2pl8\\nbNFbNYZjf6PZ9HTbjeuX39tpm9ObW3QOd6loKkef9rD9sMVtVcOz8oW4AxfriRv19YBeGw2j7nZd\\nXJd9xo7TZ4IyDHp9dC4PlqR8X9+tx3Q3zA+XN906Wm+U55YeV4//EX1XM77US355sU4s6DxrTPud\\nOvnDXd79/p7CDWZuTEsBkqkAAC3VaOCD6SS+RzPsIYS4D/3aPv/4xz/45//lkIV434bZ5CKeSuMC\\nmpljat0BzUKWYn+IK54mvsAmiuKBGA446dU5OsiNNlGLErxst2ldp1vPcHBobG9rCwXGOn9tqoUG\\nAPZowNgsyezBFzEuaB+XUS4M9HmiaRI24xYeVQWzNcly9LbvqRxworUoHXyhPBwCbsK+i3ebPx33\\nVX4tjjDPnqfxAAOtQiZTprfIMhFx/07rif2jUT0Rwu95KDfMjsr34eFZ+Y4EHs992ffrbmK62zLQ\\nNdTSIUclY4mRJxmY2ifkIXtkPSEzjkCcZ4E4z4YDuh0FtVLg8LiOpinkSwoRd2DusRfzOCLLpIoN\\nsq0BS640ycjX30Mrmy/dE5udICZqDGm2eyQ8s9JSo9Mezcr6rFixYncuATpatU13ANaZm/l2aI5G\\nBm1Lshz727NjD5mgAifNDn28M0ddte7pyLwP66I1nN6hPbq3zuG2L54n5pAN9e6Occ90kY+5Okf7\\nH7EqKiZCpJYDWPrtq9/ghqROvx0H795yMPWolehWamIzPZi/AsZsDbO6ep4WulIlP+oIhsOnfQAz\\n/nAC1/EBbUqUaykCY8fiYfGRXA2S3zF21w+vJfFeUq1fZ0O9ebO5gfTaLd7P/zhdr/zeXtts8Syz\\n+Uzlt/0anfIunxu3U5KvOgpP3Mz8emLVOOKUm/T1wGo/XdlXpd0ZELLNPrmho4xm4u22qZjisvId\\nlc30ruEWY7ob9f0nzVqdB7DkSbMSe1y9uUfVyujj92OYzDhcASIr22wkjR7BUDu52T0RZjt2h7G+\\nz+KwM7Osi0fBZPPgDxgJWM8UJu7rO6U3C+RHZ1p6w35sgNs72iGTHIWZm+70KOePz+7B9s+631vc\\nMStevw+AfiNDsTGjtOsq+VzNuDoQxrvQvhkDlPzxaHMXN0GfUYlfnSfE/TDjT6wRtproKQoq4L9k\\nObV4uExWJ/5omuc//3zlMXinLM44z3/a4vz2a516OX+2GVv2w//j7du3vH37lr//fsBpuNgoVKc2\\nRLLaz3viLvvdDtuE136UY7KA65bf22ybHbE1NkaTN5om228+Lk6Sz386qydu2tczuTxERp38Un72\\nprvdco5sfwBYiQQ8V5RZO95QnGev/swLKd/Xcpsx3U3zw2UcnhCJtVf8/PpxHYMHj2nmfqCQ/c8+\\n/ViKWMiP22bBxJCTXpVy2UisJcf0CNttGw4H6Lo+XYBNFixSqr8Z/eQEXb94g6YJi8VObCVNuX6A\\nquX49GEw8ziMNsZoXGrUUFh8SZ7Fy3wq9Kjsv2N4Muu4HR2wEl5PILH93bmsjDmiaVaKDY5UjeyH\\n9wxmHYXXGh2Tl55/7JHxQeNH4TUBcMXTREb9fYsvzlqkzE75Qp4YHdfSbC20W5+4AyZbkHQ6QGW/\\n9tXLqaVO/7aus+/E+AqYYbfEx9/2aXQK5CtR/AkjzYftEselq49APGnlqClxnL67T9Txo7Lqh//h\\nY65H7biEGnHLLX9cr/zebttsJ7q+Ra/7nqxsrPegndcTPQoff+dLvUP5uEw0eHqM4s36eph9JNdj\\nlD/l6df3ef9Jm3kUHoAzsk50Rn1xnVU8Yo5bj+lumB/G3+E7Wp33aJoZXamR63chs0tlepUeZkeU\\ndOz2d7m9qF/b57d/7E89bhT283/PW94hy3VvR+bj/3ExG5z9tq4Ez1+esLObRVEL7L4rTL3e7ltm\\nc3v8nEsLwZUXPBt8Yr/UpXr0kerUqjo7iY0XrMw4R1fcnsvLmIvkixecfN4lp6jk9v5Lbm/yOpPV\\nR3pze+qMe5i/zBfAFX3G9sr4EjAr4fUX6KbL8gRY3EtTDdC8z5EN2G6PI5JmpaFzErl8OfVVpE5/\\nHEyOKOtbCv/dKVM/+ELe84qEh7Pj70xEeT46/3qCrnDwn4/k+xqlcp24L3SjSYB5S3FnnYN+zkwg\\ntUWq+Z6sWuDLgefSs9afksXL7y23zRYPqa0Nuu92qWhy3/3DZye2/ozmu10q6iGHWc/ZChjTjfp6\\nYA2u8HJjwKe9It1ahg+16bbaFX3G9tr0GffidtxFTHfT/PA9ejTBvSWwxl9+8VMt1qg0GyiqsTzL\\n4QkRCIWJx0I4HtmyCXF3rP40r36JUivlKFXq1NQexvKpAKFInGjQOd3BsziJbfxCIFahVCxSrit0\\nNbA5fQQCESLJKF6p6e+dacnH6qufidXL5EsV6tUmPW5WF5isTnyBAJFIksiszbxO80SkRK5cpj7K\\nE2aHB6/XSyQUJxiw3/mKITGD2cXy9qv7/hbiG3KEV1mrN9kpq2T3s7i23WfH3/lW49OBPYDFRzzl\\nJ79fo1cqUV8OEf6Wx9xaPCTXUzT+OEIt75LxedmIfv2+Po/edcrvLbfNJnuY1fU6yucyix6oIu7P\\neHrVMwfkvS9ZHi2BuVFfDzOu6DN+CUSpFEuUKjWUjnZ1f0DcmruK6W6WH74/pjdv3vzx9u3biQff\\nvHlzT19HfEuS7k+TpPvTJOn+NEm6P02S7k+TpPvTJOn+NM1L9+98YYIQQgghhBBCCPH9k+BeCCGE\\nEEIIIYR45CS4F0IIIYQQQgghHjkJ7oUQQgghhBBCiEdOgnshhBBCCCGEEOKRm7lbvhBCCCGEEEII\\nIR4+2S1fCCGEEEIIIYT4Tiz1+/37/g5CCCGEEEIIIYS4gdOYfslms93zVxFCCCGEEEIIIcRNnMb0\\nS7OePF2zL75vF/dakHR/GiTdnyZJ96fpYroPh8N7+ibiWzKZTBP/lvL+NMyq5//2t7/d07cR38rb\\nt2/561//evZvKe9Pw7w98+SeeyGEEEIIIYQQ4pGT4F4IIYQQQgghhHjkJLgXQgghhBBCCCEeOQnu\\nhRBCCCGEEEKIR06CeyGEEEIIIYQQ4pGT4F4IIYQQQgghhHjkZh6F93AM6NZL5EsV6tUmPcDs8OD1\\nBojFYgQ8Vk4qO/xrp4IJH5u/vCLsGH+9RmnnN/YqOkvuVV7/mMQ59uzwpMbePz9THg5Jvfwf0n79\\n7Hp7aJMftiNYASX7f7zPnGD1rPLqh8n3GP+M8dec0+nWyxN/g83pw+sLEU2E8TseeBI8EMN+hc//\\n2qWGi7UfXpPwzBuXOk8PV/o1P6W80+/VzvPH7we0AffyK16v+GaPcp20KRcKlCo1lI4GWHH5vPiC\\nUeKRAOdJd3U+lVG0xZyn8/zjuqJbf2YjzFk6X+TwhAiE4yzHfVjPToPS5l5/aqL86j1qpRylSp2a\\n2hu9rw9fIEosGsJtM1L0tG4wm9K8/t8U7ol3vKpuEOMuS3uHJ0QgFCYeC+GwzHm9plIpls7Kq8nq\\nxBcIEIkkifgmf/n5n2XHGwoQiaeIjb3mNusfcX2L1AtwWob91C8tdyqZv78nOxxMpNFpWZ5ndhkX\\nN3dZnTynHKrH/P3d0dTVRlkPE0/GCTrP+1Sz6ueb1TPXbD/Etc0vf1ZcvgCRRJJY0MlpsizeVxil\\nyBX9OXPDiCWuMvGe4nYt1O+aXX+fGs8Xaz+8IeF5mu33A44sByjZD7zPNCcf7ao0uirNus7LX1bx\\neIMEqVJDoar0CDvsZ9cOT1SU6gAAvVWn3U3iHAv+T5oK5eEQM0n8XjMwv+IG0NRDDrMetlPehYK1\\n4YnC0eddckp/4vF+R6HSUagUsgRXttlaXuz9BECLXLZM6EUM24xn9UaOo0saYBjQqORpj/7VPi5Q\\nj/sIXXizYa/C7rtdKtp4w6HRVqq0lSqa+Ve2YnYWzafeOQGJuH1dtUperVKrpdl+nsJ93d9eV8l8\\neE9WHVx4X4WuqtDSbbxenTMgJO7EaZoWcj7Sm9ss+8ebrgHt0gGf9or0xh4dah0apQ6NUo5c9Bnb\\na7G5AwPnejSrBZrVKvWZdfPX1j9CiKudl8PW1g88C9svvdoo6xkapRKJ7VeshS6/fp7L6xlxPzTa\\nSolDpYSSfr1w/3vcIv25Vemj3a9v0u96Ou33g625hu0iB6OAKZR+xWrCg9U0ZKB1UWpFKoOgETBZ\\nPPgDZmp1nVajiRazn42cngbvAMOp4F9HbZQAsMV9uBbMMfXMZw4cVzc2DNpkP34kpw4AD8mNVeIh\\nF1ZgcNKieLhPpmnD53NLkHBN/XqGQi3ESvBi9m1TyBTQLnnt8KRBJXc+2DKkSrHSIpQcn4/Rqef2\\nqWhDLK44G5sp/A4LpqFOr6VQLTRwBoz0Xzifimu7fIT8PJXHZ0wGuka7mmFnr0hPyXBUDPAyOTnX\\ndtUMi1o6IKsOMBFg5dU6MbcVE0P6PYV6oQghCezv2njaD3SdfqvI4f4Rta7C0YePWH76gbjLuFar\\nHfFhr4gGOIJp1ldieGwWhoMezXKGg8Mq7dI+n4ZLvNoMTaX7+WcNONE6VI922C91qR0dUAr8ePY5\\np76m/hE3Y7KFef4mfPbv/tmKvRBbf9q+MDj7dSkgM/Tf3kSdPBxw0lc43vlMTtWoHJRJhFMXVkxy\\nNit3dv3ePjmlR+FzFv9fNggs0Lu9Tj0z87uKWzdZ/kZ18uEn9st9GpkCSsxL4MKPf3lfYbH+nM22\\nxZvw1ug1suruW/tW/a6n0n4/2D6q1lFpAyZChCM+7BYzZrOFJbubUOIZ28unyyXs+IMeAPrVGs2z\\nuO08eD/VajTPE27QQikagX/I72Hx+EujtHNItXf5Vd1KZjQC5Wbl9StWo17sFgtmi4Ulu4/l7Z/4\\n008vLlkeIubTKGYKtCYH+OhXjjm6MOp3Ua9WMlZrWJOkU0bzoeaqNCde1qE1yhv2YJiQy4rFbMZs\\nseL0hUltb5x1JhfPp+JbMFuseKKrrESNEt2qKHSu9Q4aHdV4hTUYJuyzY7GYMVssOFxBEs9eGB1K\\n8c2YLRYcviTbLzcJW02ASj5fNdZZDRRyX4zA3h7a5NXzFH6nFYvFzJLVSTC5zcvNEACd8hdKymX1\\ng5klq5vo6ioRkwloUVNaM667ef0jhLiCycySPUAgYPSNhidwaakaXb+ylsQFDCnRbM6/vWKeS+sZ\\ncU+MOjkQOO1HDRlcfmfODIv358R9+Zb9rqfRfj/YyNKyZJS2IVUyh1kqSgdtTi1r94Xxjq5ttUaV\\nut6kXjSC6/RqCiuTwb/erJMfDjARwu2+3gKGIVX2d7K05tb6Gs2GAoAtECPinfUzm7FaH+zP/+Cd\\ntDPkymMjLLpC7rB2xavaVAsNAJzxIMuhCC5A146pNsY7A1asPuNm7U4xw5d8lXZPn9nBuE4+Fd+K\\nBavdSL9Be3B5x3DWa23Ga/u1DIfZMkpHu0GHQtw2kz1MYtkYkOuXFFo6DNsq5b6RwpFYaOZSO0ck\\nScpmBjTKdfXK/GBasmLHyAOaPvvqm9U/QohFDE8UlLpR9hwxN44rrgdgvNx+RYU9q54R92jQo1FX\\nAVjyeHBeOxBfvD8n7su37Xc9hfb7wS7Lt/jjbESq7JV7dKoZdqoZAByeKKFYiFgogH003W5yuAm4\\nzTRbA6oNleVgAFSF4nCIxRokEPOi53Pk+kbwH7It0VKrANhCQbwLVhZm0zLPNvsc7pTR1Ay7X+y8\\n3PTPuLJHr2rkyiWPc2aHE10fjQibsFgkyL+OeDJJNZejun9INWAsyVRLGfL9AbZQmhjHZKrTVbeu\\nVMm3jAGfaNCLyWUjFsjwpa5TLVZJBk/vw7ETSS9TbhyhagqFA4XCgbFpTyAUJRKJEPIYi7Suk0/F\\nt6Kj9YzyZ1qaHsHsVXf559vdicfOl/ea8cfXCZd3qWg9KpldKhkAO75oiGgoTjBgn1rpMxhm+ONt\\n5q7+IDHidHoBlQFV2t11HL02Gkb6uZzz6lE7Tp8JyjDo9dG5vOEbnmj0Rps0mU3T73nT+kd8e7PK\\n+lXmleWzZeDi1s1LpyXPMuvpwGIrK8fKrcl0xbVXuFjP+Mbu0bi8/fi6zxXzy5/ZGmZ1Iz51ewZA\\naeeflHYmHztfTr94f07cl5v1u27iqbTfDziqtBPd/Ikft1aIeM7HbbtqieO9j/znjz3qZ0vwXfgi\\nxo1R/YJCezCgOVqS74j7cFs8+MLGn1ptqOioKEVjgb4n4L3GvTRmnOFnbKWNJUKd8iHZSvdGf52S\\n/zf/+Mc/+H2v+t3c4/GtOEJJVsIWhlQ5zisM+hWOD1TAw3Iqgm1my65TL+fRgCV3GJ8LwI4/5AOg\\nXy9Sa59fbfEs8+rXF6zFAzhGGWSodagVDvn87nc+5Vqjkd/r5FNxHaWdf/L27duJ//79uXxpeRno\\nGmrxCwclY+jMHfdx3a2VTPYwWz//yGY6xnmS9lBKOXY//pv3Uma/UwNOtBalgy+jvVrchH3TXcmb\\n1T9CiOs6USsUy63LZ1mHA056dY72j85ukfNLsPbdGWgKlaLCTbpTi/fnxH1ZvN9lxuya+zZXeirt\\n94OduTdYcIeX2QwvsznQ6bQVGsUcB6Umg26JfDVOIGEMqbp9YVyotCmjNHzolQFgJeI3AnGvPwq5\\nHP2CQjNspdYfYMJH0Hvdrr8ZX2qTdfV3vtQ1ijufqVkvrtuyYw+ZoAInzQ59vLNn78UNWYmk16hU\\n9mnkjvjY6qEwxJdeJeoyM+swk2G3SqlkVN++WOhs9NcejBIx1SkPW5QqClHX+aYdZnuAxHqAxDoM\\nem0UtUr+4JiGptE4LKHG3PgscJ18Km7f/FmfNKuJ6Z11F9ogZ8lFJPWMSOoZg5MOraZC8fiAsjqk\\nVTqmmghNbLR01VF44nZ0OsbmlWZCuBxgHbqwUkGjSrszIGSbNV7do6OMZuLttqnR/1mzPgCB9Bqx\\nmXuiXL/+EffjqqPwZpEN9b69i+k00DXalUM+7ZcpH3zE6fqVZd9kWTx495aDqXeyEt1a/eoZ9Iv1\\nzGXfVdyuqfKn63SbOXY/ZqnnP3Lo+pWt6GS/fZHj6Rbvz4l7s1C/y4rVYYIW6F0N41DDMWMreGZ7\\nGu33Aw7uB+i6GctpYTNbcHqCOD0uTP3f+dLQJ+6HNLk8BG1m2n2NwuEX6A+wWBO4Rx1wi8dHzJSn\\nOCyTPbTRBmz+MN6Fbua6yE5s/RnNd7tUNA1tahrPitfvg0qNfiNDsREh7X/AiyQeIZMjTHqlROOo\\niaKA2RonFfdinjOn2qoVaYwKfHX/37zdn76mfVxGSfqMXXZ1nYHFMhbouwjYXXiXBvzjQ44hGic6\\nYLlePhWL+5rzZG3BVV5sJnHdpLHWdXSL5SwINC858QadeJxmer/t0aTFnLhA3KFhr0L+2Njgzhb1\\n4bYY9X7EZibXH1DKl4n5p4+46ZZzZPujwd6ABzNccVo6hNd+ZCMx/yST69Y/QojFGRujRol8qZIb\\natTUDsu+q4ZbnCSfv2I1+HVh96x6RtwjiwVHIEokmEet6ahKCy1qv17wsnB/7va/vljQwv0uK3bn\\nEqBz0mjRHYQY376s11LOVvDY5gzyPYX2+8FGnMNuhc+/vT/b/ELXBwx0nW69RLlhzIQ5J1LOgy9m\\nVOpat2ccixT14z79Cy1eAjFjUyVVNSpuZ8B94xl1kz3Ms+dp5t2C5winSXmMz8t+eM9hqUlPHzAY\\n6Jz0VNS2RAdfx4wnniYxmqkLppP45tT2w5MahaNZu15fuI4S5VoPGFA//p0/Pp9ukKczGBhLditl\\nY1zPbHVgXbpJPhW3zR7a5M9v3vDmzRv+v5dJY/PMWo6Kcv0dkwG61V1+f79HsdaiN0p7Xe9RL5Vo\\nAiYCWB/wsOj3ZqDrdJUcnz+cnlPsIZEIGZ0As4/kesxI8/o+7z9laXQ0dN04QqmW+8yHXWN/FWdk\\nnahvusmLbv2ZN2/e8ObN//AiacwI1Y5LqJdmn8XrHyHE9Qx0DbVUojwaRXXapgvX2g9vRuX2V9YD\\nFqBD+bh8zdNRxj/zknpG3J/T/lTN6E9Z7NZrrppYvD8n7s91+l1uf+xsM+zMUZm2ZsRWXeWYL0d1\\nAJzxKP65Xe/vv/1+sH9Op16ioTVpjDa/uMjuS5MMTS7NcXsjWMmejb0EfJ6x0QsLHn8YCsXTqwle\\nORJ8OYtnmc2tDv/dmXEfsNlF6sULBp93ySkqub3/ktub8R62pYc7wvLQWYyOfadsIxWZf3vF6fF3\\n4Gb9p+lzq6FH4ePvfKnrNApV2iEntVyfzvB8g7xJdqLrMbxmaN8gn4q7Y/Gn2UqrvM80ye9/we3a\\n4uLPP28Zv7EcMESz2KCnDthXSlPXgJXAyjLBG634EYuat1TeZPWR3tyeKMPW4AovNwZ82ivSrWX4\\nUJsus67oM7bXps+4n2QmkNoi1XxPVi3w5cDDy83I/AHgBesf8bjM29BLNk27O5dtfGi2xokELitf\\nYysp1UMOsx62U9O3Y81ynXrmqu8qt3Pcjss3p/UQC00fLzwvHV3p1/yU0Bfuz4n70qF+jX6XxZNg\\nbUVh56iBkt/l9/xkeTQ7oqwkr9iI8ztvvx9scO9KvOZPngqVcpW60kTpGHdWuHwBApEIiYgP64V9\\nDyweH2FTjvxwgJkk/guldcntI0iJGsOxTdW+jiO8ylq9yU55+uB705KP1Vc/E6kVKZZr1KtNeoDN\\n6cPjCxCWXTq/mi24xsvgZVecH3/niC4TmZnmdiKJGNl6Dq2Vo6r+yrO//EKgWqBWUVEaRrqZHR4C\\n/hCReJSg0yg6N8mn4i6Z8SXXSdXfkVUrHBz68GzFsC2cBk4Sr3/FXS1TqdZpNBW6mrGzri8QIBJJ\\nEvFJmf3WHJ4QgVCYeCyEY6rFNuOKPuOXQJRKsUSpUkPpaDdLM4uH5HqKxh9HqOVdMj4vG9H5Df/V\\n9Y8Q4iZsTh+BcJxkYlaZn2Syh1ldr6N8LlPPHJD3vmT5BlNxl9cz4r6YHR6C/gjxVBzvdZtfS2Dh\\n/py4L9ftd5nxLb/kR0+B40JlIrZatM6A77v9Nr158+aPt2/fTjz45s2be/o64luSdH+aJN2fJkn3\\np+liug+Hd3R4sHhQTBd2fZby/jTMquf/9re/3dO3Ed/K27dv+etf/3r2bynvT8O8fp0sRBFCCCGE\\nEEIIIR45Ce6FEEIIIYQQQohHToJ7IYQQQgghhBDikZPgXgghhBBCCCGEeORki0ghhBDiiRjfdEkI\\n8f2TMv/9u7ixmnjaZu6WL4QQQgghhBBCiIdPdssXQgghhBBCCCG+E0v9fv++v4MQQgghhBBCCCFu\\n4DSmX7LZbPf8VYQQQgghhBBCCHETpzH9zA31Ttfsi+/bxb0WJN2fBkn3p0nS/WmSdH+aJN2fJkn3\\np0nS/Wmat2ee3HMvhBBCCCGEEEI8chLcCyGEEEIIIYQQj5wE90IIIYQQQgghxCMnwb0QQgghhBBC\\nCPHISXAvhBBCCCGEEEI8chLcCyGEEEIIIYQQj9zMo/AehgHdeol8qUK92qQHmB0evN4AsViMgMeK\\nGRiqx/z93REmQmz9aZuQbd7bqWT++55sa0B0689shK1Tl2i1ff75qQhAeONXtqL22e910qZcKFCq\\n1FA6GmDF5fPiC0aJRwI4lmDYr/D5X7vUGM78vNPvDbD2wxsSnpv9Sk/R+G83zmR14guEiSfjBJ1L\\nV14/bjwNTloVCoUi5bpCVxu9r9dHKBon7HfSOv4/3mdOrvyekq6343rprVHa+Y29io49tMkP2xGm\\nS/q0Rcr++ffwsP7TD8Rdk8/3Kzv8a6dydV0kvo7eo1bKUarUqak9ABweH75AlFg0hNtmZlY+6GQX\\nL7dxrldniNtwnma+9GtepLxzZx9Oy5rZlOb1/6ZwTzyr062XJ/oODk+IQChMPBbCYZl8L2WUL2a/\\n1/R3m+c69Y1Y1Pzf3ezwEPCHiMSjE+09nKfpRTanj0A4TjJh5IPhSZ0vv3+i2B/OyXMald137JR7\\nuOIveL0ewDL1ruKmxvvJF11WZs9MtQV2vKEAoUicaNA5I60Wiyvm5Z9Tl9cVYq4FYqdxfaVErlym\\nPuqLmx0egv4I0UQY/8WLAWhz/Mc7jloDLNZlXvy6gneqEVmsj3hZ3jw1L5Z8CB5ocD9AyX7gfaY5\\n+WhXpdFVadZ1Xv6yines5A6pcpxXCKz6ZnYIuuVjsq3BJZ/Zo1qsnP2rkS/TCqdwX3izYa/C7rtd\\nKtp4gmu0lSptpYpm/pWt2JxBAXGnhlqHRilDo1Qisf2KtdD106Fb2eW/O2W0i+9b7aBUe1h+eSGd\\ntwfiPL0LxLZ+4Fn4puVusbJ/TiWzn8XzMoVbenrflq6S+fCerDpZl3dVha6q0NJtvJ7TBojHo5k5\\nphZ+Qdgx40ldIXdYm/m64YnC0eddckp/4vGuWiWvVinkfKQ3t1n2P9Cuj1jYoKtS7apUCzmCqS02\\n074rA+9+R6GYUSiXo2y/3CBgD5BMBSju12bmOb2R46Dcw0SA5YQE9t/SVWVWa2TY2c2ijHfW6NGs\\nFmhWC+R9y2xur+A9e9n14wpxe64VO+kdigef2C91J95j0FWpdFUqhSzhtRdsJNwTbb2uVMmP4jxd\\nO6ZUS+B9oMH3XXuQLdywXeRgVABD6VesJjxYTUMGWhelVqQyCM4sgK3cEaXI9Iza8KROLlu/4jNr\\nFOvno8Mn7QzlRhx3cPwn0qnn9qloQyyuOBubKfwOC6ahTq+lUC00cAYksP+WzmbPhgNO+grHe/vk\\nlB6Fz1n8f9kgsDTn+ln0OrndChrgjW+yngrisJgY6D1aSo1iw4bPAdbUX3iTOn2RSubv78kOB7jS\\nr/kp5b2zv1XMS+8+pZ0sQf90ei9isbI/6UTNsPvFzsvNCDJB/+2opQOy6gATAVZerRNzWzExpN9T\\nqBeKEJof2PuuUW6H6vn/ywz9tzekznG+TmDGTKlaypDvzxqob5P7+JGcOgA8JDdWiYfcWBnS71Qp\\nHGXIKwpHHz5i/vEVifmjd5eSGfr7MfG7D3ROtBbFw32Oql1q2ffsLP3Ii8TkXOrEDKuu023m2N/L\\nonRLHGQDeDdCOCLLpIoNsq062WwV32ZolLZtCpkCGuBLLxOcNdAkbs34LOhA1+m3ihzuH1HrGmXW\\nMrZabtjO8+lDFhVY8sRZW0sSdFoxodGqFsgc5VCUYz59NPP6VQqn+WZxhczQ35brxE4alS8f2S/3\\nACuhlQ1Wol5sFhMDTR2V+SXcbvuFtl6nXs5PTMzVcmU64STOr/z2D3mGfp4HOcGhdVTagIkQ4YgP\\nu8WM2Wxhye4mlHjG9vK8AEoll52cdYUBzUKWYn/+0goY0KjkaQPWQJp01PhZqsUqk+P/HVpF433s\\nwTAhlxWL2YzZYsXpC5Pa3pCluPfFZGbJHmBlLYkLGFKi2bx6Ce64YadNcWikbyAcwWW1YDabWbI6\\n8YeX2d6QDt2DMSO9a5ND+AtatOxP65R3yZR7N/hMcTMaHbUDgDUYJuyzY7GYMVssOFxBEs9eSBD+\\nHWkXMpQurNAY9iscH6gzr++WMhypA8DNyutXrEa9Rt/BYsHhibL2fJuk2wyo5DLlK8u3eMDMFpbs\\nPpa3X7IRMYKCxkGB+mVNvsWCI5BmJWlUEv2SQksHzB6SK3GsQKf8hULDyHP9yjFH6gCzNUk6Mf8W\\nEXH7zBYLDl+S7ZebhK0mQCWfr2IMwfcoHmWMwN61zMuX60Q8p22BHW90lefbKVwYg/DZitFG3zyu\\nEF9v8dhJVwocjPpV0c0f2F4O4Djti4/K/M8/vyTpnZx8GXarlEoDwEoyPUr/Vo6actmK7e/Xg6yv\\nLEtGKg+pkjnMUlE6aPNvdZvQqx6eVc4Aw26F40zr0tcMTxpUckZTH4jEiAVjAPTrRWrt8SutWH0m\\nADrFDF/yVdo9naeZdR6oJSt2jDTSBpcN6Mx+7Wn1XszsUay16OmSug/aWHoPr5nccJ2yP1tpd4e8\\nKnnk27BgtRlp3a9lOMyWUToa1y3m4rFokcuOB+EDGvmjOfdAajQbCgA2f4zI9I2WYPGQSAaNq+sV\\nmt3pS8RjYyeSTFxrQN9mMwYDhmicjPqVFn+SlbAF0ChmCrTHbv0IryVlqfY9MdnDJJaNefPTwZhh\\nX6VRN9pcXzw289Y4izdOImw80aw06PN1cYX4WovHTq2mMUFrJkl05q21dpzO6URv1Yo0GGKxxgmn\\ngoTdo713ynWeYjI/yGX5Fn+cjUiVvXKPTjXDTjUDgMMTJRQLEQsFsF9IWxMhEskBuVydwmGO4A8p\\n3Gadej5LgyG+dBpX9pj8cDo79WolysMhJqKE/Fas5iBJW5Fcv0WpohB1nS71tBNJL1NuHKFqCoUD\\nhcKBsbFXIBQlEokQ8kzP7ZZ2/klp5/Z/JzHDiUZv1PkzmaafPnj3loMLj50uyzU5wqTTJd5nmvSU\\nEvtKCQCbM0AoGiYSieCWqfuH5Yr0vsriZX9SenOLzuEuFU3l6NMeth+2kEnju2bGH18nXN6lovWo\\nZHapZADs+KIhoqE4wYD91u+LvazOEHfDnkgSrBbI1/fJVIJshK0M20WyuR4mQqTSkMlUx17Ro1c1\\n6oElr3PurTJWhwsrFTQUtOst7Dr/pOou/3y7O/GYbKJ5f0wOFz6TmfZwgNLpwSW3UwH0+6errUyY\\nz9oMK5HlNMXKAap6yP4HD2p/gNWzSvKRLcf93jidXkBlQJV2dx3vsHc2wOd1zbsN1orTtQQVnRNF\\nQwNsN4grBsMMf7zNTL273Kp1XYvGThq9jlExW0MuHItOPw8UqnljNsaTDODGjSXu52ivRq9Uor4c\\nmr1/y4JmxXAP/fasBzlzD3aimz/x49YKEc95inTVEsd7H/nPH3vUZ6yp88RSpNxmTtoZcuUeulog\\nU+hhtsZZjvvndPraVAsN41OjAWPzDbMHX2R019VxGWWsE2DxLPPq1xesxQM4Rqk61DrUCod8fvc7\\nn3Itmcm/D8MBJ706R/tHZ0uv/DMGWi5nxpd6yS8v1okFnWeFtt+pkz/c5d3v7ylcuimj+GZO0/sg\\nN0rvKEHfddP7emV/nMUR5tnzNB5goFXIZMr0brJ0QFyLyR5m6+cf2UzHOG8aeiilHLsf/837vSo3\\nuTlDPCyWpSDJVWOWvXKQo6lrlI+Npbj+teWv6qiJJ0rX6dYzHBwat3XYQoGJwXqTK0YqaQSLqqoC\\nVmLp+FffryseipvFFeJ23GXspDUq5PrGLVlBv7HSw+4N4sfEkDql2uWrt79HD3Lm3mDBHV5mM7zM\\n5kCn01ZoFHMclJoMuiXy1TiBC5unnN47VfyQo5rZQ7MrtIHoWgr/Uo/mjE8Z310xHD7dvMeMP5zA\\ndXxAmxLlWorA2NFYZnuAxHqAxDoMem0UtUr+4JiGptE4LKHG3IzP6Vx1FJ64uVmzamAlurU6cxbl\\n6hFXM45AnGeBOM+GA7odBbVS4PC4jqYp5EsKEbfsmntf5qd36tqb6d2k7I+zeJbZfKby236NTnmX\\nz42HOob7nVlyEUk9I5J6xuCkQ6upUDw+oKwOaZWOqSZCU5uqfg2ZpbkftvAK6+U6X+o5jj616Co6\\nS6406Zgbc+3iMh079pAJKnDS7NDHO3P2Xuu20QATPqw37P089Bmbp2bYbaOMVmT6nJN19byZV7M1\\nzOrqxTQ040+sEMwZx1/ZQ6vE/Q90/usJ6XSMnruZEC4HoNsJYqLGkGa7R8Izq33W6LSNkfkln3Us\\nna8XV8iGerfr6thpHbtzCdDRqm26A7BeWQTPTzuy+WMER22/yREiGj2gUdJRc1WacfeMY/EW8xg3\\n1Hugwf0AXTdjOY2gzBacniBOjwtT/3e+NHS0OfdCW/xJ1iJVdsoKisbYsqpZG19N7q6Y/fD/yM64\\nqlGo0omOdlzUdQYWy9mSB7PdRcDuwrs04B8fchP3cYn74CT5/BWrwZsVRF0fYLGMUtdkxuEK4HD5\\nWBr+i4+5E4baCQOQ4P4BmH3O/aJuUPZncMTW2Gi22Sv30DSZM75zuo5usZyVP/OSE2/Qicdppvfb\\nHk1azLjzSjxKo6Wc9SOaigJYWU7HcZuZsRmeFa/fB5Ua/UaGYiNC+mJgpqvkc8Z91NZAGK/M/n8H\\nepRz+bPVW17v1e2AxRln+9U6/hldBJPNjstkojYcYnHZZQDnng17FfLHxqyrLerDbQGTxYM/YKZW\\n16lnCjTD08fX6c0C+YrREfeG/aOBvpvHFeIWLBg7+b0RrGTRyFEox/FOHS2u0etZsNuNdxo/7ajf\\n2Odfb/enP1o7ptpI4r3ilp3vyYP8S4fdCp//W8axHCcW9GNfMhnHHTVLlBtGIjptc++qI5RK4S/v\\n02Dp0mVVw3aJ49LVkbix42Icpw/qx79z2I2SiofwuW1YTCYGeodq2Rg5MlsdxozADe/nE9dzPqvW\\no/Dxd77UO5SPy0SDNzj+YqCQ/c8+/ViKWMiP22bBxJCTXpVy2cgnSw6bBPb36DqzqMPhAF3Xp+89\\nMlkwd69b9ucN+dqJrm/R606fvS5uX7e6y4fyEsuJOH6fA6vJxHCooZRKNAETgRvPyIqHx+JOkEoW\\n+ZjrYQukiV/SOXNE06wUGxypGtkP7xnMOgqvNTomLz3rCMsBun6CzsVVAZbzgEA8DBNH4RkTN/61\\n+NTqrfGZ12G3xMff9ml0CuQrUfwXV36KB2PiKDxtCHhIJEKjvped2Eqacv0AVcvx6cNg5lF4bWDJ\\nkyYVHm2g+FVxhfg6g4VjJ4svzlqkzE65R2X/HcOT8aPw2lTzh+znh6y+fkHSa6Kaz7DA3sdUi1WS\\nwdhEvX9pH/GW/vL78iC7QZ16iYbWpDHadOEiuy9NcuYuigaTI0x6rY6pG75kWdX5EVgmojyfcSY6\\nusLBfz6S7xs7LsbdZmq5Pp3h+WYcF74Z0fUYXjMz9/MVd8lObP0ZzXe7VNRDDrMetlPTx9fMXtZt\\nLLtZs9TI9btwtlHXJLMjSjo2/xxt8bD0a/v89o/pUdzo1q+E2tcs+77Q/HS3eEhtbdB9t0tFk5J/\\ndzrUiw166uBss8tJVgIrt38e9WV1xmNbqvf4mPEn1oi1y7hmBuTjXCRfvODk8y45RSW3919ye5NX\\nmKw+0pvbM8+4HwyPef+P4+l3Tb/mp9R5ppq1oR7IEt67Nu93ByvB1BabVwTrJkeU9S2F/+6UqR98\\nIe95RcIjrflDMW/j6dMyO36rlcmV4PnLE3Z2syhqgd13hanX2X3LbG4bZ9zDzeKKebd1yAaa16Qr\\nC8dOYCW8/gLd9In9Upfq0UeqU3cwW2m1egys7dHxd+Bf/ZGXyek6oFv8xG/7tdEJSLGJfDS/j/hn\\nno3dWz0vbz7kjXUfZHDvSrzmT54KlXKVutJE6WiAFZcvQCASIRHxYb10Z2wznsQ2Ly65YvwILN/q\\n9IgvABYf8ZSf/P7pjosvePaXXwhUC9QqKkqjSQ8wOzwE/CEi8egNlgeL22Kyh1ldr6N8LlPPHJD3\\nvmTZt3h6WAJr/OUXP9VijUqzgaIaMwIOT4hAKEw8FsIhMziP3lBXblD2Q4Quec/xvCeLdu6Kk8Tr\\nX3FXy1SqdRpNha52entGgEgkSeTamyqKh85kC/LsZXCxa5d8rL76mVi9TL5UoV412mipw78/N+l3\\nOcKrrNWb7JRVsvtZ3K9X5Ji7B+qqMmv1p3n1S5RaKUepUqem9gA73lCAUCRONOicWGX59XGFuDFL\\n4Hqxk8VJbOMXApESuXKZet1o680OD0F/hGgijN+xhJr7QgPjtKNEdPbgniOcIJFtkO+3KJUVoqtP\\nY4tM05s3b/54+/btxINv3ry5p68jviVJ96dJ0v1pknR/miTdnyZJ96dJ0v1pknR/mualu6xJEkII\\nIYQQQgghHjkJ7oUQQgghhBBCiEdOgnshhBBCCCGEEOKRk+BeCCGEEEIIIYR45CS4F0IIIYQQQggh\\nHrmZu+ULIYQQQgghhBDi4ZPd8oUQQgghhBBCiO/EUr/fv+/vIIQQQgghhBBCiBs4jemXbDbbPX8V\\nIYQQQgghhBBC3MRpTL8068nTNfvi+3ZxrwVJ96dB0v1pknR/miTdnyZJ96dJ0v1pknR/mubtmSf3\\n3AshhBBCCCGEEI+cBPdCCCGEEEIIIcQjJ8G9EEIIIYQQQgjxyElwL4QQQgghhBBCPHIS3AshhBBC\\nCCGEEI+cBPdCCCGEEEIIIcQjN/MovMegr5TIlcvU6wpdDcwOD0F/hGgijN9h/FlD9Zi/vzsCYO2H\\nNyQ8F96jssO/diqYCLH1p21CtgvPqxVKxSLl0WfYnD4CgQiRZBSvdfLa8c8aZ7I68QXCxJNxgs5H\\n+3M/KsN+hc//2qWGi7UfXpPwzBvD0ijt/MZeRceVfs1PKQvH795xpA6whzb5YTvCZDIPUI8/8O6o\\nidWzyqsfkjjv/s8Rl7hYRs0OD15vgFgsRshznnpK9v94nznBbErz+n9TuBnPJ8O57x/deo5td4fs\\ncHDp9xh/X3G7hppCKVehUq+hdDTAjjcUIBJNEg7YsUxcrdOtl8mXKtSrTXqAwxMiEAoTj4VwTF58\\nli8usjl9BMJxkonJ18y7/pTkg8Wdtr8Xjf+GV7XRp+kxXl/PSyOjLQ4QiSSJ+KxTz599r2vWKfM8\\n5bwwrz8Es8vWeF0c3fozG+H56WO4WTmf3W6f9wO+Nh8t1qYs8vd9Xy77XU777vFUfKxffZ4m88zu\\no4FW2+efn4oAhDd+ZStqn//F9A6VYoFKtU5N7QFWXL4AkViUSMiL1WRcNqv/MPaJM/OPuEDvUSvl\\nKFVOf2tweHz4AlFi0RAualeWHZhO97uM0y6rx07Nii0fgscXbeodigef2C91Jx4edFUqXZVKIUt4\\n7QUbCTemW/6Mfkeh2FEo5rIkNl6wEnVeufRhqHVolDI0SgViWz/wLHxJRSNuWYtctkzoRQzbjGf1\\nRo6jicbDRTwdJ/8hR696SKERIu0/T+Fht0LmSAWsxNJxCezv0yX1QKOr0ihlcEe3eb4Rmpn24jEY\\n0C4d8GmvSG/i8R7NaoFmtUAuuMr2ZhKXBYYnCkefd8kp/Ymru2qVvFqlkPOR3txm2X91s9fvKBQz\\nCuVylO2XGwSk2n70jLa4Q6OUIxd9xvZabDIIlDrlmzgtW9V6mpcvU7gtV79m3NeUc0095DDrYTvl\\nvfGy1SvzkbiW0757rdpk84ctQl9V1/aoFs8HDBv5Mq1wCveMxNYaGXZ2syjaxKO0lRKHSoljT5yt\\nrXX8Uvd/PV0l8+E9WXVykqSrKnRVhZZu43Xiuu95F3FaicT2K9a+LhM+CI8suNeofPnIftkYYQut\\nbLAS9WKzmBhoKsXDfY6qS7jddsxwxfjPPDq1o4/sly58hhlO+k3KmQOOql3ye+8ZWH7iWWh6jO5s\\nJGc44KSvcLy3T07pU9rJEvRvEHhkv/pj1q9nKNRCrAQv/uhtCpkC2oVHLf4kK+EiexWNQiZH2JvC\\naQbQqeezNBhiD60S98sdLfdnTj1gNjEYdKgfH3GY7+INuBfuhF86mxL+H9Kj/71qNZC4Pf3qPh/2\\nymiAI5hmfSWGx27BNNRoFg/ZP6zicHuwWwDa5D5+JKcOAA/JjVXiITdWhvQ7VQpHGfKKwtGHj5h/\\nfEXiQm9vYkZG1+k2c+zvZVG6JQ6yAbwboYkVAk95Vva22MJbvAlvnf173kz+TU2k0XDAyclp3dCg\\nXdrns9nG6/XAKF1vXqdIXrjceD050DXalUM+7ZfR1AzFRmxmH2q+ryvnAPXMZw4ci0+0XC8fnXuK\\nM/SLmPhdRnXt7scsqlYhV0kSWp4sSdeZDR+2axTr5xM2J+0M5UYc94X+n9465tOHLCqw5ImztpYk\\n6LRiQqdTz3F4kENzeHDKKN6tUEsHZNUBJgKsvFon5rZiYki/p1AvFCHkw2yD52/CZ6+5fNXWXcVp\\nPQqfs/j/Mh2nPbb+3qOKUHSlwEHZmMOJbv7A9nIAh9WC2Wxmye5jefslP//8kqT35tGzruTYL8z4\\nDIsFmzPA8vZLNsIWjM5AnuZlq3VNZpbsAVbWkriAISVqysVwUtwtjWKmQOtCOvUrxxypsxLPSiS9\\nhh8TJ2qG7Ci/6WqBTKFnVE4rsuzqPs2tByxmlqxuImsv+fnPP30Xo69P1kAhf1BFw+jcvXqewu+0\\nYjGbMVvs+JPbvPr5Z7ZSXixAt5QZlWc3K69fsRr1YreYMVssODxR1p5vk3SbAZVcpkz/ss+2WHAE\\n0qwkjZa8X1JozV8dKh4D02nd8JyttBeAdiFDuW08LXXKt2G2WHEHAnhG6yqH15yBuZ1yrlHaOaTa\\nm/nk5a7IR+KaLBYcgQB+kxGKDK64/e1yAxqVPG3AGkiTjhrvWS1WL+SDHuXMsRHYu5Z5+XKdiMeO\\nxWI28md4lRevfuLlRgTbjZf/inMaHbUDgDUYJuw7/a0tOFxBEs9eXDtovus4rdmcf7vVY/GogvtW\\n05jFMZMkOrORteN0ft36qEU+I5JYxgro2jGNS3PNyJIV+w0bM/H1TtoZcuWxllxXyB3W5l5vcoRZ\\nThujx7VMjobWo5w9pg1408sEHXf8hcWlTsuoxbo8p4zCklXWST5mw7ZKuW/UrZHY7GXQdqfzbNa1\\n2VAAsPljRLwzmjWLh0QyaFxdr9DsTl9ykc1m5K0hGicS3H8nzPgSy8RMJqBFTWkBUqd8OwN6Sh2V\\nIeDB7bzOMPntlfMhVfZ3sl8xaDc7H4nr0xSFxnAAWAm4bn6z4/CkQSVnhPGBSIxYMAZAv16kNjb4\\nMuyrNOpG2+KLx2beFmJ2uiSwvzUWrKMfs1/LcJgto3Q0Bl8RC911nKZ9zZd7IB7RAnGNXscYTbGG\\nXDiuOSxx8O4tB7f1GXYnXkxUGdI/0blyjOREoze6ScAkFcY3FU8mqeZyVPcPqQaMpT1qKUO+P8AW\\nShPjmEz1YsE3442niBU/UewXOPrUoq/qmK1xUvGb36snbsN5GV3yOmeX0YGOPgQwYbFIaj1GWq+N\\nBpgI4XJelYY9elWjfl3yOufeimF1uLBSQUNBW2Bgvt8/HRA0Yb5Qbw+GGf54m5l6zWNbuvckWZy4\\nfGZo6HRbPTRsX1WnSF643Oy+l5XYsw2iruu809eXc7NpmWebfQ53jNsCdr/Yebnpv86XODeVj9wT\\nHerSzj8p7Uy+RDZcm/27APiXt1ieun0SetVd/vl2d+KxWUu1e7US5eEQE1FCfitWc5CkrUiu36JU\\nUYi6fEbfrd8727TN67reSpx5ZV1cxow/vk64vEtF61HJ7FLJANjxRUNEQ3GCUxvjXuZ+4rRZ9Zix\\nEbd34W/+LT2i4P4ROr2X4yBHGzARJXjJLr3i9jlCSVb6RfYqVY7zCoGExvGBCnhYTkUwH+dmvs60\\nFCCZClDcr9FSVQDC6SQ+KTEPXr+2z792Kte6F1Y6YuLM6D7Qg0Oj3NtCAdySCe6Fyfwwfvib1Cni\\nMhqNSommf/Ubb1hmxhl+xla3x/tMk075kGxgGxmDuX/NaoFq2EPUdZMB+TbVQgMAezSAcWeuB1/E\\nSu64R/u4jJL0yX5X98RkD7P1s5NAoUChXETtAvRQSjmUUg53dJsXG6H76Wudxmn7R6M4LYTf8zDa\\nna/xiLK6FbtzCdDRqm26A7Beow647Ci8a39Gr0NzNMJjW5oeb5o3Uh3dSknl8s0Z99BXKvs0ckd8\\nbPVQGOJLrxJ1mbls+yZHZJlUsUG2NWDJlSYZkfst79/X1QPicbDaT2ffqrQ7A0K2yxLZjj1kggqc\\nNDv08c6c1dO6p6sBfFgv1MPzZmTM1jCrq9MDPBLkfRtLVuOXH9KkrwEXNlXStRssn9Q7tBVjtZbD\\nbcf6lXWK5IXLTfS9TjvSO5/JKTn2vjj44UVswU7915dzgxlfapN19Xe+1DWKO5+pWW+wPn8qH01u\\n4iwb6s02+bsMONE6VA8/sV+ucvDBgePXFcbvuFhkkF1XquRHGyuFw6ebG5rxhxO4jg9oU6JcSxGI\\n2sFmJ4iJGkOa7R4Jz+L9uquOwhOXWHIRST0jknrG4KRDq6lQPD6grA5plY6pJkLEF1rJc9dx2urU\\nkavw+FZiPapusdtrFPABOQrlWbuhaPR6X7MhxyKf0aOcPz67P88/676vMSarE380zfOff5Zj8O6J\\nyREmveIBVBRFW3x5vdmO3WGsz7E47FwaX4hv5uoyen3RrT/z5s2bif9+lVn7e2NyeYiMClwpP3tj\\nLK3bw6jtrXj9PgD6jQzFxow2QFfJ54x9NqyBMN4F9s2wOOM8/+lrj2YSc+k64ynV76nT14w64qCh\\nti+U9UGLZm20TNtlX7CsDlDyxxSHQ8BN0Gd00++iThEzjDavisWMpfBaXaG98B7Dt1nO7cTWnxG2\\nGnlLu/Y+x7PzkbguY4PCaDQKgK6VaHWu+x469XL+7OSj7If/x9u3b3n79i1///2A09vtG4UqHcBk\\n8+APGG1LPVOgOSMmH/Z6l2+6Kq5H1xn/mc1LTrzBOBubzzAWtbe4zl6Ktx2nGZwkn//03cRpjypc\\nsfjirI1mTyv77/h8XKer6QwGA056KsWDz/z73+/JfcVOhxZfkmfxGZ+h6/Q7dY4/fxiN0FkJryeY\\nlWfWfjgPEP73zz/zciNF0ClT9vfHjCeeJjEKFoKyvP5Ru7Qe0Do0WwvsliYeNrOPxJqxTK9f3+f9\\npyyNjoY+GDDQezRLB3z67d98zjbRAUc0zYrHDGhkP7znsNSkpw8Y6DpdtcTBp8/kWqPjs9KRmceZ\\n/XhaZ/+ygR8TeqdAviIbZd0JXSXz4T98yY/SqVenUjW657aYm9OYzGTzEQyPdr0++kJO6Rl5QGtT\\nPsqQ6xtpGg1ecd/jcMCJ1qJ88ImdTBMAVzxNZDRTJHXKNzIccNKrUywaS6hNJjvWC6MyQ/0EXden\\n/hvw9eV8nMke5tnz9PWW5F+Rj8R1Gb9nqVQCwIQX2zX7ZsN2iePS1bPmJ60cNWUA2Imkl/EAAy3H\\npw9fKKs9dH1gHNVYP+bju9/4sFum//j3VXsQutVdfn+/R7HWoqcb9aqu96iXSjQBE4E5q2xmu904\\n7VfWAxagQ/m4zLXHlh6oRxbiWAmvv0A3fWK/1KV69JHq0fQ1rVaPgXeJm+1dZyG48oJng8s+w05i\\n4wUr1zqfVdwri4/keoxO2UZKltc/covUA2BxL11jkxbx0NhCz3i5YebTXpFuLcOH2vSyeUdLpad7\\ncVlcJF+84OTzLjlFJbf3X3J7k9earD7Sm9szz76euM4RZX1L4b87ZeoHX8h7XpHwLLaJ2uwzecVF\\nailDVu2D+l9KE2sjPcSjvrFyayWysonS+ky5W+fw/b85nHgnK8GV1Zkbs122+ZUr+oztlcDE59y0\\nTpG8cLnLNjP2rYZwM7mcvbz/H8r7k9ed/5a3V84BLJ5lNrc6/HenzLzJ++vlo3PzNo57yJtwfQvz\\nfhcAZzw6tQfDrA314HSJfBJtdPydiSjPZ5xPjq5w8J+P5PsapXKduC+Exb3M85cDdnazKGqB3XeF\\nqfdf6qp0+hFs0l38Sh3qxQY9dcC+UprxvJXAynVPobrNOM1YxdN8t0tFPeQw62E7Nb2yd1499lBv\\nv3lkwT1gcRLb+IVApESuXKZeV+hqYHZ4CPojRBNh/A7jz7rxoNvpZ8QqlIpFyqPPsDl9BAIRIsko\\n3oeXluIKtuAaL4P3/S3ErbikHvB6vUSuvQOreHjMuKLP+CUQppSrUKnXUDoaYMcbChCJJgmPpbFp\\nycfqq5+J1cvkSxXq1SY9wOEJEQiFicdCOBbMEI7wKmv1Jjtllex+FvfrFbySmW6NJ/GSP7kKZPMF\\narUOGna8oRCJ9DKhC6cjmOxBNn/8iUA+T7FyIQ/EU8QW3KTWZHXiCwSIRJJEZr1G6pRv5PppN+42\\nyzmMl/XFbse4Mh+Ja7Li8gWIJJLEgs5rla/hSf3s+Dvfanz2nlYWH/GUn/x+jV6pRH05RNgBVn+a\\nV7+EqRQLVKp1amrv/LvEokRCXqxyutUtcJJ4/SvuaplKtU6jadSrX12ObjFOM9nDrK7XUT6XqWcO\\nyHtfsvzIl/ea3rx588fbt28nHnzz5s09fR3xLUm6P02S7k+TpPvTJOn+NEm6P02S7k+TpPvTNC/d\\nH9U990IIIYQQQgghhJgmwb0QQgghhBBCCPHISXAvhBBCCCGEEEI8chLcCyGEEEIIIYQQj5wE90II\\nIYQQQgghxCM3c7d8IYQQQgghhBBCPHyyW74QQgghhBBCCPGdWOr3+/f9HYQQQgghhBBCCHEDpzH9\\nks1mu+evIoQQQgghhBBCiJs4jemXZj15umZffN8u7rUg6f40SLo/TZLuT5Ok+9Mk6f40Sbo/TZLu\\nT9O8PfPknnshhBBCCCGEEOKRk+BeCCGEEEIIIYR45CS4F0IIIYQQQgghHjkJ7oUQQgghhBBCiEdO\\ngnshhBBCCCGEEOKRk+BeCCGEEEIIIYR45GYehfcYDPsVPv9rlxpDolt/ZiNsnXxePebv744AWPvh\\nDQnP9HtotX3++akIQHjjV7ai9unPufR9VDJ/f092OLj0u5pNaV7/bwr34n/ek6dk/837TA8zSV7+\\nzyreiWEolcy/3pPtD3DEX/DjegDL2LPDdp4/fj+gg4/NX14Rdpw+o9Otl8mXKtSrTXqAwxMiEAoT\\nj4VwjL8JoGT/j/eZk6nvZnP6CITjJBPjr9Eo7fzGXkXHHtrkh+0I5zlygJL9wPtME/Cw+voFSe+j\\nLXoPxPnv7Yq/4PWFPDBeNl3p1/yU8nJ5Gk2+Jrr1Z9Ic8K+dypXfZFb9I77eSatCoVCkXFfoamCy\\nOvF5fYSiccJ+JxbTzdqBea+ZV95PmU1ptjbbfNqpXvndJU/cnqvS5dTF9vmm7ftVeUrcrUXK4az+\\n1CLpDcBJm3KhQKlSQ+logBWXz4svGCUeCWBu7Ei9f6cGdOuliX6Y2eHB6w0Qi8UIeKyYWawPf9Fp\\n368NuJdf8XrFNzWDeV6+l1h+/jMrwcm+2MXPjdvO64PLzO5TPHXnfa6LHJ4QgXCc5bgPq8l4bLzu\\nnWd2udOp7P2LnZKOiQCbv7wY6/dPG2oKpVyFSv20DrDjDQWIRJOEA/ZRX3Lx/uJ5H/PheMIz9z2q\\nxfMKvJEv07o8RhffkNcfwwoMyNFoTibMsK1S6xuP9QsK7Qvp1lIqtAGrP4x3VMCHJwqH7//Dbx+/\\nUBg1KABdtUr+8DP/+e09x42rO5AA/Y5CMfOZ3//Yo967+vpuZZ+dTBOwEtvaksD+lrULexxWFkgI\\n8Wh0K7v8548dMiUjsAcYah0a1QJfPh4uVO7EUybt+9OyWHoPexV2/vMHu5niqFMPoNFWquQPPpKp\\nSsVyt4yJjov9sEFXpVHKsPspR2s6Dlz4vRuVPO3Rv9rHBer9y67XyO9/QZL8fnTVKvmD97z7kP2K\\nNDcMu1VKJaPAD6lTrDSZXd0PaJf2+e2f79nPjdcBPZrVAvsf/80fn3K0v/L7PARPNsoYtmsU6+cp\\neNLOUG7EcQev85N4SP/v/5A+fc8bjDSK2UwuDxGbmVx/QF1tkfafj4qdBu9wGvyn8fpPx6naKGXj\\nWWfAjW30WO7jR3LqAPCQ3FglHnJjZUi/U6VwlCGvKBx9+Ij5x1ck3JNjXhMzBbpOt5ljfy+L0i1x\\nkA3g3QhdmDU+p6vH7O6U0bASe/aKtfCc2QTxFTSKOzs47a9IeG5vvNIW3uJNeOvsMy4fxRW3Rq+T\\n262gAd74JuupIA6LiYHeo6XUKDZs+C4Zlf9aV620ehM+/T/JE9+CL/UX3qRO/7XYbMnttO/iPl1n\\nxeNi6a1Tz+1T0YZYXHE2NlP4HRZMQ51eS6FaaOAM2LHZpN6/K8N2kYNME4BQ+hWrCQ9W05CB1kWp\\nFakMgnjndaaueu+TBpXceTQ/pEqx0iKUnJ+DBlqF/R0n9pcp3HM+12QL8/y80qdfMVZ2mAix9adt\\nQrabfd+nZrz8DHSNdjXDzl6RnpLhqBjg5YV0us7KmFatSGNstr+ZKaHEvQQuVPf96j4f9spogCOY\\nZn0lhsduwTTUaBYP2T+s4nB7sN8wDz4kT3Tm/nyEzxpIk44aP0O1WOXSgT7x7Zg9+MJGunQLCq2z\\nJ86D91N19fzZYbdFvTUA3AR9RmXRLWU4Uo3HVl6/YjXqxW4xY7ZYcHiirD3fJuk2Ayq5TPnyPGCx\\n4AikWUkaIzf9kjJ31FFXj/n06QgVCKS3WYs5n2qB+wZUsvtfPwIs7t+w06Y4NBrqQDiCy2rBbDaz\\nZHXiDy+zvSEdbHEZad+flkXTu0OraNQr9mCYkMuKxWzGbLHi9IVJbW9IoHbHtI5KGzARIhzxGf0w\\ns4Ulu5tQ4hnbyzdf2tyrlSgPh5itSdIpo++n5qo0r1ixc6JmOMzNm+kVd8FsseKJrrISNaLoVkWh\\nc9M3GyhU80ZMEEqniZhMDClRrvWmrssfVNEwBhpePU/hd57WAXb8yW1e/fwzWynv3Mm6x+RJxhrj\\nI3yBSIxYMAZAv16k1r7sleLbMeP1RwHQtRrqKF2GbYVKa4CJKKurIWAy+O8pFZqAxRrE4wLQaDYU\\nAGz+GBHvjCxv8ZBIBgHQ6hWa3au/nc1mzMAP0TiZEVAOehX2P2VQNHBGNnmW8j7NwvYNnbSP2f1y\\nxeCMePiWrJx28YqZPYq1Fj1dul5iMdK+Py2Lp7cVq8+4ubdTzPAlX6Xd0yWo+4YsS8boyZAqmcMs\\nFaWDdisD8m2qhQYAzniQ5VAEF6Brx1QXuN1SyX7mQG7t+8YsWO1GeRy0Bzcuh1qjQq4/MAaMonFC\\nMaOn3ShUJwYMhm2V8uh23kgsxKxxPLvT+V0E9vCdLMsv7fyT0s7i15+O8JmIEvJbsZqDJG1Fcv0W\\npYpC1DW9CYf49iweHzFTnuKwRU1pEXe56al12oA95CMcHNI4rNHQaqjtFG6XRlNRAXDEfaPlfD16\\nVWO0fsnrnFmgAawOF1YqaChoC9x63++fNgQmzKbJ53S9ztFOlYo2BDwklyNzP1d8PVtonRVXhd1M\\nk055l32Hne2U6eoXigfJ5AiTTpd4n2nSU0rsKyUAbM4AoWiYSCSCe8bU/XXbAfF9kvb9+zAYZvjj\\nbWbq8Yu3PC6e3nYi6WXKjSNUTaFwoFA4MDbqDISiRCIRQh5ZE3SXLP44G5Eqe+UenWqGnaqRvg5P\\nlFAsRCwUuNGSaF2pkh+t2IwGvZhcNmKBDF/qOtVilWQwNrMPFlnfxF7eJ6ue39oX/6q/UCxOR+sZ\\nfXPT0vRM86z2fPrWmPO9NuzRMH7bEoQSWAtZtFaOmhLH6TPeWeu10TBWjbic12sBetVd/vl291qv\\nuW9PsI07H+GzRwN4lzCWgEeM7NI+LqMstq+auGsWL4HRKFyn3qJPj0bVCN59IT82h4+g3wwYwf+w\\nr1CrDAArIe8dnU2g63TrGQ4Oje9hCwWmAo2TRoWKenr/j0ruWGaT75IJC/7UJhsRYzVFPXNIQZ1V\\niM0sfRfDmd87M77US355sU4s6DxryPudOvnDXd79/p7CHe6OZgQVb3l74b+8emcfKW6NtO9Py/XS\\n2+JZ5tWvL1iLB3CMKpah1qFWOOTzu9/5lGvJTP6dshPd/Ikft1aIeM43TumqJY73PvKfP/au2ARv\\nFp16OY8GLLnD+FzG5/hDPuDyFTumJT+prQ3CVhOgkj3IMbPrIG7VQNdQi184KBnLNtxxHzfZjWp8\\nr41A0IcFY1IwYjMDGqVynad6p+Z30dW96gikcecjfBAOnx6fZcYfTuA6PqBNiXItRWDeMSriG7Lg\\n8YehUERr1GjUTdQaxvKbgNdIb3/IA40GnXoL1d6ixhAzEbxnG6vZsYdMUIGTZoc+3pkjuFr3dFTP\\nh/VCqZg3g2C2hlldnX3/r9kaJh7uk8uPzybL0vy7Yye6vkFb+Ui+r3L0aY+lqSMqLVhGZ66cNHuc\\nwGTa6SdoVxx3I74VM45AnGeBOM+GA7odBbVS4PC4jqYp5EsKEXdgojxdpx0Q3ydp378fi2yod5P0\\nNtsDJNYDJNZh0GujqFXyB8c0NI3GYQk15sb3vazNfZAsuMPLbIaX2RzodNoKjWKOg1KTQbdEvhon\\nkFh8cmZ8p3RfLIRz9Lg9GCViqlMeXr5ix2QP82yzhfIhh6Zm+LwnqzfuwrzZ7yVPmtWE0Tce731d\\nvaHe+V4bZpKE/KOOu9lHKOEid6jSK5WoL4cIO8BqP12dW6XdGRCyLd4bv+oovIfouwjuF3c+wgeQ\\n/fD/yM64qlGo0okmzyoJcX+W3D6ClKhRJ3vQoccQW8CPZxSh2z0BXDRoN0oc6sbUmj0Z4HzDeyte\\nvw8qNfqNDMVGhLT/QqHWVfK5mnF14Pz4vMtYnHG2X63jn1H3mKw+Vp5vkPBoOE/es1fuUc8ckPe9\\nZnnWPf/idlh8pLdTqO+OUDXtrJyPczj8QIWBptLugnMsrfWWSm04BKy47NLA3yddH2CxjMqKyYzD\\nFcDh8rE0/BcfcycMtRMG3M3Ss+vs0i0eEmnfn5YbpLeuM7BYzuoNs91FwO7CuzTgHx9y53voSHB/\\nRwbouhnL6e9rtuD0BHF6XJj6v/OloaNdc3+V8Z3Sq/v/5u3+9DXt4zJK0je1e/opiz/NVlrlfaaJ\\nps3qOYi7YAuu8mIziesG5W18r40BOf77/3LT11CnVGsRTronTuAq5cvE/NO3amjdHhaH/buYhPse\\n/oaFDdsljktXL9I4aeWoKdMVjH5ygq7rF/57mKM23wuTzUdwtGt+r2vc5+4N+c8KpcnlIzza6V4d\\nLZsNel0TGdsRTbPiMZbpZD+857DUpKcPGOg6XbXEwafP5FqjY/LS0/fHm01pfnzzhjdv3vC/v2zg\\nx4TeKZCvtJjF5o0S9pgxZpO3SHmMWweyn/fkTNU7ZvEss7k1fzd1qzdIEBND6mQOszR7OoPBgH67\\nwuHRMRpg9STxyzGW92egkP3P7+xkyygdDX1UVvvtCuWyUX8vOWzS/xYTvrZ9n/me+qw2XzZhewiu\\nn94D6se/88fn043cjLr/RGtRKRv37ZqtjqmVe+L2DLsVPv/2/mwzw9O6vVsvUW4Yaem0Ta+tnNf3\\nHp7UKBzN7odNfO6s3dMnmPGN3donbp89tMmfR/3o/+9lEivQr+Wo3PA+qVbpmPLw6pWWZycmmH0k\\n1kLG59b3ef8pS6OjoQ8GDPQezdIBn377N5+zze9iKf8TqsbOl3CYiPL8LxvTo3i6wsF/PpLvG/dq\\nxH2hiSAx8/H/uLg4W2Z57tr5zDsYy+aD3vEK2IUv7IKWEdmbieP3XUxYF8kXLzj5vEtOUcnt/Zfc\\n3uQVJquP9Ob21Bn3F5kcUda3FP67U6Z+8IW854qz1S0eUlsbdN/tUtEqHHzx4Xkxe3MXcTsc4Wds\\ndXu8H52nO85kC7O6rdD+XKRby/Df2mSJNll9LK/FZVbvHulKjVy/C5ldKtN3w2B2REnHfFPL+MRT\\n9vXt+yzl/f9QvjATKOdbfxvzboczfv9NzNdNb7eZWq5PZ3i+kdskO9H1GLK47u506iUaWpPGaDPD\\ni+y+NMnQdIA9r++9+UwdBXhu1n/6kbjr4it7FD7+zpe6fraCY/7CTGMyptd9T1aV4bu7NL5SIr//\\nBbdri4vJPm+DXFf6NT8lh2fH3zmi2/y4EZoa7Ncbh/z2IYemHVNtJPEGl7CFnvFyw8ynPaP/96E2\\nXQ84Wio93Xuj1QQPyZOpxsaXcPhW47OX51h8xFN+AONejQWORBN3z+4Nnh2NZfVPL5t3e4NnM7W2\\nqA/3jEJpWvKx+upnfnmxTjzkPdu8w+EJkVjd5udfXrHsX2ysyxFeZS1i5/Rs9eYVw3wme5j0Wvhs\\nxHA/K2eq3i0zvuT6aMXENEfoGT/+/Jx01He2qZLZ4SEcX+fVT1cM1og7Zwms8ZdfXvAsGcPnOW/x\\nT8vqTz9uEJAJFjFG2vcn5qR+/fTWAjz7yy8830gS9Z/3AcwOD6H4Ks9//pG1GYGluD2uxGv+9MMW\\nq/EQPudpr82KyxdleeMVP7xMzey/zTTUaIw2U3REl4lMBfYAdiKJGFaMFRyVxhU9L4uH5HoKWbh3\\n1877aAOtwsFhkf41RupPj78DN4nEdGAPxskMqYDxTLVYHW1qbcYVfcYvf35l9C/O8qAdbyjOsxe/\\n8uPzm90m8NCY3rx588fbt28nHnzz5s09fR3xLUm6P02S7k+TpPvTJOn+NEm6P02S7k+TpPvTNC/d\\nZYpKCCGEEEIIIYR45CS4F0IIIYQQQgghHjkJ7oUQQgghhBBCiEdOgnshhBBCCCGEEOKRk+BeCCGE\\nEEIIIYR45Gbuli+EEEIIIYQQQoiHT3bLF0IIIYQQQgghvhNL/X7/vr+DEEIIIYQQQgghbuA0pl+y\\n2Wz3/FWEEEIIIYQQQghxE6cxvWk4HP5x+mC/30eC/adH0v1pknR/miTdnyZJ96dJ0v1pknR/miTd\\nn6aL6S733AshhBBCCCGEEI/c/w8UHC6PGvQZzgAAAABJRU5ErkJggg==\\n\",\n      \"text/plain\": [\n       \"<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=1015x559 at 0x21058C3B780>\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"words\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Excellent! Hope you enjoyed this one!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "14-Working-with-Images/01-Image-Exercise.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Image Exercise\\n\",\n    \"\\n\",\n    \"In the folder \\\"Working with Images\\\" (same folder this notebook is located in) there are two images we will be working with:\\n\",\n    \"* word_matrix.png\\n\",\n    \"* mask.png\\n\",\n    \"\\n\",\n    \"The word_matrix is a .png image that contains a spreadsheet of words with a hidden message in it.  \\n\",\n    \"\\n\",\n    \"Your task is to use the mask.png image to reveal the hidden message inside the word_matrix.png. Keep in mind, you may need to make changes to the mask.png in order for this to work. That is all we'll say for now, since we really want you to discover this on your own!\\n\",\n    \"\\n\",\n    \"This exercise is more open-ended, so we won't guide you with the steps, instead, letting you explore and figure things out on your own as you would in a real world situation. However, if you get stuck, you can always view the solutions video or notebook for guidance. Best of luck!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAA/cAAAIvCAYAAAAxnCs5AAEAAElEQVR4nOzde1wU5f7A8c8saODt\\nYJlnMUsotfSUgd3AsgLT1LIShULNAi8F5v3S0UINSktTS1MrFcoLdDSxoyWlCXVM4ddFOGbqURNN\\nk80stiShhH1+fywsC7sLu4DKwvf9es3rpezMzux8n3lu88wzmlJKUerEyZNc3b49onGRuDdOEvfG\\nSeLeOEncGyeJe+MkcW+cJO6NU+W46y7hsQghhBBCCCGEEKIOeAJomnapj0MIIYQQQgghhBAuKhuM\\nL3fuhRBCCCGEEEIIN+d54uTJS30MQgghhBBCCCGEqIGyNr2mlFIyLF8IIYQQQgghhHA/ZcPyPav6\\nUDRslTt1JO6Ng8S9cZK4N04S98ZJ4t44SdwbJ4l74+To5rw8cy+EEEIIIYQQQrg5adwLIYQQQggh\\nhBBuThr3QgghhBBCCCGEm5PGvRBCCCGEEEII4eakcS+EEEIIIYQQQrg5adwLIYQQQgghhBBuzq0b\\n92e+TiE++j5u8NWhaRpNfLvSJ+IZ3k7bj7E4k1lNm6FpWpVLC88X2UP5KyNMxlw2LxnLwODr0DQN\\nnXYtd0c8w+JN+/nd5ggMvPPo3+x+b+fgQUxasoPTxRfzjDQunye0cSm2AKc3PWX5fGjSUbvf+1fW\\nXMs6i7LM25ecTOFhD0+bfZSljxUZeRf89zYGpoKK15+maXQK7kVMwjq+Ollos36JIYO3po0i5KZ2\\nFeLxdtpRO9cr/JhVMc9of1Mvnpq2ip0G29fGWKcD66WJb1f6Rr/Iln35Tq1vvZSlJ1EVx/lq2eIX\\nsY6fce1atV5GpOTZrFv2N3scx9aXbqEjmZEkeX1NKbKYdZW5rP7HtB38Wenzv7Lm8vfS8/3PLfk2\\n2//f/DvQNI2r+qzkhNXfa1qWl6Ute1xJW8L5/LysLG8b/CrfUTmPrD4253MWcbPOnKffMqNiGlJk\\n1agu6FzZUvWxWe87IGF3jc9j4+Fandp+/u18+SF1+Iuj9uWnkfdG+KBpGp66B0g+UjGPqOsypLb5\\nUb2gzC9DrLC4g4PJj6u2lY67bPHQ+qs1h3ermU287X5uvTT3SFDfKJNSSqnT2+LUPXqdw3WvDZmh\\ndv5ssjqKPJUU0arK728TlKC+Omuy/yMuMXeMu7XP4q9wOrZmR9Wy/i0tn18ekKC+LrSNzZ+Zcyzr\\nLMw0f158Ilk9pPOoYn969fCcXaroIv322qivcS85m6lmBTu+ZrtP/dTq/Baq/yaOUh3QHK7facB8\\ntfds2XfvV8ujOjlcV8NfjU38rkL8rNOBo23Gr//e6fWt09OlUF/jbqv6fLVD+Fp1WtX0WkVFJ5+y\\nWbfsb/Y4E9vmHaPV2gPnLsYJcok7xP2zeH8FKG/dJPVFpTw5a97tlmPvWiEPUMqkstWcwGYKUIPf\\nLr8Wa1OWl6Ute1xJW5fapY67K/m5dVneN75yOVpdbApV2nQ/y/aeWpjaeKI8tiaV6WJd0JWypepj\\ns973zfG76vL0OnSp4147rtWp7effzpcfzqx7bUj9rcNbq89xr235ef5woupjle/2sskj6rYMqV1+\\ndHE5irtb3rk3GdNY+Pi/OA3cFbOW/+blU1hYyK95+9mW/BJhTw7h/o7BvPDXOZRSKKX4M3OOZfuF\\nmSbL3wuKn6c7GudzFvHg/S/xucFE66BYVmd+T/7ZQs7lH+U/iVO4R6/jaMYcBg54iX1FtsfUIXwt\\np0u/81x+Hv+XOIoOaJzJimPG8uyLd3IaoeYeCXyjymNaObZlzud8wJtpBZb//5oTx9o0o8v7i04+\\nVbqPQn7N28PyqE6Agc0zniExR9XBL2qcvloxnhcyC/HQ+vNqetn1l8+R7FReG/UAw8JCuax03R82\\njKZ39AqOo+g0IIFPDpzCWGi+Xj+eN5gOaFx3Ww86tAAwsvnZ/sQkHQb0DJ7zIQfz8jl3Np8fD2xl\\nbnhHFLksie7FhA3277pZ8ozzhfySu5VpIe1R5LL8sZfYesY25tZ5jPUyMUiz8+3CEet81Xo5tn4o\\nVzqxffm1WnFZFelb42Oyju25/Dy+TJ7KPXodfxxJZHToFHbYSQ+iaoF3DaMtUGhK5suc8r8rckhP\\n2Wf5f+6CrXxdVH5+i3MyeC+nEI1AQm/zB6h1We6sC5G2GhJX8nNrH88cxPgU+6Pq7Ck5k0bKvB8t\\n/y9WqbyZUl7n0ghyqS7oWtkiLpS6qFO7Un442t/RDKnD16WalJ/fbHqTbaYSy/93zl5ls15dliHW\\nXM2P6gu3bNwXH8zh7ZK/AOg/ZAjd9D54eXnRWt+F3pEzWJ/oXMWvXC4rn5vFl8pE64AZbNv+Bo8H\\nXYtPCy+8ffzpGTWfLRueo5tmzljmVhNobx89t0fN4+XoVgD836KtdoZ2iIuriB3rF7NXKfT9Epgd\\n5QXAhhUbKwzldI0XrfWBjJr3CsM9mqDI5oMMKQRqxsCBrIMAXPXIECJCyq4/H64LGMj4tz+0NIxN\\nRRm8MWEDpzEXyDs2P0+fG3z5m5f5er1/6gbSv/2Of8X1oBXwe8ZCnlp2DIAnV+9iw/QHuF7vg3cL\\nH9rd0I9/rt9GUkQrwMDa8W+wq6iKa9XTi8v9+vHiwkl00zT+MiXyn0zjhTwxoh7z9tFzW+Q8tmx6\\nkds1HefylvFKkuQBrmoRHMKjnpcBBlK2Z1r+XlbxKlO54nb0q4/ZqxSXBw7h7gCo67Jc1JTz+bm9\\nbVcNnUrqMefqTEe2vMPqkvM0951EQtwtAGQu2lh1Pu6Aq2WLuDgudp268v72pKRLHf4CcKb8NBVl\\nsPG1vQCExScw3KMJf5kSWbclt8J6dVeGVOZaflRfuGXjXtdGz92a+dDfnjmStzbt4bix5l3wJSez\\n+PjjcwD0ih3BrS1sC52Wd8UyMbwlAJ+lpDvRIPTB18/T/P2nsXkGRFxc1r37/R8fQczA0QCcSlvG\\nh7W8265r44ufzhzrnwpqcSuoUfNB38EDgBOb4ng2YR2fHzRQZOc5rOKcLN49ZT7PT44K42o733bt\\njV0sla/sL9ZyGvDWTWJkuG3PLPgzZOI/aQsU5M1h+87qY6hro8evNA/6WWLe6LUMimF6jFQEa0rn\\nFUz/ic0AOLppt+X87cl4j71K4Rc1n7nhzahYccsl/X3zv68d2IN/oF2gsly4zvn83J5ilcpTkS/x\\ndUHV15Eih9QlnwLQNWYQz4YNpZumUZA3h/drMCrP1bJFXEwXu05dvr+ivUVSh7+Aqio/z6S9x/xT\\nRXhqYQyNGsPAp5oD8MmS1Arr1VUZYo+z+VF94paNe8+OkcS/cCcAxzISeTrsFvxae3P1TQ8wYf46\\nvrIzOVZVSk4eY3PpkI8eN9mr/APo6RLQBoDf0g38XG3lzUjeMXNJ5tEWu8PPxMVT1rvfVBfNoN56\\n2vR+hKntvFBks3J9eq0ybtOZPI6ZzLH28vSqmwNudLy4L3YpEb6eKHJJmTmMe7v40qzJtdwbPZl3\\nrSYxMuTmcBrw1MLo1qW6820gd98vALQd1J3OXvYzbw+/G7intIPmxBljtUdrOmPgmDIB0NTT9vNJ\\nwTqbyWNkQqWLL3FIuyomU6pLPnQJuB2A33OyOW6o8x00cF507/k4AL9mJ/OfHIBc9nx8AIDQ3kMZ\\n2O8+oLziVnIyi48/PQfoiewdDFyosly4zvn83FozjxmsTR5KW+BMVhxPxCbzQxV7OZuRymvZ59AI\\nJGpAME0CHuHpfubx8jUZleda2VLR8Q3DaGsz4W4w8edtJ4IVNeF6ndpeTJroBpF60plrXurwF4+j\\n8jOXjStTAOjw5BDua9+a0MFjaQv8kr2AzRnWN1bqpgyx5mp+VJ+4ZeMevLgnbhuHti7l6QFdaVv6\\n15P7tvL6tGHcGXgfy76+dBlqodHAl0nT+Geiufi6Y2J/hz1Covb+KInjFs22MVU2e7Z17/7VT/Tn\\nrjYaOq9gQp/QA7DvleQaPidbRL4hmxWTJrC65DwagTwa0qWuflaj4+kXScrer3g3fiR3dDRfL4pc\\nPk9ayJP9r+Pe6I2XfmbS4iJ+PZbG87Ez2KsUnloYvYP1l/qoGqzaVc6EO2nTsy+jPZqiyCb9q1yK\\nj3zGe9v/wFML44Geeq7r+Qh3azpLxe3HnR+w2VRCC99obg+4+Md78TqO3FNN8nMNb7pErmB9fE8A\\n9q+ZwksOH50wsnXtYk6D1ZBaf0IHhwB1MypP1A8Xu05daDTw5YqxjE/8DYDbYkLpKHX4i856nqwB\\nA0JphXn4/RPtvAADq9ZsrdBJWNdliGv5Uf3ipo17AC869Ytl+ebv+Ol8IUeyP+Ld6Q/SFjhvSOf1\\nxHS7PcP2eLT34yGdeQjZ7m9zHaxl4EDOGQD+FqrnykoXunUltFlrX+4onZClTVACc2ICa/YTRZ0o\\n690HGBbZv3RInRe9IsZZnpuu/PxOVcordd5c7tudmDXmvrz7498gNsi77n9AI6JrE8DwuBVkHTbx\\nx8/72Zm6lCeCmgCQk/QS7+co9P4BtMU8VGrvgeqGxOvxv/EKAE5v3MMhB89hlhw7yOeloy+ubuNj\\n87nlTnwTb67w78+8zCJAz4h18wlrb1vo25tQLyeuh7OnQdQRe5OeOTsZn2uMHMj5EoBWAYF0kP4e\\nl+l8ggl5wpx/Zm5KJ21nKv9RJq4aHEbP9hqeHe/lsd7NUWSz46tMdn/6CQDXDAvl1tIROXVRlou6\\n40x+bsuLe+LeZVn/loCBt4cMYvp/bGtzxUc2kfSOueIfEhNmaex1HPCkZQ4cV0fluVa2VGRv8jaT\\nymRmE6kT1ERd1KntxeS8aaPdMttmf6PNj/O1CUrg5YnBcuf+grJXfpbPk+Wtm8Tgfj4A6LxCGDSh\\nGwDH3knkQ6vX4tVFGWLLufyovnHbxr3R+hl7Ty+uC+jP8DkbeHdqawD+PGN0OlP3aB9E377mZzXS\\nZi1ll53nKs5+sYxFG84CcG9kqN1nsax1Cgpj4uJP+W7n83af+xN1x9Fs+eYJe8p79wFe6FP+vtum\\ngZPYq8yxrvz8jqseXfgNH8T1kAKgFlSBsUKHXLM2XbhrYCwr17zF3ZoORTZFReAZEFTacwsrF62z\\nO/Qy70iu5fovn0V1IUvX2Kvw55K86GVOAy18Z9C7Z/XDMTW6MG3zHt6MvNa1Hylc4krl7FI6m7Wc\\nucvNqbd7ZKiM1KoRH3rcdz8Ap9LmMH7OhwDc2S+4tDPGn+59zSOjtiVOYVGSuTwO712e716IstyR\\ni9dx5J6czc/t82fU0reI8PUEDBjsPOZiPYP2+6Ovs5TrnleGsbrkPOD6qDxXyxZx8VyKOnW7AfNJ\\n3y51+AvNXvlpPU9WoWkhd3mXj84NmmbuCChRW3lnk/UEfLUvQ+yrPj+qb9yycW8qymDOP25iSOkk\\nLUZjEYUFRn7MSSZprTlYV3TUuzDpiT8jX3qB2zUdf+QtZEDvZ1iTdRRjQRGFxlx2Jk1lQPhL7FXm\\nXsPpdir0lSuhhzI3snBsL9raeR5XXDznc5KYm1R9L5vt8zuOWb8KL22qHwBb5q/iC3kFVq0c2vAE\\nN4eOKJ0g00hRURFGYy4fJSbyH2XCQ+vP39uYe26feS2ctsCPaaPo9dCLbDuYx29FZdfrOB7p3JFH\\nEnbzO9AqZBJvxfoBkDL6TsLnfsT/DEYKC4ycOpjGyxF9iFr/O6Bn2OvPcKedHtzyO/FHWda/JYoD\\nJM1ZJxOnNSAlBfkYjUabpaqKfKHRwFcp0xgw8Hm+VCaa+cbybJSM1Kqpq3o+wkM6DxS55B4BD60/\\nD/Qsf3a+e8hjdNM0zmZl8qUycZkulp63WXfG1b4sNxUXkm8nHfwm82a6xNn83BFPv0hWpsZzu2Zb\\nTS05s4ll06t/K4Wro/JcLVvEhXOx69TW+/tt2zTaAqe2LGBdRv6F2aGosvz8OullSyddVSq/GaP2\\nZYh9VeVH9ZJSSgEVlvrut63jbI7ZemneMVp9mGuqsM2fmXMsny/MNNn93tPb4tQ9ep3D7702ZIba\\n+bP1tnkqKaKVAlSH8LXq9AX8zReCu8W9ss/irzDH2yNBfaPsxbRQpU33U4BqqotWH/1su07J2XQ1\\nrt1lClDXRb2vflP200rxiWT1kM5DASo6+ZTV9plqVrC3AlTXx9eqHy7Qb61L9THuJrVfLQxuXsV1\\nrVcPz9mliixbFKr/Jo5SHdAcbtNpwHy196x57ZKz+9XyqE4O19XwV2MTv7P6fsd5xvncZBXh66kA\\n1Te+/Jis13e0WKedi60+xt0+5/PV6q5VR8vN8bucWtdTC1MbT5icim3zjtFq7YFzF+H8uMZ94q6U\\nUkfVsv4tLcfarveKCnmqSWWrOYHNLJ93jvlQ/WbnW2pTlld17ToqB+qjSxl3V/Pzqsryg8mPq7al\\n25XlBwcTHyrNtwPVsmx7ZX95OroicL7aZ/Wd1dcFXSlbqs6rTCpTzWziXSHPudDc63qvzLU6tf3r\\nsfpruTydOdpfofosvqcClJfvELUx136boT6pz3F3tfwsKUxXU9t5KSivl1f227ZplnxhQuqvVp/U\\nvgxxNT+6lBzF3U26ICpq1e91fjm8lTenjiQkqLxHplNQGOPnvc+er1bxgJ/rw2iu7B1P+oEj/Hvx\\nMzwSZO7R1/CnZ/gYXk/9juz0l7irjQzPcRfWw3rueXkM/e3ETtcihNjZ5mE8lZ/fcYauRRCTF8dx\\nu6Zj/5phzExyj8k26huNLkz4zxF2Ji8gJrwX1+vNsfLUd6FP1GTeTd/DB9Oth0550S3qbb7P28Gb\\nU0dy742+pd9jvl7f2vo9X2+ewk3miZPRtejC04mHOJmZzAtR5d9/1Y2hjJ66ks/zvmdxVFenHqvw\\n9Itk/uuRtAU+mfkMC6RnvxHTc1PICKYnfsrRA6sYeoM8X1s7/oQ+Uj5rcY/wisPmNQLoMfDvlv/3\\n723/feNSll9arufnjl0fOY/Xh3ew/F+RbZkg99qo5xgaYC+O/gydEGOZVXvDdleGXbhWtoiGyIu7\\npy5mVrA3RXnJTJy2ih+cfI2jcIX98rPs9XcagUweF2Y3j2/V+2lm9ze/0rTimzHqpgxxpHJ+VF9p\\nSimlaRUzR6Vca+AI9yRxb5wk7o2TxL1xkrg3ThL3xkni3jhJ3BsnR3F3yzv3QgghhBBCCCGEKCeN\\neyGEEEIIIYQQws1J414IIYQQQgghhHBz0rgXQgghhBBCCCHcnDTuhRBCCCGEEEIIN2d3tnwhhBBC\\nCCGEEELUfzJbvhBCCCGEEEII0UB4njh58lIfgxBCCCGEEEIIIWqgrE0vw/KFEEIIIYQQQgg3VTYs\\n37OqD0XDVrlTR+LeOEjcGyeJe+MkcW+cJO6Nk8S9cZK4N06Obs7LM/dCCCGEEEIIIYSbk8a9EEII\\nIYQQQgjh5qRxL4QQQgghhBBCuDlp3AshhBBCCCGEEG5OGvdCCCGEEEIIIYSbk8a9EEIIIYQQQgjh\\n5upt4/6HlEfRNA1PXS+Sj1R+pYOBdx79G5qm0ab7q3xHxc9LzmziCc+maJrG7O2FFT77MSuF+Oj7\\nuMFXh6ZptL+pF09NW8VOQ1WvjTByOG0ZsRF34qeZt+scPIgJ8zdyyGi79ucJbdA0zWZp4tuV+6On\\nsDojr0bnpDEyGXPZvGQsA4OvKz2PvnQLHcSkJR9x3Gi9ZnmaqLx0Dh7EpCU7OF1cvnbJyRQe9vC0\\nu37ZMiLFXpyMvDfCpzRtPmCTNh3FvvKyKEteU+KssljptO4syiqsYs3yNBCQsNvuGudzFnGzznwN\\n3zJjB3/aWeevrLl24uQ4fXl16kFE7AK27Muv7U9t8M58XTH/beLblT4Rz/B22n5+K3bt+rGOU+V8\\ntm/0i1XEw5X8vDzuN8d+xO+VPlVkMatpM4dpzvn8q/FxFL/KcXaUV+u0a7k74hlWVFGeulLelx2P\\nh9aD5Tm2n5fVSZroBpF6UkleX0fq4pqv7nwrcpjbvTmaptGy3XPsKrIXk/Jr/b6E3XbLhjJlaaGF\\n54vsQeLrSIkhg7emjSLkpnYVrtm3045a5aXl590vYh0/V/utrtXHofpyB1yrEzpOh750Cx3JjKSK\\n9U1Rpub19BEpeU7FyF46ciYdVt5XZfbrhfWYMr8MscJSHxSfSFYP6TwUoAa//X3Fz35OVcM9mihA\\neWihat1hU4XPf9o8TgHKWzdJfVFo/qzk7H61PKqTzW8tWzT81djE71RR5eP4OV1NC2nvcLsm+lD1\\n0rZfK2zzWfwVDtcvWwKiVqj/na3z0+aS+hh3a6e3xal79Loqz/3CzHOla+eppIhWVZ7za0MS1Fdn\\nzenBOn05WqKTT9kc0/nDiaqP1Xa94ndVSDPOxB5QCzNNNt99sdT3uFdmHaur+q1QPzhY77dt01Tb\\n0t90c/wuO2sUqrTpfpbf7amFqY0nbOPwZ+YcO3GqPn2BXg2I+1T9Vlc/vI5d6rgfTH7cEp/Ki4fW\\nX607bHLp+rGOk6M8ffz6ymWHq/m5ddz16qnkit9nUplqZhNvu2nOtfzrwrnUcXekuviVxbn6vFqv\\nHp5TMR+uSXlvfTxtgsrLijLHkyMq5Bv1Pa+vr3GvrC6veUfn+7f0uAp5j72y3fpaL8uP7Ck5m67G\\ntbtMAaq5R4L6Rl26stye+hH3QvXfxFGqA5rDOHUaMF/tPauU9XnvEL5Wna7iW2tSH3em3FHKtTqh\\nM+mwecdotfbAhc/fy9SPuFen+nqUdd5rHZPo5FNOxahiOnI+HVbeV2X264WXnqO419vGvVJH1bL+\\nLe1e8GWN97KlYuM/X22K9VGA6hzzYWlFO19tivWzVAQGz/lQHczLV+fO5qsfD2xVc8M7Wj57en15\\nUE0qW80JbqYApSNYTU7cpY7lF6pzZ/PV4cxVanzIVZbPFn1VfhGXFVYVMv7zherXvD3qnYn3WTKa\\nbpbjuzTqZ9zNfv9qjrpdM1eMWwfFqtWZ36v8/EJ1Lj9fHUpfoB7u6FGhse6ogDiXn6f+z+ri7j3v\\nG6VU9ReyI1nzbq9wzprqotVHP9u/0Kuq+F9K9Tnu9lTM0PXq2c2/2qxjfa06Ot/WnYJlS1l6sFZd\\n4946fZkK89UvuelWeQjqgYW231kfXMq4l+RvVaM9mipA3RWzVv03L18VFhaqX/P2q23JL6nwKNtK\\nXXXXj904nS9Uv+RutVQAra/PmuXnFSsjOoIrNMgdHaPr+deFU1+vd2crS/bzanN5WtaA1whUy7LL\\nvqNm5X3lCnvXx9dW6Eis3Li3Vh/z+voa96rU6JqvVr5Kif5bhXNxReB8tc+mUV7xWndUP8taeHd5\\nA04a93YdX1/eoO40IEF9cuCUMhYWqnP5R9XH8warDmiqb/yu0vPrXOO+Jvm3K+WOK3VCR+nwXH6e\\n+jJ5qqVTt5lvrPrUQf2wrtWHuFevbuvpVeXJSrmWDqVxfxEdfLuPncCVN97LFutEUlKYrsZ6mntV\\nyxoB1r22T67+3s6ejloSXAvfGZa7/QcTH7JUHObstO2BKzmbqaYFeimoeEfRbuPeolB9Ft/TToXk\\n4quvcbfu2GkdMMNuBdh0Nk8ZKox8qKqAKC/cywr1mjTuSwrT1dR25niHxSdYGopDEu2lqfpZ4VOq\\nPsfdvsq9tZcHJKivC+3fVauqcV92PTf3naQS4m6xud7LuNK4L3dUJQ3vYNOgrE8uZdytz+mcnc6d\\nm9pU9P/KXqi6aVqFcqBm+bntnQbrPMn+MdYk/7pw6uv1XrvGfelnVh12fUo71Wpa3tu7G2e9vTTu\\nL7wL0bgvH22nV1PinyvNF/RqTnrlPKDita4RaDOypnJZJI17W9b1pA7ha+2OtPv+2/1WHSfONe5r\\nkn+7Uu7UReO+zO+Z5Z279m4gXAiXOu7Oca6e3so3wal6elV5sqvpsKE17uvtM/cA14U8xt2ajmKV\\nypfZRgBMxkzS3jqHRiAvznuOtsCP76ey86QCoGDnxywp/hNPLYzbA30AyP5iLacBb90kRob729mT\\nP0Mm/pO2QEHeHLbvLAIMZH78GQC+vWMZdpe3zVa6FkGMmfoQAIaPU9hpMzeAPV70HDud0R5NUWTz\\nQUa2C2ekcSg5mcXHH58DoN+4EdzaQrNZR2uh5+8tnP1GH3z9PAEo2ltU5bN0VTmT9h7zTxXhqYUx\\nNGoMA59qDsAnS1Jt5n0QF86vOXEsWJNr+b+pIIMFU/5d5TaKHFKXfApA15hBPBs2lG6aRkHeHN5P\\nM9bBUfkzdOJ4umkaf5kS+U9mXXxnw6Fro+duzVzcvD1zJG9t2sNxY9EF3Z9f6f5+Lqjb/Dw/Zw5P\\nxCZzwsG+6z7/Eo7o2vjipzPn7T8VmNNTzcp7+1YPH1bNPB+ivvtm05tsM5XQyncMjz0/iMcCvAED\\nq9ZstZlDw5oimwXx66yu8yK2L57BZlPJBT9md1ack8W7p8zX1JOjwrjazjrX3tiFVi59a83y74td\\n7pRpGRTD9BjzL9yTki71Q6eU19NLTlPjenqZC5MO3Ue9btx7dAykb4AXAJvSdvM7UPDVZ7xd8hct\\nfcPo83QoT7TzqtD4z87aAMBVg8Po2V4DDOTu+wWAtoO609nLtqIF4OF3A/eUVhJOnDGiOEbupvMA\\nXNmzq92EAeDbKYC2QIlK56czzv0unc8NBPS6DIAj2blOTCDSuJScPGYpQG/tYq9yBoVGI0ajkd+c\\nyqeN5B0zz9Lh0RYuq/Rp4pB21U7IAblsXJkCQIcnh3Bf+9aEDh5LW+CX7AVszrjwBYaAZ6ZOpi2w\\n4amppJZ26H21YjaLT/1J+/AEZofbFvoAZzNSeS3b3CkYNSCYJgGP8HQ/c+tqw4qNDhtqrvC4IYB7\\nPJoC8Nm+3GrWblw8O0YS/8KdABzLSOTpsFvwa+3N1Tc9wIT56/iqyglNXWc6Y+CYMgHQ1JM6yc+v\\nDl/Cu/F3AbB/zTBGO5h0q+7zL+GI6Uwex0zmvN3L04ualveVzV69jghfT0xkMiNsJKnHpHJe30wK\\n1tmU25UntTQVZbDxtb0A3DGxP7dogYSNvQ+AY+8k8qGDDrxrx05iXLvL+DFtFLNLJ9c6n7OcWa/+\\ngKcWRkL8oAv4y9ybITeH04CnFka3Ll518p01zb9rWu44Vyesig9dAm4H4PecbI4bnN6wEau6nu6q\\n2qRDe/G/LHhGLY/o4qrXjXuNAEIfvxGAE2+l821RIbu3rwDg+phQbmvZg9Ch5sr8prTd/EYm6W+a\\nr6I7+wVz5aU5bHGBKbJ4uW07WrduzaRNVb95oNBo4MsVYxmf+BsAt8WE0hH7Fb6qnM/5gDfTCgAY\\nMCCUVkCL4BCeaGeuUFZ3F0DUjWvDJvNKRCuKVSovLU7nj5MpzJmyCx3BTJ8xhA5aEztbGdm6djGn\\ngcsDh3B3AIA/oYNDADiVtowPc6TyfmF5cU/cNg5tXcrTA7rStvSvJ/dt5fVpw7gz8D6WfV0Hd0iL\\ni/j1WBrPx85gr1J4amH0DtbX/nsBHa3pG7eapOEdANg2cwpLs35x+Xtcyb8aC2caahUVkW/IZsWk\\nCawuOY9GII+GdKmz42nVKZKVqfHcrukoyksmbmYyx4tNdfb94uIoG22nEcjA3oEAXNfzEfroPChR\\nW3lnk/2Rky2vHMTkVx8G4F+TX+WLAgPr5s7mS2Xi/gXPEd6xXledhcVFKndErRQaDXyZNI1/Jppr\\n0XdM7M8/alBPF+XqfQ7VPeQxumkahaZk0renk76uENAT2TsY8KJH71GAufG/+4vdfJBXhIcWygM9\\ny+6Y6PG/8QoATm/cwyG7r0CBkmMH+bz0DsDVbXzQ8MN/oLmh8PPO/Q7v7OUdNvcOeWih/L2Nc7/J\\nZDxIzg7zPZ+Ogf7SCVGJR3s/HtJ5ALD7W9fvgB7fMIy2pRXEZq19uWO0eZhmm6AEXp4YbNMjGJ18\\nCmWef8KyHFs/1CouRexYv5i9SuGtm8Tgfj4A6LxCGDShG1D1XQBRl/QMe+k1+ug8yJkfx4Dhk9ls\\nKiEk/lWiA5rZ3aL4yCaS3jF3zITEhFkKjY4DnmS4RxMU2axcn17rYWAlB3P4vOQvAO690f4d28bN\\ni079Ylm++Tt+Ol/IkeyPeHf6g7QFzhvSeT0xvcYdZJbGYRNvrvDvz7zMIkDPiHXzCWuv1Vl+ruHP\\n8KVJjGt3GSYyeXbgSN48X7FyWNv8SzhWfkfFm8t9uxOz5gcA7o9/g9ggb2pa3tvTMmg6q996EDCP\\n1IiY9kXd/hhRKwszTTbldk5cD6s1ykfb+faO5cEAc77v2XEgUU+aR21lLtro4LV4cE3kyyzr35I/\\n8hby7ENDeXb971wekMALMYF4S8PDIb2/+e55sUpl74G6GZpUu/zb9XKn+jphdYwcyPkSgFYBgXSo\\nm/7lBsWmnh69guMo2gQlMCcmsNbfX5t0aC/+f2bOqfUxXUz1vnHvGRDMI77mu6PLJ43l3VNFtPCN\\n5vYA8+ctbruX0R5NKTQlkzB1HXuV4u/3RdKzY3nmG3jXMNoChaaFLF1jr7KVS/KilzkNtPCdQe+e\\nXoCe4L73AnBqexyrttv27pkKslg6fzMA+r4V9+lYETuXzOXtkr/QCOSRkNon4obGo30QffuaG2pp\\ns5ayq6D2jeZ2A+aTvv15u8+/VqfkTBop834EzGnoLu/yu0xB08wZeFV3AUTd8uwYSfyLd2Iik4yM\\nPJr5xjI9JhhHA6/KnrkEeH/0dZbYeV4ZxuoS81C/fa8ks+NMbdJZLusWvc5epWiqi+buYJ9afFfD\\nZLR+1tHTi+sC+jN8zgbendoagD/PGGvdwVJGowvTNu/hzchrS/9Sd/m5rkUIL26cxe2ajhKDgdOV\\nPr8Q+VdDV31DzbFHF37DB3E9LJ22NSvv7bt+1GuWkRoGg4ytdSfWo+1ObR/FNZZRIa2JLB3JV/Wc\\nK/4Me2E6t2s6dmekcxo9o+LHcIuDRz2EmWdAUOmIRli5aJ3dhnjekVwX8/qa598Xs9wpczZrOXOX\\nm7sMukeGyl1oJ3QKCmPi4k/5bmfN6umVXZh06D7qfeNeI4jQp83dXnlHcjkNdH4ylFtLM1idTzD9\\nnmoGGMjMMjeubuzXvcIzOa1CJvFWrB8AKaPvJHzuR/zPYKSwwMipg2m8HNGHqPW/A3qGvf4Md5Z+\\nd+eoF5gTbP7uhD69mJK0m+PGIgoLjBzJSmTSQ4OZl12EjmCmxA91+BwQAMXmYYTvThpAxMydANwU\\nk8DQALnobZUXqn/kLWRA72dYk3UUY0ERhUYj32ftJqf0Dqk9HcLXcrq0gvjbtmm0BU5tWcC6jPwa\\nHc3XSS9bGoFVqeougKhLXtw2djbj2pmr8w+/MJlebexfRyVnNrFsevWdLn+ZElm3xfW7rKrIyK/H\\nMsx5yOrjAPR+dQz9HRxPY2UqymDOP25iSMI6Pj9owFiaj/6Yk0zS2rMAXNFRX+PJbcobh0dZ1r8l\\nigMkzVlXYSKjuszPWwZNZ/W6oZZhnhXVLv8SjpXfUSkkbaofAFvmr+ILq465mpb39vkzfOl7zAq2\\nP5eHqK+MbFzyAntV9eVxVXOutLx1Ii9MuQaAq/olMGZA6zo8xoZJ5xXCM6+Fmye7ThtFr4deZNvB\\nPH4rKqLQmMvOpHE80rkjjyTstrljbiouJL90PhLr5beimuXfF7rcqazQaOCrlGkMGPg8XyoTzXxj\\neTZKbuDZY11PV0pxKHMjC8f2oq1n3Xx/bdJhg1DVVPr1hfWrbQA1a1vF12D8lDq6wutL7L1eruTs\\nfss7ce0tGv5qbOJ3qqjSdsU/p1vemWxvaaIPVS9tq/je7bJX4VW1BEStUP+7SK9CcqS+x/30tjjL\\n+0LtL3r17Nayc+/oFRvlrx708h2iNuaa00blV9rYW26O31XhdRrXRb1v9723v22bZkmfE1LL00J9\\nfD2SUvU/7pVZx8r6FSTHU8eqPuHz1beFZX8pTwNl59v69Tn2XztZ/tqystckVvcqvKrS44C4T+2m\\nkfrgUsb9t63jqjx3zTtGqw9zXXu9mKNX05zPTVYRvp4KUH3jd1XI013Pz6t6dU953mLvGF3Lvy6c\\n+nq91/ZVeCVnM9WsYHP6qPxO+pqU91Udj3WaklfhXTiuXPOOlujkU1avv3P8KrKDb1cuG2zLD6WU\\nKj6Rqp7uHaaWflVe7yx7BZe8Cs+RQvVfq/eW21s6DZiv9p5Vypmytey6dzX/dqXccbZOqJRz6bB5\\nx2i19oDtK/sulPoR9+o499rDMrV9z70r6VBehXcJtAgO4VFP8106b90km2F0V9x2r+UZx/IJsyrS\\ntejC04mHOJmZzAtRvbheb+6tv+rGUEZPXcnned+zOKqrzfPYHm1CeCX9Ww5tXUpMeA86lA6v6RQU\\nxvh577PvwA5m9HauN9dT34U+UZN5N/0U2Ykj6SyvQqrSlb3jST+wj3/Ne4ZHgsqH194UEsb4eWv5\\nMu8UL/er7tx7cffUxcwK9qYoL5mJ01bxQ7Hzx2A9Ic/kcWF2e3hb9X6a2f1bAnU387qo3jUDF/PJ\\n+inc6GBUrfXr766Nes7BKBl/hk6Isbz1YMN2158RvKxjMOExr7L52/1sju/VYF+tUhut+r3OL4e3\\n8ubUkYQElc9HUJaP7vlqFQ/41c1oB0+/SOa/Hklb4JOZz7DAasROXebn1nmLPXWTfwlHdC2CmLw4\\njts1HfvXDGNm0lGrz2pW3jtinaZE/Vf2KFZTXTQTHNw57RQ5gXHtLkORzcrkdBzl/B7tB7J820Zi\\nb5XRG87zolvU23yft4M3p47k3ht9AfOcJT3Dx/DW1u/5evMUbnKxDuxq/n0xyx0zPTeFjGB64qcc\\nPbCKoTdImrm0Lkw6dAeaUkppWsXErZwYyiTcn8S9cZK4N04S98ZJ4t44SdwbJ4l74yRxb5wcxd0t\\n7twLIYQQQgghhBDCMWncCyGEEEIIIYQQbk4a90IIIYQQQgghhJuTxr0QQgghhBBCCOHmpHEvhBBC\\nCCGEEEK4Obuz5QshhBBCCCGEEKL+k9nyhRBCCCGEEEKIBsLzxMmTl/oYhBBCCCGEEEIIUQNlbXoZ\\nli+EEEIIIYQQQripsmH5nlV9KBq2yp06EvfGQeLeOEncGyeJe+MkcW+cJO6Nk8S9cXJ0c16euRdC\\nCCGEEEIIIdycNO6FEEIIIYQQQgg3J417IYQQQgghhBDCzUnjXgghhBBCCCGEcHPSuBdCCCGEEEII\\nIdycNO6FEEIIIYQQQgg352aNewPvPPo3NE3DL2IdP1f6VJHFrKbN0DSNgITdNluXGLJYnTCKkJva\\noWkaTXy7cn/0FFZn5NmuezKFhz080TSNESm2n5f5K2sumqbZWXzpFjqSGUk7OF1c298tKjuZkcik\\n6Pu4wVeHpml4derBo7FvsP1IvmUd69gsyrJ9LcgPKY+iaRotPF9kD8pmG+uliW9X+ka/yJZ9+RW+\\n4/OENjbfIWrG8bWk0f6mXsQkbOSQ0XqL8vyg8tI5eBCTllR97Z3e9JRl/aFJRx185svcjEK725uK\\nMph2lTeapjFkxdEqj7+qdCjsMxXksnnJWAYGX2c5f52CexGTsI6vTpbHpOwadDXN+EWs4zSZljKj\\nqqXs+na0r8rriZqzLnvtXdcT5leOKVSVF5QtFesMRRxOW0ZsxJ34aeVlSN/oF9mQlcefpWtVlb//\\nL2U4fy/NI55aUzH/EK6rKu5lS+W6mCKHud2bo2kaLds9x64ie9ee47Th1akHEbELbMp1qLo8kvy8\\ntspjcnPsR/xe6dPq6vIA53MWcbPOfO3eMmOH5Zq1VhbDJrpBpJ50HCtVlMWs7s0qpTFX8xRRF5yr\\nUztuC5rO5FRo55nbYoOYtOQjDp0pr/dXt1TV7nMHbta4r6ki9iaN5jrfHjwxcyWf7TMHrdhwgG1J\\nC3gitB2B0Ss5VFCX+zTwbcYq5kbfx7VdRrDuoP0GgnCNqeAAb0Z35urQESxK2sH/DOaL/88jmaxf\\nPpY+nbry2KI9djP62ig2HOCTpDgevukWJmyQitzF9uO+dN6cOZg7+73I1wXVV6gOZ6WyaNx9BPdx\\ntH4uG1emWP738eJkvrGqGLbp9xhT23kBBlat2WpT+QA4k/Ye808V4amFMbifv+s/SjhkKsgivs8/\\neHjcG3yQVX69HclK582Zw3h68e5qr/GyNHNz16GkHpNKeENwOCuV16cN5sYuvZiz3bZB5pwiPk/o\\nQ+f+Y1i+YTfHKS9DPkmKIyrs1WrzmLNZcxk+dB2ngb7xG1n8+LU1PBZRG2czUnkt+xwABXlzSNxk\\ncGn7P49ksmH5FB66qSsPzdxhN58XF9be5SOZluJqnaqIHesXs7f0Xe57X17GR1U03otVKi8tTndY\\nZhxaM5f4bKmju7viYylEdrutQjvP3BZLZdG4B5m9qfHU3RtF4/70lmfpHb2C4yg6DUjgkwOnyD9b\\nyK95+/n3vMF0QCMnaRRhsRtr1Qu3MNOEUgqlFOfy8/gyeSr36HX8cSSR0aFT2HFGKpi1Y2D9mH7E\\nJB0G9Aye8yEH8/IpLCzkl9x05oZ3RIc/t9/mz2V1sDdLPM8X8kvuVqaFtEeRy/LHXmKrxPKCqnwt\\n/d/bw2gLnMmKY1WabQWuQ/haTluvnziKDmgczYhjxvJsm/XP53zAm2nlvXm/5sSxNs1o+b/OK4RB\\nE7oBcOydRD48Ujne5Z0DHZ4cwn3tNYfHb71MDNIQ1ftqxXheyCzEQ+vPq+nfk3+2kHP5+RzJTuW1\\nUQ8wLCzU5hpv7pHAN8p83k1n8zm0NY579DqK8pKZFp9qt+KuEcwLf52zxOfPzDmWz6xjWFD8PN3R\\n7O7Leqm8nqid6ORTVvlAPofSF/BwRw/OG9KJ6/MAy3Ns82HrvMB6ObZ+KFcC53OWM27WFwAMjv+U\\nY/mFFBbm80vuHtYvHkn/sYO4s4XjGBYfS2Fk2Ey+VCb6TP+Uf8X1qJPyRpSzjrv1sirS12otI1vX\\nLua01V/+PX8d31UxcsY6bZgK8y31BjCwJeE+hizaY3c7yc8vJAMrhgxjUZbzjeuSM2mkzPvR8v9i\\nlcqbKbblvLWc+XEk2skvSs6ksXD2x1VuW12eIuoDIx/Oj2V9XjF/C4hlffYpjIWFnMvP49v0ZGaH\\nj2BwP3+uifyXVQzzSIpoBdjGuGJe434afOPeVJTBq0+/zWnMwdux+Xn63OCLTwsvWuu78NDUDXyy\\nejAA3615hpUOhuC6yttHz22R89iy6UVu13Scy1vGK0lVZz6iar9nLGP86uMAPLl6FxumP8D1eh+8\\nvLy43C+Ef67fxr5vtzLprtZ1u2NPLy7368eLCyfRTdP4y5TIfzKNdbsP4ZC3j55b+vUnSOcBwF/V\\nPObi7aPn9qh5vBxtzrT3pKRXqvCV9/rr+yUwO8oLgA0rNnLCaq1bBj5NH50HJWor72yqeO2Wdw7o\\nGfF4f1rV8jcKawYOZB0E4KpHhhARci0+Lbzw9vHhuoCBjH/7w2or1VoLHzr1i+eVSbcC8MM7qXxh\\nkA45d+bt40OnkEm8v30NEb6emMhkwWL7nTZVyTuQxV6l8NTCiHw8lA4+Xnh5+XC5XyDhY1ewfnoP\\nh9sWH9vEyD5PsD6vmK6Pr2XlnF5y7V8ixUc2kfSOOQ+eEv8c3TSNX7IXsDmjyKntNS8fS70haXgH\\nALZPWSod95eAiUwSYpwblQdwZMs7rC45T3PfSSTE3QJA5qKNDh7LKN/HK3OSK93AK+KL5bN5+9Rf\\nNT94US8oDpK9wjw245oBQwkP8OVvXl54++i5MSSSWetXEta+8XTGNfjGfXFOFu+eMmf2T44K42o7\\n63R+fBIz23kDBtamVT/c0xUtg2KYHuOokSFckf3FWk4D3rpJjAy3Nwzany43+lyw/eva6PHTzJfM\\nzwXOVSBEXSjiSEYaWaYSdARzaxe9E9v44Ovnad56b1GFa9q617//4yOIGTgagFNpy/jQqmffs+NA\\nop5sAdhWHHZvWcJepbgicDIPhXjV7ueJSnzQdzB35JzYFMezCev4/KCBohrMXeLb3g8ARVGNthf1\\nj6dfJJOmdgfg5LvpfGV0rUz1aeMHmO/2zZr2Ev/KOMBPTjySV1KQxYtDhvLu4fO0CUrg3WVD7NYn\\nxMXxzaY32WYqoZXvGB57fhCPBZjrcI4eo3LMn6ETx0vH/SWWnzOHJ2KTK3Sw26PIIXXJpwB0jRnE\\ns2FD6aZpFOTN4X2r0Xf2HN8whaXby2/gFR9JYc7sb2p55KI+0Pg7+hBzne/gijjGLNnIf48Z6/wR\\nXXfhto374xuG0bbSBAg6LZj48xXvvBtyczgNeGphdOtivxKu4UeX+5oC8McxQx0/d+VDl4DbAfg9\\nJ5vjrj0SJiwM5O77BYC2g7rT2evi98CZzhg4pkwANPW86LtvVCYF66yubW9uGL6G0+gZ8fZKogOc\\nib2RvGPm1pxHWyoMmy3r9W+qi2ZQbz1tej/C1HZeKLJZud76uTwf+g8bR1ugIC+R/2SaO3RMRRl8\\n9Kb5ea77x4bxDzvDsCsev1blxECiMi/ui11KhK8nilxSZg7j3i6+NGtyLfdGT+bdtKNO59F5J48B\\noOGFVx1es3+UxHGLZhtjmWDr4uhy470A/GlK5dsjFT+zVzewnlCrVe+nLXdq922I47HQruhbalwf\\nPJIZSR9x3Gi7vz9N2bwWO5gXMs31ixEzxnBrFUP3xYVlKspg42t7AbhjYn9u0QIJG3sf4Ogxqqp5\\n3BDAPR7mOuBn+3JtPpf8/MK5OnwJ78bfBcD+NcMYnVD1DbayeRY0AokaEEyTgEd4up+5E77y6Lsy\\nnloYk6c+ABhYMm1B6fw6Rj5cFM82Uwn3xicw1tPxwzXV5SmiPvBn2AvTuV3Tcd6QzrJxgwnwb00L\\n3648EvsqG7Lce4I8V7lt416I6mheXnTT6qACVlzEr8fSeD52hmU4Z+9gZ+4ei7pl4NOUVeysZnK0\\nQqOBL1eMZXzibwDcFhNKx9IGuHWv/9VP9OeuNho6r2BCnzDHc98ryRXmxmgZEsaEwGZY3xEqm0iv\\nqS6aoQNkIr0LwdMvkpS9X/Fu/Eju6FgWu1w+T1rIk/2v497oqudHUQVGDqfN5NmFXwNwzZNh3KWX\\nxpgA8OfJd3P4Mvklngi6zvLXQ1mrmBv9IP+4bYTN5FzFKpXkNacs/181Z6nTQ4iF6xKHtLNpTFvP\\nil2WB2sEMrB3IADX9XzE4WNUov7S0Zq+castHW7bZk5hadYvDtYun2fh8sAh3B0A4E/o4BDAdvSd\\ntaDRzzEz0Jtfc+JYsCaXs1nLmbX8OM18Y3kuphetNWkOubuWQdNJP/ohr8U8wPWl5X2x4QD/Xj6V\\niODuDJxf95Nt11dum5rtTXBhUpnMbOJdYT29fwBtMRfOew/YH0qtOMaBT83P3DT309fxM3RGDuR8\\nCUCrgEA6SJuwhvT433gFAKc37uFQFc9WlbEeRn/ohO2QiTzDsSq3t/TWN/HmCv/+zMssAvSMWDe/\\nUT27cylUmMCobELDYC9yMxbyZOwqm9556571Zq19uWO0+RGONkEJvDwx2HLn3np25WGRZc/Ke9Er\\nYpxlWOa6LeV3bjQCKtwR2nLkqGUivRufHUKvNvbTgb0JmHLiHD/LK2zp2gQwPG4FWYdN/PHzfnam\\nLuWJoCYA5CS9xPuVKnHWd9N1LVvTuX8CnxtMePkOYd7MsDrN1x1NqCcTbF0cB/Z9BsBlujBu6ljx\\nM3t1g/OmjZXybB9ui5zBO5lHMBXmsy8zlUVRdwLwx5FEFm+wbRzqCGbMxCGWiT2dGUIsLoTyyUx9\\ne8fyYOlIrqoeo6pOycEcPi8x1wHvvdG2w1by8wtLw5/hS5MY1+4yTGTy7MCRvHnedv6r8nkWICSm\\nfNRcxwFPMtyjiZ3Rd+V0XkFMfmUsbYH3Z47i4YnPs1cpHlvwvMNyvIxzeYqoD5r79WP8sg85mGei\\nIDebLcnPc7+vB2Ag7Z+r+MLFx7jclds27p3lGRDEE+3Mw/FXLlpntzA+tGYh8acKAT3D+tXtzLdn\\ns5Yzd7l5EGn3yFC7Q3iFcwLvMs+YXmhayNI1tkPnwEDusfIOHF17fwL05qF2X2bvr5Th57Ln0wMA\\ntAnz52on4qLRhWmb9/BmpLz26KIqndAwelQfAE5/nMG3TkyO1m7AfNK3P281fLbi7Mov9Cl/v3nT\\nwEmW1+p8siS1wtwYHXs/xkOld4ReGzeWN9MK0AhkZITtjO2ibqgCY4Wh983adOGugbGsXPMWd2s6\\nFNkUVTPtxVU3hvJ0/Pv8d/86wvwk320oio+lsHC+eVbz9k+EcpuPq7Etwmgs/5/m5cM/ggYyIXEN\\ny/q0BOCnSnOqaPgzdv1a3li4ivXxPQHzEOKZ8n77C8LebPnlbzsof9PJqe2juMZyd781kaWjtZx5\\n/rpcLusWvc5epWiqi+buYJ8L8ZNENXQtQnhx4yxu13SUGAwV3oJQpmyeBYD3R19nKb89rwxjdcl5\\nwHb0nbVWvSfy+vAOnDekk5Fl4sqg+UyKlDtuDYXJWPEZ++Z+ATwYmcD6dycDUKIM/Fanrzyvvxp8\\n417nFcKUN0fTFvgxbRS9HnqRbQfzMBYUkW84wOb54dw//H0A/vH4G4wM8bb5jpKCfIxGo81S1fCO\\nQqOBr1KmMWDg83ypTDTzjeXZqMAL8yMbiVYhsbxeOnQrZfSdhM/9iP8ZjBQVFfHrsUzeGjeYjv6h\\nLPzC/P5jjQBCn74JgJy5cTyfsoefCoooNObyydzxzN56FtDz2OP97b7OpLy3/ijL+rdEcYCkOfZf\\ntaMoJN9OGmksGckFVfpYROKKbQA00fmhr1QeW/es/7ZtGm2BU1sWsC6j/F3Y53OSmJtU/dPalWdc\\n9mjfj8jSO0Jfp21lr1K061d+x0jUvUMbnuDm0BG8tWkPx43ma9xozOWjxET+o0x4aP35e5uK21S+\\nm37y2x0sjxtEZ59L8hNEHSs0GjmcsZDBvR9nfV4xOoKZPM71ERnFR1J4rGsvy4RLxoIi83enJfHO\\n9j8A+Ef7ihlMM49ohof7A17cE/euZQjx6uGuvcJL1JaRjUtesHTEVsXR89dlVJGRX49l8HJEH6JK\\n38LT+9Ux9K/mLq64cFoGTWf1uqG0tfNZyZlNLJte/eMWlUffVaRncNws+ug8AD2x8WPkhls95Xqd\\nuoht8wK5NeJF8ySppfWGfEM2yWveA8BLf4NNvaHBUkopoMJSf+WppIhWClAdwteq05U+NalMNbOJ\\ntwLUzfG7rD4pVP9NHKU6oNn81rIlIGqF+t/Z8i2KTySrh3QeDtf31MLUxhMm9WfmHIfrlC3NO0ar\\ntQfOXYwT5BL3iXu5krP71fKoTlWcb716dOE3qsiyfqaaFdre4fqBUe+rH6y+3zqeCzNNlr+fz01W\\nEb6eClB943dZvv+z+CuqjH3FdFg/1Ne4O3MtAeqBhd+UbuEoPyhUn8X3VIDy8h2iNuaalFKFKm26\\nnwJUU120+uhnk83+S86mq3HtLlOAui7qffWb1We/pceptlbHMCH11xodf3Tyqbo9aS6or3GvzKT2\\nq4XBzau8xh+eY3sNNvdIUN8o27hWVHUZ4uj6L1Pd9V5WLtQn7hL3MtWVvYBqog9VL22zvgbL4+qw\\nHC5NHzmL765yvWtDEtRXZ80xdJS2Ss5mqlnB5rpGc99J6ouz9SvmSrl33B3lk+cPJ6o+pev0nveN\\n3XUOvv2QApRGoFqWbVLOpA3QqwFxn1bI8+t7fu6Ie8S9qny4vPy2rkMdTKwc18qOqmX9WypAXRE4\\nX+1T5fXzivlyocpaGK76xbxv2a9126E8ps7nKfWBe8S9es7VqW3TT8nZrWq0R1OH22n4q/Hrv6+0\\nt6rrA+7AUdwb/J17My+6Rb3N93m7eTd+JPfe6AuAp74LfaIm8276KbITR9K5RV3uU89NISOYnvgp\\nRw+sYugNtiMChOt0LbrwdOIhTqSvYmJUL8ukGZd1DCYiZgnbDu/nvYndLcOldS2CmPXJV3yy+Bke\\nCSobTm+OzbzU7/gscZBTrzPy9Itk/uuRtAU+mfkMC6zuCIsLT8OfnuFjeDv9FB9O7F7N2l7cPXUx\\ns4K9KcpLZuK0VeQayl9/d8/L9u/O6FqEEDv7fsB2xuXyifWghe8MBvfzqZPfJWxpdGHCf46wM3kB\\nMeHl13h5fr2HD6bX7eNTwj10Cgpj/Lz32XdgBzN6t67Rd9w89nNOZibzSswgS13AurzO3PZ8tTPh\\n61oEMXlhHLdrOv7IW8hoef7+oigblt1UF80EByMhO0VOYFy7y1BkszI5naqe3rmsYzDhMa+y+dv9\\nbI7vVcfzLYmaKS+/y1hPhHtt1HMMtTtqzp+hE2Joi3n03YbtjiLvxR0T17N12SC7IzaFe9K16Mfy\\nMwfZnDiFJ3v3oAPlbYPwmFf597ff8Fp443mkVlNKKa3SjOLKiSFPwv1J3BsniXvjJHFvnCTujZPE\\nvXGSuDdOEvfGyVHcG8mdeyGEEEIIIYQQouGSxr0QQgghhBBCCOHmpHEvhBBCCCGEEEK4OWncCyGE\\nEEIIIYQQbk4a90IIIYQQQgghhJuzO1u+EEIIIYQQQggh6j+ZLV8IIYQQQgghhGggPE+cPHmpj0EI\\nIYQQQgghhBA1UNaml2H5QgghhBBCCCGEmyoblu9Z1YeiYavcqSNxbxwk7o2TxL1xkrg3ThL3xkni\\n3jhJ3BsnRzfn5Zl7IYQQQgghhBDCzUnjXgghhBBCCCGEcHPSuBdCCCGEEEIIIdycNO6FEEIIIYQQ\\nQgg3J417IYQQQgghhBDCzUnjXgghhBBCCCGEcHNu3rg38M6jf0PTNIeLX8Q6fq601elNT1k+H5p0\\n1O43f57QBk3TaOH5Intw/EoJZ9cTF0J5/O3FWZHFrKbN0DSNgITdVW7zV9ZcS5pYlCXxrk9KTqbw\\nsIdnlde5dTzLYlR5aX9TL2ISNnLIaP3truQhNctvRPU+T7gWTdNo5jGZXUUVrytFFrOuMl/H18d+\\nxO+Vtj2fs4ibdTo8db1IPmK9rZHDacuIjbgTP02Hpml0Dh7EhPmV00DZMdQs3djGvIjPE+5G0zQ8\\ntB4s/CK/5iemATGdyWF1wihCbmpXem596RY6iElLPuLQmbK1HF9jnYMHMWnJDk4Xl39ndfn2DymP\\nomkaTXSDSD1p/tyZ/GRESl6V6+q0a7k74hlWZORV2J/18ThaqipfGoMSQwZvTStPB2Xn8u20o5Zr\\n2/q8l8XCWnVxLzFkVUhrTXy7cn/0FFZn2H6XqzGuKv1Ulb+Ics6kAWs/ZqUQH30fN/jqLHnyU9NW\\nsdNQ9bVUVjZomsYtM3bwp4P1TAW5bF4yloHB11li2Sm4FzEJ6/jqZKHLdRBRNUdlrblMGMn8Tfvt\\npgNwLS24Wq+vvFSVb9R7yvwyxAqL+8hTSRGtbI7feukQvladrrDNUbWsf0vL55cHJKivC0023/xZ\\n/BUKUM09EtQ3yvZzV9erj9w37mXK428bZ6VMKlPNbOKtAHVz/K4qt/kzc47lPCzMbJjxLuNucS8+\\nkawe0nlUeZ1bx7MsRo6W5h2j1Ye5ZbFzJQ+pSX5Tf9TnuP+ZOUe1LT2uWdvOVfjsr+yFqpumKUB5\\n6yapLyrl11kLb1eAatd7hfqh9G/FP6eraSHtHcapiT5UvbTt1wrfU9N0UznmB5MfL/0tevVU8vd1\\ne6JqoD7E/Xxusorw9XR4biPfLjtP1V9jbYIS1FdnzXGoLt8+nhyhAOWphamNJ8yfO5OfRCefcnJd\\nvXp4zi5VVLo/6+NxtFRVvtSl+hD3igrVfxNHqQ5oDs9NpwHz1d6zFc97WSysOY579fsIiFqh/ne2\\nfAtXY+xM+rGXv1ws9S/u1pxPA0opVXJ2v1oe1cnhuhr+amzid5bYVN5X2nQ/y7rWeYC1krOZalaw\\nt8N9dJ/6qSpwsQ5yKdTvuFdUXVkLqL7xuyrEtSZpwdV6fVVL5XyjvnAUdze/c1+uQ/haTiuFqrQc\\nWz+UK63WO5/zAW+mFVj+/2tOHGvTjBf9eIUQzvFoH8m/S4ot1/Tx5AgAPLUwNp4wObzWm3sk8I0y\\nf246m8+hrXHco9fxx5FExsen2vQMO5uHuLquqJ5nQBBPtPMCYGtWdoXP9mS8x16lACg0LWT7ziLL\\nZ4oc0tfsA+DGft25uvRv8x56kHkZJ9ERzOTEXRzLL+Tc2XwOZ65ifMhVnDekE9fnAV77utDmWFxN\\nN9bOZs1l+NB1nEbPqLd38HrktbU7MQ2CkQ/nx7I+r5i/BcSyPvsUxsJCzuXn8W16MrPDRzC4n7/N\\nVtbX2Ln8PP4vcRQd0DiTFceM5dl29uO66ORTNtewUopVkb5VrFvIr3l7WB7VCTCwecYzJOYom/UX\\nZprsfvfEIK1Ojt3d/LBhNL2jV3AcRacBCXxyoCwdHOXjeYPpgMZ1t/WgQ4ua7+P0lmdt9pF/tpBf\\n8/bz79J95CSNIix2o907rK7G2Dr9nMvP51D6Ah7u6GHJX5bb2aYxcy0NGNn8bH9ikg4DegbP+ZCD\\nefmcO5vPjwe2Mje8I4pclkT3YsIGOyMyzqSRMu9Hy/+LVSpvptjmG1+tGM8LmYV4aP15Nf178s8W\\nci4/nyPZqbw26gGGhYXSvIZ1EFE167LWcs09fg0AO2YtZYflbnzt0kKNjue8+XjemXgfbYGcpFGE\\nT7MdOVhfNZjGvXOK2LF+MXuVQt8vgdlR5srkhhUbOXGJj0wIceFoLXzo1C+eVybdCsDJd9P5yigV\\nr/pC5xVM6FBvAP63PN3yyIt1472MdeO/5Eg2H+cUoRHIIyGBABxKmsWMzHNoBPLizh28GtWDDj5e\\neLfwoWNQNAs3v8+0QC9MZPLqzHVV5v2upJuzWXMZMPB5vlQm+sZvZMmorlxW0xPSgCgOkr3CPCD2\\nmgFDCQ/w5W9eXnj76LkxJJJZ61cS1r7qBq+3j57bo+bxcnQrAP5v0Va+41Jdv1601gcyat4rDPdo\\ngiKbDzLqprOhoTIVZfDGhA2cxtxps2Pz8/S5oSwd+HP/1A2kf/sd/4rrQata7OPVp9+22YdPCy9a\\n67vw0NQNfLJ6MADfrXmGlRm2HXvlXI+xt48PnUIm8f72NUT4emIikwWLq+4MbExcTQO/ZyzkqWXH\\nAHhy9S42TH+A6/U+eLfwod0N/fjn+m0kRbQCDKwd/4bN41xHtrzD6pLzNPedRELcLQBkLtpYaT0D\\nB7IOAnDVI0OICLkWnxZeePv4cF3AQMa//WGj7Yy7+MzXXP9+QQAoiigqfQSrtmmhRjzNx/PEwi2s\\nj+8JwLfL41jnJh12japxb92T1//xEcQMHA3AqbRlfOgmARNC1Jxvez8ASpSB3wqqXldcTF706D0K\\ngLN5qfxfjvmvxTkZvJdTSFNdNPPnDQIqNv6/z3iP/ygTLX3DuCMAwEDmx58B4Ns7lmF3edvsSdci\\niDFTHwLA8HEKO49Un/dXl27OHkthZNhMPjeY6Pr4Wt6O6yEN+1Iaf0cf4gnAwRVxjFmykf8eMzp8\\n/tUxH3z9zN9TcpoabF+3dG188dOZj+engqJq1m7cinOyePeU+Rw9OSqMq+2sc+2NXWrcsHd2H50f\\nn8TMdt6AgbVpu6tNQzWJsadfJJOmdgekE9maq2kg+4u1nAa8dZMYGW47sgf8GTLxn7QFCvLm2Izo\\nSl3yKQBdYwbxbNhQumkaBXlzeL/CSF0f9B08ADixKY5nE9bx+UGDpVEpLi5VlEv6x/8HQOs7grm+\\nvfnvtUkLtedFz7HTGe3R1K06chtV476sJ6+pLppBvfW06f0IU9t5ochm5fr0S15ZEDV3fMMw2tpM\\niBNM/PmqeudFY5N38hgAGl54eVb8zF4asp6Iq6brCue0uO1emwL06Fcfs1cpfAeFMmRgf/roPKwa\\n/wYyP80C4PqYULqjoThG7qbzAFzZs6vdCiSAb6cA2gIlKp2fzjhYyUpV6abA+BEzIoezPq/Y/BjA\\ntCEO99s4+TPshencruk4b0hn2bjBBPi3poVvVx6JfZUNWc4OozSSd8xc6/Zoi03nyaRgnc2ESB2G\\nrK/yGxOHtKvxpFimM3kcM5mPx8vTy+Zze8dTPrFr42LIzeE05mHM3brYnquq2IvRZcEzarQPDT+6\\n3NcUgD+OGaq9q15djB3pcuO9APxpSuXbI05v1qC5lgYM5O77BYC2g7rT2cv+3XMPvxu4p7Tz5cQZ\\no+XvZzNSeS3bPHorakAwTQIe4el+5uc9Ko7U9eK+2KVE+HqiyCVl5jDu7eJLsybXcm/0ZN51MMGf\\nqBt/lMRxi1aeT+q8ryVq9XG8fIewKGkM/0CjtmmhLuh8biCgl7nEOZKd6xaTJjaYxn11lW3rnryr\\nn+jPXW0081DQJ/QA7HslmR1npGIuREOkCowcTpvJuGe/BqDd4P7cppfhdvWJzieYfk81A2Bf2h5+\\nIJf09zMB6DUwlHYdQ3jkvmaWxn/JyQw2vf8HoGfgXYEX5JicSTe/bE/hX1nmBoCJTBbMS5bHvCpp\\nGTSd9KMf8lrMA1xfev6KDQf49/KpRAR3Z+D8PVV2rhcaDXyZNI1/Jpqr2ndM7F9a8bsUisg3ZLNi\\n0gRWl5xHI5BHQ7pcomMRF4bE2H0Z2bp2MaeBywOHcHcAgD+hg0MA25G6nn6RpOz9infjR3JHR3Oe\\nosjl86SFPNn/Ou6Ntj8/g7hwivLSSXk7XcrRWmgwjfvqlPXkAQyL7F869MeLXhHj6KZp/GVKZN2W\\n3Et5iKIW7E1wZlKZzGxiOyxXNA7WvcK6lq3p3D+BL5UJL98hLJw3xKlJ8s6bNtp9HtiVdYWzfOhx\\nn3miop8+3cSOtHQ++PQcnloYD/TUY66gBQPmxn/mVxlsNpXgrRvC3cHmO0EafvgPbALAzzv3O6wc\\n5B0230Xy0EL5e5uKn7mabgC8fIcwaWwPAPavGcbohOqH/DY2zf36MX7ZhxzMM1GQm82W5Oe539cD\\nMJD2z1V8UWn4snWHfbPWvtxROhFXm6AE5sTYdubYm8CubOIrR+xNqOdoUqzyO8jeXO7bnZg1PwBw\\nf/wbxAbZljP2jicnrofT56sh0fubR8oUq1T2HnBtyKy9GP2ZOadG+1Ac48CnfwHQ3E9v8xiAqzF2\\n5MC+zwC4TBfGTR2d3qxBcy0N6PG/8QoATm/cwyEHz1CXHDvI56UjK65u4wNA8ZFNJL1jfnYqJCbM\\n0gnYccCTlvkTKo/U1bUJYHjcCrIOm/jj5/3sTF3KE0HmciQn6SXel8d2L4iKE+qVT2B7u3aajxY9\\nyD+TjlKbtFBXTMaD5Owwp5iOgf5uMWlig2ncV13ZLu/JA3ihTzPL3f2mgZMsMzF/siT1Ek7SI4S4\\n0FreEMuWPWsJ85NGeH10xW338pDOgxK1lYRxL7HNVMLf+/bjttJOk2tv60s3TcOwPZGp81YC4D+5\\nP7dahurpCe57LwCntsexarvtYzmmgiyWzt9sXrtvJD07Vp8Wqko3TfShzEldyYLFa0ka3gGAT2Y+\\nw8Iv5JGgMiZjxWfsm/sF8GBkAuvfnQw4NwdGp6AwJi7+lO92Ps+tLerH9fvowm/4QOZXqJb12zBW\\nLrI/iWXekdxadYg5s49DaxYSf6oQ0DOsn3NxczXGxcdSWDh/DwDtnwjlNp/6kVYvNVfTQOBdw2iL\\n+Q0pS9fYu/GWS/KilzkNtPCdQe+e5u/+ZtObbDOVAPD+6PL31nteGcbqEvMjW9YjdVWBscLQ+2Zt\\nunDXwFhWrnmLuzUdimyKZEqNi8I8gW0UTw5oDkBWRjY/U/O0UDeK2LlkLm+X/FVh4t76rsE07qty\\nPieJuUnVPznzS/YCNmdUvIoVheQbjRgrLZUrIs6uJ+q/c/m2cTQaa5YuxKVj3St8/nCi+Xntg8t4\\nzc7rcET94NE+hIGDzQV77hFzIX5PeKjlGXbPgBAeC/DGRCZZWebK2YCe3StUvDtHvcCc4GaAgYQ+\\nvZiStJvjxiIKC4wcyUpk0kODmZddhI5gpsQPtXk+3tV0065nNMOCvAF/hi99j1nB3iiyiY8YSeox\\n6SyGIrbNC+TWiBf5V8YBfjIaKSoyD3tOXvMeAF76G2xGUFTusD+UuZGFY3vR1tPOLi4C69ekpU31\\nA2DL/FV8IY/zVUvnFcIzr4XTFvgxbRS9HnqRbQfz+K2oiEJjLjuTxvFI5448krC7xs8467xCmPLm\\naJt9GAuKyDccYPP8cO4f/j4A/3j8DUaG2N6Jr02MC41GDmcsZHDvx8vn3xgXVqtJAhsSV9NAq5BJ\\nvBXrB0DK6DsJn/sR/zMYKSwwcupgGi9H9CFq/e+AnmGvP8OdXholZzaxbHr15bv1SN1DG57g5tAR\\nvLVpD8dL8yajMZePEhP5jzLhofW3yZvEhWF+DC6Jd7b8AUBzP1+upGZpoTJn6vUVFJvLqHcnDSBi\\n5k4AbopJYGiAm3TWKaUUUGFxH3kqKaKVAlSH8LXqtN11ClXadD8FqKa6aPXRzyabNUrOpqtx7S5T\\ngLou6n31m1Lqs/grbM6L9XJz/C6lXFivPnLfuJepOv4mlalmNvGuFAf72/yZOafKODb3SFDfKJNb\\nx7uMu8f9eHKEApSnFqY2nrC9nstiVBazMgeTH1dtQekIVgszz5X+tTw9VBd719atf9wl7gcTH7Ic\\no4cWqtYdrng+s+bdbvn8Ml2s+jTf9nwX/5yupoW0dxinJvpQ9dK2XytsU9N0UznvOZ+brCJ8PRWg\\nruq3Qv1QVyemhi513EvOblWjPZo6jIWGvxq//vvStZ0p08tZ59sLM23Tgb28ovhEsnpI5+FUPm69\\nbnTyKavflKlmBZvLlq6Pr7XEuLpypPL3XEiXOu62CtV/E0epDmgOz02nAfPV3rOOz3sZx3Gvfh8B\\nUSvU/86Wb+FqjJ1JP/byl4ul/sXdmvNpQCmlSs7uV8ujOlWZd4xN/E4VlX57WdmhEaiWZdsrh4+q\\nZf1bKkBdEThffav2q4XBzauIpV49PGeX5fvLVFcHuRTqd9wrqq4eTWl5ax1DV9OCUnVXr7eXb9QX\\njuLe4O/cW7/+7p6Xx9C/jW2vi65FCLGz7wfg2DuJfOjEq5GEEO7l+sh5vD68AyYySYh50eYZX1E/\\nXNfzEe7WzEXT3++zHTYf2PMR2pb+29GwV482IbyS/i2Hti4lJrwHHUqfu+wUFMb4ee+z78AOZvRu\\n7dTxuJpuPP0iiV8QablD1difv9e16MfyMwfZnDiFJ3uXx+KyjsGEx7zKv7/9htfCr73ER+kaXYsg\\nJi+O43ZNx/41w5iZdPRSH5Ib8KJb1Nt8n7eDN6eO5N4bfQHQ8Kdn+Bje2vo9X2+ewk0t6mIfu3k3\\nvnwfnvou9ImazLvpp8hOHElnJ/ZRkxjXJH9pXFxLA7oWXXg68RAnM5N5IaqXZTLOq24MZfTUlXye\\n9z2Lo7pyGWA9afa1Uc85uMPqz9AJMbTFPFL3/e1+TPjPEXYmLyAmvPz7y9PLHj6YLo/dXEyXdQwm\\nImYJn+XtIsYqhq6khbpSk3yjvtCUUkrTKl4ESkmltzGQuDdOEvfGSeLeOEncGyeJe+MkcW+cJO6N\\nk6O4N/g790IIIYQQQgghREMnjXshhBBCCCGEEMLNSeNeCCGEEEIIIYRwc9K4F0IIIYQQQggh3Jw0\\n7oUQQgghhBBCCDdnd7Z8IYQQQgghhBBC1H8yW74QQgghhBBCCNFAeJ44efJSH4MQQgghhBBCCCFq\\noKxNL8PyhRBCCCGEEEIIN1U2LN+zqg9Fw1a5U0fi3jhI3BsniXvjJHFvnCTujZPEvXGSuDdOjm7O\\nyzP3QgghhBBCCCGEm5PGvRBCCCGEEEII4eakcS+EEEIIIYQQQrg5adwLIYQQQgghhBBuThr3Qggh\\nhBBCCCGEm5PGvRBCCCGEEEII4ebcqnFfciaNp666DE3TuC9hN3/arGHgvSf80DSNm2M/4nerT87n\\nLOJmnQ5N07hlxg4720LJyRQe9vBE07QKi067lrsjnmFFRp5T62uaRufgQUyYv5FDxjo9BY3WX1lz\\nLed2UZZzr/hQ5DC3e3M0TaNlu+fYVWRvOwPvPPo3u2nG/B1ZzGraDE3TCEjYbbNN5cWrUw8iYhew\\nZV9+bX5uA2fk200LiY24Ez/NfE22v6kXMQnr+MpQHqPqYv5DyqNomkYT3SBSTyqXtmnh+SJ7sN3G\\nemni25W+0S86jKXJeID188cyMPi60m186RY6knkpuzldXL7e5wltbPZZrjwt+UWs42cXz2RjYJ3P\\njkjJq34Dqr/2y2JS3bIoSzlMH5XXE3Wj7BqtbhmRkudymV2RkfdG+KBpGp66B0g+UjGG/7foHpv8\\nxdrZr+dyh84DD60Hy3Mk/s5zXH52Dh7EpCU7KuSfzl3/Veej1uW4ve9wLi+vah9FfJ5wN5qm4aH1\\nYOEXUv47oy7q0Kc3PWXZZmjSUbvruFrGV1c+2C/LhTN+zEohPvo+bvDVWerMfaNfZENWxevSUQzM\\ndUXbdGGvnlWevnz55xbba9JefbGhtOvcqnHv0aYfk2b3BeCzWS+xsVJh/Pv2RYxffRwPrT/PTupP\\nK8snRexYv5i9pe993PvyMj6yU1g7oshl54aljA7tziNz7XUq2Dqclcrr0wZzY5dezNkuGf2lcDYj\\nldeyzwFQkDeHxE2GKtffu3wk01LsFw7O+vNIJhuWT+Ghm7ry0MwdNp0FjV3JmQyeDb2JbmGTWb5h\\nN8dLM+Ef96Xz5sxhBPneybNbaheDulJsOMAnSXE8fNMtTNhQ8Zh+3j6T0C438ui0N/ggq+wzA99m\\nrOLZIXdyQ88xfHpMCv9LxdVrXzQszpTZxUc2kfROAQAlaiuJKZkV1rtt1GzGtbuMYpXKS4vTK31H\\nLmtnzeVLZSJgagLRAfbfNSxcczgrlUXj7uMfPV/k64KLk3/WRV7+v5TRRMzcCegZlbyWSXe1vuDH\\n3dA5V4fOZePKFMv/Pl6czDd2b+LYV1UZL+qWqeAAb0Z3pn3wEGYl7eB/pTdy/jySySdJcUQEt6N7\\n9EZOVPM95rriYLrfNoKPnK5jGXj9qWdIrWWdzJ3adW7VuAfo/Ph0ZgZ6U6K2Mic+1dJ7qshh6aw3\\nOA3c+8JzDOpYXtiWnEkjZd6Plv8Xq1TeTMmucj/RyadQSqFUIb/m7WF5VCfAwOYZz5Bop5e+fH3F\\nufx8DqUv4OGOHpw3pBPX5wHp2b/ojGxdu5jTVn/59/x1fFdlb6uBFUOGsSir0Om9dAhfy+nSuJsK\\n8/klN5254R0BA1sS7mPIoj01/QENjirKIeGhB5iXcRIdwUxO3MWx/EIKC/M5mZ3M+JCraOrrzx03\\n+V+yY1yYaTJfx+cL+SV3K9NC2qPIZfljL7H1jDntnP16Lg/e/xKfG0y0Dopldeb35J8t5Fx+Hl8m\\nT+UevQ7fTj3o3F4q/JdG9df+PXFnLPm1SWUys4k3ADfH77L8XSnFxKCKMbSkj0pL5fVEzV0T+S+r\\nc5tHUoS5m946r1VKsSrSt8J2rpbZ32x6k22mEsv/d85exY4z5evpWoQw+dWHAciZH8fyr8vLhdNb\\nXmP21rN4amE8Ny6Uy+ryBDQi1jE9l5/H/yWOogMaZ7LimLG86jpaXaiLvPxs1lyGD13HafSMensH\\nr0dee8GPuyGqSR36fM4HvJlWYPn/rzlxrE0zVrkfZ8r4Ms09EvhG2eb5BcXP0x3J851nYP2YfsQk\\nHQb0DJ7zIQfz8ik8a86r35l4H3/Hn7v7BXJ1pS2tY2A6m8+hrXHco9fxx5FExsenOn0DrSgvmaci\\nX3Kp09Cd23Vu17jXvIKY/MpY2gLfrXmGpdvNBe6JlLnMyDxHc99JvDAxuEJhe2TLO6wuOU9z30kk\\nxN0CQOaijQ6GaVfmRWt9IKPmvcJwjyYosvkgo+pCx9vHh04hk3h/+xoifD0xkcmCxc4nQlF75Xdl\\n9EyJf45umsYv2QvYnFFU5XYmMkmIqdldA83Lh8v9Qvjn+m0kDe8AwPYpS20KjMbqUMosXsgsRCOQ\\nF3fu4NWoHnTw8cLLy4erAiJZuHk7WbvXEeZXDwpNTy8u9+vHiwsn0U3T+MuUyH8yjVjfsWsdMINt\\n29/g8aBr8WnhhbePntsi5/FRxjekJQ7lGs9L/SMap5pe+6KhqL7MNhVlsPG1vQCExScw3KMJf5kS\\nWbclt8J610S+zLL+LTGRyasz13ECUEVZLJ21gtNA+FvzCZNOvDrh7aPn9qh5vBxt7sz5v0Vbq+mM\\nr63a5+Vns+YyYODzfKlM9I3fyJJRXaWjpw44V4cuH5Gr75fA7CgvADasqP7uL1BFGS/q2u8Zyxi/\\n+jgAT67exYbpD3C93gevFua8+omF2zmQt4fXwqvuGNNa+NCpXzyvTLoVgJPvpvOV0fk84kxWHM/O\\ny3Rq9HVl7tauc7vGPUCr3hN5JaIVYGDZzKXsNaazYMq/AXh0wRTubFFe2CpySF3yKQBdYwbxbNhQ\\numkaBXlzeL+aHj5ruja++OnMOfxPBc5VEj39Ipk0tTvgeiIUtVN2V6aV7xgee34QjwV4AwZWrdla\\n7cWYnzOHJ2KTnSsg7PJn6MTxUmBUYCDz488A8O0dy7C7vG3W0LXows1+F/eoqqNro8dPM2eTPxcU\\nUXIyi48/Ng/37hU7gltb2Fbsm98QIA37S6g2175oOKoqs8+kvcf8U0V4amEMjRrDwKeaA/DJktRK\\nDUp/hsVNp5um8WNaHG9syePQmrnEZxdyeUACkx+/dKOMGiYffP3MMSs5TY0q4c6qbV5+9lgKI8Nm\\n8rnBRNfH1/J2XA9p2NexqurQ1iNy+z8+gpiBowE4lbaMD124o1q5jBd1L/uLtZwGWvjOYGS4/Tyz\\ntd7H6e/zbe8HQIky8FtB1etWlp4wiPG1ePzWXdp1btm4Bz1Dp8/mdk3Hz1lTebrf8yw+9SdXBs1n\\nUqS+wpplz15qBBI1IJgmAY/wdL8WgAs9fIDpTB7HTOaZVbw8vZw+0i433gvAn6ZUvj3i9GaiFqzv\\nytwxsT+3aIGEjb0PgGPvJPLhEfsX49XhS3g3/i4A9q8Zxmi7kzY6x+OGAO7xaArAZ/tyq1m74VMc\\nI3fTeQCu7NnVZuhVdSYF62wmN+kwZH3dH2glpjMGjikTAE09oeTkMTaXDuXt4eLjA3+UxHGLVvl3\\n+BK1XpqcdaWm176z7KXD8ok2RX3iuMwuf063w5NDuK99a0IHm0cD2hvh0TIohhdiOgAG3pg5iOEz\\nPwT0jIofwy1ecte+bhnJO2aOmUdbLmhjuTZ5eYHxI2ZEDmd9XrH5EbNpQ1wu04RzHNWhy0bkNtVF\\nM6i3nja9H2FqOy8U2axcX3mODMcql/HW7JfZMoGqawzk7vsFgCvu6kpnO3mmKjJiNBoxGp3rXMk7\\neQwADS+8nLyRMmzZWmYFmzv6XX38tjJ3aNe5aeMemgTE8MKUawDIzMoE9MTGj+EfFZ6DKX/28vLA\\nIdwdAOBP6OAQwNkeviLyDdmsmDSB1SXn0Qjk0ZAudf57RN0puyujEcjA3oEAXNfzEfroPChRW3ln\\nk/3HKnS0pm/casuQ+m0zp7A065eLdtyi9jQvL7ppdVDhLi7i12NpPB87g71K4amF0TtYX/124pKq\\n6bUvGpKqy2zr53QHDAilFdAiOIQn2nlhf4SHDw9OnEkfnQfncjL50mDiqn4JjBkgk6bVpUKjgS+T\\npvHPRPPZv2Ni/0r1uap44dPm4lVnf9mewr+yzJ0QJjJZMK82I/2Eq6xH5F79RH/uaqOh8wom9Alz\\nGb3vleQK82fYJWV8vXFi01O0bt2a9m1erfItBKrAyOG0mYx79msA2g3uz2165/KIpj6hPJ+8yjKk\\nfs7EBXyV33A7ady2cQ9e9B43h4d0HgB0CH+VMb0rDvW1ng03JCbMUlB0HPCk5Vk8Rz18iUPalfbS\\neXO5b3di1vwAwP3xbxAbZDuk2JED+z4D4DJdGDd1dPEnihoovyvj2zuWB0tnMfbsOJCoJ80jNqqa\\nb0HDn+FLkxjX7jJMZPLswJG8ed71Hr6Sgzl8XvIXAPfeKEM3NfzwH9gEgJ937ne5ImRvIrPjyRE2\\n61kPsTt0wnaG9DzDsSr3Y7kz28SbK/z7My+zCNAzYp352VqP9n6WPGf3t66NyLA/OU/5hGGitmp3\\n7TvDXjrMietR+0MXteZcmV3+nK63bhKD+/kAoPMKYdCEboD9ER6eHSOZMds8X49GIJNnDpU7tXXg\\n+IZhtC29G9qstS93RK/gOIo2QQnMiQl04Zt8aK0358v5X+RyulIDQRnzMVhNngjUKi8H8PIdwqSx\\n5mu/tiP9hGP26tDWb0MZFln2ZiwvekWMszwOWXn+jDLVlfHWHE2oJxOoukKP/41XAHB64x4OuVj+\\nWo+e0LVsTef+CXypTHj5DmHhvCFc6cJ3efpFsuLdSbTF/Pz94OglLh1LGXdo17lx4x507f0JKB36\\n7HOTv02QrWfDfX/0dZYhNZ5XhrG6xDxE2KkevlKPLvyGD1x4rqr4WAoL55tnS2//RCi3+UiGcKFZ\\n35U5tX0U11iGUrUmMvE3gGrnW9C1COHFjbO4XdNRYjBUmHXbObmsW/Q6e5WiqS6au4N9avJTGhg9\\nwX3vBeDU9jhWbbftMFHFuRw7Vru96Nr7E6A35wlfZu+3eX3Vnk8PANAmzJ+rnbgrpNGFaZv38Gbp\\nDMge7YPo27cZAGmzlrLLzsSLJcdy5S7OJVAX175oWCqX2dbP6RaaFnKXd/mQ26BpX5rXsTvCwwv/\\njn4AeGj+dGjv/KN5wnmdgsKYuPhTvtv5vN1n4Kvi37EXAH8YMvlvpaGyBdmZfFDyF6DnRn/z3dna\\n5OVN9KHMSV3JgsVrLSP9Ppn5DAu/qPlQX2HLfh264ttQXujTzHINNw2cZHnlte38GfZVLuNF3Qu8\\naxhtMee5S9fU/jHVljfEsmXP2hpNvtyq9wusj+8JgMHg+ity3aVd59aN+6qUnNnEsunVD8F01MNn\\n/VqdtKl+AGyZv4ovnOgIKDQaOZyxkMG9Hy9/JmtcGHJ/rm6cyy97Psd6KQKMbFzygiVzr0p18y20\\nDJrO6nVDaevCcakiI78ey+DliD5Elc4M2vvVMfRvUz8v/outc+QLlmeeEvr0YkrSbo4biygqMnLq\\nYBovhN1Nlx5Da/UuUo0AQp++CYCcuXE8n7KHnwqKKDTm8snc8czeehbQ89jj/e32+JbfmT3Ksv4t\\nURwgaY71a9T8GfbCdG7XdPyRt5ABvZ9hTdZRjAVFFBoNfJs2hwd6dKLv8HX8UFzjnyEcKCnIt3Pt\\nG/mzDq994Z6cKbO/TnrZ0rFfldqO8BDOqfx6w0OZG1k4thdtHTxH6/j6h6t6PsJDpY/fzJ70Ev85\\nZqSoqIgfc1KYNuMVTgNXBk2mT1DZt9U8L2/XM5phQd6AP8OXvsesYG8U2cRHjKz1u7RF1XXo8zlJ\\nzE2qfp4aR29Iqb6MF3WtVUgsr5d2gqWMvpPwuR/xP4P5+sw3HCAz23GD33r0xPnDifTReXD24DJe\\nq+Z15o55cU/cu5ZOOWe5XbtOKaWACou7MKlMNbOJtwLUzfG7Knx2MPEhBSiNQLUs22Rn66NqWf+W\\nClBXBM5X+5RJFZ9IVg/pPBSgopNPWdYsOZupZgWb99P18bXqh9K/W6/vaGmiD1Uvbfv1wp2EWnCn\\nuP+ZOafK89zcI0FlHl6p+pTGo/e8b+x+z8G3K6eLPJUU0UoBqkP4WnW6wtqF6rP4npZ9lKex8m0c\\nL3o1IO5T9duFPS01cinjXvxzupoW0t7hedMRrKZt/l4pVTHmCzNtr+HjyREKUJ5amNp4ovzzkrOZ\\nalao430ERr1vuYar2s/53GQV4eupANU3fpcqstrm9LY4dY9e53AfrYNi1fZc83d9Fn+FJY1+oyr/\\njqrSX91yp+vdWnX5rKcWpt7bWZNr36yqckSp6vOeyuVFfeOucTer+vpwpcwuKUxXU9t5KUBdF/W+\\n3bz5t23TVNvS8zQhtWK57Si/qa/qb9xdy/Ocuf7L4vG/9aNVBzSHdbGFmedsvt/5vNzxcVuXFVf1\\nW1GhfLnY6m/cbblehy5UadP9FKCa6qLVRz/bXoclZ9PVuHaXVbjOXS3jy8psZ9JcfVHf415ydr9a\\nHtWpyvPaNniJOly6vqN608Hkx1Xb0rqi9fVsb31H5YP5eMrLCOt04W7tOkdxb5B37q0n27g26jmG\\nBti7c+rP0AkxlhlyN2x3PEujrkUQkxfHcbumY/+aYcxMqv41Cp2Cwhg/7332HdjBjN4y8c7FsL/0\\nMYymumgmRNl/Xq9T5ATGtbsMRTYrk9Opem5OL+6eurj0brNzLusYTHjMq2z+dj+b43vV3169S8Sj\\nTQivpH/L3tQFxIT3oEPp0Pirbgzl6fi1ZOXt4pUBtRsep2sRxKxPvuKTxc/wSFDZd+m5KWQE81K/\\n47PEQU49L+vpF8n81yNpi3nI5YKMfMtnV/aOJ/3APv41z3YfryTv4uDOpdxXgyFjomYOf7zc5Wtf\\nno9tuOyV2daTLTq649Kq99PM7t8SkBEe7qhz+Ft88+1GXojqxfWlE21d1jGYiJgl7Mj+lIl25kuq\\ni7zc0y+S+AXmsuLHtFHy/H0dsFeHtn6s5p6X7Y+K1LUIIXb2/UD1b0ipqowXdUvXogtPJx7iRPoq\\nJla6PvtETeadrd9zePczVPcI+/WR83h9eAdMZJIQ8yJfGB3Ht+rjKS8jnOVO7TpNKaW0SrNLKyeG\\nNgr3J3FvnCTujZPEvXGSuDdOEvfGSeLeOEncGydHcW+Qd+6FEEIIIYQQQojGRBr3QgghhBBCCCGE\\nm5PGvRBCCCGEEEII4eakcS+EEEIIIYQQQrg5adwLIYQQQgghhBBuzu5s+UIIIYQQQgghhKj/ZLZ8\\nIYQQQgghhBCigfA8cfLkpT4GIYQQQgghhBBC1EBZm16G5QshhBBCCCGEEG6qbFi+Z1UfioatcqeO\\nxL1xkLg3ThL3xkni3jhJ3BsniXvjJHFvnBzdnJdn7oUQQgghhBBCCDcnjXshhBBCCCGEEMLNSeNe\\nCCGEEEIIIYRwc9K4F0IIIYQQQggh3Jw07oUQQgghhBBCCDcnjXshhBBCCCGEEMLNuVXj/vOENmia\\n5nBp4fkie1CUnEzhYQ9PNE1jREqezfeUGLJYnTCKkJvaoWkaOu1a7uozknkpuzldXL7eX1lzLd+9\\nKMv2tRI/pDyKpmk00Q0i9aSy/L+6xd4xibpTFn+d1p1FWYVVrGngnUf/hqZpBCTsRpHD3B7N0TQN\\nv4h1/GyzfhH/N/ceNE2jbfCrfIe8aqSuObrG29/Ui5iEjRwy2t9OkcPc7ubYtWz3HLuKbGPj7PVc\\nlo+UMZ3JqZBfaJov3UIHMWnJRxw6Y17HOs+R6/7CcJQ2mvh25f7oKazOqOr8GjmctozYiDvx03Ro\\nmkbn4EFMmO84TQGYjLlsXjKWgcHX2cT+eBXbCddUV7ZbX7fVXcc/ZqUQH30fN/ia4+zVqQd9o19k\\nQ1ae3X1Wvt7NysuGsrLAlWMUdcc63rVJF/byd0ff3cS3K32jX2TLvvyL/XMbhOrKTFfqyo7KVp12\\nLXdHPMOKSvl+TctiZ+oQ1vnCfQm7+bOKc+CoPiFc40z9y15+DeV5tv36uv1tGgq3atzXXhF7k0Zz\\nnW8Pnpi5ks/2mS9wRS67tq/i2SF3cm2XEXx0TC7EhkCRzYL4dZxw8Pnv2xfx7PrfLf/XCGDMC8/Q\\nFji+YQpLt1fsGCg+ksLM53cBemLjx/AP7L9fUtS9H/el8+bMwdzcdSipdq7PsxmpvJZ9DoCCvDkk\\nbjLUyX6Lj6UQ2e22CvkFGPg2I5VF4x5k9qajdbIfUXPFhgNsS1rAE6HtCIxeyaGCip+XnMng2dCb\\n6Nx/DMs37OZ4aSF/OCuV16cN5sYuvZiz3bYS//P2mYR26cjD497gg6yyOJfHvlOXXtV0HoqLyVRw\\ngDejO9M+eAizknbwP4M5zn8eyeSTpDgigtvRPXqjw/JAiDLFhgN8khTHwzfdwoQNkse74mKVmYpc\\ndm5YyujQ7jwyt+qGtjNcrUN8NuslNh6x31YwFWSwYMq/a3lEoq7S0s9ZU5mSkFnrNOJO3LJx39wj\\ngW+UCaVUhaWg+Hm6V9Hg+mHDaHpHr+A4ik4DEvjkwCnyzxZyLj+PL5Onco9eR+ee/enmV7NG2zWR\\n/7I6njySIloB0CF8LaetjnNVpG+Nvl+47se0OJZusa24K3JYOusNTlf6e6veE3klohVgYOnMBewr\\nKvvEyIeL4tlmKqFD+KuM6e19gY+8cbO+xk1n8zm0NY579DqK8pKZFp/K7xXWNrJ17eIKsfz3/HV1\\nMLLCyIfzY1mfV8zfAmJZn30KY6E5v/g2PZnZ4SMY3M/fZqvo5FM2eZNc93WnQv5/vpBf8/bwzsT7\\naAvkJI0ifNpHlvShyGHeQw8yL+MkOoKZnLiLY/mFnDubz+HMVYwPuYrzhnTi+jzAa1+XN9TPfj2X\\nB+9/ic8NJloHxbI683vy8ws5l5/PofQFPNzRg6u7hNDzRq9Lcg4amnvizliuE5PKZGYTc/56c/yu\\nCtfQxCBHZbOB9WP6EZN0GNAzeM6HHMzLp/Bsefr4O/7c3S+Qqy/ZMYraWphpW++rq3Nu+e7zhfyS\\nu5VpIe1R5LL8sZfYekZu+DjHuTKzpnXl8rLVfF0vj+oEGNg84xkSc2xj5HxZ7HodokRt5ZWFWyvV\\nRcy+WjGbxacaU1PyQqhZ/cuRj2cOYnxK4+moc8vGfU2YijJ4Y8IGTmPOQHZsfp4+N/ji08ILbx89\\nt0XOI/3bH/kscVCNC39RHxlYMXMp31QaYnUiZS4zMs/ZWV/PsJdeo4/OgzNZccxZY84MzmYtZ9by\\n43ho/ZkzZwhXXoQjF2ZaCx869YvnlUm3AvDDO6l8YSiPZ/GRTSS9UwDomRL/HN00jV+yF7A5o8jB\\nNzpHcZDsFeYC+poBQwkP8OVvXub84saQSGatX0lYe6nIX1KeXrTWB/LEwi2sj+8JwLfL41hXWtE7\\nlDSLGZnn0AjkxZ07eDWqBx18vPBu4UPHoGgWbn6faYFemMjk1Zllo3xyWTtrLl8qE60DZrBt+xs8\\nHnQtPj5eePv40ClkEpuyT7J78/Pc2kLiXx/8nrGM8auPA/Dk6l1smP4A1+t98GpRlj62cyBvD6+F\\nX3uJj1TUe55eXO7XjxcXTqKbpvGXKZH/ZBov9VG5hYtXZpqv61HzXmG4RxMU2XyQkV3jb6tpHeLb\\n5XGsqjR6q+RkCnOm7KrxsQizuk9LBlYNnWp35GdD1Gga98U5Wbx7qgjQ81RMmN0GvK6NnlYX+8DE\\nBfdrThwL1uRa/l/dkCnPjpHMmH0LAP+etYBPDbmsTZjLXqW494XnGNRRKvSXgm97PwAURRRZzY3x\\nzaY32WYqoZXvGB57fhCPBXgDBlatsd+r7iyNv6MP8QTg4Io4xizZyH+PGRvV0C734UXPsdMZ7dHU\\nqqJnIPPjzwDw7R3LsLtsR9voWgQxZupDABg+TmHnEUXJySw+/tjc8ddv3Ai7DXithZ6/t7hgP0a4\\nKPuLtZwGWvjOYGS4/bs5rfU+F/WYhHvTtdHjp5mryD8X1K6juLG42GWmro0vfjrz/n6qRYxqWoew\\nffSziO2LZ7DZVFLjYxFmFyItFatUnop8ia8LGn4Dv9E07g25OZwGPLUeXN/J3lDKIoxGI0ajsULD\\nocykYJ3NpBwdhqy/0IctaumZqZNpC2x4aiqpJ80XdNmQqfbhCcwOtze83ou7YmYzul1TzuUt49mB\\nQ5m99SzNfGOZHhPMZRf1F4gyeSePAaDhhZc5z8dUlMHG1/YCcMfE/tyiBRI29j4Ajr2TyIcOnolz\\njj/DXpjO7ZqO84Z0lo0bTIB/a1r4duWR2FdtJugqkziknU1e0RAnbKlvdD43ENDLfHUeyc7lNLnk\\nbjoPwJU9uzockeXbKYC2QIlK56czUHLymKVydmsX+w3FwtKy4jep89cDBnL3/QLAFXd1pbOXbWeM\\nKjKWlu+2AfujJI5btMrluy9R62vTNSjcnemMgWPKBEBTz0t8MG6jZmVmTZnO5HHMZK6we3na1uud\\nKYtrWoe4duwkxrW7jB/TRjG7dIK+8znLmfXqD3hqYSTED6rDX9oY1V1aauYxg7XJQ2kLnMmK44nY\\nZH64cAdeL7hl495+YVy7WWpLTm7iiSva0Lp1a5Z/3fB7dRqLa8Mm80pEK4pVKi8tTueP0iFTOoKZ\\nPmMIHbQmdrfzaNOPSbP7ArAnK5PTwMMvTKZXG7lrf7GpAiOH02by7MKvAbjmyTDu0pvjcCbtPeaf\\nKkIjkIG9AwG4rucj9NF5UKK28s6m8qF6mpcX3TTX4tcyaDrpRz/ktZgHuL50n8WGA/x7+VQigrsz\\ncP4euZPfyCiyeLltO1q3bs2kTfIGBHdwYtNTtG7dmvZtXpWZq92YvZssAQm7gZrl73YVF/HrsTSe\\nj53BXqXw1MLoHayv/fc2EhenzCwi35DNikkTWF1yHo1AHg3pUqNvcqUOYa3llYOY/OrDAPxr8qt8\\nUWBg3dzZfKlM3L/gOcI7umXzql6pq7Sk4U2XyBWWR/f2r5nCSw38+ftGk/r0/ua7M8Uqlb0HXL/d\\nYm8il+PJEXV/oKKOlT9DnzM/jgHDJ7PZVEJI/KtEBzSrcsvOj09nZqD5zv7lAQlMftz5yTtE7Vh3\\n4OlatqZz/wQ+N5jw8h3CvJlhpY/P5LJxZQpgHnb9YIA58/fsOJCoJ81jpjMXbbS80sZ6mOWhE7Yz\\n4eYZjtk9luZ+/Ri/7EMO5pkoyM1mS/Lz3O/rARhI++cqvjBWbCzYm8Tn2PqhMk/DBWYyHiRnh7mo\\n7xjoT1v88R9o7rz7eed+h7Ok5x02j+ry0EL5exvwaO/HQzoPAHZ/m+tgK1F/6PG/8QoATm/cwyG7\\nr7ByzP4EveWTfAn3UNP8vYyl46CJN1f492depvkxzhHr5svcKi5ytcx0VvmdeG8u9+1OzBrz/df7\\n498gNsh2FGb1ZbFrdYjKrol8mWX9W/JH3kKefWgoz67/ncsDEnghJhBveZtSnai7tOTFPXHvsqx/\\nS8DA20MGMf0/DXd0lls27h3Nll/VjKmeAUE80c48bGflIsevRxMNj2fHSOJfvBMTmWRk5FmG11c3\\nz7Xm5Yd/J3PjoGUnf66xM9xTXBxX3RjK0/Hv89/96wgrfZvF+ZwPeDPN/N6zU9tHcY3lbk5rIhN/\\nA8yvtHk/zQiArr0/AfqmAHyZvb9Sj28uez49AECbMH+uLi2YTcaKz3g19wvgwcgE1r87GYASZeC3\\nSq9eE5dCETuXzOXtkr/QCOSRkEBAT3DfewE4tT2OVdttX1tnKshi6fzNAOj7RtKzo4ZH+yD69jV3\\n/KXNWsquRvB8nrsLvGsYbYFC00KWrpEOmYbK3k2WnLgeQM3y96podGHa5j28GSmTMLriYpeZjy78\\nhg/ietTocUlX6xC2yoeO785I5zR6RsWP4RapK9aJuk9L/oxa+hYRvp6AAUPdvDG5XnLLxn1N6LxC\\neOa1cNoCP6aNotdDL7LtYB6/FRVRaDTwXWa25fkq0dB4cdvY2YxrZ87+ZXh9/Ve5A+/ktztYHjeI\\nzj5laxjZuOQF9qrqG14bVpjfba0RQOjTNwGQMzeO51P28FNBEYXGXD6ZO57ZW88Ceh57vH9pz34R\\n2+YFcmvEi/wr4wA/GY0UFZmHAyaveQ8AL/0N/L1Nnf984axiczzenTSAiJk7AbgpJoGhpXdgOke9\\nwJzgZoCBhD69mJK0m+PGIgoLjBzJSmTSQ4OZl12EjmCmxA8tfS6/vML2R95CBvR+hjVZRzEWFFFo\\nNPJ91m5ySv66VL9Y2NEqJJbXh3cAIGX0nYTP/Yj/Gcqu1wNkZkuDv6FzPX+vqLzj4CjL+rdEcYCk\\nOXXxStXG5MKWmdavwkub6gfAlvmr+KJGryp0vQ5hT8tbJ/LClGsAuKpfAmMGtK7BsQhbFyYtefpF\\nsjI1ntu1ht38bdi/rpJrwt9me+IoOqBxeEsc93dph4+3N81a+3JzxHz2KoWOYP4msyA3OLoWIUx+\\nYzR9wucz43HpiXd35a+ugd7zvrH7LtuDb5tnQT+VtowPcxTgRc+JrzMrtL351WdDbkHf0ptmra+l\\n74wtnAYCo96wFM6mggw2zTvFvg1xPBbaFX3r1nh7lw8H1PBnxOsjuLNSL729SXysnw0VtVNhzpUm\\n5ng8uehTTgMBUSvYMO8By1tPNAKYtvlDpoWYY74g+k78WnvTrGVrOgWP4PWMH2miDyVh20dMuLV8\\nWGfLW6fz4SfPcY9eR37WMoYHX0frlt40a92aTsGTSyfc03Olj7znvn7QE7E0zfLe6/dnPMgNvmXX\\na1cem/8VAM1v96GVDJdtoFzL3x0rv7v3c9ZUpiRkyrwqTqppmek6L/rMTGFWsDfn8pYxblKy3cZ3\\nVWVxzeoQ9o+l97iFPN07jBmWDmJRWxcyLbUMms7qdeYJ9hqqRtW4By+6Rb3N93k7eHPqSO690RcA\\nDX/u7D2C6YkfcjR/N9E3SuHfEF0zcDGfrJ/CjVIfd3tlr65pqotmQlSg3XU6RU5gXLvLUGSzMjmd\\nPzG/+mzWJ1/xyeJneCSorJNHz00hI5iX+h2fJQ6yFM66Fv1YfuYgmxOn8GTvHnQobRRc1jGY8JhX\\n+fe338h7s+sBT30X+kRN5t30U2QnjqRzpc5ZjzYhvJL+LYe2LiUmvDyOnYLCGD/vffYd2MGM3rYV\\n/it7x5N+YB//mlc5rYQxft5avsw7xcv95C5NfaFr0YWnEw9xIn0VE6N6WSZguqxjMH2iJvPO1u85\\nvPsZOl7i4xQXjiv5e1U8/SKZ/3okbYFPZj7Dgoz8C3jUDcfFLDN1LYKYvDiO2zUd+9cMY2aSaxOk\\n1aQO4Wi2Lo/2A1m+bSOxt9p7+5KoiQudlq6PnGcZ7dUQaUoppVWaYVQ5MUxFuD+Je+MkcW+cJO6N\\nk8S9cZK4N04S98ZJ4t44OYp7I7tzL4QQQgghhBBCNDzSuBdCCCGEEEIIIdycNO6FEEIIIYQQQgg3\\nJ417IYQQQgghhBDCzUnjXgghhBBCCCGEcHN2Z8sXQgghhBBCCCFE/Sez5QshhBBCCCGEEA2E54mT\\nJy/1MQghhBBCCCGEEKIGytr0MixfCCGEEEIIIYRwU2XD8j2r+lA0bJU7dSTujYPEvXGSuDdOEvfG\\nSeLeOEncGyeJe+Pk6Oa8PHMvhBBCCCGEEEK4OWncCyGEEEIIIYQQbk4a90IIIYQQQgghhJuTxr0Q\\nQgghhBBCCOHmpHEvhBBCCCGEEEK4OWncCyGEEEIIIYQQbq5BNO5PZiQyKfo+bvDVoWkaXp168Gjs\\nG2w/km93fUUOc7s3R9M0WrZ7jl1F9l4ZYeCdR/+Gpmn4RazjZwf7LjmZwsMenmia5nAZkZJXZ79V\\nmH2e0AZN02jh+SJ7qBw/+7H7K2uuJSaLsszbWMevcpxMBVnM7tEMTdO4MvhFvjYqifdFZh2ziosv\\n3UJHMiNpB6eLq/oGI++N8EHTNDx1D5B8xNHrYYo4nLaM2Ig78dPK85G+0S+yISuPP+0cT1kasvZD\\nyqNomkYT3SBST8qraKrjOL5apfPsXH5czmgTz87Bg5gwfyOHjI63Mhlz2bxkLAODr0PTNHTatdwd\\n8QyLN+3nd5u1y4+p8uLVqQcRsQvYss9+GSRAkcWsps2qjX9ZHl+W51e3HpSXD22DX+U7J8sHANOZ\\nHFYnjCLkpnZW+cwgJi35iENnzOtIGVD3rM9p+IqjNp+X5as6rTvLcyrHszyP/8e0HRTZiW91acc6\\nr5E8/mJwnHd2Dh7EpCUVy3VnY2KdB5RtU12cVFEWs7o3q3TdunZ8ou5Ulb+Wte12GhzH83zOIm7W\\nmcv8W2bssNTdwPUyx525dePeVHCAN6M7c3XoCBYl7eB/pQH/80gm65ePpU+nrjy2aE+F4AKczUjl\\ntexzABTkzSFxk+EiH7mo/3JZPeYxXsgsxMt3CG+lPMetPvbfJykuBQPfZqxibvR9XNtlBOsOFtpd\\nq/jIJpLeKQCgRG0lMSXTJj+AIj5P6EPn/mNYvmE3xynPRz5JiiMq7FW+LnDvjL4xKTmTwbOhN9nE\\n83BWKq9PG8yNXXoxZ7tto/vn7TMJ7dKRh8e9wQdZ5gaGIpedG5YyPuwfBIY+xxdnnEsHfx7JZMPy\\nKTx0U1cemrnDTseAuBh+zprKlAR717yt4mMpRHa7jSdmruSzfeWV/G8zUlk07kFmb7JtdIq64dE+\\nhIGDmwOwe0M6Jyp8amT3p58AoMgm/avcCp+ajJlkvGvO/8N798DrIhyvuHAOZ6WyaNx9/KPni3VS\\n7harVF5anO4wDzi0Zi7x2fbrDxfj+ITzLG277sNIPWbv3BexY/1i9irzZ3tfXsZHjbQDzo0b9wbW\\nj+lHTNJhQM/gOR9yMC+fwsJCfslNZ254R3T4c/tt/lxWYTsjW9cu5rTVX/49f52d3n3XRSefQill\\ns6yK9K31d4uLqYjPE54gavVxvHyHsDJ9JWF+tg17iffFtTDTZDnH5/Lz+DJ5KvfodfxxJJHRoVPY\\nYafh9c2mN9lmKrH8f+fsVTbrnc9ZzrhZXwAwOP5TjuUXUliYzy+5e1i/eCT9xw7izhbSsXOhWcfX\\nepkY5Py5V+Qw76EHmZdxEh3BTE7cxbH8Qs6dzedw5irGh1zFeUM6cX0e4LWvyyt053MW8eD9L/G5\\nwUTroFhWZ35P/tlCzuUf5T+JU7hHr+NoxhwGDniJfUW2++0QvpbTpcdrKsy3lEFgYEvCfQxZtKcO\\nzlDDohHEC3+ds8T5z8w5ls+s00JB8fN0pzwNNPdI4Btlm1Yqr1fm45mDGJ9SXcPcyIfzY1mfV8zf\\nAmJZn30KY2Eh5/Lz+DY9mdnhIxjcz99mKykD6oqe4L73AnD60zS+sqqQWzfewbbxf2bnx7xd8heX\\n6WLpeZv9pv09cWcssTGpTGY28Qbg5vhdNc5rRN2wzjvP5efxf4mj6IDGmaw4ZizPrpN95MyPI9Fm\\nxAeUnElj4eyPL/nxCfus81fT2XwObY3jdk1HUV4y81Jsz33JmTRS5v1o+X+xSuVNq/VqWua4I7dt\\n3P+esYzxq48D8OTqXWyY/gDX633w8vLicr8Q/rl+G/u+3cqku1pX2K78Tp6eKfHP0U3T+CV7AZsz\\n7NTYRCNUxOdzHyJi5k50BDMndSVDb/C+1AclKvH20XNb5Dy2bHqR2zUd5/KW8UpSxczeVJTBxtf2\\nAhAWn8Bwjyb8ZUpk3ZaKd37yDmSxVyk8tTAiHw+lg48XXl4+XO4XSPjYFayf3uOi/S5RO4eSZjEj\\n8xwagby4cwevRvWgg48X3i186BgUzcLN7zMt0AsTmbw6c11pIyGXlc/N4ktlonXADLZtf4PHg67F\\np4UX3j7+9Iyaz5YN5rLiTFYcc6tpKGpePpYyKGl4BwC2T1nKVifv+ou6ZmDV0KkO7vSYKQ6SvcJ8\\nb++aAUMJD/Dlb15eePvouTEkklnrVxLW3r0re/XddT0f4W5NR7FK5aOd5aMpyxrvZSo2/ovYs3MN\\nAB2e6s9tMrrOrXn76Lk9ah4vR7cC4P8Wba2TG28mMnllTnKlx7mK+GL5bN4+9ZeDrS7e8YnqaS18\\n6NivP309zbdri4pt22xHtrzD6pLzNPedRELcLQBkLtro4NHrhs1tG/fZX6zlNOCtm8TIcNsedfCn\\ny40+Nn8tu5PXyncMjz0/iMcCvAEDq9ZslaGTjZyikP+ljCZixnZOo2dU8lomBknDvj5rGRTD9Bhz\\nQbsnJb1CQXsm7T3mnyrCUwtjaNQYBj5lHvb5yZLUCuv5tPEDzL28s6a9xL8yDvBTwcX7DaKuGMj8\\n+DMAfHvHMuwu22tX1yKIMVMfMq/9cQo7jyhKTmbx8cfmx7R6xY7gVjujNFreFcvE8JYAfJZSediw\\nI/4MnTiebprGX6ZE/pNprMFvEnWhWKXyVORLDofRavwdfYgnAAdXxDFmyUb+e8zo1HB+UTc8O97L\\nY73NefQXO/eU1seM7P54NQAhc+YztZ1Xhca/qSiTrYvM1+5dPbvT6hIct6hrPvj6ma/FktPU2TV4\\nfMMUlm4vHwFSfCSFObO/qTfHJ6p3JiODj4v/BPT0DehS4TNFDqlLPgWga8wgng0bSjdNoyBvDu+n\\nGS/+wV5ibtq4N5C77xcA2g7qTmcv53prre/k3TGxP7dogYSNvQ+AY+8k8qHDybZEffVHSRy3lE6Y\\nZT3ZWtR617tqTqbFMXzoOk4Df7/rOaZEXlvl+olD2tlMxOHcZF+i7vjQJeB2AH7Pyea45YZPLhtX\\npgDQ4ckh3Ne+NaGDx9IWbEbqtOr9tOUO674NcTwW2hV9S43rg0cyI+kjjhvt73lScOV0p9FhyPoL\\n8zNFtRTHyN10HoAre3blagfr+XYKoC1QotL56QyUnDzG5tJHN3rcZK+jGEBPl4A2APyWbuBnJ+/W\\neNwQwD0eTQH4bF9uNWsLZ9jP8+1PtNXMYwZrk4fSFjiTFccTscn8YPdb/Rn2wnRu13ScN6SzbNxg\\nAvxb08K3K4/EvsqGLPsT5EkZUJf86d7XXGE//tZWvjIqTEXZpL9dCOgZEDKG0Cf0QHnjvzgni38V\\n/4mnFsYDPfV1fkSSx18KRvKOmWer82hLpcdqXeephTF56gOAgSXTFvBNkQKMfLgonm2mEu6NT2Cs\\npyt7qdvjE45Vzl/bhs7gS2Wiz/S1zBhQcVR22VxqGoFEDQimScAjPN2vBQAbVmx0skO+4XDTxn3N\\nlN3J0whkYO9AwDwUrI/OgxK1lXc21e75GSno3dv2Ncl8qUwA/PTFS7xa7XOaor46n/MBb6aZb78P\\nGBBKK6BFcAhPtPPCdqSOP0++m8OXyS/xRNB1lr8eylrF3OgH+cdtIxrtpCwXk72KdEDC7kt9WMKN\\naXjTJXIF6+N7ArB/zRRecpCvtwyaTvrRD3kt5gGu15tvGBQbDvDv5VOJCO7OwPm2k/OKutU95DG6\\naRp/mpax86siCnZ+zJLiP2nlO4Z7grzoERIBlDf+M7evMHfG9+3HbfLYhNsrNBr4Mmka/0w0l853\\nTOzPP9DQvLzoptU8vkGjn2NmoDe/5sSxYE0uZ7OWM2v5cZr5xvJcTC9aa841hRwdn7i4dm5YxoYc\\n60kQy+dSuzxwCHcHAPgTOjgEgFNpy/jQzpwLDZmbNu71+N94BQCnN+7hkFPPU5TfyfPtHcuDAeYL\\n0rPjQKKeNPfuNNZnM9yZ/cmV8kiKqNkAvesfn8RTQU0BAyuGDGNRluNZVO1NpnRs/VCurOFvETVh\\n5EDOlwC0Cgikgx6sZ0z11k1icD8fAHReIQya0A2wN1LHh9siZ/BO5hFMhfnsy0xlUdSdAPxxJJHF\\nG2w7/uxNAHc8OeIC/lZRFQ0//Ac2AeDnnfsd9tTnHc7hNOChhfL3NuDR3o+HdB4A7P7W0d11Awdy\\nzO9C+1uoniudrNCVHMzh89Lnhe+90dGoAOEKRxPqOZ4MzYt74t5lWf+WgIG3hwxi+n/sj+xq7teP\\n8cs+5GCeiYLcbLYkP8/9vh6AgbR/ruILY8X6gZQBdcszIKT0UUnYkpFOeob5Lvn1MaF0R6NFz76M\\n9byMP03L+Cwzk92bfgIgeGCow5E6tSF5/IV3fMMw2pZ25jZr7csd0Ss4jqJNUAJzYsw34XRt9PiV\\nNsAPnbB9u1We4ViV+9B5BTH5FfPIvfdnjuLhic+zVykeW/A8vdpUnZc7c3ziwqiYvxbya94elj9+\\nDYVHUpnQ/0VLe836rUghMWGWDpeOA55kuEcTFNmsXO/4jQkNkZs27iHwrmG0BQpNC1m6xl6FzEDu\\nsfKht9Z38k5tH8U1lrtDrYlM/A2g1s9mSEHv3q4NSWDtsld5I+UdInw9MZFJQoy87qQ+O5u1nLnL\\nzRX17pGh/AOtwoyphaaF3OVdfkc4aJq5I6DiSJ0ijMby79S8fPhH0EAmJK5hWR/zc9Y/FciEmxea\\nvYp0TpwrkxmWz7h9anscq7bbdsyZCrJYOn+zee2+kfTsqOHRPoi+fZsBkDZrKbvsXO9nv1jGog1n\\nAbg30tmGRC7r/p+9e4+LqswfOP45AxpeFzezwdwVSivtBu7WgmkFhimlmygUXgMvJabmtdVCE1LL\\na2lqpULeoDSx1ZJSg8oSflnCmqlbJpgmk1lMKwUmzPP7Y5gbM8NNVC7f9+s1r5cy55w5M9/nes7z\\nPGfpyxxUiqa6GO4J8q7GdxG1y4/RK14j0scTMGBw8fRbk9Fxjn0LX38eikpg87opAJQqA7/KWhyX\\nlIY/3QdcC8B/ksYzKSkP0DOgR1knzyuAkDHmzv+6+Km8mVOEhxbCgGC5cNZQdA4MZ9KyPXy991nr\\n+ie6Dn74683Tmz7PPlyuk5bLgT1HAGgb7sdf3Fx4bR06iZeHd+SCIZ2MLBPXBC5kclT1p3K4Oj9x\\nOXjRRh9ATPRjABTmJ7L/kPkd+6civT3mBmt7z/OacNaXmqfqHXox2eUTlRqqetu5bx0cy8tl82RT\\nxtxNxPz3+K/BSHFxMb/kZfLahEF08gthyacFgJGty+dYn31YEVdzM0wlRRQYjRjLvX6V9n6Dct9o\\n82Janr5RrEmN5y5NR0HOPEbEJje6+Tp1XZHRwP6U6fQb8CyfKxPNfWJ5OtrcAPwi6QVrgV4Ry0id\\nkmMpPNq1l3URLWNhMUVGI9+mJfHG7t8AuKVD7c/nFDVTUXl8Y/Qc5gU1Bwwk9O7F1KR9nDAWU1Ro\\n5FhWIpP7D2JBdjE6gpgaP6Ssk+7HqLlzuEvT8Vv+EvqFPsmGrONl6SCXvUnT6Bcxl4PKfLdmRiVr\\ncahiI7/kZfBCZG+iy57oErpoHGGV3CESl5Z9ue6smF0LAvh75PPmBTWN5rZEgSGb5A1vAuClv5lr\\n217ec26MgkJHm9fEMOSSZ4CWPjHcE2R5xJ033fsMB+BkViYHlcLbvy93dLpipysukv2j5pRSfJO5\\nlSXje9HO07aNhj8hT9wGQM78OJ5NOcCPZeXzB/Mn8tzOc4CeR4eFVXAzTc+guNn01nkAemLjx1Vp\\nSH1Vzk9cDubyODHpDQA8te78tS2Unt3GyhmVT6l29aSkhqzedu5BT+SKNFZFdwYMvD3zIW72aUOz\\nZs242q87Tyz/DBO5fL4/l9+OpVqHbIQu+NLlc2mPvm5eQdnV3IyT20ZzU5s2tCn3mrzN9SI7ov5r\\nFTiD9ZvMCzEd3jCUp1c7z9N0tcaCzBO+dOznZDdv48NdgxfyscFEi04xvJ6+iF5tNYdFM2+Ifptf\\nXeT1X3dNpx22kTpfp73BB/m2RbTatGpG8zZtuDEsgc+VieuDE5jk8okc4kqoqDzW8Gf69neZHtwB\\nE5ksjrkb3zbNaN6qDZ2DRvJyxg800YeQsOs9nvq7bTX9Jv6TePeDZ7hXr6MgayXDg24oSwfXc0/M\\nIj42mLg+eCbbdjzDrS4epW0/dFPXrA1X+4UwY8sxQE+/uD0kT+p2+X6gBs7dgnpNdANJrWRtDPty\\n3Z6pMINtC07bFtRsY25L/NmnG2M3fI+GHyNfHsnd5RbvlTqg9nn6B5atjWL216Eh/N3ud7866D6G\\nezSx/v9vw0Jk3nOD50XPSS8zO8Rcri8a/Df0ZeVzn5k7OAMERL/CuHKLrJXn2SmK+EXh9B37CuNC\\n5UlIdZ1j+WorjwG6PhHD/b6a9fF3GgGszHYe/afU8bIpWc5PSmrI6nHnHnQtu/BE4jecTF/LpOhe\\n1kVwruoUROTY5ez69jBvTurGoW2vsctUSlNdDE9Fu54j0znqKSa0v8o8NyM5HbkpL26KmsOLZaND\\n3hpT8fx7cbnpuS14JDMS93D8yFqG3GyuqO0XzZwyIdzlo5Fahz7Bc2WF/ZbVW/nz+I85lZnMi2MH\\nct+tPk7Hz9wlw+/qE4+2wbyY/hXf7FzB2IjudCxr+HcODGfigrc5dORDZoY6NwKvCY0n/cgx/r3s\\nSR4ONN+d1/CjZ8Q4Xk79muz0ufSo4t33qzoFETF2Edu/Osz2+F7yiK465KaoBdZRfxa6ln1ZdfYo\\n2xOn8lioLc1Y4vjvr77kpYiKR2yI2qHzCiJkiK3jFRHa3WFFco+2QQQPNL+vEcDDwTLvuTHQtQxk\\n9gf7+cCufLbU0wtSv+ajxIFVmC7lxT8mbWbnyoEyXbZessV778oHaWX3+Lvro59hiL+r+tmPIU+N\\ntT4pacvuxtG705RSSiu3CqWqwvB1Uf9J3BsniXvjJHFvnCTujZPEvXGSuDdOEvfGyV3c6/WdeyGE\\nEEIIIYQQQkjnXgghhBBCCCGEqPekcy+EEEIIIYQQQtRz0rkXQgghhBBCCCHqOencCyGEEEIIIYQQ\\n9ZzL1fKFEEIIIYQQQghR98lq+UIIIYQQQgghRAPhefLUqSt9DkIIIYQQQgghhKgBS59ehuULIYQQ\\nQgghhBD1lGVYvmdFb4qGrfxFHYl74yBxb5wk7o2TxL1xkrg3ThL3xkni3ji5uzkvc+6FEEIIIYQQ\\nQoh6Tjr3QgghhBBCCCFEPSedeyGEEEIIIYQQop6Tzr0QQgghhBBCCFHPSedeCCGEEEIIIYSo56Rz\\nL4QQQgghhBBC1HMNrnP/R9Z8NE2r8LU0SwEG3njkT2iahm/kJn5yc7zvUx5B0zSa6AaSesr50RIf\\nJ7St9BiiZhRZzL6uOZqmccv0Dzlf7v0/suZzbVlM/7WjwGn//1v4DzRN47reaziJLVbuXi09n+cA\\n5hhbtm0XtIivKR93x7RzhkxmN21eabqzP76oGVNhLtuXj2dA0A3W37VzUC/GJmxi/6kip+1LDVms\\nTxhN8G3tzfnYpysPxExlfUa+43anUvinhyeaphGx+rjTcSzlgE7rxqqc8jE08uZIb7fpVFSFka+2\\nLSE28m58NR2aptHhtrK4GirOf+XLXUWWNT+OTMmnvKqmicrKC/v6pOr1TsNnn5fKv24MGshTC7fy\\njbH8XraYutpn8vIPOVPi/jPPbHvcuv2QJMf8W9v1SHVi7W7bJj5d6RPzPDsOOX9eQ2b/e7jKD5W1\\nt37ISiE+5n5u9rGVEY9PX8tepzKi5m23s184fkYTn670jnyS19MO82uJ8/do7Pm9IvZlcXXaRiaj\\nYz2v067nnsgnWbbtMP8r9xlVTVPu2l+nMhKZbBdvr87deST2FXYfs+XNi023ouqq1sarSRvAts8d\\nse85pSP7ffwT9l3aL3kZNLjOvWg4NAIJeUIPQO7inXxR7FhoZu99hzNl/96x94BDo02RQ3rKIQC6\\nR4Twlxqew09Z05iakCkdtjrAVJhFfO9b+OeEV3gny9aAP5aVzquzhvLEsn12cSrmYNIYbvDpzohZ\\na/jokLmALzEcYVfSYkaEtCcgZg3fFJq39ugQzIBBLQDYtyWdkw6fbGTfng8AUGSTvj/X8byMmWSs\\nM1c6EaHduap2v3aDV5KXxlMht3J7+BRWbdnHibIG2A+HzHEN9Lmbp3c4X3CpvuqlCVH7vs1K5eXp\\ng7i1Sy/m7a5ax/bbrFSWTrifoN7P80Whq4ZzLlvXpFj/9/6yZL60qyvqQj1SXonhCB8kxfHP2/7G\\nU1tqI203bKbCI7wacyMdggYzO+lD/muwlRGvLxzFvT43MCHp8EXX0/9NGc4tdzp+RonhCLu3rCD2\\nwWm8lycdt0vtp92zCOnSyaGeV+Syd8sKJobfQkDIM3x69uLjYElTfwkZyVK7eJ8/lsnmVePp3bkr\\njy49IG2/y6h6bbyaO7hqFNNTGna526A790syTSilnF6TArUrfWqiigJ6DKUdUGRK5vMc29/tG13g\\n3GgrycngzZwiNAIIudPP4ZgtPBL4UjmnjcKSZ+mGc9p4f9ZAJlZQEGgEMeeP363HOZ85z/qefRp0\\nd3xRNftXT2ROZhEeWhiL0r+j4FwRvxcUcCw7lZdGP8jQ8BBrx/rMjqcJjVnNCRSd+yXwwZHTFJwr\\n4pf8w/x7wSA6opGTNJrw2K1lV331BPW5z7zvnjT2n7K/i2DrvINz5//s3vd5vfQPrtLF0vNOr0v8\\nKzQspsIsnh88kJczfqCJPoQZiZ+RV1BEUVEBp7KTmRh8HSYyWdR/KEuznEdmVEd108S9cWetedek\\nMpnVpBkAd8R/VmF9IvWOTUzyaev3/72ggG/SF/PPTh5cMKQT1/tBF6NgoGPERs5Y98nn/xJH0xGN\\n4xlxzFyV7bT9hZx3eDXNdkXml5w4NqYZHba5FPUIVC/W1m0vFPFz7k6mB3dAkcuqR+eysxY6Kw2X\\nke1PhzE26VtAz6B573I0v4DfzxXww5GdzI/ohCKX5TG9eGqL80idqjIZ01gy7C3OAD3GbuQ/+QUU\\nFZnLh13Jcwl/bDChnSqIq+R3JxqB1WobXchZykMPzOVjg4k2gbGsz7TU88f5JHEq9+p1HM+Yx4B+\\nczlUfDFnZmDzuL5OaaqoqIifc9OZH9EJHX7cdaefXKy/jKrTxrs4BlYPvvg2RV3WoDv3ov5rGRTM\\nI55XAQZSdmda/25pdFmUb7Qd3/8+B5XizwGDucf/Ys/CwNoh00iVq/ZXkIEjWUcBuO7hwUQGX493\\nSy+aeXtzg/8AJr7+rrUxZSrOYNETr3MGc0fhw+3P0vtmH7xbetFG34X+07bwwfpBAHy94UnWZJjT\\n0Q09H+YeTUeJSuW9vQbrJ1s67xaOnf9iDuzdAEDHx8O401sadNXx7Zb5zMksQkcQL257l3nR3eno\\n7YWXlzfX+UexZPvbzA5qholM5saucDFFpmpqmiZE7Wnm7U3n4Mm8vXsDkT6emMhk8bJUp+GRjvvo\\nuSt6AS/EtAbgQEp6uTRQzIebl3FQKfR9E3gu2nxxbcvqrQ4X4OpGPVLG04s/+/bl+SWTuV3T+MOU\\nyCeZxlo6eMPzv4wlPL4yD4DH1n/GlhkPcpPem2YtvWl/c1/+tXkXSZGtAQMbJ77CZ8U1KyNKjuZY\\ny/mwwYO5Xe+Nl5e5fAiNmsnmxCFcU0vfSbiSy5pnZvO5MtHGfya7dr/CsEBLPe9Hz+iF7NjyDLdr\\nGmez4ph/EXde/5exkonrTwCOacrLy4s/+wbzr827OPTVTib3aFNbX05UquptvNpgIpOEse5Gg9V/\\n0rkXdZrOK4iwSc0BOL5tn7VhdyDjTQ4qhW/0QuZHNMex0ZZL+tvmf18/oDu31MLd8hKVyuNRcxts\\nQVD3eaPv6AHAyW1xPJ2wiY+PGih2MQ+3JCeLdafNl/UfGx3ucijtjcMmM6t9M8DAxjTzUC/PTvfx\\naKh5aP6new+UdTqM7Ht/PQDB8xYyrb2XQ+ffVJzJzqW/A9CjZzda194XbgRySX8zAwC/6CmMDGzm\\ntIWuZSCxM0YD8Et2Mp/k1OyTapomRO3z9I1i8rRuAJxal85+Y2Vlqjc+vp4AFB8sdohL6dk0Uhb8\\nAEDYsJGMHTAGgNNpK3nXblRAXalH7Ona6vHVzE2wnwov6jZkg5b96UbOAM10kxkV4Tx6AvwYPOlf\\ntAMK8+exe2/NfktdWz33lMXj9VmjeG3bAU4YJS6XS+mpLN5/31yX9oodyd9bOue3Vj1imRTRCoCP\\nUspPn6u6qqSpLrd61/Doomaq3sarLQU58xgRm1zjdFSXSede1HFedOs5DLBv3Ody4P0jAISEDmFA\\n3/sBW6Ot9FQW7+/5HdATFRrkdMTfSuP4W9miXZUtgNPcYyYbk4fQDjibFceI2GS+vzRfVFTIi/tj\\nVxDp44kil5RZQ7mviw/Nm1zPfTFTWJd23HoH0JCbwxnAUwvn9i6uh8lr+NLl/qYA/JZnKNvXj259\\nugBw4rWd7DcqTMXZpL9eBOjpFzyOkBHmubuWzn9JThZvlZzHUwvnwZ76S/j9Gx7FjxgyzDV3Sz8f\\ntxdG/tzFn3s0HYpsimvY1q55mqi+yUHOZUtDWKCnNnW59T4AzptS+epYZVsbyc8zpxOPdjgMyzy2\\n4w3Wl16gqS6GgaF62oY+zLT2XiiyWbM53e5CQO3XI3BxsTadNZCnTAA09azSLg2Kq9+u4+DN5bYy\\nkHvoZwDaDezGjV6uL7B4+N7MvTrzj3jyrLFG5+PZKYr4OXcDkJeRyBPhf8O3TTP+ctuDPLXQ1cKe\\n7r+H5PfqKz2Vx3ZTKQDdb3PV4QbQ08W/LQC/phv4qUYjuaqWptypWroV1Vf1Nt7F+kvEctbF9wDg\\n8IahjEloeBfzG3TnvjYKXa+W0mC/0tr27MMYj6bWxcxKjn3Em7t/s3aoLMOpLY22H/a+w3ZTKS19\\nYrjL/+I+W6MZXaJWszm+JwCHN0xlbgNfiKOu8vSNIuXgftbFj+IfZXMfFbl8nLSEx8Ju4L6YrRf9\\nxIpuwY9yu6Zx3rSSvfuLKdz7PstLztPaZxz3BnrRPTgSsHX+M3ev5gxwbZ++3NlBhuTXlOlCBe+d\\nNfBJWSfIzAvvtg266hJliowGPl89nomJvwJw59gQOmHJ+zmkLt8DwF9GhNGjrYbOK8h6Ae7Qi8l8\\naDeX/UrWIw5KivklL41nY2dyUCk8tXBCg6SdUduq33bz4t64XXyzcwVP9OtKu7K/njq0k5enD+Xu\\ngPtZ+YVM16lrNC8vbtek7m0Iqt7Gu7g2gI429IlbT9LwjgDsmjWVFVk/X/wXqEOkhVQJ72vMFUSJ\\n2sf3hvLvGikwlF72c2psdN5BBI8wD9nN3JZO2t5UPlEmrhsUTs8OmnU4tSKbD/dnWlc2/+vQEP7u\\n4qqsuwX13M/n8eLeuHWsDGsFGHh98EBmfFJb1xBFdeja+jM8bjVZ35r47afD7E1dwYjAJgDkJM3l\\n7RyF3s+fdpinUhw84vpWryKPI3vM8ytb+Oqtd409/YN51N+c1nZkpJOeYb4if9PYELqh0bJnH8Z7\\nXsV500o+ysxk37YfAQgaUHsraTcWGjcTMNp8H/b4mq185nLKSzGZu98BzHfdO3YA8KaN3jx8r+DT\\nXM6Uu3ujjAUYTI7l8sWkiepytcBWTlz3Gh6tYTpy6CMArtKFc1snx/dObBlKu7KL8c3b+PCPMeYh\\ntG0DE3hhUpD1zv25jFReyjYP4x0aFVYWLy96RU6wzmXftMP2ZIvarkegerG23mxo0oyr/cJYkFkM\\n6Bm5aSHhjfDCoKvf7kRyZLmt9PjdejUAZ7Ye4Bs38+lL847ysck8uuMvbb2BmrbdvOjcN5ZV27/m\\nxwtFHMt+j3UzHqIdcMGQzsuJ6U53DyW/1w6PDr7015nL9X1f5brZysCRnLMA/ClEzzVoDtNbvjnp\\nFGjyDXnl/lK1NOVO1dKtqKmqtPFq0gYoT8OP4SuSmND+Kkxk8vSAUbx6oeFcvGvQnfvaKHRtBY6B\\n/eUKHFNxNvveMTcU293mJ4utXDLedL//AQBOp81j4rx3Abi7b1DZb24bTr0rcSpLk84Btf1YMj9G\\nr3iNSB9PwIDBuQ4Rl5gqNDo0rJq37UKPAbGs2fCaw7BtT/9ARrQ3D71es3STy/lU32xYQvxp83D7\\noX1t6UTDn+4DrgXgP0njmZSUB+gZ0CMAAJ1XACFjzB2EdfFTeTOnCA8thAHB7oYRCve8CXl4DO2A\\n3/KXMCZ2rdPzz79JmciIWfsB6PpEDPeXdYL8OvUC4DdDJv8pN6y7MDuTd0r/APTc6mdu4F9MmhC1\\nqyQvhSULDwDQYURIlRahbN9vIem7n7Wbh2tk58Zl1kfYzelte5Z204DJHFTmxt4Hy1PtFuCrC/WI\\njUYXpm8/wKtR11+CozccticdLGHFBledvlySl77AGaClz0xCe5rzeU3abkb7OfaeXtzgH8bweVtY\\nN828sNr5s8YGN3y3rvDoEEifPuZ1MdJmr3B5sffcpytZusWcL++LMl9Q13Xww19vnk71eXb5xyHm\\ncmCPeepN23A//lI26qfyNGUgN0/WW7jcqtrGg+q3AVzRtQzm+a2zuUvTUWowWOuThqBBd+6rylRS\\nRIHRiLHc69dix+dfvz1zPIszjvNrcTG/G3LYMH0WC08XoyOI6H6u5+SJ2nFdz4fpr/NAkUvuMfDQ\\nwniwp61DZRlOfS4rk8+V6ZI8lszTN4o1qfHcpUm2uRK+2TKCO0JGli10ZKS4uBijMZf3EhP5RJnw\\n0MK4ti3ovIKZ+qq50/hD2mh69X+eXUfzMRYWU2A4wvaFETww/G0Abhn2CqOCHRdyCwodTTug1JBL\\nngFa+sRwT5AlLXnTvc9wAE5mZXJQKbz9+3JHubuPompah87gtQk3AXB4w2hu6dKVB2KmsnD6aIJv\\na89Ng1/nBIq2gQmsXRBmvZtuKQ9K1U6emzyXT/LM6eGHnBSmz3yRM8A1gVPoHWje/mLThLh4RUYj\\n32YsYVDoMDbnl6AjiCkTwp1GSNg/Cu/XXdNpB5zesZhNGQXWbS7kJDE/qfLRUz9nL2Z7hq2RfiXr\\nEdvNhuOsDGuF4ghJ8zbV+AkQjUXr4Mm8FusLQMqYu4mY/x7/NRgpKjRy+mgaL0T2Jnrz/wA9Q19+\\nkrvLRllUt+1mKs5g3i23MbhsIS+jsZiiQiM/5CSTtNHcoby6U81H9IjK+DFq7hzu0nT8lr+EfqFP\\nsiHrOMbCYoqMuexNmka/iLkcVOb6YEbZRTENf0KeuA2AnPlxPJtygB/L9vlg/kSe23kO0PPosDDr\\nRZzWwbG8XDYk2z5NFRcX80teJq9NGEQnvxCWfFrg4jzFpVLVNh5Uvw3gTqvAGazfNMQ6DafBUEop\\nwOFVn53PnGf9HksyTRVsma+SIls7fXf7V0zyaaWUUhdyU9WIzk3cbKdX/5z3mSq+PF+vVtWvuB9X\\nK8NaWc+1fehq9b3duyaVreYFNLe+f+PYd9Wv5Y7wUfzVFcbbUwtXW0+aHLZt4ZGgvlSO6eho8jDV\\nrmyfjhEb1Zlyn1P1NHhl1K+4m5nUYbUkqEUF8SufD4vUfxJHq45obvfxj16t/nvO+bNKi9LVtPZe\\n1u26TtvjkL9LfkpVwz1s5UHvJV9e+h+gFtTduBeojxZEuImVXv0tark6WOC81383j3Eb3yb6ELUk\\n8/dye9Q8TZhUpprVpJkC1B3xnzm9b5/nK6tPLrfLHfeSk8mqv86jwt+iiT5Ezd31i91etvrYsUwt\\nUh/F91SA8vIZrLbmmpRSRSpthq8CVFNdjHrvJ+cytvRcuprQ/ioFqBui37arCy6+HqlOrN3VBRdy\\nk1Wkj6cCVJ/4S9N+qIv5vbK68URypFNdrJRSpecOq1XRnd3+3hp+anzi106/Y3Xabr/unFBhTFt0\\nilHv5pqcvkdjz+/VUZW20Zldcepevc7t73p98Ey1t1yeLz2XqWaHdHC7T0D02w753LxPxWkK9OqR\\nJV+q4iqct7t0eznV5bhXRfXbeNVtA7irY5Syr2fc1fF1lbu4yy3IKvD0HUDi5//hrfhR3HerD2Ce\\nr9EzYhyvpx/gnRkyhPPS8yPkYdvoiO4RjnOc7YdTA4SFdr9kV9hvilpgveorLg+NLjz1yTH2Ji9m\\nbEQvbtKb78546rvQO3oK65zyoRe3R7/Od/n7WGeXb23bnyY7cRQ3tnT+LJ1XECFDbHduyw/L9Wgb\\nRPDAZmXnFcDDwQG1/4UbFW/unbaZ4z99ze7kFUzsd531ndBpa9i5/klubWlkf0qKw6Mob4x4jS+/\\n2sqcaFt6uKpTEJFjl/Nh9h4mOT1ar+ZpQtSOzoHhTFzwNoeOfMjM0Ko8Q9qLe6YtY3ZQM4rzk5k0\\nfS25Btvj7+59YRxhbZ2H9etaBhP7nHkIft4bibx7zJJu6kY94ukbxcKXo2gHfDDrSRbbjUoQznQt\\nu/BE4jecykx2yO/X3RrCmGlr+Dj/O5ZFd3Vqh1Wn7da678v8/O1OXp02iuBA22gOS5o9sH8tD/o2\\nvrURLrdrQuNJP3KMfy97kocDLXfnzTF7OfVrstPn0qNcnte1DGT2B/v5wG4f0HNb8EgWpH7NR4kD\\nndbEsaSpk+lrmeSiDtn17WHenNRN2vaXSfXbeDVpA7hjq2caCk0ppbRyK00qpdxsLhoSiXvjJHFv\\nnOpL3FVJLuvG9CE66Run926Nfpv0xIGyvkk11Je4i9olcW+cJO6Nk8S9cXIXd7lzL4QQos7QPP14\\nLPH/OJg6l8hb25f9Vc/fohaStCBcOvZCCCGEEG7InftGTOLeOEncGyeJe+MkcW+cJO6Nk8S9cZK4\\nN05y514IIYQQQgghhGigpHMvhBBCCCGEEELUc9K5F0IIIYQQQggh6jmXc+6FEEIIIYQQQghR98mc\\neyGEEEIIIYQQooHwPHnq1JU+ByGEEEIIIYQQQtSApU8vw/KFEEIIIYQQQoh6yjIs37OiN0XDJs/F\\nbJwk7o2TxL1xkrg3ThL3xkni3jhJ3BsndzfnZc69EEIIIYQQQghRz0nnXgghhBBCCCGEqOekcy+E\\nEEIIIYQQQtRz0rkXQgghhBBCCCHqOencCyGEEEIIIYQQ9Zx07oUQQgghhBBCiHruinfuS0+l8E8P\\nTzRNY2RKfqXbm4y5bF8+ngFBN6BpGjrteu6JfJJl2w7zv3LbKrKY3bQ5mqbhn7Cvws9emqXK/c2H\\nf+0ocNrnj6z5aJrmsI/DMQ1ZrE8YTfBt7a3n16P3KBak7ONMievjuHu5Or4w+z7lkUp/P0uaqiyN\\nuYqp/T4VHVtcOqcyEpkccz83++jQNA2vzt15JPYVdh+z5ctLWX6YFfNt2kpiI+/GV7OdR5+Y59mS\\nlc/5sq0+TmhbYVpp6fk8B5D8fLHcl5s+3B4yiplJHzqUs+X3cVWmWsoS+xhJ/q8bLPnKdf4x8MYj\\nf0LTNHwjN/FT2V8rK8/Lx81UmMVz3c3thGuCnucLo5L4X0GmszkObShz3h7I5OXv8c1Z1/uc2fa4\\nNS5Dko67ec+H+RlFrj+zOIPp1zVD0zQGrz4u7bM6oCYx+CErhXi7NkOH23rx+PS17DU4bvff1f+0\\nponndjumCVNhBhOv80LTNO6I3WotV8TF+TjhejRNo7nHFD4rdoyHIovZ15nL4Jti33Nqi13IWcod\\nOh2eul4kH1Mu39M0jb/N/NDaJnPN6NSe63BbL6d2pX3d4u5lX+fURVe8c18dP+2eRUiXTvxzwiu8\\nk2UuwBW57N2ygonhtxAQ8gyfnq2tAtfAy48/SWpeVY9XzMGkMdzg050Rs9bw0aF86/l9tnstTw++\\nm+u7jOS9Kh9PiMbJVHiEV2Nu5C8hI1ma9CH/LauYzx/LZPOq8fTu3JVHlx6opBB3Vv3yo5iPE3pz\\nY9g4Vm3Zxwls5/FBUhzR4Yv4olDyc91g4KuMtcyPuZ/ru4xk01HXjXghHOWyftyjzMkswstnMK+l\\nPMPfvV0/N1hceiV5KUTdfqdDG8qct1NZOuEhntt23MVeuWxdk2L93/vLkvnSrvPQtu+jTGvvBRhY\\nu2Gny4u4Z9PeZOHpYjy1cAb19avNryQuA0uboUPQYGbbtRl+OJTO6wtHca/PDUxIOmxtM9w0+iVW\\nhrUCDCwa8SyfWevxYvYu/BfLTp+nuU8sS+LDueZKfKEGKCh0NO2AItMSdu8tdnivJCeTd/LNfzv5\\nWjpflev8H8h4k4NKce39UfTsZF8+F/Ph5mUcVObtD76wkvdOuW6TlZ7N4OmQ25zacz8cSre2Kx+e\\nv6/a7cq6qt507i/kLOWhB+byscFEm8BY1md+R8G5In4vOM4niVO5V6/jeMY8BvSby6Hiyo9XFcX5\\nyTweNbdKDfjvt4whNGY1J1B07pfAB0dOl51fPp8nT+NevY4be4Zxu69zw2FJpgmllNNrUqA0Mtz5\\na9Rbdr9VPkmRrQHoGLGRM3a/4doon4v+rJjk0y7jUxvHFuUZ2DyuL2OTvgX0DJr3LkfzCygqKuLn\\n3HTmR3RChx933enHVdU4ak3Kjws5q5gw+1MABsXvIa+giKKiAn7OPcDmZaMIGz+Qu1s65tEWHgl8\\nqZzzc2HJs3RD8nNtsi837cvZ344lMiZkKh/W0oVeyf8NVTEfJ4wgev0JvHwGsyZ9DeEu6meJ/+Vi\\n5N2FsWzOL+FP/rFszj6NscjchvoqPZnnIka67HhfyHmHV9MKrf//JSeOjWlG6/91XsEMfOp2APLe\\nSOTdY+XLBdvFgY6PDeb+Do5pQNpnV17FMTCy/ekwpzbD7+cK+OHITuZHdEKRy/KYXjy1xXLByI/R\\nL79Mb50Hv+UvYUJ8OueBc5/OY0LCfkDP+Neep1dbiXFt8fQPZER7LwB2ZmU7vGfpvINz51+RQ/qG\\nQwDc2rcbf7Hbr/RsGikLfrD+v0Sl8mqK47EBVHEOCf0fZEHGKXQEMSXxM/IKzGnE0q5sou/KvcEB\\nTu3K8n0Kyytv85A6feGnnnTuc1nzzGw+Vyba+M9k1+5XGBZ4Pd4tvWjm7UfP6IXs2PIMt2saZ7Pi\\nmJ/i6upuzZzNiuPpBZkVXs0xFWfwylNbOIM5IXy4/Vl63+xTdn567oxaQPpXP/BR4kCHhCmEcPS/\\njJVMXH8CgMfWf8aWGQ9yk94bLy8v/uwbzL827+LQVzuZ3KNNNY5as/Ij/0gWB5XCUwsnalgIHb29\\n8PLy5s++AUSMX83mGd0vwS8gasJSzu7Y9jx3aTp+z1/Ji0nOlbwQZsV8PL8/kbP2oiOIealrGHJz\\nsyt9Uo2a4ijZq80trb/2G0KEvw9/8jK3oW4NjmL25jWEdyjf2bLdudP3TeC5aHPnYcvqrZy02+pv\\nA56gt86DUrWTN7Y5lgu2iwN6Rg4Lo/Wl+4riEvhfxhIeX5kHOLYZmrX0pv3NffnX5l1lN38MbJz4\\ninVIuGenaJa9+iAABxYOJX7LeyyevoiDStFt2kbm9KtOG0NURucVRMgQcxn731Xp1mlW9p13C/vO\\nf+mxbN7PKUYjgIeDAxy2O7bjDdaXXqCFz2QS4v4GQObSrU7D/r9Jmc2czCI0Anh+74csiu5OR29z\\nGjG3K7/i++z3mBTYcOqAetG5Lz2Vxfvv/w5Ar9iR/L2l89W0Vj1imRTRCoCPUtIdCvaLlZ4wkIkV\\nXDAoycli3eliQM/jY8NdduB1bfVSaQhRiexPN3IGaKabzKgIV8Mj/ehyq3e1jlnT8sO7rS9gvho8\\ne/pc3so4wo+FTruKOqRV4FhmjDWXtAdS0vla1jkQ5SiK+G/KGCJn7uYMekYnb2xQjbr6SuNa9MGe\\nABxdHce45Vv5T56xwhsr9nfuwoaNZOyAMQCcTlvJuzm2vO/ZaQDRj7UEnBv/+3Ys56BSXB0whf7B\\nXrX8rcSlVpU2w+BJ/6IdUJg/z+GusP3w/HmRDzEns4gWPpNZNiukWiMDRVV40T10NADn8lP5vxzz\\nX0tyMngzp4imuhgWLhgIOHb+v8t4k0+UiVY+4fzD33Y0RQ6py/cA0HXsQJ4OH8LtmkZh/jzethu5\\nAwYy3/8IgPZ9Yxnaw1VZ74Ve37Dyfj3p3Oex3VQKQPfb3M2H0tPFvy0Av6Yb+KkWGnVDV25kdlAz\\nwMDqwUNZmuV6HqchN4czgKfWnZs6u0ogxRiNRoxGI8Ulzu9ODtI5LdbgagFAcfESB7d3+q2vCppZ\\n7X3q+mIa9ZOB3EM/A9BuYDdu9KqdIXE1LT9ahz5B0vCOABzaEsejIV3Rt9K4KWgUM5Pe44TR+Si/\\nlcbxN805P8viS5eLN1387wLgfznZnDBc/BEl/195rvOVD9GbXS+DWZFTaXEMH7KJM8C1PZ5hatT1\\nFW4v8b9c/Bg6ZwZ3aTouGNJZOWEQ/n5taOnTlYdjF7Ely3kBQ8udu6a6GAaG6mkb+jDT2nuhyGbN\\n5nS7CwPehA2dUNbBS+STTHMHz1ScwXuvmo/7wPhwbnExdUraZ3VZ1doMHr43c6/OfOHo5Fmj3Tu2\\n4flmeqaue95pup2oHS3vvI8xHk1RZPNOhvnu/PH973NQKXwGhjB4QBi9dR52nX8DmXuyALhpbIjD\\n1MZzGam8lP07GgFE9wuiif/DPNHXfAHPfuSOIo/cbRcAaBvU1eXNV1VoLOujOc/pPrFlKO3K5f8m\\nuoGkupnbX1fUi859zXnhdWvNM2lT7xCeTV5LpI8nJjKZN2kx+wuqH9DSU9sYcXVb2rRpw6ov6naC\\nEEJY+PHYuhw+T57LiMAbrH/9Jmst82Me4pY7R7pdvEXUHZqXF7dr0lgTZrs3JPO5MgHw46dzWVSL\\n0/jExWkVOIP04+/y0tgHuUlvzrMlhiP8e9U0IoO6MWChbSFV+zt3fxkRRo+2mnno7wg9AIdeTHZY\\nd6NVcDhPBTTHfmE9y0J6TXUxDOknC+nVVZfyAkuR0YBRWdKJgS8OHamV4wpnOu8g+j7eHIBDaQf4\\nnlzS384EoNeAENp3Cubh+5tbO/+lpzLY9vZvgJ4BPeyH5BvZuXEZZ4A/BwzmHn8AP0IGBQPOI3cq\\n88nSTrRp0wb/MQ3n6Qj1onPv0cGX/mVX1vZ9letmKwNHcszPSflTiJ5r0NDQ49PZfLXu3Lf5TkEz\\nnTWQV1bJu+PpG8XqdZNph3n+/aCY5U7b6P38aYd5+O7BI9Vfzc/VYiE5cTKf91JwtTjS+cx51d6n\\nri+mUT/p8bv1agDObD3AN8W103Guaflh5s2dUTN5I/MYpqICDmWmsjT6bgB+O5bIsi2O8zfdLagn\\niy9dLkaO5HwOQGv/ADrqzVOifDVzVffNSedb+fmGvAqPKPn/ynOdr2wLqVbXTcMm83hgUyoblQcS\\n/8uthW9fJq58l6P5Jgpzs9mR/CwP+HgABtL+tZZPjeZ6wXLnDmBolGWuvBe9Iidwu6bxhymRTTts\\n5b2GP+Hj7wfMC+vtOHbcupDerU8Pdrt4mrTP6rKqtRlK847ysck8bPYvbb2tfzcVZrF4QgKfKxN6\\nvfmiUNrkJ1lVjY6hqA5vut8fCcCPe7bxYVo67+z5HU8tnAd76jF30IMAc+c/c38G202lNNMN5p4g\\n26jokmPbSHrDPEcyeKxtxE2nfo8x3KOJw8gdDV/8BjQB4Ke9h6s9ZdvVgnoXTFtdrP9Rt9STzn0g\\nffqYr/akzV5h99gKm3OfrmTplnMA3BcVUjb0wi7j73HO+MezP7IumNWxg/vPbx06h83xPQEwGJwb\\nh/arQK5ZuqlW5/sL0ZgE9BhqfVzKig2uOuIGcvOqdwGt5uVHMUajbRvNy5tbAgfwVOIGVvY2z8//\\nsbCWHs0hasW5rFXMX2Ueqt0tKoRb0NB18MNf3xSAz7MPl5vDm8uBPeY7NW3D/fiLPNGgwbs+OIGN\\nKxfxSsob1lF5CWOfl8da1gEmo+Mc+xa+/jwUlcDmdVMAKFUGfi0E+zt3AHN6N7fe0W0aMNm68vYH\\ny1Md1t3oFPoo/csW1ntpwnheTStEI4BRkTLHui6r6AJL5W2GXJKXvsAZoKXPTEJ7WjqJxexdOp05\\nmUV4auEs253K7KBmmMhk1tjae+qWcHT1nfdZ82DChLnsMpVybZ++3FnWWb7+zj7crmkYdicybcEa\\nAPymhPF3uykXX257lV1lUy3fHnODNe97XhPO+lLzEHzbyB09QX3uA+D07jjW7m4cj8mtU5370sIC\\n69x0+9d5/Bg1dw53aTp+y19Cv9An2ZB1HGNhMUXGXPYmTaNfxFwOKkXbwARm2M2h6xY62rrIwuzp\\nyRw0FFNcbOTbjHlMfOY9ALo+EeP0+BNHXtwbt846/7Y8nVcwT74UQTvgh7TR9Or/PLuO5vNrcTFF\\nRgNfZ2ZXOkJACAGtg2N5uSyfpYy5m4j57/Ffg5Hi4mJ+ycvktQmD6OQXwpJPC5z2re3yo+RYCo92\\n7WVd2Mm8vZFv05J4Y/dvANzSQX/5fhzhVpHRwP6U6fQb8CyfKxPNfWJ5Oto8jE/Dn5AnbgMgZ34c\\nz6Yc4Mey2H8wfyLP7TwH6Hl0WJjcjW0E7httXlTT0zeKNanx3KXpKMiZx4jYZLkwf0UVs2tBAH+P\\nfN68eKnRXO4XGLJJ3vAmAF76m7m2LVzISWJ+UuXrLfycvZjtGbZemkeHvkSVLaz3RdpODipF+76x\\nPOQvF/Xqq9bBk3kt1hdwbDMUFRo5fTSNFyJ7l63NoWfoy09yd1kn8dyn86yPuh26biERtwYxZUkc\\nd2k6zmbFMW1hw3nmeV3i0SGYAYNaAJB7zHwx5t6IEOtceE//YB71N19kySpbq6hfz27Wi2+lZ7ex\\nckblT8KxH7lzY9Qc6/ppCb17MTVpHyeM5r7gL3mZZH7VADv8SikFOLwup5KTyaq/zsPpHCwvTy1c\\nbT1pUkopdWZXnLpXr3O77fXBM9Xen0zlPqFIfTQvVLVzs0+LTjHq3VyTy/OJST7tcKTSc5lqdlAz\\n675LMk0On/OfxNGqI5rb89MRpNZ+Zd7nfOY8t9tZXuU/v7ZdybjXrnyVFNlaAapjxEZ1pty7FcVU\\nKcdYWGJaWboE1B3xn12G71b76nrcS88dVquiO1fw2+vVI0u+VMXq0pYfOcvuqTD+1wcnqP3nzNt/\\nFH91hdvan8eVUtfjXhVVKTdbdIpRG4/87rBf6blMNTukg9t9AqLfVt/bbd+Q8n99jrslX7XwSFBf\\nqvL5x3W5X1l5Xr4OOJo8zNo+iHr9O6ft62v861vcS8/tVGM8mrr9vTX81MTN3ymlilTaDF8FqKa6\\nGPWeU5tPqdJz6WpC+6sUoG6Iflv9avfer+lxDu3Bp1J/cdq/LrTPaqq+xd0dV/nYncraDBp+anzi\\n16rYur0tfVzXd7Vd2V+kPorvqcDcXl+S+bvrD6yD6lPcjyb2t56nhxaiNn3rGN+sBXdZ379KF6v2\\n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\\nIYQQQgghhBDCNRncCyGEEEIIIYQQjZwM7oUQQgghhBBCiEZOBvdCCCGEEEIIIUQjJ4N7IYQQQggh\\nhBCikXO6Wr4QQgghhBBCCCG8n6yWL4QQQgghhBBCXCR8jx0/fqGPQQghhBBCCCGEELVgGdPLtHwh\\nhBBCCCGEEKKRskzL963uRXFxq3pSR+LeNEjcmyaJe9MkcW+aJO5Nk8S9aZK4N02uLs7LPfdCCCGE\\nEEIIIUQjJ4N7IYQQQgghhBCikZPBvRBCCCGEEEII0cjJ4F4IIYQQQgghhGjkZHAvhBBCCCGEEEI0\\ncjK4F0IIIYQQQgghGrlGN7g//U0q8TH3cb2/Dk3TaObfk/6RT/NW+j7OlMEXCR3QNK3GrX8vHzRN\\nIyByPacc9lLK/y24B03T6BjyCnsx8M4jf6omvUVlOldb9e8X1fkje4H1d1ySXfNjPkzGPLYse4ah\\nIdegaRo6rSt3Rz7N0s37+F817/sp2z6Pde7Vlyemr2KHwX6f7uY1d45VuFvGLIwcSl9BbOQdBGjm\\nOF0bMoznFm3ioNExtatYNfPvyf0xU1mTWVDt3qrmCb/ufRgQ8yIbs+3fV1OeaO37IruR/OApy+9a\\nU94oyl7AzTodzXTDSDtu/p3Lj6fykI8vmqYxJtUSL6nTzyfburtq+RsQ8yIf7C20S++qHHXu1ZcJ\\nCc7LuMXJzU9Y049MPmL/2gfPcoWmodNuYUl2icN7y49v5pFOzdA0f/72QaFd3nG1WfKUq7SWdmdl\\nDXXMxawu5deWu20zVOY5H60Pr+c6vv5j6iPmPFixL0/ac+d1iuO+m3r7r8hmdvOWNf6mlnbR03rC\\norZ9vXJDNmsSxhHaq1ON/QEp3w2jujGdsSzLo/xj4Vl+cN3GXxsyjMnLPuNk2fn8ReqJMj8M0W7z\\nVgdSHlUdqxyrZfPRBqn1h0zq8/jLnL5edZv72pSKz9Kr2dvO2u3n3KEk1V/nY/NagUqObKsA1SVi\\nnTrp8ggr07naqn//+dVY4m7xe9Z867EmZpmqTXtyW5y6R69zGYeuoTPVjlP2n1FetE+9Ht3d5Xs0\\nAtUzSd+r0or07ua1mo71fPPOuLtbxpQqO5Whpod2dvl7N9OHqXnbfrV7jzuxCopeqf5bZL+vmvIE\\noHpHv6d+dHM/rXwS1LfqwuQH74y7eyp/V8f6utIRtWJQGwUoXy1cbTpm/p3LjqWoITofBaiYlBMV\\n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\\n\",\n      \"text/plain\": [\n       \"<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=1015x559 at 0x21058C3B780>\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAfkAAAD7CAYAAABpCe1bAAAEiElEQVR4nO3dwa3kMAwFQXLh/FPW\\nRvFHQKsqggf40OBF3nPOGQAgZ2dG5AEg6N/tAQDA3xB5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5\\nAIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIj6bg+47Zz3/rS7u7cnAPADLnkAiBJ5AIgSeQCIEnkA\\niBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiNqZee9dVwB4gEseAKJEHgCiRB4AokQeAKJEHgCiRB4A\\nokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgCivtsD4IZz3vvD8u7engD8mEseAKJEHgCi\\nRB4AokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJ2Zt573xMAHuCSB4AokQeAKJEHgCiRB4Ao\\nkQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgCiR\\nB4AokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgKjv9gCAXznn3J7wc7t7ewIXueQBIErk\\nASBK5AEgSuQBIErkASBK5AEgSuQBIErkASBK5AEgSuQBIGpn5r13HgHgAS55AIgSeQCIEnkAiBJ5\\nAIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkA\\niBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCI\\nEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIj6bg8A4O+dc25P+LndvT3hOpc8AESJPABE\\niTwARIk8AESJPABEiTwARIk8AESJPABEiTwARIk8AETtzLz31iEAPMAlDwBRIg8AUSIPAFEiDwBR\\nIg8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUd/MzDnv/W12d29PAIA/5ZIH\\ngCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgKidmffetAWAB7jkASDquz2Ae/yY\\nCKDNJQ8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUX5QAwBRLnkAiBJ5AIgS\\neQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIj6bg8Afuuc9/4u\\nvbu3J1znu7/JJQ8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUTsz7711CAAP\\ncMkDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CU\\nyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTI\\nA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQNR3zrm9AQD4A/8B\\ni5wo7x6tDuUAAAAASUVORK5CYII=\\n\",\n      \"text/plain\": [\n       \"<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=505x251 at 0x21058D92908>\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "14-Working-with-Images/02-Image-Exercise-Solution.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Image Exercise - Solution\\n\",\n    \"\\n\",\n    \"In the folder \\\"Working with Images\\\" (same folder this notebook is located in) there are two images we will be working with:\\n\",\n    \"* word_matrix.png\\n\",\n    \"* mask.png\\n\",\n    \"\\n\",\n    \"The word_matrix is a .png image that contains a spreadsheet of words with a hidden message in it. \\n\",\n    \"\\n\",\n    \"Your task is to use the mask.png image to reveal the hidden message inside the word_matrix.png. Keep in mind, you may need to resize the mask.png in order for this to work.\\n\",\n    \"\\n\",\n    \"This exercise is more open-ended, so we won't guide you with the steps, instead, letting you explore and figure things out on your own as you would in a real world situation. However, if you get stuck, you can always view the solutions video or notebook for guidance. Best of luck!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Import Images\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from PIL import Image\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"words = Image.open('word_matrix.png')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAA/cAAAIvCAYAAAAxnCs5AAEAAElEQVR4nOzde1wU5f7A8c8saODt\\nYJlnMUsotfSUgd3AsgLT1LIShULNAi8F5v3S0UINSktTS1MrFcoLdDSxoyWlCXVM4ddFOGbqURNN\\nk80stiShhH1+fywsC7sLu4DKwvf9es3rpezMzux8n3lu88wzmlJKUerEyZNc3b49onGRuDdOEvfG\\nSeLeOEncGyeJe+MkcW+cJO6NU+W46y7hsQghhBBCCCGEEKIOeAJomnapj0MIIYQQQgghhBAuKhuM\\nL3fuhRBCCCGEEEIIN+d54uTJS30MQgghhBBCCCGEqIGyNr2mlFIyLF8IIYQQQgghhHA/ZcPyPav6\\nUDRslTt1JO6Ng8S9cZK4N04S98ZJ4t44SdwbJ4l74+To5rw8cy+EEEIIIYQQQrg5adwLIYQQQggh\\nhBBuThr3QgghhBBCCCGEm5PGvRBCCCGEEEII4eakcS+EEEIIIYQQQrg5adwLIYQQQgghhBBuzq0b\\n92e+TiE++j5u8NWhaRpNfLvSJ+IZ3k7bj7E4k1lNm6FpWpVLC88X2UP5KyNMxlw2LxnLwODr0DQN\\nnXYtd0c8w+JN+/nd5ggMvPPo3+x+b+fgQUxasoPTxRfzjDQunye0cSm2AKc3PWX5fGjSUbvf+1fW\\nXMs6i7LM25ecTOFhD0+bfZSljxUZeRf89zYGpoKK15+maXQK7kVMwjq+Ollos36JIYO3po0i5KZ2\\nFeLxdtpRO9cr/JhVMc9of1Mvnpq2ip0G29fGWKcD66WJb1f6Rr/Iln35Tq1vvZSlJ1EVx/lq2eIX\\nsY6fce1atV5GpOTZrFv2N3scx9aXbqEjmZEkeX1NKbKYdZW5rP7HtB38Wenzv7Lm8vfS8/3PLfk2\\n2//f/DvQNI2r+qzkhNXfa1qWl6Ute1xJW8L5/LysLG8b/CrfUTmPrD4253MWcbPOnKffMqNiGlJk\\n1agu6FzZUvWxWe87IGF3jc9j4+Fandp+/u18+SF1+Iuj9uWnkfdG+KBpGp66B0g+UjGPqOsypLb5\\nUb2gzC9DrLC4g4PJj6u2lY67bPHQ+qs1h3ermU287X5uvTT3SFDfKJNSSqnT2+LUPXqdw3WvDZmh\\ndv5ssjqKPJUU0arK728TlKC+Omuy/yMuMXeMu7XP4q9wOrZmR9Wy/i0tn18ekKC+LrSNzZ+Zcyzr\\nLMw0f158Ilk9pPOoYn969fCcXaroIv322qivcS85m6lmBTu+ZrtP/dTq/Baq/yaOUh3QHK7facB8\\ntfds2XfvV8ujOjlcV8NfjU38rkL8rNOBo23Gr//e6fWt09OlUF/jbqv6fLVD+Fp1WtX0WkVFJ5+y\\nWbfsb/Y4E9vmHaPV2gPnLsYJcok7xP2zeH8FKG/dJPVFpTw5a97tlmPvWiEPUMqkstWcwGYKUIPf\\nLr8Wa1OWl6Ute1xJW5fapY67K/m5dVneN75yOVpdbApV2nQ/y/aeWpjaeKI8tiaV6WJd0JWypepj\\ns973zfG76vL0OnSp4147rtWp7effzpcfzqx7bUj9rcNbq89xr235ef5woupjle/2sskj6rYMqV1+\\ndHE5irtb3rk3GdNY+Pi/OA3cFbOW/+blU1hYyK95+9mW/BJhTw7h/o7BvPDXOZRSKKX4M3OOZfuF\\nmSbL3wuKn6c7GudzFvHg/S/xucFE66BYVmd+T/7ZQs7lH+U/iVO4R6/jaMYcBg54iX1FtsfUIXwt\\np0u/81x+Hv+XOIoOaJzJimPG8uyLd3IaoeYeCXyjymNaObZlzud8wJtpBZb//5oTx9o0o8v7i04+\\nVbqPQn7N28PyqE6Agc0zniExR9XBL2qcvloxnhcyC/HQ+vNqetn1l8+R7FReG/UAw8JCuax03R82\\njKZ39AqOo+g0IIFPDpzCWGi+Xj+eN5gOaFx3Ww86tAAwsvnZ/sQkHQb0DJ7zIQfz8jl3Np8fD2xl\\nbnhHFLksie7FhA3277pZ8ozzhfySu5VpIe1R5LL8sZfYesY25tZ5jPUyMUiz8+3CEet81Xo5tn4o\\nVzqxffm1WnFZFelb42Oyju25/Dy+TJ7KPXodfxxJZHToFHbYSQ+iaoF3DaMtUGhK5suc8r8rckhP\\n2Wf5f+6CrXxdVH5+i3MyeC+nEI1AQm/zB6h1We6sC5G2GhJX8nNrH88cxPgU+6Pq7Ck5k0bKvB8t\\n/y9WqbyZUl7n0ghyqS7oWtkiLpS6qFO7Un442t/RDKnD16WalJ/fbHqTbaYSy/93zl5ls15dliHW\\nXM2P6gu3bNwXH8zh7ZK/AOg/ZAjd9D54eXnRWt+F3pEzWJ/oXMWvXC4rn5vFl8pE64AZbNv+Bo8H\\nXYtPCy+8ffzpGTWfLRueo5tmzljmVhNobx89t0fN4+XoVgD836KtdoZ2iIuriB3rF7NXKfT9Epgd\\n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\\n69x0+9d5/Bg1dw53aTp+y19Cv9An2ZB1HGNhMUXGXPYmTaNfxFwOKkXbwARm2M2h6xY62rrIwuzp\\nyRw0FFNcbOTbjHlMfOY9ALo+EeP0+BNHXtwbt846/7Y8nVcwT74UQTvgh7TR9Or/PLuO5vNrcTFF\\nRgNfZ2ZXOkJACAGtg2N5uSyfpYy5m4j57/Ffg5Hi4mJ+ycvktQmD6OQXwpJPC5z2re3yo+RYCo92\\n7WVd2Mm8vZFv05J4Y/dvANzSQX/5fhzhVpHRwP6U6fQb8CyfKxPNfWJ5Oto8jE/Dn5AnbgMgZ34c\\nz6Yc4Mey2H8wfyLP7TwH6Hl0WJjcjW0E7httXlTT0zeKNanx3KXpKMiZx4jYZLkwf0UVs2tBAH+P\\nfN68eKnRXO4XGLJJ3vAmAF76m7m2LVzISWJ+UuXrLfycvZjtGbZemkeHvkSVLaz3RdpODipF+76x\\nPOQvF/Xqq9bBk3kt1hdwbDMUFRo5fTSNFyJ7l63NoWfoy09yd1kn8dyn86yPuh26biERtwYxZUkc\\nd2k6zmbFMW1hw3nmeV3i0SGYAYNaAJB7zHwx5t6IEOtceE//YB71N19kySpbq6hfz27Wi2+lZ7ex\\nckblT8KxH7lzY9Qc6/ppCb17MTVpHyeM5r7gL3mZZH7VADv8SikFOLwup5KTyaq/zsPpHCwvTy1c\\nbT1pUkopdWZXnLpXr3O77fXBM9Xen0zlPqFIfTQvVLVzs0+LTjHq3VyTy/OJST7tcKTSc5lqdlAz\\n675LMk0On/OfxNGqI5rb89MRpNZ+Zd7nfOY8t9tZXuU/v7ZdybjXrnyVFNlaAapjxEZ1pty7FcVU\\nKcdYWGJaWboE1B3xn12G71b76nrcS88dVquiO1fw2+vVI0u+VMXq0pYfOcvuqTD+1wcnqP3nzNt/\\nFH91hdvan8eVUtfjXhVVKTdbdIpRG4/87rBf6blMNTukg9t9AqLfVt/bbd+Q8n99jrslX7XwSFBf\\nqvL5x3W5X1l5Xr4OOJo8zNo+iHr9O6ft62v861vcS8/tVGM8mrr9vTX81MTN3ymlilTaDF8FqKa6\\nGPWeU5tPqdJz6WpC+6sUoG6Iflv9avfer+lxDu3Bp1J/cdq/LrTPaqq+xd0dV/nYncraDBp+anzi\\n16rYur0tfVzXd7Vd2V+kPorvqcDcXl+S+bvrD6yD6lPcjyb2t56nhxaiNn3rGN+sBXdZ379KF6v2\\n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\\nIYQQQgghhBDCNRncCyGEEEIIIYQQjZwM7oUQQgghhBBCiEZOBvdCCCGEEEIIIUQjJ4N7IYQQQggh\\nhBCikXO6Wr4QQgghhBBCCCG8n6yWL4QQQgghhBBCXCR8jx0/fqGPQQghhBBCCCGEELVgGdPLtHwh\\nhBBCCCGEEKKRskzL963uRXFxq3pSR+LeNEjcmyaJe9MkcW+aJO5Nk8S9aZK4N02uLs7LPfdCCCGE\\nEEIIIUQjJ4N7IYQQQgghhBCikZPBvRBCCCGEEEII0cjJ4F4IIYQQQgghhGjkZHAvhBBCCCGEEEI0\\ncjK4F0IIIYQQQgghGrlGN7g//U0q8TH3cb2/Dk3TaObfk/6RT/NW+j7OlMEXCR3QNK3GrX8vHzRN\\nIyByPacc9lLK/y24B03T6BjyCnsx8M4jf6omvUVlOldb9e8X1fkje4H1d1ySXfNjPkzGPLYse4ah\\nIdegaRo6rSt3Rz7N0s37+F817/sp2z6Pde7Vlyemr2KHwX6f7uY1d45VuFvGLIwcSl9BbOQdBGjm\\nOF0bMoznFm3ioNExtatYNfPvyf0xU1mTWVDt3qrmCb/ufRgQ8yIbs+3fV1OeaO37IruR/OApy+9a\\nU94oyl7AzTodzXTDSDtu/p3Lj6fykI8vmqYxJtUSL6nTzyfburtq+RsQ8yIf7C20S++qHHXu1ZcJ\\nCc7LuMXJzU9Y049MPmL/2gfPcoWmodNuYUl2icN7y49v5pFOzdA0f/72QaFd3nG1WfKUq7SWdmdl\\nDXXMxawu5deWu20zVOY5H60Pr+c6vv5j6iPmPFixL0/ac+d1iuO+m3r7r8hmdvOWNf6mlnbR03rC\\norZ9vXJDNmsSxhHaq1ON/QEp3w2jujGdsSzLo/xj4Vl+cN3GXxsyjMnLPuNk2fn8ReqJMj8M0W7z\\nVgdSHlUdqxyrZfPRBqn1h0zq8/jLnL5edZv72pSKz9Kr2dvO2u3n3KEk1V/nY/NagUqObKsA1SVi\\nnTrp8ggr07naqn//+dVY4m7xe9Z867EmZpmqTXtyW5y6R69zGYeuoTPVjlP2n1FetE+9Ht3d5Xs0\\nAtUzSd+r0or07ua1mo71fPPOuLtbxpQqO5Whpod2dvl7N9OHqXnbfrV7jzuxCopeqf5bZL+vmvIE\\noHpHv6d+dHM/rXwS1LfqwuQH74y7eyp/V8f6utIRtWJQGwUoXy1cbTpm/p3LjqWoITofBaiYlBMV\\n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\\n\",\n      \"text/plain\": [\n       \"<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=1015x559 at 0x21058C3B780>\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"words\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"mask = Image.open(\\\"mask.png\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAfkAAAD7CAYAAABpCe1bAAAEiElEQVR4nO3dwa3kMAwFQXLh/FPW\\nRvFHQKsqggf40OBF3nPOGQAgZ2dG5AEg6N/tAQDA3xB5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5\\nAIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIj6bg+47Zz3/rS7u7cnAPADLnkAiBJ5AIgSeQCIEnkA\\niBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiNqZee9dVwB4gEseAKJEHgCiRB4AokQeAKJEHgCiRB4A\\nokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgCivtsD4IZz3vvD8u7engD8mEseAKJEHgCi\\nRB4AokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJ2Zt573xMAHuCSB4AokQeAKJEHgCiRB4Ao\\nkQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgCiR\\nB4AokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgKjv9gCAXznn3J7wc7t7ewIXueQBIErk\\nASBK5AEgSuQBIErkASBK5AEgSuQBIErkASBK5AEgSuQBIGpn5r13HgHgAS55AIgSeQCIEnkAiBJ5\\nAIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkA\\niBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCI\\nEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIj6bg8A4O+dc25P+LndvT3hOpc8AESJPABE\\niTwARIk8AESJPABEiTwARIk8AESJPABEiTwARIk8AETtzLz31iEAPMAlDwBRIg8AUSIPAFEiDwBR\\nIg8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUd/MzDnv/W12d29PAIA/5ZIH\\ngCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgCiRB4AokQeAKJEHgKidmffetAWAB7jkASDquz2Ae/yY\\nCKDNJQ8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUX5QAwBRLnkAiBJ5AIgS\\neQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIgSeQCIEnkAiBJ5AIj6bg8Afuuc9/4u\\nvbu3J1znu7/JJQ8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUSIPAFEiDwBRIg8AUTsz7711CAAP\\ncMkDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CU\\nyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTI\\nA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQJTIA0CUyANAlMgDQNR3zrm9AQD4A/8B\\ni5wo7x6tDuUAAAAASUVORK5CYII=\\n\",\n      \"text/plain\": [\n       \"<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=505x251 at 0x21058D92908>\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mask\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Resize Images to Match\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(505, 251)\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mask.size\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(1015, 559)\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"words.size\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"mask = mask.resize((1015,559))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(1015, 559)\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mask.size\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Add in alpha parameter\\n\",\n    \"\\n\",\n    \"Now we can't just paste them over, otherwise we won't see what is underneath, we need to add an alpha value.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"mask.putalpha(200)\\n\",\n    \"# links.putalpha(128)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\nAwAAQNxfxaEjW03OYssAAAAASUVORK5CYII=\\n\",\n      \"text/plain\": [\n       \"<PIL.Image.Image image mode=RGBA size=1015x559 at 0x2105909B400>\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"mask\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"words.paste(mask,(0,0),mask)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=1015x559 at 0x21058C3B780>\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"words\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Excellent! Hope you enjoyed this one!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "15-PDFs-and-Spreadsheets/.ipynb_checkpoints/00-Working-with-CSV-Files-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Working with CSV Files\\n\",\n    \"\\n\",\n    \"Welcome back! Let's discuss how to work with CSV files in Python. A file with the CSV file extension is a Comma Separated Values file. All CSV files are plain text, contain alphanumeric characters, and structure the data contained within them in a tabular form. Don't confuse Excel Files with csv files, while csv files are formatted very similarly to excel files, they don't have data types for their values, they are all strings with no font or color. They also don't have worksheets the way an excel file does. Python does have several libraries for working with Excel files, you can check them out [here](http://www.python-excel.org/) and [here](https://www.xlwings.org/).\\n\",\n    \"\\n\",\n    \"Files in the CSV format are generally used to exchange data, usually when there's a large amount, between different applications. Database programs, analytical software, and other applications that store massive amounts of information (like contacts and customer data), will usually support the CSV format.\\n\",\n    \"\\n\",\n    \"Let's explore how we can open a csv file with Python's built-in csv library. \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"## Notebook Location. \\n\",\n    \"\\n\",\n    \"Run **pwd** inside a notebook cell to find out where your notebook is located\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\15-PDFs-and-Spreadsheets'\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"pwd\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"## Reading CSV Files\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import csv\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"When passing in the file path, make sure to include the extension if it has one, you should be able to Tab Autocomplete the file name. If you can't Tab autocomplete, that is a good indicator your file is not in the same location as your notebook. You can always type in the entire file path (it will look similar in formatting to the output of **pwd**.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"data = open('example.csv')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<_io.TextIOWrapper name='example.csv' mode='r' encoding='cp1252'>\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"data\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Encoding\\n\",\n    \"\\n\",\n    \"Often csv files may contain characters that you can't interpret with standard python, this could be something like an **@** symbol, or even foreign characters. Let's view an example of this sort of error ([its pretty common, so its important to go over](https://stackoverflow.com/questions/9233027/unicodedecodeerror-charmap-codec-cant-decode-byte-x-in-position-y-character)).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"csv_data = csv.reader(data)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Cast to a list will give an error, note the **can't decode** line in the error, this is a giveaway that we have an encoding problem!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"UnicodeDecodeError\",\n     \"evalue\": \"'charmap' codec can't decode byte 0x8d in position 1835: character maps to <undefined>\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mUnicodeDecodeError\\u001b[0m                        Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-6-1f501450909b>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mdata_lines\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[0mlist\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mcsv_data\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;32mC:\\\\ProgramData\\\\Anaconda3\\\\lib\\\\encodings\\\\cp1252.py\\u001b[0m in \\u001b[0;36mdecode\\u001b[1;34m(self, input, final)\\u001b[0m\\n\\u001b[0;32m     21\\u001b[0m \\u001b[1;32mclass\\u001b[0m \\u001b[0mIncrementalDecoder\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mcodecs\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mIncrementalDecoder\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m     22\\u001b[0m     \\u001b[1;32mdef\\u001b[0m \\u001b[0mdecode\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mself\\u001b[0m\\u001b[1;33m,\\u001b[0m \\u001b[0minput\\u001b[0m\\u001b[1;33m,\\u001b[0m \\u001b[0mfinal\\u001b[0m\\u001b[1;33m=\\u001b[0m\\u001b[1;32mFalse\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m---> 23\\u001b[1;33m         \\u001b[1;32mreturn\\u001b[0m \\u001b[0mcodecs\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mcharmap_decode\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0minput\\u001b[0m\\u001b[1;33m,\\u001b[0m\\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0merrors\\u001b[0m\\u001b[1;33m,\\u001b[0m\\u001b[0mdecoding_table\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m[\\u001b[0m\\u001b[1;36m0\\u001b[0m\\u001b[1;33m]\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[0;32m     24\\u001b[0m \\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m     25\\u001b[0m \\u001b[1;32mclass\\u001b[0m \\u001b[0mStreamWriter\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mCodec\\u001b[0m\\u001b[1;33m,\\u001b[0m\\u001b[0mcodecs\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mStreamWriter\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[1;31mUnicodeDecodeError\\u001b[0m: 'charmap' codec can't decode byte 0x8d in position 1835: character maps to <undefined>\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"data_lines = list(csv_data)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's not try reading it with a \\\"utf-8\\\" encoding.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"data = open('example.csv',encoding=\\\"utf-8\\\")\\n\",\n    \"csv_data = csv.reader(data)\\n\",\n    \"data_lines = list(csv_data)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[['id', 'first_name', 'last_name', 'email', 'gender', 'ip_address', 'city'],\\n\",\n       \" ['1',\\n\",\n       \"  'Joseph',\\n\",\n       \"  'Zaniolini',\\n\",\n       \"  'jzaniolini0@simplemachines.org',\\n\",\n       \"  'Male',\\n\",\n       \"  '163.168.68.132',\\n\",\n       \"  'Pedro Leopoldo'],\\n\",\n       \" ['2',\\n\",\n       \"  'Freida',\\n\",\n       \"  'Drillingcourt',\\n\",\n       \"  'fdrillingcourt1@umich.edu',\\n\",\n       \"  'Female',\\n\",\n       \"  '97.212.102.79',\\n\",\n       \"  'Buri']]\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Looks like it worked!\\n\",\n    \"data_lines[:3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note the first item in the list is the header line, this contains the information about what each column represents. Let's format our printing just a bit:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"['id', 'first_name', 'last_name', 'email', 'gender', 'ip_address', 'city']\\n\",\n      \"['1', 'Joseph', 'Zaniolini', 'jzaniolini0@simplemachines.org', 'Male', '163.168.68.132', 'Pedro Leopoldo']\\n\",\n      \"['2', 'Freida', 'Drillingcourt', 'fdrillingcourt1@umich.edu', 'Female', '97.212.102.79', 'Buri']\\n\",\n      \"['3', 'Nanni', 'Herity', 'nherity2@statcounter.com', 'Female', '145.151.178.98', 'Claver']\\n\",\n      \"['4', 'Orazio', 'Frayling', 'ofrayling3@economist.com', 'Male', '25.199.143.143', 'Kungur']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for line in data_lines[:5]:\\n\",\n    \"    print(line)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's imagine we wanted a list of  all the emails. For demonstration, since there are 1000 items plus the header, we will only do a few rows.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1001\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(data_lines)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"all_emails = []\\n\",\n    \"for line in data_lines[1:15]:\\n\",\n    \"    all_emails.append(line[3])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"['jzaniolini0@simplemachines.org', 'fdrillingcourt1@umich.edu', 'nherity2@statcounter.com', 'ofrayling3@economist.com', 'jmurrison4@cbslocal.com', 'lgamet5@list-manage.com', 'dhowatt6@amazon.com', 'kherion7@amazon.com', 'chedworth8@china.com.cn', 'hgasquoine9@google.ru', 'ftarra@shareasale.com', 'abathb@umn.edu', 'lchastangc@goo.gl', 'cceried@yale.edu']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(all_emails)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What if we wanted a list of full names?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"full_names = []\\n\",\n    \"\\n\",\n    \"for line in data_lines[1:15]:\\n\",\n    \"    full_names.append(line[1]+' '+line[2])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['Joseph Zaniolini',\\n\",\n       \" 'Freida Drillingcourt',\\n\",\n       \" 'Nanni Herity',\\n\",\n       \" 'Orazio Frayling',\\n\",\n       \" 'Julianne Murrison',\\n\",\n       \" 'Lucy Gamet',\\n\",\n       \" 'Dyana Howatt',\\n\",\n       \" 'Kassey Herion',\\n\",\n       \" 'Chrissy Hedworth',\\n\",\n       \" 'Hyatt Gasquoine',\\n\",\n       \" 'Felicdad Tarr',\\n\",\n       \" 'Andrew Bath',\\n\",\n       \" 'Lucais Chastang',\\n\",\n       \" 'Car Cerie']\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"full_names\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Writing to CSV Files\\n\",\n    \"\\n\",\n    \"We can also write csv files, either new ones or add on to existing ones.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### New File \\n\",\n    \"**This will also overwrite any exisiting file with the same name, so be careful with this!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# newline controls how universal newlines works (it only applies to text\\n\",\n    \"# mode). It can be None, '', '\\\\n', '\\\\r', and '\\\\r\\\\n'. \\n\",\n    \"file_to_output = open('to_save_file.csv','w',newline='')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"csv_writer = csv.writer(file_to_output,delimiter=',')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"7\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"csv_writer.writerow(['a','b','c'])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"csv_writer.writerows([['1','2','3'],['4','5','6']])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"file_to_output.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"### Existing File \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"f = open('to_save_file.csv','a',newline='')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"csv_writer = csv.writer(f)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"13\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"csv_writer.writerow(['new','new','new'])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"That is all for the basics! If you believe you will be working with CSV files often, you may want to check out the powerful [pandas library](https://pandas.pydata.org/).\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "15-PDFs-and-Spreadsheets/.ipynb_checkpoints/01-Working-with-PDFs-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Working with PDF Files\\n\",\n    \"\\n\",\n    \"Welcome back Agent. Often you will have to deal with PDF files. There are [many libraries in Python for working with PDFs](https://www.binpress.com/tutorial/manipulating-pdfs-with-python/167), each with their pros and cons, the most common one being **PyPDF2**. You can install it with (note the case-sensitivity, you need to make sure your capitilization matches):\\n\",\n    \"\\n\",\n    \"    pip install PyPDF2\\n\",\n    \"    \\n\",\n    \"Keep in mind that not every PDF file can be read with this library. PDFs that are too blurry, have a special encoding, encrypted, or maybe just created with a particular program that doesn't work well with PyPDF2 won't be able to be read. If you find yourself in this situation, try using the libraries linked above, but keep in mind, these may also not work. The reason for this is because of the many different parameters for a PDF and how non-standard the settings can be, text could be shown as an image instead of a utf-8 encoding. There are many parameters to consider in this aspect.\\n\",\n    \"\\n\",\n    \"As far as PyPDF2 is concerned, it can only read the text from a PDF document, it won't be able to grab images or other media files from a PDF.\\n\",\n    \"___\\n\",\n    \"\\n\",\n    \"## Working with PyPDF2\\n\",\n    \"\\n\",\n    \"Let's being showing the basics of the PyPDF2 library.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Collecting PyPDF2\\n\",\n      \"  Downloading pypdf2-3.0.1-py3-none-any.whl (232 kB)\\n\",\n      \"     ------------------------------------ 232.6/232.6 kB 490.8 kB/s eta 0:00:00\\n\",\n      \"Requirement already satisfied: typing_extensions>=3.10.0.0 in c:\\\\users\\\\jmpor\\\\anaconda3\\\\lib\\\\site-packages (from PyPDF2) (4.3.0)\\n\",\n      \"Installing collected packages: PyPDF2\\n\",\n      \"Successfully installed PyPDF2-3.0.1\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!pip install PyPDF2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# note the capitalization\\n\",\n    \"import PyPDF2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Reading PDFs\\n\",\n    \"\\n\",\n    \"Similar to the csv library, we open a pdf, then create a reader object for it. Notice how we use the binary method of reading , 'rb', instead of just 'r'.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Notice we read it as a binary with 'rb'\\n\",\n    \"f = open('Working_Business_Proposal.pdf','rb')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pdf_reader = PyPDF2.PdfReader(f)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"5\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(pdf_reader.pages)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"page_number = 0\\n\",\n    \"page_one = pdf_reader.pages[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can then extract the text:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"page_one_text = page_one.extract_text()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Business Proposal The Revolution is Coming Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment. Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring. Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line. Podcasting operational change management inside of workﬂows to establish a framework. Taking seamless key performance indicators ofﬂine to maximise the long tail. Keeping your eye on the ball while performing a deep dive on the start-up mentality to derive convergence on cross-platform integration. Collaboratively administrate empowered markets via plug-and-play networks. Dynamically procrastinate B2C users after installed base beneﬁts. Dramatically visualize customer directed convergence without revolutionary ROI. Efﬁciently unleash cross-media information without cross-media value. Quickly maximize timely deliverables for real-time schemas. Dramatically maintain clicks-and-mortar solutions without functional solutions. BUSINESS PROPOSAL!1'\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"page_one_text\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Adding to PDFs\\n\",\n    \"\\n\",\n    \"We can not write to PDFs using Python because of the differences between the single string type of Python, and the variety of fonts, placements, and other parameters that a PDF could have.\\n\",\n    \"\\n\",\n    \"What we can do is copy pages and append pages to the end.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"f = open('Working_Business_Proposal.pdf','rb')\\n\",\n    \"pdf_reader = PyPDF2.PdfReader(f)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"page_number = 0\\n\",\n    \"page_one = pdf_reader.pages[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pdf_writer = PyPDF2.PdfWriter()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pdf_writer.add_page(page_one);\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pdf_output = open(\\\"Some_New_Doc.pdf\\\",\\\"wb\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(False, <_io.BufferedWriter name='Some_New_Doc.pdf'>)\"\n      ]\n     },\n     \"execution_count\": 28,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"pdf_writer.write(pdf_output)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we have copied a page and added it to another new document!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Simple Example\\n\",\n    \"\\n\",\n    \"Let's try to grab all the text from this PDF file:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"f = open('Working_Business_Proposal.pdf','rb')\\n\",\n    \"\\n\",\n    \"# List of every page's text.\\n\",\n    \"# The index will correspond to the page number.\\n\",\n    \"pdf_text = []\\n\",\n    \"\\n\",\n    \"pdf_reader = PyPDF2.PdfReader(f)\\n\",\n    \"\\n\",\n    \"for p in range(len(pdf_reader.pages)):\\n\",\n    \"    \\n\",\n    \"    page = pdf_reader.pages[0]\\n\",\n    \"    \\n\",\n    \"    pdf_text.append(page.extract_text())\\n\",\n    \"    \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['Business Proposal The Revolution is Coming Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment. Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring. Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line. Podcasting operational change management inside of workﬂows to establish a framework. Taking seamless key performance indicators ofﬂine to maximise the long tail. Keeping your eye on the ball while performing a deep dive on the start-up mentality to derive convergence on cross-platform integration. Collaboratively administrate empowered markets via plug-and-play networks. Dynamically procrastinate B2C users after installed base beneﬁts. Dramatically visualize customer directed convergence without revolutionary ROI. Efﬁciently unleash cross-media information without cross-media value. Quickly maximize timely deliverables for real-time schemas. Dramatically maintain clicks-and-mortar solutions without functional solutions. BUSINESS PROPOSAL!1',\\n\",\n       \" 'Business Proposal The Revolution is Coming Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment. Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring. Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line. Podcasting operational change management inside of workﬂows to establish a framework. Taking seamless key performance indicators ofﬂine to maximise the long tail. Keeping your eye on the ball while performing a deep dive on the start-up mentality to derive convergence on cross-platform integration. Collaboratively administrate empowered markets via plug-and-play networks. Dynamically procrastinate B2C users after installed base beneﬁts. Dramatically visualize customer directed convergence without revolutionary ROI. Efﬁciently unleash cross-media information without cross-media value. Quickly maximize timely deliverables for real-time schemas. Dramatically maintain clicks-and-mortar solutions without functional solutions. BUSINESS PROPOSAL!1',\\n\",\n       \" 'Business Proposal The Revolution is Coming Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment. Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring. Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line. Podcasting operational change management inside of workﬂows to establish a framework. Taking seamless key performance indicators ofﬂine to maximise the long tail. Keeping your eye on the ball while performing a deep dive on the start-up mentality to derive convergence on cross-platform integration. Collaboratively administrate empowered markets via plug-and-play networks. Dynamically procrastinate B2C users after installed base beneﬁts. Dramatically visualize customer directed convergence without revolutionary ROI. Efﬁciently unleash cross-media information without cross-media value. Quickly maximize timely deliverables for real-time schemas. Dramatically maintain clicks-and-mortar solutions without functional solutions. BUSINESS PROPOSAL!1',\\n\",\n       \" 'Business Proposal The Revolution is Coming Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment. Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring. Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line. Podcasting operational change management inside of workﬂows to establish a framework. Taking seamless key performance indicators ofﬂine to maximise the long tail. Keeping your eye on the ball while performing a deep dive on the start-up mentality to derive convergence on cross-platform integration. Collaboratively administrate empowered markets via plug-and-play networks. Dynamically procrastinate B2C users after installed base beneﬁts. Dramatically visualize customer directed convergence without revolutionary ROI. Efﬁciently unleash cross-media information without cross-media value. Quickly maximize timely deliverables for real-time schemas. Dramatically maintain clicks-and-mortar solutions without functional solutions. BUSINESS PROPOSAL!1',\\n\",\n       \" 'Business Proposal The Revolution is Coming Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment. Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring. Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line. Podcasting operational change management inside of workﬂows to establish a framework. Taking seamless key performance indicators ofﬂine to maximise the long tail. Keeping your eye on the ball while performing a deep dive on the start-up mentality to derive convergence on cross-platform integration. Collaboratively administrate empowered markets via plug-and-play networks. Dynamically procrastinate B2C users after installed base beneﬁts. Dramatically visualize customer directed convergence without revolutionary ROI. Efﬁciently unleash cross-media information without cross-media value. Quickly maximize timely deliverables for real-time schemas. Dramatically maintain clicks-and-mortar solutions without functional solutions. BUSINESS PROPOSAL!1']\"\n      ]\n     },\n     \"execution_count\": 32,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"pdf_text\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Business Proposal The Revolution is Coming Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment. Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring. Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line. Podcasting operational change management inside of workﬂows to establish a framework. Taking seamless key performance indicators ofﬂine to maximise the long tail. Keeping your eye on the ball while performing a deep dive on the start-up mentality to derive convergence on cross-platform integration. Collaboratively administrate empowered markets via plug-and-play networks. Dynamically procrastinate B2C users after installed base beneﬁts. Dramatically visualize customer directed convergence without revolutionary ROI. Efﬁciently unleash cross-media information without cross-media value. Quickly maximize timely deliverables for real-time schemas. Dramatically maintain clicks-and-mortar solutions without functional solutions. BUSINESS PROPOSAL!1\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(pdf_text[3])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Excellent work! That is all for PyPDF2 for now, remember that this won't work with every PDF file and is limited in its scope to only text of PDFs.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3 (ipykernel)\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.9.13\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "15-PDFs-and-Spreadsheets/.ipynb_checkpoints/02-PDFs-Spreadsheets-Puzzle-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# PDFs and Spreadsheets Puzzle Exercise\\n\",\n    \"\\n\",\n    \"Let's test your skills, the files needed for this puzzle exercise\\n\",\n    \"\\n\",\n    \"You will need to work with two files for this exercise and solve the following tasks:\\n\",\n    \"\\n\",\n    \"* Task One: Use Python to extract the Google Drive link from the .csv file. (Hint: Its along the diagonal from top left to bottom right).\\n\",\n    \"* Task Two: Download the PDF from the Google Drive link (we already downloaded it for you just in case you can't download from Google Drive) and find the phone number that is in the document. Note: There are different ways of formatting a phone number!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Task One: Grab the Google Drive Link from .csv File\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'https://drive.google.com/open?id=1G6SEgg018UB4_4xsAJJ5TdzrhmXipr4Q'\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# THe correct result is shown below, if you can't download from Google Drive, \\n\",\n    \"# we added the PDF file to the Exercise_Files folder already\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Task Two: Download the PDF from the Google Drive link and find the phone number that is in the document. \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# You should get this phone number\\n\",\n    \"# 505 503 4455\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"anaconda-cloud\": {},\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "15-PDFs-and-Spreadsheets/.ipynb_checkpoints/03-PDFs-Spreadsheets-Puzzle-Solution-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# PDFs and Spreadsheets Puzzle Exercise\\n\",\n    \"\\n\",\n    \"You will need to work with two files for this exercise and solve the following tasks:\\n\",\n    \"\\n\",\n    \"* Task One: Grab the Google Drive link from the .csv file. (Hint: Its along the diagonal).\\n\",\n    \"* Task Two: Download the PDF from the Google Drive link (we already downloaded it for you just in case you can't download from Google Drive) and find the phone number that is in the document. Note: There are different ways of formatting a phone number!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Task One: Grab the Google Drive Link from .csv File\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import csv\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Grab all the lines of data.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"data = open('Exercise_Files/find_the_link.csv',encoding=\\\"utf-8\\\")\\n\",\n    \"csv_data = csv.reader(data)\\n\",\n    \"data_lines = list(csv_data)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**We can see its along the diagonal, which means the values are at the index position that matches the row's number order. So the 1st letter is the 1st item in the 1st row, the 2nd letter is the 2nd item in the 2nd row, the 3rd item is the 3rd letter in the 3rd row and so on. We can use enumerate to track the row number and simply index off the data_lines.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Method One**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"link_list = []\\n\",\n    \"for row_num,data in enumerate(data_lines):\\n\",\n    \"    link_list.append(data[row_num])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'https://drive.google.com/open?id=1G6SEgg018UB4_4xsAJJ5TdzrhmXipr4Q'\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"''.join(link_list)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Method Two**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"link_str = ''\\n\",\n    \"for row_num,data in enumerate(data_lines):\\n\",\n    \"    link_str+=data[row_num]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'https://drive.google.com/open?id=1G6SEgg018UB4_4xsAJJ5TdzrhmXipr4Q'\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"link_str\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Task Two: Download the PDF from the Google Drive link and find the phone number that is in the document. \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import PyPDF2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"f = open('Exercise_Files/Find_the_Phone_Number.pdf','rb')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pdf = PyPDF2.PdfReader(f)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"17\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(pdf.pages)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Phone Number Matching\\n\",\n    \"\\n\",\n    \"Lot's of ways to do this, but you had to figure out the phone number was in format ###.###.####\\n\",\n    \"\\n\",\n    \"Hint: https://stackoverflow.com/questions/4697882/how-can-i-find-all-matches-to-a-regular-expression-in-python\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import re\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pattern = r'\\\\d{3}'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"all_text = ''\\n\",\n    \"\\n\",\n    \"for n in range(len(pdf.pages)):\\n\",\n    \"    \\n\",\n    \"    page = pdf.pages[n]\\n\",\n    \"    page_text = page.extract_text()\\n\",\n    \"    \\n\",\n    \"    all_text = all_text+' '+page_text\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(650, 653), match='000'>\\n\",\n      \"<re.Match object; span=(18270, 18273), match='000'>\\n\",\n      \"<re.Match object; span=(35890, 35893), match='000'>\\n\",\n      \"<re.Match object; span=(42919, 42922), match='505'>\\n\",\n      \"<re.Match object; span=(42923, 42926), match='503'>\\n\",\n      \"<re.Match object; span=(42927, 42930), match='445'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for match in re.finditer(pattern,all_text):\\n\",\n    \"    print(match)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Once you know the correct pattern:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import re\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pattern = r'\\\\d{3}.\\\\d{3}.\\\\d{4}' \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"505.503.4455\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for n in range(len(pdf.pages)):\\n\",\n    \"    \\n\",\n    \"    page  = pdf.pages[n]\\n\",\n    \"    page_text = page.extract_text()\\n\",\n    \"    match = re.search(pattern,page_text)\\n\",\n    \"    \\n\",\n    \"    if match:\\n\",\n    \"        print(match.group())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great Job! Information on this phone number: \\n\",\n    \"* https://www.businessinsider.com/better-call-saul-billboard-and-phone-number-2014-7\\n\",\n    \"* https://www.reddit.com/r/betterCallSaul/comments/4awouf/heres_a_list_of_real_numbers_you_can_call_from/\\n\",\n    \"* https://www.amc.com/shows/better-call-saul/talk/2020/03/saul-goodmans-phone-number-is-the-latest-breaking-bad-callback\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"anaconda-cloud\": {},\n  \"kernelspec\": {\n   \"display_name\": \"Python 3 (ipykernel)\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.9.13\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "15-PDFs-and-Spreadsheets/00-Working-with-CSV-Files.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Working with CSV Files\\n\",\n    \"\\n\",\n    \"Welcome back! Let's discuss how to work with CSV files in Python. A file with the CSV file extension is a Comma Separated Values file. All CSV files are plain text, contain alphanumeric characters, and structure the data contained within them in a tabular form. Don't confuse Excel Files with csv files, while csv files are formatted very similarly to excel files, they don't have data types for their values, they are all strings with no font or color. They also don't have worksheets the way an excel file does. Python does have several libraries for working with Excel files, you can check them out [here](http://www.python-excel.org/) and [here](https://www.xlwings.org/).\\n\",\n    \"\\n\",\n    \"Files in the CSV format are generally used to exchange data, usually when there's a large amount, between different applications. Database programs, analytical software, and other applications that store massive amounts of information (like contacts and customer data), will usually support the CSV format.\\n\",\n    \"\\n\",\n    \"Let's explore how we can open a csv file with Python's built-in csv library. \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"## Notebook Location. \\n\",\n    \"\\n\",\n    \"Run **pwd** inside a notebook cell to find out where your notebook is located\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'C:\\\\\\\\Users\\\\\\\\Marcial\\\\\\\\Pierian-Data-Courses\\\\\\\\Complete-Python-3-Bootcamp\\\\\\\\15-PDFs-and-Spreadsheets'\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"pwd\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"## Reading CSV Files\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import csv\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"When passing in the file path, make sure to include the extension if it has one, you should be able to Tab Autocomplete the file name. If you can't Tab autocomplete, that is a good indicator your file is not in the same location as your notebook. You can always type in the entire file path (it will look similar in formatting to the output of **pwd**.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"data = open('example.csv')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<_io.TextIOWrapper name='example.csv' mode='r' encoding='cp1252'>\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"data\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Encoding\\n\",\n    \"\\n\",\n    \"Often csv files may contain characters that you can't interpret with standard python, this could be something like an **@** symbol, or even foreign characters. Let's view an example of this sort of error ([its pretty common, so its important to go over](https://stackoverflow.com/questions/9233027/unicodedecodeerror-charmap-codec-cant-decode-byte-x-in-position-y-character)).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"csv_data = csv.reader(data)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Cast to a list may give an error, note the **can't decode** line in the error, this is a giveaway that we have an encoding problem!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"UnicodeDecodeError\",\n     \"evalue\": \"'charmap' codec can't decode byte 0x8d in position 1835: character maps to <undefined>\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mUnicodeDecodeError\\u001b[0m                        Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-6-1f501450909b>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mdata_lines\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[0mlist\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mcsv_data\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;32mC:\\\\ProgramData\\\\Anaconda3\\\\lib\\\\encodings\\\\cp1252.py\\u001b[0m in \\u001b[0;36mdecode\\u001b[1;34m(self, input, final)\\u001b[0m\\n\\u001b[0;32m     21\\u001b[0m \\u001b[1;32mclass\\u001b[0m \\u001b[0mIncrementalDecoder\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mcodecs\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mIncrementalDecoder\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m     22\\u001b[0m     \\u001b[1;32mdef\\u001b[0m \\u001b[0mdecode\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mself\\u001b[0m\\u001b[1;33m,\\u001b[0m \\u001b[0minput\\u001b[0m\\u001b[1;33m,\\u001b[0m \\u001b[0mfinal\\u001b[0m\\u001b[1;33m=\\u001b[0m\\u001b[1;32mFalse\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m---> 23\\u001b[1;33m         \\u001b[1;32mreturn\\u001b[0m \\u001b[0mcodecs\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mcharmap_decode\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0minput\\u001b[0m\\u001b[1;33m,\\u001b[0m\\u001b[0mself\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0merrors\\u001b[0m\\u001b[1;33m,\\u001b[0m\\u001b[0mdecoding_table\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m[\\u001b[0m\\u001b[1;36m0\\u001b[0m\\u001b[1;33m]\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[0;32m     24\\u001b[0m \\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m     25\\u001b[0m \\u001b[1;32mclass\\u001b[0m \\u001b[0mStreamWriter\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[0mCodec\\u001b[0m\\u001b[1;33m,\\u001b[0m\\u001b[0mcodecs\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mStreamWriter\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[1;31mUnicodeDecodeError\\u001b[0m: 'charmap' codec can't decode byte 0x8d in position 1835: character maps to <undefined>\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"data_lines = list(csv_data)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's not try reading it with a \\\"utf-8\\\" encoding.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"data = open('example.csv',encoding=\\\"utf-8\\\")\\n\",\n    \"csv_data = csv.reader(data)\\n\",\n    \"data_lines = list(csv_data)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[['id', 'first_name', 'last_name', 'email', 'gender', 'ip_address', 'city'],\\n\",\n       \" ['1',\\n\",\n       \"  'Joseph',\\n\",\n       \"  'Zaniolini',\\n\",\n       \"  'jzaniolini0@simplemachines.org',\\n\",\n       \"  'Male',\\n\",\n       \"  '163.168.68.132',\\n\",\n       \"  'Pedro Leopoldo'],\\n\",\n       \" ['2',\\n\",\n       \"  'Freida',\\n\",\n       \"  'Drillingcourt',\\n\",\n       \"  'fdrillingcourt1@umich.edu',\\n\",\n       \"  'Female',\\n\",\n       \"  '97.212.102.79',\\n\",\n       \"  'Buri']]\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Looks like it worked!\\n\",\n    \"data_lines[:3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note the first item in the list is the header line, this contains the information about what each column represents. Let's format our printing just a bit:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"['id', 'first_name', 'last_name', 'email', 'gender', 'ip_address', 'city']\\n\",\n      \"['1', 'Joseph', 'Zaniolini', 'jzaniolini0@simplemachines.org', 'Male', '163.168.68.132', 'Pedro Leopoldo']\\n\",\n      \"['2', 'Freida', 'Drillingcourt', 'fdrillingcourt1@umich.edu', 'Female', '97.212.102.79', 'Buri']\\n\",\n      \"['3', 'Nanni', 'Herity', 'nherity2@statcounter.com', 'Female', '145.151.178.98', 'Claver']\\n\",\n      \"['4', 'Orazio', 'Frayling', 'ofrayling3@economist.com', 'Male', '25.199.143.143', 'Kungur']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for line in data_lines[:5]:\\n\",\n    \"    print(line)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's imagine we wanted a list of  all the emails. For demonstration, since there are 1000 items plus the header, we will only do a few rows.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1001\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(data_lines)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"all_emails = []\\n\",\n    \"for line in data_lines[1:15]:\\n\",\n    \"    all_emails.append(line[3])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"['jzaniolini0@simplemachines.org', 'fdrillingcourt1@umich.edu', 'nherity2@statcounter.com', 'ofrayling3@economist.com', 'jmurrison4@cbslocal.com', 'lgamet5@list-manage.com', 'dhowatt6@amazon.com', 'kherion7@amazon.com', 'chedworth8@china.com.cn', 'hgasquoine9@google.ru', 'ftarra@shareasale.com', 'abathb@umn.edu', 'lchastangc@goo.gl', 'cceried@yale.edu']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(all_emails)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What if we wanted a list of full names?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"full_names = []\\n\",\n    \"\\n\",\n    \"for line in data_lines[1:15]:\\n\",\n    \"    full_names.append(line[1]+' '+line[2])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['Joseph Zaniolini',\\n\",\n       \" 'Freida Drillingcourt',\\n\",\n       \" 'Nanni Herity',\\n\",\n       \" 'Orazio Frayling',\\n\",\n       \" 'Julianne Murrison',\\n\",\n       \" 'Lucy Gamet',\\n\",\n       \" 'Dyana Howatt',\\n\",\n       \" 'Kassey Herion',\\n\",\n       \" 'Chrissy Hedworth',\\n\",\n       \" 'Hyatt Gasquoine',\\n\",\n       \" 'Felicdad Tarr',\\n\",\n       \" 'Andrew Bath',\\n\",\n       \" 'Lucais Chastang',\\n\",\n       \" 'Car Cerie']\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"full_names\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Writing to CSV Files\\n\",\n    \"\\n\",\n    \"We can also write csv files, either new ones or add on to existing ones.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### New File \\n\",\n    \"**This will also overwrite any exisiting file with the same name, so be careful with this!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# newline controls how universal newlines works (it only applies to text\\n\",\n    \"# mode). It can be None, '', '\\\\n', '\\\\r', and '\\\\r\\\\n'. \\n\",\n    \"file_to_output = open('to_save_file.csv','w',newline='')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"csv_writer = csv.writer(file_to_output,delimiter=',')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"7\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"csv_writer.writerow(['a','b','c'])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"csv_writer.writerows([['1','2','3'],['4','5','6']])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"file_to_output.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"### Existing File \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"f = open('to_save_file.csv','a',newline='')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"csv_writer = csv.writer(f)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"13\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"csv_writer.writerow(['new','new','new'])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"That is all for the basics! If you believe you will be working with CSV files often, you may want to check out the powerful [pandas library](https://pandas.pydata.org/).\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "15-PDFs-and-Spreadsheets/01-Working-with-PDFs.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Working with PDF Files\\n\",\n    \"\\n\",\n    \"Welcome back Agent. Often you will have to deal with PDF files. There are [many libraries in Python for working with PDFs](https://www.binpress.com/tutorial/manipulating-pdfs-with-python/167), each with their pros and cons, the most common one being **pypdf**. You can install it with:\\n\",\n    \"\\n\",\n    \"    pip install pypdf\\n\",\n    \"    \\n\",\n    \"Keep in mind that not every PDF file can be read with this library. PDFs that are too blurry, have a special encoding, encrypted, or maybe just created with a particular program that doesn't work well with pypdf won't be able to be read. If you find yourself in this situation, try using the libraries linked above, but keep in mind, these may also not work. The reason for this is because of the many different parameters for a PDF and how non-standard the settings can be, text could be shown as an image instead of a utf-8 encoding. There are many parameters to consider in this aspect.\\n\",\n    \"\\n\",\n    \"As far as pypdf is concerned, it can only read the text from a PDF document, it won't be able to grab images or other media files from a PDF.\\n\",\n    \"___\\n\",\n    \"\\n\",\n    \"## Working with pypdf\\n\",\n    \"\\n\",\n    \"Let's being showing the basics of the pypdf library.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"!pip install pypdf\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# note the capitalization\\n\",\n    \"import pypdf\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Reading PDFs\\n\",\n    \"\\n\",\n    \"Similar to the csv library, we open a pdf, then create a reader object for it. Notice how we use the binary method of reading , 'rb', instead of just 'r'.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Notice we read it as a binary with 'rb'\\n\",\n    \"f = open('Working_Business_Proposal.pdf','rb')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pdf_reader = pypdf.PdfReader(f)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"5\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(pdf_reader.pages)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"page_number = 0\\n\",\n    \"page_one = pdf_reader.pages[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can then extract the text:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"page_one_text = page_one.extract_text()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Business Proposal  The Revolution is Coming \\\\nLeverage agile frameworks to provide a robust synopsis for high level \\\\noverviews. Iterative approaches to corporate strategy foster collaborative \\\\nthinking to further the overall value proposition. Organically grow the \\\\nholistic world view of disruptive innovation via workplace diversity and \\\\nempowerment. \\\\nBring to the table win-win survival strategies to ensure proactive \\\\ndomination. At the end of the day, going forward, a new normal that has \\\\nevolved from generation X is on the runway heading towards a streamlined \\\\ncloud solution. User generated content in real-time will have multiple \\\\ntouchpoints for offshoring. \\\\nCapitalize on low hanging fruit to identify a ballpark value added activity to \\\\nbeta test. Override the digital divide with additional clickthroughs from \\\\nDevOps. Nanotechnology immersion along the information highway will \\\\nclose the loop on focusing solely on the bottom line. \\\\nPodcasting operational change management inside of workﬂows to \\\\nestablish a framework. Taking seamless key performance indicators ofﬂine \\\\nto maximise the long tail. Keeping your eye on the ball while performing a \\\\ndeep dive on the start-up mentality to derive convergence on cross-\\\\nplatform integration. \\\\nCollaboratively administrate empowered markets via plug-and-play \\\\nnetworks. Dynamically procrastinate B2C users after installed base \\\\nbeneﬁts. Dramatically visualize customer directed convergence without \\\\nrevolutionary ROI. \\\\nEfﬁciently unleash cross-media information without cross-media value. \\\\nQuickly maximize timely deliverables for real-time schemas. Dramatically \\\\nmaintain clicks-and-mortar solutions without functional solutions. \\\\nBUSINESS PROPOSAL ! 1'\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"page_one_text\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Adding to PDFs\\n\",\n    \"\\n\",\n    \"We can not write to PDFs using Python because of the differences between the single string type of Python, and the variety of fonts, placements, and other parameters that a PDF could have.\\n\",\n    \"\\n\",\n    \"What we can do is copy pages and append pages to the end.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"f = open('Working_Business_Proposal.pdf','rb')\\n\",\n    \"pdf_reader = pypdf.PdfReader(f)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"page_number = 0\\n\",\n    \"page_one = pdf_reader.pages[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pdf_writer = pypdf.PdfWriter()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pdf_writer.add_page(page_one);\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pdf_output = open(\\\"Some_New_Doc.pdf\\\",\\\"wb\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(False, <_io.BufferedWriter name='Some_New_Doc.pdf'>)\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"pdf_writer.write(pdf_output)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"f.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we have copied a page and added it to another new document!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Simple Example\\n\",\n    \"\\n\",\n    \"Let's try to grab all the text from this PDF file:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"f = open('Working_Business_Proposal.pdf','rb')\\n\",\n    \"\\n\",\n    \"# List of every page's text.\\n\",\n    \"# The index will correspond to the page number.\\n\",\n    \"pdf_text = []\\n\",\n    \"\\n\",\n    \"pdf_reader = pypdf.PdfReader(f)\\n\",\n    \"\\n\",\n    \"for p in range(len(pdf_reader.pages)):\\n\",\n    \"    \\n\",\n    \"    page = pdf_reader.pages[0]\\n\",\n    \"    \\n\",\n    \"    pdf_text.append(page.extract_text())\\n\",\n    \"    \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['Business Proposal  The Revolution is Coming \\\\nLeverage agile frameworks to provide a robust synopsis for high level \\\\noverviews. Iterative approaches to corporate strategy foster collaborative \\\\nthinking to further the overall value proposition. Organically grow the \\\\nholistic world view of disruptive innovation via workplace diversity and \\\\nempowerment. \\\\nBring to the table win-win survival strategies to ensure proactive \\\\ndomination. At the end of the day, going forward, a new normal that has \\\\nevolved from generation X is on the runway heading towards a streamlined \\\\ncloud solution. User generated content in real-time will have multiple \\\\ntouchpoints for offshoring. \\\\nCapitalize on low hanging fruit to identify a ballpark value added activity to \\\\nbeta test. Override the digital divide with additional clickthroughs from \\\\nDevOps. Nanotechnology immersion along the information highway will \\\\nclose the loop on focusing solely on the bottom line. \\\\nPodcasting operational change management inside of workﬂows to \\\\nestablish a framework. Taking seamless key performance indicators ofﬂine \\\\nto maximise the long tail. Keeping your eye on the ball while performing a \\\\ndeep dive on the start-up mentality to derive convergence on cross-\\\\nplatform integration. \\\\nCollaboratively administrate empowered markets via plug-and-play \\\\nnetworks. Dynamically procrastinate B2C users after installed base \\\\nbeneﬁts. Dramatically visualize customer directed convergence without \\\\nrevolutionary ROI. \\\\nEfﬁciently unleash cross-media information without cross-media value. \\\\nQuickly maximize timely deliverables for real-time schemas. Dramatically \\\\nmaintain clicks-and-mortar solutions without functional solutions. \\\\nBUSINESS PROPOSAL ! 1',\\n\",\n       \" 'Business Proposal  The Revolution is Coming \\\\nLeverage agile frameworks to provide a robust synopsis for high level \\\\noverviews. Iterative approaches to corporate strategy foster collaborative \\\\nthinking to further the overall value proposition. Organically grow the \\\\nholistic world view of disruptive innovation via workplace diversity and \\\\nempowerment. \\\\nBring to the table win-win survival strategies to ensure proactive \\\\ndomination. At the end of the day, going forward, a new normal that has \\\\nevolved from generation X is on the runway heading towards a streamlined \\\\ncloud solution. User generated content in real-time will have multiple \\\\ntouchpoints for offshoring. \\\\nCapitalize on low hanging fruit to identify a ballpark value added activity to \\\\nbeta test. Override the digital divide with additional clickthroughs from \\\\nDevOps. Nanotechnology immersion along the information highway will \\\\nclose the loop on focusing solely on the bottom line. \\\\nPodcasting operational change management inside of workﬂows to \\\\nestablish a framework. Taking seamless key performance indicators ofﬂine \\\\nto maximise the long tail. Keeping your eye on the ball while performing a \\\\ndeep dive on the start-up mentality to derive convergence on cross-\\\\nplatform integration. \\\\nCollaboratively administrate empowered markets via plug-and-play \\\\nnetworks. Dynamically procrastinate B2C users after installed base \\\\nbeneﬁts. Dramatically visualize customer directed convergence without \\\\nrevolutionary ROI. \\\\nEfﬁciently unleash cross-media information without cross-media value. \\\\nQuickly maximize timely deliverables for real-time schemas. Dramatically \\\\nmaintain clicks-and-mortar solutions without functional solutions. \\\\nBUSINESS PROPOSAL ! 1',\\n\",\n       \" 'Business Proposal  The Revolution is Coming \\\\nLeverage agile frameworks to provide a robust synopsis for high level \\\\noverviews. Iterative approaches to corporate strategy foster collaborative \\\\nthinking to further the overall value proposition. Organically grow the \\\\nholistic world view of disruptive innovation via workplace diversity and \\\\nempowerment. \\\\nBring to the table win-win survival strategies to ensure proactive \\\\ndomination. At the end of the day, going forward, a new normal that has \\\\nevolved from generation X is on the runway heading towards a streamlined \\\\ncloud solution. User generated content in real-time will have multiple \\\\ntouchpoints for offshoring. \\\\nCapitalize on low hanging fruit to identify a ballpark value added activity to \\\\nbeta test. Override the digital divide with additional clickthroughs from \\\\nDevOps. Nanotechnology immersion along the information highway will \\\\nclose the loop on focusing solely on the bottom line. \\\\nPodcasting operational change management inside of workﬂows to \\\\nestablish a framework. Taking seamless key performance indicators ofﬂine \\\\nto maximise the long tail. Keeping your eye on the ball while performing a \\\\ndeep dive on the start-up mentality to derive convergence on cross-\\\\nplatform integration. \\\\nCollaboratively administrate empowered markets via plug-and-play \\\\nnetworks. Dynamically procrastinate B2C users after installed base \\\\nbeneﬁts. Dramatically visualize customer directed convergence without \\\\nrevolutionary ROI. \\\\nEfﬁciently unleash cross-media information without cross-media value. \\\\nQuickly maximize timely deliverables for real-time schemas. Dramatically \\\\nmaintain clicks-and-mortar solutions without functional solutions. \\\\nBUSINESS PROPOSAL ! 1',\\n\",\n       \" 'Business Proposal  The Revolution is Coming \\\\nLeverage agile frameworks to provide a robust synopsis for high level \\\\noverviews. Iterative approaches to corporate strategy foster collaborative \\\\nthinking to further the overall value proposition. Organically grow the \\\\nholistic world view of disruptive innovation via workplace diversity and \\\\nempowerment. \\\\nBring to the table win-win survival strategies to ensure proactive \\\\ndomination. At the end of the day, going forward, a new normal that has \\\\nevolved from generation X is on the runway heading towards a streamlined \\\\ncloud solution. User generated content in real-time will have multiple \\\\ntouchpoints for offshoring. \\\\nCapitalize on low hanging fruit to identify a ballpark value added activity to \\\\nbeta test. Override the digital divide with additional clickthroughs from \\\\nDevOps. Nanotechnology immersion along the information highway will \\\\nclose the loop on focusing solely on the bottom line. \\\\nPodcasting operational change management inside of workﬂows to \\\\nestablish a framework. Taking seamless key performance indicators ofﬂine \\\\nto maximise the long tail. Keeping your eye on the ball while performing a \\\\ndeep dive on the start-up mentality to derive convergence on cross-\\\\nplatform integration. \\\\nCollaboratively administrate empowered markets via plug-and-play \\\\nnetworks. Dynamically procrastinate B2C users after installed base \\\\nbeneﬁts. Dramatically visualize customer directed convergence without \\\\nrevolutionary ROI. \\\\nEfﬁciently unleash cross-media information without cross-media value. \\\\nQuickly maximize timely deliverables for real-time schemas. Dramatically \\\\nmaintain clicks-and-mortar solutions without functional solutions. \\\\nBUSINESS PROPOSAL ! 1',\\n\",\n       \" 'Business Proposal  The Revolution is Coming \\\\nLeverage agile frameworks to provide a robust synopsis for high level \\\\noverviews. Iterative approaches to corporate strategy foster collaborative \\\\nthinking to further the overall value proposition. Organically grow the \\\\nholistic world view of disruptive innovation via workplace diversity and \\\\nempowerment. \\\\nBring to the table win-win survival strategies to ensure proactive \\\\ndomination. At the end of the day, going forward, a new normal that has \\\\nevolved from generation X is on the runway heading towards a streamlined \\\\ncloud solution. User generated content in real-time will have multiple \\\\ntouchpoints for offshoring. \\\\nCapitalize on low hanging fruit to identify a ballpark value added activity to \\\\nbeta test. Override the digital divide with additional clickthroughs from \\\\nDevOps. Nanotechnology immersion along the information highway will \\\\nclose the loop on focusing solely on the bottom line. \\\\nPodcasting operational change management inside of workﬂows to \\\\nestablish a framework. Taking seamless key performance indicators ofﬂine \\\\nto maximise the long tail. Keeping your eye on the ball while performing a \\\\ndeep dive on the start-up mentality to derive convergence on cross-\\\\nplatform integration. \\\\nCollaboratively administrate empowered markets via plug-and-play \\\\nnetworks. Dynamically procrastinate B2C users after installed base \\\\nbeneﬁts. Dramatically visualize customer directed convergence without \\\\nrevolutionary ROI. \\\\nEfﬁciently unleash cross-media information without cross-media value. \\\\nQuickly maximize timely deliverables for real-time schemas. Dramatically \\\\nmaintain clicks-and-mortar solutions without functional solutions. \\\\nBUSINESS PROPOSAL ! 1']\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"pdf_text\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Business Proposal  The Revolution is Coming \\n\",\n      \"Leverage agile frameworks to provide a robust synopsis for high level \\n\",\n      \"overviews. Iterative approaches to corporate strategy foster collaborative \\n\",\n      \"thinking to further the overall value proposition. Organically grow the \\n\",\n      \"holistic world view of disruptive innovation via workplace diversity and \\n\",\n      \"empowerment. \\n\",\n      \"Bring to the table win-win survival strategies to ensure proactive \\n\",\n      \"domination. At the end of the day, going forward, a new normal that has \\n\",\n      \"evolved from generation X is on the runway heading towards a streamlined \\n\",\n      \"cloud solution. User generated content in real-time will have multiple \\n\",\n      \"touchpoints for offshoring. \\n\",\n      \"Capitalize on low hanging fruit to identify a ballpark value added activity to \\n\",\n      \"beta test. Override the digital divide with additional clickthroughs from \\n\",\n      \"DevOps. Nanotechnology immersion along the information highway will \\n\",\n      \"close the loop on focusing solely on the bottom line. \\n\",\n      \"Podcasting operational change management inside of workﬂows to \\n\",\n      \"establish a framework. Taking seamless key performance indicators ofﬂine \\n\",\n      \"to maximise the long tail. Keeping your eye on the ball while performing a \\n\",\n      \"deep dive on the start-up mentality to derive convergence on cross-\\n\",\n      \"platform integration. \\n\",\n      \"Collaboratively administrate empowered markets via plug-and-play \\n\",\n      \"networks. Dynamically procrastinate B2C users after installed base \\n\",\n      \"beneﬁts. Dramatically visualize customer directed convergence without \\n\",\n      \"revolutionary ROI. \\n\",\n      \"Efﬁciently unleash cross-media information without cross-media value. \\n\",\n      \"Quickly maximize timely deliverables for real-time schemas. Dramatically \\n\",\n      \"maintain clicks-and-mortar solutions without functional solutions. \\n\",\n      \"BUSINESS PROPOSAL ! 1\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(pdf_text[3])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Excellent work! That is all for pypdf for now, remember that this won't work with every PDF file and is limited in its scope to only text of PDFs.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python [conda env:base] *\",\n   \"language\": \"python\",\n   \"name\": \"conda-base-py\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.12.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "15-PDFs-and-Spreadsheets/02-PDFs-Spreadsheets-Puzzle.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# PDFs and Spreadsheets Puzzle Exercise\\n\",\n    \"\\n\",\n    \"Let's test your skills, the files needed for this puzzle exercise\\n\",\n    \"\\n\",\n    \"You will need to work with two files for this exercise and solve the following tasks:\\n\",\n    \"\\n\",\n    \"* Task One: Use Python to extract the Google Drive link from the .csv file. (Hint: Its along the diagonal from top left to bottom right).\\n\",\n    \"* Task Two: Download the PDF from the Google Drive link (we already downloaded it for you just in case you can't download from Google Drive) and find the phone number that is in the document. Note: There are different ways of formatting a phone number!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Task One: Grab the Google Drive Link from .csv File\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'https://drive.google.com/open?id=1G6SEgg018UB4_4xsAJJ5TdzrhmXipr4Q'\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# THe correct result is shown below, if you can't download from Google Drive, \\n\",\n    \"# we added the PDF file to the Exercise_Files folder already\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Task Two: Download the PDF from the Google Drive link and find the phone number that is in the document. \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# You should get this phone number\\n\",\n    \"# 505 503 4455\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"anaconda-cloud\": {},\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "15-PDFs-and-Spreadsheets/03-PDFs-Spreadsheets-Puzzle-Solution.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# PDFs and Spreadsheets Puzzle Exercise\\n\",\n    \"\\n\",\n    \"You will need to work with two files for this exercise and solve the following tasks:\\n\",\n    \"\\n\",\n    \"* Task One: Grab the Google Drive link from the .csv file. (Hint: Its along the diagonal).\\n\",\n    \"* Task Two: Download the PDF from the Google Drive link (we already downloaded it for you just in case you can't download from Google Drive) and find the phone number that is in the document. Note: There are different ways of formatting a phone number!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Task One: Grab the Google Drive Link from .csv File\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import csv\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Grab all the lines of data.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"data = open('Exercise_Files/find_the_link.csv',encoding=\\\"utf-8\\\")\\n\",\n    \"csv_data = csv.reader(data)\\n\",\n    \"data_lines = list(csv_data)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**We can see its along the diagonal, which means the values are at the index position that matches the row's number order. So the 1st letter is the 1st item in the 1st row, the 2nd letter is the 2nd item in the 2nd row, the 3rd item is the 3rd letter in the 3rd row and so on. We can use enumerate to track the row number and simply index off the data_lines.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Method One**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"link_list = []\\n\",\n    \"for row_num,data in enumerate(data_lines):\\n\",\n    \"    link_list.append(data[row_num])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'https://drive.google.com/open?id=1G6SEgg018UB4_4xsAJJ5TdzrhmXipr4Q'\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"''.join(link_list)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Method Two**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"link_str = ''\\n\",\n    \"for row_num,data in enumerate(data_lines):\\n\",\n    \"    link_str+=data[row_num]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'https://drive.google.com/open?id=1G6SEgg018UB4_4xsAJJ5TdzrhmXipr4Q'\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"link_str\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Task Two: Download the PDF from the Google Drive link and find the phone number that is in the document. \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import pypdf\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"f = open('Exercise_Files/Find_the_Phone_Number.pdf','rb')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pdf = pypdf.PdfReader(f)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"17\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"len(pdf.pages)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Phone Number Matching\\n\",\n    \"\\n\",\n    \"Lot's of ways to do this, but you had to figure out the phone number was in format ###.###.####\\n\",\n    \"\\n\",\n    \"Hint: https://stackoverflow.com/questions/4697882/how-can-i-find-all-matches-to-a-regular-expression-in-python\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import re\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pattern = r'\\\\d{3}'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"all_text = ''\\n\",\n    \"\\n\",\n    \"for n in range(len(pdf.pages)):\\n\",\n    \"    \\n\",\n    \"    page = pdf.pages[n]\\n\",\n    \"    page_text = page.extract_text()\\n\",\n    \"    \\n\",\n    \"    all_text = all_text+' '+page_text\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<re.Match object; span=(643, 646), match='000'>\\n\",\n      \"<re.Match object; span=(18143, 18146), match='000'>\\n\",\n      \"<re.Match object; span=(35643, 35646), match='000'>\\n\",\n      \"<re.Match object; span=(42624, 42627), match='505'>\\n\",\n      \"<re.Match object; span=(42628, 42631), match='503'>\\n\",\n      \"<re.Match object; span=(42632, 42635), match='445'>\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for match in re.finditer(pattern,all_text):\\n\",\n    \"    print(match)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Once you know the correct pattern:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import re\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pattern = r'\\\\d{3}.\\\\d{3}.\\\\d{4}' \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"505.503.4455\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for n in range(len(pdf.pages)):\\n\",\n    \"    \\n\",\n    \"    page  = pdf.pages[n]\\n\",\n    \"    page_text = page.extract_text()\\n\",\n    \"    match = re.search(pattern,page_text)\\n\",\n    \"    \\n\",\n    \"    if match:\\n\",\n    \"        print(match.group())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great Job! Information on this phone number: \\n\",\n    \"* https://www.businessinsider.com/better-call-saul-billboard-and-phone-number-2014-7\\n\",\n    \"* https://www.reddit.com/r/betterCallSaul/comments/4awouf/heres_a_list_of_real_numbers_you_can_call_from/\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"anaconda-cloud\": {},\n  \"kernelspec\": {\n   \"display_name\": \"Python [conda env:base] *\",\n   \"language\": \"python\",\n   \"name\": \"conda-base-py\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.12.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "15-PDFs-and-Spreadsheets/Exercise_Files/find_the_link.csv",
    "content": "h,53,24,46,4,11,3,35,17,52,9,60,26,60,72,39,11,80,86,66,59,9,41,33,11,42,69,74,91,61,5,69,17,17,78,6,51,54,54,94,47,37,0,16,71,6,83,7,6,38,61,18,68,15,2,81,49,5,17,21,36,63,38,24,3,99\n85,t,31,54,60,22,77,39,93,38,31,16,29,27,8,35,0,54,84,21,47,37,66,83,26,22,68,25,44,81,27,68,17,63,13,99,38,43,87,83,73,88,67,5,12,10,7,58,64,56,53,88,96,20,7,85,94,23,14,79,24,27,90,40,27,8\n22,98,t,83,33,53,66,13,81,53,60,52,45,51,39,98,14,94,68,5,99,62,68,95,50,81,64,58,96,1,71,4,60,57,84,39,5,24,79,19,86,20,15,55,68,26,81,78,3,2,24,64,17,86,3,16,89,81,33,70,42,5,31,42,45,42\n11,58,4,p,59,85,97,35,11,78,75,23,83,37,79,8,82,42,73,9,13,98,57,50,28,41,55,58,33,85,80,69,64,53,87,38,58,48,31,82,56,14,49,8,50,4,5,9,69,33,61,24,61,21,59,1,81,73,13,75,21,13,15,85,71,36\n0,15,8,77,s,90,42,25,38,93,18,81,6,31,17,3,55,91,46,30,28,6,45,66,97,9,71,31,26,50,86,52,24,93,97,18,71,79,61,9,19,67,74,48,54,30,69,1,43,11,8,97,52,22,66,81,55,53,5,91,30,14,62,27,27,33\n47,43,36,38,37,:,77,69,20,51,87,31,45,50,43,48,72,47,88,29,25,62,97,70,44,87,76,89,99,93,6,21,68,45,57,40,74,46,71,98,29,8,40,89,90,96,90,32,11,84,87,35,88,75,75,17,74,86,46,96,86,10,14,9,56,0\n43,73,30,67,47,7,/,88,38,83,36,26,1,69,69,89,96,77,10,5,68,43,19,65,25,48,25,33,29,14,19,87,20,20,35,65,4,89,1,62,40,7,9,98,18,3,58,22,41,95,73,29,8,34,75,38,76,10,62,67,74,90,60,94,4,97\n26,59,40,91,5,93,0,/,74,80,13,67,15,42,93,3,10,61,9,13,38,68,60,34,37,32,17,60,95,92,44,33,99,69,4,16,80,87,7,9,43,73,64,9,25,12,65,59,1,84,73,40,78,10,64,59,58,25,53,71,72,92,51,15,26,76\n33,13,17,66,84,74,77,8,d,44,53,14,63,17,62,77,75,61,75,28,57,12,1,36,62,63,8,12,24,85,80,26,18,19,1,13,47,74,72,83,46,53,25,89,74,57,54,12,38,83,38,67,94,75,26,86,91,30,66,75,53,46,60,78,50,47\n34,76,15,58,37,61,96,57,6,r,98,60,64,32,0,68,32,41,72,99,13,29,88,59,45,85,93,19,39,5,2,35,80,11,35,34,3,55,27,3,3,57,90,75,54,85,6,10,7,95,9,30,25,25,87,1,55,9,1,76,90,6,60,87,33,86\n67,30,97,49,27,14,17,28,60,74,i,21,24,66,83,25,99,62,89,27,85,48,23,93,12,9,13,70,41,21,85,12,3,39,71,36,84,55,30,4,48,75,47,89,39,97,56,38,23,84,58,72,79,22,13,23,14,29,2,31,11,42,94,3,34,52\n95,42,42,95,95,20,9,29,65,26,13,v,82,66,67,96,48,7,36,89,73,98,3,23,50,89,42,75,84,6,73,5,93,83,1,39,22,33,76,61,49,53,66,23,81,63,50,97,13,51,47,13,12,44,71,42,7,59,70,96,37,30,3,1,78,16\n96,28,68,65,40,12,36,15,39,57,35,49,e,4,65,73,75,77,29,64,35,70,11,1,2,88,95,22,44,50,82,98,50,53,14,28,39,50,12,18,59,41,68,7,81,69,57,68,48,74,45,7,11,14,23,58,10,16,49,64,62,27,40,84,12,68\n80,10,31,78,64,18,88,41,98,89,99,69,36,.,56,44,30,85,7,74,71,9,84,91,25,78,0,28,4,97,3,63,1,74,55,74,22,21,49,65,6,23,50,72,43,51,4,29,2,92,20,96,72,69,34,7,8,32,59,78,75,66,98,90,58,20\n0,67,15,39,97,49,72,53,56,29,18,67,39,20,g,66,61,29,67,93,13,97,64,63,92,78,68,25,87,32,82,36,63,6,29,60,11,59,13,16,14,88,96,39,47,68,44,13,2,34,20,29,89,3,99,74,75,41,77,62,34,12,90,32,18,74\n49,56,7,76,3,54,65,76,68,89,60,19,51,93,13,o,25,18,29,49,88,31,25,98,70,83,64,26,89,74,91,30,5,56,39,25,2,74,83,98,44,71,98,69,66,13,20,28,2,42,91,63,74,6,52,54,82,54,83,39,10,70,50,53,47,68\n68,62,73,17,3,84,97,56,12,65,46,24,40,81,18,25,o,93,29,44,28,11,45,44,28,97,79,35,4,9,83,4,20,21,22,53,36,74,43,55,19,76,52,92,34,78,23,33,30,21,96,31,69,60,63,97,90,42,61,25,83,78,10,31,58,95\n78,84,3,55,56,17,83,59,74,8,46,10,30,78,75,27,24,g,54,71,1,23,47,3,72,64,55,35,21,69,10,45,25,10,57,41,95,48,97,17,52,27,47,89,55,62,38,34,29,42,32,81,11,79,83,85,44,86,59,21,22,80,20,73,1,47\n89,51,33,16,51,38,64,29,32,82,61,38,16,11,97,29,37,94,l,92,18,0,62,0,12,40,6,1,27,74,22,44,72,77,30,36,89,0,84,44,94,1,84,96,21,17,99,91,18,5,36,50,85,51,81,8,99,39,54,80,8,40,56,35,74,98\n25,49,44,14,73,92,59,92,62,74,40,9,37,78,96,31,92,5,52,e,77,75,81,5,54,75,10,51,85,87,1,81,70,86,87,75,58,85,65,46,0,46,36,61,62,37,69,96,70,10,6,31,61,6,81,52,64,63,94,4,86,22,50,64,14,86\n23,13,55,56,67,59,30,26,43,29,62,66,39,41,91,91,23,22,95,78,.,69,62,54,8,50,22,32,42,53,36,20,95,77,39,97,49,26,83,54,53,58,57,5,0,65,28,67,12,25,68,70,73,13,93,49,25,88,36,97,5,24,24,61,18,95\n58,8,97,14,85,12,1,11,73,81,16,52,53,99,2,56,58,13,64,31,48,c,28,81,92,13,61,70,91,56,7,39,41,64,94,83,3,61,27,10,45,20,75,68,24,91,35,60,52,27,81,8,35,63,16,88,74,93,56,47,16,79,90,83,84,69\n22,92,48,20,57,73,11,27,7,67,69,90,7,21,2,69,15,66,78,88,66,21,o,40,15,20,32,48,73,27,46,70,30,22,51,73,19,94,48,56,99,20,22,0,5,47,14,65,91,98,96,50,40,6,80,66,36,33,24,73,84,86,25,11,84,26\n26,68,67,55,93,98,69,98,37,37,14,48,53,32,3,0,75,65,84,38,42,22,83,m,54,51,68,43,56,84,72,65,72,99,16,73,41,4,19,36,71,87,29,30,85,74,32,46,49,85,13,92,14,97,60,69,62,9,43,32,18,95,24,66,98,79\n61,77,4,29,6,16,3,71,26,20,24,1,60,45,61,99,79,67,65,29,40,24,44,39,/,7,26,28,10,74,30,35,86,78,94,9,61,2,16,30,10,60,56,27,47,11,15,28,21,81,95,49,7,92,91,13,26,52,24,94,27,72,29,86,18,51\n92,18,21,88,72,26,43,35,62,75,40,92,61,35,52,10,49,77,18,1,28,9,32,96,37,o,48,47,4,57,42,45,93,90,71,24,10,16,41,99,83,15,23,76,48,35,65,37,89,15,9,91,64,61,45,59,24,63,34,1,6,44,93,60,89,50\n25,5,38,85,25,88,56,71,96,27,93,14,7,2,22,49,93,93,5,56,75,11,36,19,81,11,p,42,54,29,20,31,1,12,40,65,18,2,89,68,77,66,53,95,20,85,7,92,46,44,16,13,59,53,90,64,67,38,79,26,69,13,63,59,1,64\n2,95,27,12,92,78,73,64,53,92,75,23,81,18,16,66,22,20,13,31,15,30,65,62,46,60,3,e,68,98,86,82,93,12,16,68,78,62,36,15,47,91,17,77,65,98,45,52,69,5,52,50,46,73,17,7,72,84,7,26,52,40,86,36,80,66\n52,85,6,13,7,57,51,42,66,33,11,78,51,43,21,55,13,38,90,47,73,18,65,80,89,11,85,25,n,48,33,47,33,12,65,28,42,80,89,58,24,65,46,23,20,72,92,51,82,40,85,67,79,50,87,27,31,74,71,84,41,84,55,16,43,61\n72,58,16,98,95,38,35,17,83,22,37,55,1,18,25,75,0,39,64,35,76,94,3,42,86,97,36,68,49,?,5,23,62,8,79,56,32,30,86,8,13,17,76,43,82,74,82,90,47,6,79,57,95,44,40,9,59,25,75,6,90,39,97,18,38,93\n48,14,7,47,65,92,98,96,23,3,41,21,17,3,1,99,3,57,13,50,81,58,43,2,33,68,33,72,1,66,i,80,26,11,83,35,29,28,75,38,13,66,71,32,57,67,10,56,46,27,82,9,28,29,99,44,35,22,56,2,99,28,2,29,56,76\n77,34,47,96,48,73,58,81,28,52,58,1,4,65,57,72,52,66,37,46,51,95,23,0,15,86,7,95,81,63,87,d,46,78,47,83,26,3,6,77,44,3,30,9,43,27,37,37,98,11,78,82,22,36,11,93,53,85,49,4,7,38,24,63,85,11\n47,8,16,16,52,47,55,31,51,2,18,24,51,8,21,7,6,21,59,91,88,53,67,92,58,99,51,67,9,28,5,87,=,61,23,10,56,4,63,23,28,21,14,18,66,60,58,94,37,65,10,70,79,28,7,27,29,83,93,6,1,27,90,92,27,1\n56,33,68,16,13,21,83,10,94,95,96,58,16,97,82,24,87,1,19,73,25,17,0,35,79,41,16,58,90,58,81,80,41,1,11,30,97,67,84,49,57,29,46,56,40,21,85,93,10,93,36,67,18,35,46,50,3,57,90,72,4,66,24,69,16,19\n13,10,91,85,32,71,26,58,91,15,29,7,78,10,51,18,54,40,39,34,33,68,81,63,61,38,68,98,40,72,9,59,50,89,G,28,17,10,12,23,86,74,52,25,76,27,10,20,77,26,20,62,13,80,57,73,67,7,35,8,64,27,99,81,10,66\n54,0,69,6,70,76,91,1,44,32,17,92,90,8,15,48,80,38,9,89,37,36,92,62,82,8,65,4,70,75,85,95,21,17,21,6,8,56,73,40,9,61,42,7,81,20,23,67,45,59,44,69,78,91,83,45,38,44,27,26,57,4,55,9,84,96\n81,80,83,83,56,46,84,81,64,45,52,31,60,30,61,97,81,50,48,51,44,96,12,23,52,42,81,10,26,69,37,76,78,86,34,73,S,97,59,99,85,96,80,52,41,16,92,28,18,19,80,70,71,3,63,41,59,83,5,3,72,40,15,75,27,56\n52,90,46,54,34,61,72,40,42,97,56,62,8,90,72,59,37,67,5,74,93,16,38,91,71,1,61,5,59,96,37,54,72,59,71,85,70,E,0,30,45,68,1,36,43,13,6,14,91,45,10,25,38,46,79,25,66,53,94,43,16,28,48,10,37,65\n1,30,24,32,76,13,51,44,65,61,26,91,9,96,39,35,34,50,89,68,80,78,58,14,57,31,1,47,72,42,75,60,70,16,54,67,71,0,g,49,10,87,70,89,86,94,95,52,39,74,1,89,15,28,51,94,65,38,54,63,29,88,69,46,33,10\n84,58,35,83,52,88,97,59,30,49,40,79,53,89,46,48,59,64,50,2,33,29,61,19,78,20,42,34,31,75,49,35,10,56,65,19,58,15,35,g,37,34,52,82,58,4,89,69,44,22,17,95,99,89,57,16,26,30,95,8,10,67,18,52,1,90\n81,26,39,84,11,69,31,6,13,2,52,20,59,54,75,81,98,66,8,29,41,41,98,49,82,79,45,38,96,78,71,53,84,20,50,32,38,52,16,99,0,45,64,51,19,69,85,95,34,94,75,28,43,66,34,33,19,63,60,26,30,54,93,92,45,81\n89,6,88,71,63,12,60,84,87,61,49,28,5,67,59,23,25,33,0,12,42,95,32,29,70,76,97,94,74,91,50,3,24,72,8,72,19,74,67,18,47,1,12,30,49,2,45,19,37,62,14,21,38,51,36,30,31,44,81,46,72,90,28,70,54,70\n29,52,73,76,18,24,25,59,90,9,70,75,17,18,66,4,62,87,32,76,30,28,70,2,74,56,5,35,49,20,37,40,18,80,90,53,22,76,87,32,20,85,8,14,17,15,69,94,79,81,96,3,85,42,80,26,92,46,47,98,56,78,56,59,91,36\n73,16,76,6,49,33,17,65,89,43,30,72,17,30,79,4,92,85,96,69,36,55,46,66,40,24,35,90,88,73,61,26,54,22,34,4,90,34,63,28,18,5,14,U,12,9,65,27,46,48,57,22,14,40,26,96,18,5,30,26,90,15,66,37,47,78\n56,55,90,8,59,81,80,95,67,73,73,46,11,91,24,33,67,70,37,56,55,60,70,58,22,70,4,25,15,27,77,88,40,6,15,23,52,55,56,23,0,49,65,45,B,47,67,6,55,39,86,75,96,98,50,31,78,93,56,65,23,94,96,15,31,63\n76,68,47,72,96,65,27,54,76,10,67,51,38,91,7,55,47,9,25,44,71,92,35,64,20,3,92,36,63,14,39,46,35,14,87,15,39,3,64,95,56,59,19,25,81,4,40,42,39,45,97,1,49,58,93,87,3,41,15,88,35,53,0,35,20,20\n16,19,51,42,81,49,35,83,36,63,76,70,49,79,11,35,71,71,31,34,4,71,9,24,35,28,39,56,24,2,17,72,73,41,92,16,18,9,53,6,18,10,65,34,79,79,_,50,72,80,28,47,52,7,27,46,0,6,29,91,47,92,94,47,37,75\n19,4,25,8,60,87,61,91,15,92,46,1,57,92,47,46,9,14,32,21,74,76,47,48,22,95,26,9,17,75,13,79,44,30,15,61,47,6,46,83,52,73,56,74,84,31,82,4,32,7,27,4,43,92,46,62,1,97,16,73,27,68,39,34,70,69\n24,85,23,49,54,18,90,36,33,73,98,19,16,67,44,12,72,89,85,9,71,9,98,81,34,77,60,10,91,93,63,22,69,63,13,75,6,29,52,23,45,98,55,23,37,66,91,11,x,66,86,0,37,12,44,16,67,93,34,5,69,70,23,40,36,99\n94,53,29,95,87,91,38,68,83,8,83,18,85,64,62,9,88,81,3,43,78,31,72,68,50,95,20,68,89,56,58,53,31,32,7,71,29,33,66,23,38,96,52,45,86,69,41,46,49,s,87,33,40,52,13,19,89,56,96,97,40,66,10,51,56,19\n53,57,90,2,83,91,55,85,25,41,76,3,15,77,73,82,13,94,27,41,50,5,55,24,5,21,27,91,2,52,66,13,94,7,95,28,88,11,60,62,15,32,49,19,56,95,88,52,23,94,A,88,95,48,5,48,30,60,35,74,63,20,27,75,57,63\n6,49,57,86,37,12,65,80,16,9,38,89,50,30,66,89,65,66,39,33,59,40,10,16,98,34,20,83,71,34,7,83,80,27,11,43,94,92,10,69,6,23,90,19,22,18,51,11,39,61,1,J,47,95,41,61,74,83,59,70,35,30,6,43,74,59\n55,44,50,29,44,62,9,38,9,68,74,59,49,45,8,35,40,94,50,92,26,44,59,5,63,14,95,20,72,62,82,51,23,83,34,33,39,63,13,69,58,85,45,71,38,6,97,76,19,57,93,25,J,38,9,86,27,88,67,40,33,2,55,74,74,32\n95,30,9,12,70,67,94,79,84,72,6,98,47,67,66,25,72,28,73,44,87,85,25,53,53,61,46,67,87,88,46,63,91,68,40,96,54,76,95,60,37,13,58,13,30,51,11,86,87,36,90,45,29,5,3,43,33,19,1,25,76,90,75,55,53,60\n40,82,59,48,63,75,65,18,29,8,89,1,23,13,64,63,15,91,97,33,86,57,47,45,96,73,96,5,35,41,90,6,68,73,23,25,24,25,64,8,25,20,48,22,93,7,59,29,87,17,33,48,16,91,T,19,2,23,56,77,23,99,12,37,55,60\n88,38,20,30,1,77,19,42,95,70,70,14,27,96,5,11,85,83,91,0,88,11,94,80,42,87,94,73,44,62,74,10,5,29,18,43,62,11,11,61,77,68,90,63,83,58,41,41,96,61,57,35,21,47,4,d,11,40,23,58,94,64,94,6,92,51\n72,92,11,92,62,13,10,56,70,89,16,27,53,26,91,34,32,34,42,75,47,59,23,23,34,17,20,7,98,30,64,40,98,77,74,39,75,94,55,46,32,96,33,22,46,80,30,71,41,14,49,40,66,84,40,4,z,20,52,73,40,29,52,19,29,1\n80,55,68,59,49,84,54,59,48,63,67,53,80,75,68,6,33,33,4,67,82,7,99,94,57,42,7,77,70,40,57,57,40,41,51,85,87,29,96,56,11,6,48,63,10,39,90,68,34,38,0,90,41,78,16,19,66,r,30,58,37,89,61,61,76,45\n70,9,52,79,19,98,74,11,15,51,17,39,81,41,32,28,35,53,23,18,60,84,39,27,95,68,2,47,51,43,46,39,17,41,98,15,34,76,75,7,1,96,74,90,49,73,15,46,42,40,75,55,77,53,2,35,46,4,h,51,11,74,13,47,81,36\n75,12,2,58,16,45,26,1,48,74,27,73,65,93,75,94,0,98,66,26,11,0,21,63,36,0,60,94,54,78,33,19,13,26,48,66,27,39,4,27,96,19,32,7,24,51,85,36,15,46,28,64,40,72,28,80,35,90,2,m,99,91,70,47,85,49\n68,16,0,31,44,34,85,12,53,43,59,51,10,42,91,42,92,19,3,73,15,33,94,50,81,97,66,11,52,87,26,36,24,92,26,2,83,64,12,12,64,76,41,14,18,95,46,8,7,41,37,34,20,47,93,21,90,26,8,80,X,90,84,53,80,1\n70,15,70,62,65,32,53,3,22,57,86,74,61,89,96,40,27,32,12,70,66,57,4,93,57,69,36,86,38,99,3,45,42,78,61,44,88,61,61,82,26,25,53,59,53,54,59,51,17,95,24,22,69,19,36,3,91,87,85,40,13,i,60,44,35,92\n29,65,93,3,73,70,63,28,44,87,91,97,56,71,91,85,16,68,96,70,93,61,62,13,59,31,26,10,61,67,97,10,82,88,32,45,15,94,98,21,71,86,92,84,0,62,47,19,59,53,79,42,16,32,55,66,79,39,52,27,84,44,p,84,49,78\n77,98,39,6,26,16,86,11,24,88,39,39,76,67,51,68,52,69,72,89,49,70,73,35,83,31,73,17,80,66,89,76,1,31,6,84,28,24,86,39,16,14,78,87,44,81,62,82,23,96,76,60,58,39,42,74,95,19,99,16,2,71,32,r,30,65\n52,38,49,63,33,37,18,60,99,27,47,0,32,42,86,28,93,26,26,88,60,44,38,95,2,27,81,3,24,69,3,49,5,82,7,94,52,55,28,77,98,8,20,90,46,20,39,16,30,13,94,9,58,83,7,73,17,33,71,60,50,84,14,64,4,23\n51,70,63,34,84,97,80,31,41,82,15,35,93,25,62,31,87,18,28,74,4,80,87,97,9,78,40,56,43,28,12,25,32,94,41,95,26,76,86,94,88,71,72,72,15,93,1,47,55,41,12,23,23,46,99,77,63,12,18,63,55,2,0,58,25,Q\n"
  },
  {
    "path": "15-PDFs-and-Spreadsheets/example.csv",
    "content": "id,first_name,last_name,email,gender,ip_address,city\n1,Joseph,Zaniolini,jzaniolini0@simplemachines.org,Male,163.168.68.132,Pedro Leopoldo\n2,Freida,Drillingcourt,fdrillingcourt1@umich.edu,Female,97.212.102.79,Buri\n3,Nanni,Herity,nherity2@statcounter.com,Female,145.151.178.98,Claver\n4,Orazio,Frayling,ofrayling3@economist.com,Male,25.199.143.143,Kungur\n5,Julianne,Murrison,jmurrison4@cbslocal.com,Female,10.186.243.144,Sainte-Luce-sur-Loire\n6,Lucy,Gamet,lgamet5@list-manage.com,Female,10.151.93.36,Pak Phli\n7,Dyana,Howatt,dhowatt6@amazon.com,Female,224.169.61.29,Palmares\n8,Kassey,Herion,kherion7@amazon.com,Female,245.51.154.79,Zákynthos\n9,Chrissy,Hedworth,chedworth8@china.com.cn,Male,124.222.93.57,Boevange-sur-Attert\n10,Hyatt,Gasquoine,hgasquoine9@google.ru,Male,221.155.106.39,Złoty Stok\n11,Felicdad,Tarr,ftarra@shareasale.com,Female,145.203.98.173,Salamnunggal\n12,Andrew,Bath,abathb@umn.edu,Male,64.36.30.186,El Hermel\n13,Lucais,Chastang,lchastangc@goo.gl,Male,142.182.6.86,Tilburg\n14,Car,Cerie,cceried@yale.edu,Male,203.204.69.107,Shofirkon\n15,Alvera,Jepp,ajeppe@umich.edu,Female,202.150.229.139,New Sibonga\n16,Prescott,Caldeiro,pcaldeirof@chronoengine.com,Male,29.81.197.109,Patzicía\n17,Nariko,Clunie,nclunieg@utexas.edu,Female,237.85.98.58,Umuarama\n18,Kalvin,Rois,kroish@unicef.org,Male,75.20.57.166,Marsh Harbour\n19,Isa,Boycott,iboycotti@dailymail.co.uk,Female,48.82.184.239,Kalix\n20,Benedetta,Glanert,bglanertj@timesonline.co.uk,Female,209.194.38.175,Tianxin\n21,Poul,Caroli,pcarolik@cam.ac.uk,Male,176.134.222.111,Dingcheng\n22,Virgie,Dran,vdranl@independent.co.uk,Male,87.224.43.109,Changpu\n23,Gillie,Roantree,groantreem@nba.com,Female,240.133.255.198,Lirung\n24,Tabor,Dawidowitsch,tdawidowitschn@free.fr,Male,102.236.160.230,Lamalera\n25,Sarina,Choulerton,schoulertono@wisc.edu,Female,73.36.0.165,Íquira\n26,Elbert,Seawell,eseawellp@live.com,Male,116.69.73.19,Vitória\n27,Danita,Aldrin,daldrinq@wired.com,Female,98.171.121.136,Bringinanom\n28,Jone,Dank,jdankr@miibeian.gov.cn,Male,188.201.52.190,Xiancun\n29,Merralee,Lampel,mlampels@a8.net,Female,131.52.216.81,West Hartford\n30,Charyl,Halstead,chalsteadt@amazon.de,Female,20.219.12.180,Las Vegas\n31,Giuseppe,Karolowski,gkarolowskiu@narod.ru,Male,171.177.109.165,Mlangali\n32,Sutherlan,Mundee,smundeev@nsw.gov.au,Male,68.91.169.230,Keluke\n33,Alexander,Oldershaw,aoldershaww@so-net.ne.jp,Male,38.108.66.54,Capitán Bado\n34,Blayne,Mattusevich,bmattusevichx@foxnews.com,Male,227.51.230.208,Vykhino-Zhulebino\n35,Alfredo,Bohlens,abohlensy@nih.gov,Male,219.50.104.169,Lazaro Cardenas\n36,Harman,Braidwood,hbraidwoodz@amazon.com,Male,100.123.214.249,Täby\n37,Haslett,Sudron,hsudron10@nps.gov,Male,168.21.120.107,Oyabe\n38,Jeanelle,VanBrugh,jvanbrugh11@cocolog-nifty.com,Female,59.112.24.10,Weifen\n39,Hetty,Lightollers,hlightollers12@comsenz.com,Female,199.246.118.133,Château-Richer\n40,Elmira,Goodhand,egoodhand13@tripadvisor.com,Female,83.5.248.21,Nytva\n41,Granger,Lewerenz,glewerenz14@about.me,Male,126.53.131.38,Itambacuri\n42,Tobie,Lewson,tlewson15@marriott.com,Male,111.144.164.250,Lushikeng\n43,Knox,Sainteau,ksainteau16@ning.com,Male,169.28.54.18,Jiezi\n44,Eliot,Vedekhov,evedekhov17@jiathis.com,Male,235.14.147.198,Stockholm\n45,Honey,Crenshaw,hcrenshaw18@github.io,Female,200.207.16.70,Nanyue\n46,Karmen,Soppitt,ksoppitt19@cdc.gov,Female,21.73.69.9,Anseong\n47,Fairleigh,Sivess,fsivess1a@free.fr,Male,141.156.151.157,Vienna\n48,Angelina,Stranio,astranio1b@latimes.com,Female,215.130.119.210,Chitral\n49,Lilla,Erni,lerni1c@dailymotion.com,Female,244.94.188.95,Jiannan\n50,Penn,Batson,pbatson1d@vimeo.com,Male,41.104.204.213,Caldas Novas\n51,Salvidor,Cawthry,scawthry1e@youtu.be,Male,68.84.121.114,Habartov\n52,Ker,Kellock,kkellock1f@japanpost.jp,Male,13.216.243.76,Guanlu\n53,Lorne,Smouten,lsmouten1g@noaa.gov,Female,84.97.70.93,Nice\n54,Elijah,Sore,esore1h@wikia.com,Male,189.118.42.113,La Romana\n55,Paxton,Chsteney,pchsteney1i@msn.com,Male,123.81.121.141,Labin\n56,Ernie,Eddies,eeddies1j@disqus.com,Male,60.57.254.84,Książ Wielkopolski\n57,Deb,Endicott,dendicott1k@buzzfeed.com,Female,29.187.172.187,Gamagōri\n58,Morna,Masse,mmasse1l@vkontakte.ru,Female,245.114.22.71,Itaparica\n59,Gregorius,Drains,gdrains1m@samsung.com,Male,9.2.68.145,Medovene\n60,Raynard,Teaz,rteaz1n@issuu.com,Male,220.0.194.145,Birātnagar\n61,Harrietta,Northey,hnorthey1o@hostgator.com,Female,165.48.131.46,Columbus\n62,Cariotta,Le Breton De La Vieuville,clebretondelavieuville1p@sfgate.com,Female,218.154.55.94,Guanqian\n63,Lisetta,Allbones,lallbones1q@reddit.com,Female,240.28.254.181,Higetegera\n64,Danielle,Jeduch,djeduch1r@ovh.net,Female,26.236.61.218,Dadiharja\n65,Ingra,Andriolli,iandriolli1s@ucoz.com,Male,186.119.76.202,Dananshan\n66,Ferdinand,Cruickshanks,fcruickshanks1t@lulu.com,Male,133.165.27.191,Saint Cloud\n67,Salomi,Pinnock,spinnock1u@hc360.com,Female,20.234.128.32,Venda\n68,Lurlene,Snazel,lsnazel1v@smh.com.au,Female,244.2.252.88,Hitiaa\n69,Penni,Sells,psells1w@booking.com,Female,245.53.159.172,Asahi\n70,Stormie,Dougal,sdougal1x@cbc.ca,Female,63.157.30.92,Woniuhe\n71,Baily,Hallwell,bhallwell1y@usnews.com,Male,55.151.17.139,Taytayan\n72,Kristofor,Recke,krecke1z@microsoft.com,Male,12.155.58.230,Lukavec\n73,Cherey,Dorricott,cdorricott20@cbslocal.com,Female,198.238.41.228,Batabanó\n74,Phillip,Bartolijn,pbartolijn21@biblegateway.com,Male,46.108.220.240,Huskvarna\n75,Karil,Hefford,khefford22@t.co,Female,238.187.151.199,Příbor\n76,Loise,Issacof,lissacof23@dagondesign.com,Female,141.102.16.185,Shangdongjie\n77,Rickie,Laybourn,rlaybourn24@nasa.gov,Male,39.144.8.98,Nova Varoš\n78,Orella,Giacomuzzo,ogiacomuzzo25@alibaba.com,Female,10.142.244.217,Uglich\n79,Calli,D'orsay,cdorsay26@home.pl,Female,66.172.27.41,Fort Lauderdale\n80,Harli,Fakeley,hfakeley27@blogger.com,Female,187.170.131.49,Tempaling\n81,Edvard,Morilla,emorilla28@ycombinator.com,Male,18.246.230.179,Emiliano Zapata\n82,Almira,Eastmead,aeastmead29@soundcloud.com,Female,171.92.72.40,Göteborg\n83,Kort,Blooman,kblooman2a@imgur.com,Male,245.7.50.99,Oenaik\n84,Sigmund,Sessions,ssessions2b@bizjournals.com,Male,218.191.236.117,Bordeaux\n85,Winna,Dodshon,wdodshon2c@tinypic.com,Female,104.5.161.50,Casselman\n86,Norton,Raiston,nraiston2d@nydailynews.com,Male,38.85.237.249,Rudnyy\n87,Moss,Doche,mdoche2e@microsoft.com,Male,113.41.249.243,Egvekinot\n88,Jeanna,Mazey,jmazey2f@naver.com,Female,71.33.138.94,Wolomoni\n89,Kerrin,Rojahn,krojahn2g@delicious.com,Female,42.80.219.36,Sonder\n90,Luca,Frazier,lfrazier2h@i2i.jp,Male,217.45.176.54,Safed\n91,Faina,Jarville,fjarville2i@si.edu,Female,15.70.138.160,Limoges\n92,Skelly,Cragg,scragg2j@naver.com,Male,58.82.80.21,Wang Saphung\n93,Mike,Kennewell,mkennewell2k@virginia.edu,Male,66.171.238.162,Pinghu\n94,Trever,Bradie,tbradie2l@merriam-webster.com,Male,34.247.7.142,Pryluky\n95,Ferdinande,Drought,fdrought2m@goo.gl,Female,38.16.55.1,Pajé\n96,Brenda,Guiel,bguiel2n@time.com,Female,203.120.94.122,Bilalang\n97,Matthiew,Vanyukov,mvanyukov2o@discovery.com,Male,57.225.42.87,Nehe\n98,Rosalie,Stribbling,rstribbling2p@wiley.com,Female,153.96.166.231,Chinameca\n99,Flor,Giuron,fgiuron2q@storify.com,Female,223.47.130.90,Forssa\n100,Ax,Bristowe,abristowe2r@live.com,Male,61.225.63.247,Francisco Beltrão\n101,Guglielma,Magenny,gmagenny2s@flavors.me,Female,186.78.157.147,Otjimbingwe\n102,Kyla,Crosse,kcrosse2t@bluehost.com,Female,120.253.177.94,Orissaare\n103,Brittan,Bubb,bbubb2u@dailymail.co.uk,Female,105.193.213.100,Bech\n104,Corri,Rubinowicz,crubinowicz2v@europa.eu,Female,211.112.231.38,Bhamdoûn el Mhatta\n105,Korney,Prestidge,kprestidge2w@bing.com,Female,135.251.129.49,Gaobu\n106,Paddie,Dary,pdary2x@redcross.org,Male,28.53.58.92,Xukou\n107,Ase,Fibbens,afibbens2y@whitehouse.gov,Male,206.131.76.218,Örebro\n108,Susi,Pawsey,spawsey2z@zimbio.com,Female,164.219.128.94,Couço\n109,Jo,Walak,jwalak30@dedecms.com,Female,236.66.83.1,Dyurtyuli\n110,Ardelia,Vasilyonok,avasilyonok31@blogspot.com,Female,122.49.55.191,Yege\n111,Alis,Stammer,astammer32@vimeo.com,Female,27.139.204.173,Panggung\n112,Al,Gravatt,agravatt33@1und1.de,Male,122.159.232.76,Rio Meão\n113,Osborne,Fendlow,ofendlow34@tuttocitta.it,Male,233.92.178.182,Uzdin\n114,Brook,Purvey,bpurvey35@dell.com,Female,132.148.245.215,Dahewan\n115,Mag,Feechan,mfeechan36@last.fm,Female,120.208.15.245,Dijon\n116,Luigi,Reaveley,lreaveley37@wp.com,Male,202.197.85.83,Loei\n117,Tymon,Castro,tcastro38@gov.uk,Male,59.83.8.250,Utrecht\n118,Minnaminnie,MacNair,mmacnair39@archive.org,Female,87.11.75.217,Desē\n119,Hugues,MacFarlane,hmacfarlane3a@facebook.com,Male,185.39.40.240,Albuquerque\n120,Fianna,Moizer,fmoizer3b@scientificamerican.com,Female,25.220.76.173,Esperanza\n121,Morton,Derby,mderby3c@ask.com,Male,123.182.139.240,Sentani\n122,Carita,Tomet,ctomet3d@timesonline.co.uk,Female,66.53.175.101,Ecroignard\n123,Beulah,MacGowan,bmacgowan3e@squarespace.com,Female,76.220.38.70,Aquiraz\n124,Etta,Riccardelli,ericcardelli3f@sciencedaily.com,Female,35.86.169.215,Yangyuan\n125,Udall,Chevers,uchevers3g@surveymonkey.com,Male,173.151.137.127,Santa María del Real\n126,Javier,Spitell,jspitell3h@wordpress.com,Male,102.218.85.174,Qinghua\n127,Munmro,Snelling,msnelling3i@php.net,Male,165.120.45.84,Chinju\n128,Carina,Moxon,cmoxon3j@usda.gov,Female,56.126.144.88,Wangjiang\n129,Crissy,Murdie,cmurdie3k@biblegateway.com,Female,222.219.220.191,Santana do Livramento\n130,Karrah,Danshin,kdanshin3l@linkedin.com,Female,87.33.117.4,Dizangué\n131,Idalina,Hartup,ihartup3m@amazon.de,Female,163.148.108.83,Lyon\n132,Denice,Cargon,dcargon3n@usda.gov,Female,163.199.140.236,Huai Mek\n133,Courtnay,Tosh,ctosh3o@list-manage.com,Male,61.103.199.171,Yonago\n134,Harp,Szymoni,hszymoni3p@angelfire.com,Male,203.168.199.52,Rosa Zarate\n135,Franklin,Tregian,ftregian3q@shutterfly.com,Male,232.233.181.45,Rinconada\n136,Celestyna,Jacquemy,cjacquemy3r@berkeley.edu,Female,227.98.162.186,Tangba\n137,Silva,Pittham,spittham3s@ibm.com,Female,18.77.14.20,Rayevskiy\n138,Kendra,Arnow,karnow3t@seesaa.net,Female,39.239.56.41,Lai Lai Bisi Kopan\n139,Cordie,Monier,cmonier3u@harvard.edu,Female,88.168.111.250,Mekarsari\n140,Tabbitha,Padbery,tpadbery3v@woothemes.com,Female,59.255.253.233,Cangchang\n141,Haydon,Sheran,hsheran3w@spiegel.de,Male,144.228.58.140,Vsevolozhsk\n142,Halli,Clempton,hclempton3x@google.co.uk,Female,158.166.191.11,Pamedaran\n143,Gwenette,Helling,ghelling3y@discuz.net,Female,49.89.225.10,Santiago Atitlán\n144,Ermina,Carff,ecarff3z@tinyurl.com,Female,172.50.40.26,Šabac\n145,Tedd,Howler,thowler40@thetimes.co.uk,Male,60.102.22.137,Beiyuan\n146,Wren,Janc,wjanc41@nhs.uk,Female,190.72.127.18,Ngampon\n147,Anatola,Upsale,aupsale42@hc360.com,Female,20.144.225.200,Murici\n148,Ken,Muirhead,kmuirhead43@hatena.ne.jp,Male,63.37.36.62,Sete Lagoas\n149,Jerri,Bohje,jbohje44@livejournal.com,Male,108.147.35.164,Sanfang\n150,Julie,Kopacek,jkopacek45@deviantart.com,Female,126.102.0.5,Borova\n151,Ingelbert,Loveday,iloveday46@aboutads.info,Male,112.68.23.230,São Leopoldo\n152,Elaina,Yanez,eyanez47@ft.com,Female,146.218.1.99,Barrī ash Sharqī\n153,Uri,Aven,uaven48@fema.gov,Male,128.86.185.16,Wichit\n154,Ally,Clausen-Thue,aclausenthue49@latimes.com,Female,187.65.40.149,Xinxiang\n155,Ki,Clew,kclew4a@pagesperso-orange.fr,Female,147.209.17.246,Cristalina\n156,Francesca,Cottham,fcottham4b@hc360.com,Female,147.137.122.252,Viga\n157,Aida,Mundy,amundy4c@ftc.gov,Female,12.248.131.213,Liaodian\n158,Aloin,Dimelow,adimelow4d@tamu.edu,Male,7.12.91.0,Bandjoun\n159,Edgar,Raithbie,eraithbie4e@elegantthemes.com,Male,235.182.131.31,Bau\n160,Thorvald,Gunstone,tgunstone4f@yahoo.co.jp,Male,148.136.238.100,Berat\n161,Temp,Karet,tkaret4g@slideshare.net,Male,250.187.91.149,Baishui\n162,Corinna,Naismith,cnaismith4h@privacy.gov.au,Female,75.78.185.215,Zgornje Pirniče\n163,Cinnamon,Birchenhead,cbirchenhead4i@multiply.com,Female,234.89.1.155,Nyima\n164,Tilda,Couser,tcouser4j@google.nl,Female,31.237.176.246,Mayingzhuang\n165,Tildi,Kimbell,tkimbell4k@phoca.cz,Female,15.223.38.138,Bela Vista do Paraíso\n166,Jeno,Marran,jmarran4l@harvard.edu,Male,194.220.226.188,Pocpo\n167,Mariska,Noble,mnoble4m@mayoclinic.com,Female,0.111.136.34,Luxi\n168,Rozelle,Northrop,rnorthrop4n@wikimedia.org,Female,86.238.26.49,Chajarí\n169,Petey,Thompkins,pthompkins4o@shinystat.com,Male,227.60.166.151,Librazhd-Qendër\n170,Alvie,Pyffe,apyffe4p@economist.com,Male,73.125.141.205,Villeta\n171,Kev,MacKniely,kmackniely4q@dailymail.co.uk,Male,144.254.97.110,Candelaria\n172,Matelda,Wycliffe,mwycliffe4r@squarespace.com,Female,167.147.234.88,Lurugan\n173,Leoline,Flawith,lflawith4s@theglobeandmail.com,Female,80.161.40.207,Sumuranyar\n174,Malachi,Fodden,mfodden4t@smugmug.com,Male,154.32.206.224,Shengli\n175,Pierrette,Abramow,pabramow4u@github.io,Female,112.65.143.82,Pingshan\n176,Lynn,Sames,lsames4v@slideshare.net,Male,155.216.183.177,Tarxien\n177,Krisha,Jinkins,kjinkins4w@list-manage.com,Male,194.242.214.77,Odessa\n178,Cassie,Bramich,cbramich4x@youku.com,Male,254.54.219.96,Guashe\n179,Cynthia,MacTurlough,cmacturlough4y@zimbio.com,Female,113.131.18.92,Outjo\n180,Care,Lademann,clademann4z@meetup.com,Male,48.109.141.160,Lyon\n181,Torrey,Nye,tnye50@merriam-webster.com,Male,163.205.132.15,Ol Kalou\n182,Conni,Higgan,chiggan51@deliciousdays.com,Female,27.37.172.124,Ambatondrazaka\n183,Franky,Casarini,fcasarini52@jugem.jp,Male,61.104.43.130,Meikeng\n184,Alva,Feechan,afeechan53@ftc.gov,Male,24.199.160.151,Priiskovyy\n185,Gaby,Synder,gsynder54@eventbrite.com,Male,44.16.40.151,Balkanabat\n186,Andy,Varley,avarley55@wikimedia.org,Female,152.252.64.126,Chechenglu\n187,Ronda,Heavens,rheavens56@nifty.com,Female,142.133.134.72,Gelgaudiškis\n188,Elwin,Hounsham,ehounsham57@intel.com,Male,109.129.250.250,Tinta\n189,Faythe,Pither,fpither58@stumbleupon.com,Female,203.197.153.39,Zárate\n190,Carling,Arkell,carkell59@java.com,Male,117.87.70.174,Huotian\n191,Kurtis,Saddington,ksaddington5a@cloudflare.com,Male,236.232.152.19,Dobrošte\n192,Dennison,Woolatt,dwoolatt5b@addthis.com,Male,189.16.13.93,Ciudad Barrios\n193,Leda,Luchetti,lluchetti5c@posterous.com,Female,42.106.29.243,Kurikka\n194,Britt,Vile,bvile5d@myspace.com,Male,122.214.119.113,Ciénaga de Oro\n195,Gertrude,Iddison,giddison5e@youtube.com,Female,234.143.79.113,Gribanovskiy\n196,Kathi,Kerne,kkerne5f@bigcartel.com,Female,80.58.158.31,Vila Verde\n197,Caitlin,Zannutti,czannutti5g@behance.net,Female,229.43.64.104,Luodian\n198,Sanson,Ramelot,sramelot5h@smugmug.com,Male,207.245.213.229,Mercedes\n199,Krista,Cowoppe,kcowoppe5i@cam.ac.uk,Female,11.118.28.185,Xiugu\n200,Laurella,Hotchkin,lhotchkin5j@google.co.uk,Female,148.210.240.171,Kashmor\n201,Juliane,Koba,jkoba5k@hao123.com,Female,180.61.20.67,Quanyang\n202,Tobe,Hamlyn,thamlyn5l@wikimedia.org,Female,5.202.34.4,Oleszyce\n203,Neddie,Kwietek,nkwietek5m@edublogs.org,Male,183.80.63.200,Klichaw\n204,Dav,Donet,ddonet5n@sciencedirect.com,Male,147.79.187.128,Cabinda\n205,Amelia,Peggs,apeggs5o@huffingtonpost.com,Female,187.127.231.43,Yashikera\n206,Robby,Heijnen,rheijnen5p@4shared.com,Female,67.244.110.49,Rosh Ha‘Ayin\n207,Loria,Serrier,lserrier5q@hibu.com,Female,87.68.60.140,Tushi\n208,Nan,Witch,nwitch5r@quantcast.com,Female,10.116.94.61,Grande Rivière Noire\n209,Mauricio,Curr,mcurr5s@cyberchimps.com,Male,175.29.39.95,Satinka\n210,Micheal,Whiteson,mwhiteson5t@cocolog-nifty.com,Male,78.18.193.69,Energetik\n211,Denys,Esmonde,desmonde5u@addtoany.com,Female,134.171.231.179,Pantian\n212,Sibilla,Stachini,sstachini5v@dyndns.org,Female,66.219.114.10,Rio Grande da Serra\n213,Enrique,Roman,eroman5w@elegantthemes.com,Male,226.155.134.108,Gunungmalang Satu\n214,Edyth,Macartney,emacartney5x@elegantthemes.com,Female,26.161.138.37,Preobrazheniye\n215,Lisetta,Bigglestone,lbigglestone5y@mit.edu,Female,32.115.116.0,Baikouquan\n216,Colin,Younghusband,cyounghusband5z@jiathis.com,Male,123.91.16.2,Bojong\n217,Britni,Cottham,bcottham60@soundcloud.com,Female,54.243.80.13,Köln\n218,Matias,Tudor,mtudor61@squarespace.com,Male,71.254.115.118,Čeladná\n219,Carina,O' Ronan,coronan62@techcrunch.com,Female,114.82.73.15,Lianzhou\n220,Albrecht,Airds,aairds63@drupal.org,Male,209.213.159.128,Palaiomonástiron\n221,Randy,Sazio,rsazio64@zimbio.com,Female,7.28.169.35,Shuangxiqiao\n222,Timmie,Scotti,tscotti65@hc360.com,Female,134.67.132.81,Banyuresmi\n223,Gerik,Milligan,gmilligan66@ustream.tv,Male,142.157.153.130,San Isidro\n224,Ardys,Diben,adiben67@ucoz.com,Female,251.238.123.72,Petit Valley\n225,Ellery,Bruni,ebruni68@army.mil,Male,148.186.246.133,Prienai\n226,Clarence,Blenkiron,cblenkiron69@com.com,Male,84.85.162.222,Phan Thong\n227,Jackie,Jiruch,jjiruch6a@topsy.com,Male,206.140.145.145,Norrahammar\n228,Melisent,Northwood,mnorthwood6b@mozilla.com,Female,72.52.196.40,Guilmaro\n229,Jeffy,Dalliston,jdalliston6c@tinyurl.com,Male,205.104.32.164,Campamento\n230,Joanne,Lyburn,jlyburn6d@networkadvertising.org,Female,31.91.254.237,Guitang\n231,Yulma,Castagneri,ycastagneri6e@discovery.com,Male,25.83.169.104,Irecê\n232,Marielle,Chrystal,mchrystal6f@blogs.com,Female,195.131.48.31,Paragominas\n233,Haskell,Klimshuk,hklimshuk6g@weather.com,Male,46.170.163.107,Dłutów\n234,Cob,Mardall,cmardall6h@photobucket.com,Male,196.121.158.67,Viljoenskroon\n235,Shep,Voyce,svoyce6i@linkedin.com,Male,253.119.174.230,Kumanis\n236,Geno,Crayden,gcrayden6j@1und1.de,Male,185.131.197.241,København\n237,Friedrich,Giblin,fgiblin6k@vk.com,Male,121.157.210.85,Santa Fe\n238,Desmund,Belamy,dbelamy6l@amazon.co.jp,Male,225.134.142.182,Oefau\n239,Rafe,Wratten,rwratten6m@seattletimes.com,Male,34.104.18.249,Ncue\n240,Flo,Sorrie,fsorrie6n@nationalgeographic.com,Female,92.239.41.42,Rachanie\n241,Elvina,Dulwitch,edulwitch6o@sourceforge.net,Female,209.9.197.182,Gilowice\n242,Dell,Rafe,drafe6p@issuu.com,Male,217.9.123.178,Espírito Santo do Pinhal\n243,Diena,Jahan,djahan6q@salon.com,Female,14.136.254.55,Kotakan Selatan\n244,Gino,Skuce,gskuce6r@yale.edu,Male,14.73.136.196,Dingle\n245,Heath,Eastmond,heastmond6s@geocities.jp,Female,97.228.113.200,Akhaltsikhe\n246,Meg,McKirdy,mmckirdy6t@drupal.org,Female,236.162.213.87,Shuitou\n247,Hastie,Hadley,hhadley6u@yelp.com,Male,247.243.188.92,RMI Capitol\n248,Westleigh,Willetts,wwilletts6v@nhs.uk,Male,254.201.29.160,Berthierville\n249,Lee,Bagnal,lbagnal6w@yahoo.co.jp,Female,149.85.96.127,Psygansu\n250,Hildegaard,Fairey,hfairey6x@biglobe.ne.jp,Female,163.32.149.210,Thanatpin\n251,Easter,Hamshere,ehamshere6y@freewebs.com,Female,79.63.202.214,Dalgān\n252,Elton,Tows,etows6z@quantcast.com,Male,247.144.178.132,Yamkino\n253,Verile,Gunning,vgunning70@infoseek.co.jp,Female,167.199.48.8,Barmash\n254,Brandtr,Margeram,bmargeram71@php.net,Male,92.148.45.135,Nasilava\n255,Ozzie,Zecchii,ozecchii72@sfgate.com,Male,106.126.179.46,Ruy Barbosa\n256,Daniella,Jindra,djindra73@jigsy.com,Female,177.36.251.227,Yelets\n257,Shoshanna,Stollsteimer,sstollsteimer74@mysql.com,Female,59.129.39.60,Az Zuwaytīnah\n258,Benton,Jahnig,bjahnig75@bigcartel.com,Male,6.102.2.246,Avdzaga\n259,Noel,Selliman,nselliman76@istockphoto.com,Male,116.13.38.101,Žirovnice\n260,Clarke,Tidcomb,ctidcomb77@linkedin.com,Male,12.36.43.63,Budayuan\n261,Brigitta,Haquin,bhaquin78@cdbaby.com,Female,240.150.196.238,Huangjinjing\n262,Claribel,Dosedale,cdosedale79@barnesandnoble.com,Female,246.254.4.138,Dasol\n263,Gallard,Wanden,gwanden7a@purevolume.com,Male,166.154.144.52,Wartburg\n264,Marleah,Shevlan,mshevlan7b@surveymonkey.com,Female,251.253.123.90,Semey\n265,Saundra,Butterfint,sbutterfint7c@redcross.org,Male,34.0.120.48,Sincelejo\n266,Opalina,Bleier,obleier7d@posterous.com,Female,29.181.64.189,Monte Carmelo\n267,Shaughn,Antoniades,santoniades7e@salon.com,Male,81.81.69.245,Lumphăt\n268,Kathleen,Treswell,ktreswell7f@kickstarter.com,Female,60.7.118.238,Binlod\n269,Mufinella,Santo,msanto7g@paypal.com,Female,152.225.165.64,Pavlodar\n270,Marlin,Wheeliker,mwheeliker7h@dedecms.com,Male,254.47.9.106,Nîmes\n271,Aldon,Wozencraft,awozencraft7i@meetup.com,Male,247.123.79.200,Liangdang Chengguanzhen\n272,Beaufort,Petrello,bpetrello7j@latimes.com,Male,218.17.92.56,Diadi\n273,Marmaduke,O'Malley,momalley7k@adobe.com,Male,98.67.111.52,Zapolyarnyy\n274,Kathryn,MacManus,kmacmanus7l@hc360.com,Female,240.234.35.68,Anabar\n275,Eve,Clother,eclother7m@bigcartel.com,Female,42.141.113.243,Milín\n276,Obediah,Janus,ojanus7n@imageshack.us,Male,179.170.164.93,Pontinha\n277,Emmy,Negri,enegri7o@merriam-webster.com,Male,105.235.29.160,Karangori\n278,Mill,Wesson,mwesson7p@bizjournals.com,Male,53.112.190.129,Nōgata\n279,Tiertza,Bullivent,tbullivent7q@dyndns.org,Female,131.45.227.60,Mehrābpur\n280,Berne,Scrivener,bscrivener7r@mtv.com,Male,14.171.136.28,Weichanglu\n281,Rozella,Shirlaw,rshirlaw7s@ask.com,Female,102.88.226.237,Manique de Baixo\n282,Emmit,Cruttenden,ecruttenden7t@skyrock.com,Male,223.173.130.230,Guanshui\n283,Iseabal,Terron,iterron7u@spiegel.de,Female,238.112.13.39,Krasiczyn\n284,Michele,Garritley,mgarritley7v@nyu.edu,Female,146.115.120.2,Morcellemont Saint André\n285,Theodoric,Deave,tdeave7w@exblog.jp,Male,154.19.56.42,Ugljan\n286,Sibilla,Alesi,salesi7x@chron.com,Female,54.24.9.225,Xingou\n287,Erick,Austick,eaustick7y@kickstarter.com,Male,249.246.133.232,Longvic\n288,Hercules,Dowall,hdowall7z@example.com,Male,95.224.172.15,Talisayan\n289,Ellene,Glisane,eglisane80@nyu.edu,Female,199.110.252.148,Palue\n290,Bren,Marchenko,bmarchenko81@twitpic.com,Male,118.101.28.108,Songculan\n291,Oralee,Letchmore,oletchmore82@indiatimes.com,Female,101.50.142.2,Mayenne\n292,Hamilton,Horsley,hhorsley83@forbes.com,Male,159.74.111.25,Namur\n293,Fanya,Gartan,fgartan84@si.edu,Female,153.208.82.105,Vancouver\n294,Godfrey,Cattrell,gcattrell85@state.gov,Male,13.184.11.7,Abdurahmoni Jomí\n295,Vania,Sinnott,vsinnott86@constantcontact.com,Female,255.197.190.77,Qiaolin\n296,Osmond,Reichert,oreichert87@etsy.com,Male,116.212.149.203,Jixin\n297,Colline,Meadowcroft,cmeadowcroft88@ihg.com,Female,242.3.203.109,Capalonga\n298,Marybelle,Neathway,mneathway89@topsy.com,Female,116.124.132.29,Kaduluhur\n299,Laetitia,Sidry,lsidry8a@livejournal.com,Female,40.242.52.39,Villa General Belgrano\n300,Gasparo,Burr,gburr8b@apple.com,Male,188.118.237.96,Emiliano Zapata\n301,Darin,Gitting,dgitting8c@delicious.com,Male,144.239.113.244,Jinpanling\n302,Lotti,Linnock,llinnock8d@tripod.com,Female,134.251.34.59,Binkolo\n303,Lilly,Annear,lannear8e@uiuc.edu,Female,220.213.130.67,Savonlinna\n304,Freda,Winslade,fwinslade8f@angelfire.com,Female,185.228.131.81,Tayum\n305,Stavros,McGeady,smcgeady8g@disqus.com,Male,135.200.148.69,Aketi\n306,Marje,Fordyce,mfordyce8h@deliciousdays.com,Female,78.253.229.61,Rinbung\n307,Willard,Widdall,wwiddall8i@dyndns.org,Male,189.158.78.106,Bagnères-de-Bigorre\n308,Meridel,Ledford,mledford8j@taobao.com,Female,5.228.2.228,Doong\n309,Catrina,Whiskerd,cwhiskerd8k@fema.gov,Female,25.106.94.89,Halimaung Jaya (F-3)\n310,Chucho,Lewton,clewton8l@geocities.com,Male,67.63.87.83,Asadābād\n311,Rakel,Fitzsymons,rfitzsymons8m@addthis.com,Female,43.238.97.33,Gaoleshan\n312,Caye,Canton,ccanton8n@unicef.org,Female,48.65.103.178,Verkhnyaya Belka\n313,Clari,Thowless,cthowless8o@uiuc.edu,Female,147.78.179.122,Suḩayl Shibām\n314,Thia,Vasyanin,tvasyanin8p@issuu.com,Female,10.4.154.83,San Francisco\n315,Laird,Insoll,linsoll8q@wsj.com,Male,27.89.133.102,Torbay\n316,Jany,Holbie,jholbie8r@twitter.com,Female,162.154.130.96,Santa Clara\n317,Adlai,Harm,aharm8s@ucsd.edu,Male,71.41.127.8,Francisco I Madero\n318,Doy,Riccetti,driccetti8t@pinterest.com,Male,146.94.172.211,Mengdadazhuang\n319,Elvera,Bowdrey,ebowdrey8u@alexa.com,Female,139.75.140.171,Uruçuca\n320,Kalli,Critcher,kcritcher8v@feedburner.com,Female,37.3.6.7,Xinbao\n321,Carny,Growden,cgrowden8w@wikia.com,Male,234.207.132.85,Obiliq\n322,Brook,Caff,bcaff8x@army.mil,Female,62.195.181.235,Xue’an\n323,Frankie,Warburton,fwarburton8y@who.int,Female,252.8.235.114,Tanghu\n324,Mahmud,Ferby,mferby8z@amazonaws.com,Male,62.47.235.96,Odolanów\n325,Tamas,MacPaik,tmacpaik90@archive.org,Male,239.120.30.249,Bashan\n326,Tulley,Twiggs,ttwiggs91@123-reg.co.uk,Male,46.213.53.42,Cergy-Pontoise\n327,Tony,Venny,tvenny92@alibaba.com,Male,157.244.169.162,Dabaozi\n328,Dwain,Verrick,dverrick93@goodreads.com,Male,59.133.131.217,Avellaneda\n329,Adaline,Gligoraci,agligoraci94@harvard.edu,Female,78.178.234.9,Megion\n330,Bronny,Innman,binnman95@go.com,Male,117.21.81.90,An Châu\n331,Sydel,Sherland,ssherland96@de.vu,Female,45.27.130.2,Santana do Paraíso\n332,Nelie,Barnard,nbarnard97@nsw.gov.au,Female,192.133.199.243,Citeguh\n333,Keary,Jamary,kjamary98@disqus.com,Male,146.49.194.187,Mae Ramat\n334,Elwood,Mingardi,emingardi99@blogtalkradio.com,Male,11.133.106.229,Lodan Wetan\n335,Ellwood,Meegan,emeegan9a@virginia.edu,Male,253.126.81.111,Blama\n336,Berry,Gribbins,bgribbins9b@odnoklassniki.ru,Female,231.15.254.178,Lukunor\n337,Alys,Gerge,agerge9c@cdc.gov,Female,63.30.64.147,Grujugan\n338,Mufinella,Harcus,mharcus9d@zimbio.com,Female,231.124.67.65,Polyarnyye Zori\n339,Nap,Messiter,nmessiter9e@linkedin.com,Male,43.153.143.109,Fundong\n340,Hy,Drewry,hdrewry9f@tuttocitta.it,Male,190.211.156.71,Fernandópolis\n341,Maressa,Andras,mandras9g@yellowbook.com,Female,241.59.42.178,Mapusagafou\n342,Gayla,Hebbes,ghebbes9h@gnu.org,Female,15.19.142.22,Abomsa\n343,Stephenie,Hurt,shurt9i@goo.gl,Female,215.144.121.249,Zharkent\n344,Sergei,Blumson,sblumson9j@yelp.com,Male,98.24.92.125,Daping\n345,Berke,Fashion,bfashion9k@ning.com,Male,148.254.8.121,Eixo\n346,Gal,Bestiman,gbestiman9l@timesonline.co.uk,Male,50.115.52.87,Morazán\n347,Rosalind,Macieja,rmacieja9m@cdc.gov,Female,193.114.128.156,Cuispes\n348,Roderick,Hush,rhush9n@nymag.com,Male,118.50.21.212,Tianhe\n349,Libbie,Gabbotts,lgabbotts9o@unicef.org,Female,172.216.241.143,Tilburg\n350,Pippy,Thickins,pthickins9p@facebook.com,Female,188.249.136.202,Benisheikh\n351,Manny,Denny,mdenny9q@yandex.ru,Male,185.239.194.99,Kae Dam\n352,Florie,Cuthbertson,fcuthbertson9r@narod.ru,Female,10.181.155.228,Goiás\n353,Simone,McMychem,smcmychem9s@ow.ly,Female,185.172.219.152,Sieradza\n354,Lyn,Chivers,lchivers9t@cpanel.net,Female,27.201.177.8,Ash Shaddādah\n355,Devlin,Woodhouse,dwoodhouse9u@163.com,Male,36.53.87.177,Turirejo\n356,Dulcie,Dower,ddower9v@engadget.com,Female,45.70.201.155,Milaor\n357,Aaron,Baker,abaker9w@spiegel.de,Male,218.209.50.211,Bandarbeyla\n358,Benedikta,O'Crevan,bocrevan9x@cam.ac.uk,Female,71.21.249.153,Kālīganj\n359,Saudra,McGrill,smcgrill9y@ocn.ne.jp,Female,255.236.14.201,Pombas\n360,Meggy,Birbeck,mbirbeck9z@e-recht24.de,Female,108.171.254.153,Donnycarney\n361,Link,McGuinness,lmcguinnessa0@facebook.com,Male,111.4.194.175,Semiletka\n362,Bertha,Vondrach,bvondracha1@xrea.com,Female,14.142.215.166,Can-Avid\n363,Nert,Finby,nfinbya2@cyberchimps.com,Female,227.164.229.225,Cruz Alta\n364,Fairleigh,Brunt,fbrunta3@earthlink.net,Male,146.88.97.255,Shipaidong\n365,Genni,Cabrales,gcabralesa4@netlog.com,Female,140.23.52.92,Dębno\n366,Rosella,Kenney,rkenneya5@mapquest.com,Female,57.20.98.134,Bordeaux\n367,Rodrique,Elderbrant,relderbranta6@geocities.com,Male,227.86.173.77,Qinghe\n368,Moise,Kaspar,mkaspara7@eventbrite.com,Male,177.156.183.172,Vyatskiye Polyany\n369,Betteann,Mayall,bmayalla8@bluehost.com,Female,39.148.32.41,Nanton\n370,Colleen,Ikringill,cikringilla9@angelfire.com,Female,107.234.122.63,Canto\n371,Eleni,Yakushkev,eyakushkevaa@instagram.com,Female,237.24.104.10,Cukangpanjang\n372,Carolus,Sainz,csainzab@wordpress.org,Male,16.29.210.252,N'Djamena\n373,Towney,Slimme,tslimmeac@wp.com,Male,228.145.79.133,Kthella e Epërme\n374,Fifine,Petto,fpettoad@auda.org.au,Female,2.37.210.172,Kunheda Woerzu Manzu\n375,Ernesto,Schlag,eschlagae@blogs.com,Male,51.41.191.108,Laï\n376,Rorke,Coot,rcootaf@elegantthemes.com,Male,121.103.231.105,Barbosa\n377,Courtney,Terry,cterryag@list-manage.com,Female,88.139.79.154,Mthatha\n378,Delinda,Jirka,djirkaah@people.com.cn,Female,115.156.134.48,Omboué\n379,Kipp,Grigoletti,kgrigolettiai@goo.gl,Male,250.76.168.248,Girihieum\n380,Bailey,Colbeck,bcolbeckaj@plala.or.jp,Male,124.113.134.23,Da’an\n381,Wilburt,Gopsall,wgopsallak@bing.com,Male,41.247.226.52,Kolonnawa\n382,Venita,Bainbridge,vbainbridgeal@skyrock.com,Female,48.37.214.169,Dessalines\n383,Lelia,Collingworth,lcollingwortham@mashable.com,Female,128.238.213.118,El Quetzal\n384,Kate,Cusworth,kcusworthan@ameblo.jp,Female,220.228.86.194,Hostivice\n385,Lenore,Domenicone,ldomeniconeao@mail.ru,Female,74.117.219.172,Jaworze\n386,Fidole,Drillingcourt,fdrillingcourtap@toplist.cz,Male,69.118.58.76,Daejeon\n387,Kariotta,Diloway,kdilowayaq@cdbaby.com,Female,103.83.133.80,Macabugos\n388,Camila,Beveredge,cbeveredgear@netvibes.com,Female,113.174.189.152,Pingshan\n389,Myrwyn,Marcham,mmarchamas@cafepress.com,Male,144.221.172.213,Muroto-misakicho\n390,Stephi,Miskimmon,smiskimmonat@vimeo.com,Female,158.67.131.220,Arrap’i\n391,Averill,Sciusscietto,asciussciettoau@qq.com,Male,255.224.28.240,Sumbuya\n392,Caleb,Satch,csatchav@microsoft.com,Male,212.238.107.121,Schengen\n393,Curt,Rowlands,crowlandsaw@prweb.com,Male,239.230.92.227,Pulau Pinang\n394,Randie,McKennan,rmckennanax@spotify.com,Male,170.143.185.82,Sanqu\n395,Jacenta,Follacaro,jfollacaroay@shop-pro.jp,Female,198.87.39.196,Kyaikkami\n396,Danie,Baddam,dbaddamaz@wp.com,Male,139.156.47.130,Rosario de Lerma\n397,Lucius,Rankmore,lrankmoreb0@reddit.com,Male,99.68.158.111,Sunchales\n398,Teddie,Iglesia,tiglesiab1@ft.com,Female,195.185.45.3,Miatli\n399,Chaunce,Boyse,cboyseb2@vk.com,Male,64.216.183.240,Pantukan\n400,Gerrie,Cronkshaw,gcronkshawb3@dailymail.co.uk,Male,43.18.5.43,Shanshu\n401,Alexandra,Ortsmann,aortsmannb4@skype.com,Female,241.240.48.219,Lühua\n402,Jillian,Larrett,jlarrettb5@twitpic.com,Female,22.251.77.60,Tála\n403,Jens,Shewan,jshewanb6@scribd.com,Male,183.22.220.250,Donggou\n404,Lloyd,Staunton,lstauntonb7@hhs.gov,Male,112.154.115.149,Casal Novo\n405,York,Tockell,ytockellb8@moonfruit.com,Male,193.255.184.166,Andrushivka\n406,Gardiner,Watterson,gwattersonb9@simplemachines.org,Male,253.132.155.148,Hane\n407,Ernesto,Doughartie,edoughartieba@reverbnation.com,Male,167.27.44.131,Xishiqiao\n408,Lanni,Nice,lnicebb@nydailynews.com,Female,63.51.171.246,Wutongkou\n409,Jeannie,Slane,jslanebc@youku.com,Female,148.37.251.23,Al Marj\n410,Obediah,Akers,oakersbd@macromedia.com,Male,110.177.142.101,Khoa\n411,Minnnie,Tomkinson,mtomkinsonbe@harvard.edu,Female,203.185.227.183,Starotitarovskaya\n412,Salomone,Arsey,sarseybf@newyorker.com,Male,36.145.122.195,Gorobinci\n413,Vernen,Linnock,vlinnockbg@ftc.gov,Male,11.185.95.5,Dusun Tengah Cihaurbeuti\n414,Ignatius,Fleeman,ifleemanbh@netvibes.com,Male,251.200.174.252,Qiting\n415,Orton,Motte,omottebi@de.vu,Male,49.129.201.89,Trasak\n416,Ferdinande,Vasenkov,fvasenkovbj@blogger.com,Female,51.198.206.77,Ratchasan\n417,Sayer,Derks,sderksbk@netvibes.com,Male,211.137.204.125,Tayang\n418,Joycelin,MacCallion,jmaccallionbl@abc.net.au,Female,64.248.194.84,Baixi\n419,Marice,Armin,marminbm@ucla.edu,Female,72.168.195.235,Agrela\n420,Misti,Feaveer,mfeaveerbn@chron.com,Female,200.121.205.130,Pital\n421,Myles,Gordge,mgordgebo@marriott.com,Male,182.56.56.30,Végueta\n422,Anissa,Trowler,atrowlerbp@dailymotion.com,Female,115.198.118.219,Kuching\n423,Willi,Human,whumanbq@earthlink.net,Female,8.110.59.216,Guaitarilla\n424,Branden,Muglestone,bmuglestonebr@icio.us,Male,244.134.165.102,Xilanqi\n425,Saxe,Hegdonne,shegdonnebs@wufoo.com,Male,82.60.153.78,Wichit\n426,Therine,Kelsell,tkelsellbt@google.cn,Female,196.245.107.52,Cawayan\n427,Pietrek,Athersmith,pathersmithbu@theglobeandmail.com,Male,226.27.53.165,Chichigalpa\n428,Humberto,Bengtsen,hbengtsenbv@cbslocal.com,Male,220.133.43.50,Malveira\n429,Lilli,De Bruijne,ldebruijnebw@mediafire.com,Female,13.187.218.126,Tawangrejo\n430,Lizette,MacCard,lmaccardbx@weibo.com,Female,210.229.231.8,Cerca la Source\n431,Edwina,Colleer,ecolleerby@comcast.net,Female,60.158.242.97,Yezhu\n432,Channa,Kuhnhardt,ckuhnhardtbz@google.ru,Female,83.176.56.161,San Cristobal\n433,Melva,Walbrook,mwalbrookc0@ning.com,Female,60.15.108.78,Vin’kivtsi\n434,Carlie,Belone,cbelonec1@nhs.uk,Female,194.117.147.59,Yichun\n435,Christiano,Bru,cbruc2@abc.net.au,Male,206.48.249.23,Bicas\n436,Mary,Reven,mrevenc3@technorati.com,Female,130.82.252.73,Faqqū‘ah\n437,Sib,Chavey,schaveyc4@deviantart.com,Female,67.17.36.69,Kotlovka\n438,Aurlie,Mossop,amossopc5@cnn.com,Female,41.23.163.63,Sioah\n439,Antonina,Evershed,aevershedc6@scientificamerican.com,Female,153.9.86.247,Tubajon\n440,Ajay,Orth,aorthc7@apache.org,Female,28.99.81.176,Calachuchi\n441,Ollie,Codlin,ocodlinc8@npr.org,Male,75.34.211.152,Pingtang\n442,Boycey,Chanter,bchanterc9@youtube.com,Male,111.54.219.187,Thị Trấn Ngan Dừa\n443,Flory,Coch,fcochca@cocolog-nifty.com,Male,233.29.165.10,San Pedro Ayampuc\n444,Donavon,Lackeye,dlackeyecb@creativecommons.org,Male,113.226.184.17,Praia da Tocha\n445,Vivyan,Staley,vstaleycc@drupal.org,Female,202.170.31.194,Cibaregbeg\n446,Robinetta,Perse,rpersecd@booking.com,Female,15.71.127.137,San Cristobal\n447,Lisbeth,Huetson,lhuetsonce@shutterfly.com,Female,87.61.0.218,Medveđa\n448,Sidonnie,Ianelli,sianellicf@edublogs.org,Female,105.14.138.208,Luopioinen\n449,Yetty,Creebo,ycreebocg@boston.com,Female,175.171.148.237,Bachok\n450,Reuven,Surgeon,rsurgeonch@so-net.ne.jp,Male,84.213.210.73,Ínfias\n451,Tommi,Gooda,tgoodaci@google.com.au,Female,83.251.178.155,Zoushi\n452,Mac,Edelston,medelstoncj@uol.com.br,Male,117.196.189.30,Jednorożec\n453,Lavinia,Englefield,lenglefieldck@google.com.au,Female,167.183.182.247,Žamberk\n454,Randall,Balser,rbalsercl@yelp.com,Male,85.80.63.75,Bronnitsy\n455,Griffy,Anand,ganandcm@fema.gov,Male,48.186.193.234,Masebewa\n456,Penni,Sharpley,psharpleycn@indiegogo.com,Female,123.181.124.217,Cawayan Bugtong\n457,Torr,Briggdale,tbriggdaleco@last.fm,Male,82.195.224.8,Krajan Kerjo\n458,Sauveur,Povele,spovelecp@taobao.com,Male,52.191.202.161,Nangalisan\n459,Bea,Vallerine,bvallerinecq@devhub.com,Female,59.149.247.149,Feyẕābād\n460,Holt,Strippling,hstripplingcr@phpbb.com,Male,58.13.250.53,Serere\n461,Dell,Blewitt,dblewittcs@tinyurl.com,Female,30.229.231.119,Shangju\n462,Anett,Bertrand,abertrandct@oakley.com,Female,185.192.19.72,Okazaki\n463,Alford,Rowbottom,arowbottomcu@twitpic.com,Male,80.192.194.5,Kista\n464,Merralee,Fidelli,mfidellicv@salon.com,Female,80.193.201.110,Tovačov\n465,Fidole,Hove,fhovecw@simplemachines.org,Male,74.89.111.90,Komyshnya\n466,Eldredge,Corbally,ecorballycx@census.gov,Male,178.145.90.1,Reszel\n467,Carlin,Mc Combe,cmccombecy@taobao.com,Female,37.21.70.69,Châtellerault\n468,Penelope,Rehme,prehmecz@seesaa.net,Female,145.58.68.21,Habana del Este\n469,Susann,Sciusscietto,ssciussciettod0@topsy.com,Female,117.204.19.108,Dayangqi\n470,Zorah,MacMenemy,zmacmenemyd1@seattletimes.com,Female,207.96.93.51,Olival Basto\n471,Andrew,Label,alabeld2@w3.org,Male,210.178.149.145,Playas\n472,Claudina,Scogin,cscogind3@upenn.edu,Female,159.158.0.243,Zuénoula\n473,Skippie,Obern,sobernd4@eventbrite.com,Male,196.57.252.103,Chaoyang\n474,Pandora,Gadie,pgadied5@prnewswire.com,Female,180.120.134.245,Liushi\n475,Evy,Hoyer,ehoyerd6@booking.com,Female,182.190.113.32,Kon Tum\n476,Dinny,Avo,davod7@lulu.com,Female,192.49.20.253,Wilkowice\n477,Elyn,Giraldo,egiraldod8@wired.com,Female,211.43.21.48,Chervonoarmiys’k\n478,Brewer,Lowdwell,blowdwelld9@weibo.com,Male,78.161.236.46,Lanas\n479,Fanya,Backshall,fbackshallda@constantcontact.com,Female,129.106.54.47,Kapchorwa\n480,Brockie,Rioch,briochdb@pagesperso-orange.fr,Male,249.58.60.21,Małkinia Górna\n481,Wyatt,Ribbens,wribbensdc@house.gov,Male,129.49.135.119,Trebisht-Muçinë\n482,Annette,Griffin,agriffindd@geocities.com,Female,255.210.140.72,Bolorejo\n483,Dorothy,Barnard,dbarnardde@uol.com.br,Female,156.172.174.215,Olszyna\n484,Lexis,Drillingcourt,ldrillingcourtdf@springer.com,Female,253.222.144.185,Phú Thái\n485,Rhodia,Bainton,rbaintondg@wix.com,Female,240.54.111.63,Oslo\n486,Eli,Hammerson,ehammersondh@clickbank.net,Male,14.69.149.51,Dzerzhinsk\n487,Danella,Hancox,dhancoxdi@ucoz.ru,Female,207.195.67.73,Khisarya\n488,Jody,Hounsom,jhounsomdj@squarespace.com,Male,225.55.64.168,Falun\n489,Bradan,Crain,bcraindk@lulu.com,Male,87.95.167.62,Curumaní\n490,Asher,Roycroft,aroycroftdl@blog.com,Male,108.1.14.165,Oslo\n491,Gaylor,Southcott,gsouthcottdm@tmall.com,Male,190.60.6.68,Shuangquan\n492,Bondy,Josefer,bjoseferdn@paypal.com,Male,229.145.79.15,Cartagena\n493,Darelle,Parkey,dparkeydo@lycos.com,Female,48.188.77.239,Purwosari\n494,Nikos,O'Lyhane,nolyhanedp@wunderground.com,Male,18.149.108.252,Pryamitsyno\n495,Glenn,Gellion,ggelliondq@amazon.de,Female,119.42.217.40,Örebro\n496,Laryssa,Foucher,lfoucherdr@istockphoto.com,Female,52.186.189.20,Baihe\n497,Lewes,Bonome,lbonomeds@wikispaces.com,Male,189.163.202.193,Ribas do Rio Pardo\n498,Taber,Critchley,tcritchleydt@cbsnews.com,Male,121.195.184.129,Sterlitamak\n499,Julie,Tomaselli,jtomasellidu@free.fr,Male,151.109.168.39,Köln\n500,Jacqueline,Bourgourd,jbourgourddv@skyrock.com,Female,191.170.211.104,Berezna\n501,Ambur,Holdey,aholdeydw@xinhuanet.com,Female,236.209.51.231,Sawaengha\n502,Sabine,Lyosik,slyosikdx@360.cn,Female,161.232.137.136,Bayt ‘Īnūn\n503,Gladys,Bandt,gbandtdy@ocn.ne.jp,Female,158.14.30.142,Hunkuyi\n504,Paten,Vasyukhichev,pvasyukhichevdz@illinois.edu,Male,175.216.192.130,Nandong\n505,Hunter,Creggan,hcreggane0@amazon.co.uk,Male,208.173.52.40,Albuera\n506,Robert,Dodridge,rdodridgee1@github.io,Male,254.126.160.55,San Vicente\n507,Cash,Dunklee,cdunkleee2@webs.com,Male,42.168.48.95,Kannabechō-yahiro\n508,Thurstan,Broomhall,tbroomhalle3@loc.gov,Male,202.24.156.150,Baraya\n509,Garald,Hackin,ghackine4@comsenz.com,Male,226.232.246.39,Criciúma\n510,Novelia,Dureden,nduredene5@comsenz.com,Female,102.122.213.234,Oberá\n511,Cathlene,Elgood,celgoode6@shutterfly.com,Female,66.37.238.247,Cibiru\n512,Tyler,Latore,tlatoree7@home.pl,Male,41.215.92.170,Gorskaya\n513,Filbert,Bulloch,fbulloche8@hhs.gov,Male,72.24.112.117,La Tinguiña\n514,Katherine,Dand,kdande9@sphinn.com,Female,108.101.48.128,Auch\n515,Ferdy,Richold,fricholdea@privacy.gov.au,Male,113.230.18.33,Eldoret\n516,Warner,Almond,walmondeb@hud.gov,Male,250.114.209.0,Arboga\n517,Lorrie,Elcomb,lelcombec@amazon.co.jp,Male,45.180.103.48,Porteirinha\n518,Granville,Garnsworth,ggarnsworthed@google.es,Male,49.219.161.80,Huancabamba\n519,Tye,Labon,tlabonee@cyberchimps.com,Male,7.143.63.56,Skolkovo\n520,Raoul,Comelli,rcomellief@bravesites.com,Male,163.51.80.68,Madīnat ‘Īsá\n521,Candida,Jikylls,cjikyllseg@xinhuanet.com,Female,177.46.130.45,Matadi\n522,Noni,Whoston,nwhostoneh@jigsy.com,Female,11.182.33.119,Columbia\n523,Laurent,Althorp,lalthorpei@marriott.com,Male,93.246.70.133,Sarandi\n524,Dwight,Messenger,dmessengerej@meetup.com,Male,61.48.47.81,Almolonga\n525,Vinny,Riddell,vriddellek@nhs.uk,Male,235.41.30.163,Ungaran\n526,Wendie,Shaplin,wshaplinel@phoca.cz,Female,219.103.28.113,Puro\n527,Shurwood,Sisneros,ssisnerosem@cnbc.com,Male,208.151.194.106,Pamatang\n528,Brenda,Rogliero,broglieroen@ebay.co.uk,Female,8.103.136.58,Budapest\n529,Alyce,Scotter,ascottereo@ifeng.com,Female,245.246.169.182,Daga\n530,Clare,Swainson,cswainsonep@yahoo.com,Male,240.176.141.192,Combita\n531,Lurleen,Kerswill,lkerswilleq@redcross.org,Female,3.77.74.156,Himeji\n532,Woodman,Hadny,whadnyer@seesaa.net,Male,167.37.97.138,Suci Kaler\n533,Gerianne,Tryhorn,gtryhornes@bbc.co.uk,Female,233.165.24.161,Shihua\n534,Avigdor,Stadden,astaddenet@youtu.be,Male,2.162.98.165,Beit Jann\n535,Dennet,Plessing,dplessingeu@gnu.org,Male,109.132.124.252,Frederiksberg\n536,Tabbie,Farge,tfargeev@icio.us,Female,56.152.235.191,Terang\n537,Cristionna,MacBain,cmacbainew@phpbb.com,Female,221.165.111.121,Waco\n538,Leonie,Brocket,lbrocketex@barnesandnoble.com,Female,107.206.75.216,Nepomuceno\n539,Lief,Bielby,lbielbyey@studiopress.com,Male,201.29.133.102,Zubtsov\n540,Kellen,Chew,kchewez@sun.com,Male,115.197.231.137,Porsgrunn\n541,Chico,Lismore,clismoref0@flavors.me,Male,236.72.101.144,Canga’an\n542,Dan,Baldetti,dbaldettif1@booking.com,Male,228.163.192.178,Pentecoste\n543,Stormi,Schimke,sschimkef2@apple.com,Female,133.116.215.131,Yonghe\n544,Letta,Meneyer,lmeneyerf3@loc.gov,Female,235.252.200.137,Atlanta\n545,Adah,Larder,alarderf4@tamu.edu,Female,159.105.37.166,Arvayheer\n546,Gerri,McQuade,gmcquadef5@nbcnews.com,Female,174.231.142.255,Yongfeng\n547,Parke,Charteris,pcharterisf6@si.edu,Male,119.155.5.197,Belém\n548,Chico,Hardwick,chardwickf7@whitehouse.gov,Male,178.184.136.159,Vihāri\n549,Peder,Coakley,pcoakleyf8@walmart.com,Male,75.183.213.214,Libu\n550,Chelsea,Verriour,cverriourf9@youku.com,Female,172.13.54.244,Nijmegen\n551,Carina,Yurmanovev,cyurmanovevfa@indiatimes.com,Female,215.108.185.108,Longxing\n552,Brittne,Hawkshaw,bhawkshawfb@weather.com,Female,240.172.194.75,Candelária\n553,Candy,Dreakin,cdreakinfc@homestead.com,Female,227.18.178.94,Sadowie\n554,Raynard,Sperring,rsperringfd@gravatar.com,Male,215.6.73.75,Huipinggeng\n555,Angel,covino,acovinofe@w3.org,Male,40.147.52.189,Monkayo\n556,Judy,Yesenev,jyesenevff@stanford.edu,Female,212.165.166.71,Baisha\n557,Thibaut,Demsey,tdemseyfg@house.gov,Male,198.162.213.135,Moret-sur-Loing\n558,Esmaria,Tidman,etidmanfh@i2i.jp,Female,171.223.200.20,Balungao\n559,Michaela,Yandle,myandlefi@addthis.com,Female,12.228.203.169,Lebak\n560,Lincoln,Conboy,lconboyfj@spotify.com,Male,98.158.65.159,Baloc\n561,Bartram,Agass,bagassfk@virginia.edu,Male,133.228.196.6,Siyabuswa\n562,Guendolen,Iacovino,giacovinofl@ucla.edu,Female,117.187.61.27,Jäppilä\n563,Glenda,Shenley,gshenleyfm@symantec.com,Female,45.84.218.12,Ayapa\n564,Dedra,Kempe,dkempefn@stanford.edu,Female,61.28.17.151,Anáfi\n565,Paten,Selborne,pselbornefo@cdbaby.com,Male,241.233.43.80,Zhoujiang\n566,Mill,Tanguy,mtanguyfp@purevolume.com,Male,58.222.13.8,Kveda Chkhorots’q’u\n567,Jonathan,Abbess,jabbessfq@wikipedia.org,Male,207.157.61.135,Xufu\n568,Lester,Dyton,ldytonfr@sakura.ne.jp,Male,25.190.165.42,Strum\n569,Hynda,Dahlback,hdahlbackfs@cisco.com,Female,29.174.159.83,Serikbuya\n570,Willi,Crannach,wcrannachft@economist.com,Male,255.178.90.25,Honglai\n571,Hinda,Reinisch,hreinischfu@usatoday.com,Female,172.106.76.24,Hanban\n572,Margareta,Strainge,mstraingefv@who.int,Female,81.42.6.41,Xinmin\n573,Modestine,Rayer,mrayerfw@4shared.com,Female,51.233.150.198,Ōnojō\n574,Maurizia,Costen,mcostenfx@npr.org,Female,124.38.157.213,Qiaoxi\n575,Crosby,Rosenfelt,crosenfeltfy@cbc.ca,Male,131.228.177.2,Guocun\n576,Willie,von Grollmann,wvongrollmannfz@soup.io,Male,114.174.141.92,Renshan\n577,Laurice,Pople,lpopleg0@dell.com,Female,222.216.151.202,Kárystos\n578,Colan,Cluet,ccluetg1@illinois.edu,Male,232.197.104.164,Danxi\n579,Bertina,Buist,bbuistg2@hao123.com,Female,101.120.144.17,Moholm\n580,Alli,Creedland,acreedlandg3@addtoany.com,Female,113.198.82.211,Hengdian\n581,Engelbert,Fahy,efahyg4@washington.edu,Male,252.149.12.53,Mogadishu\n582,Arch,Wightman,awightmang5@flickr.com,Male,204.102.242.200,Ōnojō\n583,Allyn,Towl,atowlg6@nifty.com,Female,112.182.152.104,Taman\n584,Valenka,Thirwell,vthirwellg7@php.net,Female,222.57.96.182,Paccho\n585,Kelsi,Roaf,kroafg8@exblog.jp,Female,217.180.35.187,Staraya Derevnya\n586,Elspeth,Kleinzweig,ekleinzweigg9@blogs.com,Female,51.231.174.227,Šabac\n587,Roderick,Burgis,rburgisga@economist.com,Male,169.206.107.141,Zhaocun\n588,Keven,Grinham,kgrinhamgb@live.com,Male,184.42.234.252,São Luís do Quitunde\n589,Jere,Ganley,jganleygc@clickbank.net,Female,100.27.190.169,Paris 12\n590,Larry,Sircombe,lsircombegd@ebay.com,Male,150.37.68.183,Tankhoy\n591,Jacques,O'Nion,jonionge@blogger.com,Male,234.120.143.200,Cisarap\n592,Herbert,Sugg,hsugggf@webeden.co.uk,Male,46.37.80.254,Pathum Thani\n593,Nettle,Sinncock,nsinncockgg@google.fr,Female,42.179.9.230,Wilcza\n594,Ogdan,Paffot,opaffotgh@newyorker.com,Male,205.176.99.178,Beiping\n595,Emile,Rosellini,erosellinigi@dot.gov,Male,151.176.33.198,Kedrovoye\n596,Lenee,Howsin,lhowsingj@umich.edu,Female,172.248.100.48,Walakeri\n597,Nonie,Slaymaker,nslaymakergk@springer.com,Female,98.181.182.84,Wanshan\n598,Wilhelmina,Muzzini,wmuzzinigl@wikispaces.com,Female,8.12.36.186,Sanli\n599,Lesley,Gerok,lgerokgm@zimbio.com,Female,101.115.64.140,Sukadana Selatan\n600,Aubrey,McIlhagga,amcilhaggagn@indiatimes.com,Male,229.14.50.108,Bella Vista\n601,Cassey,Juanes,cjuanesgo@clickbank.net,Female,106.95.90.153,Kafr Dān\n602,Leigh,Bernaert,lbernaertgp@usatoday.com,Male,105.155.224.80,Lianhe\n603,Clarita,Nast,cnastgq@eventbrite.com,Female,139.23.86.235,Kibuku\n604,Darin,Grigoire,dgrigoiregr@angelfire.com,Male,213.124.21.164,Qiaogu\n605,Noemi,Tuttiett,ntuttiettgs@com.com,Female,159.35.228.155,Ticrapo\n606,Garrik,Pauleau,gpauleaugt@noaa.gov,Male,250.227.164.122,Matur\n607,Carlos,McComiskey,cmccomiskeygu@wufoo.com,Male,206.199.182.255,Srabah\n608,Yves,Heynel,yheynelgv@archive.org,Male,111.49.213.91,Chenārān\n609,Patric,Herculeson,pherculesongw@jigsy.com,Male,52.129.127.148,Hanover\n610,Cam,Alesbrook,calesbrookgx@nifty.com,Female,215.17.75.5,Malata\n611,Nydia,Edmenson,nedmensongy@addthis.com,Female,174.107.242.147,Santiago Puringla\n612,Norina,Greening,ngreeninggz@usnews.com,Female,250.206.156.151,Chengqiao\n613,Alexandros,Prettyman,aprettymanh0@ucoz.ru,Male,163.155.175.148,Partille\n614,Neddie,Clothier,nclothierh1@skyrock.com,Male,12.187.208.71,Jaworzynka\n615,Rudolfo,Silly,rsillyh2@techcrunch.com,Male,90.107.19.85,Donggu\n616,Kerrie,Casemore,kcasemoreh3@webnode.com,Female,24.32.21.140,Pszczyna\n617,Wylie,De Fries,wdefriesh4@japanpost.jp,Male,59.231.68.195,Xiaoya\n618,Lea,Errington,lerringtonh5@bandcamp.com,Female,189.27.107.246,Santa Bárbara\n619,Woodrow,Brechin,wbrechinh6@dailymail.co.uk,Male,32.114.250.59,Quintã\n620,Stafani,Boggish,sboggishh7@ox.ac.uk,Female,215.78.129.133,Frederico Westphalen\n621,Jakob,Varns,jvarnsh8@mtv.com,Male,118.237.174.240,Grabovci\n622,Norma,Calley,ncalleyh9@wordpress.org,Female,122.86.158.187,Üydzen\n623,Victoir,Yurenev,vyurenevha@cargocollective.com,Male,186.221.83.203,Miliangju\n624,Cassey,Rockhall,crockhallhb@unc.edu,Female,253.82.56.213,Villejuif\n625,Nilson,Kimberley,nkimberleyhc@chronoengine.com,Male,208.212.235.143,Videira\n626,Gwendolin,Joselson,gjoselsonhd@e-recht24.de,Female,113.163.96.246,Liandu\n627,Reggie,Bushaway,rbushawayhe@hp.com,Female,30.146.223.173,Carleton Place\n628,Giorgia,Dundredge,gdundredgehf@skyrock.com,Female,129.47.61.234,Yachimata\n629,Pietra,McAleese,pmcaleesehg@networksolutions.com,Female,253.156.232.35,Dushang\n630,Ellynn,Peterken,epeterkenhh@nba.com,Female,93.195.212.10,Farah\n631,Umberto,Schermick,uschermickhi@photobucket.com,Male,50.30.197.240,Penha\n632,Mildrid,Osban,mosbanhj@cafepress.com,Female,240.193.200.11,Göteborg\n633,Emera,Digges,ediggeshk@trellian.com,Female,179.229.224.134,Doba\n634,Krissie,Nore,knorehl@vinaora.com,Female,93.46.120.15,Armenia\n635,Jeannine,Phlippsen,jphlippsenhm@jigsy.com,Female,130.98.206.249,Zalishchyky\n636,Wolf,Klasen,wklasenhn@kickstarter.com,Male,139.76.229.18,Dadong\n637,Allistir,Rollingson,arollingsonho@privacy.gov.au,Male,240.170.27.137,Uglich\n638,Suzann,Hugli,shuglihp@engadget.com,Female,251.197.224.18,Banjar Jambe Baleran\n639,Nick,Lesek,nlesekhq@technorati.com,Male,121.71.188.99,Manggis\n640,Adams,Denisevich,adenisevichhr@merriam-webster.com,Male,27.18.164.214,Portela\n641,Bird,Meritt,bmeritths@sogou.com,Female,169.145.31.224,Eskilstuna\n642,Erastus,Constanza,econstanzaht@dailymail.co.uk,Male,191.2.22.18,Mirów\n643,Dinah,Jandourek,djandourekhu@dell.com,Female,185.55.93.91,Nawābganj\n644,Edmund,Dales,edaleshv@skype.com,Male,222.225.157.7,Chepo\n645,Justin,O'Donovan,jodonovanhw@wired.com,Male,123.133.125.30,Cambarus\n646,Aeriela,Thumnel,athumnelhx@hao123.com,Female,95.252.91.103,Karlskrona\n647,Abbie,Allett,aalletthy@accuweather.com,Female,14.20.177.82,Delgermörön\n648,Ede,Margrem,emargremhz@nymag.com,Female,165.28.0.175,Kōriyama\n649,Danette,Darcy,ddarcyi0@google.pl,Female,153.72.37.29,Velestíno\n650,Betsey,Cracknell,bcracknelli1@shop-pro.jp,Female,20.164.159.91,Xiawuqi\n651,Ciro,Caldicot,ccaldicoti2@yahoo.co.jp,Male,107.80.201.237,San Fernando\n652,Devlen,Roast,droasti3@dell.com,Male,235.150.61.149,Kadupinang\n653,Brandy,Conichie,bconichiei4@nasa.gov,Female,203.83.101.38,Lobanovo\n654,Kimmi,Kay,kkayi5@omniture.com,Female,163.22.224.33,Beiyang\n655,Kincaid,Bitcheno,kbitchenoi6@msu.edu,Male,106.49.100.140,Dasha\n656,Lolita,Castelletti,lcastellettii7@msu.edu,Female,155.187.86.132,Zbraslavice\n657,Murray,MacDermott,mmacdermotti8@wordpress.org,Male,66.75.209.77,Issy-les-Moulineaux\n658,Christie,Haggath,chaggathi9@cnn.com,Female,125.143.168.82,Emiliano Zapata\n659,Cassey,Swidenbank,cswidenbankia@ed.gov,Female,18.161.103.17,Ialoveni\n660,Rozanna,Sambiedge,rsambiedgeib@yolasite.com,Female,100.28.150.126,Mniszków\n661,Alex,Ayce,aayceic@mail.ru,Female,50.148.243.117,Sankeng\n662,Salvador,Daunter,sdaunterid@huffingtonpost.com,Male,155.85.251.25,El Rancho\n663,Nobie,Winks,nwinksie@com.com,Male,145.149.180.102,Pytalovo\n664,Carling,Von Brook,cvonbrookif@sakura.ne.jp,Male,65.56.113.95,Sambonggede\n665,Lazaro,Buckby,lbuckbyig@intel.com,Male,32.18.52.116,Troitsk\n666,Berta,Bleackly,bbleacklyih@ucsd.edu,Female,82.81.121.204,Kamuli\n667,Amalee,Collocott,acollocottii@huffingtonpost.com,Female,236.46.250.172,Nikopol’\n668,Penrod,Tures,pturesij@soundcloud.com,Male,164.134.78.50,Abejorral\n669,Isa,Broxton,ibroxtonik@about.me,Male,134.239.78.183,Quesada\n670,Bonny,Folbige,bfolbigeil@blogtalkradio.com,Female,32.89.37.71,Hagondange\n671,Nerte,Dayly,ndaylyim@pcworld.com,Female,201.113.48.146,Zhenchuan\n672,Linet,Shiliton,lshilitonin@apple.com,Female,247.231.7.187,Chuncheon\n673,Misti,Lambell,mlambellio@youku.com,Female,15.158.200.213,Tokushima-shi\n674,Gwendolin,McCart,gmccartip@jalbum.net,Female,193.247.161.2,Gaozhou\n675,Alisander,Speenden,aspeendeniq@ucoz.ru,Male,218.221.155.185,Guaíra\n676,Jaquith,Satterthwaite,jsatterthwaiteir@drupal.org,Female,168.194.11.131,Sydney\n677,Lucie,Hadcock,lhadcockis@theguardian.com,Female,10.246.229.145,Rogoźnik\n678,Phedra,Pampling,ppamplingit@lycos.com,Female,118.133.126.83,Zmiennica\n679,Kenton,Toal,ktoaliu@noaa.gov,Male,0.119.148.90,Brzyska\n680,Bess,Meryett,bmeryettiv@wufoo.com,Female,8.31.58.166,San Sebastián\n681,Harman,Cowburn,hcowburniw@ihg.com,Male,174.234.145.42,Oebatu\n682,Bobbye,Rawls,brawlsix@opensource.org,Female,102.84.74.13,Yongchang\n683,Gasparo,Ecclesall,gecclesalliy@squidoo.com,Male,6.179.236.141,Kota Kinabalu\n684,Deana,Glasscoe,dglasscoeiz@liveinternet.ru,Female,151.134.8.1,Khodasy\n685,Rani,Colerick,rcolerickj0@edublogs.org,Female,144.255.200.232,Daleman\n686,Federico,Rudinger,frudingerj1@shop-pro.jp,Male,167.171.79.229,Karlovy Vary\n687,Cyrille,Durram,cdurramj2@google.com.hk,Male,240.153.151.125,Ungus-Ungus\n688,Gunar,Belleny,gbellenyj3@acquirethisname.com,Male,118.67.115.247,Tianya\n689,Arabel,Denzilow,adenzilowj4@ustream.tv,Female,125.5.21.155,Ar Rass\n690,Curt,Carville,ccarvillej5@php.net,Male,192.183.241.240,Babiak\n691,Marvin,Garshore,mgarshorej6@dagondesign.com,Male,5.46.243.48,Tetyushi\n692,Jonathan,Headingham,jheadinghamj7@trellian.com,Male,96.155.36.19,Miaoya\n693,Jerrilee,Saxton,jsaxtonj8@redcross.org,Female,252.82.35.114,Telnice\n694,Viva,Robberts,vrobbertsj9@europa.eu,Female,32.114.65.39,Capatárida\n695,Freeland,Stockow,fstockowja@cloudflare.com,Male,142.159.120.119,Armenia\n696,Fancy,Hengoed,fhengoedjb@china.com.cn,Female,106.238.131.229,Malita\n697,Dionysus,Gresser,dgresserjc@unc.edu,Male,42.213.225.123,Yingshouyingzi\n698,Hebert,Madden,hmaddenjd@jalbum.net,Male,72.0.242.3,Cangyou\n699,Humbert,Luigi,hluigije@businesswire.com,Male,223.153.207.254,Visby\n700,Elladine,Corbally,ecorballyjf@accuweather.com,Female,212.172.188.111,Konin\n701,Trumann,McFarlan,tmcfarlanjg@techcrunch.com,Male,146.216.187.232,Longyuanba\n702,Dan,Sawbridge,dsawbridgejh@imgur.com,Male,161.225.204.98,Vikbolandet\n703,Clerkclaude,Timoney,ctimoneyji@cnn.com,Male,239.141.113.85,Sancang\n704,Marietta,Dench,mdenchjj@hao123.com,Female,43.34.14.200,Kalembutillu\n705,Patty,Millimoe,pmillimoejk@netlog.com,Female,110.76.11.110,Opinogóra Górna\n706,Jeth,Pettiward,jpettiwardjl@wix.com,Male,145.189.233.138,Koundara\n707,Marlo,Hendrix,mhendrixjm@nature.com,Male,85.248.38.34,Canmore\n708,Marnie,Hans,mhansjn@clickbank.net,Female,119.18.150.27,Vysoké nad Jizerou\n709,Bunni,DeSousa,bdesousajo@weather.com,Female,196.30.125.245,Nanyuan\n710,Frans,Kuhl,fkuhljp@nationalgeographic.com,Male,183.27.95.202,Chotepe\n711,Cosetta,Edgecombe,cedgecombejq@apache.org,Female,93.178.1.6,Matozinhos\n712,Crissy,Pinckard,cpinckardjr@typepad.com,Female,51.122.58.171,Varva\n713,Ailene,Billison,abillisonjs@gmpg.org,Female,46.188.8.118,Si Khoraphum\n714,Johna,Ellacott,jellacottjt@geocities.jp,Female,93.217.4.160,Suraż\n715,Candide,Shepstone,cshepstoneju@godaddy.com,Female,176.125.2.196,Druya\n716,Bibi,De Banke,bdebankejv@shareasale.com,Female,187.210.54.2,Mengdong\n717,Delores,Haug,dhaugjw@blogspot.com,Female,135.172.151.9,Nanmuping\n718,Kendricks,Duigenan,kduigenanjx@a8.net,Male,67.157.109.97,Wierzchucino\n719,Bernie,Rattenberie,brattenberiejy@nature.com,Male,206.13.8.146,Cerro Corá\n720,Abbe,Trevarthen,atrevarthenjz@tinyurl.com,Male,36.98.130.183,Nafada\n721,Jae,Matyushonok,jmatyushonokk0@liveinternet.ru,Male,148.178.247.192,Bauru\n722,Babs,Dixcey,bdixceyk1@china.com.cn,Female,11.254.57.89,Tripoli\n723,Betta,Poxon,bpoxonk2@usatoday.com,Female,36.38.110.45,Thul\n724,Mame,Byatt,mbyattk3@gnu.org,Female,136.36.64.168,Raymond\n725,Jennilee,Strasse,jstrassek4@stumbleupon.com,Female,61.54.155.35,Huangge\n726,Sutton,Jelk,sjelkk5@loc.gov,Male,124.77.233.209,Sanguinheira\n727,Vannie,Landrick,vlandrickk6@mysql.com,Female,116.17.184.83,Duncan\n728,Phyllida,Kryszka,pkryszkak7@biglobe.ne.jp,Female,3.57.243.238,Orsk\n729,Burt,Saffill,bsaffillk8@people.com.cn,Male,38.90.2.145,Proletar\n730,Nelson,Crudginton,ncrudgintonk9@ihg.com,Male,28.6.220.124,Macapá\n731,Thomasin,Robilart,trobilartka@bigcartel.com,Female,116.161.191.180,Radès\n732,Lari,Tomovic,ltomovickb@ameblo.jp,Female,149.18.135.245,Fonte da Aldeia\n733,Rica,Stable,rstablekc@washington.edu,Female,52.167.232.219,Osasco\n734,Colver,Munnis,cmunniskd@examiner.com,Male,60.170.74.208,Tegalrejo\n735,Jerald,Beesley,jbeesleyke@imageshack.us,Male,9.58.165.147,Parachinar\n736,Reyna,Cawtheray,rcawtheraykf@gmpg.org,Female,8.6.199.172,Máncora\n737,Buiron,Vlasenko,bvlasenkokg@omniture.com,Male,187.175.237.115,Stamáta\n738,Jennine,Chartman,jchartmankh@miitbeian.gov.cn,Female,106.164.32.156,El Retén\n739,Dallis,Aldus,dalduski@vkontakte.ru,Male,194.28.134.174,Bayan Ewenke Minzu\n740,Carlotta,McIlvaney,cmcilvaneykj@wisc.edu,Female,37.223.138.254,Batou\n741,Tanya,Raye,trayekk@wikispaces.com,Female,125.226.67.218,Paraíso de Chabasquén\n742,Idelle,Jupp,ijuppkl@squarespace.com,Female,169.118.168.39,Wongaya Kaja\n743,Andeee,Stocking,astockingkm@unicef.org,Female,49.186.55.223,Huesca\n744,Ivie,Jewise,ijewisekn@clickbank.net,Female,170.238.221.161,Sanjiang\n745,Prentiss,Lackington,plackingtonko@clickbank.net,Male,86.188.203.147,San Antonio Suchitepéquez\n746,Nikki,Hagerty,nhagertykp@webs.com,Male,73.192.89.91,Labrador City\n747,Dannie,Gowling,dgowlingkq@state.gov,Male,114.109.228.220,Yuqi\n748,Francene,Burnes,fburneskr@reverbnation.com,Female,10.144.224.107,Sumbersarikrajan\n749,Troy,Fawley,tfawleyks@reddit.com,Male,110.174.234.169,Riebiņi\n750,Randi,Surr,rsurrkt@icio.us,Female,90.254.168.46,Dongjingcheng\n751,Skipper,Naisbit,snaisbitku@tuttocitta.it,Male,254.42.37.151,Washington\n752,Prince,Halso,phalsokv@taobao.com,Male,172.85.215.11,Bratislava\n753,Dov,Apthorpe,dapthorpekw@360.cn,Male,86.145.16.48,Breda\n754,Tilda,Milner,tmilnerkx@homestead.com,Female,232.172.79.64,Kandi\n755,Siegfried,Stewartson,sstewartsonky@studiopress.com,Male,199.139.87.87,Baykonyr\n756,Ulick,Keddie,ukeddiekz@acquirethisname.com,Male,38.29.216.94,Bakaran Kulon\n757,Portie,Fydoe,pfydoel0@cyberchimps.com,Male,212.247.17.180,El Zapotal del Norte\n758,Matty,Souness,msounessl1@xinhuanet.com,Female,154.75.46.78,Yinhedahan’er\n759,Mei,Hamel,mhamell2@uol.com.br,Female,136.70.25.250,Gebang\n760,Kenton,Kegg,kkeggl3@loc.gov,Male,34.119.109.174,Lajeosa do Mondego\n761,Tabbie,Wyatt,twyattl4@ted.com,Male,66.33.178.239,Niandui\n762,Woody,Rooms,wroomsl5@e-recht24.de,Male,174.120.186.165,Idi Rayeuk\n763,Erina,Bocock,ebocockl6@wunderground.com,Female,72.46.13.228,Sertânia\n764,Bronnie,Lutz,blutzl7@deliciousdays.com,Male,207.47.116.110,Vologda\n765,Alix,Dohmer,adohmerl8@salon.com,Male,112.196.62.145,Yamkino\n766,Eberto,Rumin,eruminl9@scientificamerican.com,Male,77.152.26.28,Mambusao\n767,Ambrosio,Burley,aburleyla@newyorker.com,Male,145.253.91.248,Oxford\n768,Skippy,Odell,sodelllb@goo.gl,Male,209.219.142.176,Émponas\n769,Killian,Tillyer,ktillyerlc@globo.com,Male,121.160.19.4,Veisiejai\n770,Walsh,Doni,wdonild@epa.gov,Male,40.50.190.83,Nacaome\n771,Roseline,Dotterill,rdotterillle@msn.com,Female,2.217.106.36,Cergy-Pontoise\n772,Ariel,MacMarcuis,amacmarcuislf@over-blog.com,Female,189.61.217.236,Winschoten\n773,Sherri,Runacres,srunacreslg@mail.ru,Female,115.28.145.171,San Gil\n774,Belita,Gorringe,bgorringelh@sitemeter.com,Female,181.30.198.208,Łazy\n775,Britt,Kitteman,bkittemanli@pcworld.com,Female,197.242.248.249,Bieligutai\n776,Adaline,Mahony,amahonylj@phoca.cz,Female,228.59.155.105,Elliot\n777,Simeon,Diloway,sdilowaylk@mozilla.com,Male,93.224.165.226,Changliang\n778,Nealon,Dysert,ndysertll@hexun.com,Male,98.200.54.199,Sayansk\n779,Eduardo,Hartman,ehartmanlm@fc2.com,Male,32.242.191.7,Krajan Alasdowo\n780,Merline,Augustine,maugustineln@geocities.jp,Female,192.69.30.58,Dal’neye Konstantinovo\n781,Samara,Spall,sspalllo@yahoo.com,Female,188.21.28.134,Birowo\n782,Irita,Sherratt,isherrattlp@domainmarket.com,Female,163.228.164.142,Invercargill\n783,Devonna,McCaighey,dmccaigheylq@opera.com,Female,108.111.101.139,Pervoural’sk\n784,Ripley,McGowran,rmcgowranlr@scribd.com,Male,169.102.239.203,Triwil\n785,Dom,Hailwood,dhailwoodls@ocn.ne.jp,Male,76.22.244.122,Impalutao\n786,Don,Sacco,dsaccolt@opera.com,Male,255.132.91.112,Kidal\n787,Tammy,Lidierth,tlidierthlu@bloomberg.com,Female,2.56.12.56,Athy\n788,Quill,Dewey,qdeweylv@theglobeandmail.com,Male,143.173.241.90,Metsamor\n789,Jannelle,Chuck,jchucklw@unblog.fr,Female,61.76.224.200,Chateaubelair\n790,Tomasine,Dennick,tdennicklx@webnode.com,Female,45.193.231.163,Phủ Thông\n791,Mayne,Brusle,mbruslely@phpbb.com,Male,74.15.161.78,Kunheda Woerzu Manzu\n792,Cart,Escot,cescotlz@deviantart.com,Male,90.112.220.226,Jarinu\n793,Emerson,Southgate,esouthgatem0@si.edu,Male,222.161.148.46,Perbaungan\n794,Gino,Delepine,gdelepinem1@parallels.com,Male,53.24.113.23,Rizári\n795,Perrine,Beranek,pberanekm2@vk.com,Female,50.227.71.150,Yiánnouli\n796,Alfonso,Jados,ajadosm3@mozilla.org,Male,90.161.249.121,Merritt\n797,Hali,Dragonette,hdragonettem4@slideshare.net,Female,37.234.6.140,Thị Trấn Cao Phong\n798,Bebe,Mellhuish,bmellhuishm5@psu.edu,Female,158.100.207.244,Matagami\n799,Constantia,Tomaskunas,ctomaskunasm6@friendfeed.com,Female,181.178.161.190,Elias Fausto\n800,Ashley,Wollard,awollardm7@sciencedirect.com,Female,41.71.196.161,Carreira\n801,Aime,Bruckman,abruckmanm8@naver.com,Female,163.55.76.124,Baqiao\n802,Temp,McMearty,tmcmeartym9@lycos.com,Male,129.128.17.101,Porsgrunn\n803,Belita,Kynge,bkyngema@nih.gov,Female,229.198.160.116,Batiano\n804,Irma,Gillford,igillfordmb@fotki.com,Female,188.3.135.88,Yangxi\n805,Mariejeanne,Mound,mmoundmc@soup.io,Female,116.154.104.117,Tissa\n806,Shannah,Daudray,sdaudraymd@cyberchimps.com,Female,219.175.89.132,Tagdanua\n807,Wolfy,Degli Antoni,wdegliantonime@unc.edu,Male,216.94.147.51,Diourbel\n808,Kev,Bagniuk,kbagniukmf@xrea.com,Male,25.239.125.7,Itaqui\n809,Tobi,Doyland,tdoylandmg@friendfeed.com,Female,61.110.75.68,Limeil-Brévannes\n810,Daniela,Crosskell,dcrosskellmh@taobao.com,Female,54.162.5.201,Punkaharju\n811,Hayden,Quade,hquademi@ucoz.com,Male,251.117.159.22,Heishan\n812,Jodee,Kitteman,jkittemanmj@smugmug.com,Female,62.246.68.102,Maslovare\n813,Corina,Lockart,clockartmk@yale.edu,Female,108.130.175.118,Hongtang\n814,Delcina,MacAnelley,dmacanelleyml@nasa.gov,Female,74.150.111.239,Chumpi\n815,Yuma,Tattershall,ytattershallmm@spiegel.de,Male,115.219.51.8,Paris 17\n816,Jonathon,Ipplett,jipplettmn@spotify.com,Male,241.8.118.20,Privlaka\n817,Aura,MacMychem,amacmychemmo@newsvine.com,Female,101.109.194.210,Osias\n818,Pierre,Wortman,pwortmanmp@theguardian.com,Male,227.237.236.201,Město\n819,Lowe,Scini,lscinimq@newsvine.com,Male,200.13.153.137,Langchi\n820,Giustina,Huckabe,ghuckabemr@angelfire.com,Female,34.86.8.191,Uherský Ostroh\n821,Nannie,Harrismith,nharrismithms@naver.com,Female,8.50.169.30,Bayside\n822,Denny,Bowry,dbowrymt@mozilla.com,Male,247.206.123.29,Krajanjugosari\n823,Carney,Maunders,cmaundersmu@tripod.com,Male,177.87.58.168,Segong\n824,Fonsie,de Marco,fdemarcomv@moonfruit.com,Male,209.3.117.173,Sariwŏn\n825,Zelig,Sparrowhawk,zsparrowhawkmw@vimeo.com,Male,108.125.27.193,Kolochava\n826,Irvine,Mill,imillmx@yahoo.co.jp,Male,194.198.63.176,Huangni\n827,Gracie,Dorsett,gdorsettmy@unesco.org,Female,227.246.209.86,Castanhal\n828,Pen,Lundy,plundymz@yandex.ru,Male,97.98.168.26,Richky\n829,Arni,Ducarel,aducareln0@yolasite.com,Male,202.231.146.117,Tatarsk\n830,Carrie,Goding,cgodingn1@businessweek.com,Female,248.231.113.207,Banjarejo\n831,Sonya,Clifft,sclifftn2@businesswire.com,Female,139.46.233.62,Saynshand\n832,Chilton,Josland,cjoslandn3@skyrock.com,Male,14.117.107.33,Prokhladnyy\n833,Melly,Furphy,mfurphyn4@irs.gov,Female,213.13.119.195,Sinfra\n834,Nial,Garcia,ngarcian5@indiegogo.com,Male,88.1.195.231,Mauhao\n835,Nerta,Patrick,npatrickn6@deliciousdays.com,Female,10.180.177.120,Lom Kao\n836,Kissee,Busby,kbusbyn7@fastcompany.com,Female,59.201.190.0,Malhiao\n837,Ellene,Rosenstein,erosensteinn8@geocities.com,Female,134.211.107.212,Baumata\n838,Jessamine,St. Paul,jstpauln9@blogspot.com,Female,62.149.106.75,Manadas\n839,Constantino,Truin,ctruinna@homestead.com,Male,155.91.86.224,San Javier\n840,Anitra,Kopf,akopfnb@prlog.org,Female,6.15.186.20,San Agustin\n841,Sigismund,Barnish,sbarnishnc@twitter.com,Male,170.148.96.127,Izingolweni\n842,Giustina,Dumblton,gdumbltonnd@opensource.org,Female,213.95.197.156,Honglong\n843,Amye,Siely,asielyne@imdb.com,Female,184.41.70.19,Tvøroyri\n844,Chaim,Miche,cmichenf@amazon.co.jp,Male,194.178.94.159,Shicha\n845,Chev,Polson,cpolsonng@shop-pro.jp,Male,240.72.39.247,Wojaszówka\n846,Sherwin,Marriage,smarriagenh@devhub.com,Male,193.127.164.248,Weishan\n847,Babara,Konke,bkonkeni@slate.com,Female,9.101.60.54,Thành Phố Lạng Sơn\n848,Ethelind,Gloster,eglosternj@webmd.com,Female,248.208.128.128,Staromyshastovskaya\n849,Betteann,Tsarovic,btsarovicnk@cnbc.com,Female,102.184.254.222,Pukou\n850,Montague,Devoy,mdevoynl@cloudflare.com,Male,252.207.148.230,Topolná\n851,Sibelle,Godfray,sgodfraynm@google.com.au,Female,178.39.99.237,Hato Mayor del Rey\n852,Flinn,Daspar,fdasparnn@photobucket.com,Male,92.27.245.127,Camiling\n853,Dalis,Caves,dcavesno@businessweek.com,Male,94.250.241.87,Umm as Summāq\n854,Christin,Worters,cwortersnp@lulu.com,Female,241.196.206.241,Erping\n855,Gayel,Goodluck,ggoodlucknq@epa.gov,Female,1.22.117.81,Boulder\n856,Lilli,Skinner,lskinnernr@cnet.com,Female,244.134.85.29,Zhongfang\n857,Norrie,Emmanuele,nemmanuelens@drupal.org,Male,31.115.252.67,Shucheng Chengguanzhen\n858,Stanislaw,McClenan,smcclenannt@theguardian.com,Male,32.61.125.245,Poshnje\n859,Leilah,St. Leger,lstlegernu@ezinearticles.com,Female,149.25.26.223,Pôrto Barra do Ivinheima\n860,Ingemar,Gierok,igieroknv@apache.org,Male,240.195.205.208,Avaré\n861,Winnah,Sprowell,wsprowellnw@wikimedia.org,Female,109.41.167.45,Hägersten\n862,Kim,Boldry,kboldrynx@fc2.com,Male,189.25.153.211,Umm Şalāl ‘Alī\n863,Katrina,Hexam,khexamny@nbcnews.com,Female,34.6.42.148,Bonneuil-sur-Marne\n864,Tucky,Tiley,ttileynz@cam.ac.uk,Male,78.39.156.244,Iowa City\n865,Lanette,Trainor,ltrainoro0@gmpg.org,Female,220.45.69.117,Santa Catalina\n866,Marcia,Custy,mcustyo1@vkontakte.ru,Female,113.87.78.219,Sungai\n867,Obadiah,Delahunt,odelahunto2@naver.com,Male,46.121.247.134,Isiro\n868,Denny,Avrahamy,davrahamyo3@google.nl,Male,41.8.123.31,Melres\n869,Casey,Di Claudio,cdiclaudioo4@hc360.com,Male,155.101.251.95,Fengcheng\n870,Jessie,Willimot,jwillimoto5@google.it,Male,215.123.115.134,Guankou\n871,Hanni,MacInherney,hmacinherneyo6@yolasite.com,Female,190.148.145.104,Solna\n872,Titos,Poppy,tpoppyo7@trellian.com,Male,73.214.200.220,Thaba Nchu\n873,Mariann,Matyugin,mmatyugino8@so-net.ne.jp,Female,47.135.43.114,Duyanggang\n874,Kimble,Kneebone,kkneeboneo9@techcrunch.com,Male,53.1.246.86,Géfyra\n875,Raynell,Tollerfield,rtollerfieldoa@ning.com,Female,236.216.146.71,Mombasa\n876,Annie,Woolford,awoolfordob@yellowbook.com,Female,213.48.2.195,San José de Feliciano\n877,Ryun,Shearwood,rshearwoodoc@nifty.com,Male,176.109.232.157,Trinidad\n878,Martynne,Valerio,mvaleriood@biblegateway.com,Female,213.92.103.233,Calle Blancos\n879,Sherman,Vaulkhard,svaulkhardoe@is.gd,Male,18.111.45.167,Jatipamor\n880,Regina,Pemble,rpembleof@state.gov,Female,110.141.126.66,El Limon\n881,Aggi,Wase,awaseog@java.com,Female,225.252.144.190,Saint-Laurent-du-Var\n882,Yorke,Hurran,yhurranoh@flickr.com,Male,153.15.188.46,Klokot\n883,Miller,Kegley,mkegleyoi@xrea.com,Male,148.159.223.17,Chengzi\n884,Carlos,Kerrich,ckerrichoj@trellian.com,Male,22.107.234.61,Pacho\n885,Lezley,Langshaw,llangshawok@va.gov,Male,88.27.130.178,Trubchevsk\n886,Dewain,Goulborn,dgoulbornol@whitehouse.gov,Male,253.192.28.168,Banyuurip\n887,Jorgan,Kielt,jkieltom@java.com,Male,41.109.237.62,Namayingo\n888,Robinetta,Normabell,rnormabellon@seattletimes.com,Female,50.139.21.226,Zhentian\n889,Webster,Leppington,wleppingtonoo@people.com.cn,Male,156.2.248.20,Abejorral\n890,Ruby,Farnworth,rfarnworthop@printfriendly.com,Male,243.136.26.131,Jibiya\n891,Rozele,Moncarr,rmoncarroq@mayoclinic.com,Female,184.84.91.86,Puro\n892,Lorine,Warrillow,lwarrillowor@geocities.jp,Female,28.247.227.190,Rosario de Mora\n893,Minta,Counihan,mcounihanos@rambler.ru,Female,189.84.194.204,Pingdingshan\n894,Janel,Atkirk,jatkirkot@tinyurl.com,Female,90.253.191.9,Pojok\n895,Adelice,Huckerbe,ahuckerbeou@go.com,Female,28.88.58.224,Lisui\n896,Wendy,Meynell,wmeynellov@joomla.org,Female,239.174.47.190,Bacacay\n897,Iain,Husk,ihuskow@cloudflare.com,Male,238.216.119.34,Nynäshamn\n898,Antonia,Tarbet,atarbetox@pbs.org,Female,9.147.222.67,Conchucos\n899,Cooper,Cloney,ccloneyoy@shutterfly.com,Male,46.231.126.147,Gangjia\n900,Lizzy,Spittles,lspittlesoz@deviantart.com,Female,121.26.88.99,Aleshtar\n901,Bryana,Champ,bchampp0@sitemeter.com,Female,67.3.190.175,Cañas\n902,Georgi,Bleas,gbleasp1@joomla.org,Male,180.237.183.73,Corona\n903,Fonsie,Bonehill,fbonehillp2@prnewswire.com,Male,127.18.219.128,Aparecida de Goiânia\n904,Phil,Tsarovic,ptsarovicp3@mayoclinic.com,Male,22.118.239.142,Montbrison\n905,Delores,Fenwick,dfenwickp4@economist.com,Female,92.122.47.32,Willowdale\n906,Clarisse,Tilmouth,ctilmouthp5@jimdo.com,Female,36.142.119.155,Santo Domingo\n907,Abbott,Caustic,acausticp6@tripod.com,Male,66.216.37.43,San Antonio\n908,Martyn,Basil,mbasilp7@altervista.org,Male,153.207.122.182,Qulaybīyah\n909,Orly,Feirn,ofeirnp8@aol.com,Female,195.14.219.176,La Unión\n910,Gabriell,Winsborrow,gwinsborrowp9@theguardian.com,Female,219.46.54.149,Zhulebino\n911,Noreen,Glidder,nglidderpa@oracle.com,Female,156.6.62.215,Bestovje\n912,Dorelle,Thwaites,dthwaitespb@ning.com,Female,213.221.81.3,Lākshām\n913,Ted,Tatersale,ttatersalepc@cam.ac.uk,Female,74.37.252.220,Mangai\n914,Delinda,Kiebes,dkiebespd@blog.com,Female,141.78.98.191,Agdangan\n915,Desirae,Clemmey,dclemmeype@linkedin.com,Female,169.207.99.224,Öndörhoshuu\n916,Carly,Suston,csustonpf@blogger.com,Female,203.229.183.134,Gia Nghĩa\n917,Fleming,Colls,fcollspg@prlog.org,Male,164.205.149.251,Pallisa\n918,Terrijo,Hemeret,themeretph@issuu.com,Female,229.138.7.102,Ueda\n919,Kane,Betser,kbetserpi@usatoday.com,Male,64.78.140.248,Shyroke\n920,Abner,Dalligan,adalliganpj@guardian.co.uk,Male,51.81.70.32,Tirat Karmel\n921,Jolie,Brightie,jbrightiepk@desdev.cn,Female,1.191.102.176,Bodega\n922,Hastings,Lockett,hlockettpl@wsj.com,Male,45.253.12.252,Bořetice\n923,Duffie,Andreou,dandreoupm@wsj.com,Male,215.156.77.91,Xiangdong\n924,Darryl,Bletsor,dbletsorpn@weather.com,Female,163.74.93.186,Chandler\n925,Loise,Shortt,lshorttpo@joomla.org,Female,80.184.52.165,Iitti\n926,Gian,Di Biagi,gdibiagipp@baidu.com,Male,151.228.234.104,Centralniy\n927,Dallas,Rowantree,drowantreepq@chicagotribune.com,Male,139.124.28.107,Tsagaanders\n928,Trevar,Monnoyer,tmonnoyerpr@ucla.edu,Male,78.124.237.246,Vũ Quang\n929,Lorilyn,Panner,lpannerps@phoca.cz,Female,208.191.191.56,Wenwucao\n930,Felipa,McKaile,fmckailept@webs.com,Female,180.173.193.151,Maciejowice\n931,Tiffanie,Ravel,travelpu@webmd.com,Female,253.132.174.99,Kamen\n932,Leroy,Moizer,lmoizerpv@dagondesign.com,Male,46.118.7.28,Rosh Pinna\n933,Addy,Bleesing,ableesingpw@uiuc.edu,Female,163.93.53.132,Lahad Datu\n934,Dewie,Howton,dhowtonpx@yahoo.co.jp,Male,148.153.244.46,Qingyun\n935,Dianne,Esposita,despositapy@tuttocitta.it,Female,185.95.191.231,Timiryazevskoye\n936,Verney,Legging,vleggingpz@alexa.com,Male,218.122.32.215,Lampitak\n937,Kaitlyn,Inge,kingeq0@w3.org,Female,108.54.75.241,Pashiya\n938,Erwin,Hobson,ehobsonq1@simplemachines.org,Male,103.109.115.90,Kimméria\n939,Aarika,Eeles,aeelesq2@example.com,Female,15.196.17.238,Dawuhanmangli\n940,Aurora,Stockdale,astockdaleq3@blogger.com,Female,176.117.120.141,Banzão\n941,Catherina,Toner,ctonerq4@clickbank.net,Female,44.181.238.45,Nguigmi\n942,Claiborne,Yanyushkin,cyanyushkinq5@mozilla.com,Male,129.14.187.176,Sozopol\n943,Kass,O' Concannon,koconcannonq6@pen.io,Female,69.201.225.40,Arīḩā\n944,Carolina,Daddow,cdaddowq7@flickr.com,Female,11.173.186.246,Quilmaná\n945,Aaron,Antonsen,aantonsenq8@whitehouse.gov,Male,0.192.253.81,Białobrzegi\n946,Paton,Cahalin,pcahalinq9@moonfruit.com,Male,163.204.186.228,Sankera\n947,Angie,Spyby,aspybyqa@twitpic.com,Female,148.42.190.129,Baku\n948,Karlan,Woolgar,kwoolgarqb@examiner.com,Male,141.226.155.201,Birinci Aşıqlı\n949,Walsh,Pranger,wprangerqc@ca.gov,Male,83.61.226.154,Sulkava\n950,Jacqueline,Yglesia,jyglesiaqd@devhub.com,Female,157.218.152.72,Älvsbyn\n951,Parnell,Kinloch,pkinlochqe@reference.com,Male,60.122.1.119,Rožďalovice\n952,Shena,Townshend,stownshendqf@livejournal.com,Female,53.15.203.106,Yong’an\n953,Kelli,Nunn,knunnqg@yellowbook.com,Female,6.243.78.148,St. Catharines\n954,Minda,Treves,mtrevesqh@cyberchimps.com,Female,179.198.30.20,Kurzętnik\n955,Perren,Riglar,priglarqi@princeton.edu,Male,179.9.112.226,Cikou\n956,Shurlock,Rubanenko,srubanenkoqj@narod.ru,Male,124.177.68.255,Jishi\n957,Karlik,Anan,kananqk@bigcartel.com,Male,211.80.3.156,Shiqian\n958,Mayne,Wall,mwallql@who.int,Male,92.159.108.202,Mulandoro\n959,Catherin,Winger,cwingerqm@infoseek.co.jp,Female,81.207.80.151,Huangduobu\n960,Sioux,Smillie,ssmillieqn@so-net.ne.jp,Female,106.42.217.238,Nomhon\n961,Tobin,Grice,tgriceqo@elegantthemes.com,Male,119.60.73.193,Lokoja\n962,Hercules,Curneen,hcurneenqp@hostgator.com,Male,61.81.42.7,Richmond\n963,Darcie,Hubeaux,dhubeauxqq@twitpic.com,Female,252.254.215.180,Loureiro\n964,Ellyn,Zwicker,ezwickerqr@ucla.edu,Female,34.181.10.155,Toguchin\n965,Davide,Marrow,dmarrowqs@e-recht24.de,Male,207.35.57.112,Vermil\n966,Finley,Riolfi,friolfiqt@macromedia.com,Male,114.211.141.200,Vällingby\n967,Rosemonde,Ilyukhov,rilyukhovqu@jigsy.com,Female,32.4.241.83,Namangan Shahri\n968,Marten,McKall,mmckallqv@odnoklassniki.ru,Male,28.86.37.196,San Esteban\n969,Crista,Portinari,cportinariqw@parallels.com,Female,84.136.203.101,Sepanjang\n970,Torrence,Havoc,thavocqx@japanpost.jp,Male,142.112.110.51,Chejiazhuang\n971,Rici,Jocic,rjocicqy@odnoklassniki.ru,Female,146.91.187.253,Dřevohostice\n972,Tad,O'Loughnan,toloughnanqz@bloglines.com,Male,137.55.77.161,Karanglincak\n973,Danyelle,Aslet,dasletr0@t.co,Female,220.234.69.142,Gjinoc\n974,Wallas,Sabberton,wsabbertonr1@cocolog-nifty.com,Male,242.214.215.62,Suqu\n975,Genevra,Berkery,gberkeryr2@last.fm,Female,108.162.138.106,Oum Hadjer\n976,Roarke,Berthe,rberther3@omniture.com,Male,208.101.213.119,Mae Fa Luang\n977,Ryan,Searson,rsearsonr4@rambler.ru,Male,67.91.243.143,Pyatigorsk\n978,Kerri,Polson,kpolsonr5@chron.com,Female,10.16.140.78,Öldziyt\n979,Allister,Grigorini,agrigorinir6@bloglines.com,Male,178.196.171.156,Pato Branco\n980,Terese,Thoumasson,tthoumassonr7@bloglines.com,Female,1.187.193.193,Nōgata\n981,Franklyn,Ickovitz,fickovitzr8@oakley.com,Male,190.129.63.145,Conceição das Alagoas\n982,Byrom,Trye,btryer9@parallels.com,Male,253.197.119.102,Almada\n983,Hamlin,Shearston,hshearstonra@clickbank.net,Male,209.133.239.108,Potosí\n984,Patrizia,Drew-Clifton,pdrewcliftonrb@nsw.gov.au,Female,109.103.70.24,Guariba\n985,Thane,Kindell,tkindellrc@amazonaws.com,Male,71.199.121.133,Mengcheng Chengguanzhen\n986,Basile,Speerman,bspeermanrd@blogger.com,Male,163.71.220.229,Tiecun\n987,Jamison,Line,jlinere@pinterest.com,Male,100.52.196.187,Oklahoma City\n988,Ev,Tremathack,etremathackrf@github.io,Male,121.180.48.101,Xinzha\n989,Care,Gladdis,cgladdisrg@hp.com,Male,121.8.176.32,Leles\n990,Gerrie,Nilles,gnillesrh@usgs.gov,Female,157.132.4.185,Sherwood Park\n991,Bat,Tomczynski,btomczynskiri@toplist.cz,Male,138.39.70.190,‘Arīqah\n992,Bernelle,Sheavills,bsheavillsrj@biblegateway.com,Female,149.217.194.24,Thanatpin\n993,Alvera,Marvelley,amarvelleyrk@miibeian.gov.cn,Female,8.87.243.103,Kleszczewo\n994,Lothaire,Luxford,lluxfordrl@redcross.org,Male,65.32.26.102,Si Racha\n995,Glynn,Wakerley,gwakerleyrm@disqus.com,Male,10.67.24.104,Rennes\n996,Parrnell,Jeff,pjeffrn@4shared.com,Male,159.55.55.39,Dengok\n997,Pat,Warstall,pwarstallro@dropbox.com,Male,169.200.7.131,Rosário do Sul\n998,Willyt,Vannuccini,wvannuccinirp@tuttocitta.it,Female,156.149.18.155,Xiaopingba\n999,Gaelan,Petrashkov,gpetrashkovrq@hostgator.com,Male,219.109.169.75,Bethlehem\n1000,Stirling,Francesc,sfrancescrr@cyberchimps.com,Male,108.193.9.206,Potok Złoty\n"
  },
  {
    "path": "15-PDFs-and-Spreadsheets/makeup_new.csv",
    "content": "col1,col2,col3\n1,2,3\n4,5,6\n7,8,9\n"
  },
  {
    "path": "15-PDFs-and-Spreadsheets/to_save_file.csv",
    "content": "a,b,c\n1,2,3\n4,5,6\n1,2,3\n"
  },
  {
    "path": "16-Emailing-with-Python/.ipynb_checkpoints/00-Overview-of-Sending-Emails-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Overview of Sending Emails\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The smtplib library allows you to manually go through the steps of creating and sending an email in Python:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import smtplib\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Create an SMTP object for a server. Here are the main Server Domain Name for the top email services. If you don't see your email server here, you may need to do a quick Google Search to see if there SMTP server domain name is available:\\n\",\n    \"\\n\",\n    \"<table>\\n\",\n    \"\\n\",\n    \"<tr>\\n\",\n    \"    <th>Provider</th>\\n\",\n    \"    <th>SMTP server domain name </th>    \\n\",\n    \"</tr>\\n\",\n    \"\\n\",\n    \"<tr>\\n\",\n    \"    <td>Gmail (will need App Password)</td>\\n\",\n    \"    <td>smtp.gmail.com</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"    <td>Yahoo Mail</td>\\n\",\n    \"    <td>smtp.mail.yahoo.com</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"    <td>Outlook.com/Hotmail.com</td>\\n\",\n    \"    <td>smtp-mail.outlook.com</td>\\n\",\n    \"    \\n\",\n    \"</tr>\\n\",\n    \"\\n\",\n    \"<tr>\\n\",\n    \"    <td>AT&T</td>\\n\",\n    \"    <td>smpt.mail.att.net (Use port 465)</td>\\n\",\n    \"</tr>\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"<tr>\\n\",\n    \"    <td>Verizon</td>\\n\",\n    \"    <td>smtp.verizon.net (Use port 465) </td>\\n\",\n    \"</tr>\\n\",\n    \"\\n\",\n    \"<tr>\\n\",\n    \"    <td>Comcast</td>\\n\",\n    \"    <td>smtp.comcast.net</td>\\n\",\n    \"</tr>\\n\",\n    \"\\n\",\n    \"</table>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Next is to create an STMP object that can make the method calls to log you in to your email in order to send messages. Notice how also specify a port number. If the number 587 does not work on your computer, try using 465 instead. Keep in mind, a firewall or antivirus may prevent Python from opening up this port, so you may need to disable it on your computer.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"smtp_object = smtplib.SMTP('smtp.gmail.com',587)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Next we run the ehlo() command which \\\"greets\\\" the server and establishes the connection. This method call should be done directly after creating the object. Calling it after other methods may result in errors in connecting later on. The first item in the tuple that is returned should be 250, indicating a successful connection.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(250,\\n\",\n       \" b'smtp.gmail.com at your service, [47.143.81.4]\\\\nSIZE 35882577\\\\n8BITMIME\\\\nSTARTTLS\\\\nENHANCEDSTATUSCODES\\\\nPIPELINING\\\\nCHUNKING\\\\nSMTPUTF8')\"\n      ]\n     },\n     \"execution_count\": 36,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"smtp_object.ehlo()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"When using the 587 port, this means you are using TLS encryption, which you need to initiate by running the starttls() command. If you are using port 465, this means you are using SSL and you can skip this step.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(220, b'2.0.0 Ready to start TLS')\"\n      ]\n     },\n     \"execution_count\": 37,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"smtp_object.starttls()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now its time to set up the email and the passwords. You should never save the raw string of your password or email in a script, because anyone that sees this script will then be able to see you email and password! Instead you should use input() to get that information. If you also don't want your password to be visible when typing it in, you can use the built-in **getpass** library that will hide your password as you type it in, either with asterisks or by just keeping it invisible.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 38,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# For hidden passwords\\n\",\n    \"import getpass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Type something here and it will be hidden: ········\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"result = getpass.getpass(\\\"Type something here and it will be hidden: \\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 40,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'a'\"\n      ]\n     },\n     \"execution_count\": 40,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Just keep in mind that its still visible as an object internally:\\n\",\n    \"result\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Enter your passwords\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'s'\"\n      ]\n     },\n     \"execution_count\": 41,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Or just use input()\\n\",\n    \"input(\\\"Enter your password\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Note for Gmail Users, you need to generate an app password instead of your normal email password. This also requires enabling 2-step authentication. Follow the instructions here to set-up 2-Step Factor Authentication as well as App Password Generation:https://support.google.com/accounts/answer/185833?hl=en/. Set-up 2 Factor Authentication, then create the App Password, choose Mail as the App and give it any name you want. This will output a 16 letter password for you. Pass in this password as your login password for the smtp.**\\n\",\n    \"____\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"email = getpass.getpass(\\\"Enter your email: \\\")\\n\",\n    \"password = getpass.getpass(\\\"Enter your password: \\\")\\n\",\n    \"smtp_object.login(email,password)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we can send an email using the .sendmail() method.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 46,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Enter your email: ········\\n\",\n      \"Enter the email of the recipient: ········\\n\",\n      \"Enter the subject line: This is a test\\n\",\n      \"Type out the message you want to send: Here is the message.\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{}\"\n      ]\n     },\n     \"execution_count\": 46,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"from_address = getpass.getpass(\\\"Enter your email: \\\")\\n\",\n    \"to_address = getpass.getpass(\\\"Enter the email of the recipient: \\\")\\n\",\n    \"subject = input(\\\"Enter the subject line: \\\")\\n\",\n    \"message = input(\\\"Type out the message you want to send: \\\")\\n\",\n    \"msg = \\\"Subject: \\\" + subject + '\\\\n' + message\\n\",\n    \"smtp_object.sendmail(from_address,to_address,msg)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you get back an empty dictionary, then the sending was successful.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can then close your session with the .quit() method.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 47,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(221, b'2.0.0 closing connection j1sm22376227pgq.33 - gsmtp')\"\n      ]\n     },\n     \"execution_count\": 47,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"smtp_object.quit()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now that we know how to send emails, its time to learn how to look through emails you've already recieved.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "16-Emailing-with-Python/.ipynb_checkpoints/01-Overview-of-Received-Emails-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Overview of Received Emails\\n\",\n    \"\\n\",\n    \"Now that we understand how to send emails progammatically with Python, let's explore how we can read and search recieved emails. To do we will use the built-in [imaplib library](https://docs.python.org/3/library/imaplib.html#imap4-example). We will also use the built in [email](https://docs.python.org/3/library/email.examples.html) library for parsing through the recieved emails.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import imaplib\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"M = imaplib.IMAP4_SSL('imap.gmail.com')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import getpass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"user = input(\\\"Enter your email: \\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Enter your password: ········\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Remember , you may need an app password if you are a gmail user\\n\",\n    \"# \\n\",\n    \"password = getpass.getpass(\\\"Enter your password: \\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"M.login(user,password)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"('OK',\\n\",\n       \" [b'(\\\\\\\\HasNoChildren) \\\"/\\\" \\\"INBOX\\\"',\\n\",\n       \"  b'(\\\\\\\\HasNoChildren) \\\"/\\\" \\\"Personal\\\"',\\n\",\n       \"  b'(\\\\\\\\HasNoChildren) \\\"/\\\" \\\"Receipts\\\"',\\n\",\n       \"  b'(\\\\\\\\HasNoChildren) \\\"/\\\" \\\"Sent\\\"',\\n\",\n       \"  b'(\\\\\\\\HasNoChildren) \\\"/\\\" \\\"Trash\\\"',\\n\",\n       \"  b'(\\\\\\\\HasNoChildren) \\\"/\\\" \\\"Travel\\\"',\\n\",\n       \"  b'(\\\\\\\\HasNoChildren) \\\"/\\\" \\\"Work\\\"',\\n\",\n       \"  b'(\\\\\\\\HasChildren \\\\\\\\Noselect) \\\"/\\\" \\\"[Gmail]\\\"',\\n\",\n       \"  b'(\\\\\\\\All \\\\\\\\HasNoChildren) \\\"/\\\" \\\"[Gmail]/All Mail\\\"',\\n\",\n       \"  b'(\\\\\\\\Drafts \\\\\\\\HasNoChildren) \\\"/\\\" \\\"[Gmail]/Drafts\\\"',\\n\",\n       \"  b'(\\\\\\\\HasNoChildren \\\\\\\\Important) \\\"/\\\" \\\"[Gmail]/Important\\\"',\\n\",\n       \"  b'(\\\\\\\\HasNoChildren \\\\\\\\Sent) \\\"/\\\" \\\"[Gmail]/Sent Mail\\\"',\\n\",\n       \"  b'(\\\\\\\\HasNoChildren \\\\\\\\Junk) \\\"/\\\" \\\"[Gmail]/Spam\\\"',\\n\",\n       \"  b'(\\\\\\\\Flagged \\\\\\\\HasNoChildren) \\\"/\\\" \\\"[Gmail]/Starred\\\"',\\n\",\n       \"  b'(\\\\\\\\HasNoChildren \\\\\\\\Trash) \\\"/\\\" \\\"[Gmail]/Trash\\\"'])\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"M.list()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"('OK', [b'28297'])\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Connect to your inbox\\n\",\n    \"M.select(\\\"inbox\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Searching Mail\\n\",\n    \"\\n\",\n    \"Now that we have connected to our mail, we should be able to search for it using the specialized syntax of IMAP. Here are the different search keys you can use:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<table border='1' >\\n\",\n    \"    <tr >\\n\",\n    \"        <th align='center'>Keyword </th>\\n\",\n    \"        <th align='center'>Definition</th>\\n\",\n    \"    </tr>\\n\",\n    \"    <tr>\\n\",\n    \"        <td>'ALL'</td>\\n\",\n    \"        <td>\\n\",\n    \"        Returns all messages in your email folder. Often there are size limits from imaplib.\\n\",\n    \"        To change these use imaplib._MAXLINE = 100 , where 100 is whatever you want the limit to be.\\n\",\n    \"        </td>\\n\",\n    \"    </tr>\\n\",\n    \"    \\n\",\n    \"    <tr>\\n\",\n    \"        <td>'BEFORE date'</td>\\n\",\n    \"        <td>\\n\",\n    \"        Returns all messages before the date. Date must be formatted as 01-Nov-2000.\\n\",\n    \"        </td>\\n\",\n    \"    </tr>\\n\",\n    \"    \\n\",\n    \"     <tr>\\n\",\n    \"        <td>'ON date'</td>\\n\",\n    \"        <td>\\n\",\n    \"        Returns all messages on the date. Date must be formatted as 01-Nov-2000.\\n\",\n    \"        </td>\\n\",\n    \"    </tr>\\n\",\n    \"    \\n\",\n    \"     <tr>\\n\",\n    \"        <td>'SINCE date'</td>\\n\",\n    \"        <td>\\n\",\n    \"        Returns all messages after the date. Date must be formatted as 01-Nov-2000.\\n\",\n    \"        </td>\\n\",\n    \"    </tr>\\n\",\n    \"    \\n\",\n    \"    <tr>\\n\",\n    \"        <td>'FROM some_string '</td>\\n\",\n    \"        <td>\\n\",\n    \"        Returns all from the sender in the string. String can be an email, for example 'FROM               user@example.com' or just a string that may appear in the email, \\\"FROM example\\\"\\n\",\n    \"        </td>\\n\",\n    \"    </tr>\\n\",\n    \"    \\n\",\n    \"    <tr>\\n\",\n    \"        <td>'TO some_string'</td>\\n\",\n    \"        <td>\\n\",\n    \"        Returns all outgoing email to the email in the string. String can be an email, for example 'FROM user@example.com' or just a string that may appear in the email, \\\"FROM example\\\"\\n\",\n    \"        </td>\\n\",\n    \"    </tr>\\n\",\n    \"    \\n\",\n    \"    <tr>\\n\",\n    \"        <td>'CC some_string' and/or 'BCC some_string'</td>\\n\",\n    \"        <td>\\n\",\n    \"        Returns all messages in your email folder. Often there are size limits from imaplib.\\n\",\n    \"        To change these use imaplib._MAXLINE = 100 , where 100 is whatever you want the limit to be.\\n\",\n    \"        </td>\\n\",\n    \"    </tr>\\n\",\n    \"    \\n\",\n    \"    <tr>\\n\",\n    \"        <td>'SUBJECT string','BODY string','TEXT \\\"string with spaces\\\"'</td>\\n\",\n    \"        <td>\\n\",\n    \"        Returns all messages with the subject string or the string in the body of the email. If the string you are searching for has spaces in it, wrap it in double quotes.\\n\",\n    \"        </td>\\n\",\n    \"    </tr>\\n\",\n    \"    \\n\",\n    \"    <tr>\\n\",\n    \"        <td>'SEEN', 'UNSEEN'</td>\\n\",\n    \"        <td>\\n\",\n    \"        Returns all messages that have been seen or unseen. (Also known as read or unread)\\n\",\n    \"        </td>\\n\",\n    \"    </tr>\\n\",\n    \"    \\n\",\n    \"    \\n\",\n    \"        <tr>\\n\",\n    \"        <td>'ANSWERED', 'UNANSWERED'</td>\\n\",\n    \"        <td>\\n\",\n    \"        Returns all messages that have been replied to or unreplied to. \\n\",\n    \"        </td>\\n\",\n    \"    </tr>\\n\",\n    \"    \\n\",\n    \"    \\n\",\n    \"        <tr>\\n\",\n    \"        <td>'DELETED', 'UNDELETED'</td>\\n\",\n    \"        <td>\\n\",\n    \"        Returns all messages that have been deleted or that have not been deleted.\\n\",\n    \"        </td>\\n\",\n    \"    </tr>\\n\",\n    \"    \\n\",\n    \"    \\n\",\n    \"</table>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can also use the logical operators AND and OR to combine the above statements. Check out the full list of search keys here: http://www.4d.com/docs/CMU/CMU88864.HTM.\\n\",\n    \"\\n\",\n    \"Please note that some IMAP server providers for different email services will have slightly different syntax. You may need to experiment to get the results you want.\\n\",\n    \"\\n\",\n    \"___________\\n\",\n    \"___________\\n\",\n    \"\\n\",\n    \"Now we can search our mail for any term we want.  \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Use if you get an error saying limit was reached\\n\",\n    \"imaplib._MAXLINE = 10000000\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Send yourself a test email with the subject line:\\n\",\n    \"\\n\",\n    \"    this is a test email for python\\n\",\n    \"\\n\",\n    \"Or some other uniquely identifying string.    \\n\",\n    \"\\n\",\n    \"We will now need to reconnect to our imap server. You will probably need to restart your kernel for this step if you are using jupyter notebook.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Restart your kernel and run the following:\\n\",\n    \"import imaplib\\n\",\n    \"import getpass\\n\",\n    \"M = imaplib.IMAP4_SSL('imap.gmail.com')\\n\",\n    \"user = input(\\\"Enter your email: \\\")\\n\",\n    \"password = getpass.getpass(\\\"Enter your password: \\\")\\n\",\n    \"M.login(user,password)\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"('OK', [b'28299'])\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Connect to your inbox\\n\",\n    \"M.select(\\\"inbox\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's now search and confirm if it is there:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 105,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"typ ,data = M.search(None,'SUBJECT \\\"this is a test email for python\\\"')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"We can now save what it has returned:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 106,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'OK'\"\n      ]\n     },\n     \"execution_count\": 106,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"typ\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 107,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[b'28298']\"\n      ]\n     },\n     \"execution_count\": 107,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"data\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The data will be a list of unique ids.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 108,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"\\n\",\n    \"# typ, data = M.fetch(data[0],\\\"(RFC822)\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 112,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"result, email_data = M.fetch(data[0],\\\"(RFC822)\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 113,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"raw_email = email_data[0][1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 116,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"raw_email_string = raw_email.decode('utf-8')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can use the built in email library to help parse this raw string.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 120,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import email\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 121,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"email_message = email.message_from_string(raw_email_string)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 125,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"b'This is a test to see if the python search worked.\\\\r\\\\n'\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for part in email_message.walk():\\n\",\n    \"    if part.get_content_type() == \\\"text/plain\\\":\\n\",\n    \"        body = part.get_payload(decode=True)\\n\",\n    \"        print(body)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Excellent! We've successfully have been able to check our email's inbox , filter by some condition, and read the body of the text that was there. This will come in handy in the near future!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "16-Emailing-with-Python/.ipynb_checkpoints/02-Exercise-Ideas-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Python Email Exercise Ideas\\n\",\n    \"\\n\",\n    \"Since we can't really assess any code that would involve your personal email address, here are some ideas for you to test your new skills. Please keep in mind, we can not assess these.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"\\n\",\n    \"## Ideas\\n\",\n    \"\\n\",\n    \"* Daily Automatic Email Reminder for your Tasks\\n\",\n    \"* Webscrape some statistics from a website automatically each day and email them to yourself\\n\",\n    \"* Automatically email daily/weekly/monthly reports at your work\\n\",\n    \"* Have end of day messages to your friends and family be sent out at random to spread joy\\n\",\n    \"* Be creative! Mix together any of the skills you've learned so far with email :)\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "16-Emailing-with-Python/00-Overview-of-Sending-Emails.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Overview of Sending Emails\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The smtplib library allows you to manually go through the steps of creating and sending an email in Python:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import smtplib\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Create an SMTP object for a server. Here are the main Server Domain Name for the top email services. If you don't see your email server here, you may need to do a quick Google Search to see if there SMTP server domain name is available:\\n\",\n    \"\\n\",\n    \"<table>\\n\",\n    \"\\n\",\n    \"<tr>\\n\",\n    \"    <th>Provider</th>\\n\",\n    \"    <th>SMTP server domain name </th>    \\n\",\n    \"</tr>\\n\",\n    \"\\n\",\n    \"<tr>\\n\",\n    \"    <td>Gmail (will need App Password)</td>\\n\",\n    \"    <td>smtp.gmail.com</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"    <td>Yahoo Mail</td>\\n\",\n    \"    <td>smtp.mail.yahoo.com</td>\\n\",\n    \"</tr>\\n\",\n    \"<tr>\\n\",\n    \"    <td>Outlook.com/Hotmail.com</td>\\n\",\n    \"    <td>smtp-mail.outlook.com</td>\\n\",\n    \"    \\n\",\n    \"</tr>\\n\",\n    \"\\n\",\n    \"<tr>\\n\",\n    \"    <td>AT&T</td>\\n\",\n    \"    <td>smpt.mail.att.net (Use port 465)</td>\\n\",\n    \"</tr>\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"<tr>\\n\",\n    \"    <td>Verizon</td>\\n\",\n    \"    <td>smtp.verizon.net (Use port 465) </td>\\n\",\n    \"</tr>\\n\",\n    \"\\n\",\n    \"<tr>\\n\",\n    \"    <td>Comcast</td>\\n\",\n    \"    <td>smtp.comcast.net</td>\\n\",\n    \"</tr>\\n\",\n    \"\\n\",\n    \"</table>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Next is to create an STMP object that can make the method calls to log you in to your email in order to send messages. Notice how also specify a port number. If the number 587 does not work on your computer, try using 465 instead. Keep in mind, a firewall or antivirus may prevent Python from opening up this port, so you may need to disable it on your computer.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"smtp_object = smtplib.SMTP('smtp.gmail.com',587)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Next we run the ehlo() command which \\\"greets\\\" the server and establishes the connection. This method call should be done directly after creating the object. Calling it after other methods may result in errors in connecting later on. The first item in the tuple that is returned should be 250, indicating a successful connection.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(250,\\n\",\n       \" b'smtp.gmail.com at your service, [47.143.81.4]\\\\nSIZE 35882577\\\\n8BITMIME\\\\nSTARTTLS\\\\nENHANCEDSTATUSCODES\\\\nPIPELINING\\\\nCHUNKING\\\\nSMTPUTF8')\"\n      ]\n     },\n     \"execution_count\": 36,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"smtp_object.ehlo()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"When using the 587 port, this means you are using TLS encryption, which you need to initiate by running the starttls() command. If you are using port 465, this means you are using SSL and you can skip this step.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(220, b'2.0.0 Ready to start TLS')\"\n      ]\n     },\n     \"execution_count\": 37,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"smtp_object.starttls()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now its time to set up the email and the passwords. You should never save the raw string of your password or email in a script, because anyone that sees this script will then be able to see you email and password! Instead you should use input() to get that information. If you also don't want your password to be visible when typing it in, you can use the built-in **getpass** library that will hide your password as you type it in, either with asterisks or by just keeping it invisible.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 38,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# For hidden passwords\\n\",\n    \"import getpass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Type something here and it will be hidden: ········\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"result = getpass.getpass(\\\"Type something here and it will be hidden: \\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 40,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'a'\"\n      ]\n     },\n     \"execution_count\": 40,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Just keep in mind that its still visible as an object internally:\\n\",\n    \"result\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 41,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Enter your passwords\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'s'\"\n      ]\n     },\n     \"execution_count\": 41,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Or just use input()\\n\",\n    \"input(\\\"Enter your password\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"____\\n\",\n    \"**Note for Gmail Users, you need to generate an app password instead of your normal email password. This also requires enabling 2-step authentication. Follow the instructions here to set-up 2-Step Factor Authentication as well as App Password Generation:https://support.google.com/accounts/answer/185833?hl=en/. Set-up 2 Factor Authentication, then create the App Password, choose Mail as the App and give it any name you want. This will output a 16 letter password for you. Pass in this password as your login password for the smtp.**\\n\",\n    \"____\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"email = getpass.getpass(\\\"Enter your email: \\\")\\n\",\n    \"password = getpass.getpass(\\\"Enter your password: \\\")\\n\",\n    \"smtp_object.login(email,password)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we can send an email using the .sendmail() method.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 46,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Enter your email: ········\\n\",\n      \"Enter the email of the recipient: ········\\n\",\n      \"Enter the subject line: This is a test\\n\",\n      \"Type out the message you want to send: Here is the message.\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{}\"\n      ]\n     },\n     \"execution_count\": 46,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"from_address = getpass.getpass(\\\"Enter your email: \\\")\\n\",\n    \"to_address = getpass.getpass(\\\"Enter the email of the recipient: \\\")\\n\",\n    \"subject = input(\\\"Enter the subject line: \\\")\\n\",\n    \"message = input(\\\"Type out the message you want to send: \\\")\\n\",\n    \"msg = \\\"Subject: \\\" + subject + '\\\\n' + message\\n\",\n    \"smtp_object.sendmail(from_address,to_address,msg)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you get back an empty dictionary, then the sending was successful.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can then close your session with the .quit() method.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 47,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(221, b'2.0.0 closing connection j1sm22376227pgq.33 - gsmtp')\"\n      ]\n     },\n     \"execution_count\": 47,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"smtp_object.quit()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now that we know how to send emails, its time to learn how to look through emails you've already recieved.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "16-Emailing-with-Python/01-Overview-of-Received-Emails.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Overview of Received Emails\\n\",\n    \"\\n\",\n    \"Now that we understand how to send emails progammatically with Python, let's explore how we can read and search recieved emails. To do we will use the built-in [imaplib library](https://docs.python.org/3/library/imaplib.html#imap4-example). We will also use the built in [email](https://docs.python.org/3/library/email.examples.html) library for parsing through the recieved emails.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import imaplib\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"M = imaplib.IMAP4_SSL('imap.gmail.com')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import getpass\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"user = input(\\\"Enter your email: \\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Enter your password: ········\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Remember , you may need an app password if you are a gmail user\\n\",\n    \"# \\n\",\n    \"password = getpass.getpass(\\\"Enter your password: \\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"M.login(user,password)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"('OK',\\n\",\n       \" [b'(\\\\\\\\HasNoChildren) \\\"/\\\" \\\"INBOX\\\"',\\n\",\n       \"  b'(\\\\\\\\HasNoChildren) \\\"/\\\" \\\"Personal\\\"',\\n\",\n       \"  b'(\\\\\\\\HasNoChildren) \\\"/\\\" \\\"Receipts\\\"',\\n\",\n       \"  b'(\\\\\\\\HasNoChildren) \\\"/\\\" \\\"Sent\\\"',\\n\",\n       \"  b'(\\\\\\\\HasNoChildren) \\\"/\\\" \\\"Trash\\\"',\\n\",\n       \"  b'(\\\\\\\\HasNoChildren) \\\"/\\\" \\\"Travel\\\"',\\n\",\n       \"  b'(\\\\\\\\HasNoChildren) \\\"/\\\" \\\"Work\\\"',\\n\",\n       \"  b'(\\\\\\\\HasChildren \\\\\\\\Noselect) \\\"/\\\" \\\"[Gmail]\\\"',\\n\",\n       \"  b'(\\\\\\\\All \\\\\\\\HasNoChildren) \\\"/\\\" \\\"[Gmail]/All Mail\\\"',\\n\",\n       \"  b'(\\\\\\\\Drafts \\\\\\\\HasNoChildren) \\\"/\\\" \\\"[Gmail]/Drafts\\\"',\\n\",\n       \"  b'(\\\\\\\\HasNoChildren \\\\\\\\Important) \\\"/\\\" \\\"[Gmail]/Important\\\"',\\n\",\n       \"  b'(\\\\\\\\HasNoChildren \\\\\\\\Sent) \\\"/\\\" \\\"[Gmail]/Sent Mail\\\"',\\n\",\n       \"  b'(\\\\\\\\HasNoChildren \\\\\\\\Junk) \\\"/\\\" \\\"[Gmail]/Spam\\\"',\\n\",\n       \"  b'(\\\\\\\\Flagged \\\\\\\\HasNoChildren) \\\"/\\\" \\\"[Gmail]/Starred\\\"',\\n\",\n       \"  b'(\\\\\\\\HasNoChildren \\\\\\\\Trash) \\\"/\\\" \\\"[Gmail]/Trash\\\"'])\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"M.list()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"('OK', [b'28297'])\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Connect to your inbox\\n\",\n    \"M.select(\\\"inbox\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Searching Mail\\n\",\n    \"\\n\",\n    \"Now that we have connected to our mail, we should be able to search for it using the specialized syntax of IMAP. Here are the different search keys you can use:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<table border='1' >\\n\",\n    \"    <tr >\\n\",\n    \"        <th align='center'>Keyword </th>\\n\",\n    \"        <th align='center'>Definition</th>\\n\",\n    \"    </tr>\\n\",\n    \"    <tr>\\n\",\n    \"        <td>'ALL'</td>\\n\",\n    \"        <td>\\n\",\n    \"        Returns all messages in your email folder. Often there are size limits from imaplib.\\n\",\n    \"        To change these use imaplib._MAXLINE = 100 , where 100 is whatever you want the limit to be.\\n\",\n    \"        </td>\\n\",\n    \"    </tr>\\n\",\n    \"    <tr>\\n\",\n    \"        <td>'BEFORE date'</td>\\n\",\n    \"        <td>\\n\",\n    \"        Returns all messages before the date. Date must be formatted as 01-Nov-2000.\\n\",\n    \"        </td>\\n\",\n    \"    </tr>\\n\",\n    \"     <tr>\\n\",\n    \"        <td>'ON date'</td>\\n\",\n    \"        <td>\\n\",\n    \"        Returns all messages on the date. Date must be formatted as 01-Nov-2000.\\n\",\n    \"        </td>\\n\",\n    \"    </tr>\\n\",\n    \"     <tr>\\n\",\n    \"        <td>'SINCE date'</td>\\n\",\n    \"        <td>\\n\",\n    \"        Returns all messages after the date. Date must be formatted as 01-Nov-2000.\\n\",\n    \"        </td>\\n\",\n    \"    </tr>\\n\",\n    \"    <tr>\\n\",\n    \"        <td>'FROM some_string '</td>\\n\",\n    \"        <td>\\n\",\n    \"        Returns all from the sender in the string. String can be an email, for example 'FROM               user@example.com' or just a string that may appear in the email, \\\"FROM example\\\"\\n\",\n    \"        </td>\\n\",\n    \"    </tr>\\n\",\n    \"    <tr>\\n\",\n    \"        <td>'TO some_string'</td>\\n\",\n    \"        <td>\\n\",\n    \"        Returns all outgoing email to the email in the string. String can be an email, for example 'FROM user@example.com' or just a string that may appear in the email, \\\"FROM example\\\"\\n\",\n    \"        </td>\\n\",\n    \"    </tr>\\n\",\n    \"    <tr>\\n\",\n    \"        <td>'CC some_string' and/or 'BCC some_string'</td>\\n\",\n    \"        <td>\\n\",\n    \"        Returns all messages in your email folder. Often there are size limits from imaplib.\\n\",\n    \"        To change these use imaplib._MAXLINE = 100 , where 100 is whatever you want the limit to be.\\n\",\n    \"        </td>\\n\",\n    \"    </tr>\\n\",\n    \"    <tr>\\n\",\n    \"        <td>'SUBJECT string','BODY string','TEXT \\\"string with spaces\\\"'</td>\\n\",\n    \"        <td>\\n\",\n    \"        Returns all messages with the subject string or the string in the body of the email. If the string you are searching for has spaces in it, wrap it in double quotes.\\n\",\n    \"        </td>\\n\",\n    \"    </tr>\\n\",\n    \"    <tr>\\n\",\n    \"        <td>'SEEN', 'UNSEEN'</td>\\n\",\n    \"        <td>\\n\",\n    \"        Returns all messages that have been seen or unseen. (Also known as read or unread)\\n\",\n    \"        </td>\\n\",\n    \"    </tr>\\n\",\n    \"        <tr>\\n\",\n    \"        <td>'ANSWERED', 'UNANSWERED'</td>\\n\",\n    \"        <td>\\n\",\n    \"        Returns all messages that have been replied to or unreplied to. \\n\",\n    \"        </td>\\n\",\n    \"    </tr>\\n\",\n    \"        <tr>\\n\",\n    \"        <td>'DELETED', 'UNDELETED'</td>\\n\",\n    \"        <td>\\n\",\n    \"        Returns all messages that have been deleted or that have not been deleted.\\n\",\n    \"        </td>\\n\",\n    \"    </tr>\\n\",\n    \"</table>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can also use the logical operators AND and OR to combine the above statements. Check out the full list of search keys here: https://developer.4d.com/docs/API/IMAPTransporterClass#authorized-search-keys.\\n\",\n    \"\\n\",\n    \"Please note that some IMAP server providers for different email services will have slightly different syntax. You may need to experiment to get the results you want.\\n\",\n    \"\\n\",\n    \"___________\\n\",\n    \"___________\\n\",\n    \"\\n\",\n    \"Now we can search our mail for any term we want.  \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Use if you get an error saying limit was reached\\n\",\n    \"imaplib._MAXLINE = 10000000\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Send yourself a test email with the subject line:\\n\",\n    \"\\n\",\n    \"    this is a test email for python\\n\",\n    \"\\n\",\n    \"Or some other uniquely identifying string.    \\n\",\n    \"\\n\",\n    \"We will now need to reconnect to our imap server. You will probably need to restart your kernel for this step if you are using jupyter notebook.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Restart your kernel and run the following:\\n\",\n    \"import imaplib\\n\",\n    \"import getpass\\n\",\n    \"M = imaplib.IMAP4_SSL('imap.gmail.com')\\n\",\n    \"user = input(\\\"Enter your email: \\\")\\n\",\n    \"password = getpass.getpass(\\\"Enter your password: \\\")\\n\",\n    \"M.login(user,password)\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"('OK', [b'28299'])\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Connect to your inbox\\n\",\n    \"M.select(\\\"inbox\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's now search and confirm if it is there:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 105,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"typ ,data = M.search(None,'SUBJECT \\\"this is a test email for python\\\"')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"source\": [\n    \"We can now save what it has returned:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 106,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'OK'\"\n      ]\n     },\n     \"execution_count\": 106,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"typ\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 107,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[b'28298']\"\n      ]\n     },\n     \"execution_count\": 107,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"data\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The data will be a list of unique ids.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 108,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"\\n\",\n    \"# typ, data = M.fetch(data[0],\\\"(RFC822)\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 112,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"result, email_data = M.fetch(data[0],\\\"(RFC822)\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 113,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"raw_email = email_data[0][1]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 116,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"raw_email_string = raw_email.decode('utf-8')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We can use the built in email library to help parse this raw string.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 120,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import email\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 121,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"jupyter\": {\n     \"outputs_hidden\": true\n    }\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"email_message = email.message_from_string(raw_email_string)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 125,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"b'This is a test to see if the python search worked.\\\\r\\\\n'\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for part in email_message.walk():\\n\",\n    \"    if part.get_content_type() == \\\"text/plain\\\":\\n\",\n    \"        body = part.get_payload(decode=True)\\n\",\n    \"        print(body)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Excellent! We've successfully have been able to check our email's inbox , filter by some condition, and read the body of the text that was there. This will come in handy in the near future!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "16-Emailing-with-Python/02-Exercise-Ideas.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"___\\n\",\n    \"\\n\",\n    \"<a href='https://www.udemy.com/user/joseportilla/'><img src='../Pierian_Data_Logo.png'/></a>\\n\",\n    \"___\\n\",\n    \"<center><em>Content Copyright by Pierian Data</em></center>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Python Email Exercise Ideas\\n\",\n    \"\\n\",\n    \"Since we can't really assess any code that would involve your personal email address, here are some ideas for you to test your new skills. Please keep in mind, we can not assess these.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"\\n\",\n    \"## Ideas\\n\",\n    \"\\n\",\n    \"* Daily Automatic Email Reminder for your Tasks\\n\",\n    \"* Webscrape some statistics from a website automatically each day and email them to yourself\\n\",\n    \"* Automatically email daily/weekly/monthly reports at your work\\n\",\n    \"* Have end of day messages to your friends and family be sent out at random to spread joy\\n\",\n    \"* Be creative! Mix together any of the skills you've learned so far with email :)\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "17-Advanced Python Objects and Data Structures/.ipynb_checkpoints/01-Advanced Numbers-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# Advanced Numbers\\n\",\n    \"In this lecture we will learn about a few more representations of numbers in Python.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Hexadecimal\\n\",\n    \"\\n\",\n    \"Using the function <code>hex()</code> you can convert numbers into a [hexadecimal](https://en.wikipedia.org/wiki/Hexadecimal) format:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'0xf6'\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"hex(246)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'0x200'\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"hex(512)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Binary \\n\",\n    \"Using the function <code>bin()</code> you can convert numbers into their [binary](https://en.wikipedia.org/wiki/Binary_number) format.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'0b10011010010'\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"bin(1234)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'0b10000000'\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"bin(128)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'0b1000000000'\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"bin(512)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Exponentials\\n\",\n    \"The function <code>pow()</code> takes two arguments, equivalent to ```x^y```.  With three arguments it is equivalent to ```(x^y)%z```, but may be more efficient for long integers.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"81\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"pow(3,4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"pow(3,4,5)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Absolute Value\\n\",\n    \"The function <code>abs()</code> returns the absolute value of a number. The argument may be an integer or a floating point number. If the argument is a complex number, its magnitude is returned.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3.14\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"abs(-3.14)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"abs(3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Round\\n\",\n    \"The function <code>round()</code> will round a number to a given precision in decimal digits (default 0 digits). It does not convert integers to floats.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"round(3,2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"400\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"round(395,-2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3.14\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"round(3.1415926535,2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Python has a built-in math library that is also useful to play around with in case you are ever in need of some mathematical operations. Explore the documentation [here](https://docs.python.org/3/library/math.html)!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "17-Advanced Python Objects and Data Structures/.ipynb_checkpoints/02-Advanced Strings-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# Advanced Strings\\n\",\n    \"String objects have a variety of methods we can use to save time and add functionality. Let's explore some of them in this lecture:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s = 'hello world'\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Changing case\\n\",\n    \"We can use methods to capitalize the first word of a string, or change the case of the entire string.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello world'\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Capitalize first word in string\\n\",\n    \"s.capitalize()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'HELLO WORLD'\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.upper()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'hello world'\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.lower()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Remember, strings are immutable. None of the above methods change the string in place, they only return modified copies of the original string.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'hello world'\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"To change a string requires reassignment:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'HELLO WORLD'\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s = s.upper()\\n\",\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'hello world'\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s = s.lower()\\n\",\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Location and Counting\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.count('o') # returns the number of occurrences, without overlap\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.find('o') # returns the starting index position of the first occurence\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Formatting\\n\",\n    \"The <code>center()</code> method allows you to place your string 'centered' between a provided string with a certain length. Personally, I've never actually used this in code as it seems pretty esoteric...\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'zzzzhello worldzzzzz'\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.center(20,'z')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The <code>expandtabs()</code> method will expand tab notations <code>\\\\t</code> into spaces:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'hello   hi'\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"'hello\\\\thi'.expandtabs()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## is check methods\\n\",\n    \"These various methods below check if the string is some case. Let's explore them:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s = 'hello'\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<code>isalnum()</code> will return True if all characters in **s** are alphanumeric\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.isalnum()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<code>isalpha()</code> will return True if all characters in **s** are alphabetic\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.isalpha()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<code>islower()</code> will return True if all cased characters in **s** are lowercase and there is\\n\",\n    \"at least one cased character in **s**, False otherwise.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.islower()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<code>isspace()</code> will return True if all characters in **s** are whitespace.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.isspace()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<code>istitle()</code> will return True if **s** is a title cased string and there is at least one character in **s**, i.e. uppercase characters may only follow uncased characters and lowercase characters only cased ones. It returns False otherwise.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.istitle()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<code>isupper()</code> will return True if all cased characters in **s** are uppercase and there is\\n\",\n    \"at least one cased character in **s**, False otherwise.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.isupper()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Another method is <code>endswith()</code> which is essentially the same as a boolean check on <code>s[-1]</code>\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.endswith('o')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Built-in Reg. Expressions\\n\",\n    \"Strings have some built-in methods that can resemble regular expression operations.\\n\",\n    \"We can use <code>split()</code> to split the string at a certain element and return a list of the results.\\n\",\n    \"We can use <code>partition()</code> to return a tuple that includes the first occurrence of the separator sandwiched between the first half and the end half.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['h', 'llo']\"\n      ]\n     },\n     \"execution_count\": 21,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.split('e')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"('he', 'l', 'lo')\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.partition('l')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! You should now feel comfortable using the variety of methods that are built-in string objects!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "17-Advanced Python Objects and Data Structures/.ipynb_checkpoints/03-Advanced Sets-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Advanced Sets\\n\",\n    \"In this lecture we will learn about the various methods for sets that you may not have seen yet. We'll go over the basic ones you already know and then dive a little deeper.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s = set()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# add\\n\",\n    \"add elements to a set. Remember, a set won't duplicate elements; it will only present them once (that's why it's called a set!)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s.add(1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s.add(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2}\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## clear\\n\",\n    \"removes all elements from the set\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s.clear()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"set()\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## copy\\n\",\n    \"returns a copy of the set. Note it is a copy, so changes to the original don't effect the copy.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s = {1,2,3}\\n\",\n    \"sc = s.copy()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 3}\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sc\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 3}\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s.add(4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 3, 4}\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 3}\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sc\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## difference\\n\",\n    \"difference returns the difference of two or more sets. The syntax is:\\n\",\n    \"\\n\",\n    \"    set1.difference(set2)\\n\",\n    \"For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{4}\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.difference(sc)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## difference_update\\n\",\n    \"difference_update syntax is:\\n\",\n    \"\\n\",\n    \"    set1.difference_update(set2)\\n\",\n    \"the method returns set1 after removing elements found in set2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s1 = {1,2,3}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s2 = {1,4,5}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s1.difference_update(s2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{2, 3}\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## discard\\n\",\n    \"Removes an element from a set if it is a member. If the element is not a member, do nothing.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 3, 4}\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s.discard(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 3, 4}\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## intersection and intersection_update\\n\",\n    \"Returns the intersection of two or more sets as a new set.(i.e. elements that are common to all of the sets.)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s1 = {1,2,3}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s2 = {1,2,4}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2}\"\n      ]\n     },\n     \"execution_count\": 23,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1.intersection(s2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 3}\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"intersection_update will update a set with the intersection of itself and another.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s1.intersection_update(s2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2}\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## isdisjoint\\n\",\n    \"This method will return True if two sets have a null intersection.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s1 = {1,2}\\n\",\n    \"s2 = {1,2,4}\\n\",\n    \"s3 = {5}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 28,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1.isdisjoint(s2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 29,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1.isdisjoint(s3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## issubset\\n\",\n    \"This method reports whether another set contains this set.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2}\"\n      ]\n     },\n     \"execution_count\": 30,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 4}\"\n      ]\n     },\n     \"execution_count\": 31,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 32,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1.issubset(s2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## issuperset\\n\",\n    \"This method will report whether this set contains another set.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 33,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s2.issuperset(s1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 34,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1.issuperset(s2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## symmetric_difference and symmetric_update\\n\",\n    \"Return the symmetric difference of two sets as a new set.(i.e. all elements that are in exactly one of the sets.)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2}\"\n      ]\n     },\n     \"execution_count\": 35,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 4}\"\n      ]\n     },\n     \"execution_count\": 36,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{4}\"\n      ]\n     },\n     \"execution_count\": 37,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1.symmetric_difference(s2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## union\\n\",\n    \"Returns the union of two sets (i.e. all elements that are in either set.)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 38,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 4}\"\n      ]\n     },\n     \"execution_count\": 38,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1.union(s2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## update\\n\",\n    \"Update a set with the union of itself and others.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s1.update(s2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 40,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 4}\"\n      ]\n     },\n     \"execution_count\": 40,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! You should now have a complete awareness of all the methods available to you for a set object type. This data structure is extremely useful and is underutilized by beginners, so try to keep it in mind!\\n\",\n    \"\\n\",\n    \"Good Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "17-Advanced Python Objects and Data Structures/.ipynb_checkpoints/04-Advanced Dictionaries-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Advanced Dictionaries\\n\",\n    \"Unlike some of the other Data Structures we've worked with, most of the really useful methods available to us in Dictionaries have already been explored throughout this course. Here we will touch on just a few more for good measure:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Dictionary Comprehensions\\n\",\n    \"\\n\",\n    \"Just like List Comprehensions, Dictionary Data Types also support their own version of comprehension for quick creation. It is not as commonly used as List Comprehensions, but the syntax is:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"{x:x**2 for x in range(10)}\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"One of the reasons it is not as common is the difficulty in structuring key names that are not based off the values.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Iteration over keys, values, and items\\n\",\n    \"Dictionaries can be iterated over using the keys(), values() and items() methods. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"d = {'k1':1,'k2':2}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"k1\\n\",\n      \"k2\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for k in d.keys():\\n\",\n    \"    print(k)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"1\\n\",\n      \"2\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for v in d.values():\\n\",\n    \"    print(v)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"('k1', 1)\\n\",\n      \"('k2', 2)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for item in d.items():\\n\",\n    \"    print(item)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Viewing keys, values and items\\n\",\n    \"By themselves the keys(), values() and items() methods return a dictionary *view object*. This is not a separate list of items. Instead, the view is always tied to the original dictionary.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"dict_keys(['k1', 'k2'])\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"key_view = d.keys()\\n\",\n    \"\\n\",\n    \"key_view\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'k1': 1, 'k2': 2, 'k3': 3}\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d['k3'] = 3\\n\",\n    \"\\n\",\n    \"d\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"dict_keys(['k1', 'k2', 'k3'])\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"key_view\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! You should now feel very comfortable using the variety of methods available to you in Dictionaries!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "17-Advanced Python Objects and Data Structures/.ipynb_checkpoints/05-Advanced Lists-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Advanced Lists\\n\",\n    \"\\n\",\n    \"In this series of lectures we will be diving a little deeper into all the methods available in a list object. These aren't officially \\\"advanced\\\" features, just methods that you wouldn't typically encounter without some additional exploring. It's pretty likely that you've already encountered some of these yourself!\\n\",\n    \"\\n\",\n    \"Let's begin!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"list1 = [1,2,3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## append\\n\",\n    \"You will definitely have used this method by now, which merely appends an element to the end of a list:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 3, 4]\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list1.append(4)\\n\",\n    \"\\n\",\n    \"list1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## count\\n\",\n    \"We discussed this during the methods lectures, but here it is again. <code>count()</code> takes in an element and returns the number of times it occurs in your list:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list1.count(10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list1.count(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## extend\\n\",\n    \"Many times people find the difference between extend and append to be unclear. So note:\\n\",\n    \"\\n\",\n    \"**append: appends whole object at end:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[1, 2, 3, [4, 5]]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = [1, 2, 3]\\n\",\n    \"x.append([4, 5])\\n\",\n    \"print(x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**extend: extends list by appending elements from the iterable:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[1, 2, 3, 4, 5]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = [1, 2, 3]\\n\",\n    \"x.extend([4, 5])\\n\",\n    \"print(x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how <code>extend()</code> appends each element from the passed-in list. That is the key difference.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## index\\n\",\n    \"<code>index()</code> will return the index of whatever element is placed as an argument. Note: If the the element is not in the list an error is raised.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list1.index(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"ValueError\",\n     \"evalue\": \"12 is not in list\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mValueError\\u001b[0m                                Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-8-56b94ada72bf>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mlist1\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mindex\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;36m12\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mValueError\\u001b[0m: 12 is not in list\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"list1.index(12)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## insert \\n\",\n    \"<code>insert()</code> takes in two arguments: <code>insert(index,object)</code> This method places the object at the index supplied. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 3, 4]\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Place a letter at the index 2\\n\",\n    \"list1.insert(2,'inserted')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 'inserted', 3, 4]\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## pop\\n\",\n    \"You most likely have already seen <code>pop()</code>, which allows us to \\\"pop\\\" off the last element of a list. However, by passing an index position you can remove and return a specific element.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"ele = list1.pop(1)  # pop the second element\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 'inserted', 3, 4]\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"ele\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## remove\\n\",\n    \"The <code>remove()</code> method removes the first occurrence of a value. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 'inserted', 3, 4]\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"list1.remove('inserted')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 3, 4]\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"list2 = [1,2,3,4,3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"list2.remove(3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 4, 3]\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## reverse\\n\",\n    \"As you might have guessed, <code>reverse()</code> reverses a list. Note this occurs in place! Meaning it affects your list permanently.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"list2.reverse()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[3, 4, 2, 1]\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## sort\\n\",\n    \"The <code>sort()</code> method will sort your list in place:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[3, 4, 2, 1]\"\n      ]\n     },\n     \"execution_count\": 23,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"list2.sort()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 3, 4]\"\n      ]\n     },\n     \"execution_count\": 25,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The <code>sort()</code> method takes an optional argument for reverse sorting. Note this is different than simply reversing the order of items.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"list2.sort(reverse=True)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[4, 3, 2, 1]\"\n      ]\n     },\n     \"execution_count\": 27,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Be Careful With Assignment!\\n\",\n    \"A common programming mistake is to assume you can assign a modified list to a new variable. While this typically works with immutable objects like strings and tuples:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"x = 'hello world'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"y = x.upper()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"HELLO WORLD\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(y)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This will NOT work the same way with lists:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"x = [1,2,3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"y = x.append(4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(y)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What happened? In this case, since list methods like <code>append()</code> affect the list *in-place*, the operation returns a None value. This is what was passed to **y**. In order to retain **x** you would have to assign a *copy* of **x** to **y**, and then modify **y**:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"x = [1,2,3]\\n\",\n    \"y = x.copy()\\n\",\n    \"y.append(4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[1, 2, 3]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[1, 2, 3, 4]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(y)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! You should now have an understanding of all the methods available for a list in Python!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "17-Advanced Python Objects and Data Structures/.ipynb_checkpoints/06-Advanced Python Objects Test-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Advanced Python Objects Test\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Advanced Numbers\\n\",\n    \"\\n\",\n    \"**Problem 1: Convert 1024 to binary and hexadecimal representation**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Problem 2: Round 5.23222 to two decimal places**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Advanced Strings\\n\",\n    \"**Problem 3: Check if every letter in the string s is lower case**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s = 'hello how are you Mary, are you feeling okay?'\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Problem 4: How many times does the letter 'w' show up in the string below?**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s = 'twywywtwywbwhsjhwuwshshwuwwwjdjdid'\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Advanced Sets\\n\",\n    \"**Problem 5: Find the elements in set1 that are not in set2:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"set1 = {2,3,1,5,6,8}\\n\",\n    \"set2 = {3,1,7,5,6,8}\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Problem 6: Find all elements that are in either set:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Advanced Dictionaries\\n\",\n    \"\\n\",\n    \"**Problem 7: Create this dictionary:\\n\",\n    \"{0: 0, 1: 1, 2: 8, 3: 27, 4: 64}\\n\",\n    \" using a dictionary comprehension.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Advanced Lists\\n\",\n    \"\\n\",\n    \"**Problem 8: Reverse the list below:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"list1 = [1,2,3,4]\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Problem 9: Sort the list below:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"list2 = [3,4,2,5,1]\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "17-Advanced Python Objects and Data Structures/.ipynb_checkpoints/07-Advanced Python Objects Test - Solutions-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Advanced Python Objects Test\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Advanced Numbers\\n\",\n    \"\\n\",\n    \"**Problem 1: Convert 1024 to binary and hexadecimal representation**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"0b10000000000\\n\",\n      \"0x400\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(bin(1024))\\n\",\n    \"print(hex(1024))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Problem 2: Round 5.23222 to two decimal places**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"5.23\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"round(5.23222,2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Advanced Strings\\n\",\n    \"**Problem 3: Check if every letter in the string s is lower case**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s = 'hello how are you Mary, are you feeling okay?'\\n\",\n    \"\\n\",\n    \"s.islower()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Problem 4: How many times does the letter 'w' show up in the string below?**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"12\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s = 'twywywtwywbwhsjhwuwshshwuwwwjdjdid'\\n\",\n    \"s.count('w')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Advanced \\n\",\n    \"**Problem 5: Find the elements in set1 that are not in set2:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{2}\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"set1 = {2,3,1,5,6,8}\\n\",\n    \"set2 = {3,1,7,5,6,8}\\n\",\n    \"\\n\",\n    \"set1.difference(set2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Problem 6: Find all elements that are in either set:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 3, 5, 6, 7, 8}\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"set1.union(set2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Advanced Dictionaries\\n\",\n    \"\\n\",\n    \"**Problem 7: Create this dictionary:\\n\",\n    \"{0: 0, 1: 1, 2: 8, 3: 27, 4: 64}\\n\",\n    \" using a dictionary comprehension.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{0: 0, 1: 1, 2: 8, 3: 27, 4: 64}\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"{x:x**3 for x in range(5)}\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Advanced Lists\\n\",\n    \"\\n\",\n    \"**Problem 8: Reverse the list below:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[4, 3, 2, 1]\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list1 = [1,2,3,4]\\n\",\n    \"\\n\",\n    \"list1.reverse()\\n\",\n    \"\\n\",\n    \"list1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Problem 9: Sort the list below:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 3, 4, 5]\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list2 = [3,4,2,5,1]\\n\",\n    \"\\n\",\n    \"list2.sort()\\n\",\n    \"\\n\",\n    \"list2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "17-Advanced Python Objects and Data Structures/01-Advanced Numbers.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# Advanced Numbers\\n\",\n    \"In this lecture we will learn about a few more representations of numbers in Python.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Hexadecimal\\n\",\n    \"\\n\",\n    \"Using the function <code>hex()</code> you can convert numbers into a [hexadecimal](https://en.wikipedia.org/wiki/Hexadecimal) format:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'0xf6'\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"hex(246)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'0x200'\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"hex(512)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Binary \\n\",\n    \"Using the function <code>bin()</code> you can convert numbers into their [binary](https://en.wikipedia.org/wiki/Binary_number) format.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'0b10011010010'\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"bin(1234)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'0b10000000'\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"bin(128)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'0b1000000000'\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"bin(512)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Exponentials\\n\",\n    \"The function <code>pow()</code> takes two arguments, equivalent to ```x^y```.  With three arguments it is equivalent to ```(x^y)%z```, but may be more efficient for long integers.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"81\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"pow(3,4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"pow(3,4,5)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Absolute Value\\n\",\n    \"The function <code>abs()</code> returns the absolute value of a number. The argument may be an integer or a floating point number. If the argument is a complex number, its magnitude is returned.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3.14\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"abs(-3.14)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"abs(3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Round\\n\",\n    \"The function <code>round()</code> will round a number to a given precision in decimal digits (default 0 digits). It does not convert integers to floats.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"round(3,2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"400\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"round(395,-2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3.14\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"round(3.1415926535,2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Python has a built-in math library that is also useful to play around with in case you are ever in need of some mathematical operations. Explore the documentation [here](https://docs.python.org/3/library/math.html)!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "17-Advanced Python Objects and Data Structures/02-Advanced Strings.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# Advanced Strings\\n\",\n    \"String objects have a variety of methods we can use to save time and add functionality. Let's explore some of them in this lecture:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s = 'hello world'\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Changing case\\n\",\n    \"We can use methods to capitalize the first word of a string, or change the case of the entire string.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello world'\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Capitalize first word in string\\n\",\n    \"s.capitalize()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'HELLO WORLD'\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.upper()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'hello world'\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.lower()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Remember, strings are immutable. None of the above methods change the string in place, they only return modified copies of the original string.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'hello world'\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"To change a string requires reassignment:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'HELLO WORLD'\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s = s.upper()\\n\",\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'hello world'\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s = s.lower()\\n\",\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Location and Counting\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.count('o') # returns the number of occurrences, without overlap\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"4\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.find('o') # returns the starting index position of the first occurence\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Formatting\\n\",\n    \"The <code>center()</code> method allows you to place your string 'centered' between a provided string with a certain length. Personally, I've never actually used this in code as it seems pretty esoteric...\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'zzzzhello worldzzzzz'\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.center(20,'z')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The <code>expandtabs()</code> method will expand tab notations <code>\\\\t</code> into spaces:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'hello   hi'\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"'hello\\\\thi'.expandtabs()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## is check methods\\n\",\n    \"These various methods below check if the string is some case. Let's explore them:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s = 'hello'\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<code>isalnum()</code> will return True if all characters in **s** are alphanumeric\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.isalnum()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<code>isalpha()</code> will return True if all characters in **s** are alphabetic\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.isalpha()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<code>islower()</code> will return True if all cased characters in **s** are lowercase and there is\\n\",\n    \"at least one cased character in **s**, False otherwise.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.islower()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<code>isspace()</code> will return True if all characters in **s** are whitespace.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.isspace()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<code>istitle()</code> will return True if **s** is a title cased string and there is at least one character in **s**, i.e. uppercase characters may only follow uncased characters and lowercase characters only cased ones. It returns False otherwise.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.istitle()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<code>isupper()</code> will return True if all cased characters in **s** are uppercase and there is\\n\",\n    \"at least one cased character in **s**, False otherwise.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.isupper()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Another method is <code>endswith()</code> which is essentially the same as a boolean check on <code>s[-1]</code>\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.endswith('o')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Built-in Reg. Expressions\\n\",\n    \"Strings have some built-in methods that can resemble regular expression operations.\\n\",\n    \"We can use <code>split()</code> to split the string at a certain element and return a list of the results.\\n\",\n    \"We can use <code>partition()</code> to return a tuple that includes the first occurrence of the separator sandwiched between the first half and the end half.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['h', 'llo']\"\n      ]\n     },\n     \"execution_count\": 21,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.split('e')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"('he', 'l', 'lo')\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.partition('l')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! You should now feel comfortable using the variety of methods that are built-in string objects!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "17-Advanced Python Objects and Data Structures/03-Advanced Sets.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Advanced Sets\\n\",\n    \"In this lecture we will learn about the various methods for sets that you may not have seen yet. We'll go over the basic ones you already know and then dive a little deeper.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s = set()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# add\\n\",\n    \"add elements to a set. Remember, a set won't duplicate elements; it will only present them once (that's why it's called a set!)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s.add(1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s.add(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2}\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## clear\\n\",\n    \"removes all elements from the set\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s.clear()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"set()\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## copy\\n\",\n    \"returns a copy of the set. Note it is a copy, so changes to the original don't effect the copy.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s = {1,2,3}\\n\",\n    \"sc = s.copy()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 3}\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sc\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 3}\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s.add(4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 3, 4}\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 3}\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"sc\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## difference\\n\",\n    \"difference returns the difference of two or more sets. The syntax is:\\n\",\n    \"\\n\",\n    \"    set1.difference(set2)\\n\",\n    \"For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{4}\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s.difference(sc)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## difference_update\\n\",\n    \"difference_update syntax is:\\n\",\n    \"\\n\",\n    \"    set1.difference_update(set2)\\n\",\n    \"the method returns set1 after removing elements found in set2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s1 = {1,2,3}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s2 = {1,4,5}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s1.difference_update(s2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{2, 3}\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## discard\\n\",\n    \"Removes an element from a set if it is a member. If the element is not a member, do nothing.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 3, 4}\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s.discard(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 3, 4}\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## intersection and intersection_update\\n\",\n    \"Returns the intersection of two or more sets as a new set.(i.e. elements that are common to all of the sets.)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s1 = {1,2,3}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s2 = {1,2,4}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2}\"\n      ]\n     },\n     \"execution_count\": 23,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1.intersection(s2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 3}\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"intersection_update will update a set with the intersection of itself and another.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s1.intersection_update(s2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2}\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## isdisjoint\\n\",\n    \"This method will return True if two sets have a null intersection.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s1 = {1,2}\\n\",\n    \"s2 = {1,2,4}\\n\",\n    \"s3 = {5}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 28,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1.isdisjoint(s2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 29,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1.isdisjoint(s3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## issubset\\n\",\n    \"This method reports whether another set contains this set.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2}\"\n      ]\n     },\n     \"execution_count\": 30,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 4}\"\n      ]\n     },\n     \"execution_count\": 31,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 32,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1.issubset(s2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## issuperset\\n\",\n    \"This method will report whether this set contains another set.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"True\"\n      ]\n     },\n     \"execution_count\": 33,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s2.issuperset(s1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 34,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1.issuperset(s2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## symmetric_difference and symmetric_update\\n\",\n    \"Return the symmetric difference of two sets as a new set.(i.e. all elements that are in exactly one of the sets.)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2}\"\n      ]\n     },\n     \"execution_count\": 35,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 4}\"\n      ]\n     },\n     \"execution_count\": 36,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 37,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{4}\"\n      ]\n     },\n     \"execution_count\": 37,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1.symmetric_difference(s2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## union\\n\",\n    \"Returns the union of two sets (i.e. all elements that are in either set.)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 38,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 4}\"\n      ]\n     },\n     \"execution_count\": 38,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1.union(s2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## update\\n\",\n    \"Update a set with the union of itself and others.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 39,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s1.update(s2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 40,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 4}\"\n      ]\n     },\n     \"execution_count\": 40,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! You should now have a complete awareness of all the methods available to you for a set object type. This data structure is extremely useful and is underutilized by beginners, so try to keep it in mind!\\n\",\n    \"\\n\",\n    \"Good Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "17-Advanced Python Objects and Data Structures/04-Advanced Dictionaries.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Advanced Dictionaries\\n\",\n    \"Unlike some of the other Data Structures we've worked with, most of the really useful methods available to us in Dictionaries have already been explored throughout this course. Here we will touch on just a few more for good measure:\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Dictionary Comprehensions\\n\",\n    \"\\n\",\n    \"Just like List Comprehensions, Dictionary Data Types also support their own version of comprehension for quick creation. It is not as commonly used as List Comprehensions, but the syntax is:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"{x:x**2 for x in range(10)}\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"One of the reasons it is not as common is the difficulty in structuring key names that are not based off the values.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Iteration over keys, values, and items\\n\",\n    \"Dictionaries can be iterated over using the keys(), values() and items() methods. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"d = {'k1':1,'k2':2}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"k1\\n\",\n      \"k2\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for k in d.keys():\\n\",\n    \"    print(k)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"1\\n\",\n      \"2\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for v in d.values():\\n\",\n    \"    print(v)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"('k1', 1)\\n\",\n      \"('k2', 2)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"for item in d.items():\\n\",\n    \"    print(item)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Viewing keys, values and items\\n\",\n    \"By themselves the keys(), values() and items() methods return a dictionary *view object*. This is not a separate list of items. Instead, the view is always tied to the original dictionary.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"dict_keys(['k1', 'k2'])\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"key_view = d.keys()\\n\",\n    \"\\n\",\n    \"key_view\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'k1': 1, 'k2': 2, 'k3': 3}\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"d['k3'] = 3\\n\",\n    \"\\n\",\n    \"d\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"dict_keys(['k1', 'k2', 'k3'])\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"key_view\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! You should now feel very comfortable using the variety of methods available to you in Dictionaries!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "17-Advanced Python Objects and Data Structures/05-Advanced Lists.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Advanced Lists\\n\",\n    \"\\n\",\n    \"In this series of lectures we will be diving a little deeper into all the methods available in a list object. These aren't officially \\\"advanced\\\" features, just methods that you wouldn't typically encounter without some additional exploring. It's pretty likely that you've already encountered some of these yourself!\\n\",\n    \"\\n\",\n    \"Let's begin!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"list1 = [1,2,3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## append\\n\",\n    \"You will definitely have used this method by now, which merely appends an element to the end of a list:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 3, 4]\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list1.append(4)\\n\",\n    \"\\n\",\n    \"list1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## count\\n\",\n    \"We discussed this during the methods lectures, but here it is again. <code>count()</code> takes in an element and returns the number of times it occurs in your list:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list1.count(10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list1.count(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## extend\\n\",\n    \"Many times people find the difference between extend and append to be unclear. So note:\\n\",\n    \"\\n\",\n    \"**append: appends whole object at end:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[1, 2, 3, [4, 5]]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = [1, 2, 3]\\n\",\n    \"x.append([4, 5])\\n\",\n    \"print(x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**extend: extends list by appending elements from the iterable:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[1, 2, 3, 4, 5]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"x = [1, 2, 3]\\n\",\n    \"x.extend([4, 5])\\n\",\n    \"print(x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note how <code>extend()</code> appends each element from the passed-in list. That is the key difference.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## index\\n\",\n    \"<code>index()</code> will return the index of whatever element is placed as an argument. Note: If the the element is not in the list an error is raised.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list1.index(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"ValueError\",\n     \"evalue\": \"12 is not in list\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mValueError\\u001b[0m                                Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-8-56b94ada72bf>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mlist1\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mindex\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;36m12\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mValueError\\u001b[0m: 12 is not in list\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"list1.index(12)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## insert \\n\",\n    \"<code>insert()</code> takes in two arguments: <code>insert(index,object)</code> This method places the object at the index supplied. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 3, 4]\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Place a letter at the index 2\\n\",\n    \"list1.insert(2,'inserted')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 'inserted', 3, 4]\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## pop\\n\",\n    \"You most likely have already seen <code>pop()</code>, which allows us to \\\"pop\\\" off the last element of a list. However, by passing an index position you can remove and return a specific element.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"ele = list1.pop(1)  # pop the second element\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 'inserted', 3, 4]\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"2\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"ele\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## remove\\n\",\n    \"The <code>remove()</code> method removes the first occurrence of a value. For example:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 'inserted', 3, 4]\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"list1.remove('inserted')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 3, 4]\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"list2 = [1,2,3,4,3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"list2.remove(3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 4, 3]\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## reverse\\n\",\n    \"As you might have guessed, <code>reverse()</code> reverses a list. Note this occurs in place! Meaning it affects your list permanently.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"list2.reverse()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[3, 4, 2, 1]\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## sort\\n\",\n    \"The <code>sort()</code> method will sort your list in place:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[3, 4, 2, 1]\"\n      ]\n     },\n     \"execution_count\": 23,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list2\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"list2.sort()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 3, 4]\"\n      ]\n     },\n     \"execution_count\": 25,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The <code>sort()</code> method takes an optional argument for reverse sorting. Note this is different than simply reversing the order of items.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"list2.sort(reverse=True)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[4, 3, 2, 1]\"\n      ]\n     },\n     \"execution_count\": 27,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Be Careful With Assignment!\\n\",\n    \"A common programming mistake is to assume you can assign a modified list to a new variable. While this typically works with immutable objects like strings and tuples:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"x = 'hello world'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"y = x.upper()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"HELLO WORLD\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(y)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This will NOT work the same way with lists:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"x = [1,2,3]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 32,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"y = x.append(4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 33,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"None\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(y)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"What happened? In this case, since list methods like <code>append()</code> affect the list *in-place*, the operation returns a None value. This is what was passed to **y**. In order to retain **x** you would have to assign a *copy* of **x** to **y**, and then modify **y**:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"x = [1,2,3]\\n\",\n    \"y = x.copy()\\n\",\n    \"y.append(4)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[1, 2, 3]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[1, 2, 3, 4]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(y)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! You should now have an understanding of all the methods available for a list in Python!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "17-Advanced Python Objects and Data Structures/06-Advanced Python Objects Test.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Advanced Python Objects Test\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Advanced Numbers\\n\",\n    \"\\n\",\n    \"**Problem 1: Convert 1024 to binary and hexadecimal representation**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Problem 2: Round 5.23222 to two decimal places**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Advanced Strings\\n\",\n    \"**Problem 3: Check if every letter in the string s is lower case**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s = 'hello how are you Mary, are you feeling okay?'\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Problem 4: How many times does the letter 'w' show up in the string below?**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s = 'twywywtwywbwhsjhwuwshshwuwwwjdjdid'\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Advanced Sets\\n\",\n    \"**Problem 5: Find the elements in set1 that are not in set2:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"set1 = {2,3,1,5,6,8}\\n\",\n    \"set2 = {3,1,7,5,6,8}\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Problem 6: Find all elements that are in either set:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Advanced Dictionaries\\n\",\n    \"\\n\",\n    \"**Problem 7: Create this dictionary:\\n\",\n    \"{0: 0, 1: 1, 2: 8, 3: 27, 4: 64}\\n\",\n    \" using a dictionary comprehension.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Advanced Lists\\n\",\n    \"\\n\",\n    \"**Problem 8: Reverse the list below:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"list1 = [1,2,3,4]\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Problem 9: Sort the list below:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"list2 = [3,4,2,5,1]\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "17-Advanced Python Objects and Data Structures/07-Advanced Python Objects Test - Solutions.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Advanced Python Objects Test\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Advanced Numbers\\n\",\n    \"\\n\",\n    \"**Problem 1: Convert 1024 to binary and hexadecimal representation**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"0b10000000000\\n\",\n      \"0x400\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(bin(1024))\\n\",\n    \"print(hex(1024))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Problem 2: Round 5.23222 to two decimal places**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"5.23\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"round(5.23222,2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Advanced Strings\\n\",\n    \"**Problem 3: Check if every letter in the string s is lower case**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"False\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s = 'hello how are you Mary, are you feeling okay?'\\n\",\n    \"\\n\",\n    \"s.islower()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Problem 4: How many times does the letter 'w' show up in the string below?**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"12\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"s = 'twywywtwywbwhsjhwuwshshwuwwwjdjdid'\\n\",\n    \"s.count('w')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Advanced \\n\",\n    \"**Problem 5: Find the elements in set1 that are not in set2:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{2}\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"set1 = {2,3,1,5,6,8}\\n\",\n    \"set2 = {3,1,7,5,6,8}\\n\",\n    \"\\n\",\n    \"set1.difference(set2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Problem 6: Find all elements that are in either set:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{1, 2, 3, 5, 6, 7, 8}\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"set1.union(set2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Advanced Dictionaries\\n\",\n    \"\\n\",\n    \"**Problem 7: Create this dictionary:\\n\",\n    \"{0: 0, 1: 1, 2: 8, 3: 27, 4: 64}\\n\",\n    \" using a dictionary comprehension.**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{0: 0, 1: 1, 2: 8, 3: 27, 4: 64}\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"{x:x**3 for x in range(5)}\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Advanced Lists\\n\",\n    \"\\n\",\n    \"**Problem 8: Reverse the list below:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[4, 3, 2, 1]\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list1 = [1,2,3,4]\\n\",\n    \"\\n\",\n    \"list1.reverse()\\n\",\n    \"\\n\",\n    \"list1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Problem 9: Sort the list below:**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[1, 2, 3, 4, 5]\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"list2 = [3,4,2,5,1]\\n\",\n    \"\\n\",\n    \"list2.sort()\\n\",\n    \"\\n\",\n    \"list2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Great Job!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "17-Advanced Python Objects and Data Structures/08-BONUS - With Statement Context Managers.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# With Statement Context Managers\\n\",\n    \"\\n\",\n    \"When you open a file using `f = open('test.txt')`, the file stays open until you specifically call `f.close()`.  Should an exception be raised while working with the file, it remains open. This can lead to vulnerabilities in your code, and inefficient use of resources.\\n\",\n    \"\\n\",\n    \"A context manager handles the opening and closing of resources, and provides a built-in `try/finally` block should any exceptions occur.\\n\",\n    \"\\n\",\n    \"The best way to demonstrate this is with an example.\\n\",\n    \"\\n\",\n    \"### Standard `open()` procedure, with a raised exception:\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"UnsupportedOperation\",\n     \"evalue\": \"not readable\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mUnsupportedOperation\\u001b[0m                      Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-1-ad7a2000735b>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      1\\u001b[0m \\u001b[0mp\\u001b[0m \\u001b[1;33m=\\u001b[0m \\u001b[0mopen\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;34m'oops.txt'\\u001b[0m\\u001b[1;33m,\\u001b[0m\\u001b[1;34m'a'\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m----> 2\\u001b[1;33m \\u001b[0mp\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mreadlines\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[0;32m      3\\u001b[0m \\u001b[0mp\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mclose\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[1;31mUnsupportedOperation\\u001b[0m: not readable\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"p = open('oops.txt','a')\\n\",\n    \"p.readlines()\\n\",\n    \"p.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's see if we can modify our file:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"13\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"p.write('add more text')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Ouch! I may not have wanted to do that until I traced the exception! Unfortunately, the exception prevented the last line, `p.close()` from running. Let's close the file manually:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"p.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Protect the file with `try/except/finally`\\n\",\n    \"\\n\",\n    \"A common workaround is to insert a `try/except/finally` clause to close the file whenever an exception is raised:\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"An exception was raised!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"p = open('oops.txt','a')\\n\",\n    \"try:\\n\",\n    \"    p.readlines()\\n\",\n    \"except:\\n\",\n    \"    print('An exception was raised!')\\n\",\n    \"finally:\\n\",\n    \"    p.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's see if we can modify our file this time:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"ValueError\",\n     \"evalue\": \"I/O operation on closed file.\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mValueError\\u001b[0m                                Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-5-1209a18e617d>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mp\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mwrite\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;34m'add more text'\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mValueError\\u001b[0m: I/O operation on closed file.\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"p.write('add more text')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Excellent! Our file is safe.\\n\",\n    \"\\n\",\n    \"### Save steps with `with`\\n\",\n    \"\\n\",\n    \"Now we'll employ our context manager. The syntax follows `with [resource] as [target]: do something`\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"UnsupportedOperation\",\n     \"evalue\": \"not readable\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mUnsupportedOperation\\u001b[0m                      Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-6-7ccc44e332f9>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[0;32m      1\\u001b[0m \\u001b[1;32mwith\\u001b[0m \\u001b[0mopen\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;34m'oops.txt'\\u001b[0m\\u001b[1;33m,\\u001b[0m\\u001b[1;34m'a'\\u001b[0m\\u001b[1;33m)\\u001b[0m \\u001b[1;32mas\\u001b[0m \\u001b[0mp\\u001b[0m\\u001b[1;33m:\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m----> 2\\u001b[1;33m     \\u001b[0mp\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mreadlines\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mUnsupportedOperation\\u001b[0m: not readable\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"with open('oops.txt','a') as p:\\n\",\n    \"    p.readlines()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Can we modify the file?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"ename\": \"ValueError\",\n     \"evalue\": \"I/O operation on closed file.\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[1;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[1;31mValueError\\u001b[0m                                Traceback (most recent call last)\",\n      \"\\u001b[1;32m<ipython-input-7-1209a18e617d>\\u001b[0m in \\u001b[0;36m<module>\\u001b[1;34m()\\u001b[0m\\n\\u001b[1;32m----> 1\\u001b[1;33m \\u001b[0mp\\u001b[0m\\u001b[1;33m.\\u001b[0m\\u001b[0mwrite\\u001b[0m\\u001b[1;33m(\\u001b[0m\\u001b[1;34m'add more text'\\u001b[0m\\u001b[1;33m)\\u001b[0m\\u001b[1;33m\\u001b[0m\\u001b[0m\\n\\u001b[0m\",\n      \"\\u001b[1;31mValueError\\u001b[0m: I/O operation on closed file.\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"p.write('add more text')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Great! With just one line of code we've handled opening the file, enclosing our code in a `try/finally` block, and closing our file all at the same time.\\n\",\n    \"\\n\",\n    \"Now you should have a basic understanding of context managers.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "18-Milestone Project - 3/.ipynb_checkpoints/01-Final Capstone Project-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# Final Capstone Projects\\n\",\n    \"\\n\",\n    \"Please refer to the [**Final Capstone Projects**](http://nbviewer.jupyter.org/github/jmportilla/Complete-Python-Bootcamp/tree/master/Final%20Capstone%20Projects/) folder to get all the info on final capstone project ideas and possible solutions!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "18-Milestone Project - 3/.ipynb_checkpoints/02-Final Capstone Project Ideas-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# List of Capstone Projects\\n\",\n    \"\\n\",\n    \"This list contains around 100 project ideas for you to try out in Python! Some of them are straightforward and others we have done before (such as a Fibonacci Sequence or FizzBuzz). \\n\",\n    \"\\n\",\n    \"Pick a simple project that you think you can finish in a day to start off with, then pick another project that you think will take you more than a week and extensive Googling!\\n\",\n    \"\\n\",\n    \"There are some sample solutions in this folder as well so feel free to explore and remember:\\n\",\n    \"\\n\",\n    \"**HAVE FUN!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Numbers\\n\",\n    \"---------\\n\",\n    \"\\n\",\n    \"**Find PI to the Nth Digit** - Enter a number and have the program generate &pi; (pi) up to that many decimal places. Keep a limit to how far the program will go.\\n\",\n    \"\\n\",\n    \"**Find e to the Nth Digit** - Just like the previous problem, but with e instead of &pi; (pi). Enter a number and have the program generate e up to that many decimal places. Keep a limit to how far the program will go.\\n\",\n    \"\\n\",\n    \"**Fibonacci Sequence** - Enter a number and have the program generate the Fibonacci sequence to that number or to the Nth number.\\n\",\n    \"\\n\",\n    \"**Prime Factorization** - Have the user enter a number and find all Prime Factors (if there are any) and display them.\\n\",\n    \"\\n\",\n    \"**Next Prime Number** - Have the program find prime numbers until the user chooses to stop asking for the next one.\\n\",\n    \"\\n\",\n    \"**Find Cost of Tile to Cover W x H Floor** - Calculate the total cost of tile it would take to cover a floor plan of width and height, using a cost entered by the user.\\n\",\n    \"\\n\",\n    \"**Mortgage Calculator** - Calculate the monthly payments of a fixed term mortgage over given Nth terms at a given interest rate. Also figure out how long it will take the user to pay back the loan. For added complexity, add an option for users to select the compounding interval (Monthly, Weekly, Daily, Continually).\\n\",\n    \"\\n\",\n    \"**Change Return Program** - The user enters a cost and then the amount of money given. The program will figure out the change and the number of quarters, dimes, nickels, pennies needed for the change.\\n\",\n    \"\\n\",\n    \"**Binary to Decimal and Back Converter** - Develop a converter to convert a decimal number to binary or a binary number to its decimal equivalent.\\n\",\n    \"\\n\",\n    \"**Calculator** - A simple calculator to do basic operators. Make it a scientific calculator for added complexity.\\n\",\n    \"\\n\",\n    \"**Unit Converter (temp, currency, volume, mass and more)** - Converts various units between one another. The user enters the type of unit being entered, the type of unit they want to convert to and then the value. The program will then make the conversion.\\n\",\n    \"\\n\",\n    \"**Alarm Clock** - A simple clock where it plays a sound after X number of minutes/seconds or at a particular time.\\n\",\n    \"\\n\",\n    \"**Distance Between Two Cities** - Calculates the distance between two cities and allows the user to specify a unit of distance. This program may require finding coordinates for the cities like latitude and longitude.\\n\",\n    \"\\n\",\n    \"**Credit Card Validator** - Takes in a credit card number from a common credit card vendor (Visa, MasterCard, American Express, Discoverer) and validates it to make sure that it is a valid number (look into how credit cards use a checksum).\\n\",\n    \"\\n\",\n    \"**Tax Calculator** - Asks the user to enter a cost and either a country or state tax. It then returns the tax plus the total cost with tax.\\n\",\n    \"\\n\",\n    \"**Factorial Finder** - The Factorial of a positive integer, n, is defined as the product of the sequence n, n-1, n-2, ...1 and the factorial of zero, 0, is defined as being 1. Solve this using both loops and recursion.\\n\",\n    \"\\n\",\n    \"**Complex Number Algebra** - Show addition, multiplication, negation, and inversion of complex numbers in separate functions. (Subtraction and division operations can be made with pairs of these operations.) Print the results for each operation tested.\\n\",\n    \"\\n\",\n    \"**Happy Numbers** - A happy number is defined by the following process. Starting with any positive integer, replace the number by the sum of the squares of its digits, and repeat the process until the number equals 1 (where it will stay), or it loops endlessly in a cycle which does not include 1. Those numbers for which this process ends in 1 are happy numbers, while those that do not end in 1 are unhappy numbers. Display an example of your output here. Find first 8 happy numbers.\\n\",\n    \"\\n\",\n    \"**Number Names** - Show how to spell out a number in English. You can use a preexisting implementation or roll your own, but you should support inputs up to at least one million (or the maximum value of your language's default bounded integer type, if that's less). *Optional: Support for inputs other than positive integers (like zero, negative integers, and floating-point numbers).*\\n\",\n    \"\\n\",\n    \"**Coin Flip Simulation** - Write some code that simulates flipping a single coin however many times the user decides. The code should record the outcomes and count the number of tails and heads.\\n\",\n    \"\\n\",\n    \"**Limit Calculator** - Ask the user to enter f(x) and the limit value, then return the value of the limit statement *Optional: Make the calculator capable of supporting infinite limits.*\\n\",\n    \"\\n\",\n    \"**Fast Exponentiation** - Ask the user to enter 2 integers a and b and output a^b (i.e. pow(a,b)) in O(lg n) time complexity.\\n\",\n    \"\\n\",\n    \"Classic Algorithms\\n\",\n    \"-----------------\\n\",\n    \"\\n\",\n    \"**Collatz Conjecture** - Start with a number *n > 1*. Find the number of steps it takes to reach one using the following process: If *n* is even, divide it by 2. If *n* is odd, multiply it by 3 and add 1.\\n\",\n    \"\\n\",\n    \"**Sorting** - Implement two types of sorting algorithms: Merge sort and bubble sort.\\n\",\n    \"\\n\",\n    \"**Closest pair problem** - The closest pair of points problem or closest pair problem is a problem of computational geometry: given *n* points in metric space, find a pair of points with the smallest distance between them.\\n\",\n    \"\\n\",\n    \"**Sieve of Eratosthenes** - The sieve of Eratosthenes is one of the most efficient ways to find all of the smaller primes (below 10 million or so).\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Graph\\n\",\n    \"--------\\n\",\n    \"\\n\",\n    \"**Graph from links** - Create a program that will create a graph or network from a series of links.\\n\",\n    \"\\n\",\n    \"**Eulerian Path** - Create a program which will take as an input a graph and output either a Eulerian path or a Eulerian cycle, or state that it is not possible.  A Eulerian Path starts at one node and traverses every edge of a graph  through every node and finishes at another node.  A Eulerian cycle is a eulerian Path that starts and finishes at the same node.\\n\",\n    \"\\n\",\n    \"**Connected Graph** - Create a program which takes a graph as an input and outputs whether every node is connected or not.\\n\",\n    \"\\n\",\n    \"**Dijkstra’s Algorithm** - Create a program that finds the shortest path through a graph using its edges.\\n\",\n    \"\\n\",\n    \"**Minimum Spanning Tree** - Create a program which takes a connected, undirected graph with weights and outputs the minimum spanning tree of the graph i.e., a\\n\",\n    \"subgraph that is a tree, contains all the vertices, and the sum of its weights is the least possible.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Data Structures\\n\",\n    \"---------\\n\",\n    \"\\n\",\n    \"**Inverted index** - An [Inverted Index](http://en.wikipedia.org/wiki/Inverted_index) is a data structure used to create full text search. Given a set of text files, implement a program to create an inverted index. Also create a user interface to do a search using that inverted index which returns a list of files that contain the query term / terms. The search index can be in memory.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Text\\n\",\n    \"---------\\n\",\n    \"\\n\",\n    \"**Fizz Buzz** - Write a program that prints the numbers from 1 to 100. But for multiples of three print “Fizz” instead of the number and for the multiples of five print “Buzz”. For numbers which are multiples of both three and five print “FizzBuzz”.\\n\",\n    \"\\n\",\n    \"**Reverse a String** - Enter a string and the program will reverse it and print it out.\\n\",\n    \"\\n\",\n    \"**Pig Latin** - Pig Latin is a game of alterations played on the English language game. To create the Pig Latin form of an English word the initial consonant sound is transposed to the end of the word and an ay is affixed (Ex.: \\\"banana\\\" would yield anana-bay). Read Wikipedia for more information on rules.\\n\",\n    \"\\n\",\n    \"**Count Vowels** - Enter a string and the program counts the number of vowels in the text. For added complexity have it report a sum of each vowel found.\\n\",\n    \"\\n\",\n    \"**Check if Palindrome** - Checks if the string entered by the user is a palindrome. That is that it reads the same forwards as backwards like “racecar”\\n\",\n    \"\\n\",\n    \"**Count Words in a String** - Counts the number of individual words in a string. For added complexity read these strings in from a text file and generate a summary.\\n\",\n    \"\\n\",\n    \"**Text Editor** - Notepad style application that can open, edit, and save text documents. *Optional: Add syntax highlighting and other features.*\\n\",\n    \"\\n\",\n    \"**RSS Feed Creator** - Given a link to RSS/Atom Feed, get all posts and display them.\\n\",\n    \"\\n\",\n    \"**Quote Tracker (market symbols etc)** - A program which can go out and check the current value of stocks for a list of symbols entered by the user. The user can set how often the stocks are checked. For CLI, show whether the stock has moved up or down. *Optional: If GUI, the program can show green up and red down arrows to show which direction the stock value has moved.*\\n\",\n    \"\\n\",\n    \"**Guestbook / Journal** - A simple application that allows people to add comments or write journal entries. It can allow comments or not and timestamps for all entries. Could also be made into a shout box. *Optional: Deploy it on Google App Engine or Heroku or any other PaaS (if possible, of course).*\\n\",\n    \"\\n\",\n    \"**Vigenere / Vernam / Ceasar Ciphers** - Functions for encrypting and decrypting data messages. Then send them to a friend.\\n\",\n    \"\\n\",\n    \"**Regex Query Tool** - A tool that allows the user to enter a text string and then in a separate control enter a regex pattern. It will run the regular expression against the source text and return any matches or flag errors in the regular expression.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Networking\\n\",\n    \"---------\\n\",\n    \"\\n\",\n    \"**FTP Program** - A file transfer program which can transfer files back and forth from a remote web sever.\\n\",\n    \"\\n\",\n    \"**Bandwidth Monitor** - A small utility program that tracks how much data you have uploaded and downloaded from the net during the course of your current online session. See if you can find out what periods of the day you use more and less and generate a report or graph that shows it.\\n\",\n    \"\\n\",\n    \"**Port Scanner** - Enter an IP address and a port range where the program will then attempt to find open ports on the given computer by connecting to each of them. On any successful connections mark the port as open.\\n\",\n    \"\\n\",\n    \"**Mail Checker (POP3 / IMAP)** - The user enters various account information include web server and IP, protocol type (POP3 or IMAP) and the application will check for email at a given interval.\\n\",\n    \"\\n\",\n    \"**Country from IP Lookup** - Enter an IP address and find the country that IP is registered in. *Optional: Find the Ip automatically.*\\n\",\n    \"\\n\",\n    \"**Whois Search Tool** - Enter an IP or host address and have it look it up through whois and return the results to you.\\n\",\n    \"\\n\",\n    \"**Site Checker with Time Scheduling** - An application that attempts to connect to a website or server every so many minutes or a given time and check if it is up. If it is down, it will notify you by email or by posting a notice on screen.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Classes\\n\",\n    \"---------\\n\",\n    \"\\n\",\n    \"**Product Inventory Project** - Create an application which manages an inventory of products. Create a product class which has a price, id, and quantity on hand. Then create an *inventory* class which keeps track of various products and can sum up the inventory value.\\n\",\n    \"\\n\",\n    \"**Airline / Hotel Reservation System** - Create a reservation system which books airline seats or hotel rooms. It charges various rates for particular sections of the plane or hotel. Example, first class is going to cost more than coach. Hotel rooms have penthouse suites which cost more. Keep track of when rooms will be available and can be scheduled.\\n\",\n    \"\\n\",\n    \"**Company Manager** - Create an hierarchy of classes - abstract class Employee and subclasses HourlyEmployee, SalariedEmployee, Manager and Executive. Every one's pay is calculated differently, research a bit about it.\\n\",\n    \"After you've established an employee hierarchy, create a Company class that allows you to manage the employees. You should be able to hire, fire and raise employees. \\n\",\n    \"\\n\",\n    \"**Bank Account Manager** - Create a class called Account which will be an abstract class for three other classes called CheckingAccount, SavingsAccount and BusinessAccount. Manage credits and debits from these accounts through an ATM style program.\\n\",\n    \"\\n\",\n    \"**Patient / Doctor Scheduler** - Create a patient class and a doctor class. Have a doctor that can handle multiple patients and setup a scheduling program where a doctor can only handle 16 patients during an 8 hr work day.\\n\",\n    \"\\n\",\n    \"**Recipe Creator and Manager** - Create a recipe class with ingredients and a put them in a recipe manager program that organizes them into categories like deserts, main courses or by ingredients like chicken, beef, soups, pies etc.\\n\",\n    \"\\n\",\n    \"**Image Gallery** - Create an image abstract class and then a class that inherits from it for each image type. Put them in a program which displays them in a gallery style format for viewing.\\n\",\n    \"\\n\",\n    \"**Shape Area and Perimeter Classes** - Create an abstract class called Shape and then inherit from it other shapes like diamond, rectangle, circle, triangle etc. Then have each class override the area and perimeter functionality to handle each shape type.\\n\",\n    \"\\n\",\n    \"**Flower Shop Ordering To Go** - Create a flower shop application which deals in flower objects and use those flower objects in a bouquet object which can then be sold. Keep track of the number of objects and when you may need to order more.\\n\",\n    \"\\n\",\n    \"**Family Tree Creator** - Create a class called Person which will have a name, when they were born and when (and if) they died. Allow the user to create these Person classes and put them into a family tree structure. Print out the tree to the screen.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Threading\\n\",\n    \"---------\\n\",\n    \"\\n\",\n    \"**Create A Progress Bar for Downloads** - Create a progress bar for applications that can keep track of a download in progress. The progress bar will be on a separate thread and will communicate with the main thread using delegates.\\n\",\n    \"\\n\",\n    \"**Bulk Thumbnail Creator** - Picture processing can take a bit of time for some transformations. Especially if the image is large. Create an image program which can take hundreds of images and converts them to a specified size in the background thread while you do other things. For added complexity, have one thread handling re-sizing, have another bulk renaming of thumbnails etc.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Web\\n\",\n    \"---------\\n\",\n    \"\\n\",\n    \"**Page Scraper** - Create an application which connects to a site and pulls out all links, or images, and saves them to a list. *Optional: Organize the indexed content and don’t allow duplicates. Have it put the results into an easily searchable index file.*\\n\",\n    \"\\n\",\n    \"**Online White Board** - Create an application which allows you to draw pictures, write notes and use various colors to flesh out ideas for projects. *Optional: Add feature to invite friends to collaborate on a white board online.*\\n\",\n    \"\\n\",\n    \"**Get Atomic Time from Internet Clock** - This program will get the true atomic time from an atomic time clock on the Internet. Use any one of the atomic clocks returned by a simple Google search.\\n\",\n    \"\\n\",\n    \"**Fetch Current Weather** - Get the current weather for a given zip/postal code. *Optional: Try locating the user automatically.*\\n\",\n    \"\\n\",\n    \"**Scheduled Auto Login and Action** - Make an application which logs into a given site on a schedule and invokes a certain action and then logs out. This can be useful for checking web mail, posting regular content, or getting info for other applications and saving it to your computer.\\n\",\n    \"\\n\",\n    \"**E-Card Generator** - Make a site that allows people to generate their own little e-cards and send them to other people. Do not use Flash. Use a picture library and perhaps insightful mottos or quotes.\\n\",\n    \"\\n\",\n    \"**Content Management System** - Create a content management system (CMS) like Joomla, Drupal, PHP Nuke etc. Start small. *Optional: Allow for the addition of modules/addons.*\\n\",\n    \"\\n\",\n    \"**Web Board (Forum)** - Create a forum for you and your buddies to post, administer and share thoughts and ideas.\\n\",\n    \"\\n\",\n    \"**CAPTCHA Maker** - Ever see those images with letters a numbers when you signup for a service and then asks you to enter what you see? It keeps web bots from automatically signing up and spamming. Try creating one yourself for online forms.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Files\\n\",\n    \"---------\\n\",\n    \"\\n\",\n    \"**Quiz Maker** - Make an application which takes various questions from a file, picked randomly, and puts together a quiz for students. Each quiz can be different and then reads a key to grade the quizzes.\\n\",\n    \"\\n\",\n    \"**Sort Excel/CSV File Utility** - Reads a file of records, sorts them, and then writes them back to the file. Allow the user to choose various sort style and sorting based on a particular field.\\n\",\n    \"\\n\",\n    \"**Create Zip File Maker** - The user enters various files from different directories and the program zips them up into a zip file. *Optional: Apply actual compression to the files. Start with Huffman Algorithm.*\\n\",\n    \"\\n\",\n    \"**PDF Generator** - An application which can read in a text file, html file or some other file and generates a PDF file out of it. Great for a web based service where the user uploads the file and the program returns a PDF of the file. *Optional: Deploy on GAE or Heroku if possible.*\\n\",\n    \"\\n\",\n    \"**Mp3 Tagger** - Modify and add ID3v1 tags to MP3 files. See if you can also add in the album art into the MP3 file’s header as well as other ID3v2 tags.\\n\",\n    \"\\n\",\n    \"**Code Snippet Manager** - Another utility program that allows coders to put in functions, classes or other tidbits to save for use later. Organized by the type of snippet or language the coder can quickly look up code. *Optional: For extra practice try adding syntax highlighting based on the language.*\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Databases\\n\",\n    \"---------\\n\",\n    \"\\n\",\n    \"**SQL Query Analyzer** - A utility application which a user can enter a query and have it run against a local database and look for ways to make it more efficient.\\n\",\n    \"\\n\",\n    \"**Remote SQL Tool** - A utility that can execute queries on remote servers from your local computer across the Internet. It should take in a remote host, user name and password, run the query and return the results.\\n\",\n    \"\\n\",\n    \"**Report Generator** - Create a utility that generates a report based on some tables in a database. Generates a sales reports based on the order/order details tables or sums up the days current database activity.\\n\",\n    \"\\n\",\n    \"**Event Scheduler and Calendar** - Make an application which allows the user to enter a date and time of an event, event notes and then schedule those events on a calendar. The user can then browse the calendar or search the calendar for specific events. *Optional: Allow the application to create re-occurrence events that reoccur every day, week, month, year etc.*\\n\",\n    \"\\n\",\n    \"**Budget Tracker** - Write an application that keeps track of a household’s budget. The user can add expenses, income, and recurring costs to find out how much they are saving or losing over a period of time. *Optional: Allow the user to specify a date range and see the net flow of money in and out of the house budget for that time period.*\\n\",\n    \"\\n\",\n    \"**TV Show Tracker** - Got a favorite show you don’t want to miss? Don’t have a PVR or want to be able to find the show to then PVR it later? Make an application which can search various online TV Guide sites, locate the shows/times/channels and add them to a database application. The database/website then can send you email reminders that a show is about to start and which channel it will be on.\\n\",\n    \"\\n\",\n    \"**Travel Planner System** - Make a system that allows users to put together their own little travel itinerary and keep track of the airline / hotel arrangements, points of interest, budget and schedule.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Graphics and Multimedia\\n\",\n    \"---------\\n\",\n    \"\\n\",\n    \"**Slide Show** - Make an application that shows various pictures in a slide show format. *Optional: Try adding various effects like fade in/out, star wipe and window blinds transitions.*\\n\",\n    \"\\n\",\n    \"**Stream Video from Online** - Try to create your own online streaming video player.\\n\",\n    \"\\n\",\n    \"**Mp3 Player** - A simple program for playing your favorite music files. Add features you think are missing from your favorite music player.\\n\",\n    \"\\n\",\n    \"**Watermarking Application** - Have some pictures you want copyright protected? Add your own logo or text lightly across the background so that no one can simply steal your graphics off your site. Make a program that will add this watermark to the picture. *Optional: Use threading to process multiple images simultaneously.*\\n\",\n    \"\\n\",\n    \"**Turtle Graphics** - This is a common project where you create a floor of 20 x 20 squares. Using various commands you tell a turtle to draw a line on the floor. You have move forward, left or right, lift or drop pen etc. Do a search online for \\\"Turtle Graphics\\\" for more information. *Optional: Allow the program to read in the list of commands from a file.*\\n\",\n    \"\\n\",\n    \"**GIF Creator** A program that puts together multiple images (PNGs, JPGs, TIFFs) to make a smooth GIF that can be exported. *Optional: Make the program convert small video files to GIFs as well.*\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Security\\n\",\n    \"-------------\\n\",\n    \"\\n\",\n    \"**Caesar cipher** - Implement a Caesar cipher, both encoding and decoding. The key is an integer from 1 to 25. This cipher rotates the letters of the alphabet (A to Z). The encoding replaces each letter with the 1st to 25th next letter in the alphabet (wrapping Z to A). So key 2 encrypts \\\"HI\\\" to \\\"JK\\\", but key 20 encrypts \\\"HI\\\" to \\\"BC\\\". This simple \\\"monoalphabetic substitution cipher\\\" provides almost no security, because an attacker who has the encoded message can either use frequency analysis to guess the key, or just try all 25 keys\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "18-Milestone Project - 3/01-Final Capstone Project.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# Final Capstone Projects\\n\",\n    \"\\n\",\n    \"Please refer to the [**Final Capstone Projects**](http://nbviewer.jupyter.org/github/jmportilla/Complete-Python-Bootcamp/tree/master/Final%20Capstone%20Projects/) folder to get all the info on final capstone project ideas and possible solutions!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "18-Milestone Project - 3/02-Final Capstone Project Ideas.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# List of Capstone Projects\\n\",\n    \"\\n\",\n    \"This list contains around 100 project ideas for you to try out in Python! Some of them are straightforward and others we have done before (such as a Fibonacci Sequence or FizzBuzz). \\n\",\n    \"\\n\",\n    \"Pick a simple project that you think you can finish in a day to start off with, then pick another project that you think will take you more than a week and extensive Googling!\\n\",\n    \"\\n\",\n    \"There are some sample solutions in this folder as well so feel free to explore and remember:\\n\",\n    \"\\n\",\n    \"**HAVE FUN!**\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Numbers\\n\",\n    \"---------\\n\",\n    \"\\n\",\n    \"**Find PI to the Nth Digit** - Enter a number and have the program generate &pi; (pi) up to that many decimal places. Keep a limit to how far the program will go.\\n\",\n    \"\\n\",\n    \"**Find e to the Nth Digit** - Just like the previous problem, but with e instead of &pi; (pi). Enter a number and have the program generate e up to that many decimal places. Keep a limit to how far the program will go.\\n\",\n    \"\\n\",\n    \"**Fibonacci Sequence** - Enter a number and have the program generate the Fibonacci sequence to that number or to the Nth number.\\n\",\n    \"\\n\",\n    \"**Prime Factorization** - Have the user enter a number and find all Prime Factors (if there are any) and display them.\\n\",\n    \"\\n\",\n    \"**Next Prime Number** - Have the program find prime numbers until the user chooses to stop asking for the next one.\\n\",\n    \"\\n\",\n    \"**Find Cost of Tile to Cover W x H Floor** - Calculate the total cost of tile it would take to cover a floor plan of width and height, using a cost entered by the user.\\n\",\n    \"\\n\",\n    \"**Mortgage Calculator** - Calculate the monthly payments of a fixed term mortgage over given Nth terms at a given interest rate. Also figure out how long it will take the user to pay back the loan. For added complexity, add an option for users to select the compounding interval (Monthly, Weekly, Daily, Continually).\\n\",\n    \"\\n\",\n    \"**Change Return Program** - The user enters a cost and then the amount of money given. The program will figure out the change and the number of quarters, dimes, nickels, pennies needed for the change.\\n\",\n    \"\\n\",\n    \"**Binary to Decimal and Back Converter** - Develop a converter to convert a decimal number to binary or a binary number to its decimal equivalent.\\n\",\n    \"\\n\",\n    \"**Calculator** - A simple calculator to do basic operators. Make it a scientific calculator for added complexity.\\n\",\n    \"\\n\",\n    \"**Unit Converter (temp, currency, volume, mass and more)** - Converts various units between one another. The user enters the type of unit being entered, the type of unit they want to convert to and then the value. The program will then make the conversion.\\n\",\n    \"\\n\",\n    \"**Alarm Clock** - A simple clock where it plays a sound after X number of minutes/seconds or at a particular time.\\n\",\n    \"\\n\",\n    \"**Distance Between Two Cities** - Calculates the distance between two cities and allows the user to specify a unit of distance. This program may require finding coordinates for the cities like latitude and longitude.\\n\",\n    \"\\n\",\n    \"**Credit Card Validator** - Takes in a credit card number from a common credit card vendor (Visa, MasterCard, American Express, Discoverer) and validates it to make sure that it is a valid number (look into how credit cards use a checksum).\\n\",\n    \"\\n\",\n    \"**Tax Calculator** - Asks the user to enter a cost and either a country or state tax. It then returns the tax plus the total cost with tax.\\n\",\n    \"\\n\",\n    \"**Factorial Finder** - The Factorial of a positive integer, n, is defined as the product of the sequence n, n-1, n-2, ...1 and the factorial of zero, 0, is defined as being 1. Solve this using both loops and recursion.\\n\",\n    \"\\n\",\n    \"**Complex Number Algebra** - Show addition, multiplication, negation, and inversion of complex numbers in separate functions. (Subtraction and division operations can be made with pairs of these operations.) Print the results for each operation tested.\\n\",\n    \"\\n\",\n    \"**Happy Numbers** - A happy number is defined by the following process. Starting with any positive integer, replace the number by the sum of the squares of its digits, and repeat the process until the number equals 1 (where it will stay), or it loops endlessly in a cycle which does not include 1. Those numbers for which this process ends in 1 are happy numbers, while those that do not end in 1 are unhappy numbers. Display an example of your output here. Find first 8 happy numbers.\\n\",\n    \"\\n\",\n    \"**Number Names** - Show how to spell out a number in English. You can use a preexisting implementation or roll your own, but you should support inputs up to at least one million (or the maximum value of your language's default bounded integer type, if that's less). *Optional: Support for inputs other than positive integers (like zero, negative integers, and floating-point numbers).*\\n\",\n    \"\\n\",\n    \"**Coin Flip Simulation** - Write some code that simulates flipping a single coin however many times the user decides. The code should record the outcomes and count the number of tails and heads.\\n\",\n    \"\\n\",\n    \"**Limit Calculator** - Ask the user to enter f(x) and the limit value, then return the value of the limit statement *Optional: Make the calculator capable of supporting infinite limits.*\\n\",\n    \"\\n\",\n    \"**Fast Exponentiation** - Ask the user to enter 2 integers a and b and output a^b (i.e. pow(a,b)) in O(lg n) time complexity.\\n\",\n    \"\\n\",\n    \"Classic Algorithms\\n\",\n    \"-----------------\\n\",\n    \"\\n\",\n    \"**Collatz Conjecture** - Start with a number *n > 1*. Find the number of steps it takes to reach one using the following process: If *n* is even, divide it by 2. If *n* is odd, multiply it by 3 and add 1.\\n\",\n    \"\\n\",\n    \"**Sorting** - Implement two types of sorting algorithms: Merge sort and bubble sort.\\n\",\n    \"\\n\",\n    \"**Closest pair problem** - The closest pair of points problem or closest pair problem is a problem of computational geometry: given *n* points in metric space, find a pair of points with the smallest distance between them.\\n\",\n    \"\\n\",\n    \"**Sieve of Eratosthenes** - The sieve of Eratosthenes is one of the most efficient ways to find all of the smaller primes (below 10 million or so).\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Graph\\n\",\n    \"--------\\n\",\n    \"\\n\",\n    \"**Graph from links** - Create a program that will create a graph or network from a series of links.\\n\",\n    \"\\n\",\n    \"**Eulerian Path** - Create a program which will take as an input a graph and output either a Eulerian path or a Eulerian cycle, or state that it is not possible.  A Eulerian Path starts at one node and traverses every edge of a graph  through every node and finishes at another node.  A Eulerian cycle is a eulerian Path that starts and finishes at the same node.\\n\",\n    \"\\n\",\n    \"**Connected Graph** - Create a program which takes a graph as an input and outputs whether every node is connected or not.\\n\",\n    \"\\n\",\n    \"**Dijkstra’s Algorithm** - Create a program that finds the shortest path through a graph using its edges.\\n\",\n    \"\\n\",\n    \"**Minimum Spanning Tree** - Create a program which takes a connected, undirected graph with weights and outputs the minimum spanning tree of the graph i.e., a\\n\",\n    \"subgraph that is a tree, contains all the vertices, and the sum of its weights is the least possible.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Data Structures\\n\",\n    \"---------\\n\",\n    \"\\n\",\n    \"**Inverted index** - An [Inverted Index](http://en.wikipedia.org/wiki/Inverted_index) is a data structure used to create full text search. Given a set of text files, implement a program to create an inverted index. Also create a user interface to do a search using that inverted index which returns a list of files that contain the query term / terms. The search index can be in memory.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Text\\n\",\n    \"---------\\n\",\n    \"\\n\",\n    \"**Fizz Buzz** - Write a program that prints the numbers from 1 to 100. But for multiples of three print “Fizz” instead of the number and for the multiples of five print “Buzz”. For numbers which are multiples of both three and five print “FizzBuzz”.\\n\",\n    \"\\n\",\n    \"**Reverse a String** - Enter a string and the program will reverse it and print it out.\\n\",\n    \"\\n\",\n    \"**Pig Latin** - Pig Latin is a game of alterations played on the English language game. To create the Pig Latin form of an English word the initial consonant sound is transposed to the end of the word and an ay is affixed (Ex.: \\\"banana\\\" would yield anana-bay). Read Wikipedia for more information on rules.\\n\",\n    \"\\n\",\n    \"**Count Vowels** - Enter a string and the program counts the number of vowels in the text. For added complexity have it report a sum of each vowel found.\\n\",\n    \"\\n\",\n    \"**Check if Palindrome** - Checks if the string entered by the user is a palindrome. That is that it reads the same forwards as backwards like “racecar”\\n\",\n    \"\\n\",\n    \"**Count Words in a String** - Counts the number of individual words in a string. For added complexity read these strings in from a text file and generate a summary.\\n\",\n    \"\\n\",\n    \"**Text Editor** - Notepad style application that can open, edit, and save text documents. *Optional: Add syntax highlighting and other features.*\\n\",\n    \"\\n\",\n    \"**RSS Feed Creator** - Given a link to RSS/Atom Feed, get all posts and display them.\\n\",\n    \"\\n\",\n    \"**Quote Tracker (market symbols etc)** - A program which can go out and check the current value of stocks for a list of symbols entered by the user. The user can set how often the stocks are checked. For CLI, show whether the stock has moved up or down. *Optional: If GUI, the program can show green up and red down arrows to show which direction the stock value has moved.*\\n\",\n    \"\\n\",\n    \"**Guestbook / Journal** - A simple application that allows people to add comments or write journal entries. It can allow comments or not and timestamps for all entries. Could also be made into a shout box. *Optional: Deploy it on Google App Engine or Heroku or any other PaaS (if possible, of course).*\\n\",\n    \"\\n\",\n    \"**Vigenere / Vernam / Ceasar Ciphers** - Functions for encrypting and decrypting data messages. Then send them to a friend.\\n\",\n    \"\\n\",\n    \"**Regex Query Tool** - A tool that allows the user to enter a text string and then in a separate control enter a regex pattern. It will run the regular expression against the source text and return any matches or flag errors in the regular expression.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Networking\\n\",\n    \"---------\\n\",\n    \"\\n\",\n    \"**FTP Program** - A file transfer program which can transfer files back and forth from a remote web sever.\\n\",\n    \"\\n\",\n    \"**Bandwidth Monitor** - A small utility program that tracks how much data you have uploaded and downloaded from the net during the course of your current online session. See if you can find out what periods of the day you use more and less and generate a report or graph that shows it.\\n\",\n    \"\\n\",\n    \"**Port Scanner** - Enter an IP address and a port range where the program will then attempt to find open ports on the given computer by connecting to each of them. On any successful connections mark the port as open.\\n\",\n    \"\\n\",\n    \"**Mail Checker (POP3 / IMAP)** - The user enters various account information include web server and IP, protocol type (POP3 or IMAP) and the application will check for email at a given interval.\\n\",\n    \"\\n\",\n    \"**Country from IP Lookup** - Enter an IP address and find the country that IP is registered in. *Optional: Find the Ip automatically.*\\n\",\n    \"\\n\",\n    \"**Whois Search Tool** - Enter an IP or host address and have it look it up through whois and return the results to you.\\n\",\n    \"\\n\",\n    \"**Site Checker with Time Scheduling** - An application that attempts to connect to a website or server every so many minutes or a given time and check if it is up. If it is down, it will notify you by email or by posting a notice on screen.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Classes\\n\",\n    \"---------\\n\",\n    \"\\n\",\n    \"**Product Inventory Project** - Create an application which manages an inventory of products. Create a product class which has a price, id, and quantity on hand. Then create an *inventory* class which keeps track of various products and can sum up the inventory value.\\n\",\n    \"\\n\",\n    \"**Airline / Hotel Reservation System** - Create a reservation system which books airline seats or hotel rooms. It charges various rates for particular sections of the plane or hotel. Example, first class is going to cost more than coach. Hotel rooms have penthouse suites which cost more. Keep track of when rooms will be available and can be scheduled.\\n\",\n    \"\\n\",\n    \"**Company Manager** - Create an hierarchy of classes - abstract class Employee and subclasses HourlyEmployee, SalariedEmployee, Manager and Executive. Every one's pay is calculated differently, research a bit about it.\\n\",\n    \"After you've established an employee hierarchy, create a Company class that allows you to manage the employees. You should be able to hire, fire and raise employees. \\n\",\n    \"\\n\",\n    \"**Bank Account Manager** - Create a class called Account which will be an abstract class for three other classes called CheckingAccount, SavingsAccount and BusinessAccount. Manage credits and debits from these accounts through an ATM style program.\\n\",\n    \"\\n\",\n    \"**Patient / Doctor Scheduler** - Create a patient class and a doctor class. Have a doctor that can handle multiple patients and setup a scheduling program where a doctor can only handle 16 patients during an 8 hr work day.\\n\",\n    \"\\n\",\n    \"**Recipe Creator and Manager** - Create a recipe class with ingredients and a put them in a recipe manager program that organizes them into categories like deserts, main courses or by ingredients like chicken, beef, soups, pies etc.\\n\",\n    \"\\n\",\n    \"**Image Gallery** - Create an image abstract class and then a class that inherits from it for each image type. Put them in a program which displays them in a gallery style format for viewing.\\n\",\n    \"\\n\",\n    \"**Shape Area and Perimeter Classes** - Create an abstract class called Shape and then inherit from it other shapes like diamond, rectangle, circle, triangle etc. Then have each class override the area and perimeter functionality to handle each shape type.\\n\",\n    \"\\n\",\n    \"**Flower Shop Ordering To Go** - Create a flower shop application which deals in flower objects and use those flower objects in a bouquet object which can then be sold. Keep track of the number of objects and when you may need to order more.\\n\",\n    \"\\n\",\n    \"**Family Tree Creator** - Create a class called Person which will have a name, when they were born and when (and if) they died. Allow the user to create these Person classes and put them into a family tree structure. Print out the tree to the screen.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Threading\\n\",\n    \"---------\\n\",\n    \"\\n\",\n    \"**Create A Progress Bar for Downloads** - Create a progress bar for applications that can keep track of a download in progress. The progress bar will be on a separate thread and will communicate with the main thread using delegates.\\n\",\n    \"\\n\",\n    \"**Bulk Thumbnail Creator** - Picture processing can take a bit of time for some transformations. Especially if the image is large. Create an image program which can take hundreds of images and converts them to a specified size in the background thread while you do other things. For added complexity, have one thread handling re-sizing, have another bulk renaming of thumbnails etc.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Web\\n\",\n    \"---------\\n\",\n    \"\\n\",\n    \"**Page Scraper** - Create an application which connects to a site and pulls out all links, or images, and saves them to a list. *Optional: Organize the indexed content and don’t allow duplicates. Have it put the results into an easily searchable index file.*\\n\",\n    \"\\n\",\n    \"**Online White Board** - Create an application which allows you to draw pictures, write notes and use various colors to flesh out ideas for projects. *Optional: Add feature to invite friends to collaborate on a white board online.*\\n\",\n    \"\\n\",\n    \"**Get Atomic Time from Internet Clock** - This program will get the true atomic time from an atomic time clock on the Internet. Use any one of the atomic clocks returned by a simple Google search.\\n\",\n    \"\\n\",\n    \"**Fetch Current Weather** - Get the current weather for a given zip/postal code. *Optional: Try locating the user automatically.*\\n\",\n    \"\\n\",\n    \"**Scheduled Auto Login and Action** - Make an application which logs into a given site on a schedule and invokes a certain action and then logs out. This can be useful for checking web mail, posting regular content, or getting info for other applications and saving it to your computer.\\n\",\n    \"\\n\",\n    \"**E-Card Generator** - Make a site that allows people to generate their own little e-cards and send them to other people. Do not use Flash. Use a picture library and perhaps insightful mottos or quotes.\\n\",\n    \"\\n\",\n    \"**Content Management System** - Create a content management system (CMS) like Joomla, Drupal, PHP Nuke etc. Start small. *Optional: Allow for the addition of modules/addons.*\\n\",\n    \"\\n\",\n    \"**Web Board (Forum)** - Create a forum for you and your buddies to post, administer and share thoughts and ideas.\\n\",\n    \"\\n\",\n    \"**CAPTCHA Maker** - Ever see those images with letters a numbers when you signup for a service and then asks you to enter what you see? It keeps web bots from automatically signing up and spamming. Try creating one yourself for online forms.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Files\\n\",\n    \"---------\\n\",\n    \"\\n\",\n    \"**Quiz Maker** - Make an application which takes various questions from a file, picked randomly, and puts together a quiz for students. Each quiz can be different and then reads a key to grade the quizzes.\\n\",\n    \"\\n\",\n    \"**Sort Excel/CSV File Utility** - Reads a file of records, sorts them, and then writes them back to the file. Allow the user to choose various sort style and sorting based on a particular field.\\n\",\n    \"\\n\",\n    \"**Create Zip File Maker** - The user enters various files from different directories and the program zips them up into a zip file. *Optional: Apply actual compression to the files. Start with Huffman Algorithm.*\\n\",\n    \"\\n\",\n    \"**PDF Generator** - An application which can read in a text file, html file or some other file and generates a PDF file out of it. Great for a web based service where the user uploads the file and the program returns a PDF of the file. *Optional: Deploy on GAE or Heroku if possible.*\\n\",\n    \"\\n\",\n    \"**Mp3 Tagger** - Modify and add ID3v1 tags to MP3 files. See if you can also add in the album art into the MP3 file’s header as well as other ID3v2 tags.\\n\",\n    \"\\n\",\n    \"**Code Snippet Manager** - Another utility program that allows coders to put in functions, classes or other tidbits to save for use later. Organized by the type of snippet or language the coder can quickly look up code. *Optional: For extra practice try adding syntax highlighting based on the language.*\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Databases\\n\",\n    \"---------\\n\",\n    \"\\n\",\n    \"**SQL Query Analyzer** - A utility application which a user can enter a query and have it run against a local database and look for ways to make it more efficient.\\n\",\n    \"\\n\",\n    \"**Remote SQL Tool** - A utility that can execute queries on remote servers from your local computer across the Internet. It should take in a remote host, user name and password, run the query and return the results.\\n\",\n    \"\\n\",\n    \"**Report Generator** - Create a utility that generates a report based on some tables in a database. Generates a sales reports based on the order/order details tables or sums up the days current database activity.\\n\",\n    \"\\n\",\n    \"**Event Scheduler and Calendar** - Make an application which allows the user to enter a date and time of an event, event notes and then schedule those events on a calendar. The user can then browse the calendar or search the calendar for specific events. *Optional: Allow the application to create re-occurrence events that reoccur every day, week, month, year etc.*\\n\",\n    \"\\n\",\n    \"**Budget Tracker** - Write an application that keeps track of a household’s budget. The user can add expenses, income, and recurring costs to find out how much they are saving or losing over a period of time. *Optional: Allow the user to specify a date range and see the net flow of money in and out of the house budget for that time period.*\\n\",\n    \"\\n\",\n    \"**TV Show Tracker** - Got a favorite show you don’t want to miss? Don’t have a PVR or want to be able to find the show to then PVR it later? Make an application which can search various online TV Guide sites, locate the shows/times/channels and add them to a database application. The database/website then can send you email reminders that a show is about to start and which channel it will be on.\\n\",\n    \"\\n\",\n    \"**Travel Planner System** - Make a system that allows users to put together their own little travel itinerary and keep track of the airline / hotel arrangements, points of interest, budget and schedule.\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Graphics and Multimedia\\n\",\n    \"---------\\n\",\n    \"\\n\",\n    \"**Slide Show** - Make an application that shows various pictures in a slide show format. *Optional: Try adding various effects like fade in/out, star wipe and window blinds transitions.*\\n\",\n    \"\\n\",\n    \"**Stream Video from Online** - Try to create your own online streaming video player.\\n\",\n    \"\\n\",\n    \"**Mp3 Player** - A simple program for playing your favorite music files. Add features you think are missing from your favorite music player.\\n\",\n    \"\\n\",\n    \"**Watermarking Application** - Have some pictures you want copyright protected? Add your own logo or text lightly across the background so that no one can simply steal your graphics off your site. Make a program that will add this watermark to the picture. *Optional: Use threading to process multiple images simultaneously.*\\n\",\n    \"\\n\",\n    \"**Turtle Graphics** - This is a common project where you create a floor of 20 x 20 squares. Using various commands you tell a turtle to draw a line on the floor. You have move forward, left or right, lift or drop pen etc. Do a search online for \\\"Turtle Graphics\\\" for more information. *Optional: Allow the program to read in the list of commands from a file.*\\n\",\n    \"\\n\",\n    \"**GIF Creator** A program that puts together multiple images (PNGs, JPGs, TIFFs) to make a smooth GIF that can be exported. *Optional: Make the program convert small video files to GIFs as well.*\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Security\\n\",\n    \"-------------\\n\",\n    \"\\n\",\n    \"**Caesar cipher** - Implement a Caesar cipher, both encoding and decoding. The key is an integer from 1 to 25. This cipher rotates the letters of the alphabet (A to Z). The encoding replaces each letter with the 1st to 25th next letter in the alphabet (wrapping Z to A). So key 2 encrypts \\\"HI\\\" to \\\"JK\\\", but key 20 encrypts \\\"HI\\\" to \\\"BC\\\". This simple \\\"monoalphabetic substitution cipher\\\" provides almost no security, because an attacker who has the encoded message can either use frequency analysis to guess the key, or just try all 25 keys\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "18-Milestone Project - 3/Projects-Solutions/Solution Links.md",
    "content": "This repo links to solutions of [Projects](http://nbviewer.ipython.org/github/jmportilla/Complete-Python-Bootcamp/blob/master/Final%20Capstone%20Projects/Final%20Capstone%20Project%20Ideas.ipynb) written by other users in Python.\n=========================================\n\nNumbers\n---------\n\n**Find PI to the Nth Digit** - Enter a number and have the program generate PI up to that many decimal places. Keep a limit to how far the program will go. [[geekpradd (Python)]](https://github.com/geekpradd/PythonPi/blob/master/PythonPi.py)\n[[MrBlaise (Python)]](https://github.com/MrBlaise/learnpython/blob/master/Numbers/pi.py) [[whoshuu (Python)]](https://github.com/whoshuu/Projects/blob/master/Numbers/pi.py) \n\n**Find e to the Nth Digit** - Just like the previous problem, but with e instead of PI. Enter a number and have the program generate e up to that many decimal places. Keep a limit to how far the program will go. [[aseeon (Python)]](https://gist.github.com/aseeon/3f06d95f995fde7adfc2) \n[[rlingineni (Python)]](https://github.com/rlingineni/PythonPractice/blob/master/eCalc/eCalculate.py)\n\n\n**Fibonacci Sequence** - Enter a number and have the program generate the Fibonacci sequence to that number or to the Nth number. [[MrBlaise (Python)]](https://github.com/MrBlaise/learnpython/blob/master/Numbers/fibonacci.py) [[timkaboya (Python)]](https://github.com/timkaboya/cached_fibo/blob/master/cached_fibo.py) [[whoshuu (Python)]](https://github.com/whoshuu/Projects/blob/master/Numbers/fibonacci.py) \n\n**Prime Factorization** - Have the user enter a number and find all Prime Factors (if there are any) and display them.\n\n[[geekpradd (Python)]](https://github.com/geekpradd/Prime-Factorise/blob/master/primefactorize.py)\n[[MrBlaise (Python)]](https://github.com/MrBlaise/learnpython/blob/master/Numbers/prime.py) [[whoshuu (Python)]](https://github.com/whoshuu/Projects/blob/master/Numbers/prime.py) \n\n**Next Prime Number** - Have the program find prime numbers until the user chooses to stop asking for the next one. [[MrBlaise (Python)]](https://github.com/MrBlaise/learnpython/blob/master/Numbers/next_prime.py) [[Silverneo (Python)]](https://github.com/Silverneo/pylearn/blob/master/prime.py)\n\n**Find Cost of Tile to Cover W x H Floor** - Calculate the total cost of tile it would take to cover a floor plan of width and height, using a cost entered by the user. [[Drhealsgood (Python)]](https://github.com/Drhealsgood/miniprojects/blob/master/number_projects/other/misc.py)\n\n**Mortgage Calculator** - Calculate the monthly payments of a fixed term mortgage over given Nth terms at a given interest rate. Also figure out how long it will take the user to pay back the loan. For added complexity, add an option for users to select the compounding interval (Monthly, Weekly, Daily, Continually).  [[austinmcconnell]](Python)]](https://github.com/austinmcconnell/mortgage) \n\n**Change Return Program** - The user enters a cost and then the amount of money given. The program will figure out the change and the number of quarters, dimes, nickels, pennies needed for the change. [[Drhealsgood (Python)]](https://github.com/Drhealsgood/miniprojects/blob/master/number_projects/money_changing/money_changing.py) \n\n**Binary to Decimal and Back Converter** - Develop a converter to convert a decimal number to binary or a binary number to its decimal equivalent. [[Drhealsgood (Python)]](https://github.com/Drhealsgood/miniprojects/blob/master/number_projects/conversion/conversions.py) \n\n**Calculator** - A simple calculator to do basic operators. Make it a scientific calculator for added complexity. [[MrBlaise (Python)]](https://github.com/MrBlaise/learnpython/blob/master/Numbers/calc.py) \n\n**Unit Converter (temp, currency, volume, mass and more)** - Converts various units between one another. The user enters the type of unit being entered, the type of unit they want to convert to and then the value. The program will then make the conversion. [[Drhealsgood (Python)]](https://github.com/Drhealsgood/miniprojects/blob/master/number_projects/conversion/conversions.py) \n\n**Alarm Clock** - A simple clock where it plays a sound after X number of minutes/seconds or at a particular time. [[smthc (Python)]](https://github.com/smthc/mini_projects/blob/master/alarm.py) \n\n\n**Distance Between Two Cities** - Calculates the distance between two cities and allows the user to specify a unit of distance. This program may require finding coordinates for the cities like latitude and longitude.  [[dabillox (Python)]](https://github.com/dabillox/pyprojects/blob/master/citydistance.py) \n\n**Credit Card Validator** - Takes in a credit card number from a common credit card vendor (Visa, MasterCard, American Express, Discover) and validates it to make sure that it is a valid number (look into how credit cards use a checksum). [[Barvin (Python)]](https://github.com/Barvin/CodeWars-ByArvin/blob/master/TheLuhnAlgorithm.py) \n\n**Tax Calculator** - Asks the user to enter a cost and either a country or state tax. It then returns the tax plus the total cost with tax.\n [[neivin (Python)]](https://github.com/neivin/projects/blob/master/numbers/tax_calculator.py)[[Vdrey (Python)]](https://github.com/vdrey/Project-Programs/blob/master/Python/Tax%20Calculator.py) \n\n**Factorial Finder** - The factorial of a positive integer *n* is defined as the product of the sequence , n-1, n-2, ...1 and the factorial of 0 is defined as being 1. Solve this using both loops and recursion.  [[turlapatykaushik(Python)]](https://github.com/turlapatykaushik/Programs-and-codes/blob/master/problems/factorial.py) [[kvsingh (Python)]](https://github.com/kvsingh/python-practice/blob/master/factorial.py)\n\n**Complex Number Algebra** - Show addition, multiplication, negation, and inversion of complex numbers in separate functions. (Subtraction and division operations can be made with pairs of these operations.) Print the results for each operation tested. [[ppype (python)]](https://github.com/ppype/Complex-Number-Algebra/blob/master/programs/main.py) \n\n**Happy Numbers** - A happy number is defined by the following process. Starting with any positive integer, replace the number by the sum of the squares of its digits, and repeat the process until the number equals 1 (where it will stay), or it loops endlessly in a cycle which does not include 1. Those numbers for which this process ends in 1 are happy numbers, while those that do not end in 1 are unhappy numbers. Display an example of your output here. Find first 8 happy numbers. [[Quoly (Python)]](https://github.com/Quoly/Projects/blob/master/happy_numbers.py) [[tel (Haskell)]](https://github.com/tel/Projects/blob/master/Numbers/HappyNumbers.hs) \n\n**Number Names** - Show how to spell out a number in English. You can use a preexisting implementation or roll your own, but you should support inputs up to at least one million (or the maximum value of your language's default bounded integer type, if that's less). *Optional: Support for inputs other than positive integers (like zero, negative integers, and floating-point numbers).*  [[scottdchris (Python)]](https://github.com/scottdchris/NumToWords) \n\n**Coin Flip Simulation** - Write some code that simulates flipping a single coin however many times the user decides. The code should record the outcomes and count the number of tails and heads. [[scottdchris (Python)]](https://github.com/scottdchris/CoinFlip)  [[dsub15 (Python)]](https://github.com/dsub15/Projects/blob/master/Coin_flip.py)\n\n**Fast Exponentiation** - Ask the user to enter 2 integers a and b and output a^b (i.e. pow(a,b)) in O(lg n) time complexity. [[korabum (Python)]](https://github.com/korabum/Projects/blob/master/Numbers/power.py)\n\nClassic Algorithms\n-----------------\n\n**Collatz Conjecture** - Start with a number *n > 1*. Find the number of steps it takes to reach one using the following process: If *n* is even, divide it by 2. If *n* is odd, multiply it by 3 and add 1. [[EpicDavi (Python)]](https://github.com/EpicDavi/RandomProjects/blob/master/Language%20Challenge%20Stuff/CollatzRecursive.py) [[francis36012 (Python)]](https://github.com/francis36012/karan-projects/blob/master/src/classic_algorithms/collatz.py)  [[viktorahlstrom (Python)]](https://github.com/viktorahlstrom/pythonscripts/blob/master/collatz_conjecture.py)\n\n**Sorting** - Implement two types of sorting algorithms: Merge sort and bubble sort [[petehuang (Ruby)]](https://github.com/petehuang/Projects/blob/master/Classic%20Algorithms/sorting.rb) [[sananth12 (C)]](https://github.com/sananth12/Projects/blob/master/Classic%20Algorithms/Sorting.c) [[liuyang1 (Python)]](https://github.com/liuyang1/Projects/blob/master/Classic%20Algorithms/mergesort.py) [[ScottKolo (Go)]](https://github.com/ScottKolo/GoProjects/blob/master/Classic%20Algorithms/sorting.go)\n[[checkcheckzz (C++)]](https://github.com/checkcheckzz/coding-problem/blob/master/problem/Sorting.cpp) [[yasaswyk (C++)]](https://github.com/yasaswyk/Projects-Solutions/blob/mysolutions/Sorting/sort.cc) [[turlapatykaushik (C)]](https://github.com/turlapatykaushik/DataStructures-and-Algorithms-Implementation/tree/master/sorting)[[smac89 (haskell)]](https://gist.github.com/smac89/656240fea116f8230351) [[sijunhe (java)]](https://github.com/sijunhe/Project-Programs/blob/master/java/sort.java)\n\n**Closest pair problem** - The closest pair of points problem or closest pair problem is a problem of computational geometry: given *n* points in metric space, find a pair of points with the smallest distance between them. [[dabillox (Python)]](https://github.com/dabillox/pyprojects/blob/master/closestpairproblem.py) [[liuyang1 (Python)]](https://github.com/liuyang1/Projects/blob/master/Classic%20Algorithms/cloestpair.py) [[smac89 (C++)]](https://github.com/smac89/Projects/tree/master/solutions/classic-algorithms/closestpair) [[sijunhe (java)]](https://github.com/sijunhe/Project-Programs/tree/master/java/closest%20Pair)\n\n**Sieve of Eratosthenes** - The sieve of Eratosthenes is one of the most efficient ways to find all of the smaller primes (below 10 million or so). [[swapagarwal (Python)]](https://github.com/swapagarwal/Projects/blob/master/Classic%20Algorithms/Sieve%20of%20Eratosthenes.py) [[quitrk (JavaScript)]](https://github.com/quitrk/LearningJS/blob/master/Classic%20Algorithms/03.%20Sieve%20of%20Eratosthenes.js) [[liuyang1 (Python)]](https://github.com/liuyang1/Projects/blob/master/Classic%20Algorithms/sieve.py) [[ScottKolo (Go)]](https://github.com/ScottKolo/GoProjects/blob/master/Classic%20Algorithms/sieve.go) [[danfang (Java)]](https://github.com/danfang/Algorithms/blob/master/src/problem35/SieveEratosthenes.java) [[checkcheckzz (C++)]](https://github.com/checkcheckzz/coding-problem/blob/master/problem/SieveofEratosthenes.cpp) [[gautamk (rust)]](https://github.com/gautamk/ferrous-oxide/blob/master/projects/src/sieve_of_eratosthenes.rs) [[korabum (Python)]](https://github.com/korabum/Projects/blob/master/Classic-Algorithms/sieveOfEratosthenes.py)\n\nGraphs\n---------\n\n**Graph from links** - Create a program that will create a graph or network from a series of links.[[grimley517 (Python)]](https://github.com/grimley517/Projects/blob/graph1/Graphs/GfmLinks.py)[\n\n**Eulerian Path** - Create a program which will take as an input a graph and output either a Eulerian path or a Eulerian cycle, or state that it is not possible.  A Eulerian Path starts at one node and traverses every edge of a graph  through every node and finishes at another node.  A Eulerian cycle is a eulerian Path that starts and finishes at the same node.\n[[DiegoAscanio(Python)]](https://github.com/DiegoAscanio/python-graphs/blob/master/eulerian.py)\n\n**Connected Graph** - Create a program which takes a graph as an input and outputs whether every node is connected or not.[[DiegoAscanio(Python)]](https://github.com/DiegoAscanio/python-graphs/blob/master/is_connected.py)\n\n**Dijkstra’s Algorithm** - Create a program that finds the shortest path through a graph using its edges. [[mouradmourafiq (Python)]](https://github.com/mouradmourafiq/data-analysis/blob/master/dijkstra.py)\n\n**Minimum Spanning Tree** - Create a program which takes a connected, undirected graph with weights and outputs the minimum spanning tree of the graph i.e., a\nsubgraph that is a tree, contains all the vertices, and the sum of its weights is the least possible. [[kiriakosv (Python)]](https://github.com/kiriakosv/Project_Solutions/tree/master/MinSpanTree)\n\nData Structures\n---------\n\n**Inverted index** - An [Inverted Index](http://en.wikipedia.org/wiki/Inverted_index) is a data structure used to create full text search. Given a set of text files, implement a program to create an inverted index. Also create a user interface to do a search using that inverted index which returns a list of files that contain the query term / terms. The search index can be in memory. [[anubhavmaity (Python)]](https://github.com/anubhavmaity/FindWordInFiles)\n\nText\n---------\n\n**Fizz Buzz** - Write a program that prints the numbers from 1 to 100. But for multiples of three print “Fizz” instead of the number and for the multiples of five print “Buzz”. For numbers which are multiples of both three and five print “FizzBuzz”.\n[[korabum (Python)]](https://github.com/korabum/Projects/blob/master/Text/fizzbuzz.py)\n\n**Reverse a String** - Enter a string and the program will reverse it and print it out. [[Drhealsgood (Python)]](https://github.com/Drhealsgood/miniprojects/blob/master/text_projects/string_editing.py) [[JLukeC (Python)]](https://github.com/jLukeC/mega-project-list/blob/master/python/reverse_string.py) \n\n**Pig Latin** - Pig Latin is a game of alterations played on the English language game. To create the Pig Latin form of an English word the initial consonant sound is transposed to the end of the word and an ay is affixed (Ex.: \"banana\" would yield anana-bay). Read Wikipedia for more information on rules. [[Drhealsgood (Python)]](https://github.com/Drhealsgood/miniprojects/blob/master/text_projects/string_editing.py) [[JLukeC (Python)]](https://github.com/jLukeC/mega-project-list/blob/master/python/pig_latin.py) \n\n**Count Vowels** - Enter a string and the program counts the number of vowels in the text. For added complexity have it report a sum of each vowel found. [[Drhealsgood (Python)]](https://github.com/Drhealsgood/miniprojects/blob/master/text_projects/string_editing.py) [[JLukeC (Python)]](https://github.com/jLukeC/mega-project-list/blob/master/python/count_vowels.py) \n\n**Check if Palindrome** - Checks if the string entered by the user is a palindrome. That is that it reads the same forwards as backwards like “racecar” [[Drhealsgood (Python)]](https://github.com/Drhealsgood/miniprojects/blob/master/text_projects/string_editing.py) [[JLukeC (Python)]](https://github.com/jLukeC/mega-project-list/blob/master/python/palindrome.py) \n\n**Count Words in a String** - Counts the number of individual words in a string. For added complexity read these strings in from a text file and generate a summary. [[Drhealsgood (Python)]](https://github.com/Drhealsgood/miniprojects/blob/master/text_projects/string_editing.py) [[JLukeC (Python)]](https://github.com/jLukeC/mega-project-list/blob/master/python/count_words.py) \n\n**Text Editor** - Notepad style application that can open, edit, and save text documents. *Optional: Add syntax highlighting and other features.* [[JLukeC (Python)]](https://github.com/jLukeC/advanced-text-editor) [[rasppie (Python)]](https://github.com/rasppie/Text_Editor/blob/master/texteditor.py)\n\n**RSS Feed Creator** - Given a link to RSS/Atom Feed, get all posts and display them. [[sriniavireddy (python)]](https://github.com/sriniavireddy/scripts-and-solutions/tree/master/Text/RSSfeedparser)\n\n**Quote Tracker (market symbols etc)** - A program which can go out and check the current value of stocks for a list of symbols entered by the user. The user can set how often the stocks are checked. For CLI, show whether the stock has moved up or down. *Optional: If GUI, the program can show green up and red down arrows to show which direction the stock value has moved.* [[masegaloeh (Python)]](https://github.com/masegaloeh/freetime-projects/blob/master/text/quote_tracker.py)\n\n**Guestbook / Journal** - A simple application that allows people to add comments or write journal entries. It can allow comments or not and timestamps for all entries. Could also be made into a shout box. *Optional: Deploy it on Google App Engine or Heroku or any other PaaS (if possible, of course).*\n\n**Fortune Teller (Horoscope)** - A program that checks your horoscope on various astrology sites and puts them together for you each day. [[cahitonur (Python)]](https://github.com/cahitonur/mini-project/blob/master/horoscope/horoscope.py) [[tapasweni-pathak (Python)]](https://github.com/tapasweni-pathak/Scripts/blob/master/Your-Horoscope.py) \n\n\n**Random Gift Suggestions** - Enter various gifts for certain people when you think of them. When its time to give them a gift (xmas, birthday, anniversary) it will randomly pick one. *Optional: Suggest places you can get it (link to Amazon page?).*\n\n**Markdown to HTML Converter** - Converts Markdown formatted text into HTML files. Implement basic tags like `p`, `strong`, `em` etc. *Optional: Implement all tags from [Markdown Syntax Docs](http://daringfireball.net/projects/markdown/syntax).* [[Drhealsgood (Python)]](https://github.com/Drhealsgood/miniprojects/blob/master/text_projects/auto_markup/markup.py)\n\n\nNetworking\n---------\n\n\n**Bandwidth Monitor** - A small utility program that tracks how much data you have uploaded and downloaded from the net during the course of your current online session. See if you can find out what periods of the day you use more and less and generate a report or graph that shows it. \n\n**Port Scanner** - Enter an IP address and a port range where the program will then attempt to find open ports on the given computer by connecting to each of them. On any successful connections mark the port as open.[[enessenel (Python)]](https://github.com/enessenel/Small-Projects/blob/master/PortScanner.py)\n\n**Mail Checker (POP3 / IMAP)** - The user enters various account information include web server and IP, protocol type (POP3 or IMAP) and the application will check for email at a given interval. \n\n**Country from IP Lookup** - Enter an IP address and find the country that IP is registered in. *Optional: Find the Ip automatically.*  [[tapasweni-pathak (Python)]](https://github.com/tapasweni-pathak/Scripts/blob/master/Locate-Me.py) [[viktorahlstrom (Python)]](https://github.com/viktorahlstrom/pythonscripts/blob/master/iplocator.py)\n\n**Whois Search Tool** - Enter an IP or host address and have it look it up through whois and return the results to you. [[tapasweni-pathak (Python)]](https://github.com/tapasweni-pathak/Scripts/blob/master/WhoIs%3F.py)\n\n**Site Checker with Time Scheduling** - An application that attempts to connect to a website or server every so many minutes or a given time and check if it is up. If it is down, it will notify you by email or by posting a notice on screen. [[cahitonur (Python)]](https://github.com/cahitonur/mini-project/blob/master/site_monitor/monitor.py)\n\nClasses\n---------\n\n**Product Inventory Project** - Create an application which manages an inventory of products. Create a product class which has a price, id, and quantity on hand. Then create an *inventory* class which keeps track of various products and can sum up the inventory value. [[Drhealsgood (Python)]](https://github.com/Drhealsgood/miniprojects/blob/master/class_projects/product_inventory/product_inventory.py) \n\n**Airline / Hotel Reservation System** - Create a reservation system which books airline seats or hotel rooms. It charges various rates for particular sections of the plane or hotel. Example, first class is going to cost more than coach. Hotel rooms have penthouse suites which cost more. Keep track of when rooms will be available and can be scheduled.\n\n**Bank Account Manager** - Create a class called Account which will be an abstract class for three other classes called CheckingAccount, SavingsAccount and BusinessAccount. Manage credits and debits from these accounts through an ATM style program. [[Daytron (Python)]](https://github.com/Daytron/Projects/blob/master/Classes/bank_account_manager.py) \n\n**Patient / Doctor Scheduler** - Create a patient class and a doctor class. Have a doctor that can handle multiple patients and setup a scheduling program where a doctor can only handle 16 patients during an 8 hr work day.\n\n**Recipe Creator and Manager** - Create a recipe class with ingredients and a put them in a recipe manager program that organizes them into categories like deserts, main courses or by ingredients like chicken, beef, soups, pies etc.\n\n**Image Gallery** - Create an image abstract class and then a class that inherits from it for each image type. Put them in a program which displays them in a gallery style format for viewing.\n\n**Shape Area and Perimeter Classes** - Create an abstract class called Shape and then inherit from it other shapes like diamond, rectangle, circle, triangle etc. Then have each class override the area and perimeter functionality to handle each shape type.  [[masegaloeh (Python)]](https://github.com/masegaloeh/freetime-projects/blob/master/class/shape/shape.py) \n\n**Flower Shop Ordering To Go** - Create a flower shop application which deals in flower objects and use those flower objects in a bouquet object which can then be sold. Keep track of the number of objects and when you may need to order more.\n\n**Family Tree Creator** - Create a class called Person which will have a name, when they were born and when (and if) they died. Allow the user to create these Person classes and put them into a family tree structure. Print out the tree to the screen. \n\nThreading\n---------\n\n**Create A Progress Bar for Downloads** - Create a progress bar for applications that can keep track of a download in progress. The progress bar will be on a separate thread and will communicate with the main thread using delegates. \n\n**Bulk Thumbnail Creator** - Picture processing can take a bit of time for some transformations. Especially if the image is large. Create an image program which can take hundreds of images and converts them to a specified size in the background thread while you do other things. For added complexity, have one thread handling re-sizing, have another bulk renaming of thumbnails etc. \n[[bhaskar4n(python)]](https://github.com/bhaskar4n/bulk-thumbnail-creator)\n[[SumedhArani(python)]](https://github.com/SumedhArani/Threading-Python)\n[[tushar-rishav(python)]](https://github.com/tushar-rishav/Pynail)\n\n\nWeb\n---------\n\n**Page Scraper** - Create an application which connects to a site and pulls out all links, or images, and saves them to a list. *Optional: Organize the indexed content and don’t allow duplicates. Have it put the results into an easily searchable index file.* [[mouradmourafiq (python)]](https://github.com/mouradmourafiq/pages-jaunes-maroc)[[chillaranand (python)]](https://github.com/ChillarAnand/site_crawler) [[tapasweni-pathak (python)]](https://github.com/tapasweni-pathak/STW-Collection)\n\n**Web Browser with Tabs** - Create a small web browser that allows you to navigate the web and contains tabs which can be used to navigate to multiple web pages at once. For simplicity don’t worry about executing Javascript or other client side code.\n\n**Online White Board** - Create an application which allows you to draw pictures, write notes and use various colors to flesh out ideas for projects. *Optional: Add feature to invite friends to collaborate on a white board online.*\n\n**Get Atomic Time from Internet Clock** - This program will get the true atomic time from an atomic time clock on the Internet. Use any one of the atomic clocks returned by a simple Google search.\n\n**Fetch Current Weather** - Get the current weather for a given zip/postal code. *Optional: Try locating the user automatically.*\n[[chillaranand (python)]](https://github.com/ChillarAnand/Weather-on-Terminal) [[tapasweni-pathak (python)]](https://github.com/tapasweni-pathak/Scripts/blob/master/Weather.py) [[viktorahlstrom (Python)]](https://github.com/viktorahlstrom/pyweather)\n\n\n**Scheduled Auto Login and Action** - Make an application which logs into a given site on a schedule and invokes a certain action and then logs out. This can be useful for checking web mail, posting regular content, or getting info for other applications and saving it to your computer.\n\n**E-Card Generator** - Make a site that allows people to generate their own little e-cards and send them to other people. Do not use Flash. Use a picture library and perhaps insightful mottos or quotes.\n\n**Content Management System** - Create a content management system (CMS) like Joomla, Drupal, PHP Nuke etc. Start small. *Optional: Allow for the addition of modules/addons.*\n\n**Web Board (Forum)** - Create a forum for you and your buddies to post, administer and share thoughts and ideas.\n\n**CAPTCHA Maker** - Ever see those images with letters a numbers when you signup for a service and then asks you to enter what you see? It keeps web bots from automatically signing up and spamming. Try creating one yourself for online forms.\n\nFiles\n---------\n\n**Quiz Maker** - Make an application which takes various questions form a file, picked randomly, and puts together a quiz for students. Each quiz can be different and then reads a key to grade the quizzes.\n\n**File Explorer** - Create your own simple windows explorer program. Add feature(s) you always thought are missing from MS Windows Explorer or Mac Finder.\n\n**Sort Excel/CSV File Utility** - Reads a file of records, sorts them, and then writes them back to the file. Allow the user to choose various sort style and sorting based on a particular field. [[vishwanath79 (Python)]](https://github.com/vishwanath79/ExcelSorter/blob/master/ExcelSorter.py)\n\n**Create Zip File Maker** - The user enters various files from different directories and the program zips them up into a zip file. *Optional: Apply actual compression to the files. Start with Huffman Algorithm.* \n\n**PDF Generator** - An application which can read in a text file, html file or some other file and generates a PDF file out of it. Great for a web based service where the user uploads the file and the program returns a PDF of the file. *Optional: Deploy on GAE or Heroku if possible.*\n\n**Mp3 Tagger** - Modify and add ID3v1 tags to MP3 files. See if you can also add in the album art into the MP3 file’s header as well as other ID3v2 tags.\n\n**Code Snippet Manager** - Another utility program that allows coders to put in functions, classes or other tidbits to save for use later. Organized by the type of snippet or language the coder can quickly look up code. *Optional: For extra practice try adding syntax highlighting based on the language.*\n\nDatabases\n---------\n\n**SQL Query Analyzer** - A utility application which a user can enter a query and have it run against a local database and look for ways to make it more efficient.\n\n**Remote SQL Tool** - A utility that can execute queries on remote servers from your local computer across the Internet. It should take in a remote host, user name and password, run the query and return the results.[[vishwanath79 (Python)]](https://github.com/vishwanath79/Remote-SQL/blob/master/RemSQL.py)\n\n**Report Generator** - Create a utility that generates a report based on some tables in a database. Generates a sales reports based on the order/order details tables or sums up the days current database activity.\n\n**Event Scheduler and Calendar** - Make an application which allows the user to enter a date and time of an event, event notes and then schedule those events on a calendar. The user can then browse the calendar or search the calendar for specific events. *Optional: Allow the application to create re-occurrence events that reoccur every day, week, month, year etc.*\n\n**Budget Tracker** - Write an application that keeps track of a household’s budget. The user can add expenses, income, and recurring costs to find out how much they are saving or losing over a period of time. *Optional: Allow the user to specify a date range and see the net flow of money in and out of the house budget for that time period.*\n\n**Address Book** - Keep track of various contacts, their numbers, emails and little notes about them like a Rolodex in the database.[[bhaskar4n(python)]](https://github.com/bhaskar4n/address-book-database) [[bhaskar4n(python)]](https://github.com/bhaskar4n/address-book-database-linked)\n\n**TV Show Tracker** - Got a favorite show you don’t want to miss? Don’t have a PVR or want to be able to find the show to then PVR it later? Make an application which can search various online TV Guide sites, locate the shows/times/channels and add them to a database application. The database/website then can send you email reminders that a show is about to start and which channel it will be on. [[dabillox (Python)]](https://github.com/dabillox/pyprojects/tree/master/tvshowtracker)\n\n**Travel Planner System** - Make a system that allows users to put together their own little travel itinerary and keep track of the airline / hotel arrangements, points of interest, budget and schedule.\n\nGraphics and Multimedia\n---------\n\n**Slide Show** - Make an application that shows various pictures in a slide show format. *Optional: Try adding various effects like fade in/out, star wipe and window blinds transitions.*\n\n**Stream Video from Online** - Try to create your own online streaming video player.\n\n**Mp3 Player** - A simple program for playing your favorite music files. Add features you think are missing from your favorite music player.  [[rasppie (Python)]](https://github.com/rasppie/pyprojects/blob/master/music-player.py)\n\n**Stream Music from Online** - Try to create your own online streaming music player. \n\n**Watermarking Application** - Have some pictures you want copyright protected? Add your own logo or text lightly across the background so that no one can simply steal your graphics off your site. Make a program that will add this watermark to the picture. *Optional: Use threading to process multiple images simultaneously.* [[bhaskar4n(python)]](https://github.com/bhaskar4n/watermarker)\n\n**Turtle Graphics** - This is a common project where you create a floor of 20 x 20 squares. Using various commands you tell a turtle to draw a line on the floor. You have move forward, left or right, lift or drop pen etc. Do a search online for \"Turtle Graphics\" for more information. *Optional: Allow the program to read in the list of commands from a file.*\n[[Tushar(python)]](https://github.com/tushar-rishav/PyLogo)\n\n\n**GIF Creator** A program that puts together multiple images (PNGs, JPGs, TIFFs) to make a smooth GIF that can be exported. *Optional: Make the program convert small video files to GIFs as well.*\n\nSecurity\n-------------\n\n**Caesar cipher** - Implement a Caesar cipher, both encoding and decoding. The key is an integer from 1 to 25. This cipher rotates the letters of the alphabet (A to Z). The encoding replaces each letter with the 1st to 25th next letter in the alphabet (wrapping Z to A). So key 2 encrypts \"HI\" to \"JK\", but key 20 encrypts \"HI\" to \"BC\". This simple \"monoalphabetic substitution cipher\" provides almost no security, because an attacker who has the encoded message can either use frequency analysis to guess the key, or just try all 25 keys. [[shyamsalimkumar (Python)]](https://github.com/shyamsalimkumar/Projects/blob/master/Security/caesar_cipher.py) [[sriniavireddy (python)]](https://github.com/sriniavireddy/scripts-and-solutions/blob/master/CaesarCipher.py) \n"
  },
  {
    "path": "19-Bonus Material - Introduction to GUIs/.ipynb_checkpoints/01-Interact-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Using Interact\\n\",\n    \"\\n\",\n    \"In this lecture we will begin to learn about creating dashboard-type GUI with iPython widgets!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The `interact` function (`ipywidgets.interact`) automatically creates user interface (UI) controls for exploring code and data interactively. It is the easiest way to get started using IPython's widgets.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Start with some imports!\\n\",\n    \"\\n\",\n    \"from ipywidgets import interact, interactive, fixed\\n\",\n    \"import ipywidgets as widgets\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<div class=\\\"alert alert-success\\\">\\n\",\n    \"Please Note! The widgets in this notebook won't show up on NbViewer or GitHub renderings. To view the widgets and interact with them, you will need to download this notebook and run it with a Jupyter Notebook server.\\n\",\n    \"\\n\",\n    \"</div>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Basic `interact`\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"At the most basic level, `interact` auto-generates UI controls for function arguments, and then calls the function with those arguments when you manipulate the controls interactively. To use `interact`, you need to define a function that you want to explore. Here is a function that prints its only argument `x`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Very basic function\\n\",\n    \"def f(x):\\n\",\n    \"    return x\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"When you pass this function as the first argument to `interact` along with an integer keyword argument (`x=10`), a slider is generated and bound to the function parameter. Note that the semicolon here just prevents an **out** cell from showing up.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"d19364a3984541918392df94acd74157\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(IntSlider(value=10, description='x', max=30, min=-10), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# Generate a slider to interact with\\n\",\n    \"interact(f, x=10,);\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"When you move the slider, the function is called, which prints the current value of `x`.\\n\",\n    \"\\n\",\n    \"If you pass `True` or `False`, `interact` will generate a check-box:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"scrolled\": true\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"d56caf432729463dabc716ef65c437db\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(Checkbox(value=True, description='x'), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# Booleans generate check-boxes\\n\",\n    \"interact(f, x=True);\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you pass a string, `interact` will generate a text area.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"3ec606e93ced408992a5cb0f59903ed9\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(Text(value='Hi there!', description='x'), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# Strings generate text areas\\n\",\n    \"interact(f, x='Hi there!');\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"`interact` can also be used as a decorator. This allows you to define a function and interact with it in a single shot. As this example shows, `interact` also works with functions that have multiple arguments.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"4d87f586f60945c3ba0ed9dcc4e1874a\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(Checkbox(value=True, description='x'), FloatSlider(value=1.0, description='y', max=3.0, min=-1.0), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# Using a decorator!\\n\",\n    \"@interact(x=True, y=1.0)\\n\",\n    \"def g(x, y):\\n\",\n    \"    return (x, y)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Fixing arguments using `fixed`\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There are times when you may want to explore a function using `interact`, but fix one or more of its arguments to specific values. This can be accomplished by wrapping values with the `fixed` function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Again, a simple function\\n\",\n    \"def h(p, q):\\n\",\n    \"    return (p, q)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"When we call `interact`, we pass `fixed(20)` for q to hold it fixed at a value of `20`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"1bcccacaa1cc43f9a1df1b4df87503ff\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(IntSlider(value=5, description='p', max=15, min=-5), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"interact(h, p=5, q=fixed(20));\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice that a slider is only produced for `p` as the value of `q` is fixed.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Widget abbreviations\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"When you pass an integer-valued keyword argument of `10` (`x=10`) to `interact`, it generates an integer-valued slider control with a range of `[-10,+3\\\\times10]`. In this case, `10` is an *abbreviation* for an actual slider widget:\\n\",\n    \"\\n\",\n    \"```python\\n\",\n    \"IntSlider(min=-10,max=30,step=1,value=10)\\n\",\n    \"```\\n\",\n    \"\\n\",\n    \"In fact, we can get the same result if we pass this `IntSlider` as the keyword argument for `x`:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"a251c042d8de4ecfbbfe2f2c4d65de55\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(IntSlider(value=10, description='x', max=30, min=-10), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# Can call the IntSlider to get more specific\\n\",\n    \"interact(f, x=widgets.IntSlider(min=-10,max=30,step=1,value=10));\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This examples clarifies how `interact` processes its keyword arguments:\\n\",\n    \"\\n\",\n    \"1. If the keyword argument is a `Widget` instance with a `value` attribute, that widget is used. Any widget with a `value` attribute can be used, even custom ones.\\n\",\n    \"2. Otherwise, the value is treated as a *widget abbreviation* that is converted to a widget before it is used.\\n\",\n    \"\\n\",\n    \"The following table gives an overview of different widget abbreviations:\\n\",\n    \"\\n\",\n    \"<table class=\\\"table table-condensed table-bordered\\\">\\n\",\n    \"  <tr><td><strong>Keyword argument</strong></td><td><strong>Widget</strong></td></tr>  \\n\",\n    \"  <tr><td>`True` or `False`</td><td>Checkbox</td></tr>  \\n\",\n    \"  <tr><td>`'Hi there'`</td><td>Text</td></tr>\\n\",\n    \"  <tr><td>`value` or `(min,max)` or `(min,max,step)` if integers are passed</td><td>IntSlider</td></tr>\\n\",\n    \"  <tr><td>`value` or `(min,max)` or `(min,max,step)` if floats are passed</td><td>FloatSlider</td></tr>\\n\",\n    \"  <tr><td>`['orange','apple']` or `{'one':1,'two':2}`</td><td>Dropdown</td></tr>\\n\",\n    \"</table>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note that a dropdown is used if a list or a dict is given (signifying discrete choices), and a slider is used if a tuple is given (signifying a range).\\n\",\n    \"\\n\",\n    \"You have seen how the checkbox and text area widgets work above. Here, more details about the different abbreviations for sliders and drop-downs are given.\\n\",\n    \"\\n\",\n    \"If a 2-tuple of integers is passed `(min,max)`, an integer-valued slider is produced with those minimum and maximum values (inclusively). In this case, the default step size of `1` is used.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"671e9e1043b44bbf905862440167bec4\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(IntSlider(value=2, description='x', max=4), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# Min,Max slider with Tuples\\n\",\n    \"interact(f, x=(0,4));\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If a 3-tuple of integers is passed `(min,max,step)`, the step size can also be set.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"912b839b05ba488d819ff0c09c877a57\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(IntSlider(value=4, description='x', max=8, step=2), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# (min, max, step)\\n\",\n    \"interact(f, x=(0,8,2));\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"A float-valued slider is produced if the elements of the tuples are floats. Here the minimum is `0.0`, the maximum is `10.0` and step size is `0.1` (the default).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"e7cbdf72471d406ca80bed9a232e6605\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(FloatSlider(value=5.0, description='x', max=10.0), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"interact(f, x=(0.0,10.0));\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The step size can be changed by passing a third element in the tuple.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"239573e3448a44179962dccfb9fe15cf\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(FloatSlider(value=5.0, description='x', max=10.0, step=0.01), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"interact(f, x=(0.0,10.0,0.01));\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"For both integer and float-valued sliders, you can pick the initial value of the widget by passing a default keyword argument to the underlying Python function. Here we set the initial value of a float slider to `5.5`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"fd58de461e564c38b0a12def19ccfd1b\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(FloatSlider(value=5.5, description='x', max=20.0, step=0.5), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"@interact(x=(0.0,20.0,0.5))\\n\",\n    \"def h(x=5.5):\\n\",\n    \"    return x\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Dropdown menus are constructed by passing a list of strings. In this case, the strings are both used as the names in the drop-down menu UI and passed to the underlying Python function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"88ab10cb594d46b2ade99079f5087f12\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(Dropdown(description='x', options=('apples', 'oranges'), value='apples'), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"interact(f, x=['apples','oranges']);\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you want a drop-down menu that passes non-string values to the Python function, you can pass a dictionary. The keys in the dictionary are used for the names in the drop-down menu UI and the values are the arguments that are passed to the underlying Python function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"d006408fb16f457b81eb604f5bf18220\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(Dropdown(description='x', options={'one': 10, 'two': 20}, value=10), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"interact(f, x={'one': 10, 'two': 20});\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Using function annotations with `interact`\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can also specify widget abbreviations using [function annotations](https://docs.python.org/3/tutorial/controlflow.html#function-annotations).\\n\",\n    \"\\n\",\n    \"Define a function with a checkbox widget abbreviation for the argument `x`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def f(x:True):  # Python 3 only\\n\",\n    \"    return x\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Then, because the widget abbreviation has already been defined, you can call `interact` with a single argument.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"70f34f96f12143b492fc3160d089f854\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(Checkbox(value=True, description='x'), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"interact(f);\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## interactive\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In addition to `interact`, IPython provides another function, `interactive`, that is useful when you want to reuse the widgets that are produced or access the data that is bound to the UI controls.\\n\",\n    \"\\n\",\n    \"Note that unlike `interact`, the return value of the function will not be displayed automatically, but you can display a value inside the function with `IPython.display.display`.\\n\",\n    \"\\n\",\n    \"Here is a function that returns the sum of its two arguments and displays them. The display line may be omitted if you don’t want to show the result of the function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from IPython.display import display\\n\",\n    \"\\n\",\n    \"def f(a, b):\\n\",\n    \"    display(a + b)\\n\",\n    \"    return a+b\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Unlike `interact`, `interactive` returns a `Widget` instance rather than immediately displaying the widget.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"w = interactive(f, a=10, b=20)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The widget is an `interactive`, a subclass of `VBox`, which is a container for other widgets.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"ipywidgets.widgets.interaction.interactive\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"type(w)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The children of the `interactive` are two integer-valued sliders and an output widget, produced by the widget abbreviations above.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(IntSlider(value=10, description='a', max=30, min=-10),\\n\",\n       \" IntSlider(value=20, description='b', max=60, min=-20),\\n\",\n       \" Output())\"\n      ]\n     },\n     \"execution_count\": 25,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"w.children\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"To actually display the widgets, you can use IPython's `display` function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"0da895902d664d5086ed00d535d36ef3\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(IntSlider(value=10, description='a', max=30, min=-10), IntSlider(value=20, description='b', max=60, min=-20), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"display(w)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"At this point, the UI controls work just like they would if `interact` had been used. You can manipulate them interactively and the function will be called. However, the widget instance returned by `interactive` also give you access to the current keyword arguments and return value of the underlying Python function.\\n\",\n    \"\\n\",\n    \"Here are the current keyword arguments. If you rerun this cell after manipulating the sliders, the values will have changed.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'a': 10, 'b': 20}\"\n      ]\n     },\n     \"execution_count\": 27,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"w.kwargs\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Here is the current return value of the function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"30\"\n      ]\n     },\n     \"execution_count\": 28,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"w.result\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Conclusion\\n\",\n    \"\\n\",\n    \"You should now have a basic understanding of how to use Interact in Jupyter Notebooks!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "19-Bonus Material - Introduction to GUIs/.ipynb_checkpoints/02-Widget Basics-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Widget Basics\\n\",\n    \"\\n\",\n    \"In this lecture we will continue to build off our understanding of **interact** and **interactive** to begin using full widgets!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## What are widgets?\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"Widgets are eventful python objects that have a representation in the browser, often as a control like a slider, textbox, etc.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## What can they be used for?\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"You can use widgets to build **interactive GUIs** for your notebooks.  \\n\",\n    \"You can also use widgets to **synchronize stateful and stateless information** between Python and JavaScript.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Using widgets  \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"To use the widget framework, you need to import `ipywidgets`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import ipywidgets as widgets\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### repr\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Widgets have their own display `repr` which allows them to be displayed using IPython's display framework. Constructing and returning an `IntSlider` automatically displays the widget (as seen below). Widgets are displayed inside the output area below the code cell. Clearing cell output will also remove the widget.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"scrolled\": true\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"e1feeb5d164345929849b3775b347ad7\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>IntSlider</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"IntSlider(value=0)\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"widgets.IntSlider()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### display()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can also explicitly display the widget using `display(...)`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"75f00040661845228532350c310c4bc6\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>IntSlider</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"IntSlider(value=0)\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"from IPython.display import display\\n\",\n    \"w = widgets.IntSlider()\\n\",\n    \"display(w)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Multiple display() calls\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you display the same widget twice, the displayed instances in the front-end will remain in sync with each other. Try dragging the slider below and watch the slider above.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"75f00040661845228532350c310c4bc6\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>IntSlider</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"IntSlider(value=0)\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"display(w)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Closing widgets\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can close a widget by calling its `close()` method.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"75f00040661845228532350c310c4bc6\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>IntSlider</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"IntSlider(value=0)\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"display(w)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"w.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Widget properties\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"All of the IPython widgets share a similar naming scheme. To read the value of a widget, you can query its `value` property.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"a5ab821e8906437d99a86664021856d3\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>IntSlider</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"IntSlider(value=0)\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"w = widgets.IntSlider()\\n\",\n    \"display(w)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"w.value\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Similarly, to set a widget's value, you can set its `value` property.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"w.value = 100\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Keys\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In addition to `value`, most widgets share `keys`, `description`, and `disabled`. To see the entire list of synchronized, stateful properties of any specific widget, you can query the `keys` property.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['_dom_classes',\\n\",\n       \" '_model_module',\\n\",\n       \" '_model_module_version',\\n\",\n       \" '_model_name',\\n\",\n       \" '_view_count',\\n\",\n       \" '_view_module',\\n\",\n       \" '_view_module_version',\\n\",\n       \" '_view_name',\\n\",\n       \" 'continuous_update',\\n\",\n       \" 'description',\\n\",\n       \" 'disabled',\\n\",\n       \" 'layout',\\n\",\n       \" 'max',\\n\",\n       \" 'min',\\n\",\n       \" 'orientation',\\n\",\n       \" 'readout',\\n\",\n       \" 'readout_format',\\n\",\n       \" 'step',\\n\",\n       \" 'style',\\n\",\n       \" 'value']\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"w.keys\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Shorthand for setting the initial values of widget properties\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"While creating a widget, you can set some or all of the initial values of that widget by defining them as keyword arguments in the widget's constructor (as seen below).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"b35936af3f2741ae823d7d2fd4c7fcda\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>Text</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"Text(value='Hello World!', disabled=True)\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"widgets.Text(value='Hello World!', disabled=True)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Linking two similar widgets\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"If you need to display the same value two different ways, you'll have to use two different widgets. Instead of attempting to manually synchronize the values of the two widgets, you can use the `link` or `jslink` function to link two properties together (the difference between these is discussed in Widget Events).  Below, the values of two widgets are linked together.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"2013fbc8bf434a2b8d8d8ebe8f06c89a\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>FloatText</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"FloatText(value=0.0)\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"edacad1b8c34472c92ac5052449cba52\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>FloatSlider</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"FloatSlider(value=0.0)\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"a = widgets.FloatText()\\n\",\n    \"b = widgets.FloatSlider()\\n\",\n    \"display(a,b)\\n\",\n    \"\\n\",\n    \"mylink = widgets.jslink((a, 'value'), (b, 'value'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Unlinking widgets\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"Unlinking the widgets is simple.  All you have to do is call `.unlink` on the link object. Try changing one of the widgets above after unlinking to see that they can be independently changed.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"mylink.unlink()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Conclusion\\n\",\n    \"\\n\",\n    \"You should now be beginning to have an understanding of how Widgets can interact with each other and how you can begin to specify widget details.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "19-Bonus Material - Introduction to GUIs/.ipynb_checkpoints/03-Widget List-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Widget List\\n\",\n    \"\\n\",\n    \"This lecture will serve as a reference for widgets, providing a list of the GUI widgets available!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Complete list\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"For a complete list of the GUI widgets available to you, you can list the registered widget types. `Widget` is the base class.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import ipywidgets as widgets\\n\",\n    \"\\n\",\n    \"# Show all available widgets!\\n\",\n    \"for item in widgets.Widget.widget_types.items():\\n\",\n    \"    print(item[0][2][:-5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"## Numeric widgets\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There are 10 widgets distributed with IPython that are designed to display numeric values. Widgets exist for displaying integers and floats, both bounded and unbounded.  The integer widgets share a similar naming scheme to their floating point counterparts. By replacing `Float` with `Int` in the widget name, you can find the Integer equivalent.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### IntSlider\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.IntSlider(\\n\",\n    \"    value=7,\\n\",\n    \"    min=0,\\n\",\n    \"    max=10,\\n\",\n    \"    step=1,\\n\",\n    \"    description='Test:',\\n\",\n    \"    disabled=False,\\n\",\n    \"    continuous_update=False,\\n\",\n    \"    orientation='horizontal',\\n\",\n    \"    readout=True,\\n\",\n    \"    readout_format='d'\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### FloatSlider\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.FloatSlider(\\n\",\n    \"    value=7.5,\\n\",\n    \"    min=0,\\n\",\n    \"    max=10.0,\\n\",\n    \"    step=0.1,\\n\",\n    \"    description='Test:',\\n\",\n    \"    disabled=False,\\n\",\n    \"    continuous_update=False,\\n\",\n    \"    orientation='horizontal',\\n\",\n    \"    readout=True,\\n\",\n    \"    readout_format='.1f',\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Sliders can also be **displayed vertically**.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.FloatSlider(\\n\",\n    \"    value=7.5,\\n\",\n    \"    min=0,\\n\",\n    \"    max=10.0,\\n\",\n    \"    step=0.1,\\n\",\n    \"    description='Test:',\\n\",\n    \"    disabled=False,\\n\",\n    \"    continuous_update=False,\\n\",\n    \"    orientation='vertical',\\n\",\n    \"    readout=True,\\n\",\n    \"    readout_format='.1f',\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### IntRangeSlider\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.IntRangeSlider(\\n\",\n    \"    value=[5, 7],\\n\",\n    \"    min=0,\\n\",\n    \"    max=10,\\n\",\n    \"    step=1,\\n\",\n    \"    description='Test:',\\n\",\n    \"    disabled=False,\\n\",\n    \"    continuous_update=False,\\n\",\n    \"    orientation='horizontal',\\n\",\n    \"    readout=True,\\n\",\n    \"    readout_format='d',\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### FloatRangeSlider\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.FloatRangeSlider(\\n\",\n    \"    value=[5, 7.5],\\n\",\n    \"    min=0,\\n\",\n    \"    max=10.0,\\n\",\n    \"    step=0.1,\\n\",\n    \"    description='Test:',\\n\",\n    \"    disabled=False,\\n\",\n    \"    continuous_update=False,\\n\",\n    \"    orientation='horizontal',\\n\",\n    \"    readout=True,\\n\",\n    \"    readout_format='.1f',\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### IntProgress\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.IntProgress(\\n\",\n    \"    value=7,\\n\",\n    \"    min=0,\\n\",\n    \"    max=10,\\n\",\n    \"    step=1,\\n\",\n    \"    description='Loading:',\\n\",\n    \"    bar_style='', # 'success', 'info', 'warning', 'danger' or ''\\n\",\n    \"    orientation='horizontal'\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### FloatProgress\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.FloatProgress(\\n\",\n    \"    value=7.5,\\n\",\n    \"    min=0,\\n\",\n    \"    max=10.0,\\n\",\n    \"    step=0.1,\\n\",\n    \"    description='Loading:',\\n\",\n    \"    bar_style='info',\\n\",\n    \"    orientation='horizontal'\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The numerical text boxes that impose some limit on the data (range, integer-only) impose that restriction when the user presses enter.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### BoundedIntText\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.BoundedIntText(\\n\",\n    \"    value=7,\\n\",\n    \"    min=0,\\n\",\n    \"    max=10,\\n\",\n    \"    step=1,\\n\",\n    \"    description='Text:',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### BoundedFloatText\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.BoundedFloatText(\\n\",\n    \"    value=7.5,\\n\",\n    \"    min=0,\\n\",\n    \"    max=10.0,\\n\",\n    \"    step=0.1,\\n\",\n    \"    description='Text:',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### IntText\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.IntText(\\n\",\n    \"    value=7,\\n\",\n    \"    description='Any:',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### FloatText\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.FloatText(\\n\",\n    \"    value=7.5,\\n\",\n    \"    description='Any:',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"## Boolean widgets\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There are three widgets that are designed to display a boolean value.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### ToggleButton\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.ToggleButton(\\n\",\n    \"    value=False,\\n\",\n    \"    description='Click me',\\n\",\n    \"    disabled=False,\\n\",\n    \"    button_style='', # 'success', 'info', 'warning', 'danger' or ''\\n\",\n    \"    tooltip='Description',\\n\",\n    \"    icon='check'\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Checkbox\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.Checkbox(\\n\",\n    \"    value=False,\\n\",\n    \"    description='Check me',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Valid\\n\",\n    \"\\n\",\n    \"The valid widget provides a read-only indicator.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.Valid(\\n\",\n    \"    value=False,\\n\",\n    \"    description='Valid!',\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"## Selection widgets\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There are several widgets that can be used to display single selection lists, and two that can be used to select multiple values. All inherit from the same base class. You can specify the **enumeration of selectable options by passing a list** (options are either (label, value) pairs, or simply values for which the labels are derived by calling `str`). You can **also specify the enumeration as a dictionary**, in which case the **keys will be used as the item displayed** in the list and the corresponding **value will be used** when an item is selected (in this case, since dictionaries are unordered, the displayed order of items in the widget is unspecified).\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Dropdown\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.Dropdown(\\n\",\n    \"    options=['1', '2', '3'],\\n\",\n    \"    value='2',\\n\",\n    \"    description='Number:',\\n\",\n    \"    disabled=False,\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The following is also valid:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.Dropdown(\\n\",\n    \"    options={'One': 1, 'Two': 2, 'Three': 3},\\n\",\n    \"    value=2,\\n\",\n    \"    description='Number:',\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### RadioButtons\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.RadioButtons(\\n\",\n    \"    options=['pepperoni', 'pineapple', 'anchovies'],\\n\",\n    \"    # value='pineapple',\\n\",\n    \"    description='Pizza topping:',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Select\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.Select(\\n\",\n    \"    options=['Linux', 'Windows', 'OSX'],\\n\",\n    \"    value='OSX',\\n\",\n    \"    # rows=10,\\n\",\n    \"    description='OS:',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### SelectionSlider\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.SelectionSlider(\\n\",\n    \"    options=['scrambled', 'sunny side up', 'poached', 'over easy'],\\n\",\n    \"    value='sunny side up',\\n\",\n    \"    description='I like my eggs ...',\\n\",\n    \"    disabled=False,\\n\",\n    \"    continuous_update=False,\\n\",\n    \"    orientation='horizontal',\\n\",\n    \"    readout=True\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### SelectionRangeSlider\\n\",\n    \"The value, index, and label keys are 2-tuples of the min and max values selected. The options must be nonempty.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import datetime\\n\",\n    \"dates = [datetime.date(2015,i,1) for i in range(1,13)]\\n\",\n    \"options = [(i.strftime('%b'), i) for i in dates]\\n\",\n    \"widgets.SelectionRangeSlider(\\n\",\n    \"    options=options,\\n\",\n    \"    index=(0,11),\\n\",\n    \"    description='Months (2015)',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### ToggleButtons\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.ToggleButtons(\\n\",\n    \"    options=['Slow', 'Regular', 'Fast'],\\n\",\n    \"    description='Speed:',\\n\",\n    \"    disabled=False,\\n\",\n    \"    button_style='', # 'success', 'info', 'warning', 'danger' or ''\\n\",\n    \"    tooltips=['Description of slow', 'Description of regular', 'Description of fast'],\\n\",\n    \"    # icons=['check'] * 3\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### SelectMultiple\\n\",\n    \"Multiple values can be selected with <kbd>shift</kbd> and/or <kbd>ctrl</kbd> (or <kbd>command</kbd>) pressed and mouse clicks or arrow keys.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.SelectMultiple(\\n\",\n    \"    options=['Apples', 'Oranges', 'Pears'],\\n\",\n    \"    value=['Oranges'],\\n\",\n    \"    # rows=10,\\n\",\n    \"    description='Fruits',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"## String widgets\\n\",\n    \"There are several widgets that can be used to display a string value. The `Text` and `Textarea` widgets accept input. The `HTML` and `HTMLMath` widgets display a string as HTML (`HTMLMath` also renders math). The `Label` widget can be used to construct a custom control label.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Text\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.Text(\\n\",\n    \"    value='Hello World',\\n\",\n    \"    placeholder='Type something',\\n\",\n    \"    description='String:',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Textarea\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.Textarea(\\n\",\n    \"    value='Hello World',\\n\",\n    \"    placeholder='Type something',\\n\",\n    \"    description='String:',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Label\\n\",\n    \"The `Label` widget is useful if you need to build a custom description next to a control using similar styling to the built-in control descriptions.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.HBox([widgets.Label(value=\\\"The $m$ in $E=mc^2$:\\\"), widgets.FloatSlider()])\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### HTML\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.HTML(\\n\",\n    \"    value=\\\"Hello <b>World</b>\\\",\\n\",\n    \"    placeholder='Some HTML',\\n\",\n    \"    description='Some HTML',\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### HTML Math\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.HTMLMath(\\n\",\n    \"    value=r\\\"Some math and <i>HTML</i>: \\\\(x^2\\\\) and $$\\\\frac{x+1}{x-1}$$\\\",\\n\",\n    \"    placeholder='Some HTML',\\n\",\n    \"    description='Some HTML',\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Image\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"file = open(\\\"images/WidgetArch.png\\\", \\\"rb\\\")\\n\",\n    \"image = file.read()\\n\",\n    \"widgets.Image(\\n\",\n    \"    value=image,\\n\",\n    \"    format='png',\\n\",\n    \"    width=300,\\n\",\n    \"    height=400,\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"## Button\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.Button(\\n\",\n    \"    description='Click me',\\n\",\n    \"    disabled=False,\\n\",\n    \"    button_style='', # 'success', 'info', 'warning', 'danger' or ''\\n\",\n    \"    tooltip='Click me',\\n\",\n    \"    icon='check'\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Conclusion\\n\",\n    \"\\n\",\n    \"Even more widgets are described in the notebook **Widget List - Advanced**. Use these as a future reference for yourself!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "19-Bonus Material - Introduction to GUIs/.ipynb_checkpoints/04-Widget Events-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"# Widget Events\\n\",\n    \"\\n\",\n    \"In this lecture we will discuss widget events, such as button clicks!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Special events\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The `Button` is not used to represent a data type. Instead the button widget is used to handle mouse clicks. The `on_click` method of the `Button` can be used to register a function to be called when the button is clicked. The docstring of the `on_click` can be seen below.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import ipywidgets as widgets\\n\",\n    \"\\n\",\n    \"print(widgets.Button.on_click.__doc__)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Example #1 - on_click\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Since button clicks are stateless, they are transmitted from the front-end to the back-end using custom messages. By using the `on_click` method, a button that prints a message when it has been clicked is shown below.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from IPython.display import display\\n\",\n    \"button = widgets.Button(description=\\\"Click Me!\\\")\\n\",\n    \"display(button)\\n\",\n    \"\\n\",\n    \"def on_button_clicked(b):\\n\",\n    \"    print(\\\"Button clicked.\\\")\\n\",\n    \"\\n\",\n    \"button.on_click(on_button_clicked)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Example #2 - on_submit\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The `Text` widget also has a special `on_submit` event. The `on_submit` event fires when the user hits <kbd>enter</kbd>.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"text = widgets.Text()\\n\",\n    \"display(text)\\n\",\n    \"\\n\",\n    \"def handle_submit(sender):\\n\",\n    \"    print(text.value)\\n\",\n    \"\\n\",\n    \"text.on_submit(handle_submit)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"## Traitlet events\\n\",\n    \"Widget properties are IPython traitlets and traitlets are eventful. To handle changes, the `observe` method of the widget can be used to register a callback. The docstring for `observe` can be seen below.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"print(widgets.Widget.observe.__doc__)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Signatures\\n\",\n    \"Mentioned in the docstring, the callback registered must have the signature `handler(change)` where `change` is a dictionary holding the information about the change.\\n\",\n    \"\\n\",\n    \"Using this method, an example of how to output an `IntSlider`’s value as it is changed can be seen below.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"int_range = widgets.IntSlider()\\n\",\n    \"display(int_range)\\n\",\n    \"\\n\",\n    \"def on_value_change(change):\\n\",\n    \"    print(change['new'])\\n\",\n    \"\\n\",\n    \"int_range.observe(on_value_change, names='value')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Linking Widgets\\n\",\n    \"Often, you may want to simply link widget attributes together. Synchronization of attributes can be done in a simpler way than by using bare traitlets events.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Linking traitlets attributes in the kernel¶\\n\",\n    \"\\n\",\n    \"The first method is to use the `link` and `dlink` functions from the `traitlets` module. This only works if we are interacting with a live kernel.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import traitlets\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Create Caption\\n\",\n    \"caption = widgets.Label(value = 'The values of slider1 and slider2 are synchronized')\\n\",\n    \"\\n\",\n    \"# Create IntSliders\\n\",\n    \"slider1 = widgets.IntSlider(description='Slider 1')\\n\",\n    \"slider2 =  widgets.IntSlider(description='Slider 2')\\n\",\n    \"\\n\",\n    \"# Use trailets to link\\n\",\n    \"l = traitlets.link((slider1, 'value'), (slider2, 'value'))\\n\",\n    \"\\n\",\n    \"# Display!\\n\",\n    \"display(caption, slider1, slider2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Create Caption\\n\",\n    \"caption = widgets.Label(value='Changes in source values are reflected in target1')\\n\",\n    \"\\n\",\n    \"# Create Sliders\\n\",\n    \"source = widgets.IntSlider(description='Source')\\n\",\n    \"target1 = widgets.IntSlider(description='Target 1')\\n\",\n    \"\\n\",\n    \"# Use dlink\\n\",\n    \"dl = traitlets.dlink((source, 'value'), (target1, 'value'))\\n\",\n    \"display(caption, source, target1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Function `traitlets.link` and `traitlets.dlink` return a `Link` or `DLink` object. The link can be broken by calling the `unlink` method.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# May get an error depending on order of cells being run!\\n\",\n    \"l.unlink()\\n\",\n    \"dl.unlink()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Registering callbacks to trait changes in the kernel\\n\",\n    \"\\n\",\n    \"Since attributes of widgets on the Python side are traitlets, you can register handlers to the change events whenever the model gets updates from the front-end.\\n\",\n    \"\\n\",\n    \"The handler passed to observe will be called with one change argument. The change object holds at least a `type` key and a `name` key, corresponding respectively to the type of notification and the name of the attribute that triggered the notification.\\n\",\n    \"\\n\",\n    \"Other keys may be passed depending on the value of `type`. In the case where type is `change`, we also have the following keys:\\n\",\n    \"* `owner` : the HasTraits instance\\n\",\n    \"* `old` : the old value of the modified trait attribute\\n\",\n    \"* `new` : the new value of the modified trait attribute\\n\",\n    \"* `name` : the name of the modified trait attribute.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"caption = widgets.Label(value='The values of range1 and range2 are synchronized')\\n\",\n    \"slider = widgets.IntSlider(min=-5, max=5, value=1, description='Slider')\\n\",\n    \"\\n\",\n    \"def handle_slider_change(change):\\n\",\n    \"    caption.value = 'The slider value is ' + (\\n\",\n    \"        'negative' if change.new < 0 else 'nonnegative'\\n\",\n    \"    )\\n\",\n    \"\\n\",\n    \"slider.observe(handle_slider_change, names='value')\\n\",\n    \"\\n\",\n    \"display(caption, slider)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Linking widgets attributes from the client side\\n\",\n    \"\\n\",\n    \"When synchronizing traitlets attributes, you may experience a lag because of the latency due to the roundtrip to the server side. You can also directly link widget attributes in the browser using the link widgets, in either a unidirectional or a bidirectional fashion.\\n\",\n    \"\\n\",\n    \"Javascript links persist when embedding widgets in html web pages without a kernel.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# NO LAG VERSION\\n\",\n    \"caption = widgets.Label(value = 'The values of range1 and range2 are synchronized')\\n\",\n    \"\\n\",\n    \"range1 = widgets.IntSlider(description='Range 1')\\n\",\n    \"range2 = widgets.IntSlider(description='Range 2')\\n\",\n    \"\\n\",\n    \"l = widgets.jslink((range1, 'value'), (range2, 'value'))\\n\",\n    \"display(caption, range1, range2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# NO LAG VERSION\\n\",\n    \"caption = widgets.Label(value = 'Changes in source_range values are reflected in target_range')\\n\",\n    \"\\n\",\n    \"source_range = widgets.IntSlider(description='Source range')\\n\",\n    \"target_range = widgets.IntSlider(description='Target range')\\n\",\n    \"\\n\",\n    \"dl = widgets.jsdlink((source_range, 'value'), (target_range, 'value'))\\n\",\n    \"display(caption, source_range, target_range)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Function `widgets.jslink` returns a `Link` widget. The link can be broken by calling the `unlink` method.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"l.unlink()\\n\",\n    \"dl.unlink()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### The difference between linking in the kernel and linking in the client\\n\",\n    \"\\n\",\n    \"Linking in the kernel means linking via python. If two sliders are linked in the kernel, when one slider is changed the browser sends a message to the kernel (python in this case) updating the changed slider, the link widget in the kernel then propagates the change to the other slider object in the kernel, and then the other slider’s kernel object sends a message to the browser to update the other slider’s views in the browser. If the kernel is not running (as in a static web page), then the controls will not be linked.\\n\",\n    \"\\n\",\n    \"Linking using jslink (i.e., on the browser side) means contructing the link in Javascript. When one slider is changed, Javascript running in the browser changes the value of the other slider in the browser, without needing to communicate with the kernel at all. If the sliders are attached to kernel objects, each slider will update their kernel-side objects independently.\\n\",\n    \"\\n\",\n    \"To see the difference between the two, go to the [ipywidgets documentation](http://ipywidgets.readthedocs.io/en/latest/examples/Widget%20Events.html) and try out the sliders near the bottom. The ones linked in the kernel with `link` and `dlink` are no longer linked, but the ones linked in the browser with `jslink` and `jsdlink` are still linked.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Continuous updates\\n\",\n    \"\\n\",\n    \"Some widgets offer a choice with their `continuous_update` attribute between continually updating values or only updating values when a user submits the value (for example, by pressing Enter or navigating away from the control). In the next example, we see the “Delayed” controls only transmit their value after the user finishes dragging the slider or submitting the textbox. The “Continuous” controls continually transmit their values as they are changed. Try typing a two-digit number into each of the text boxes, or dragging each of the sliders, to see the difference.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import traitlets\\n\",\n    \"a = widgets.IntSlider(description=\\\"Delayed\\\", continuous_update=False)\\n\",\n    \"b = widgets.IntText(description=\\\"Delayed\\\", continuous_update=False)\\n\",\n    \"c = widgets.IntSlider(description=\\\"Continuous\\\", continuous_update=True)\\n\",\n    \"d = widgets.IntText(description=\\\"Continuous\\\", continuous_update=True)\\n\",\n    \"\\n\",\n    \"traitlets.link((a, 'value'), (b, 'value'))\\n\",\n    \"traitlets.link((a, 'value'), (c, 'value'))\\n\",\n    \"traitlets.link((a, 'value'), (d, 'value'))\\n\",\n    \"widgets.VBox([a,b,c,d])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Sliders, `Text`, and `Textarea` controls default to `continuous_update=True`. `IntText` and other text boxes for entering integer or float numbers default to `continuous_update=False` (since often you’ll want to type an entire number before submitting the value by pressing enter or navigating out of the box).\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Conclusion\\n\",\n    \"You should now feel comfortable linking Widget events!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"cell_tags\": [\n   [\n    \"<None>\",\n    null\n   ]\n  ],\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "19-Bonus Material - Introduction to GUIs/.ipynb_checkpoints/05-Widget Styling-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Widget Styling\\n\",\n    \"\\n\",\n    \"In this lecture we will learn about the various ways to style widgets!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## `style` vs. `layout`\\n\",\n    \"\\n\",\n    \"There are two ways to change the appearance of widgets in the browser. The first is through the `layout` attribute which exposes layout-related CSS properties for the top-level DOM element of widgets, such as margins and positioning. The second is through the `style` attribute which exposes non-layout related attributes like button color and font weight. While `layout` is general to all widgets and containers of widgets, `style` offers tools specific to each type of widget.\\n\",\n    \"\\n\",\n    \"Thorough understanding of all that `layout` has to offer requires knowledge of front-end web development, including HTML and CSS. This section provides a brief overview of things that can be adjusted using `layout`. However, the full set of tools are provided in the separate notebook **Advanced Widget Styling with Layout**.\\n\",\n    \"\\n\",\n    \"To learn more about web development, including HTML and CSS, check out the course [\\n\",\n    \"Python and Django Full Stack Web Developer Bootcamp](https://www.udemy.com/python-and-django-full-stack-web-developer-bootcamp/)\\n\",\n    \"\\n\",\n    \"Basic styling is more intuitive as it relates directly to each type of widget. Here we provide a set of helpful examples of the `style` attribute.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## The `layout` attribute\\n\",\n    \"Jupyter interactive widgets have a `layout` attribute exposing a number of CSS properties that impact how widgets are laid out. These properties map to the values of the CSS properties of the same name (underscores being replaced with dashes), applied to the top DOM elements of the corresponding widget.\\n\",\n    \"\\n\",\n    \"#### Sizes\\n\",\n    \"* `height`\\n\",\n    \"* `width`\\n\",\n    \"* `max_height`\\n\",\n    \"* `max_width`\\n\",\n    \"* `min_height`\\n\",\n    \"* `min_width`\\n\",\n    \"\\n\",\n    \"#### Display\\n\",\n    \"* `visibility`\\n\",\n    \"* `display`\\n\",\n    \"* `overflow`\\n\",\n    \"* `overflow_x`\\n\",\n    \"* `overflow_y`\\n\",\n    \"\\n\",\n    \"#### Box model\\n\",\n    \"* `border`\\n\",\n    \"* `margin`\\n\",\n    \"* `padding`\\n\",\n    \"\\n\",\n    \"#### Positioning\\n\",\n    \"* `top`\\n\",\n    \"* `left`\\n\",\n    \"* `bottom`\\n\",\n    \"* `right`\\n\",\n    \"\\n\",\n    \"#### Flexbox\\n\",\n    \"* `order`\\n\",\n    \"* `flex_flow`\\n\",\n    \"* `align_items`\\n\",\n    \"* `flex`\\n\",\n    \"* `align_self`\\n\",\n    \"* `align_content`\\n\",\n    \"* `justify_content`\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## A quick example of `layout`\\n\",\n    \"\\n\",\n    \"We've already seen what a slider looks like without any layout adjustments:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import ipywidgets as widgets\\n\",\n    \"from IPython.display import display\\n\",\n    \"\\n\",\n    \"w = widgets.IntSlider()\\n\",\n    \"display(w)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's say we wanted to change two of the properties of this widget: `margin` and `height`. We want to center the slider in the output area and increase its height. This can be done by adding `layout` attributes to **w**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"w.layout.margin = 'auto'\\n\",\n    \"w.layout.height = '75px'\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice that the slider changed positions on the page immediately!\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Layout settings can be passed from one widget to another widget of the same type. Let's first create a new IntSlider:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"x = widgets.IntSlider(value=15,description='New slider')\\n\",\n    \"display(x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now assign **w**'s layout settings to **x**:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"x.layout = w.layout\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"That's it! For a complete set of instructions on using `layout`, visit the **Advanced Widget Styling - Layout** notebook.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Predefined styles\\n\",\n    \"\\n\",\n    \"Before we investigate the `style` attribute, it should be noted that many widgets offer a list of pre-defined styles that can be passed as arguments during creation.\\n\",\n    \"\\n\",\n    \"For example, the `Button` widget has a `button_style` attribute that may take 5 different values:\\n\",\n    \"\\n\",\n    \"* `'primary'`\\n\",\n    \"* `'success'`\\n\",\n    \"* `'info'`\\n\",\n    \"* `'warning'`\\n\",\n    \"* `'danger'`\\n\",\n    \"\\n\",\n    \"besides the default empty string `''`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import ipywidgets as widgets\\n\",\n    \"\\n\",\n    \"widgets.Button(description='Ordinary Button', button_style='')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.Button(description='Danger Button', button_style='danger')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## The `style` attribute\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"While the `layout` attribute only exposes layout-related CSS properties for the top-level DOM element of widgets, the\\n\",\n    \"`style` attribute is used to expose non-layout related styling attributes of widgets.\\n\",\n    \"\\n\",\n    \"However, the properties of the `style` atribute are specific to each widget type.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"b1 = widgets.Button(description='Custom color')\\n\",\n    \"b1.style.button_color = 'lightgreen'\\n\",\n    \"b1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can get a list of the style attributes for a widget with the `keys` property.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"b1.style.keys\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note that `widgets.Button().style.keys` also works.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Just like the `layout` attribute, widget styles can be assigned to other widgets.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"b2 = widgets.Button()\\n\",\n    \"b2.style = b1.style\\n\",\n    \"b2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note that only the style was picked up by **b2**, not any other parameters like `description`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Widget styling attributes are specific to each widget type.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s1 = widgets.IntSlider(description='Blue handle')\\n\",\n    \"s1.style.handle_color = 'lightblue'\\n\",\n    \"s1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Widget style traits\\n\",\n    \"\\n\",\n    \"These are traits that belong to some of the more common widgets:\\n\",\n    \"\\n\",\n    \"#### Button\\n\",\n    \"\\n\",\n    \"- `button_color`\\n\",\n    \"- `font_weight`\\n\",\n    \"\\n\",\n    \"#### IntSlider, FloatSlider, IntRangeSlider, FloatRangeSlider\\n\",\n    \"\\n\",\n    \"- `description_width`\\n\",\n    \"- `handle_color`\\n\",\n    \"\\n\",\n    \"#### IntProgress, FloatProgress\\n\",\n    \"\\n\",\n    \"- `bar_color`\\n\",\n    \"- `description_width`\\n\",\n    \"\\n\",\n    \"Most others such as `ToggleButton`, `Checkbox`, `Dropdown`, `RadioButtons`, `Select` and `Text` only have `description_width` as an adjustable trait.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Conclusion\\n\",\n    \"\\n\",\n    \"You should now have an understanding of how to style widgets!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"cell_tags\": [\n   [\n    \"<None>\",\n    null\n   ]\n  ],\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "19-Bonus Material - Introduction to GUIs/.ipynb_checkpoints/06-Custom Widget-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Custom Widget\\n\",\n    \"## Exploring the Lorenz System of Differential Equations\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In this Notebook we explore the Lorenz system of differential equations:\\n\",\n    \"\\n\",\n    \"$$\\n\",\n    \"\\\\begin{aligned}\\n\",\n    \"\\\\dot{x} & = \\\\sigma(y-x) \\\\\\\\\\n\",\n    \"\\\\dot{y} & = \\\\rho x - y - xz \\\\\\\\\\n\",\n    \"\\\\dot{z} & = -\\\\beta z + xy\\n\",\n    \"\\\\end{aligned}\\n\",\n    \"$$\\n\",\n    \"\\n\",\n    \"This is one of the classic systems in non-linear differential equations. It exhibits a range of different behaviors as the parameters ($\\\\sigma$, $\\\\beta$, $\\\\rho$) are varied.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Imports\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"First, we import the needed things from IPython, [NumPy](http://www.numpy.org/), [Matplotlib](http://matplotlib.org/index.html) and [SciPy](http://www.scipy.org/). Check out the class [Python for Data Science and Machine Learning Bootcamp](https://www.udemy.com/python-for-data-science-and-machine-learning-bootcamp/) if you're interested in learning more about this part of Python!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"%matplotlib inline\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from ipywidgets import interact, interactive\\n\",\n    \"from IPython.display import clear_output, display, HTML\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import numpy as np\\n\",\n    \"from scipy import integrate\\n\",\n    \"\\n\",\n    \"from matplotlib import pyplot as plt\\n\",\n    \"from mpl_toolkits.mplot3d import Axes3D\\n\",\n    \"from matplotlib.colors import cnames\\n\",\n    \"from matplotlib import animation\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Computing the trajectories and plotting the result\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We define a function that can integrate the differential equations numerically and then plot the solutions. This function has arguments that control the parameters of the differential equation ($\\\\sigma$, $\\\\beta$, $\\\\rho$), the numerical integration (`N`, `max_time`) and the visualization (`angle`).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def solve_lorenz(N=10, angle=0.0, max_time=4.0, sigma=10.0, beta=8./3, rho=28.0):\\n\",\n    \"\\n\",\n    \"    fig = plt.figure();\\n\",\n    \"    ax = fig.add_axes([0, 0, 1, 1], projection='3d');\\n\",\n    \"    ax.axis('off')\\n\",\n    \"\\n\",\n    \"    # prepare the axes limits\\n\",\n    \"    ax.set_xlim((-25, 25))\\n\",\n    \"    ax.set_ylim((-35, 35))\\n\",\n    \"    ax.set_zlim((5, 55))\\n\",\n    \"    \\n\",\n    \"    def lorenz_deriv(x_y_z, t0, sigma=sigma, beta=beta, rho=rho):\\n\",\n    \"        \\\"\\\"\\\"Compute the time-derivative of a Lorenz system.\\\"\\\"\\\"\\n\",\n    \"        x, y, z = x_y_z\\n\",\n    \"        return [sigma * (y - x), x * (rho - z) - y, x * y - beta * z]\\n\",\n    \"\\n\",\n    \"    # Choose random starting points, uniformly distributed from -15 to 15\\n\",\n    \"    np.random.seed(1)\\n\",\n    \"    x0 = -15 + 30 * np.random.random((N, 3))\\n\",\n    \"\\n\",\n    \"    # Solve for the trajectories\\n\",\n    \"    t = np.linspace(0, max_time, int(250*max_time))\\n\",\n    \"    x_t = np.asarray([integrate.odeint(lorenz_deriv, x0i, t)\\n\",\n    \"                      for x0i in x0])\\n\",\n    \"    \\n\",\n    \"    # choose a different color for each trajectory\\n\",\n    \"    colors = plt.cm.jet(np.linspace(0, 1, N));\\n\",\n    \"\\n\",\n    \"    for i in range(N):\\n\",\n    \"        x, y, z = x_t[i,:,:].T\\n\",\n    \"        lines = ax.plot(x, y, z, '-', c=colors[i])\\n\",\n    \"        _ = plt.setp(lines, linewidth=2);\\n\",\n    \"\\n\",\n    \"    ax.view_init(30, angle)\\n\",\n    \"    _ = plt.show();\\n\",\n    \"\\n\",\n    \"    return t, x_t\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's call the function once to view the solutions. For this set of parameters, we see the trajectories swirling around two points, called attractors. \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x2ac822183c8>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"t, x_t = solve_lorenz(angle=0, N=10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Using IPython's `interactive` function, we can explore how the trajectories behave as we change the various parameters.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"8c6fcac683e54aebb53559937774065e\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(IntSlider(value=10, description='N', max=50), FloatSlider(value=0.0, description='angle', max=360.0), FloatSlider(value=4.0, description='max_time', max=12.0, min=-4.0), FloatSlider(value=10.0, description='sigma', max=50.0), FloatSlider(value=2.6666666666666665, description='beta', max=8.0, min=-2.6666666666666665), FloatSlider(value=28.0, description='rho', max=50.0), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"w = interactive(solve_lorenz, angle=(0.,360.), N=(0,50), sigma=(0.0,50.0), rho=(0.0,50.0))\\n\",\n    \"display(w);\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The object returned by `interactive` is a `Widget` object and it has attributes that contain the current result and arguments:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"t, x_t = w.result\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'N': 10,\\n\",\n       \" 'angle': 0.0,\\n\",\n       \" 'beta': 2.6666666666666665,\\n\",\n       \" 'max_time': 4.0,\\n\",\n       \" 'rho': 28.0,\\n\",\n       \" 'sigma': 10.0}\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"w.kwargs\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"After interacting with the system, we can take the result and perform further computations. In this case, we compute the average positions in $x$, $y$ and $z$.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"xyz_avg = x_t.mean(axis=1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(10, 3)\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"xyz_avg.shape\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Creating histograms of the average positions (across different trajectories) show that on average the trajectories swirl about the attractors.\\n\",\n    \"\\n\",\n    \"*NOTE: These will look different from the lecture version if you adjusted any of the sliders in the* `interactive` *widget and changed the parameters.*\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x2ac824c48d0>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"plt.hist(xyz_avg[:,0])\\n\",\n    \"plt.title('Average $x(t)$');\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x2ac82e62e80>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"plt.hist(xyz_avg[:,1])\\n\",\n    \"plt.title('Average $y(t)$');\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Conclusion\\n\",\n    \"\\n\",\n    \"Hopefully you've enjoyed using widgets in the Jupyter Notebook system and have begun to explore the other GUI possibilities for Python!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "19-Bonus Material - Introduction to GUIs/.ipynb_checkpoints/07-Advanced Widget List-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Advanced Widget List\\n\",\n    \"\\n\",\n    \"This notebook is an extension of **Widget List**, describing even more of the GUI widgets available!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import ipywidgets as widgets\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Output\\n\",\n    \"The `Output` widget can capture and display stdout, stderr and [rich output generated by IPython](http://ipython.readthedocs.io/en/stable/api/generated/IPython.display.html#module-IPython.display). After the widget is created, direct output to it using a context manager.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"out = widgets.Output()\\n\",\n    \"out\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"You can print text to the output area as shown below.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"with out:\\n\",\n    \"    for i in range(10):\\n\",\n    \"        print(i, 'Hello world!')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Rich material can also be directed to the output area. Anything which displays nicely in a Jupyter notebook will also display well in the `Output` widget.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from IPython.display import YouTubeVideo\\n\",\n    \"with out:\\n\",\n    \"    display(YouTubeVideo('eWzY2nGfkXk'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Play (Animation) widget\\n\",\n    \"The `Play` widget is useful to perform animations by iterating on a sequence of integers with a certain speed. The value of the slider below is linked to the player.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"play = widgets.Play(\\n\",\n    \"    # interval=10,\\n\",\n    \"    value=50,\\n\",\n    \"    min=0,\\n\",\n    \"    max=100,\\n\",\n    \"    step=1,\\n\",\n    \"    description=\\\"Press play\\\",\\n\",\n    \"    disabled=False\\n\",\n    \")\\n\",\n    \"slider = widgets.IntSlider()\\n\",\n    \"widgets.jslink((play, 'value'), (slider, 'value'))\\n\",\n    \"widgets.HBox([play, slider])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Date picker\\n\",\n    \"The date picker widget works in Chrome and IE Edge, but does not currently work in Firefox or Safari because they do not support the HTML date input field.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.DatePicker(\\n\",\n    \"    description='Pick a Date',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Color picker\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.ColorPicker(\\n\",\n    \"    concise=False,\\n\",\n    \"    description='Pick a color',\\n\",\n    \"    value='blue',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Controller\\n\",\n    \"The `Controller` allows a game controller to be used as an input device.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.Controller(\\n\",\n    \"    index=0,\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Container/Layout widgets\\n\",\n    \"\\n\",\n    \"These widgets are used to hold other widgets, called children. Each has a `children` property that may be set either when the widget is created or later.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Box\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"items = [widgets.Label(str(i)) for i in range(4)]\\n\",\n    \"widgets.Box(items)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### HBox\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"items = [widgets.Label(str(i)) for i in range(4)]\\n\",\n    \"widgets.HBox(items)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### VBox\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"items = [widgets.Label(str(i)) for i in range(4)]\\n\",\n    \"left_box = widgets.VBox([items[0], items[1]])\\n\",\n    \"right_box = widgets.VBox([items[2], items[3]])\\n\",\n    \"widgets.HBox([left_box, right_box])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Accordion\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"accordion = widgets.Accordion(children=[widgets.IntSlider(), widgets.Text()])\\n\",\n    \"accordion.set_title(0, 'Slider')\\n\",\n    \"accordion.set_title(1, 'Text')\\n\",\n    \"accordion\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Tabs\\n\",\n    \"\\n\",\n    \"In this example the children are set after the tab is created. Titles for the tabes are set in the same way they are for `Accordion`.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"tab_contents = ['P0', 'P1', 'P2', 'P3', 'P4']\\n\",\n    \"children = [widgets.Text(description=name) for name in tab_contents]\\n\",\n    \"tab = widgets.Tab()\\n\",\n    \"tab.children = children\\n\",\n    \"for i in range(len(children)):\\n\",\n    \"    tab.set_title(i, str(i))\\n\",\n    \"tab\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Accordion and Tab use `selected_index`, not value\\n\",\n    \"\\n\",\n    \"Unlike the rest of the widgets discussed earlier, the container widgets `Accordion` and `Tab` update their `selected_index` attribute when the user changes which accordion or tab is selected. That means that you can both see what the user is doing *and* programmatically set what the user sees by setting the value of `selected_index`.\\n\",\n    \"\\n\",\n    \"Setting `selected_index = None` closes all of the accordions or deselects all tabs.\\n\",\n    \"\\n\",\n    \"In the cells below try displaying or setting the `selected_index` of the `tab` and/or `accordion`.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"tab.selected_index = 3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"accordion.selected_index = None\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Nesting tabs and accordions\\n\",\n    \"\\n\",\n    \"Tabs and accordions can be nested as deeply as you want. If you have a few minutes, try nesting a few accordions or putting an accordion inside a tab or a tab inside an accordion.\\n\",\n    \"\\n\",\n    \"The example below makes a couple of tabs with an accordion children in one of them\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"tab_nest = widgets.Tab()\\n\",\n    \"tab_nest.children = [accordion, accordion]\\n\",\n    \"tab_nest.set_title(0, 'An accordion')\\n\",\n    \"tab_nest.set_title(1, 'Copy of the accordion')\\n\",\n    \"tab_nest\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Conclusion\\n\",\n    \"\\n\",\n    \"Use this as a further reference for yourself!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "19-Bonus Material - Introduction to GUIs/.ipynb_checkpoints/08-Advanced Widget Styling with Layout-checkpoint.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Advanced Widget Styling with Layout\\n\",\n    \"\\n\",\n    \"This notebook expands on the **Widget Styling** lecture by describing the various HTML and CSS adjustments that can be made through the `layout` attribute.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## The `layout` attribute\\n\",\n    \"Jupyter interactive widgets have a `layout` attribute exposing a number of CSS properties that impact how widgets are laid out.\\n\",\n    \"\\n\",\n    \"### Exposed CSS properties\\n\",\n    \"<div class=\\\"alert alert-info\\\" style=\\\"margin: 20px\\\">The following properties map to the values of the CSS properties of the same name (underscores being replaced with dashes), applied to the top DOM elements of the corresponding widget.</div>\\n\",\n    \"\\n\",\n    \"#### Sizes\\n\",\n    \"* `height`\\n\",\n    \"* `width`\\n\",\n    \"* `max_height`\\n\",\n    \"* `max_width`\\n\",\n    \"* `min_height`\\n\",\n    \"* `min_width`\\n\",\n    \"\\n\",\n    \"#### Display\\n\",\n    \"* `visibility`\\n\",\n    \"* `display`\\n\",\n    \"* `overflow`\\n\",\n    \"* `overflow_x`\\n\",\n    \"* `overflow_y`\\n\",\n    \"\\n\",\n    \"#### Box model\\n\",\n    \"* `border`\\n\",\n    \"* `margin`\\n\",\n    \"* `padding`\\n\",\n    \"\\n\",\n    \"#### Positioning\\n\",\n    \"* `top`\\n\",\n    \"* `left`\\n\",\n    \"* `bottom`\\n\",\n    \"* `right`\\n\",\n    \"\\n\",\n    \"#### Flexbox\\n\",\n    \"* `order`\\n\",\n    \"* `flex_flow`\\n\",\n    \"* `align_items`\\n\",\n    \"* `flex`\\n\",\n    \"* `align_self`\\n\",\n    \"* `align_content`\\n\",\n    \"* `justify_content`\\n\",\n    \"\\n\",\n    \"### Shorthand CSS properties\\n\",\n    \"\\n\",\n    \"You may have noticed that certain CSS properties such as `margin-[top/right/bottom/left]` seem to be missing. The same holds for `padding-[top/right/bottom/left]` etc.\\n\",\n    \"\\n\",\n    \"In fact, you can atomically specify `[top/right/bottom/left]` margins via the `margin` attribute alone by passing the string `'100px 150px 100px 80px'` for a respectively `top`, `right`, `bottom` and `left` margins of `100`, `150`, `100` and `80` pixels.\\n\",\n    \"\\n\",\n    \"Similarly, the `flex` attribute can hold values for `flex-grow`, `flex-shrink` and `flex-basis`. The `border` attribute is a shorthand property for `border-width`, `border-style (required)`, and `border-color`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import ipywidgets as widgets\\n\",\n    \"from IPython.display import display\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Conclusion\\n\",\n    \"\\n\",\n    \"You should now have an understanding of how to style widgets!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"cell_tags\": [\n   [\n    \"<None>\",\n    null\n   ]\n  ],\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "19-Bonus Material - Introduction to GUIs/01-Interact.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Using Interact\\n\",\n    \"\\n\",\n    \"In this lecture we will begin to learn about creating dashboard-type GUI with iPython widgets!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The `interact` function (`ipywidgets.interact`) automatically creates user interface (UI) controls for exploring code and data interactively. It is the easiest way to get started using IPython's widgets.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Start with some imports!\\n\",\n    \"\\n\",\n    \"from ipywidgets import interact, interactive, fixed\\n\",\n    \"import ipywidgets as widgets\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<div class=\\\"alert alert-success\\\">\\n\",\n    \"Please Note! The widgets in this notebook won't show up on NbViewer or GitHub renderings. To view the widgets and interact with them, you will need to download this notebook and run it with a Jupyter Notebook server.\\n\",\n    \"\\n\",\n    \"</div>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Basic `interact`\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"At the most basic level, `interact` auto-generates UI controls for function arguments, and then calls the function with those arguments when you manipulate the controls interactively. To use `interact`, you need to define a function that you want to explore. Here is a function that prints its only argument `x`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Very basic function\\n\",\n    \"def f(x):\\n\",\n    \"    return x\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"When you pass this function as the first argument to `interact` along with an integer keyword argument (`x=10`), a slider is generated and bound to the function parameter. Note that the semicolon here just prevents an **out** cell from showing up.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"d19364a3984541918392df94acd74157\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(IntSlider(value=10, description='x', max=30, min=-10), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# Generate a slider to interact with\\n\",\n    \"interact(f, x=10,);\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"When you move the slider, the function is called, which prints the current value of `x`.\\n\",\n    \"\\n\",\n    \"If you pass `True` or `False`, `interact` will generate a check-box:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"scrolled\": true\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"d56caf432729463dabc716ef65c437db\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(Checkbox(value=True, description='x'), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# Booleans generate check-boxes\\n\",\n    \"interact(f, x=True);\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you pass a string, `interact` will generate a text area.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"3ec606e93ced408992a5cb0f59903ed9\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(Text(value='Hi there!', description='x'), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# Strings generate text areas\\n\",\n    \"interact(f, x='Hi there!');\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"`interact` can also be used as a decorator. This allows you to define a function and interact with it in a single shot. As this example shows, `interact` also works with functions that have multiple arguments.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"4d87f586f60945c3ba0ed9dcc4e1874a\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(Checkbox(value=True, description='x'), FloatSlider(value=1.0, description='y', max=3.0, min=-1.0), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# Using a decorator!\\n\",\n    \"@interact(x=True, y=1.0)\\n\",\n    \"def g(x, y):\\n\",\n    \"    return (x, y)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Fixing arguments using `fixed`\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There are times when you may want to explore a function using `interact`, but fix one or more of its arguments to specific values. This can be accomplished by wrapping values with the `fixed` function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Again, a simple function\\n\",\n    \"def h(p, q):\\n\",\n    \"    return (p, q)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"When we call `interact`, we pass `fixed(20)` for q to hold it fixed at a value of `20`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"1bcccacaa1cc43f9a1df1b4df87503ff\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(IntSlider(value=5, description='p', max=15, min=-5), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"interact(h, p=5, q=fixed(20));\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice that a slider is only produced for `p` as the value of `q` is fixed.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Widget abbreviations\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"When you pass an integer-valued keyword argument of `10` (`x=10`) to `interact`, it generates an integer-valued slider control with a range of `[-10,+3\\\\times10]`. In this case, `10` is an *abbreviation* for an actual slider widget:\\n\",\n    \"\\n\",\n    \"```python\\n\",\n    \"IntSlider(min=-10,max=30,step=1,value=10)\\n\",\n    \"```\\n\",\n    \"\\n\",\n    \"In fact, we can get the same result if we pass this `IntSlider` as the keyword argument for `x`:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"a251c042d8de4ecfbbfe2f2c4d65de55\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(IntSlider(value=10, description='x', max=30, min=-10), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# Can call the IntSlider to get more specific\\n\",\n    \"interact(f, x=widgets.IntSlider(min=-10,max=30,step=1,value=10));\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This examples clarifies how `interact` processes its keyword arguments:\\n\",\n    \"\\n\",\n    \"1. If the keyword argument is a `Widget` instance with a `value` attribute, that widget is used. Any widget with a `value` attribute can be used, even custom ones.\\n\",\n    \"2. Otherwise, the value is treated as a *widget abbreviation* that is converted to a widget before it is used.\\n\",\n    \"\\n\",\n    \"The following table gives an overview of different widget abbreviations:\\n\",\n    \"\\n\",\n    \"<table class=\\\"table table-condensed table-bordered\\\">\\n\",\n    \"  <tr><td><strong>Keyword argument</strong></td><td><strong>Widget</strong></td></tr>  \\n\",\n    \"  <tr><td>`True` or `False`</td><td>Checkbox</td></tr>  \\n\",\n    \"  <tr><td>`'Hi there'`</td><td>Text</td></tr>\\n\",\n    \"  <tr><td>`value` or `(min,max)` or `(min,max,step)` if integers are passed</td><td>IntSlider</td></tr>\\n\",\n    \"  <tr><td>`value` or `(min,max)` or `(min,max,step)` if floats are passed</td><td>FloatSlider</td></tr>\\n\",\n    \"  <tr><td>`['orange','apple']` or `{'one':1,'two':2}`</td><td>Dropdown</td></tr>\\n\",\n    \"</table>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note that a dropdown is used if a list or a dict is given (signifying discrete choices), and a slider is used if a tuple is given (signifying a range).\\n\",\n    \"\\n\",\n    \"You have seen how the checkbox and text area widgets work above. Here, more details about the different abbreviations for sliders and drop-downs are given.\\n\",\n    \"\\n\",\n    \"If a 2-tuple of integers is passed `(min,max)`, an integer-valued slider is produced with those minimum and maximum values (inclusively). In this case, the default step size of `1` is used.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"671e9e1043b44bbf905862440167bec4\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(IntSlider(value=2, description='x', max=4), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# Min,Max slider with Tuples\\n\",\n    \"interact(f, x=(0,4));\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If a 3-tuple of integers is passed `(min,max,step)`, the step size can also be set.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"912b839b05ba488d819ff0c09c877a57\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(IntSlider(value=4, description='x', max=8, step=2), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# (min, max, step)\\n\",\n    \"interact(f, x=(0,8,2));\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"A float-valued slider is produced if the elements of the tuples are floats. Here the minimum is `0.0`, the maximum is `10.0` and step size is `0.1` (the default).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"e7cbdf72471d406ca80bed9a232e6605\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(FloatSlider(value=5.0, description='x', max=10.0), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"interact(f, x=(0.0,10.0));\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The step size can be changed by passing a third element in the tuple.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"239573e3448a44179962dccfb9fe15cf\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(FloatSlider(value=5.0, description='x', max=10.0, step=0.01), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"interact(f, x=(0.0,10.0,0.01));\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"For both integer and float-valued sliders, you can pick the initial value of the widget by passing a default keyword argument to the underlying Python function. Here we set the initial value of a float slider to `5.5`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"fd58de461e564c38b0a12def19ccfd1b\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(FloatSlider(value=5.5, description='x', max=20.0, step=0.5), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"@interact(x=(0.0,20.0,0.5))\\n\",\n    \"def h(x=5.5):\\n\",\n    \"    return x\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Dropdown menus are constructed by passing a list of strings. In this case, the strings are both used as the names in the drop-down menu UI and passed to the underlying Python function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"88ab10cb594d46b2ade99079f5087f12\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(Dropdown(description='x', options=('apples', 'oranges'), value='apples'), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"interact(f, x=['apples','oranges']);\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you want a drop-down menu that passes non-string values to the Python function, you can pass a dictionary. The keys in the dictionary are used for the names in the drop-down menu UI and the values are the arguments that are passed to the underlying Python function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"d006408fb16f457b81eb604f5bf18220\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(Dropdown(description='x', options={'one': 10, 'two': 20}, value=10), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"interact(f, x={'one': 10, 'two': 20});\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Using function annotations with `interact`\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can also specify widget abbreviations using [function annotations](https://docs.python.org/3/tutorial/controlflow.html#function-annotations).\\n\",\n    \"\\n\",\n    \"Define a function with a checkbox widget abbreviation for the argument `x`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def f(x:True):  # Python 3 only\\n\",\n    \"    return x\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Then, because the widget abbreviation has already been defined, you can call `interact` with a single argument.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"70f34f96f12143b492fc3160d089f854\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(Checkbox(value=True, description='x'), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"interact(f);\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## interactive\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In addition to `interact`, IPython provides another function, `interactive`, that is useful when you want to reuse the widgets that are produced or access the data that is bound to the UI controls.\\n\",\n    \"\\n\",\n    \"Note that unlike `interact`, the return value of the function will not be displayed automatically, but you can display a value inside the function with `IPython.display.display`.\\n\",\n    \"\\n\",\n    \"Here is a function that returns the sum of its two arguments and displays them. The display line may be omitted if you don’t want to show the result of the function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from IPython.display import display\\n\",\n    \"\\n\",\n    \"def f(a, b):\\n\",\n    \"    display(a + b)\\n\",\n    \"    return a+b\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Unlike `interact`, `interactive` returns a `Widget` instance rather than immediately displaying the widget.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"w = interactive(f, a=10, b=20)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The widget is an `interactive`, a subclass of `VBox`, which is a container for other widgets.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"ipywidgets.widgets.interaction.interactive\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"type(w)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The children of the `interactive` are two integer-valued sliders and an output widget, produced by the widget abbreviations above.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(IntSlider(value=10, description='a', max=30, min=-10),\\n\",\n       \" IntSlider(value=20, description='b', max=60, min=-20),\\n\",\n       \" Output())\"\n      ]\n     },\n     \"execution_count\": 25,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"w.children\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"To actually display the widgets, you can use IPython's `display` function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"0da895902d664d5086ed00d535d36ef3\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(IntSlider(value=10, description='a', max=30, min=-10), IntSlider(value=20, description='b', max=60, min=-20), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"display(w)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"At this point, the UI controls work just like they would if `interact` had been used. You can manipulate them interactively and the function will be called. However, the widget instance returned by `interactive` also give you access to the current keyword arguments and return value of the underlying Python function.\\n\",\n    \"\\n\",\n    \"Here are the current keyword arguments. If you rerun this cell after manipulating the sliders, the values will have changed.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'a': 10, 'b': 20}\"\n      ]\n     },\n     \"execution_count\": 27,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"w.kwargs\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Here is the current return value of the function.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"30\"\n      ]\n     },\n     \"execution_count\": 28,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"w.result\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Conclusion\\n\",\n    \"\\n\",\n    \"You should now have a basic understanding of how to use Interact in Jupyter Notebooks!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "19-Bonus Material - Introduction to GUIs/02-Widget Basics.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Widget Basics\\n\",\n    \"\\n\",\n    \"In this lecture we will continue to build off our understanding of **interact** and **interactive** to begin using full widgets!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## What are widgets?\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"Widgets are eventful python objects that have a representation in the browser, often as a control like a slider, textbox, etc.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## What can they be used for?\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"You can use widgets to build **interactive GUIs** for your notebooks.  \\n\",\n    \"You can also use widgets to **synchronize stateful and stateless information** between Python and JavaScript.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Using widgets  \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"To use the widget framework, you need to import `ipywidgets`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import ipywidgets as widgets\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### repr\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Widgets have their own display `repr` which allows them to be displayed using IPython's display framework. Constructing and returning an `IntSlider` automatically displays the widget (as seen below). Widgets are displayed inside the output area below the code cell. Clearing cell output will also remove the widget.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"scrolled\": true\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"e1feeb5d164345929849b3775b347ad7\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>IntSlider</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"IntSlider(value=0)\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"widgets.IntSlider()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### display()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can also explicitly display the widget using `display(...)`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"75f00040661845228532350c310c4bc6\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>IntSlider</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"IntSlider(value=0)\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"from IPython.display import display\\n\",\n    \"w = widgets.IntSlider()\\n\",\n    \"display(w)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Multiple display() calls\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If you display the same widget twice, the displayed instances in the front-end will remain in sync with each other. Try dragging the slider below and watch the slider above.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"75f00040661845228532350c310c4bc6\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>IntSlider</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"IntSlider(value=0)\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"display(w)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Closing widgets\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can close a widget by calling its `close()` method.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"75f00040661845228532350c310c4bc6\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>IntSlider</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"IntSlider(value=0)\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"display(w)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"w.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Widget properties\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"All of the IPython widgets share a similar naming scheme. To read the value of a widget, you can query its `value` property.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"a5ab821e8906437d99a86664021856d3\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>IntSlider</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"IntSlider(value=0)\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"w = widgets.IntSlider()\\n\",\n    \"display(w)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"0\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"w.value\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Similarly, to set a widget's value, you can set its `value` property.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"w.value = 100\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Keys\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In addition to `value`, most widgets share `keys`, `description`, and `disabled`. To see the entire list of synchronized, stateful properties of any specific widget, you can query the `keys` property.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['_dom_classes',\\n\",\n       \" '_model_module',\\n\",\n       \" '_model_module_version',\\n\",\n       \" '_model_name',\\n\",\n       \" '_view_count',\\n\",\n       \" '_view_module',\\n\",\n       \" '_view_module_version',\\n\",\n       \" '_view_name',\\n\",\n       \" 'continuous_update',\\n\",\n       \" 'description',\\n\",\n       \" 'disabled',\\n\",\n       \" 'layout',\\n\",\n       \" 'max',\\n\",\n       \" 'min',\\n\",\n       \" 'orientation',\\n\",\n       \" 'readout',\\n\",\n       \" 'readout_format',\\n\",\n       \" 'step',\\n\",\n       \" 'style',\\n\",\n       \" 'value']\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"w.keys\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Shorthand for setting the initial values of widget properties\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"While creating a widget, you can set some or all of the initial values of that widget by defining them as keyword arguments in the widget's constructor (as seen below).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"b35936af3f2741ae823d7d2fd4c7fcda\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>Text</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"Text(value='Hello World!', disabled=True)\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"widgets.Text(value='Hello World!', disabled=True)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Linking two similar widgets\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"If you need to display the same value two different ways, you'll have to use two different widgets. Instead of attempting to manually synchronize the values of the two widgets, you can use the `link` or `jslink` function to link two properties together (the difference between these is discussed in Widget Events).  Below, the values of two widgets are linked together.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"2013fbc8bf434a2b8d8d8ebe8f06c89a\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>FloatText</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"FloatText(value=0.0)\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"edacad1b8c34472c92ac5052449cba52\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>FloatSlider</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"FloatSlider(value=0.0)\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"a = widgets.FloatText()\\n\",\n    \"b = widgets.FloatSlider()\\n\",\n    \"display(a,b)\\n\",\n    \"\\n\",\n    \"mylink = widgets.jslink((a, 'value'), (b, 'value'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Unlinking widgets\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"Unlinking the widgets is simple.  All you have to do is call `.unlink` on the link object. Try changing one of the widgets above after unlinking to see that they can be independently changed.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"mylink.unlink()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Conclusion\\n\",\n    \"\\n\",\n    \"You should now be beginning to have an understanding of how Widgets can interact with each other and how you can begin to specify widget details.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "19-Bonus Material - Introduction to GUIs/03-Widget List.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Widget List\\n\",\n    \"\\n\",\n    \"This lecture will serve as a reference for widgets, providing a list of the GUI widgets available!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Complete list\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"For a complete list of the GUI widgets available to you, you can list the registered widget types. `Widget` is the base class.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import ipywidgets as widgets\\n\",\n    \"\\n\",\n    \"# Show all available widgets!\\n\",\n    \"for item in widgets.Widget.widget_types.items():\\n\",\n    \"    print(item[0][2][:-5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"## Numeric widgets\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There are 10 widgets distributed with IPython that are designed to display numeric values. Widgets exist for displaying integers and floats, both bounded and unbounded.  The integer widgets share a similar naming scheme to their floating point counterparts. By replacing `Float` with `Int` in the widget name, you can find the Integer equivalent.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### IntSlider\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.IntSlider(\\n\",\n    \"    value=7,\\n\",\n    \"    min=0,\\n\",\n    \"    max=10,\\n\",\n    \"    step=1,\\n\",\n    \"    description='Test:',\\n\",\n    \"    disabled=False,\\n\",\n    \"    continuous_update=False,\\n\",\n    \"    orientation='horizontal',\\n\",\n    \"    readout=True,\\n\",\n    \"    readout_format='d'\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### FloatSlider\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.FloatSlider(\\n\",\n    \"    value=7.5,\\n\",\n    \"    min=0,\\n\",\n    \"    max=10.0,\\n\",\n    \"    step=0.1,\\n\",\n    \"    description='Test:',\\n\",\n    \"    disabled=False,\\n\",\n    \"    continuous_update=False,\\n\",\n    \"    orientation='horizontal',\\n\",\n    \"    readout=True,\\n\",\n    \"    readout_format='.1f',\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Sliders can also be **displayed vertically**.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.FloatSlider(\\n\",\n    \"    value=7.5,\\n\",\n    \"    min=0,\\n\",\n    \"    max=10.0,\\n\",\n    \"    step=0.1,\\n\",\n    \"    description='Test:',\\n\",\n    \"    disabled=False,\\n\",\n    \"    continuous_update=False,\\n\",\n    \"    orientation='vertical',\\n\",\n    \"    readout=True,\\n\",\n    \"    readout_format='.1f',\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### IntRangeSlider\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.IntRangeSlider(\\n\",\n    \"    value=[5, 7],\\n\",\n    \"    min=0,\\n\",\n    \"    max=10,\\n\",\n    \"    step=1,\\n\",\n    \"    description='Test:',\\n\",\n    \"    disabled=False,\\n\",\n    \"    continuous_update=False,\\n\",\n    \"    orientation='horizontal',\\n\",\n    \"    readout=True,\\n\",\n    \"    readout_format='d',\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### FloatRangeSlider\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.FloatRangeSlider(\\n\",\n    \"    value=[5, 7.5],\\n\",\n    \"    min=0,\\n\",\n    \"    max=10.0,\\n\",\n    \"    step=0.1,\\n\",\n    \"    description='Test:',\\n\",\n    \"    disabled=False,\\n\",\n    \"    continuous_update=False,\\n\",\n    \"    orientation='horizontal',\\n\",\n    \"    readout=True,\\n\",\n    \"    readout_format='.1f',\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### IntProgress\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.IntProgress(\\n\",\n    \"    value=7,\\n\",\n    \"    min=0,\\n\",\n    \"    max=10,\\n\",\n    \"    step=1,\\n\",\n    \"    description='Loading:',\\n\",\n    \"    bar_style='', # 'success', 'info', 'warning', 'danger' or ''\\n\",\n    \"    orientation='horizontal'\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### FloatProgress\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.FloatProgress(\\n\",\n    \"    value=7.5,\\n\",\n    \"    min=0,\\n\",\n    \"    max=10.0,\\n\",\n    \"    step=0.1,\\n\",\n    \"    description='Loading:',\\n\",\n    \"    bar_style='info',\\n\",\n    \"    orientation='horizontal'\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The numerical text boxes that impose some limit on the data (range, integer-only) impose that restriction when the user presses enter.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### BoundedIntText\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.BoundedIntText(\\n\",\n    \"    value=7,\\n\",\n    \"    min=0,\\n\",\n    \"    max=10,\\n\",\n    \"    step=1,\\n\",\n    \"    description='Text:',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### BoundedFloatText\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.BoundedFloatText(\\n\",\n    \"    value=7.5,\\n\",\n    \"    min=0,\\n\",\n    \"    max=10.0,\\n\",\n    \"    step=0.1,\\n\",\n    \"    description='Text:',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### IntText\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.IntText(\\n\",\n    \"    value=7,\\n\",\n    \"    description='Any:',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### FloatText\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.FloatText(\\n\",\n    \"    value=7.5,\\n\",\n    \"    description='Any:',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"## Boolean widgets\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There are three widgets that are designed to display a boolean value.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### ToggleButton\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.ToggleButton(\\n\",\n    \"    value=False,\\n\",\n    \"    description='Click me',\\n\",\n    \"    disabled=False,\\n\",\n    \"    button_style='', # 'success', 'info', 'warning', 'danger' or ''\\n\",\n    \"    tooltip='Description',\\n\",\n    \"    icon='check'\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Checkbox\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.Checkbox(\\n\",\n    \"    value=False,\\n\",\n    \"    description='Check me',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Valid\\n\",\n    \"\\n\",\n    \"The valid widget provides a read-only indicator.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.Valid(\\n\",\n    \"    value=False,\\n\",\n    \"    description='Valid!',\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"## Selection widgets\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There are several widgets that can be used to display single selection lists, and two that can be used to select multiple values. All inherit from the same base class. You can specify the **enumeration of selectable options by passing a list** (options are either (label, value) pairs, or simply values for which the labels are derived by calling `str`). You can **also specify the enumeration as a dictionary**, in which case the **keys will be used as the item displayed** in the list and the corresponding **value will be used** when an item is selected (in this case, since dictionaries are unordered, the displayed order of items in the widget is unspecified).\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Dropdown\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.Dropdown(\\n\",\n    \"    options=['1', '2', '3'],\\n\",\n    \"    value='2',\\n\",\n    \"    description='Number:',\\n\",\n    \"    disabled=False,\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The following is also valid:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.Dropdown(\\n\",\n    \"    options={'One': 1, 'Two': 2, 'Three': 3},\\n\",\n    \"    value=2,\\n\",\n    \"    description='Number:',\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### RadioButtons\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.RadioButtons(\\n\",\n    \"    options=['pepperoni', 'pineapple', 'anchovies'],\\n\",\n    \"    # value='pineapple',\\n\",\n    \"    description='Pizza topping:',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Select\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.Select(\\n\",\n    \"    options=['Linux', 'Windows', 'OSX'],\\n\",\n    \"    value='OSX',\\n\",\n    \"    # rows=10,\\n\",\n    \"    description='OS:',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### SelectionSlider\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.SelectionSlider(\\n\",\n    \"    options=['scrambled', 'sunny side up', 'poached', 'over easy'],\\n\",\n    \"    value='sunny side up',\\n\",\n    \"    description='I like my eggs ...',\\n\",\n    \"    disabled=False,\\n\",\n    \"    continuous_update=False,\\n\",\n    \"    orientation='horizontal',\\n\",\n    \"    readout=True\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### SelectionRangeSlider\\n\",\n    \"The value, index, and label keys are 2-tuples of the min and max values selected. The options must be nonempty.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import datetime\\n\",\n    \"dates = [datetime.date(2015,i,1) for i in range(1,13)]\\n\",\n    \"options = [(i.strftime('%b'), i) for i in dates]\\n\",\n    \"widgets.SelectionRangeSlider(\\n\",\n    \"    options=options,\\n\",\n    \"    index=(0,11),\\n\",\n    \"    description='Months (2015)',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### ToggleButtons\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.ToggleButtons(\\n\",\n    \"    options=['Slow', 'Regular', 'Fast'],\\n\",\n    \"    description='Speed:',\\n\",\n    \"    disabled=False,\\n\",\n    \"    button_style='', # 'success', 'info', 'warning', 'danger' or ''\\n\",\n    \"    tooltips=['Description of slow', 'Description of regular', 'Description of fast'],\\n\",\n    \"    # icons=['check'] * 3\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### SelectMultiple\\n\",\n    \"Multiple values can be selected with <kbd>shift</kbd> and/or <kbd>ctrl</kbd> (or <kbd>command</kbd>) pressed and mouse clicks or arrow keys.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.SelectMultiple(\\n\",\n    \"    options=['Apples', 'Oranges', 'Pears'],\\n\",\n    \"    value=['Oranges'],\\n\",\n    \"    # rows=10,\\n\",\n    \"    description='Fruits',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"## String widgets\\n\",\n    \"There are several widgets that can be used to display a string value. The `Text` and `Textarea` widgets accept input. The `HTML` and `HTMLMath` widgets display a string as HTML (`HTMLMath` also renders math). The `Label` widget can be used to construct a custom control label.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Text\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.Text(\\n\",\n    \"    value='Hello World',\\n\",\n    \"    placeholder='Type something',\\n\",\n    \"    description='String:',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Textarea\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.Textarea(\\n\",\n    \"    value='Hello World',\\n\",\n    \"    placeholder='Type something',\\n\",\n    \"    description='String:',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Label\\n\",\n    \"The `Label` widget is useful if you need to build a custom description next to a control using similar styling to the built-in control descriptions.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.HBox([widgets.Label(value=\\\"The $m$ in $E=mc^2$:\\\"), widgets.FloatSlider()])\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### HTML\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.HTML(\\n\",\n    \"    value=\\\"Hello <b>World</b>\\\",\\n\",\n    \"    placeholder='Some HTML',\\n\",\n    \"    description='Some HTML',\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### HTML Math\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.HTMLMath(\\n\",\n    \"    value=r\\\"Some math and <i>HTML</i>: \\\\(x^2\\\\) and $$\\\\frac{x+1}{x-1}$$\\\",\\n\",\n    \"    placeholder='Some HTML',\\n\",\n    \"    description='Some HTML',\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Image\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"file = open(\\\"images/WidgetArch.png\\\", \\\"rb\\\")\\n\",\n    \"image = file.read()\\n\",\n    \"widgets.Image(\\n\",\n    \"    value=image,\\n\",\n    \"    format='png',\\n\",\n    \"    width=300,\\n\",\n    \"    height=400,\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"## Button\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.Button(\\n\",\n    \"    description='Click me',\\n\",\n    \"    disabled=False,\\n\",\n    \"    button_style='', # 'success', 'info', 'warning', 'danger' or ''\\n\",\n    \"    tooltip='Click me',\\n\",\n    \"    icon='check'\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Conclusion\\n\",\n    \"\\n\",\n    \"Even more widgets are described in the notebook **Widget List - Advanced**. Use these as a future reference for yourself!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "19-Bonus Material - Introduction to GUIs/04-Widget Events.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"# Widget Events\\n\",\n    \"\\n\",\n    \"In this lecture we will discuss widget events, such as button clicks!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Special events\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The `Button` is not used to represent a data type. Instead the button widget is used to handle mouse clicks. The `on_click` method of the `Button` can be used to register a function to be called when the button is clicked. The docstring of the `on_click` can be seen below.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import ipywidgets as widgets\\n\",\n    \"\\n\",\n    \"print(widgets.Button.on_click.__doc__)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Example #1 - on_click\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Since button clicks are stateless, they are transmitted from the front-end to the back-end using custom messages. By using the `on_click` method, a button that prints a message when it has been clicked is shown below.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from IPython.display import display\\n\",\n    \"button = widgets.Button(description=\\\"Click Me!\\\")\\n\",\n    \"display(button)\\n\",\n    \"\\n\",\n    \"def on_button_clicked(b):\\n\",\n    \"    print(\\\"Button clicked.\\\")\\n\",\n    \"\\n\",\n    \"button.on_click(on_button_clicked)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Example #2 - on_submit\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The `Text` widget also has a special `on_submit` event. The `on_submit` event fires when the user hits <kbd>enter</kbd>.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"text = widgets.Text()\\n\",\n    \"display(text)\\n\",\n    \"\\n\",\n    \"def handle_submit(sender):\\n\",\n    \"    print(text.value)\\n\",\n    \"\\n\",\n    \"text.on_submit(handle_submit)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"## Traitlet events\\n\",\n    \"Widget properties are IPython traitlets and traitlets are eventful. To handle changes, the `observe` method of the widget can be used to register a callback. The docstring for `observe` can be seen below.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"print(widgets.Widget.observe.__doc__)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Signatures\\n\",\n    \"Mentioned in the docstring, the callback registered must have the signature `handler(change)` where `change` is a dictionary holding the information about the change.\\n\",\n    \"\\n\",\n    \"Using this method, an example of how to output an `IntSlider`’s value as it is changed can be seen below.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"int_range = widgets.IntSlider()\\n\",\n    \"display(int_range)\\n\",\n    \"\\n\",\n    \"def on_value_change(change):\\n\",\n    \"    print(change['new'])\\n\",\n    \"\\n\",\n    \"int_range.observe(on_value_change, names='value')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Linking Widgets\\n\",\n    \"Often, you may want to simply link widget attributes together. Synchronization of attributes can be done in a simpler way than by using bare traitlets events.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Linking traitlets attributes in the kernel¶\\n\",\n    \"\\n\",\n    \"The first method is to use the `link` and `dlink` functions from the `traitlets` module. This only works if we are interacting with a live kernel.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import traitlets\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Create Caption\\n\",\n    \"caption = widgets.Label(value = 'The values of slider1 and slider2 are synchronized')\\n\",\n    \"\\n\",\n    \"# Create IntSliders\\n\",\n    \"slider1 = widgets.IntSlider(description='Slider 1')\\n\",\n    \"slider2 =  widgets.IntSlider(description='Slider 2')\\n\",\n    \"\\n\",\n    \"# Use trailets to link\\n\",\n    \"l = traitlets.link((slider1, 'value'), (slider2, 'value'))\\n\",\n    \"\\n\",\n    \"# Display!\\n\",\n    \"display(caption, slider1, slider2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Create Caption\\n\",\n    \"caption = widgets.Label(value='Changes in source values are reflected in target1')\\n\",\n    \"\\n\",\n    \"# Create Sliders\\n\",\n    \"source = widgets.IntSlider(description='Source')\\n\",\n    \"target1 = widgets.IntSlider(description='Target 1')\\n\",\n    \"\\n\",\n    \"# Use dlink\\n\",\n    \"dl = traitlets.dlink((source, 'value'), (target1, 'value'))\\n\",\n    \"display(caption, source, target1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Function `traitlets.link` and `traitlets.dlink` return a `Link` or `DLink` object. The link can be broken by calling the `unlink` method.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# May get an error depending on order of cells being run!\\n\",\n    \"l.unlink()\\n\",\n    \"dl.unlink()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Registering callbacks to trait changes in the kernel\\n\",\n    \"\\n\",\n    \"Since attributes of widgets on the Python side are traitlets, you can register handlers to the change events whenever the model gets updates from the front-end.\\n\",\n    \"\\n\",\n    \"The handler passed to observe will be called with one change argument. The change object holds at least a `type` key and a `name` key, corresponding respectively to the type of notification and the name of the attribute that triggered the notification.\\n\",\n    \"\\n\",\n    \"Other keys may be passed depending on the value of `type`. In the case where type is `change`, we also have the following keys:\\n\",\n    \"* `owner` : the HasTraits instance\\n\",\n    \"* `old` : the old value of the modified trait attribute\\n\",\n    \"* `new` : the new value of the modified trait attribute\\n\",\n    \"* `name` : the name of the modified trait attribute.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"caption = widgets.Label(value='The values of range1 and range2 are synchronized')\\n\",\n    \"slider = widgets.IntSlider(min=-5, max=5, value=1, description='Slider')\\n\",\n    \"\\n\",\n    \"def handle_slider_change(change):\\n\",\n    \"    caption.value = 'The slider value is ' + (\\n\",\n    \"        'negative' if change.new < 0 else 'nonnegative'\\n\",\n    \"    )\\n\",\n    \"\\n\",\n    \"slider.observe(handle_slider_change, names='value')\\n\",\n    \"\\n\",\n    \"display(caption, slider)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Linking widgets attributes from the client side\\n\",\n    \"\\n\",\n    \"When synchronizing traitlets attributes, you may experience a lag because of the latency due to the roundtrip to the server side. You can also directly link widget attributes in the browser using the link widgets, in either a unidirectional or a bidirectional fashion.\\n\",\n    \"\\n\",\n    \"Javascript links persist when embedding widgets in html web pages without a kernel.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# NO LAG VERSION\\n\",\n    \"caption = widgets.Label(value = 'The values of range1 and range2 are synchronized')\\n\",\n    \"\\n\",\n    \"range1 = widgets.IntSlider(description='Range 1')\\n\",\n    \"range2 = widgets.IntSlider(description='Range 2')\\n\",\n    \"\\n\",\n    \"l = widgets.jslink((range1, 'value'), (range2, 'value'))\\n\",\n    \"display(caption, range1, range2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# NO LAG VERSION\\n\",\n    \"caption = widgets.Label(value = 'Changes in source_range values are reflected in target_range')\\n\",\n    \"\\n\",\n    \"source_range = widgets.IntSlider(description='Source range')\\n\",\n    \"target_range = widgets.IntSlider(description='Target range')\\n\",\n    \"\\n\",\n    \"dl = widgets.jsdlink((source_range, 'value'), (target_range, 'value'))\\n\",\n    \"display(caption, source_range, target_range)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Function `widgets.jslink` returns a `Link` widget. The link can be broken by calling the `unlink` method.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"l.unlink()\\n\",\n    \"dl.unlink()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### The difference between linking in the kernel and linking in the client\\n\",\n    \"\\n\",\n    \"Linking in the kernel means linking via python. If two sliders are linked in the kernel, when one slider is changed the browser sends a message to the kernel (python in this case) updating the changed slider, the link widget in the kernel then propagates the change to the other slider object in the kernel, and then the other slider’s kernel object sends a message to the browser to update the other slider’s views in the browser. If the kernel is not running (as in a static web page), then the controls will not be linked.\\n\",\n    \"\\n\",\n    \"Linking using jslink (i.e., on the browser side) means contructing the link in Javascript. When one slider is changed, Javascript running in the browser changes the value of the other slider in the browser, without needing to communicate with the kernel at all. If the sliders are attached to kernel objects, each slider will update their kernel-side objects independently.\\n\",\n    \"\\n\",\n    \"To see the difference between the two, go to the [ipywidgets documentation](http://ipywidgets.readthedocs.io/en/latest/examples/Widget%20Events.html) and try out the sliders near the bottom. The ones linked in the kernel with `link` and `dlink` are no longer linked, but the ones linked in the browser with `jslink` and `jsdlink` are still linked.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Continuous updates\\n\",\n    \"\\n\",\n    \"Some widgets offer a choice with their `continuous_update` attribute between continually updating values or only updating values when a user submits the value (for example, by pressing Enter or navigating away from the control). In the next example, we see the “Delayed” controls only transmit their value after the user finishes dragging the slider or submitting the textbox. The “Continuous” controls continually transmit their values as they are changed. Try typing a two-digit number into each of the text boxes, or dragging each of the sliders, to see the difference.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import traitlets\\n\",\n    \"a = widgets.IntSlider(description=\\\"Delayed\\\", continuous_update=False)\\n\",\n    \"b = widgets.IntText(description=\\\"Delayed\\\", continuous_update=False)\\n\",\n    \"c = widgets.IntSlider(description=\\\"Continuous\\\", continuous_update=True)\\n\",\n    \"d = widgets.IntText(description=\\\"Continuous\\\", continuous_update=True)\\n\",\n    \"\\n\",\n    \"traitlets.link((a, 'value'), (b, 'value'))\\n\",\n    \"traitlets.link((a, 'value'), (c, 'value'))\\n\",\n    \"traitlets.link((a, 'value'), (d, 'value'))\\n\",\n    \"widgets.VBox([a,b,c,d])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Sliders, `Text`, and `Textarea` controls default to `continuous_update=True`. `IntText` and other text boxes for entering integer or float numbers default to `continuous_update=False` (since often you’ll want to type an entire number before submitting the value by pressing enter or navigating out of the box).\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Conclusion\\n\",\n    \"You should now feel comfortable linking Widget events!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"cell_tags\": [\n   [\n    \"<None>\",\n    null\n   ]\n  ],\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "19-Bonus Material - Introduction to GUIs/05-Widget Styling.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Widget Styling\\n\",\n    \"\\n\",\n    \"In this lecture we will learn about the various ways to style widgets!\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## `style` vs. `layout`\\n\",\n    \"\\n\",\n    \"There are two ways to change the appearance of widgets in the browser. The first is through the `layout` attribute which exposes layout-related CSS properties for the top-level DOM element of widgets, such as margins and positioning. The second is through the `style` attribute which exposes non-layout related attributes like button color and font weight. While `layout` is general to all widgets and containers of widgets, `style` offers tools specific to each type of widget.\\n\",\n    \"\\n\",\n    \"Thorough understanding of all that `layout` has to offer requires knowledge of front-end web development, including HTML and CSS. This section provides a brief overview of things that can be adjusted using `layout`. However, the full set of tools are provided in the separate notebook **Advanced Widget Styling with Layout**.\\n\",\n    \"\\n\",\n    \"To learn more about web development, including HTML and CSS, check out the course [\\n\",\n    \"Python and Django Full Stack Web Developer Bootcamp](https://www.udemy.com/python-and-django-full-stack-web-developer-bootcamp/)\\n\",\n    \"\\n\",\n    \"Basic styling is more intuitive as it relates directly to each type of widget. Here we provide a set of helpful examples of the `style` attribute.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## The `layout` attribute\\n\",\n    \"Jupyter interactive widgets have a `layout` attribute exposing a number of CSS properties that impact how widgets are laid out. These properties map to the values of the CSS properties of the same name (underscores being replaced with dashes), applied to the top DOM elements of the corresponding widget.\\n\",\n    \"\\n\",\n    \"#### Sizes\\n\",\n    \"* `height`\\n\",\n    \"* `width`\\n\",\n    \"* `max_height`\\n\",\n    \"* `max_width`\\n\",\n    \"* `min_height`\\n\",\n    \"* `min_width`\\n\",\n    \"\\n\",\n    \"#### Display\\n\",\n    \"* `visibility`\\n\",\n    \"* `display`\\n\",\n    \"* `overflow`\\n\",\n    \"* `overflow_x`\\n\",\n    \"* `overflow_y`\\n\",\n    \"\\n\",\n    \"#### Box model\\n\",\n    \"* `border`\\n\",\n    \"* `margin`\\n\",\n    \"* `padding`\\n\",\n    \"\\n\",\n    \"#### Positioning\\n\",\n    \"* `top`\\n\",\n    \"* `left`\\n\",\n    \"* `bottom`\\n\",\n    \"* `right`\\n\",\n    \"\\n\",\n    \"#### Flexbox\\n\",\n    \"* `order`\\n\",\n    \"* `flex_flow`\\n\",\n    \"* `align_items`\\n\",\n    \"* `flex`\\n\",\n    \"* `align_self`\\n\",\n    \"* `align_content`\\n\",\n    \"* `justify_content`\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## A quick example of `layout`\\n\",\n    \"\\n\",\n    \"We've already seen what a slider looks like without any layout adjustments:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import ipywidgets as widgets\\n\",\n    \"from IPython.display import display\\n\",\n    \"\\n\",\n    \"w = widgets.IntSlider()\\n\",\n    \"display(w)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's say we wanted to change two of the properties of this widget: `margin` and `height`. We want to center the slider in the output area and increase its height. This can be done by adding `layout` attributes to **w**\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"w.layout.margin = 'auto'\\n\",\n    \"w.layout.height = '75px'\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Notice that the slider changed positions on the page immediately!\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"Layout settings can be passed from one widget to another widget of the same type. Let's first create a new IntSlider:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"x = widgets.IntSlider(value=15,description='New slider')\\n\",\n    \"display(x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now assign **w**'s layout settings to **x**:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"x.layout = w.layout\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"That's it! For a complete set of instructions on using `layout`, visit the **Advanced Widget Styling - Layout** notebook.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Predefined styles\\n\",\n    \"\\n\",\n    \"Before we investigate the `style` attribute, it should be noted that many widgets offer a list of pre-defined styles that can be passed as arguments during creation.\\n\",\n    \"\\n\",\n    \"For example, the `Button` widget has a `button_style` attribute that may take 5 different values:\\n\",\n    \"\\n\",\n    \"* `'primary'`\\n\",\n    \"* `'success'`\\n\",\n    \"* `'info'`\\n\",\n    \"* `'warning'`\\n\",\n    \"* `'danger'`\\n\",\n    \"\\n\",\n    \"besides the default empty string `''`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import ipywidgets as widgets\\n\",\n    \"\\n\",\n    \"widgets.Button(description='Ordinary Button', button_style='')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.Button(description='Danger Button', button_style='danger')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## The `style` attribute\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"While the `layout` attribute only exposes layout-related CSS properties for the top-level DOM element of widgets, the\\n\",\n    \"`style` attribute is used to expose non-layout related styling attributes of widgets.\\n\",\n    \"\\n\",\n    \"However, the properties of the `style` atribute are specific to each widget type.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"b1 = widgets.Button(description='Custom color')\\n\",\n    \"b1.style.button_color = 'lightgreen'\\n\",\n    \"b1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can get a list of the style attributes for a widget with the `keys` property.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"b1.style.keys\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note that `widgets.Button().style.keys` also works.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Just like the `layout` attribute, widget styles can be assigned to other widgets.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"b2 = widgets.Button()\\n\",\n    \"b2.style = b1.style\\n\",\n    \"b2\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note that only the style was picked up by **b2**, not any other parameters like `description`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Widget styling attributes are specific to each widget type.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"s1 = widgets.IntSlider(description='Blue handle')\\n\",\n    \"s1.style.handle_color = 'lightblue'\\n\",\n    \"s1\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Widget style traits\\n\",\n    \"\\n\",\n    \"These are traits that belong to some of the more common widgets:\\n\",\n    \"\\n\",\n    \"#### Button\\n\",\n    \"\\n\",\n    \"- `button_color`\\n\",\n    \"- `font_weight`\\n\",\n    \"\\n\",\n    \"#### IntSlider, FloatSlider, IntRangeSlider, FloatRangeSlider\\n\",\n    \"\\n\",\n    \"- `description_width`\\n\",\n    \"- `handle_color`\\n\",\n    \"\\n\",\n    \"#### IntProgress, FloatProgress\\n\",\n    \"\\n\",\n    \"- `bar_color`\\n\",\n    \"- `description_width`\\n\",\n    \"\\n\",\n    \"Most others such as `ToggleButton`, `Checkbox`, `Dropdown`, `RadioButtons`, `Select` and `Text` only have `description_width` as an adjustable trait.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Conclusion\\n\",\n    \"\\n\",\n    \"You should now have an understanding of how to style widgets!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"cell_tags\": [\n   [\n    \"<None>\",\n    null\n   ]\n  ],\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "19-Bonus Material - Introduction to GUIs/06-Custom Widget.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Custom Widget\\n\",\n    \"## Exploring the Lorenz System of Differential Equations\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In this Notebook we explore the Lorenz system of differential equations:\\n\",\n    \"\\n\",\n    \"$$\\n\",\n    \"\\\\begin{aligned}\\n\",\n    \"\\\\dot{x} & = \\\\sigma(y-x) \\\\\\\\\\n\",\n    \"\\\\dot{y} & = \\\\rho x - y - xz \\\\\\\\\\n\",\n    \"\\\\dot{z} & = -\\\\beta z + xy\\n\",\n    \"\\\\end{aligned}\\n\",\n    \"$$\\n\",\n    \"\\n\",\n    \"This is one of the classic systems in non-linear differential equations. It exhibits a range of different behaviors as the parameters ($\\\\sigma$, $\\\\beta$, $\\\\rho$) are varied.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Imports\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"First, we import the needed things from IPython, [NumPy](http://www.numpy.org/), [Matplotlib](http://matplotlib.org/index.html) and [SciPy](http://www.scipy.org/). Check out the class [Python for Data Science and Machine Learning Bootcamp](https://www.udemy.com/python-for-data-science-and-machine-learning-bootcamp/) if you're interested in learning more about this part of Python!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"%matplotlib inline\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from ipywidgets import interact, interactive\\n\",\n    \"from IPython.display import clear_output, display, HTML\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import numpy as np\\n\",\n    \"from scipy import integrate\\n\",\n    \"\\n\",\n    \"from matplotlib import pyplot as plt\\n\",\n    \"from mpl_toolkits.mplot3d import Axes3D\\n\",\n    \"from matplotlib.colors import cnames\\n\",\n    \"from matplotlib import animation\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Computing the trajectories and plotting the result\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We define a function that can integrate the differential equations numerically and then plot the solutions. This function has arguments that control the parameters of the differential equation ($\\\\sigma$, $\\\\beta$, $\\\\rho$), the numerical integration (`N`, `max_time`) and the visualization (`angle`).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def solve_lorenz(N=10, angle=0.0, max_time=4.0, sigma=10.0, beta=8./3, rho=28.0):\\n\",\n    \"\\n\",\n    \"    fig = plt.figure();\\n\",\n    \"    ax = fig.add_axes([0, 0, 1, 1], projection='3d');\\n\",\n    \"    ax.axis('off')\\n\",\n    \"\\n\",\n    \"    # prepare the axes limits\\n\",\n    \"    ax.set_xlim((-25, 25))\\n\",\n    \"    ax.set_ylim((-35, 35))\\n\",\n    \"    ax.set_zlim((5, 55))\\n\",\n    \"    \\n\",\n    \"    def lorenz_deriv(x_y_z, t0, sigma=sigma, beta=beta, rho=rho):\\n\",\n    \"        \\\"\\\"\\\"Compute the time-derivative of a Lorenz system.\\\"\\\"\\\"\\n\",\n    \"        x, y, z = x_y_z\\n\",\n    \"        return [sigma * (y - x), x * (rho - z) - y, x * y - beta * z]\\n\",\n    \"\\n\",\n    \"    # Choose random starting points, uniformly distributed from -15 to 15\\n\",\n    \"    np.random.seed(1)\\n\",\n    \"    x0 = -15 + 30 * np.random.random((N, 3))\\n\",\n    \"\\n\",\n    \"    # Solve for the trajectories\\n\",\n    \"    t = np.linspace(0, max_time, int(250*max_time))\\n\",\n    \"    x_t = np.asarray([integrate.odeint(lorenz_deriv, x0i, t)\\n\",\n    \"                      for x0i in x0])\\n\",\n    \"    \\n\",\n    \"    # choose a different color for each trajectory\\n\",\n    \"    colors = plt.cm.jet(np.linspace(0, 1, N));\\n\",\n    \"\\n\",\n    \"    for i in range(N):\\n\",\n    \"        x, y, z = x_t[i,:,:].T\\n\",\n    \"        lines = ax.plot(x, y, z, '-', c=colors[i])\\n\",\n    \"        _ = plt.setp(lines, linewidth=2);\\n\",\n    \"\\n\",\n    \"    ax.view_init(30, angle)\\n\",\n    \"    _ = plt.show();\\n\",\n    \"\\n\",\n    \"    return t, x_t\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's call the function once to view the solutions. For this set of parameters, we see the trajectories swirling around two points, called attractors. \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x2ac822183c8>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"t, x_t = solve_lorenz(angle=0, N=10)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Using IPython's `interactive` function, we can explore how the trajectories behave as we change the various parameters.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"8c6fcac683e54aebb53559937774065e\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/html\": [\n       \"<p>Failed to display Jupyter Widget of type <code>interactive</code>.</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\\n\",\n       \"  that the widgets JavaScript is still loading. If this message persists, it\\n\",\n       \"  likely means that the widgets JavaScript library is either not installed or\\n\",\n       \"  not enabled. See the <a href=\\\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\\\">Jupyter\\n\",\n       \"  Widgets Documentation</a> for setup instructions.\\n\",\n       \"</p>\\n\",\n       \"<p>\\n\",\n       \"  If you're reading this message in another frontend (for example, a static\\n\",\n       \"  rendering on GitHub or <a href=\\\"https://nbviewer.jupyter.org/\\\">NBViewer</a>),\\n\",\n       \"  it may mean that your frontend doesn't currently support widgets.\\n\",\n       \"</p>\\n\"\n      ],\n      \"text/plain\": [\n       \"interactive(children=(IntSlider(value=10, description='N', max=50), FloatSlider(value=0.0, description='angle', max=360.0), FloatSlider(value=4.0, description='max_time', max=12.0, min=-4.0), FloatSlider(value=10.0, description='sigma', max=50.0), FloatSlider(value=2.6666666666666665, description='beta', max=8.0, min=-2.6666666666666665), FloatSlider(value=28.0, description='rho', max=50.0), Output()), _dom_classes=('widget-interact',))\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"w = interactive(solve_lorenz, angle=(0.,360.), N=(0,50), sigma=(0.0,50.0), rho=(0.0,50.0))\\n\",\n    \"display(w);\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The object returned by `interactive` is a `Widget` object and it has attributes that contain the current result and arguments:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"t, x_t = w.result\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'N': 10,\\n\",\n       \" 'angle': 0.0,\\n\",\n       \" 'beta': 2.6666666666666665,\\n\",\n       \" 'max_time': 4.0,\\n\",\n       \" 'rho': 28.0,\\n\",\n       \" 'sigma': 10.0}\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"w.kwargs\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"After interacting with the system, we can take the result and perform further computations. In this case, we compute the average positions in $x$, $y$ and $z$.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"xyz_avg = x_t.mean(axis=1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(10, 3)\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"xyz_avg.shape\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Creating histograms of the average positions (across different trajectories) show that on average the trajectories swirl about the attractors.\\n\",\n    \"\\n\",\n    \"*NOTE: These will look different from the lecture version if you adjusted any of the sliders in the* `interactive` *widget and changed the parameters.*\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x2ac824c48d0>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"plt.hist(xyz_avg[:,0])\\n\",\n    \"plt.title('Average $x(t)$');\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x2ac82e62e80>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"plt.hist(xyz_avg[:,1])\\n\",\n    \"plt.title('Average $y(t)$');\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Conclusion\\n\",\n    \"\\n\",\n    \"Hopefully you've enjoyed using widgets in the Jupyter Notebook system and have begun to explore the other GUI possibilities for Python!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "19-Bonus Material - Introduction to GUIs/07-Advanced Widget List.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Advanced Widget List\\n\",\n    \"\\n\",\n    \"This notebook is an extension of **Widget List**, describing even more of the GUI widgets available!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import ipywidgets as widgets\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Output\\n\",\n    \"The `Output` widget can capture and display stdout, stderr and [rich output generated by IPython](http://ipython.readthedocs.io/en/stable/api/generated/IPython.display.html#module-IPython.display). After the widget is created, direct output to it using a context manager.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"out = widgets.Output()\\n\",\n    \"out\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"You can print text to the output area as shown below.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"with out:\\n\",\n    \"    for i in range(10):\\n\",\n    \"        print(i, 'Hello world!')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Rich material can also be directed to the output area. Anything which displays nicely in a Jupyter notebook will also display well in the `Output` widget.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from IPython.display import YouTubeVideo\\n\",\n    \"with out:\\n\",\n    \"    display(YouTubeVideo('eWzY2nGfkXk'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Play (Animation) widget\\n\",\n    \"The `Play` widget is useful to perform animations by iterating on a sequence of integers with a certain speed. The value of the slider below is linked to the player.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"play = widgets.Play(\\n\",\n    \"    # interval=10,\\n\",\n    \"    value=50,\\n\",\n    \"    min=0,\\n\",\n    \"    max=100,\\n\",\n    \"    step=1,\\n\",\n    \"    description=\\\"Press play\\\",\\n\",\n    \"    disabled=False\\n\",\n    \")\\n\",\n    \"slider = widgets.IntSlider()\\n\",\n    \"widgets.jslink((play, 'value'), (slider, 'value'))\\n\",\n    \"widgets.HBox([play, slider])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Date picker\\n\",\n    \"The date picker widget works in Chrome and IE Edge, but does not currently work in Firefox or Safari because they do not support the HTML date input field.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.DatePicker(\\n\",\n    \"    description='Pick a Date',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Color picker\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.ColorPicker(\\n\",\n    \"    concise=False,\\n\",\n    \"    description='Pick a color',\\n\",\n    \"    value='blue',\\n\",\n    \"    disabled=False\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Controller\\n\",\n    \"The `Controller` allows a game controller to be used as an input device.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"widgets.Controller(\\n\",\n    \"    index=0,\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Container/Layout widgets\\n\",\n    \"\\n\",\n    \"These widgets are used to hold other widgets, called children. Each has a `children` property that may be set either when the widget is created or later.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Box\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"items = [widgets.Label(str(i)) for i in range(4)]\\n\",\n    \"widgets.Box(items)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### HBox\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"items = [widgets.Label(str(i)) for i in range(4)]\\n\",\n    \"widgets.HBox(items)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### VBox\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"items = [widgets.Label(str(i)) for i in range(4)]\\n\",\n    \"left_box = widgets.VBox([items[0], items[1]])\\n\",\n    \"right_box = widgets.VBox([items[2], items[3]])\\n\",\n    \"widgets.HBox([left_box, right_box])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Accordion\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"accordion = widgets.Accordion(children=[widgets.IntSlider(), widgets.Text()])\\n\",\n    \"accordion.set_title(0, 'Slider')\\n\",\n    \"accordion.set_title(1, 'Text')\\n\",\n    \"accordion\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Tabs\\n\",\n    \"\\n\",\n    \"In this example the children are set after the tab is created. Titles for the tabes are set in the same way they are for `Accordion`.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"tab_contents = ['P0', 'P1', 'P2', 'P3', 'P4']\\n\",\n    \"children = [widgets.Text(description=name) for name in tab_contents]\\n\",\n    \"tab = widgets.Tab()\\n\",\n    \"tab.children = children\\n\",\n    \"for i in range(len(children)):\\n\",\n    \"    tab.set_title(i, str(i))\\n\",\n    \"tab\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"slide\"\n    }\n   },\n   \"source\": [\n    \"### Accordion and Tab use `selected_index`, not value\\n\",\n    \"\\n\",\n    \"Unlike the rest of the widgets discussed earlier, the container widgets `Accordion` and `Tab` update their `selected_index` attribute when the user changes which accordion or tab is selected. That means that you can both see what the user is doing *and* programmatically set what the user sees by setting the value of `selected_index`.\\n\",\n    \"\\n\",\n    \"Setting `selected_index = None` closes all of the accordions or deselects all tabs.\\n\",\n    \"\\n\",\n    \"In the cells below try displaying or setting the `selected_index` of the `tab` and/or `accordion`.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"tab.selected_index = 3\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"accordion.selected_index = None\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Nesting tabs and accordions\\n\",\n    \"\\n\",\n    \"Tabs and accordions can be nested as deeply as you want. If you have a few minutes, try nesting a few accordions or putting an accordion inside a tab or a tab inside an accordion.\\n\",\n    \"\\n\",\n    \"The example below makes a couple of tabs with an accordion children in one of them\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"tab_nest = widgets.Tab()\\n\",\n    \"tab_nest.children = [accordion, accordion]\\n\",\n    \"tab_nest.set_title(0, 'An accordion')\\n\",\n    \"tab_nest.set_title(1, 'Copy of the accordion')\\n\",\n    \"tab_nest\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Conclusion\\n\",\n    \"\\n\",\n    \"Use this as a further reference for yourself!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "19-Bonus Material - Introduction to GUIs/08-Advanced Widget Styling with Layout.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Advanced Widget Styling with Layout\\n\",\n    \"\\n\",\n    \"This notebook expands on the **Widget Styling** lecture by describing the various HTML and CSS adjustments that can be made through the `layout` attribute.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## The `layout` attribute\\n\",\n    \"Jupyter interactive widgets have a `layout` attribute exposing a number of CSS properties that impact how widgets are laid out.\\n\",\n    \"\\n\",\n    \"### Exposed CSS properties\\n\",\n    \"<div class=\\\"alert alert-info\\\" style=\\\"margin: 20px\\\">The following properties map to the values of the CSS properties of the same name (underscores being replaced with dashes), applied to the top DOM elements of the corresponding widget.</div>\\n\",\n    \"\\n\",\n    \"#### Sizes\\n\",\n    \"* `height`\\n\",\n    \"* `width`\\n\",\n    \"* `max_height`\\n\",\n    \"* `max_width`\\n\",\n    \"* `min_height`\\n\",\n    \"* `min_width`\\n\",\n    \"\\n\",\n    \"#### Display\\n\",\n    \"* `visibility`\\n\",\n    \"* `display`\\n\",\n    \"* `overflow`\\n\",\n    \"* `overflow_x`\\n\",\n    \"* `overflow_y`\\n\",\n    \"\\n\",\n    \"#### Box model\\n\",\n    \"* `border`\\n\",\n    \"* `margin`\\n\",\n    \"* `padding`\\n\",\n    \"\\n\",\n    \"#### Positioning\\n\",\n    \"* `top`\\n\",\n    \"* `left`\\n\",\n    \"* `bottom`\\n\",\n    \"* `right`\\n\",\n    \"\\n\",\n    \"#### Flexbox\\n\",\n    \"* `order`\\n\",\n    \"* `flex_flow`\\n\",\n    \"* `align_items`\\n\",\n    \"* `flex`\\n\",\n    \"* `align_self`\\n\",\n    \"* `align_content`\\n\",\n    \"* `justify_content`\\n\",\n    \"\\n\",\n    \"### Shorthand CSS properties\\n\",\n    \"\\n\",\n    \"You may have noticed that certain CSS properties such as `margin-[top/right/bottom/left]` seem to be missing. The same holds for `padding-[top/right/bottom/left]` etc.\\n\",\n    \"\\n\",\n    \"In fact, you can atomically specify `[top/right/bottom/left]` margins via the `margin` attribute alone by passing the string `'100px 150px 100px 80px'` for a respectively `top`, `right`, `bottom` and `left` margins of `100`, `150`, `100` and `80` pixels.\\n\",\n    \"\\n\",\n    \"Similarly, the `flex` attribute can hold values for `flex-grow`, `flex-shrink` and `flex-basis`. The `border` attribute is a shorthand property for `border-width`, `border-style (required)`, and `border-color`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import ipywidgets as widgets\\n\",\n    \"from IPython.display import display\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Conclusion\\n\",\n    \"\\n\",\n    \"You should now have an understanding of how to style widgets!\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"cell_tags\": [\n   [\n    \"<None>\",\n    null\n   ]\n  ],\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "Jupyter (iPython) Notebooks Guide.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Guide to Using Jupyter Notebooks\\n\",\n    \"In this lecture we will be going over the basics of the Jupyter (previously called iPython Notebooks).\\n\",\n    \"\\n\",\n    \"For a complete User Manual check out the [Bryn Mawr College Computer Science Guide](https://jupyter.brynmawr.edu/services/public/dblank/Jupyter%20Notebook%20Users%20Manual.ipynb).\\n\",\n    \"\\n\",\n    \"Most of the breakdown will actually occur in the presentation corresponding to this Notebook. So please refer to either the presentation or the full User Manual linked above.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "README.md",
    "content": "# Complete-Python-3-Bootcamp\nCourse Files for Complete Python 3 Bootcamp Course on Udemy\n\nCopyright(©) by Pierian Data Inc.\n\nGet it now for 95% off with the link:\nhttps://www.udemy.com/complete-python-bootcamp/?couponCode=COMPLETE_GITHUB\n\nThanks!\n"
  }
]