From 2b6e7ebf3022f97e1c13bbf6d94f5cfbbdab5ae4 Mon Sep 17 00:00:00 2001 From: Louis Oliphant <ltoliphant@wisc.edu> Date: Tue, 11 Feb 2025 15:19:14 -0600 Subject: [PATCH] added lec 10 iterations 1 --- .../10_Iteration1/Lec_10_Iteration1.ipynb | 461 +++++++++ .../Lec_10_Iteration1_Solution.ipynb | 939 ++++++++++++++++++ 2 files changed, 1400 insertions(+) create mode 100644 s25/Louis_Lecture_Notes/10_Iteration1/Lec_10_Iteration1.ipynb create mode 100644 s25/Louis_Lecture_Notes/10_Iteration1/Lec_10_Iteration1_Solution.ipynb diff --git a/s25/Louis_Lecture_Notes/10_Iteration1/Lec_10_Iteration1.ipynb b/s25/Louis_Lecture_Notes/10_Iteration1/Lec_10_Iteration1.ipynb new file mode 100644 index 0000000..c85f107 --- /dev/null +++ b/s25/Louis_Lecture_Notes/10_Iteration1/Lec_10_Iteration1.ipynb @@ -0,0 +1,461 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Warmup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Warmup 1: Call can_serve different 3 times: use a positional argument, keyword argument, and default argument.\n", + "def can_serve(age=21):\n", + " if(age >= 18):\n", + " if (age <= 25):\n", + " return True\n", + " else:\n", + " return False\n", + " else:\n", + " return False\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Warmup 2: Refactor the can_serve function.\n", + "# e.g.: Write it another way, keeping the same behavior\n", + "# Use the same print statements your wrote above to test it.\n", + "def refactor_can_serve(age=21):\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Warmup 3\n", + "# Consider the following code\n", + "\n", + "def refactor(x,y):\n", + " if x:\n", + " return True\n", + " elif y:\n", + " return True\n", + " else:\n", + " return False\n", + " \n", + "print(refactor(True, False))\n", + "print(refactor(False, True))\n", + "print(refactor(True, True))\n", + "print(refactor(False, False))\n", + "\n", + "# what is the best way to refactor the body of the function ?\n", + "# A. return x and y\n", + "# B. return x or y\n", + "# C. return x != y\n", + "# D. return x == y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Reminder\n", + "\n", + "- Conditionals can contain entire blocks of code, including **nested conditionals**\n", + "- It is common after getting code to work as intended to **refactor** the code to have the same behavior but to be more readable or execute faster." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Iteration\n", + "\n", + "## Readings\n", + "\n", + "* [Downey Ch 7](https://greenteapress.com/thinkpython2/html/thinkpython2008.html)\n", + "* [Python for Everybody, 6.1 - 6.3](https://runestone.academy/ns/books/published/py4e-int/iterations/toctree.html)\n", + "\n", + "## Learning Objectives\n", + "\n", + "After this lecture you will be able to...\n", + "\n", + "* Implement an iterative algorithm using a while loop\n", + " - example: printing / counting\n", + " - example: validating user input\n", + " - example: performing an iterative calculation\n", + "* Trace iterative algorithms and determine their output\n", + "* Recognize common while loop errors\n", + " - Infinite loops (when unintentional)\n", + " - Off-by-one mistakes in the loop control variable\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## While Loop Syntax\n", + "\n", + "The `while` loop has the following syntax:\n", + "\n", + "```python\n", + "while CONDITION:\n", + " #code to be executed if CONDITION is True (Body of loop)\n", + "#code after while loop\n", + "```\n", + "\n", + "If `CONDITION` is true then the indented block of code will be executed and flow-of-control will loop back up to the `CONDITION` again to check its value. If it remains true, the indented block of code will be executed again. This process will repeat indefinitely. If the `CONDITION` is false the indented block of code will be skipped and the first line after the indented block will be executed.\n", + "\n", + "Try the example in the cell below and visualize it running using the debugger or in [the python tutor](https://pythontutor.com/render.html#code=n%20%3D%200%0Awhile%20n%20%3C%2010%3A%0A%20%20%20%20print%28n%29%0A%20%20%20%20n%20%2B%3D%201%0Aprint%28'Done!'%29&cumulative=false&curInstr=0&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false).\n", + "\n", + "In addition, we will be looking at the [slides](https://git.doit.wisc.edu/cdis/cs/courses/cs220/cs220-lecture-material/-/blob/main/s24/Common/10_Iteration-1/10_Iteration-1.pdf) that compare the **if statement** and the **while loop**. Their syntax is very similar but their flow of control is different. With an if-statement, the indented block of code will run at most once. With a while-loop, the indented block may run over and over until the `CONDITION` is false." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Example : Use the debugger to trace the execution of this code\n", + "\n", + "n = 0\n", + "while n < 10:\n", + " print(n)\n", + " n += 1\n", + "print('Done!')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example -- Counting\n", + "\n", + "When working with loops there are two common mistakes that are made:\n", + "\n", + "* **off-by-one** -- having the wrong logic that executes the loop once too often or once less than it should.\n", + "* **infinite loop** -- forgetting to include code in the body that will make sure that the condition will eventually become false.\n", + "\n", + "Follow along to see these common mistakes and the debugging techniques that you can use to find and fix these mistakes." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Example: Countdown Timer\n", + "# The code should prompt for a number, loop from that number down to 1 then print blast off\n", + "\n", + "from time import sleep\n", + "\n", + "count = 0\n", + "count = input(\"Enter in a time to countdown from: \")\n", + "count = int(count)\n", + "\n", + "# This loop handles the countdown\n", + "while count >= 0:\n", + " print(count)\n", + " sleep(1)\n", + "print(\"Blast Off!!\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### You Try\n", + "**Example: Prime Numbers**\n", + "\n", + "A prime number, x, is a positive integer greater than 1 that is only divisible by itself and 1. If a number is divisible by any other integers then it is not prime. Let's write a function that checks if a number is prime. We can do this by trying to divide it by all numbers from 2 to x-1.\n", + "\n", + "Finish writing the `is_prime()` function below and test it by calling different numbers that are prime and that are not prime.\n", + "\n", + "Some primes: 2, 7, 19, 29<br>\n", + "Non-primes: 6, 15, 30" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Example: write a function to determine if an integer is prime\n", + "import math\n", + "\n", + "def is_prime(x):\n", + " \"\"\" returns True if x is prime, false otherwise. Assumes x is an int\"\"\"\n", + " # first let's make sure it is >1, otherwise return False\n", + " if x <= 1:\n", + " return False\n", + "\n", + " # Now let's try dividing x by all numbers between 2 and x-1. As soon as you discover that it is divisible by\n", + " # any of these numbers you know it is not prime so return False\n", + " # if you finish the entire loop and never returned False then it must be prime so return True\n", + " divisor = 2\n", + " while divisor <= x-1:\n", + " # TODO: Finish function\n", + " pass\n", + "\n", + "##TODO: call your function and see if it returns the proper value" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that you have a working `is_prime()` function, let's use it to print out all the primes between 1 and 100.\n", + "\n", + "Write code in the cell below to loop through all values from 1 to 100 and call the is_prime() function on each of these values. Print those values that are prime." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Example: Print the prime numbers between 1 and 100\n", + "\n", + "# TODO: Write Code here\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example -- Validating User Input\n", + "\n", + "One common use of a loop is to check user input. You setup a loop that repeats until a user types in a proper value. Take a look at the code below to see one way to do this." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## A function which gets an integer in a specific range from the user\n", + "\n", + "def get_int(low=1,high=10):\n", + " repeat = True\n", + " while repeat:\n", + " num = int(input(\"Enter an integer between \"+str(low)+\" and \"+str(high)+\":\"))\n", + " if num<low or num>high:\n", + " print(\"invalid input\")\n", + " else:\n", + " repeat = False\n", + " return num\n", + "\n", + "val = get_int()\n", + "print(\"You entered\",val)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### You Try\n", + "\n", + "The code in the cell below allows you to guess a random number between 1 and 100. Run the code and see how it works.\n", + "\n", + "Now modify the code to keep track of how many guesses it takes to discover the hidden number and after the number is guessed tell them how many guesses it took." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from random import randint\n", + "\n", + "low = 1\n", + "high = 100\n", + "\n", + "hidden_number = randint(low,high)\n", + "guessed_number = False\n", + "##TODO: Create a count variable and start it at 0\n", + "\n", + "while not guessed_number:\n", + " print(\"Guess my number.\")\n", + " guess = get_int(low,high)\n", + " ##TODO: A guess just happened so increment the count variable\n", + " \n", + " if guess == hidden_number:\n", + " print(\"You guessed it!\")\n", + " ##TODO: print out how many guesses it took\n", + " \n", + " guessed_number = True\n", + " else:\n", + " print(\"That is not it. Try again.\")\n", + " if guess < hidden_number:\n", + " print(\"you are too low\")\n", + " else:\n", + " print(\"you are too high\")\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### You Try\n", + "\n", + "Finish writing the code to get 10 test scores (between 0 and 100) and print out the average score. Use the `get_int()` function." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "total = 0\n", + "count = 0\n", + "\n", + "while ##TODO -- Write the CONDITION so loop runs 10 times:\n", + " test_score = get_int(0,100)\n", + " ##TODO update total and count\n", + "#TODO print out the average of total/count\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example -- Finding the Maximum Value\n", + "\n", + "One way of looking for the maximum value of a function is to scan across a range of input values and see what the output from the function is and keeping the largest value seen. The function $5-(x-2)^2$ is defined in the function in the cell below. Run the cell so it is defined, then test it by printing input values and the associated output values in the cell below that. " + ] + }, + { + "attachments": { + "graph.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Example 3a: define the function\n", + "def f(x):\n", + " return 5 - (x-2)**2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# ... and test it!\n", + "print(\"x , y\")\n", + "print(-1,\",\",f(-1))\n", + "print(0,\",\",f(0))\n", + "print(3,\",\",f(3))\n", + "print(6,\",\",f(6))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Example: Now write code to iterate over values from start_x to end_x in steps of delta_x\n", + "# printing out the x and y values\n", + "\n", + "start_x = 0\n", + "end_x = 5\n", + "delta_x = 0.1\n", + "\n", + "# TODO: Write Code Here\n", + "current_x = start_x\n", + "while current_x <= end_x:\n", + " print(current_x,f(current_x))\n", + " current_x += delta_x\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### You Try\n", + "\n", + "Now write the code again, but this time keep track of the highest y value seen and just print out the x and y values for this maximum.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: finish this code\n", + "\n", + "start_x = 0\n", + "end_x = 5\n", + "delta_x = 0.1\n", + "\n", + "# TODO: Write Code Here\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "You learned the syntax for writing a **while** loop and you practiced using while loops to count, validate user input and perform some mathematical computations." + ] + } + ], + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/s25/Louis_Lecture_Notes/10_Iteration1/Lec_10_Iteration1_Solution.ipynb b/s25/Louis_Lecture_Notes/10_Iteration1/Lec_10_Iteration1_Solution.ipynb new file mode 100644 index 0000000..3ae3bef --- /dev/null +++ b/s25/Louis_Lecture_Notes/10_Iteration1/Lec_10_Iteration1_Solution.ipynb @@ -0,0 +1,939 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Warmup" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "True\n", + "True\n" + ] + } + ], + "source": [ + "# Warmup 1: Call can_serve different 3 times: use a positional argument, keyword argument, and default argument.\n", + "def can_serve(age=21):\n", + " if(age >= 18):\n", + " if (age <= 25):\n", + " return True\n", + " else:\n", + " return False\n", + " else:\n", + " return False\n", + "\n", + "print(can_serve(4)) # positional argument\n", + "print(can_serve(age=25)) # keyword argument\n", + "print(can_serve()) # default argument" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "True\n", + "True\n" + ] + } + ], + "source": [ + "# Warmup 2: Refactor the can_serve function.\n", + "# e.g.: Write it another way, keeping the same behavior\n", + "# Use the same print statements your wrote above to test it.\n", + "def refactor_can_serve(age=21):\n", + " return age >= 18 and age <=25\n", + "\n", + "print(refactor_can_serve(4)) # positional argument\n", + "print(refactor_can_serve(age=25)) # keyword argument\n", + "print(refactor_can_serve()) # default argument" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "True\n", + "False\n", + "should have same values as above\n", + "True\n", + "True\n", + "True\n", + "False\n" + ] + } + ], + "source": [ + "# Warmup 3\n", + "# Consider the following code\n", + "\n", + "def refactor(x,y):\n", + " if x:\n", + " return True\n", + " elif y:\n", + " return True\n", + " else:\n", + " return False\n", + " \n", + "print(refactor(True, False))\n", + "print(refactor(False, True))\n", + "print(refactor(True, True))\n", + "print(refactor(False, False))\n", + "\n", + "# what is the best way to refactor the body of the function ?\n", + "# A. return x and y\n", + "# B. return x or y\n", + "# C. return x != y\n", + "# D. return x == y\n", + "\n", + "def refactor2(x,y):\n", + " return x or y\n", + "\n", + "print(\"should have same values as above\")\n", + "print(refactor2(True, False))\n", + "print(refactor2(False, True))\n", + "print(refactor2(True, True))\n", + "print(refactor2(False, False))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Reminder\n", + "\n", + "- Conditionals can contain entire blocks of code, including **nested conditionals**\n", + "- It is common after getting code to work as intended to **refactor** the code to have the same behavior but to be more readable or execute faster." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Iteration\n", + "\n", + "## Readings\n", + "\n", + "* [Downey Ch 7](https://greenteapress.com/thinkpython2/html/thinkpython2008.html)\n", + "* [Python for Everybody, 6.1 - 6.3](https://runestone.academy/ns/books/published/py4e-int/iterations/toctree.html)\n", + "\n", + "## Learning Objectives\n", + "\n", + "After this lecture you will be able to...\n", + "\n", + "* Implement an iterative algorithm using a while loop\n", + " - example: printing / counting\n", + " - example: validating user input\n", + " - example: performing an iterative calculation\n", + "* Trace iterative algorithms and determine their output\n", + "* Recognize common while loop errors\n", + " - Infinite loops (when unintentional)\n", + " - Off-by-one mistakes in the loop control variable\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## While Loop Syntax\n", + "\n", + "The `while` loop has the following syntax:\n", + "\n", + "```python\n", + "while CONDITION:\n", + " #code to be executed if CONDITION is True (Body of loop)\n", + "#code after while loop\n", + "```\n", + "\n", + "If `CONDITION` is true then the indented block of code will be executed and flow-of-control will loop back up to the `CONDITION` again to check its value. If it remains true, the indented block of code will be executed again. This process will repeat indefinitely. If the `CONDITION` is false the indented block of code will be skipped and the first line after the indented block will be executed.\n", + "\n", + "Try the example in the cell below and visualize it running using the debugger or in [the python tutor](https://pythontutor.com/render.html#code=n%20%3D%200%0Awhile%20n%20%3C%2010%3A%0A%20%20%20%20print%28n%29%0A%20%20%20%20n%20%2B%3D%201%0Aprint%28'Done!'%29&cumulative=false&curInstr=0&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false).\n", + "\n", + "In addition, we will be looking at the [slides](https://git.doit.wisc.edu/cdis/cs/courses/cs220/cs220-lecture-material/-/blob/main/s24/Common/10_Iteration-1/10_Iteration-1.pdf) that compare the **if statement** and the **while loop**. Their syntax is very similar but their flow of control is different. With an if-statement, the indented block of code will run at most once. With a while-loop, the indented block may run over and over until the `CONDITION` is false." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "6\n", + "7\n", + "8\n", + "9\n", + "Done!\n" + ] + } + ], + "source": [ + "# Example : Use the debugger to trace the execution of this code\n", + "\n", + "n = 0\n", + "while n < 10:\n", + " print(n)\n", + " n += 1\n", + "print('Done!')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example -- Counting\n", + "\n", + "When working with loops there are two common mistakes that are made:\n", + "\n", + "* **off-by-one** -- having the wrong logic that executes the loop once too often or once less than it should.\n", + "* **infinite loop** -- forgetting to include code in the body that will make sure that the condition will eventually become false.\n", + "\n", + "Follow along to see these common mistakes and the debugging techniques that you can use to find and fix these mistakes." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Enter in a time to countdown from: 10\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n", + "9\n", + "8\n", + "7\n", + "6\n", + "5\n", + "4\n", + "3\n", + "2\n", + "1\n", + "Blast Off!!\n" + ] + } + ], + "source": [ + "# Example: Countdown Timer\n", + "# The code should prompt for a number, loop from that number down to 1 then print blast off\n", + "\n", + "from time import sleep\n", + "\n", + "count = 0\n", + "count = input(\"Enter in a time to countdown from: \")\n", + "count = int(count)\n", + "\n", + "# This loop handles the countdown\n", + "while count > 0:\n", + " print(count)\n", + " sleep(1)\n", + " count-=1\n", + "print(\"Blast Off!!\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### You Try\n", + "**Example: Prime Numbers**\n", + "\n", + "A prime number, x, is a positive integer greater than 1 that is only divisible by itself and 1. If a number is divisible by any other integers then it is not prime. Let's write a function that checks if a number is prime. We can do this by trying to divide it by all numbers from 2 to x-1.\n", + "\n", + "Finish writing the `is_prime()` function below and test it by calling different numbers that are prime and that are not prime.\n", + "\n", + "Some primes: 2, 7, 19, 29, 101<br>\n", + "Non-primes: 1, 6, 18, 30, 36" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n", + "False\n", + "True\n", + "True\n", + "False\n" + ] + } + ], + "source": [ + "# Example: write a function to determine if an integer is prime\n", + "import math\n", + "\n", + "def is_prime(x):\n", + " \"\"\" returns True if x is prime, false otherwise. Assumes x is an int\"\"\"\n", + " # first let's make sure it is >1, otherwise return False\n", + " if x <= 1:\n", + " return False\n", + "\n", + " # Now let's try dividing x by all numbers between 2 and x-1. As soon as you discover that it is divisible by\n", + " # any of these numbers you know it is not prime so return False\n", + " # if you finish the entire loop and never returned False then it must be prime so return True\n", + " divisor = 2\n", + " while divisor <= x-1:\n", + " if x% divisor == 0:\n", + " return False\n", + " divisor +=1\n", + " return True\n", + "\n", + "##TODO: call your function and see if it returns the proper value\n", + "print(is_prime(101))\n", + "print(is_prime(36))\n", + "print(is_prime(18))\n", + "print(is_prime(7))\n", + "print(is_prime(2))\n", + "print(is_prime(1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that you have a working `is_prime()` function, let's use it to print out all the primes between 1 and 100.\n", + "\n", + "Write code in the cell below to loop through all values from 1 to 100 and call the is_prime() function on each of these values. Print those values that are prime." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 is prime? False\n", + "2 is prime? True\n", + "3 is prime? True\n", + "4 is prime? False\n", + "5 is prime? True\n", + "6 is prime? False\n", + "7 is prime? True\n", + "8 is prime? False\n", + "9 is prime? False\n", + "10 is prime? False\n", + "11 is prime? True\n", + "12 is prime? False\n", + "13 is prime? True\n", + "14 is prime? False\n", + "15 is prime? False\n", + "16 is prime? False\n", + "17 is prime? True\n", + "18 is prime? False\n", + "19 is prime? True\n", + "20 is prime? False\n", + "21 is prime? False\n", + "22 is prime? False\n", + "23 is prime? True\n", + "24 is prime? False\n", + "25 is prime? False\n", + "26 is prime? False\n", + "27 is prime? False\n", + "28 is prime? False\n", + "29 is prime? True\n", + "30 is prime? False\n", + "31 is prime? True\n", + "32 is prime? False\n", + "33 is prime? False\n", + "34 is prime? False\n", + "35 is prime? False\n", + "36 is prime? False\n", + "37 is prime? True\n", + "38 is prime? False\n", + "39 is prime? False\n", + "40 is prime? False\n", + "41 is prime? True\n", + "42 is prime? False\n", + "43 is prime? True\n", + "44 is prime? False\n", + "45 is prime? False\n", + "46 is prime? False\n", + "47 is prime? True\n", + "48 is prime? False\n", + "49 is prime? False\n", + "50 is prime? False\n", + "51 is prime? False\n", + "52 is prime? False\n", + "53 is prime? True\n", + "54 is prime? False\n", + "55 is prime? False\n", + "56 is prime? False\n", + "57 is prime? False\n", + "58 is prime? False\n", + "59 is prime? True\n", + "60 is prime? False\n", + "61 is prime? True\n", + "62 is prime? False\n", + "63 is prime? False\n", + "64 is prime? False\n", + "65 is prime? False\n", + "66 is prime? False\n", + "67 is prime? True\n", + "68 is prime? False\n", + "69 is prime? False\n", + "70 is prime? False\n", + "71 is prime? True\n", + "72 is prime? False\n", + "73 is prime? True\n", + "74 is prime? False\n", + "75 is prime? False\n", + "76 is prime? False\n", + "77 is prime? False\n", + "78 is prime? False\n", + "79 is prime? True\n", + "80 is prime? False\n", + "81 is prime? False\n", + "82 is prime? False\n", + "83 is prime? True\n", + "84 is prime? False\n", + "85 is prime? False\n", + "86 is prime? False\n", + "87 is prime? False\n", + "88 is prime? False\n", + "89 is prime? True\n", + "90 is prime? False\n", + "91 is prime? False\n", + "92 is prime? False\n", + "93 is prime? False\n", + "94 is prime? False\n", + "95 is prime? False\n", + "96 is prime? False\n", + "97 is prime? True\n", + "98 is prime? False\n", + "99 is prime? False\n", + "100 is prime? False\n" + ] + } + ], + "source": [ + "# Example: Print the prime numbers between 1 and 100\n", + "\n", + "# TODO: Write Code here\n", + "counter=1\n", + "while counter<=100:\n", + " print(counter,\"is prime?\",is_prime(counter))\n", + " counter+=1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example -- Validating User Input\n", + "\n", + "One common use of a loop is to check user input. You setup a loop that repeats until a user types in a proper value. Take a look at the code below to see one way to do this." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Enter an integer between 1 and 10: -1\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "invalid input\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Enter an integer between 1 and 10: 7\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You entered 7\n" + ] + } + ], + "source": [ + "## A function which gets an integer in a specific range from the user\n", + "\n", + "def get_int(low=1,high=10):\n", + " repeat = True\n", + " while repeat:\n", + " num = int(input(\"Enter an integer between \"+str(low)+\" and \"+str(high)+\":\"))\n", + " if num<low or num>high:\n", + " print(\"invalid input\")\n", + " else:\n", + " repeat = False\n", + " return num\n", + "\n", + "val = get_int()\n", + "print(\"You entered\",val)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### You Try\n", + "\n", + "The code in the cell below allows you to guess a random number between 1 and 100. Run the code and see how it works.\n", + "\n", + "Now modify the code to keep track of how many guesses it takes to discover the hidden number and after the number is guessed tell them how many guesses it took." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Guess my number.\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Enter an integer between 1 and 100: 50\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "That is not it. Try again.\n", + "you are too high\n", + "Guess my number.\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Enter an integer between 1 and 100: 25\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "That is not it. Try again.\n", + "you are too high\n", + "Guess my number.\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Enter an integer between 1 and 100: 12\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "That is not it. Try again.\n", + "you are too high\n", + "Guess my number.\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Enter an integer between 1 and 100: 6\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "That is not it. Try again.\n", + "you are too high\n", + "Guess my number.\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Enter an integer between 1 and 100: 3\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "That is not it. Try again.\n", + "you are too high\n", + "Guess my number.\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Enter an integer between 1 and 100: 2\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You guessed it!\n", + "It took you 6 guesses.\n" + ] + } + ], + "source": [ + "from random import randint\n", + "\n", + "low = 1\n", + "high = 100\n", + "\n", + "hidden_number = randint(low,high)\n", + "guessed_number = False\n", + "##TODO: Create a count variable and start it at 0\n", + "count = 0\n", + "\n", + "while not guessed_number:\n", + " print(\"Guess my number.\")\n", + " guess = get_int(low,high)\n", + " ##TODO: A guess just happened so increment the count variable\n", + " count += 1\n", + " \n", + " if guess == hidden_number:\n", + " print(\"You guessed it!\")\n", + " ##TODO: print out how many guesses it took\n", + " print(\"It took you\",count,\"guesses.\")\n", + " \n", + " guessed_number = True\n", + " else:\n", + " print(\"That is not it. Try again.\")\n", + " if guess < hidden_number:\n", + " print(\"you are too low\")\n", + " else:\n", + " print(\"you are too high\")\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### You Try\n", + "\n", + "Finish writing the code to get 10 test scores (between 0 and 100) and print out the average score. Use the `get_int()` function." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Enter an integer between 0 and 100: 50\n", + "Enter an integer between 0 and 100: 60\n", + "Enter an integer between 0 and 100: 70\n", + "Enter an integer between 0 and 100: 80\n", + "Enter an integer between 0 and 100: 80\n", + "Enter an integer between 0 and 100: 75\n", + "Enter an integer between 0 and 100: 85\n", + "Enter an integer between 0 and 100: 80\n", + "Enter an integer between 0 and 100: 80\n", + "Enter an integer between 0 and 100: 90\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Average is 75.0\n" + ] + } + ], + "source": [ + "\n", + "total = 0\n", + "count = 0\n", + "\n", + "while count < 10:\n", + " test_score = get_int(0,100)\n", + " count +=1\n", + " total += test_score\n", + "#TODO print out the average of total/count\n", + "print(\"Average is\",(total/count))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example -- Finding the Maximum Value\n", + "\n", + "One way of looking for the maximum value of a function is to scan across a range of input values and see what the output from the function is and keeping the largest value seen. The function $5-(x-2)^2$ is defined in the function in the cell below. Run the cell so it is defined, then test it by printing input values and the associated output values in the cell below that. " + ] + }, + { + "attachments": { + "graph.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "# Example 3a: define the function\n", + "def f(x):\n", + " return 5 - (x-2)**2" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x , y\n", + "-1 , -4\n", + "0 , 1\n", + "3 , 4\n", + "6 , -11\n" + ] + } + ], + "source": [ + "# ... and test it!\n", + "print(\"x , y\")\n", + "print(-1,\",\",f(-1))\n", + "print(0,\",\",f(0))\n", + "print(3,\",\",f(3))\n", + "print(6,\",\",f(6))" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 , 1\n", + "0.1 , 1.3900000000000001\n", + "0.2 , 1.7599999999999998\n", + "0.30000000000000004 , 2.1100000000000003\n", + "0.4 , 2.4399999999999995\n", + "0.5 , 2.75\n", + "0.6 , 3.04\n", + "0.7 , 3.3099999999999996\n", + "0.7999999999999999 , 3.5599999999999996\n", + "0.8999999999999999 , 3.79\n", + "0.9999999999999999 , 4.0\n", + "1.0999999999999999 , 4.1899999999999995\n", + "1.2 , 4.359999999999999\n", + "1.3 , 4.51\n", + "1.4000000000000001 , 4.640000000000001\n", + "1.5000000000000002 , 4.75\n", + "1.6000000000000003 , 4.84\n", + "1.7000000000000004 , 4.91\n", + "1.8000000000000005 , 4.96\n", + "1.9000000000000006 , 4.99\n", + "2.0000000000000004 , 5.0\n", + "2.1000000000000005 , 4.99\n", + "2.2000000000000006 , 4.96\n", + "2.3000000000000007 , 4.909999999999999\n", + "2.400000000000001 , 4.839999999999999\n", + "2.500000000000001 , 4.749999999999999\n", + "2.600000000000001 , 4.639999999999999\n", + "2.700000000000001 , 4.509999999999999\n", + "2.800000000000001 , 4.359999999999998\n", + "2.9000000000000012 , 4.189999999999998\n", + "3.0000000000000013 , 3.9999999999999973\n", + "3.1000000000000014 , 3.789999999999997\n", + "3.2000000000000015 , 3.559999999999996\n", + "3.3000000000000016 , 3.309999999999996\n", + "3.4000000000000017 , 3.0399999999999956\n", + "3.5000000000000018 , 2.7499999999999947\n", + "3.600000000000002 , 2.439999999999994\n", + "3.700000000000002 , 2.109999999999993\n", + "3.800000000000002 , 1.7599999999999927\n", + "3.900000000000002 , 1.3899999999999917\n", + "4.000000000000002 , 0.9999999999999929\n", + "4.100000000000001 , 0.5899999999999936\n", + "4.200000000000001 , 0.1599999999999957\n", + "4.300000000000001 , -0.2900000000000036\n", + "4.4 , -0.7600000000000016\n", + "4.5 , -1.25\n", + "4.6 , -1.759999999999998\n", + "4.699999999999999 , -2.2899999999999965\n", + "4.799999999999999 , -2.8399999999999936\n", + "4.899999999999999 , -3.4099999999999913\n", + "4.999999999999998 , -3.9999999999999893\n" + ] + } + ], + "source": [ + "# Example: Now write code to iterate over values from start_x to end_x in steps of delta_x\n", + "# printing out the x and y values\n", + "\n", + "start_x = 0\n", + "end_x = 5\n", + "delta_x = 0.1\n", + "\n", + "# TODO: Write Code Here\n", + "current_x = start_x\n", + "while current_x <= end_x:\n", + " print(current_x,\",\",f(current_x))\n", + " current_x += delta_x\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### You Try\n", + "\n", + "Now write the code again, but this time keep track of the highest y value seen and just print out the x and y values for this maximum.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MAX is: 2.0000000000000004 , 5.0\n" + ] + } + ], + "source": [ + "# TODO: finish this code\n", + "\n", + "start_x = 0\n", + "end_x = 5\n", + "delta_x = 0.1\n", + "\n", + "# TODO: Write Code Here\n", + "max_x = start_x\n", + "max_y = f(start_x)\n", + "\n", + "current_x = start_x\n", + "while current_x <= end_x:\n", + " current_y = f(current_x)\n", + " if current_y > max_y:\n", + " max_x = current_x\n", + " max_y = current_y\n", + " current_x+=delta_x\n", + "print(\"MAX is:\",max_x,\",\",max_y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "You learned the syntax for writing a **while** loop and you practiced using while loops to count, validate user input and perform some mathematical computations." + ] + } + ], + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} -- GitLab