{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Wrap Up\n" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## Some (extra) Python\n", "\n", "- `try`/`except`\n", "- string formatting (`format`)\n", "- sets\n", "- `collections`\n", "- args & kwargs\n", "- list comprehensions\n", "- `map`\n", "- Class Inheritance\n", "- widgets" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "...or: a day of shortcuts\n", "\n", "Note: Shortcuts make *your* life easier, but your code *less* understandable to beginners." ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "It's hard to search for things you don't know exist.\n", "\n", "Today's goal : let you know these things exist.\n", "\n", "NOT today's goal : teach you all the details." ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "You do *not* need to incorporate these into your project, but if they'll help you, go for it!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "outputs": [], "source": [ "import antigravity" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## `try`/`except`\n", "\n", "- error handling\n", "- try what's within the `try` code block; only go to `except` if `try` raises an error" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [], "source": [ "# Note: `x` has not been previously defined\n", "try:\n", " print(x)\n", "except:\n", " print(\"Error encountered\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Different error types can be handled differently:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "editable": true, "scrolled": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [], "source": [ "try:\n", " print(x)\n", "except NameError:\n", " print(\"NameError: Check that variable exists\")\n", "except IndexError:\n", " print(\"IndexError: Check that value being indexed exists\")\n", "except:\n", " print(\"Error: Error found; check code\")" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## String Formatting" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Use the `format` method to manipulate and format strings." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "name = \"Shannon\"\n", "job = \"Associate Teaching Professor\"\n", "topic = \"Python\"\n", "\n", "\"Hello! My name is {}. My job is {}, and I work on {}\".format(name, job, topic)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Sets " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Sets are a variable type that store **only unique entries**." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "my_set = set([1, 1, 2, 3, 4])\n", "my_set" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Like lists, they are iterable & mutable." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "my_set.add(6)\n", "my_set" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Reminder that if you add a value that is already in the set...the set will not change" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Collections" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "The `collections` module has a number of useful variable types, with special properties. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "\"Special editions\" of collections we've discussed before (lists, tuples, and dictionaries)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "from collections import Counter" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# count how many elements there are in collection\n", "# return values in a dictionary\n", "Counter([1, 0, 1, 2, 1])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import collections" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "collections.Counter([1, 0, 1, 2, 1])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# can count how many of each letter are in there\n", "Counter(\"I wonder how many times I use the letter 'e'\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Think back to our encryption scheme! \n", "\n", "The most common letter in the English language is 'e'.\n", "\n", "If you just move each letter over by 1 position, you can just use a Counter to crack the code.\n", "\n", "Why we moved to a variable encoder!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## `args` & `kwargs`\n", "\n", "- allow you to pass a variable number of arguments to a function\n", " - `*args` - allow any number of extra arguments (including zero)\n", " - `**kwargs` - allow any number of *keyword* arguments to be passed (as a dictionary)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "### `*args`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "# use *arguments to demonstrate args\n", "def tell_audience(*arguments):\n", " for arg in arguments:\n", " print(arg)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "tell_audience('asdf')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "tell_audience(\"Hello!\", \n", " \"My name is Shannon.\", \n", " \"My job is Associate Teaching Professor.\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "### `**kwargs`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "def tell_audience_kwargs(**info):\n", " print(\"type: \", type(info), '\\n')\n", " \n", " for key, value in info.items():\n", " print(\"key: \", key)\n", " print(\"value: \", value, \"\\n\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "tell_audience_kwargs(first='Shannon', \n", " last='Ellis', \n", " email='sellis@ucsd.edu')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## List Comprehensions" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true }, "slideshow": { "slide_type": "fragment" } }, "source": [ "List comprehensions allow you to run loops and conditionals, *inside lists*." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The general format is :\n", "\n", "`[ expression for item in list if conditional ]`\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# NOT a list comprehension\n", "# how we've been doing it\n", "input_list = [0, 1, 2]\n", "output_list = []\n", "\n", "for ind in input_list:\n", " output_list.append(ind + 1)\n", " \n", "# look at output\n", "output_list" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# This list comprehension is equivalent to the cell above\n", "# note the square brackets on the outside\n", "[ind + 1 for ind in [0, 1, 2]]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# You can also include conditionals inside a list comprehension\n", "[val for val in [1, 2, 3, 4, 5] if val % 2 == 0]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Note: there are also tuple & dictionary comprehensions. They're just used less frequently." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Regular Expressions" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Regular expressions allow you to work with **specified patterns in strings**." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "import re" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "my_string = \"If 12 Python programmers try to complete 14 tasks in 16 minutes, why?\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# can just search for a letter\n", "re.findall('o', my_string)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# but the patterns are where these shine\n", "re.findall('\\d\\d', my_string)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Lambda Functions" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Lambda functions are small, anonymous functions. \n", "\n", "Can define them in line." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "increment = lambda a: a + 1" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "increment(1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# not a lambda function\n", "def lambda_equivalent(a):\n", " \n", " output = a + 1\n", " \n", " return output" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "lambda_equivalent(1)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## map" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "`map` applies a given function to each element in a collection. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# create a function\n", "def double(val):\n", " return val * 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# map function to each element of list\n", "my_list = [1, 2, 3, 4]\n", "list(map(double, my_list))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# Note - we can use lambda functions with map\n", "list(map(lambda x: x *2, my_list))" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## Class Inheritence\n", "\n", "Inheritance allows us to define a class that inherits all the methods and attributes from another class. Parent class (aka super class aka base class) is the class being inherited from. Child class (aka derived class) is the class getting all the parent's hard work for free :)\n", "\n", "Now we can start to design code with efficient reuse of work we already did!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "class Person:\n", " def __init__(self, fname, lname):\n", " self.firstname = fname\n", " self.lastname = lname\n", "\n", " def get_first_last(self):\n", " return self.prefix + ' ' + self.firstname+ ' ' + self.lastname\n", "\n", " def get_last_first(self): \n", " return self.lastname + ', ' + self.firstname" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "p1 = Person('Shannon', 'Ellis')\n", "\n", "print(p1.get_first_last())\n", "print(p1.get_last_first())" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "Let's make a Student class... \n", "\n", "but I'm lazy and don't want to do all the work of reimplementing. So let's inherit Person's abilities " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "# as is this will cause an error in the next cell execution\n", "# but if you add (Person) at the end of `class Student` \n", "# then we inherit the properties, no error!\n", "class Student: # class Student(Person): \n", " pass" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "s1 = Student('Kayden', 'Altman')\n", "\n", "print(s1.get_first_last())\n", "print(s1.get_last_first())" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "Once you add (Person) to inherit all of Person's attributes and methods, class Student is reusing all the work you did with Person!\n", "\n", "Lets make Student have extra abilities... so we need to add new instance attributes like PID and grade." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "class Student(Person):\n", " def __init__(self, fname, lname, pid, grade):\n", " self.pid = pid\n", " self.grade = grade" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "s1 = Student('Kayden', 'Altman', 'A12345', 'A-')\n", "\n", "print(s1.get_first_last())\n", "print(s1.get_last_first())" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "When you add the `__init__()` function, the child class will no longer inherit the parent's `__init__()` function!\n", "\n", "To keep the inheritance of the parent's __init__() function, explicitly add a call to the parent's __init__() function:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "class Student(Person):\n", " def __init__(self, fname, lname, pid, grade):\n", " Person.__init__(self, fname, lname)\n", " self.pid = pid\n", " self.grade = grade" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "s1 = Student('Kayden', 'Altman', 'A12345', 'A-')\n", "\n", "print(s1.get_first_last())\n", "print(s1.get_last_first())" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "But we don't even have to care what the NAME of the parent class is... python has a generic \"get my parent\" function called `super()`\n", "\n", "__NB__: when you call `super()` you do NOT have to explicitly pass the `self` pointer" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "class Student(Person):\n", " def __init__(self, fname, lname, pid, grade):\n", " super().__init__(fname, lname)\n", " self.pid = pid\n", " self.grade = grade" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "s1 = Student('Kayden','Altman','A12345','A-')\n", "\n", "print(s1.get_first_last())\n", "print(s1.get_last_first())" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "### Clicker Question #1\n", "\n", "Modify the Person class to store a name prefix (like mr., dr. or prof. ). Make `get_first_last()` print out the prefix too.\n", "\n", "Now redefine Student class to take advantage of that extra work you did in the superclass with just a tiny bit of work!\n", "\n", "- A) I did it!\n", "- B) I think I did it!\n", "- C) SO LOST!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "## EDIT HERE\n", "class Person:\n", " def __init__(self, fname, lname):\n", " self.firstname = fname\n", " self.lastname = lname\n", "\n", " def get_first_last(self):\n", " return self.prefix + ' ' + self.firstname+ ' ' + self.lastname\n", "\n", " def get_last_first(self): \n", " return self.lastname + ', ' + self.firstname\n", "\n", "class Student(Person):\n", " def __init__(self, fname, lname, pid, grade):\n", " super().__init__(fname, lname)\n", " self.pid = pid\n", " self.grade = grade" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "# try it out" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## Time for some UI\n", "\n", "We can implement a GUIs using iPyWidgets" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# you may need this\n", "%pip install --user ipywidgets" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "import ipywidgets as widgets" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [], "source": [ "@widgets.interact\n", "def f(x=5):\n", " print(x*x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "@widgets.interact_manual(\n", " color=['blue', 'red', 'green'], lw=(1., 10.))\n", "def plot(freq=1., color='blue', lw=2, grid=True):\n", " t = np.linspace(-1., +1., 1000)\n", " fig, ax = plt.subplots(1, 1, figsize=(8, 6))\n", " ax.plot(t, np.sin(2 * np.pi * freq * t),\n", " lw=lw, color=color)\n", " ax.grid(grid)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "editable": true, "jupyter": { "outputs_hidden": true }, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## The Goal" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "To teach you a skill - of how to do things with Python." ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "You've been more formally trained than *many* people out in the world programming." ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## Where We've Been:\n", "\n", "- Python & Jupyter\n", "- Variables\n", "- Operators\n", "- Conditionals\n", "- Functions\n", "- Lists, Tuples & Dictionaries\n", "- Loops\n", "- Objects & Classes\n", "- Command Line\n", "- Scientific Computing\n", "- Documentation, Code Style, Code Testing" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "#### Clicker Question #2\n", "\n", "After COGS 18, I feel \\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_ my Python programming abilities\n", "\n", "- A) very confident in\n", "- B) somewhat confident in\n", "- C) middle-of-the-road about\n", "- D) somewhat unsure about\n", "- E) very unsure about\n" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "#### Clicker Question #3\n", "\n", "After COGS 18, I feel the following about my future Python programming:\n", "\n", "- A) will use again for sure\n", "- B) may use again\n", "- C) unsure if will use again\n", "- D) probably won't use again\n", "- E) definitely won't use again\n" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## How to Continue with Coding" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Write Code\n", "- Read Code\n", "- Learn and follow standard procedures\n", "- Do code reviews\n", "- Interact with the community\n", "- Build a code portfolio" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## Where do you go from here? (things)\n", "\n", "- `git` & [GitHub](https://github.com/) - version control, code!\n", "- Code in production: deubuggers ([`pdb`](https://docs.python.org/3/library/pdb.html))\n", "- Dependancy-management ([`PyPI`](https://pypi.org/), [conda](https://docs.conda.io/en/latest/))\n", "- IDEs: [VSCode](https://code.visualstudio.com/)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Where do you go from here? (courses)" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "- if want_more_data_science:\n", " - go to COGS 9\n", "- if you want *to do* more_data_science:\n", " - ...*and* Python: take COGS 108\n", " - ...*and* R: take COGS 137\n", "- if interested_in_research:\n", " - look for labs, tell them you can code\n", "- if you want_something_else:\n", " - go do it!" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## Powered by Python" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "This course used:\n", "- Python Programming Language\n", "- Jupyter Notebooks\n", "- RISE Jupyter Slides\n", "- nbgrader\n", "- Jupyter Book\n", "- scipy stack & many other 3rd party modules" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## Acknowledgments" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "Thank you to Tom for his original design of this course." ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "Thank you to the TAs & IAs for their tireless work on this class." ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "Thank you students for you time, effort and patience. " ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true }, "slideshow": { "slide_type": "slide" } }, "source": [ "