{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "# Introduction to Computational Physics - Week 9 ##" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## Table of contents week 9\n", " \n", "Introduction to Computational Physics - Week 9: [>>](#Introduction-to-Computational-Physics---Week-9) \n", "-Table of contents week 9: [>>](#Table-of-contents-week-9) \n", "-Introduction to week 9: [>>](#Introduction-to-week-9) \n", "-Module functions: [>>](#Module-functions) \n", "--Week 9 exercise 1: [>>](#Week-9-exercise-1) \n", "-Creating a module: [>>](#Creating-a-module) \n", "--Working in CoCalc: [>>](#Working-in-CoCalc) \n", "--Working on your own computer: [>>](#Working-on-your-own-computer) \n", "-Using the module: [>>](#Using-the-module) \n", "--Week 9 exercise 2: [>>](#Week-9-exercise-2) \n", "-Accessing modules in other folders: [>>](#Accessing-modules-in-other-folders) \n", "--Working in CoCalc: [>>](#Working-in-CoCalc) \n", "--Working on your own computer: [>>](#Working-on-your-own-computer) \n", "--Week 10 exercise 3: [>>](#Week-10-exercise-3) \n", "-Keyboard input to Python: [>>](#Keyboard-input-to-Python) \n", "--Week 9 exercise 4: [>>](#Week-9-exercise-4) \n", "--Week 9 exercise 5: [>>](#Week-9-exercise-5) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## Introduction to week 9\n", "\n", "This week, we will first see how we can turn the functions we have written in a Jupyter Notebook into a module that can be loaded and used in the same way as the Numpy, Matplotlib or other libraries. We will then look at how we can provide input to Python programs from the keyboard. \n", "\n", "## Module functions \n", "\n", "Let's start by writing a few functions that we can use to create a module." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# \n", "#\n", "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": [ "\n", "As we have seen many times, 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": [ "# \n", "#\n", "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": [ "\n", "### Week 9 exercise 1\n", "\n", "Make a plot showing the volume, surface area and side length of a rectangular prism of width $w$ and depth $d$ as a function of its height, $h$. Use $w = 1.5 \\,{\\rm m}$, $d = 2.5 \\,{\\rm m}$ and $h$ in the range $0 < h < 4.0 \\,{\\rm m}$. Include a legend showing what each of the lines on the plot represents! " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "What we now want to do is to see how we can use these functions in a different Jupyter Notebook, without copying their definitions into that Notebook.\n", "\n", "## Creating a module\n", "### Working in CoCalc\n", "\n", "In order to create a module containing routines from this Notebook, go through the following steps:\n", "\n", "1. Click on the *File* menu (in the Notebook, not the CoCalc Files menu!), then, in *Download as...* select *Executable script (.txt)*.\n", "2. Wait until the process is complete.\n", "3. Close the *Download* box.\n", "4. Close the Phys105-Week09-Student.ipynb Notebook.\n", "5. You will now have a file called Phys105-Week09-Student.py in the Phys105-Week09 directory. Rename this file by selecting it (tick the box next to it) and choosing the *rename* option. Call it *Phys105W09.py*.\n", "6. Open *Phys105W09.py* (by clicking on it in CoCalc). You will see that 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.\n", "7. Tidy up the file by deleting everything except the code for the functions *circleParams*, *rectangleParams*, *sphereParams* and *rectPrismParams*. Do not delete the line that reads `import numpy as np`!\n", "8. Close *Phys105W09.py*.\n", "9. Open *Phys105-Week09-Student.ipynb* again.\n", "\n", "### Working on your own computer\n", "\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 you are running Jupyter Lab rather than Jupyter Notebook, you need to use *File*, *Export Notebook As...* and then *Export Notebook to Executable Script*.) Depending on the security settings on your browser, you may get a warning about the file that is created, saying that it can damage your computer. You can ignore this and click *Keep* or *Save*. In your default download location (usually your *Downloads* folder) you will then have a file called *Phys105-Week09-Student.py*. \n", "\n", "Move *Phys105-Week09-Student.py* into your working directory (the directory or folder which contains this Notebook) and rename it. Call it *Phys105W09.py*. Open *Phys105W09.py* by clicking on it in your Jupyter Notebook browser. You will see that 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 *circleParams*, *rectangleParams*, *sphereParams* and *rectPrismParams*. Do not delete the line that reads `import numpy as np`!\n", "\n", "\n", "## Using the module\n", "\n", "You can now use all the functions in *Phys105W09.py* by importing it as a module, as shown in the following example. (The reason you had to rename the file is that hyphens are not allowed in module names in Python, so you wouldn't be able to import the file if it was called *Phys105-Week09-Student.py*.) Note, your file name should have the extension *.py*, but you don't include this in the `import` statement. \n", "\n", "Notice that, after doing `import Phys105W09 as ph`, we have called the routine `ph.circleParams` (with a `ph.` in front of the name to indicate it comes from the Phys105W09 module, cf. using `np.cos` to use the cosine function from the numpy library). The version of *circleParams* below is therefore that from the *Phys105W09* module, not the one defined in this Notebook! " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# \n", "#\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import Phys105W09 as ph\n", "#\n", "nArr = 50\n", "rBot = 0.0\n", "rTop = 4.0\n", "rArr = np.linspace(rBot, rTop, nArr)\n", "Aarr, cArr = ph.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": [ "\n", "We have been careful to include the statement `import numpy as np` at the top of *Phys105W09.py*. This statement is executed when the module is first loaded, so even if we use the functions in *Phys105W09.py* from a program which doesn't import numpy, they will work OK.\n", "\n", "\n", "### Week 9 exercise 2\n", "\n", "Copy the code you used to solve exercise 1 into the cell below this one. Alter the code so that it produces a figure with two supbplots. On the left, use the version of *rectPrismParams* in this Notebook, on the right, the version from the module *Phys105W09*. Are the two graphs the same?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## Accessing modules in other folders\n", "\n", "What we have done so far only allows us to use functions from a module in the directory in which we are working. We can also get at modules in other directories.\n", "\n", "### Working in CoCalc\n", "In order to do this, follow the procedure below:\n", "\n", "1. Close this Notebook.\n", "2. Use the menu to duplicate Phys105W09.py and call the new file Phys105W09new.py.\n", "3. Make a new folder (using the CoCalc `+New` menu) called Phys105lib. This will appear in your Phys105-Week09 folder.\n", "4. Using the CoCalc menu, move Phys105W09new.py into Phys105lib.\n", "\n", "Now you can restart the Phys105-Week09-Student.ipynb Notebook and run the code cell below.\n", "\n", "### Working on your own computer\n", "\n", "In order to try this, make a copy of Phys105W09.py and call it Phys105W09new.py. Make a new folder Phys105lib in your working directory. (You can do this using File Explorer on Windows, Finder on a Mac or the command mkdir on a Linux system.) Move the file Phys105W09new into the folder Phys105lib. Now try to run the cell below.\n", "" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# \n", "#\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import Phys105W09new as phnew\n", "#\n", "nArr = 50\n", "rBot = 0.0\n", "rTop = 4.0\n", "rArr = np.linspace(rBot, rTop, nArr)\n", "Aarr, cArr = phnew.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": [ "\n", "Python can't find the *Phys105W19new* 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": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Directories in path are:\n", " ['C:\\\\Users\\\\green\\\\OneDrive\\\\OneDocuments\\\\Liverpool\\\\Teaching\\\\Phys105-Comp01-2020\\\\Phys105-Classes2020\\\\Phys105-Week09', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\python38.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\\\\locket-0.2.1-py3.8.egg', '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', 'Phys105lib', 'C:/Users/green/OneDrive/OneDocuments/Liverpool/Teaching/Phys105-Comp01-2019/Phys105-Week09/Phys105lib', 'C:/Users/green/OneDrive/OneDocuments/Liverpool/Teaching/Phys105-Comp01-2019/Phys105-Week09/Phys105lib']\n" ] } ], "source": [ "# \n", "#\n", "import sys\n", "#\n", "print(\"Directories in path are:\\n\",sys.path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "The `path` variable is set up when Anaconda is installed on your computer, or when you create your CoCalc ID. On your computer, exactly what you see will depend on your computer's operating system and where Anaconda was installed. On CoCalc, everyone should see the same `path`. 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). CoCalc runs on Linux, you will see forward slashes when using it.\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": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Directories in path are:\n", " ['C:\\\\Users\\\\green\\\\OneDrive\\\\OneDocuments\\\\Liverpool\\\\Teaching\\\\Phys105-Comp01-2020\\\\Phys105-Classes2020\\\\Phys105-Week09', 'C:\\\\Users\\\\green\\\\Anaconda3\\\\python38.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\\\\locket-0.2.1-py3.8.egg', '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', 'Phys105lib', 'C:/Users/green/OneDrive/OneDocuments/Liverpool/Teaching/Phys105-Comp01-2019/Phys105-Week09/Phys105lib', 'C:/Users/green/OneDrive/OneDocuments/Liverpool/Teaching/Phys105-Comp01-2019/Phys105-Week09/Phys105lib', 'Phys105lib']\n" ] } ], "source": [ "# \n", "#\n", "sys.path.append('Phys105lib')\n", "print(\"Directories in path are:\\n\",sys.path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "You will see that *Phys105lib* has now been added to *path*. Now `import Phys105W09new as phnew` will work. \n", "\n", "### Week 10 exercise 3\n", "\n", "Copy the cell which uses the routine `phnew.circleParams` above and insert it below. Run it to prove that your modified *path* variable is doing what it should!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "The addition to `path` we have made above will allow us to use anything in the module *Phys105lib* if it is in our current working directory. If we want to be able to use routines from *Phys105lib* from *any* directory, we have to add the full description of its location to `path`. On CoCalc, this implies...\n", "\n", "```python\n", "import sys\n", "#\n", "sys.path.append('/home/user/Phys105 Introduction to Computational Physics/ComputerClasses/Phys105-Week09/Phys105lib')\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "On my computer, what is needed is...\n", "\n", "```python\n", "import sys\n", "#\n", "sys.path.append('C:/Users/green/OneDrive/OneDocuments/Liverpool/Teaching/Phys105-Comp01-2019/Phys105-Week09/Phys105lib')\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " \n", "In both cases, this is a bit of a mouthful. (You can work out what the full description of the location of *Phys105lib* should be on your computer by looking at the existing entries in your `path` variable.) Notice that you can use forward slashes in the `sys.path.append` command even on a Windows system; Python changes these to the format that is relevant for your 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.\n", "\n", "## Keyboard input to Python\n", "\n", "Python programs can read input from the keyboard. They do this with the function `input()`, as is shown in the following example." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdin", "output_type": "stream", "text": [ "What's your name? Tim\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Nice to meet you Tim!\n" ] }, { "name": "stdin", "output_type": "stream", "text": [ "How old are you? 123\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "So, you are already 123 years old Tim!\n" ] } ], "source": [ "# \n", "# \n", "name = input(\"What's your name?\")\n", "print(\"Nice to meet you \" + name + \"!\")\n", "age = input(\"How old are you?\")\n", "print(\"So, you are already\",age,\"years old\",name,\"\\b!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "We can check the type of the input as below:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Type of name is \n", "Type of age is \n" ] } ], "source": [ "# \n", "#\n", "print(\"Type of name is\",type(name))\n", "print(\"Type of age is\",type(age))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "Everything (whether numbers or letters) is read as strings. This means the following code will not work (try it!):" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdin", "output_type": "stream", "text": [ "What's your name? Tim\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Nice to meet you Tim!\n" ] }, { "name": "stdin", "output_type": "stream", "text": [ "How old are you? 123\n" ] }, { "ename": "TypeError", "evalue": "unsupported operand type(s) for -: 'int' and 'str'", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTypeError\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 7\u001b[0m \u001b[0mage\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0minput\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"How old are you?\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 8\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[1;32m----> 9\u001b[1;33m \u001b[0mretireIn\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mretirementAge\u001b[0m \u001b[1;33m-\u001b[0m \u001b[0mage\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 10\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mretireIn\u001b[0m \u001b[1;33m>\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 11\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"I guess you will retire in\"\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mretireIn\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m\"years,\"\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;34m\"\\b.\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mTypeError\u001b[0m: unsupported operand type(s) for -: 'int' and 'str'" ] } ], "source": [ "# \n", "#\n", "retirementAge = 67\n", "#\n", "name = input(\"What's your name?\")\n", "print(\"Nice to meet you \" + name + \"!\")\n", "age = input(\"How old are you?\")\n", "#\n", "retireIn = retirementAge - age\n", "if retireIn > 0:\n", " print(\"I guess you will retire in\",retireIn,\"years,\",name,\"\\b.\")\n", "else:\n", " print(\"I guess you retired\",-retireIn,\"years ago,\",name,\"\\b.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "### Week 9 exercise 4\n", "\n", "Copy the above cell and insert it below this one. Modify the code so that it runs wthout errors!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "### Week 9 exercise 5\n", "\n", "Copy your answer to exercise 4 into the cell below this one and modify it so it checks that the age entered is in the range 0 < age < 120 years. If the age is out of range, ask that it be re-entered. If an out-of-range answer is given more than 3 times in a row, print an error message and stop the program!\n", "\n", "**Hint 1** You could do this using the `while`, `break` and `else` control structure, or using a `for` loop. Remember also the `sys.exit()` command we have mentioned in previous weeks! \n", "\n", "**Hint 2** Remember that Python reads the input as a string. Does the statement `if age > 0` when `age` is a string make sense? " ] } ], "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.8.5" } }, "nbformat": 4, "nbformat_minor": 4 }