{ "cells": [ { "cell_type": "markdown", "id": "auburn-huntington", "metadata": {}, "source": [ "# Getting started with Python / Interactive Python with Jupyter Lab\n", "\n", "## Installing miniconda\n", "\n", "- https://docs.conda.io/en/latest/miniconda.html\n", "- https://youtu.be/YqUb9XALnDE?t=209" ] }, { "cell_type": "markdown", "id": "labeled-unknown", "metadata": {}, "source": [ "### Printing and Variable" ] }, { "cell_type": "code", "execution_count": 12, "id": "asian-catalog", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello World\n" ] } ], "source": [ "print(\"Hello World\")" ] }, { "cell_type": "code", "execution_count": 13, "id": "robust-customs", "metadata": {}, "outputs": [], "source": [ "# comments are done like this" ] }, { "cell_type": "code", "execution_count": 16, "id": "chicken-broadcast", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10\n" ] } ], "source": [ "number = 10\n", "string = \"This is a string\"\n", "\n", "print(number)" ] }, { "cell_type": "code", "execution_count": 17, "id": "suburban-august", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "This is a string\n" ] } ], "source": [ "print(string)" ] }, { "cell_type": "code", "execution_count": 18, "id": "dramatic-brand", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "number: 10, and string: This is a string\n" ] } ], "source": [ "print(f\"number: {number}, and string: {string}\")" ] }, { "cell_type": "code", "execution_count": 19, "id": "female-spain", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " and \n" ] } ], "source": [ "print(f\"{type(number)} and {type(string)}\")" ] }, { "cell_type": "markdown", "id": "immediate-worst", "metadata": {}, "source": [ "### Functions" ] }, { "cell_type": "code", "execution_count": 20, "id": "favorite-damages", "metadata": {}, "outputs": [], "source": [ "# Fibonacci sequence: 0, 1, 1, 2, 3, 5, 8...\n", "\n", "def f(n: int) -> int:\n", " \"\"\"\n", " Fibonacci sequence\n", " ---\n", " params\n", " n (int) number requested in sequence\n", " \n", " returns\n", " interger in fibonacci sequence\n", " \"\"\"\n", " if n == 0:\n", " return 0\n", " if n == 1:\n", " return 1\n", " if n == 2:\n", " return 1\n", " if n >= 3:\n", " return f(n-1) + f(n-2)" ] }, { "cell_type": "code", "execution_count": 21, "id": "reliable-nudist", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\u001b[0;31mSignature:\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mDocstring:\u001b[0m\n", "Fibonacci sequence\n", "---\n", "params\n", "n (int) number requested in sequence\n", "\n", "returns\n", "interger in fibonacci sequence\n", "\u001b[0;31mFile:\u001b[0m ~/JupyterlabProjects/Saxon/\n", "\u001b[0;31mType:\u001b[0m function\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "?f" ] }, { "cell_type": "markdown", "id": "leading-literacy", "metadata": {}, "source": [ "### More data type - Lists" ] }, { "cell_type": "code", "execution_count": 22, "id": "alternate-fault", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "range(0, 10)" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r = range(10)\n", "r" ] }, { "cell_type": "code", "execution_count": 24, "id": "tutorial-buying", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lst = list(r)\n", "lst" ] }, { "cell_type": "code", "execution_count": 25, "id": "south-czech", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lst[0]" ] }, { "cell_type": "code", "execution_count": 26, "id": "administrative-class", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1, 2]" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lst[1:3]" ] }, { "cell_type": "code", "execution_count": 31, "id": "grateful-addiction", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "9" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lst[-1]" ] }, { "cell_type": "code", "execution_count": 28, "id": "brown-density", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lst[::-1]" ] }, { "cell_type": "code", "execution_count": 3, "id": "exciting-fundamental", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3\n", "4\n", "0.5\n" ] } ], "source": [ "def f1(x: int) -> int:\n", " return x + 1\n", "\n", "def f2(x: int) -> int:\n", " return x ** 2\n", "\n", "def f3(x: int) -> float:\n", " return 1 / x\n", "\n", "funcs = [f1, f2, f3]\n", "\n", "for func in funcs:\n", " print(func(2))" ] }, { "cell_type": "code", "execution_count": 29, "id": "together-lancaster", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0, 1, 1, 2, 3, 5, 8, 13, 21, 34, " ] } ], "source": [ "for i in lst:\n", " output = f(i)\n", " print(output, end=\", \")" ] }, { "cell_type": "code", "execution_count": 30, "id": "governmental-karma", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "output = []\n", "for i in lst:\n", " output.append(f(i))\n", "output" ] }, { "cell_type": "code", "execution_count": 11, "id": "latter-plumbing", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[f(i) for i in rng]" ] }, { "cell_type": "markdown", "id": "offensive-documentation", "metadata": {}, "source": [ "### Importing libraries" ] }, { "cell_type": "code", "execution_count": 32, "id": "organizational-easter", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "288 ns ± 246 ns per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "302 ns ± 252 ns per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "304 ns ± 204 ns per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "623 ns ± 288 ns per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "957 ns ± 326 ns per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "2.39 µs ± 880 ns per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "2.28 µs ± 424 ns per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "3.56 µs ± 411 ns per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "5.62 µs ± 447 ns per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "9.05 µs ± 598 ns per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "14.4 µs ± 623 ns per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "23.9 µs ± 2.03 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "36.9 µs ± 534 ns per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "61.1 µs ± 3.57 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "96.1 µs ± 506 ns per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "155 µs ± 677 ns per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "252 µs ± 5.16 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "485 µs ± 183 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "807 µs ± 125 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "1.45 ms ± 245 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "1.84 ms ± 152 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "3.27 ms ± 529 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "4.65 ms ± 601 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "7.25 ms ± 602 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "12 ms ± 1.27 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "18.7 ms ± 1.36 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "30.7 ms ± 3.21 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "63.5 ms ± 22.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "115 ms ± 38.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "130 ms ± 9.28 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "251 ms ± 50.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "392 ms ± 73.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "629 ms ± 104 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], "source": [ "times = []\n", "for i in range(33):\n", " t = %timeit -n1 -o f(i)\n", " times.append(t.best)" ] }, { "cell_type": "code", "execution_count": 34, "id": "demanding-circulation", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
f
01.580001e-07
11.819999e-07
21.979997e-07
34.560002e-07
47.710000e-07
\n", "
" ], "text/plain": [ " f\n", "0 1.580001e-07\n", "1 1.819999e-07\n", "2 1.979997e-07\n", "3 4.560002e-07\n", "4 7.710000e-07" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "df = pd.DataFrame(data=times, columns=[\"f\"])\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 36, "id": "complete-warren", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "g = df.plot(title=\"F time\")\n", "g.set_xlabel(\"n\")\n", "g.set_ylabel(\"time (s)\")\n", "plt.savefig(\"f.png\")" ] }, { "cell_type": "code", "execution_count": 15, "id": "empirical-tolerance", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "f 3.693825\n", "dtype: float64" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sum()" ] }, { "cell_type": "markdown", "id": "dress-series", "metadata": {}, "source": [ "### More data types - Dictionaries" ] }, { "cell_type": "code", "execution_count": 68, "id": "fifth-stereo", "metadata": {}, "outputs": [], "source": [ "dct = {\n", " \"key1\": \"value1\",\n", " \"key2\": [\"value2\", \"value3\"],\n", " \"random name for a key\": 1,\n", " \"key4\": (2000, 3000)\n", "}" ] }, { "cell_type": "code", "execution_count": 42, "id": "periodic-estate", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2000, 3000)" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dct[\"key4\"]" ] }, { "cell_type": "code", "execution_count": 45, "id": "buried-plant", "metadata": {}, "outputs": [], "source": [ "#dct['key5'] will error" ] }, { "cell_type": "code", "execution_count": 50, "id": "precise-possession", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dct.get(\"key5\") is None" ] }, { "cell_type": "code", "execution_count": 70, "id": "perfect-commander", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "key: key1, value: value1\n", "key: key2, value: ['value2', 'value3']\n", "key: random name for a key, value: 1\n", "key: key4, value: (2000, 3000)\n" ] } ], "source": [ "for k,v in dct.items():\n", " print(f\"key: {k}, value: {v}\")" ] }, { "cell_type": "code", "execution_count": 91, "id": "prompt-maldives", "metadata": {}, "outputs": [], "source": [ "cache = {}\n", "\n", "def f_better(n: int) -> int:\n", " \"\"\"\n", " Fibonacci sequence - !!with caching!!\n", " ---\n", " params\n", " n (int) number requested in sequence\n", " \n", " returns\n", " interger in fibonacci sequence\n", " \"\"\"\n", " if all([cache.get(n-1), cache.get(n-2)]):\n", " return cache[n-1] + cache[n-2] \n", " elif n == 0:\n", " return 0\n", " elif n == 1 or n == 2:\n", " return 1\n", " else:\n", " cache[n] = f_better(n-1) + f_better(n-2) \n", " return cache[n]" ] }, { "cell_type": "code", "execution_count": 92, "id": "north-logistics", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ff_better
01.580001e-070.000001
11.819999e-070.000001
21.979997e-070.000001
34.560002e-070.000003
47.710000e-070.000006
\n", "
" ], "text/plain": [ " f f_better\n", "0 1.580001e-07 0.000001\n", "1 1.819999e-07 0.000001\n", "2 1.979997e-07 0.000001\n", "3 4.560002e-07 0.000003\n", "4 7.710000e-07 0.000006" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "times = []\n", "for i in range(35):\n", " t = %timeit -n1 -o -q f_better(i)\n", " times.append(t.best)\n", " \n", "df['f_better'] = pd.DataFrame(data=times)\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 93, "id": "honest-rings", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "g = df.plot(title=\"F time\")\n", "g.set_xlabel(\"n\")\n", "g.set_ylabel(\"time (s)\")\n", "plt.savefig(\"f_better.png\")" ] }, { "cell_type": "code", "execution_count": 83, "id": "egyptian-seminar", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{3: 2,\n", " 4: 3,\n", " 6: 8,\n", " 7: 13,\n", " 9: 34,\n", " 10: 55,\n", " 12: 144,\n", " 13: 233,\n", " 15: 610,\n", " 16: 987,\n", " 18: 2584,\n", " 19: 4181,\n", " 21: 10946,\n", " 22: 17711,\n", " 24: 46368,\n", " 25: 75025,\n", " 27: 196418,\n", " 28: 317811,\n", " 30: 832040,\n", " 31: 1346269,\n", " 33: 3524578,\n", " 34: 5702887}" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cache" ] }, { "cell_type": "markdown", "id": "loving-jungle", "metadata": {}, "source": [ "### Classes" ] }, { "cell_type": "code", "execution_count": 133, "id": "parallel-sharp", "metadata": {}, "outputs": [], "source": [ "class Car:\n", " \"\"\"\n", " Class for cars that people drive\n", " ---\n", " params \n", " make (str): make of the car\n", " model (str): model of the car\n", " year (int): year car was made\n", " \"\"\"\n", " def __init__(self, make: str, model: str, year: int=2021):\n", " self.make = make\n", " self.model = model\n", " self.year = year\n", " self.__is_driving = False\n", " \n", " def __repr__(self):\n", " return f'{self.make} - {self.model}'\n", " \n", " def drive(self) -> str:\n", " if not self.__is_driving:\n", " print(f'{self.make} - {self.model} is now driving')\n", " self.__is_driving = True\n", " else:\n", " print(f'{self.make} - {self.model} is ALREADY driving!')\n", " \n", " def stop(self) -> str:\n", " if self.__is_driving:\n", " print(f'{self.make} - {self.model} has stopped')\n", " self.__is_driving = False\n", " else:\n", " print(f'{self.make} - {self.model} is ALREADY stopped!')" ] }, { "cell_type": "code", "execution_count": 134, "id": "protective-lying", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\u001b[0;31mInit signature:\u001b[0m \u001b[0mCar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmake\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0myear\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m2021\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mDocstring:\u001b[0m \n", "Class for cars that people drive\n", "---\n", "params \n", " make (str): make of the car\n", " model (str): model of the car\n", " year (int): year car was made\n", "\u001b[0;31mType:\u001b[0m type\n", "\u001b[0;31mSubclasses:\u001b[0m \n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "?Car" ] }, { "cell_type": "code", "execution_count": 135, "id": "dimensional-shanghai", "metadata": {}, "outputs": [], "source": [ "shivan = Car('Toyota', 'Corolla', '2008')\n", "bruno = Car('Tesla', 'Model3')" ] }, { "cell_type": "code", "execution_count": 136, "id": "raised-brook", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Tesla - Model3" ] }, "execution_count": 136, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bruno" ] }, { "cell_type": "code", "execution_count": 137, "id": "earlier-diploma", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Toyota - Corolla is now driving\n" ] } ], "source": [ "shivan.drive()" ] }, { "cell_type": "code", "execution_count": 138, "id": "varied-setting", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Toyota - Corolla is ALREADY driving!\n" ] } ], "source": [ "shivan.drive()" ] }, { "cell_type": "code", "execution_count": 139, "id": "recognized-forwarding", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tesla - Model3 is ALREADY stopped!\n" ] } ], "source": [ "bruno.stop()" ] }, { "cell_type": "code", "execution_count": null, "id": "executed-cleanup", "metadata": {}, "outputs": [], "source": [] } ], "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.10" } }, "nbformat": 4, "nbformat_minor": 5 }