From 6b304eb0ca9f2b7cbd31198f9e126c19736a6071 Mon Sep 17 00:00:00 2001 From: ShivanS93 Date: Sun, 26 Sep 2021 12:59:32 +1300 Subject: [PATCH] adding zero_2_hundred --- README.MD | 11 + zero_2_hundred/Pipfile | 12 + zero_2_hundred/Pipfile.lock | 107 +++ zero_2_hundred/README.MD | 14 + zero_2_hundred/f.png | Bin 0 -> 18651 bytes zero_2_hundred/f_better.png | Bin 0 -> 19974 bytes zero_2_hundred/zero_2_hundred.ipynb | 1087 +++++++++++++++++++++++++++ 7 files changed, 1231 insertions(+) create mode 100644 zero_2_hundred/Pipfile create mode 100644 zero_2_hundred/Pipfile.lock create mode 100644 zero_2_hundred/README.MD create mode 100644 zero_2_hundred/f.png create mode 100644 zero_2_hundred/f_better.png create mode 100644 zero_2_hundred/zero_2_hundred.ipynb diff --git a/README.MD b/README.MD index 8ba74c3..2c0e10c 100644 --- a/README.MD +++ b/README.MD @@ -12,4 +12,15 @@ Pytest is a great tool that allows us to write automated test for our code. This [Check it out!](https://git.chch.tech/Shivan/learning_python/src/branch/main/intro_pytest) +## Zero to Hundred in Python + +26th September 2021 + +Programming is a powerful tool and Python is an easy way to get started. + +[Check it out!](https://git.chch.tech/Shivan/learning_pythong/src/branch/main/zero_2_hundred) + ## What's next? +- Classes +- Django intro +- Setting up postgres diff --git a/zero_2_hundred/Pipfile b/zero_2_hundred/Pipfile new file mode 100644 index 0000000..4af3735 --- /dev/null +++ b/zero_2_hundred/Pipfile @@ -0,0 +1,12 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +pandas = "*" + +[dev-packages] + +[requires] +python_version = "3.8" diff --git a/zero_2_hundred/Pipfile.lock b/zero_2_hundred/Pipfile.lock new file mode 100644 index 0000000..93fd3ed --- /dev/null +++ b/zero_2_hundred/Pipfile.lock @@ -0,0 +1,107 @@ +{ + "_meta": { + "hash": { + "sha256": "44a2006c840cfcfa4b8855e84f23bc17646a2b9634c870d36836c27d43571d6c" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.8" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "numpy": { + "hashes": [ + "sha256:09858463db6dd9f78b2a1a05c93f3b33d4f65975771e90d2cf7aadb7c2f66edf", + "sha256:209666ce9d4a817e8a4597cd475b71b4878a85fa4b8db41d79fdb4fdee01dde2", + "sha256:298156f4d3d46815eaf0fcf0a03f9625fc7631692bd1ad851517ab93c3168fc6", + "sha256:30fc68307c0155d2a75ad19844224be0f2c6f06572d958db4e2053f816b859ad", + "sha256:423216d8afc5923b15df86037c6053bf030d15cc9e3224206ef868c2d63dd6dc", + "sha256:426a00b68b0d21f2deb2ace3c6d677e611ad5a612d2c76494e24a562a930c254", + "sha256:466e682264b14982012887e90346d33435c984b7fead7b85e634903795c8fdb0", + "sha256:51a7b9db0a2941434cd930dacaafe0fc9da8f3d6157f9d12f761bbde93f46218", + "sha256:52a664323273c08f3b473548bf87c8145b7513afd63e4ebba8496ecd3853df13", + "sha256:550564024dc5ceee9421a86fc0fb378aa9d222d4d0f858f6669eff7410c89bef", + "sha256:5de64950137f3a50b76ce93556db392e8f1f954c2d8207f78a92d1f79aa9f737", + "sha256:640c1ccfd56724f2955c237b6ccce2e5b8607c3bc1cc51d3933b8c48d1da3723", + "sha256:7fdc7689daf3b845934d67cb221ba8d250fdca20ac0334fea32f7091b93f00d3", + "sha256:805459ad8baaf815883d0d6f86e45b3b0b67d823a8f3fa39b1ed9c45eaf5edf1", + "sha256:92a0ab128b07799dd5b9077a9af075a63467d03ebac6f8a93e6440abfea4120d", + "sha256:9f2dc79c093f6c5113718d3d90c283f11463d77daa4e83aeeac088ec6a0bda52", + "sha256:a5109345f5ce7ddb3840f5970de71c34a0ff7fceb133c9441283bb8250f532a3", + "sha256:a55e4d81c4260386f71d22294795c87609164e22b28ba0d435850fbdf82fc0c5", + "sha256:a9da45b748caad72ea4a4ed57e9cd382089f33c5ec330a804eb420a496fa760f", + "sha256:b160b9a99ecc6559d9e6d461b95c8eec21461b332f80267ad2c10394b9503496", + "sha256:b342064e647d099ca765f19672696ad50c953cac95b566af1492fd142283580f", + "sha256:b5e8590b9245803c849e09bae070a8e1ff444f45e3f0bed558dd722119eea724", + "sha256:bf75d5825ef47aa51d669b03ce635ecb84d69311e05eccea083f31c7570c9931", + "sha256:c01b59b33c7c3ba90744f2c695be571a3bd40ab2ba7f3d169ffa6db3cfba614f", + "sha256:d96a6a7d74af56feb11e9a443150216578ea07b7450f7c05df40eec90af7f4a7", + "sha256:dd0e3651d210068d13e18503d75aaa45656eef51ef0b261f891788589db2cc38", + "sha256:e167b9805de54367dcb2043519382be541117503ce99e3291cc9b41ca0a83557", + "sha256:e42029e184008a5fd3d819323345e25e2337b0ac7f5c135b7623308530209d57", + "sha256:f545c082eeb09ae678dd451a1b1dbf17babd8a0d7adea02897a76e639afca310", + "sha256:fde50062d67d805bc96f1a9ecc0d37bfc2a8f02b937d2c50824d186aa91f2419" + ], + "markers": "python_version < '3.11' and python_version >= '3.7'", + "version": "==1.21.2" + }, + "pandas": { + "hashes": [ + "sha256:272c8cb14aa9793eada6b1ebe81994616e647b5892a370c7135efb2924b701df", + "sha256:3334a5a9eeaca953b9db1b2b165dcdc5180b5011f3bec3a57a3580c9c22eae68", + "sha256:37d63e78e87eb3791da7be4100a65da0383670c2b59e493d9e73098d7a879226", + "sha256:3f5020613c1d8e304840c34aeb171377dc755521bf5e69804991030c2a48aec3", + "sha256:45649503e167d45360aa7c52f18d1591a6d5c70d2f3a26bc90a3297a30ce9a66", + "sha256:49fd2889d8116d7acef0709e4c82b8560a8b22b0f77471391d12c27596e90267", + "sha256:4def2ef2fb7fcd62f2aa51bacb817ee9029e5c8efe42fe527ba21f6a3ddf1a9f", + "sha256:53e2fb11f86f6253bb1df26e3aeab3bf2e000aaa32a953ec394571bec5dc6fd6", + "sha256:629138b7cf81a2e55aa29ce7b04c1cece20485271d1f6c469c6a0c03857db6a4", + "sha256:68408a39a54ebadb9014ee5a4fae27b2fe524317bc80adf56c9ac59e8f8ea431", + "sha256:7326b37de08d42dd3fff5b7ef7691d0fd0bf2428f4ba5a2bdc3b3247e9a52e4c", + "sha256:7557b39c8e86eb0543a17a002ac1ea0f38911c3c17095bc9350d0a65b32d801c", + "sha256:86b16b1b920c4cb27fdd65a2c20258bcd9c794be491290660722bb0ea765054d", + "sha256:a800df4e101b721e94d04c355e611863cc31887f24c0b019572e26518cbbcab6", + "sha256:a9f1b54d7efc9df05320b14a48fb18686f781aa66cc7b47bb62fabfc67a0985c", + "sha256:c399200631db9bd9335d013ec7fce4edb98651035c249d532945c78ad453f23a", + "sha256:e574c2637c9d27f322e911650b36e858c885702c5996eda8a5a60e35e6648cf2", + "sha256:e9bc59855598cb57f68fdabd4897d3ed2bc3a3b3bef7b868a0153c4cd03f3207", + "sha256:ebbed7312547a924df0cbe133ff1250eeb94cdff3c09a794dc991c5621c8c735", + "sha256:ed2f29b4da6f6ae7c68f4b3708d9d9e59fa89b2f9e87c2b64ce055cbd39f729e", + "sha256:f7d84f321674c2f0f31887ee6d5755c54ca1ea5e144d6d54b3bbf566dd9ea0cc" + ], + "index": "pypi", + "version": "==1.3.3" + }, + "python-dateutil": { + "hashes": [ + "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", + "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "version": "==2.8.2" + }, + "pytz": { + "hashes": [ + "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da", + "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798" + ], + "version": "==2021.1" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "version": "==1.16.0" + } + }, + "develop": {} +} diff --git a/zero_2_hundred/README.MD b/zero_2_hundred/README.MD new file mode 100644 index 0000000..351642e --- /dev/null +++ b/zero_2_hundred/README.MD @@ -0,0 +1,14 @@ +# Zero to Hundred in Python + +By Shivan Sivakumaran. 26th September 2021 + +## An overview + +Programming is a powerful tool. Python is a general purpose programming language that makes it easy to start the journey of learning how to code. + +Here is a quick demo from zero to hundred. + +## Further resources + +- [Blog post](https://shivansivakumaran.com/coding/zero-to-hundred-python/) +- [Video]() diff --git a/zero_2_hundred/f.png b/zero_2_hundred/f.png new file mode 100644 index 0000000000000000000000000000000000000000..19f1d052ccd262dff927689f0ed97b4661aec43a GIT binary patch literal 18651 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 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 +}