{ "cells": [ { "cell_type": "markdown", "id": "arabic-farming", "metadata": {}, "source": [ "\n", "\n", "\n", "

Intro to Intermediate Python

\n", "\n", "\n", "\n", "\n", "---\n", "\n", "## Learning Objectives\n", "*After this lesson, you will be able to:*\n", "\n", "- Confidently recap the previous units.\n", "- Describe key components of the upcoming unit.\n", "\n", "---\n", "\n", "## Leveling Up\n", "\n", "You're leveling up!\n", "\n", "You have the proper foundation. Now, let's check how you're doing.\n", "\n", "\n", "---\n", "\n", "## Let's Review: Lists\n", "\n", "- A collection of items stored in a single variable.\n", "- Created with square brackets (`[]`).\n", "- Begin counting at `0`.\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "premium-bulgaria", "metadata": {}, "outputs": [], "source": [ "my_queens = [\"Cersei\", \"Daenerys\", \"Arwen\", \"Elsa\", \"Guinevere\"]\n", "step_counts_this_week = [8744, 5256, 7453, 3097, 4122, 2908, 6720]\n", "\n", "# We can also mix types.\n", "weird_list = [1, \"weird\", [\"nested list\"], \"eh?\"]\n" ] }, { "cell_type": "markdown", "id": "surprised-tower", "metadata": {}, "source": [ "\n", "> **Challenge:** Can you recall how to slice a section of the list? For example, items 2 through 5 of `step_counts_this_week`?\n", "\n", "---\n", "\n", "## Answer: Lists Challenge\n", "\n", "- Python uses a `:` to represent a range of indices.\n", "- Beware of off-by-one errors!\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "moving-network", "metadata": {}, "outputs": [], "source": [ "days_2_thru_5 = step_counts_this_week[2:6] # Items 2, 3, 4, and 5" ] }, { "cell_type": "markdown", "id": "cathedral-hurricane", "metadata": {}, "source": [ "\n", "> **Pro tip:** It's `6` instead of `5` because the range is exclusive.\n", "\n", "---\n", "\n", "## Let's Review: Loops and Iteration\n", "\n", "What about looping a list?\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "legendary-chorus", "metadata": {}, "outputs": [], "source": [ "my_queens = [\"Cersei\", \"Daenerys\", \"Arwen\", \"Elsa\", \"Guinevere\"]\n", "\n", "for queen in my_queens:\n", " print(queen, \"is the most powerful queen!\")\n" ] }, { "cell_type": "markdown", "id": "statistical-manor", "metadata": {}, "source": [ "\n", "> **Challenge:** What if I want to loop from 1 to 10 and print out the numbers? How do I do this without a data structure to loop over?\n", "\n", "\n", "---\n", "\n", "## Answer: Loops Challenge\n", "\n", "To loop 1–10 without a data structure:\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "processed-initial", "metadata": {}, "outputs": [], "source": [ "# Remember, \"i\" is a common name for a counter/index in programming!\n", "for i in range(1, 11):\n", " print(i)" ] }, { "cell_type": "markdown", "id": "foster-cabin", "metadata": {}, "source": [ "\n", "- Why do you think we put `11` in the code?\n", "- What values does this print?\n", "\n", "---\n", "\n", "\n", "## Let's Review: Sets\n", "\n", "- Lists that don't have duplicates.\n", "- Created with curly braces (`{}`) or from lists with the `set()` function.\n", "- Aren't indexed — elements are in any order!\n", "- Handy for storing emails, user names, and other unique elements.\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "isolated-evening", "metadata": {}, "outputs": [], "source": [ "email_set = {'my_email@gmail.com', 'second_email@yahoo.com', \"third_email@hotmail.com\"}\n", "# Or from a list:\n", "my_list = [\"red\", \"yellow\", \"green\", \"red\", \"green\"]\n", "my_set = set(my_list)\n", "# => {\"red\", \"yellow\", \"green\"}" ] }, { "cell_type": "markdown", "id": "color-trailer", "metadata": {}, "source": [ "\n", "---\n", "\n", "\n", "## Let's Review: Tuples\n", "\n", "- Lists that can't be changed!\n", "- Created with parentheses (`()`).\n", "- Can't add, pop, remove, or otherwise change elements after creation.\n" ] }, { "cell_type": "code", "execution_count": null, "id": "charged-investigation", "metadata": {}, "outputs": [], "source": [ "rainbow_colors_tuple = (\"red\", \"orange\", \"yellow\", \"green\", \"blue\", \"indigo\", \"violet\")" ] }, { "cell_type": "markdown", "id": "clinical-webmaster", "metadata": {}, "source": [ "\n", "---\n", "\n", "## Let's Review: Dictionaries\n", "\n", "- A collection of key-value pairs.\n", "- Created with curly braces (`{key: value, key: value}`).\n", "- Values can be anything!\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "ordinary-portal", "metadata": {}, "outputs": [], "source": [ "my_puppy = {\n", " \"name\": \"Fido\",\n", " \"breed\": \"Corgi\",\n", " \"age\": 3,\n", " \"vaccinated\": True,\n", " \"fave toy\": [\"chew sticks\", \"big sticks\", \"any sticks\"]\n", "}" ] }, { "cell_type": "markdown", "id": "united-rwanda", "metadata": {}, "source": [ "\n", "> **Challenge:** Can you recall how to iterate (loop) over each key of `my_puppy` and print out both the key and the corresponding value?\n", "\n", "---\n", "\n", "## Answer: Dictionaries Challenge\n", "\n", "Iterating a dictionary is similar to a list:\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "written-layer", "metadata": {}, "outputs": [], "source": [ "for key in my_puppy:\n", " print(key, \"-\", my_puppy[key])" ] }, { "cell_type": "markdown", "id": "afraid-riding", "metadata": {}, "source": [ "\n", "---\n", "\n", "## Let's Review: Functions\n", "\n", "- Bits of code that can be used repeatedly.\n", "- Enable DRY — Don't Repeat Yourself.\n", "- Declared with `def`, `()`, and `:`.\n", "- Declare the function *above* the function call!\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "synthetic-classics", "metadata": {}, "outputs": [], "source": [ "# Function definition:\n", "def say_hello():\n", " print(\"hello!\")\n", "\n", "# Run the function three times.\n", "say_hello()\n", "say_hello()\n", "say_hello()" ] }, { "cell_type": "markdown", "id": "noble-tolerance", "metadata": {}, "source": [ "\n", "---\n", "\n", "## Let's Review: Function Parameters\n", "\n", "Parameters are in the function definition.\n", "\n", "- Arguments are in the function call.\n", "- Useful for very similar code with only minor variations.\n", "\n", "**Challenge:** Rewrite the code below to use a single function with one parameter." ] }, { "cell_type": "code", "execution_count": null, "id": "younger-voluntary", "metadata": {}, "outputs": [], "source": [ "# Function definitions:\n", "def say_hello_ada():\n", " print(\"hello, Ada\")\n", "\n", "def say_hello_alan():\n", " print(\"hello, Alan\")\n", "\n", "def say_hello_linus():\n", " print(\"hello, Linus\")\n", "\n", "# Call the functions:\n", "say_hello_ada()\n", "say_hello_alan()\n", "say_hello_linus()\n" ] }, { "cell_type": "markdown", "id": "fabulous-accounting", "metadata": {}, "source": [ "> **Challenge:** Could we do this with a single function that has a parameter called \"name\"?\n", "\n", "---\n", "\n", "## Function Parameters: Solution" ] }, { "cell_type": "code", "execution_count": null, "id": "lightweight-width", "metadata": {}, "outputs": [], "source": [ "def say_hello(name):\n", " print(\"hello,\", name)\n", " \n", "say_hello('Ada')\n", "say_hello('Alan')\n", "say_hello('Linus')" ] }, { "cell_type": "markdown", "id": "annual-heart", "metadata": {}, "source": [ "---\n", "\n", "## Let's Review: Return Statements\n", "\n", "- Bring data out of a function.\n", "- Cause the function to exit.\n", "- Aren't a `print` statement!" ] }, { "cell_type": "code", "execution_count": null, "id": "bulgarian-elimination", "metadata": {}, "outputs": [], "source": [ "def multiply(x, y):\n", " return x * y\n", "\n", "result = multiply(3, 4) # Result is now equal to 12.\n" ] }, { "cell_type": "markdown", "id": "tamil-begin", "metadata": {}, "source": [ "\n", "---\n", "\n", "## Let's Review: Classes\n", "\n", "- Templates (aka, blueprints) for objects.\n", "- Can contain methods and/or variables.\n", "- `self` is a reference to the created object.\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "negative-price", "metadata": {}, "outputs": [], "source": [ "class Animal():\n", " def __init__(self):\n", " self.energy = 50\n", "\n", " def get_status(self):\n", " if self.energy < 20:\n", " print(\"I'm hungry!\")\n", " elif self.energy > 100:\n", " print(\"I'm stuffed!\")\n", " else:\n", " print(\"I'm doing well!\")\n" ] }, { "cell_type": "markdown", "id": "assigned-wound", "metadata": {}, "source": [ "\n", "> **Challenge:** How do you declare a new `Animal`?\n", "\n", "---\n", "\n", "## Answer: Classes\n", "\n", "Declaring a new `Animal` from the class:\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "raised-anderson", "metadata": {}, "outputs": [], "source": [ "my_animal = Animal() # Creates a new Animal instance.\n", "my_animal.get_status() # Prints \"I'm doing well!\"\n", "my_animal.energy += 100 # We can access properties!\n", "my_animal.get_status() # Prints \"I'm stuffed!\"\n" ] }, { "cell_type": "markdown", "id": "innocent-glass", "metadata": {}, "source": [ "\n", "---\n", "\n", "## Let's Review: Inheritance\n", "\n", "\n", "A class can inherit properties and methods from another class.\n", "\n", "Create a new class, `Dog`, which inherits from `Animal`.\n", "\n", "- `Dog` has an extra function, `bark()`, that prints `\"bark\"`.\n", "- `Dog` has an extra property, `breed`." ] }, { "cell_type": "code", "execution_count": null, "id": "decent-disorder", "metadata": {}, "outputs": [], "source": [ "class Animal():\n", " def __init__(self):\n", " self.energy = 50\n", "\n", " def get_status(self):\n", " if self.energy < 20:\n", " print(\"I'm hungry!\")\n", " elif self.energy > 100:\n", " print(\"I'm stuffed!\")\n", " else:\n", " print(\"I'm doing well!\")" ] }, { "cell_type": "code", "execution_count": null, "id": "reflected-baptist", "metadata": {}, "outputs": [], "source": [ "class Dog(Animal):\n", " def __init__(self, breed):\n", " super().__init__()\n", " self.breed = breed\n", " \n", " def bark(self):\n", " print(\"bark\")\n", "\n", "# Declare a new dog.\n", "fido = Dog('lab')\n", "# Call the `bark()` function.\n", "fido.bark()\n", "# Check the dog's breed and energy.\n", "print(fido.breed)\n", "print(fido.energy)" ] }, { "cell_type": "markdown", "id": "responsible-calibration", "metadata": {}, "source": [ "\n", "---\n", "\n", "## Knowledge Check\n", "\n", "We're about to move on to the next unit: Intermediate Python.\n", "\n", "Any questions?\n", "\n", "> Don't be shy! If you have a question, so do others!\n", "\n", "---\n", "\n", "## Switching Gears: Preview\n", "\n", "The next unit covers many topics, including:\n", "\n", "- User input*\n", "- File I/O*\n", "- Modules and libraries\n", "- APIs*\n", "- Data analysis with Pandas\n", "\n", "*These topics will not be covered during class, but some material on them is available in the `unit-5-intermediate` folder.\n", "\n", "You don't need to memorize them now! This is just an overview.\n", "\n", "---\n", "\n", "## User Input and File I/O\n", "\n", "You've seen this a few times already with `input()`.\n", "\n", "We'll build real interactions between your Python programs and other files — or the person using your app!\n", "\n", "We'll use Pandas for this, but there are other packages you can use." ] }, { "cell_type": "markdown", "id": "independent-navigation", "metadata": {}, "source": [ "\n", "---\n", "\n", "## Modules and Libraries\n", "\n", "\n", "We mentioned these in the pre-work!\n", "\n", "Modules and libraries are:\n", "\n", "- Code that others have written.\n", "- Free to use!\n", "- Useful extensions of the Python language (e.g., a fancy date and time formatter).\n", "\n", "This one tells us when Mother's Day is for a given year:" ] }, { "cell_type": "code", "execution_count": null, "id": "necessary-zimbabwe", "metadata": {}, "outputs": [], "source": [ "from pytime import pytime\n", "# Now we can use any function in the datetime module.\n", "\n", "print(pytime.mother(2013))" ] }, { "cell_type": "markdown", "id": "satisfactory-parameter", "metadata": {}, "source": [ "\n", "\n", "---\n", "\n", "## What Is an API?\n", "\n", "Not only can we use code other people have written; we can also use data that they've made available to us.\n", "\n", "We can incorporate stocks, movie ratings, or GIFs from the internet into your program!\n", "\n", "This API lists *Star Wars* characters." ] }, { "cell_type": "code", "execution_count": null, "id": "perceived-composition", "metadata": {}, "outputs": [], "source": [ "# Import requests module.\n", "import requests\n", "\n", "# Call the Star Wars API (swapi).\n", "res = requests.get('https://swapi.dev/api/people').json()\n", "\n", "# Print the result count.\n", "print(\"found\", res[\"count\"], \"results. Here are the first 10:\\n\")\n", "\n", "# Loop through characters: Append to file and print to screen\n", "for person in res[\"results\"]:\n", " print(person[\"name\"])" ] }, { "cell_type": "markdown", "id": "external-affairs", "metadata": {}, "source": [ "\n", "---\n", "\n", "## Summary and Q&A\n", "\n", "We reviewed topics from earlier lessons:\n", "\n", "* Lists, sets, tuples, and dictionaries.\n", "* Loops and iteration.\n", "* Functions, parameters, and return statements.\n", "* Classes and inheritance.\n", "\n", "We brushed the surface on some upcoming topics:\n", "\n", "* User input and file I/O.\n", "* Modules and libraries.\n", "* APIs.\n", "\n", "Let's jump in to it!\n", "\n", "---\n", "\n", "## Additional Reading and Resources\n", "\n", "Now that you have an understanding of basic programming, here are some cool people to read about:\n", "\n", "- **[Ada Lovelace](https://en.wikipedia.org/wiki/Ada_Lovelace):** Regarded as the first programmer.\n", "- **[Alan Turing](https://en.wikipedia.org/wiki/Alan_Turing):** Considered the father of theoretical computer and artificial intelligence; helped crack the enigma code during World War II.\n", "- **[Linus Torvalds](https://en.wikipedia.org/wiki/Linus_Torvalds):** Creator of Linux OS and Git.\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 5 }