{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Making Modules ##" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Module functions \n", "\n", "Start by writing a few functions that we can use to create a module." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "#\n", "def circleParams(r):\n", " '''\n", " Given the radius of a circle, this function returns its area and circumference.\n", " '''\n", " A = np.pi*r**2\n", " c = 2*np.pi*r\n", " return A, c\n", "#\n", "def rectangleParams(h, w):\n", " '''\n", " Given the height and width of a rectangle, this function returns its area and perimeter.\n", " '''\n", " A = h*w\n", " p = 2*(h + w)\n", " return A, p\n", "#\n", "def sphereParams(r):\n", " '''\n", " Given the radius of a sphere, this function returns its volume and its surface area.\n", " '''\n", " V = 4/3*np.pi*r**3\n", " A = 4*np.pi*r**2\n", " return V, A\n", "#\n", "def rectPrismParams(h, w, d):\n", " '''\n", " Given the height, width and depth of a rectangular prism, this function returns its volume, \n", " surface area and total side length.\n", " '''\n", " V = h*w*d\n", " A = 2*(h*w + w*d + h*d)\n", " s = 4*(h + w + d)\n", " return V, A, s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use these functions in the Notebook in which they are defined. For example, here is a plot of the volume, $V$, and area, $A$, of a sphere as a function of its radius, $r$." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "#\n", "nArr = 50\n", "rBot = 0.0\n", "rTop = 4.0\n", "rArr = np.linspace(rBot, rTop, nArr)\n", "Varr, Aarr = sphereParams(rArr)\n", "#\n", "plt.figure(figsize = (7, 5))\n", "plt.title(\"Volume and area of sphere\")\n", "plt.ylabel(\"Volume (m$^3$) or area (m$^2$)\")\n", "plt.xlabel(\"Radius (m)\")\n", "plt.plot(rArr, Varr, linestyle = '-', color = 'r')\n", "plt.plot(rArr, Aarr, linestyle = '-', color = 'b')\n", "plt.grid(color = 'green')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Creating and using a module\n", "\n", "In order to create a module containing routines from this Notebook, click on the *File* menu, then on *Download as* and select *Python*. (If using running Jupyter Lab rather than Jupyter Notebook, use *File*, *Export Notebook As...* and then *Export Notebook to Executable Script*.) Depending on the browser security settings, may get a warning about the file that is created, saying that it can damage your computer. Ignore this and click *Keep* or *Save*. In default download location (usually *Downloads* folder) will then have file called *Making-Modules.py*. \n", "\n", "Move *Making-Modules.py* into working directory and rename it. Call it *MakingModules.py*. Open *MakingModules.py* by clicking on it in Jupyter. See it is just a copy of this Notebook written as Python code, i.e. all the Markdown cells have been turned into Python comments by sticking a \"#\" in front of them. Tidy up the file by deleting the superfluous comment lines - leave the ones that are useful! - and other material that isn't part of the functions. Do not delete the line that reads `import numpy as np`!\n", "\n", "Can now use all the functions in *MakingModules.py* by importing it as a module, as shown in the following example. (The reason it had to be renamed that hyphens are not allowed in module names in Python, so wouldn't be able to import the file if it was called *Making-Modules.py*.) Note, file name should have extension *.py*, but don't include this in the `import` statement. \n", "\n", "Notice that, after doing `import MakingModules as mm`, we have called the routine `mm.circleParams` (with an `mm.` in front of the name to indicate it comes from the *MakingModules* module, cf. using `np.cos` to use the cosine function from the numpy library). The version of *circleParams* below is therefore that from the *MakingModules* module, not the one defined in this Notebook! " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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KS52993KXejulT6A54EbCPOvbUFIci9UtV20bV1gGHBJynvjgRbR8xbA+Kr20759e8+E9g9nZj/Zonjjl28x51W8o0a5N2nisxrVcf/446SjSVtV53jhQvf+/d07dXKvW9cd3LfZxv36693HjctSkCny6t9EJBMxA6O9gpyRzj22Ld39uJTXN5jZ51VtZGYGPAqMdfe7Uha9DPQAbov+HJxGDCKST/r3D33Xt9qK00/ZhJd33z3piKpl2bIwr1lRUbhNuHQpbLop9OwZbh3uumtB3zLMO+kktqVm9hd3fw/AzPYFlqax3b7AqcCXKRLm8qwAABxfSURBVInwKkJCe8bMzgCmAl1XP2wRyUnucMstcO210LEjvPAC0589JOmo1sjKlWEwlAEDQq3ZvHmh1uy008IoIH/5i2rNclU6ie1c4MnoXhvAXEJLq1JRIqzoN8xB6YUnInlj+fJQdP3442E+tb59oV69pKNaLe6waNKO9OwZOoLMmBFqzbp0Ka01K/AKhYKQTq/IMcAuZrZu9HpB7FGJSH6ZMwe6doWRI8PAhr1759W1uZJas4EDYfLkJ5hSH448snReM9Wa5Ze069yV0ESkXN9+GyqOp0yBfv3gb39LOqK0TJwYEllREXz9dag1O/hg8P178/k9N7DeelXvQ3KTrhCLyJobMQL23DNMOTNyZM4ntenT4Z57QshbbQXXXANNmoTyuunTQweR9fd+RUktz2lkMhFZMw8/DH//O2y3XRiWvnXrpCMq15w5pfOajRoV7qO1bQu33x46gWy2WdIRSqalldjMbEdgB6BByXvu/mRcQYlIDluxAnr1gnvvDTegiopyboyoxYtDt/yiotAKW74cttkGrrsuJLPttks6QolTlYnNzHoTxnbcAXgVOBx4jzByv4jUJPPnh8zw+utw0UVwxx3h5lQOWLYsTOtWUmu2ZIlqzWqqdFpsxwO7AJ+5++lm1hzoG29YIpJzJkyAo4+G774LlyHPPjvpiH6vNSsqCpcb582D9dcPt/q6d1etWU2VVoG2u68ysxVRl/+ZhKG1RKSmGDYstNRq1YI33oADqj02+hpzh48+CsmspNZsnXVKa80OPli1ZjVdOolttJk1Bh4BioFFwMexRiUiucE9XG684grYcUd46aXEOon8sdYszGt2xBEhmXXqpFozKZVOgXbJHBMPmdnrwLru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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import MakingModules as mm\n", "#\n", "nArr = 50\n", "rBot = 0.0\n", "rTop = 4.0\n", "rArr = np.linspace(rBot, rTop, nArr)\n", "Aarr, cArr = mm.circleParams(rArr)\n", "#\n", "plt.figure(figsize = (7, 5))\n", "plt.title(\"Area and circumference of circle\")\n", "plt.ylabel(\"Area or circumference\")\n", "plt.xlabel(\"Radius\")\n", "plt.plot(rArr, Aarr, linestyle = '-', color = 'r')\n", "plt.plot(rArr, cArr, linestyle = '-', color = 'b')\n", "plt.grid(color = 'green')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Include the statement `import numpy as np` at the top of *MakingModules.py*. This statement is executed when the module is first loaded, so even if the functions in *MakingModules.py* are used from a program which doesn't import numpy, they will work OK." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Accessing modules in other folders\n", "\n", "The above only allows us to use functions from a module in the directory in which we are working. Modules in other directories acan also be accessed. In order to try this, make a copy of *MakingModules.py* and call it *MakingModulesNew.py*. Make a new folder *MakingModulesLib* in your working directory. Move the file *MakingModulesNew* into the folder *MakingModulesLib*. Now try to run the cell below." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "ename": "ModuleNotFoundError", "evalue": "No module named 'MakingModulesNew'", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mmatplotlib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpyplot\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mMakingModulesNew\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mmmnew\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[1;31m#\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mnArr\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m50\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'MakingModulesNew'" ] } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import MakingModulesNew as mmnew\n", "#\n", "nArr = 50\n", "rBot = 0.0\n", "rTop = 4.0\n", "rArr = np.linspace(rBot, rTop, nArr)\n", "Aarr, cArr = mmnew.circleParams(rArr)\n", "#\n", "plt.figure(figsize = (7, 5))\n", "plt.title(\"Area and circumference of circle\")\n", "plt.ylabel(\"Area or circumference\")\n", "plt.xlabel(\"Radius\")\n", "plt.plot(rArr, Aarr, linestyle = '-', color = 'r')\n", "plt.plot(rArr, cArr, linestyle = '-', color = 'b')\n", "plt.grid(color = 'green')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Python can't find the *MakingModulesNew* module, because it only looks for it in the current working directory and in directories specified by a system variable called `path`. We can see which directories are in `path` using the `sys.path` command, after we have imported the `sys` module, as follows." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Directories in path are:\n", " ['C:\\\\Users\\\\green\\\\OneDrive\\\\OneDocuments\\\\Liverpool\\\\Teaching\\\\Phys105-Comp01-2019\\\\Phys105-Lectures2019', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\python37.zip', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\DLLs', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\lib', 'C:\\\\Users\\\\green\\\\Anaconda3', '', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\lib\\\\site-packages', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\lib\\\\site-packages\\\\win32', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\lib\\\\site-packages\\\\win32\\\\lib', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\lib\\\\site-packages\\\\Pythonwin', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\lib\\\\site-packages\\\\IPython\\\\extensions', 'C:\\\\Users\\\\green\\\\.ipython']\n" ] } ], "source": [ "import sys\n", "#\n", "print(\"Directories in path are:\\n\",sys.path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `path` variable is set up when Anaconda is installed. Exactly what you see will depend on your computer's operating system and where Anaconda was installed. The `path` entries will always have the structure *top_level/second_level/third_level*, and this is what you will see on a Macintosh or a Linux system. On a Windows computer, the forward slashes (/) will be replaced by back-slashes (\\\\). These have to be represented by a double back-slash, as the first backslash is treated as an escape character (in both Python and Markdown). \n", "\n", "If we want to temporarily add a new directory to `path`, we can do it using `path.append` from the `sys` module as follows." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Directories in path are:\n", " ['C:\\\\Users\\\\green\\\\OneDrive\\\\OneDocuments\\\\Liverpool\\\\Teaching\\\\Phys105-Comp01-2019\\\\Phys105-Lectures2019', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\python37.zip', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\DLLs', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\lib', 'C:\\\\Users\\\\green\\\\Anaconda3', '', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\lib\\\\site-packages', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\lib\\\\site-packages\\\\win32', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\lib\\\\site-packages\\\\win32\\\\lib', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\lib\\\\site-packages\\\\Pythonwin', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\lib\\\\site-packages\\\\IPython\\\\extensions', 'C:\\\\Users\\\\green\\\\.ipython', 'MakingModulesLib']\n" ] } ], "source": [ "sys.path.append('MakingModulesLib')\n", "print(\"Directories in path are:\\n\",sys.path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You will see that *MakingModulesLib* has now been added to *path*. Now `import MakingModulesLib as mmlib` will work. " ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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KS52993KXejulT6A54EbCPOvbUFIci9UtV20bV1gGHBJynvjgRbR8xbA+Kr20759e8+E9g9nZj/Zonjjl28x51W8o0a5N2nisxrVcf/446SjSVtV53jhQvf+/d07dXKvW9cd3LfZxv36693HjctSkCny6t9EJBMxA6O9gpyRzj22Ld39uJTXN5jZ51VtZGYGPAqMdfe7Uha9DPQAbov+HJxGDCKST/r3D33Xt9qK00/ZhJd33z3piKpl2bIwr1lRUbhNuHQpbLop9OwZbh3uumtB3zLMO+kktqVm9hd3fw/AzPYFlqax3b7AqcCXKRLm8qwAABxfSURBVInwKkJCe8bMzgCmAl1XP2wRyUnucMstcO210LEjvPAC0589JOmo1sjKlWEwlAEDQq3ZvHmh1uy008IoIH/5i2rNclU6ie1c4MnoXhvAXEJLq1JRIqzoN8xB6YUnInlj+fJQdP3442E+tb59oV69pKNaLe6waNKO9OwZOoLMmBFqzbp0Ka01K/AKhYKQTq/IMcAuZrZu9HpB7FGJSH6ZMwe6doWRI8PAhr1759W1uZJas4EDYfLkJ5hSH448snReM9Wa5Ze069yV0ESkXN9+GyqOp0yBfv3gb39LOqK0TJwYEllREXz9dag1O/hg8P178/k9N7DeelXvQ3KTrhCLyJobMQL23DNMOTNyZM4ntenT4Z57QshbbQXXXANNmoTyuunTQweR9fd+RUktz2lkMhFZMw8/DH//O2y3XRiWvnXrpCMq15w5pfOajRoV7qO1bQu33x46gWy2WdIRSqalldjMbEdgB6BByXvu/mRcQYlIDluxAnr1gnvvDTegiopyboyoxYtDt/yiotAKW74cttkGrrsuJLPttks6QolTlYnNzHoTxnbcAXgVOBx4jzByv4jUJPPnh8zw+utw0UVwxx3h5lQOWLYsTOtWUmu2ZIlqzWqqdFpsxwO7AJ+5++lm1hzoG29YIpJzJkyAo4+G774LlyHPPjvpiH6vNSsqCpcb582D9dcPt/q6d1etWU2VVoG2u68ysxVRl/+ZhKG1RKSmGDYstNRq1YI33oADqj02+hpzh48+CsmspNZsnXVKa80OPli1ZjVdOolttJk1Bh4BioFFwMexRiUiucE9XG684grYcUd46aXEOon8sdYszGt2xBEhmXXqpFozKZVOgXbJHBMPmdnrwLru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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import MakingModulesNew as mmnew\n", "#\n", "nArr = 50\n", "rBot = 0.0\n", "rTop = 4.0\n", "rArr = np.linspace(rBot, rTop, nArr)\n", "Aarr, cArr = mmnew.circleParams(rArr)\n", "#\n", "plt.figure(figsize = (7, 5))\n", "plt.title(\"Area and circumference of circle\")\n", "plt.ylabel(\"Area or circumference\")\n", "plt.xlabel(\"Radius\")\n", "plt.plot(rArr, Aarr, linestyle = '-', color = 'r')\n", "plt.plot(rArr, cArr, linestyle = '-', color = 'b')\n", "plt.grid(color = 'green')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The addition to `path` we have made above will allow us to use anything in the module *MakingModulesLib* if it is in our current working directory. If we want to be able to use routines from *MakingModulesLib* from *any* directory, we have to add the full description of its location to `path`. On my computer, this implies..." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Directories in path are:\n", " ['C:\\\\Users\\\\green\\\\OneDrive\\\\OneDocuments\\\\Liverpool\\\\Teaching\\\\Phys105-Comp01-2019\\\\Phys105-Lectures2019', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\python37.zip', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\DLLs', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\lib', 'C:\\\\Users\\\\green\\\\Anaconda3', '', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\lib\\\\site-packages', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\lib\\\\site-packages\\\\win32', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\lib\\\\site-packages\\\\win32\\\\lib', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\lib\\\\site-packages\\\\Pythonwin', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\lib\\\\site-packages\\\\IPython\\\\extensions', 'C:\\\\Users\\\\green\\\\.ipython', 'MakingModulesLib', 'C:/Users/green/OneDrive/OneDocuments/Liverpool/Teaching/Phys105-Comp01-2019/Phys105-Lectures2019/MakingModulesLib']\n" ] } ], "source": [ "import sys\n", "#\n", "sys.path.append('C:/Users/green/OneDrive/OneDocuments/Liverpool/Teaching/Phys105-Comp01-2019/Phys105-Lectures2019/MakingModulesLib')\n", "print(\"Directories in path are:\\n\",sys.path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "...which is a bit of a mouthful. (You can work out what the full description of the location of *MakingModulesLib* should be on your computer by looking at the existing entries in your `path` variable.) Notice that I can use forward slashes in the `sys.path.append` command; Python changes these to the format that is relevant for my operating system. (Because I am working on a Windows machine, I could have used the double back-slash notation, it's just a bit clumsier.) \n", "\n", "There are (system dependent) ways of permanently adding folders like `mylib` to `path`, but getting this wrong can cause problems, so we will use the above method. The downside is that before using any of the routines in the library `mylib`, we have to include the statement:\n", "\n", "```Python\n", "import sys\n", "sys.path.append('path to mylib')\n", "```\n", "\n", "The upside is that when we shut down our Jupyter Notebook, or restart the kernel, `path` returns to its original value and we don't influence how anything else on the computer works." ] } ], "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.5" } }, "nbformat": 4, "nbformat_minor": 4 }