{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Lecture 11" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "-Introduction: [>>](#Introduction) \n", "-Module functions: [>>](#Module-functions) \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", "-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", "-Keyboard input to Python: [>>](#Keyboard-input-to-Python) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Some organisational matters\n", "\n", "Welcome back. I hope your exams went well!\n", "\n", "This semester, Phys105 will run for the first five weeks. We will introduce some new material in the first two weeks, then use the remainig three weeks to complete any outstanding Notebooks.\n", "\n", "The Computer Classes are timetabled as follows:\n", "\n", "| Day | Time |\n", "|----------|-------------|\n", "|Tuesday |09:00...11:00| \n", "|Tuesday |11:00...13:00|\n", "|Wednesday |09:00...11:00| \n", "\n", "To get into your class, go to the [Phys105 Canvas page](https://liverpool.instructure.com/courses/19175) and click on the relevant link (as we did last semester). Don't use the link in your timetable!\n", "\n", "If anyone who has got previous computing experience wants to do a project in the last five weeks of Phys105, rather than the Notebooks in the computer classes, please mail me after this lecture! (A possible project would be the simulation of the behaviour of the lift in the Oliver Lodge building and the optimisation of its rest position - but I am open to suggestions.)\n", "\n", "## Introduction\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 try this using CoCalc, but also describe how it can be done on a PC. (To avoid confusion, the parts of this Notebook that don't refer to using CoCalc will be in blue text.) 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": [ "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": [ "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": [ "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", "\n", "We'll first look at how to create a module when we are working in CoCalc.\n", "\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 the Notebook (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` below, 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": 3, "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", "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": [ "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." ] }, { "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": 5, "metadata": {}, "outputs": [ { "ename": "ModuleNotFoundError", "evalue": "No module named 'Phys105W09new'", "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 3\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 4\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----> 5\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mPhys105W09new\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mphnew\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 6\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 7\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 'Phys105W09new'" ] } ], "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": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Directories in path are:\n", " ['C:\\\\Users\\\\green\\\\OneDrive\\\\OneDocuments\\\\Liverpool\\\\Teaching\\\\Phys105-Comp01-2020\\\\Phys105-Lectures2020\\\\Phys105-Lect11', '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']\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": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Directories in path are:\n", " ['C:\\\\Users\\\\green\\\\OneDrive\\\\OneDocuments\\\\Liverpool\\\\Teaching\\\\Phys105-Comp01-2020\\\\Phys105-Lectures2020\\\\Phys105-Lect11', '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']\n" ] } ], "source": [ "# \n", "#\n", "sys.path.append('Phys105lib')\n", "print(\"Directories in path are:\\n\",sys.path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You will see that *Phys105lib* has now been added to *path*. Now `import Phys105W09new as phnew` will work. " ] }, { "cell_type": "code", "execution_count": 8, "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", "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-2020/Phys105-Lectures2020/Phys105-Lect11/Phys105lib')\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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.)\n", "\n", "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. (I could also have used the double back-slash notation on my Windows machine, 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": 11, "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": 12, "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": 14, "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": [ "Can you see what is going wrong here? How could it be fixed? This is one of the exercises you will do in this week's Computer Classes!" ] } ], "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 }