{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Python for Signal Processing\n", "Danilo Greco, PhD - danilo.greco@uniparthenope.it - University of Naples Parthenope" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Lecture 1\n", "This lecture will provide an overview on:\n", "1. Python installation on Linux, Mac OS and Windows\n", "2. introduction on Jupyter Notebooks and Google Colaboratory for interactive rapid prototyping of python applications\n", "2. basic programming concepts\n", "3. main language statements\n", "4. exceptions, functions, arguments and parameters\n", "5. strings, lists, tuples and dictionaries" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Python installation\n", "The Python language can be easily installed both in Windows, Mac OS and in Linux. \n", "\n", "It can be downloaded from the [official web site](https://www.python.org/downloads/) and installed by following these [instructions](https://docs.python.org/3/using/index.html), depending on your target platform.\n", "\n", "Official documentation for the latest version is available on [this web site](https://docs.python.org/).\n", "\n", "Additional libraries can be used to expand the native features of the language; these software modules can be installed by running:\n", "\n", ">pip install \n", "\n", "or \n", "\n", ">python -m pip install\n", "\n", "followed by the required module name.\n", "\n", "Beginners are often tempted to install [Anaconda](https://www.anaconda.com/products/individual), which is definitely easier to setup but generates a lot of troubles for unsatisfied dependencies when updating or installing packages (therefore it is not recommended).\n", "\n", "Eventually, if you're familiar with [Docker](https://hub.docker.com), you can download a ready made python image and run the interpreter inside a container by typing the following command:\n", "\n", ">docker pull python\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# What is Jupyter Notebook?\n", "The Jupyter Notebook is an open source web application that you can use to create and share documents that contain\n", "- live code, \n", "- equations, \n", "- visualizations, \n", "- text.\n", "\n", "As a client-server application, the Jupyter Notebook allows you to edit and run your notebooks via a web browser, even without internet access. \n", "\n", "There are two components: the Python kernel and the dashboard. These lessons are delivered through Jupyter Notebooks.\n", "\n", "[Additional kernels](https://github.com/jupyter/jupyter/wiki/Jupyter-kernels) are available for other programming languages which can be installed following [these instructions](https://ipython.readthedocs.io/en/latest/install/kernel_install.html)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Install\n", "It can be installed by executing the following command:\n", "\n", ">pip install jupyter \n", "\n", "or \n", "\n", ">python -m pip install jupyter\n", "\n", "Easier installation can be done through Anaconda, a popular data science platform that can be downloaded [here](https://www.anaconda.com/): by installing Anaconda the tool is already available along with many other preinstalled scientific libraries.\n", "\n", "It can be started by running the following command in a terminal shell:\n", "\n", ">jupyter notebook\n", "\n", "This will start up Jupyter and your default browser should start (or open a new tab) to the following URL:\n", "\n", ">http://localhost:8888/tree\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Basic usage\n", "Each notebook can be organized in independent cells that can be of two main types: " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### markdown cells\n", "containing text, html code, $\\LaTeX$ mathematical formulas\n", "\n", "HTML code can be used to format text or include images such as:\n", ">
<img src=\"lena.jpg\" />
\n", "\n", "which produces:\n", "\n", "\n", "Mathematical expressions can be written inline with other text, like $e^{i\\pi} + 1 = 0$, with \n", ">$e^{i\\pi} + 1 = 0$\n", "\n", "or on a single line: \n", "\n", "$$e^x=\\sum_{i=0}^\\infty \\frac{1}{i!}x^i$$\n", "\n", "by typing $$e^x=\\sum_{i=0}^\\infty \\frac{1}{i!}x^i$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### code cells\n", "containing python code to be executed by pressing Shift+Enter or the Run button on the toolbar.\n", "\n", "This is an example of code cell:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "1\n", "2\n", "3\n", "4\n", "5\n", "6\n", "7\n" ] } ], "source": [ "import time\n", "for i in range(8):\n", " print(i)\n", " time.sleep(0.5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Organizing the code in cells is useful to control the execution and selectively execute different cells depending on the specific task." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Useful features\n", "If you don't remember the usage of a function, it is possible to recall the related python help by using the ? symbol. For instance:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": false }, "outputs": [], "source": [ "?range" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "or, after importing a particular library:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": false }, "outputs": [], "source": [ "import numpy as np\n", "\n", "?np.sqrt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Another command, useful for code optimization, is %time which reports the execution time of a line of code or %%time for the entire cell." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "CPU times: total: 0 ns\n", "Wall time: 0 ns\n" ] } ], "source": [ "%time for i in range(5): print('Hello world!')" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Wall time: 0 ns\n" ] } ], "source": [ "%%time \n", "for i in range(5):\n", " print('Hello world!')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To test multiple runs of a piece of code, we can use the %%timeit magic command, as of the example below:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "46.3 µs ± 6.12 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" ] } ], "source": [ "%%timeit -n 100\n", "print('Hello world!')" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "Hello world!\n", "The slowest run took 10.47 times longer than the fastest. This could mean that an intermediate result is being cached.\n", "105 µs ± 131 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" ] } ], "source": [ "%%timeit -n 100\n", "msg = 'Hello world!'\n", "print(msg)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is also possible to execute shell commands by prepending the exclamation mark (!):" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": false }, "outputs": [], "source": [ "!pip install numpy" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "#!ls -la\n", "!dir" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Alternatives to local installation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is possible to use jupyter notebooks even without installing anything on your computer. Best available options on internet are:\n", "\n", "- [Google Colaboratory](https://colab.research.google.com/) (recommended alternative, requires a Google account): provides a customized version of jupyter notebooks which can be executed either on a standard CPU, for low computational requirements, or on GPUs or on TPUs when parallel processing is required. Provides a good quickstart tutorial and can mount Google Drive storage for data persistence.\n", "- [Microsoft Azure Notebooks](https://notebooks.azure.com/) (likely to be discontinued): notebooks can be run on a VM or a shared cluster computing environment" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Language introduction\n", "Python is an interpreted programming language but additional tools allow script compilation to obtain native executables for the target platform. \n", "\n", "As every programming language, it has a list of reserved keywords that cannot be used as variable names or identifiers.\n", "\n", "The keyword list is accessible through the inline help: " ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Here is a list of the Python keywords. Enter any keyword to get more help.\n", "\n", "False break for not\n", "None class from or\n", "True continue global pass\n", "__peg_parser__ def if raise\n", "and del import return\n", "as elif in try\n", "assert else is while\n", "async except lambda with\n", "await finally nonlocal yield\n", "\n" ] } ], "source": [ "help('keywords')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Constants, variables and expressions\n", "Unmutable values such as numbers, letters or strings are termed Constants because their value is not meant to change over time." ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "145\n" ] } ], "source": [ "print(145)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "23.6\n" ] } ], "source": [ "print(23.6)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello students!\n", "Hello students!\n" ] } ], "source": [ "print('Hello students!')\n", "print(\"Hello students!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Please note that string constants are enclosed in single or double quotes.\n", "\n", "Variables are named memory locations where one can store data values and later retrieve them using the variable name.\n", "\n", "Examples of variables are:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "145\n" ] } ], "source": [ "a = 145\n", "print(a)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "23.6\n" ] } ], "source": [ "b = 23.6\n", "print(b)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello students!\n" ] } ], "source": [ "c = 'Hello students!'\n", "print(c)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Variables can be modified any time by simply setting a new value which overwrites the content of the memory location:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "100\n" ] } ], "source": [ "a = 100 # new value for variable a\n", "print(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Variable names are chosen by programmers and usually abide by some naming rules defined in companies guidelines or best practices.\n", "\n", "According to language naming rules, variables: \n", "* must begin with letter or _ (underscore)\n", "* must contain only letters, numbers and underscores\n", "* are case sensitive\n", "\n", "Examples\n", ">name, name23, _name are valid names;\n", "\n", ">$name, 23name, na.me are invalid names;\n", "\n", ">name, Name, NAME are different names.\n", "\n", "Variable names should be able to help us remind what is going to be stored in that memory area. As an example, the first code block does not manifest its purpose, whereas the second one makes it clear to everyone even if the results are exactly the same." ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "513.0\n", "513.0\n" ] } ], "source": [ "# bad naming\n", "a = 38\n", "b = 13.50\n", "c = a * b\n", "print(c)\n", "\n", "# good naming\n", "worked_hours = 38\n", "hourly_rate = 13.50\n", "amount_due = worked_hours * hourly_rate\n", "print(amount_due)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Assignments and expressions\n", "\n", "The = symbol represents the assignment operation that is copying in the left side variable the value or the expression result on the right side. \n", "\n", "For instance,\n", "\n", "$$a = 39$$ \n", "\n", "means that the constant value 39 is assigned to variable a. It can be thought as \n", "\n", "$$a \\leftarrow 39$$\n", "\n", "Similarly, we can assign the result of an expression to a variable, like\n", "\n", "$$a = a + 3$$\n", "\n", "which means that the original value of $a$ is incremented by $3$ and then reassigned to the same variable thus reusing the same memory location\n", "\n", "$$a \\leftarrow a + 3$$\n", "\n", "An expression is a combination of values, operators and functions that should be evaluated before assigning its result to a variable." ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "22.958333333333332\n" ] } ], "source": [ "x = a / 24 * (1 + b) # this is an expression\n", "print(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Expressions are evaluated according to common mathematical rules and make use of the following symbols to express arithmetical operations:\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", "
OperatorOperation
+addition
-subtraction
*multiplication
/division
**power
%reminder
\n", "\n", "Expressions evaluation is subject to operator precedence rules; from highest to lowest precedence, python considers:\n", "\n", "$$parentheses~\\rightarrow~exponentiation~\\rightarrow~multiplication,~division~and~reminder~\\rightarrow~addition~and~subtraction~\\rightarrow~left~to~right$$\n", "\n", "The expressions below show the effect of operator precedence:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-6.0 7.333333333333333\n" ] } ], "source": [ "x = 1 + 2**3 - 10 / 2 * 3\n", "y = 1 + 2**3 - 10 / (2 * 3)\n", "print(x,y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Types\n", "\n", "In python all variables and constants have a type and the interpreter is able to execute the appropriate actions according to items' type. \n", "\n", "Some type conversions are applied implicitly by the language interpreter, like integer to float, but some others require explicit type casting, such as string to number and viceversa." ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7.3\n" ] } ], "source": [ "x = 3 + 4.3 # adding numerical values with implicit type conversion\n", "print(x)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "34.3\n" ] } ], "source": [ "x = '3'+'4.3' # concatenating strings\n", "print(x)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "scrolled": true }, "outputs": [ { "ename": "TypeError", "evalue": "can only concatenate str (not \"float\") to str", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m~\\AppData\\Local\\Temp\\ipykernel_14984\\479781730.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m'3'\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;36m4.3\u001b[0m \u001b[1;31m# fails because types are not compatible\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mTypeError\u001b[0m: can only concatenate str (not \"float\") to str" ] } ], "source": [ "x = '3' + 4.3 # fails because types are not compatible" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7.3\n" ] } ], "source": [ "x = float('3') + 4.3\n", "print(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is possible to display the type of a variable by executing type() on the desired element." ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "(float, str, int)" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(x), type('3'), type(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The user can assign values to program variables at runtime by means of the input() function, which always returns a string and therefore requires type conversion if the expected value is a number." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "val = input('Give me a number: ')\n", "print(type(val))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Conditional Execution\n", "\n", "The execution of a program is often altered by a condition being true or false, that is a boolean expression whose result affects the program flow. \n", "\n", "Boolean expressions use comparison operators to look at the variables without changing their content. These operators are \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", "
OperatorMeaning
<less than
<=less than or equal to
==equal to
>=greater than or equal to
>greater than
!=not equal to
\n", "\n", "The comparison operator for equal to is ==, not to be confused with = which is the assignment operator.\n", "\n", "The conditional statement is if-elif-else and it can be used in different forms. \n", "\n", "Python has no switch statement: it can be replaced by multi-way decisions." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# one-way decision\n", "x = 3\n", "print('start')\n", "if x == 3:\n", " print('the value is 3')\n", "print('end')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# two-way decision\n", "x = 5\n", "print('start')\n", "if x == 3:\n", " print('the value is 3')\n", "else:\n", " print('the value is not 3')\n", "print('end')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# multi-way decision\n", "x = 3\n", "print('start')\n", "if x > 3:\n", " print('the value is greater than 3')\n", "elif x < 3: # there can be more than one elif\n", " print('the value is less than 3')\n", "else:\n", " print('the value is equal to 3')\n", "print('end')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Multi-way decisions can be tricky: always pay attention to how the tests are set up because some branches may never be executed, as shown in the example below." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x = 7\n", "if x < 2 :\n", " print('Below 2')\n", "elif x < 20 :\n", " print('Below 20')\n", "elif x < 10 : \n", " print('Below 10') # this option will never run\n", "else :\n", " print('Something else')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x = 45\n", "if x < 2 :\n", " print('Below 2')\n", "elif x < 10 : \n", " print('Below 10') \n", "elif x < 20 :\n", " print('Below 20')\n", "else :\n", " print('Something else')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Indentation\n", "Indentation in Python is mandatory and it is required to define code blocks containing all statements that have to be executed within the same scope. Nesting statements implies an increase in indentation and the definition of a new block.\n", "\n", "Indentation can be done with either spaces or the tab key but sometimes they cannot be mixed together in the same file." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "x = 5\n", "print('start')\n", "if x > 2:\n", " print('the value is greater than 2') # block 1\n", " print('the values is '+str(x)) # block 1\n", " if x > 4: # block 1\n", " print('the value is greater than 4') # block 2\n", "else:\n", " print('the value is less than 2') # block 3\n", "print('end')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Try-except\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This block is very useful when a piece of code is somehow dangerous and program execution has to continue nonetheless.\n", "\n", "If the code in the try block works, then the except is skipped, otherwise an exception is raised and trapped in the except branch." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "val = '145'\n", "\n", "try:\n", " v = int(val)\n", " v += 2 # v = v + 2\n", "except:\n", " v = 'not an integer'\n", "\n", "print(v)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "val = 'hello'\n", "\n", "try:\n", " v = int(val)\n", " v += 2\n", "except:\n", " v = 'not an integer'\n", "\n", "print(v)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If necessary, one can trap only specific errors and ignore all others. In the following example, we want to handle the division by zero error only. Therefore, the error in value conversion can still interrupt the execution." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "val = 'hello'\n", "\n", "try:\n", " v = int(val)/0\n", " v += 2\n", "except ZeroDivisionError:\n", " v = 'division by zero is forbidden'\n", "\n", "print(v)" ] }, { "cell_type": "markdown", "metadata": { "scrolled": true }, "source": [ "# Functions\n", "\n", "*Functions are self-contained modules that can accomplish a specific task*: they can take some data as an input and return a result after processing.\n", "\n", "Functions are useful to\n", "* increment code reuse\n", "* reduce code complexity by dividing it into logical chunks\n", "* provide a library of tools to be used across different applications\n", "\n", "In Python we have:\n", "\n", "* **built-in** functions, provided as part of the language itself, e.g. print(), type();\n", "* **user-defined** functions, written by programmers to create reusable code snippets.\n", "\n", "Please note that **built-in** functions are treated as reserved keywords and therefore cannot be used as variable names.\n", "\n", "A function can be defined through the def keyword, may have arguments and may return one or more values. The definition of a function does not execute its code.\n", "\n", "\n", " def my_func(param1, param2, ...):\n", " # this is the function body and it MUST be indented\n", " # with respect to function definition keyword\n", " \n", " ... do some processing ...\n", " \n", " # return results\n", " return output_values\n", "\n", "\n", "The variables between brackets are placeholders for the function inputs and are termed **parameters**; when a function is invoked, or called, these placeholders are replaced by the **arguments** and the function code is executed. Each time a function is called, we can pass different arguments.\n", "\n", "\n", " arg1 = 'hello'\n", " arg2 = 12.4\n", " ... other arguments ...\n", " \n", " # assign return value to a variable\n", " ret = my_func(arg1, arg2, ...):\n", "\n", "A function may have zero or more parameters, which in python can also be optional. Moreover, the output of a function can be used as argument to another one.\n", "\n", "#### Examples" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "m = max('This is a message')\n", "print(m)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "arg = 'This is another message'\n", "print(max(arg))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# a function with an optional parameter\n", "def power(num, exp=2):\n", " return num**exp" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(power(3,0.5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**REMEMBER**: *parameters* are used in function definition, whereas *arguments* are assigned when the function is called.\n", "\n", "It is possible to define a function does not return a value: in this case, it is termed **procedure**." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Iterations\n", "\n", "In order to implement the repeated execution of a piece of code python provides the following iteration statements.\n", "\n", "#### while \\:\n", "Is should be used when the number of iterations is not known upfront and the execution depends on one or more conditions: they are called **indefinite** loops and the execution continues until the condition becomes **False**." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "while True: # this may lead to infinite loops\n", " str = input('Type something: ')\n", " print('You typed '+str)\n", " if str == 'stop':\n", " print('Stopping loop')\n", " break" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "while True:\n", " str = input('Type something: ')\n", " if str == 'skip':\n", " continue # skips all subsequent statements\n", "\n", " print('You typed '+str) \n", " if str == 'stop':\n", " print('Stopping loop')\n", " break" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "loop = True # boolean condition\n", "\n", "while loop:\n", " str = input('Type something: ')\n", " print('You typed '+str)\n", " if str == 'stop':\n", " print('Stopping loop')\n", " loop = False" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### for \\ in \\:\n", "\n", "This statement is used any time the number of iterations is finite: it is a **definite** loop that iterates through the members of a set.\n", "\n", "The iteration variable is sequentially assigned the elements of the list and its content can be used within the code block, which is executed as many times as the list size." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5\n", "4\n", "3\n", "2\n", "1\n", "Boom!!!\n" ] } ], "source": [ "for i in [5,4,3,2,1]:\n", " print(i)\n", "print('Boom!!!')" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "2\n", "3\n", "4\n", "5\n", "6\n", "7\n", "8\n", "9\n" ] } ], "source": [ "for i in range(1,10):\n", " print(i)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Honda\n", "Yamaha\n", "Aprilia\n", "Ducati\n" ] } ], "source": [ "for s in ['Honda', 'Yamaha', 'Aprilia', 'Ducati']:\n", " print(s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In Python, you can slice a list to extract a subset of its elements. The syntax for slicing a list is my_list[start:end], where start is the index of the first element to include in the slice, and end is the index of the first element to exclude from the slice. If start is omitted, it defaults to 0. If end is omitted, it defaults to the length of the list.\n", "\n", "In the given code, my_list[1:] is a slice of my_list that includes all elements from the second element (index 1) to the end of the list. This means that v will take on the values of each element in my_list, except for the first element (which is assigned to mx outside the loop).\n", "\n", "The loop then iterates through each of these values, comparing each value to the current maximum value mx and updating mx if the current value is greater than mx\n" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The largest values is 68\n" ] } ], "source": [ "# find the maximum of a list of values\n", "my_list = [3,41,58,32,5,68,34,21]\n", "\n", "mx = my_list[0]\n", "for v in my_list[1:]:\n", " if v > mx:\n", " mx = v\n", "\n", "print('The largest values is',mx)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Strings\n", "\n", "A string is a sequence of characters containing any printable symbol, defined between quotes or double-quotes. \n", "\n", "Strings can also contain numbers, in which case they must be converted into numerical variables before any computation. The $+$ operator on strings means concatenation." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello12.75\n", "13.75\n", "12\n", "75\n" ] }, { "ename": "ValueError", "evalue": "invalid literal for int() with base 10: '12.75'", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[12], line 11\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;28mint\u001b[39m(t[:\u001b[38;5;241m2\u001b[39m])) \u001b[38;5;66;03m# this works because an integer number is selected\u001b[39;00m\n\u001b[0;32m 9\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;28mint\u001b[39m(t[\u001b[38;5;241m3\u001b[39m:])) \u001b[38;5;66;03m# this works because an integer number is selected\u001b[39;00m\n\u001b[1;32m---> 11\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;28;43mint\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mt\u001b[49m\u001b[43m)\u001b[49m)\n", "\u001b[1;31mValueError\u001b[0m: invalid literal for int() with base 10: '12.75'" ] } ], "source": [ "s = 'Hello'\n", "t = '12.75'\n", "\n", "r = s+t\n", "print(r)\n", "\n", "print(float(t)+1)\n", "print(int(t[:2])) # this works because an integer number is selected\n", "print(int(t[3:])) # this works because an integer number is selected\n", "\n", "print(int(t)) # this fails because t is a floating point value" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Each character can be addressed individually like a list element, using an index between square brackets, but it cannot be modified: only the whole string can be replaced. \n", "\n", "The index values are either integers or integer expressions, start at zero and end at string length minus one. \n", "String length is returned by the len built-in function.\n", "\n", "List slicing rules apply using the *colon* operator. The basic syntax for slicing is:\n", "\n", " list[start:stop[:step]]\n", "\n", "where \n", "* start is the first element to be selected\n", "* stop is the first element to be excluded\n", "* step is the increment between two selected positions\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "t[2] = 3" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(len(r))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# looping over a string\n", "ix = 0\n", "\n", "while ix < len(s):\n", " print(r[ix])\n", " ix += 1" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# a better way to loop over a string\n", "for char in s:\n", " print(char)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The input function is used to read user data: it returns a string value to be parsed and converted as needed. This allows for better control over user input or possible errors. \n", "\n", "The in keyword can also be used as a logical operator to check whether a string is contained into another:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(s)\n", "'ll' in s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Strings are compared in alphabetical order according to the selected charset (ASCII, UTF-8, etc.), using the comparison operators described above. \n", "\n", "The string class defines many built-in functions that can be used for string processing. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "type(s)\n", "dir(s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Inline **help** is available for every class method by prepending the ? symbol to class or variable method:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "?str.find \n", "# or ?s.find" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For instance, if we want to find the first occurrence of a substring in a text, the find class method should be used as follows:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "text = 'this is my sample message'\n", "\n", "pos = text.find('my')\n", "print(pos)\n", "\n", "pos = text.find('x') # if substring is not found, -1 is returned\n", "print(pos)\n", "\n", "addr = 'john.doe@the.university.edu'\n", "splitat = addr.find('@')\n", "uname = addr[:splitat]\n", "domain = addr[splitat+1:]\n", "print(uname)\n", "print(domain)\n", "\n", "\n", "# or else\n", "parts = addr.split('@')\n", "print(parts)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Lists\n", "\n", "Lists are a collection of elements associated to a single variable. \n", "\n", "Each element can be any python object and even another list. Its elements can be addressed with slicing as already explained with strings.\n", "\n", "A list can also be empty: this is useful for initialization.\n", "\n", "#### Examples" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "l1 = [11,32,45,1,6,78]\n", "l2 = ['cat','mouse','dog','horse']\n", "\n", "l3 = [l1,l2]\n", "print(l3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "List l3 is a bi-dimensional object whose elements can be accessed as follows:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "l3[0][2], l3[1][1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lists are **mutable** objects, hence we can change any item as needed. Most frequently, lists are assigned **by reference** therefore any changes to a list item may be reflected into other objects." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "l1[1] += 3\n", "print(l3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly to strings, the + operator concatenates two or more lists into a new one. Moreover, the in operator can be used to verify the presence of a value in a list." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "l4 = l1 + l2\n", "print(l4)\n", "\n", "print('bee' in l4)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# available list methods\n", "dir(list())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lists can also be created dynamically by adding elements to an empty list:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lx = list() # or lx = []\n", "\n", "lx.append(3)\n", "lx.append('good')\n", "\n", "print(lx)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Dictionaries\n", "\n", "A Dictionary is a collection of labelled items organized in key-value pairs, such as:\n", "\n", "\n", " a_dict = {'key1': value1, 'key2': 'value2', ... }\n", "\n", "\n", "They are the most powerful data collection in python and are supported, with alternative names, in many other programming languages. Dictionary elements are addressed through their label and can be modified as needed.\n", "\n", "#### Examples" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dc = dict()\n", "\n", "dc['crypto'] = 'Ethereum'\n", "dc['price'] = 2000.0000\n", "dc['24h Change %'] = 3\n", "\n", "# print the dictionary\n", "print(dc)\n", "\n", "# print all keys\n", "print(dc.keys())\n", "\n", "# print all values\n", "print(dc.values())\n", "\n", "# print all dictionary pairs\n", "print(dc.items())" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dc['price'] = 2100.0\n", "print(dc)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# list all available methods\n", "dir(dc)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# word occurrence count \n", "words = ['this','is','my','hat','my','black','hat']\n", "\n", "woc1 = dict()\n", "for word in words:\n", " if word in woc1:\n", " woc1[word] += 1\n", " else:\n", " woc1[word] = 1\n", "\n", "print(woc1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# a better way to count occurences\n", "woc2 = dict()\n", "for word in words:\n", " woc2[word] = woc2.get(word,0) + 1\n", " \n", "print(woc2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Tuples\n", "\n", "A Tuple is a collection of items that cannot be altered once created. It is an **immutable** list.\n", "\n", "\n", " a_tuple = (item1, item2, ... )\n", "\n", "\n", "Note that lists are declared with square brackets, whereas tuples make use of round brackets. Tuple elements can be copied into variables with a single assignment for all variables.\n", "\n", "#### Examples" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "tu = (2.13,'dog', 102)\n", "print(tu)\n", "\n", "print(tu[1])\n", "\n", "tu[1] = 'tiger'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dir(tu)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a,b,c = tu\n", "print(a)\n", "print(b)\n", "print(c)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Any Questions?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Homeworks\n", "\n", "* find average of a list of values\n", "* find the smallest value of a list\n", "* solve quadratic equation" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.16" } }, "nbformat": 4, "nbformat_minor": 2 }