Created
February 16, 2018 16:55
-
-
Save balouf/873bc9b9ee4b561b8298b78ca3daae52 to your computer and use it in GitHub Desktop.
This is a test
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# INF 674: Python in an Eggshell\n", | |
"\n", | |
"## Céline Comte & Fabien Mathieu\n", | |
"\n", | |
"### 2016-2017\n", | |
"\n", | |
"Within INF674, we will try to benchmark theoretical results against numerical values. Note that there are two popular, non-compatible, Python branches (2.x and 3.x). We will use here Python 3. No strong developing skill is required besides defining a function. If you don't know anything about Python, try one of the numerous online tutorials that should bring you up to speed in an hour or less.\n", | |
"\n", | |
"Just in case, a small survival kit is provided below." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# 1. IDEs" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"There are multiple ways to code in Python: VI, Emacs, Eclipse... During the first session, we tried Spyder, but it seems it may not be adapted to people who are not used to Python. Therefore in the sequel we'll switch to Jupyter Notebooks." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"\n", | |
"## 1.1 Spyder interface" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"You are free to use any interface you are comfortable with. If you just begin with Python, Spyder is a nice IDE to start. Spyder has three main ways of evaluating Python expressions.\n", | |
"* Use the console (lower right). You can use the console to evaluate simple expressions (**1+1**, **print(\"Toto\")**). Useful to low level debugging (check the value of a variable, the validity of an expression...). Prefer IPython Console.\n", | |
"* Evaluate file. Write some Python code in the editor (left side), hit F5 and *voilà*. Recommended for writing fully-automated standalone scripts.\n", | |
"* Evaluate cells. Write some Python code in the editor and use **#%%** to delimit some portion of codes, called *cells*. Hitting **Crl+Enter** will evaluate the current cell in the IPython console. Very, very useful to build and evaluate your code interactively in a step-by-step fashion." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 1.2 Jupyter" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Usage: in a terminal, go to your working directory and tap **jupyter notebook**. If you are at TPT, it may be something like **/cal/softs/anaconda/anaconda3/jupyter notebook**. That should launch a Jupyter session in your browser, which should display the files of your current directory.\n", | |
"\n", | |
"You can use Jupyter to edit an existing Notebook (a file with the extension **ipynb**) or create a new one by clicking the button *New* in the upper right corner.\n", | |
"\n", | |
"To learn how to use Jupyter, use the Help! Just in case, a very few tips:\n", | |
"- A notebook is made of cells, which are portions of codes / comments\n", | |
" - Use *Markdown* cells to provide formatted text (this the format of the current cell). You can write nice LaTeX formulas in Markdown Cells, e.g. $\\int_2^3 x dx =\\frac{5}{2}$.\n", | |
" - *Code* cells should contain the code you wish to evaluate. You can recognize them with the **In [X]:** on the left side.\n", | |
" - *Raw* cells are for plain text. They can be very useful, but you won't need them in this course.\n", | |
"- Shortcuts are your friends. Go to command mode (**Esc**) and hit **h** to see them.\n", | |
"- The interest of Notebooks is that you can evaluate, change part of the code, evaluate again... Try in this tutorial!" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# 2. Basic usage" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"In most languages, the keyword **end** is used to tell when a loop/condition/definition ends. In Python, there is no **end**. Instead, the ranges are defined according to indentation.\n", | |
"\n", | |
"For example, compare" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2016-10-22T19:46:15.996210", | |
"start_time": "2016-10-22T19:46:15.987200" | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"x is 0\n", | |
"x is 1\n", | |
"x is 3\n", | |
"x is 6\n", | |
"x is 10\n" | |
] | |
} | |
], | |
"source": [ | |
"x = 0\n", | |
"for i in range(5):\n", | |
" x = x + i\n", | |
" print(\"x is \"+str(x))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"and" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2016-10-22T19:46:16.019231", | |
"start_time": "2016-10-22T19:46:15.999212" | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"x is 10\n" | |
] | |
} | |
], | |
"source": [ | |
"x = 0\n", | |
"for i in range(5):\n", | |
" x = x + i\n", | |
"print(\"x is \"+str(x))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Defining functions is performed with **def**. You can assign default values, which allows highly flexible function calls. For example, look at the following" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2017-08-18T15:16:55.137993", | |
"start_time": "2017-08-18T15:16:55.131774" | |
}, | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"def my_division(x = 10,y = 3):\n", | |
" return x/y" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2016-10-22T19:46:16.058279", | |
"start_time": "2016-10-22T19:46:16.041758" | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"3.0\n" | |
] | |
} | |
], | |
"source": [ | |
"print(my_division(12,4))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2016-10-22T19:46:16.079297", | |
"start_time": "2016-10-22T19:46:16.061281" | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"3.3333333333333335\n" | |
] | |
} | |
], | |
"source": [ | |
"print(my_division())" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2016-10-22T19:46:16.133347", | |
"start_time": "2016-10-22T19:46:16.082300" | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"4.0\n" | |
] | |
} | |
], | |
"source": [ | |
"print(my_division(12))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2016-10-22T19:46:16.162387", | |
"start_time": "2016-10-22T19:46:16.138359" | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"2.0\n" | |
] | |
} | |
], | |
"source": [ | |
"print(my_division(y = 5))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2016-10-22T19:46:16.181405", | |
"start_time": "2016-10-22T19:46:16.165390" | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"5.0\n" | |
] | |
} | |
], | |
"source": [ | |
"print(my_division(y = 2, x = 10))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Be careful, arguments without a default value must (always!) precede those with a default value in order to avoir ambiguity." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# 3. Modules" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"One of the strength of Python is the vast amount of modules available.\n", | |
"The following modules are highly recommended: **numpy** (for a minimum of maths primitives); **matplotlib** (for conveniently displaying the results).\n", | |
"A convenient way to load them in Jupyter Notebooks is to use **%pylab inline**, a *magic command* that loads both modules under the names *np* and *plt* and displays the figures inside the Notebook (otherwise they may pop-up in a separate window). Once evaluated, its effect lasts for the whole session.\n", | |
"A minimal example:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2016-10-22T19:46:16.890141", | |
"start_time": "2016-10-22T19:46:16.187409" | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Populating the interactive namespace from numpy and matplotlib\n" | |
] | |
} | |
], | |
"source": [ | |
"%pylab inline" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2016-10-22T19:46:17.678569", | |
"start_time": "2016-10-22T19:46:16.893145" | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x17853d4ec18>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"x = np.arange(0, 5, .1)\n", | |
"plt.plot(x, np.sqrt(x), 'r', label = '$\\sqrt{x}$')\n", | |
"plt.plot(x, np.log(x+1), 'g', label = '$\\ln (x+1)$')\n", | |
"plt.xlabel('$x$')\n", | |
"plt.ylabel('$f(x)$')\n", | |
"plt.legend(loc = 4)\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"*Remark:* **%pylab inline** also loads **numpy** and **matplotlib** into the main namespace, so you can forget *np* and *plt* if you want (just try to remember that you actually call functions from modules)." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2016-10-22T19:46:18.137572", | |
"start_time": "2016-10-22T19:46:17.681069" | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x1785473d048>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"x = arange(0, 5, .1)\n", | |
"plot(x, sqrt(x), 'r', label = '$\\sqrt{x}$')\n", | |
"plot(x, log(x+1), 'g', label = '$\\ln (x+1)$')\n", | |
"xlabel('$x$')\n", | |
"ylabel('$f(x)$')\n", | |
"legend(loc = 4)\n", | |
"show()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# 4. A few more tips" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 4.1 Import or DIY?" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Whatever you want to implement, there is probably a module that does all the heavy lifting for you. Must you re-invent the wheel? This is actually a very tricky question. I won't forbid you to use extra modules, but there are things you should ask yourself before making a decision:\n", | |
"- Time: Is is faster (for me) to code what I want from scratch or to Google until I find the module (if I am lucky) and then learn how to use it properly.\n", | |
"- Bugs: What is the more probable? A bug in my hand-made code or using a module the wrong way (doc badly explained...).\n", | |
"- Performance: Will the module be faster than a hand-made code? (short answer: yes if the module brings a lot of pre-compiled stuff in the mix; no if the module brings tons of shinny, totally irrelevant, costly, features to your objects).\n", | |
"- Evolution: If I foresee a possible evolution in my code, is the evolved version available in the module? Will it be hard to make my code evolve?\n", | |
"- Importance: Are we talking of the main algorithm that will be used to grade you or of some insignificant sub-sub-subfunction totally unrelated to the course?\n", | |
"\n", | |
"**Additionally, most of the modules you actually need are given in the Notebooks of the practicals, along with explanations.**" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 4.2 Avoid loops if you can" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Python is interpreted, not compiled. As a consequence, **for** loops can rapidly become your main bottleneck. Always try to rely on **numpy** arrays if it can avoid loops." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2016-10-22T19:46:20.532121", | |
"start_time": "2016-10-22T19:46:18.140576" | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"FOR loops: 2.365546941757202 s\n", | |
"Numpy: 0.014469385147094727 s\n" | |
] | |
} | |
], | |
"source": [ | |
"import time\n", | |
"n = 1000000\n", | |
"t = time.time()\n", | |
"x = zeros(n)\n", | |
"for i in range(n):\n", | |
" x[i] = sqrt(i)\n", | |
"print(\"FOR loops: \"+str(time.time()-t)+\" s\")\n", | |
"t = time.time()\n", | |
"y = sqrt(arange(n))\n", | |
"print(\"Numpy: \"+str(time.time()-t)+\" s\")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 4.3 Reference passing" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Reference passing can be tricky." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2016-10-22T19:46:20.541612", | |
"start_time": "2016-10-22T19:46:20.535106" | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"True\n" | |
] | |
} | |
], | |
"source": [ | |
"A = [1, 2, 3, 4]\n", | |
"B = A\n", | |
"A[0] = 0\n", | |
"print(A==B)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2016-10-22T19:46:20.568636", | |
"start_time": "2016-10-22T19:46:20.545615" | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"False\n" | |
] | |
} | |
], | |
"source": [ | |
"A = [1, 2, 3, 4]\n", | |
"B = A.copy()\n", | |
"A[0] = 0\n", | |
"print(A==B)" | |
] | |
} | |
], | |
"metadata": { | |
"anaconda-cloud": {}, | |
"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.6.1" | |
}, | |
"latex_envs": { | |
"LaTeX_envs_menu_present": true, | |
"bibliofile": "biblio.bib", | |
"cite_by": "apalike", | |
"current_citInitial": 1, | |
"eqLabelWithNumbers": true, | |
"eqNumInitial": 1, | |
"hotkeys": { | |
"equation": "Ctrl-E", | |
"itemize": "Ctrl-I" | |
}, | |
"labels_anchors": false, | |
"latex_user_defs": false, | |
"report_style_numbering": false, | |
"user_envs_cfg": false | |
}, | |
"nav_menu": { | |
"height": "264px", | |
"width": "424px" | |
}, | |
"toc": { | |
"nav_menu": { | |
"height": "234px", | |
"width": "252px" | |
}, | |
"number_sections": false, | |
"sideBar": true, | |
"skip_h1_title": false, | |
"toc_cell": true, | |
"toc_position": {}, | |
"toc_section_display": "block", | |
"toc_window_display": false | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 1 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment