From 8af0280271220c2b384b9596a82883c98b416003 Mon Sep 17 00:00:00 2001 From: Alexander Hess Date: Tue, 28 Jan 2020 11:07:14 +0100 Subject: [PATCH 1/4] Update the Python version in README.md --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 97c9120..a227cb2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -**Important**: The notebooks are being added throughout the fall semester of 2019! +**Important**: The notebooks are being updated and amended throughout the +spring semester of 2020! # An Introduction to Python and Programming @@ -50,7 +51,7 @@ It is only expected that the student has: ## Installation -To follow this course, a working installation of **Python 3.6** or higher is +To follow this course, a working installation of **Python 3.7** or higher is expected. A popular and beginner friendly way is to install the [Anaconda Distribution]( @@ -58,7 +59,7 @@ https://www.anaconda.com/distribution/) that not only ships Python but comes pre-packaged with a lot of third-party libraries from the so-called "scientific stack". Just go to the [download](https://www.anaconda.com/distribution/#download-section) -section and install the latest version (i.e., *2019-07* with Python 3.7 at the +section and install the latest version (i.e., *2019-10* with Python 3.7 at the time of this writing) for your operating system. Then, among others, you will find an entry "Jupyter Notebook" in your start @@ -84,7 +85,7 @@ used without a mouse by typing commands into it. -Assuming that you already have a working version of Python 3.6 or higher +Assuming that you already have a working version of Python 3.7 or higher installed (cf., the official [download page](https://www.python.org/downloads/)), the following summarizes the commands to be typed into a terminal emulator to get the course materials up and running on a local machine without Anaconda. From e24cf31104dda53acf752414987183517b40f695 Mon Sep 17 00:00:00 2001 From: Alexander Hess Date: Tue, 28 Jan 2020 10:48:37 +0100 Subject: [PATCH 2/4] Restructure *.ipynb files - split review and exercises into files on their own - update the contents overviews to include links to reviews and exercises --- ...t_up.ipynb => 00_start_up_00_content.ipynb | 35 +- ...cises.ipynb => 00_start_up_10_review.ipynb | 81 +- 00_start_up_20_exercises.ipynb | 115 ++ ...ents.ipynb => 01_elements_00_content.ipynb | 199 ++-- ...cises.ipynb => 01_elements_10_review.ipynb | 96 +- 01_elements_20_exercises.ipynb | 139 +++ ...ons.ipynb => 02_functions_00_content.ipynb | 564 +++++---- ...ises.ipynb => 02_functions_10_review.ipynb | 192 +-- 02_functions_20_exercises.ipynb | 234 ++++ ....ipynb => 03_conditionals_00_content.ipynb | 357 +++--- 03_conditionals_10_review.ipynb | 214 ++++ ...pynb => 03_conditionals_20_exercises.ipynb | 195 +--- ...ion.ipynb => 04_iteration_00_content.ipynb | 162 ++- 04_iteration_10_review.ipynb | 281 +++++ ...s.ipynb => 04_iteration_20_exercises.ipynb | 310 +---- ...mbers.ipynb => 05_numbers_00_content.ipynb | 1032 ++++++++--------- 05_numbers_10_review.ipynb | 347 ++++++ 05_numbers_20_exercises.ipynb | 412 +++++++ 05_numbers_review_and_exercises.ipynb | 706 ----------- 06_text.ipynb => 06_text_00_content.ipynb | 586 ++++++---- ...exercises.ipynb => 06_text_10_review.ipynb | 8 +- ...ces.ipynb => 07_sequences_00_content.ipynb | 109 +- 07_sequences_10_review.ipynb | 397 +++++++ ...s.ipynb => 07_sequences_20_exercises.ipynb | 438 +------ ...ings.ipynb => 08_mappings_00_content.ipynb | 175 +-- 08_mappings_10_review.ipynb | 261 +++++ ...es.ipynb => 08_mappings_20_exercises.ipynb | 242 +--- README.md | 51 +- 28 files changed, 4335 insertions(+), 3603 deletions(-) rename 00_start_up.ipynb => 00_start_up_00_content.ipynb (94%) rename 00_start_up_review_and_exercises.ipynb => 00_start_up_10_review.ipynb (60%) create mode 100644 00_start_up_20_exercises.ipynb rename 01_elements.ipynb => 01_elements_00_content.ipynb (97%) rename 01_elements_review_and_exercises.ipynb => 01_elements_10_review.ipynb (64%) create mode 100644 01_elements_20_exercises.ipynb rename 02_functions.ipynb => 02_functions_00_content.ipynb (91%) rename 02_functions_review_and_exercises.ipynb => 02_functions_10_review.ipynb (50%) create mode 100644 02_functions_20_exercises.ipynb rename 03_conditionals.ipynb => 03_conditionals_00_content.ipynb (95%) create mode 100644 03_conditionals_10_review.ipynb rename 03_conditionals_review_and_exercises.ipynb => 03_conditionals_20_exercises.ipynb (53%) rename 04_iteration.ipynb => 04_iteration_00_content.ipynb (96%) create mode 100644 04_iteration_10_review.ipynb rename 04_iteration_review_and_exercises.ipynb => 04_iteration_20_exercises.ipynb (64%) rename 05_numbers.ipynb => 05_numbers_00_content.ipynb (96%) create mode 100644 05_numbers_10_review.ipynb create mode 100644 05_numbers_20_exercises.ipynb delete mode 100644 05_numbers_review_and_exercises.ipynb rename 06_text.ipynb => 06_text_00_content.ipynb (90%) rename 06_text_review_and_exercises.ipynb => 06_text_10_review.ipynb (94%) rename 07_sequences.ipynb => 07_sequences_00_content.ipynb (97%) create mode 100644 07_sequences_10_review.ipynb rename 07_sequences_review_and_exercises.ipynb => 07_sequences_20_exercises.ipynb (70%) rename 08_mappings.ipynb => 08_mappings_00_content.ipynb (96%) create mode 100644 08_mappings_10_review.ipynb rename 08_mappings_review_and_exercises.ipynb => 08_mappings_20_exercises.ipynb (56%) diff --git a/00_start_up.ipynb b/00_start_up_00_content.ipynb similarity index 94% rename from 00_start_up.ipynb rename to 00_start_up_00_content.ipynb index 9aed12d..6e3d84a 100644 --- a/00_start_up.ipynb +++ b/00_start_up_00_content.ipynb @@ -152,9 +152,9 @@ } }, "source": [ - "To \"read\" this book in the most meaningful way, a working installation of **Python 3.6** or higher is needed.\n", + "To \"read\" this book in the most meaningful way, a working installation of **Python 3.7** or higher is expected.\n", "\n", - "A popular and beginner-friendly way is to install the [Anaconda Distribution](https://www.anaconda.com/distribution/) that not only ships Python and the standard library but comes pre-packaged with a lot of third-party libraries from the so-called \"scientific stack.\" Just go to the [download](https://www.anaconda.com/download/) page and install the latest version (i.e., *2019-07* with Python 3.7 at the time of this writing) for your operating system.\n", + "A popular and beginner-friendly way is to install the [Anaconda Distribution](https://www.anaconda.com/distribution/) that not only ships Python and the standard library but comes pre-packaged with a lot of third-party libraries from the so-called \"scientific stack.\" Just go to the [download](https://www.anaconda.com/download/) page and install the latest version (i.e., *2019-10* with Python 3.7 at the time of this writing) for your operating system.\n", "\n", "Then, among others, you find an entry \"Jupyter Notebook\" in your start menu like below. Click on it to open a new tab in your web browser where you can switch between folders as you could in your computer's default file browser." ] @@ -330,7 +330,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Python 3.7.3\r\n" + "Python 3.7.4\n" ] } ], @@ -649,7 +649,7 @@ } }, "source": [ - "Even popular news and media outlets notice the recent popularity of Python: [Economist](https://www.economist.com/graphic-detail/2018/07/26/python-is-becoming-the-worlds-most-popular-coding-language), [Huffington Post](https://www.huffingtonpost.com/entry/why-python-is-the-best-programming-language-with-which_us_59ef8f62e4b04809c05011b9), [TechRepublic](https://www.techrepublic.com/article/why-python-is-so-popular-with-developers-3-reasons-the-language-has-exploded/), and [QZ](https://qz.com/1408660/the-rise-of-python-as-seen-through-a-decade-of-stack-overflow/)." + "[IEEE Sprectrum](https://spectrum.ieee.org/computing/software/the-top-programming-languages-2019) provides a more recent comparison of programming language's popularity. Even news and media outlets notice the recent popularity of Python: [Economist](https://www.economist.com/graphic-detail/2018/07/26/python-is-becoming-the-worlds-most-popular-coding-language), [Huffington Post](https://www.huffingtonpost.com/entry/why-python-is-the-best-programming-language-with-which_us_59ef8f62e4b04809c05011b9), [TechRepublic](https://www.techrepublic.com/article/why-python-is-so-popular-with-developers-3-reasons-the-language-has-exploded/), and [QZ](https://qz.com/1408660/the-rise-of-python-as-seen-through-a-decade-of-stack-overflow/)." ] }, { @@ -771,14 +771,14 @@ } }, "source": [ - "**Part 1: Expressing Logic**\n", + "**Part A: Expressing Logic**\n", "\n", "- What is a programming language? What kind of words exist?\n", - " 1. [Elements of a Program](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb)\n", - " 2. [Functions & Modularization](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions.ipynb)\n", + " - *Chapter 1*: [Elements of a Program](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb)\n", + " - *Chapter 2*: [Functions & Modularization](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions_00_content.ipynb)\n", "- What is the flow of execution? How can we form sentences from words?\n", - " 3. [Conditionals & Exceptions](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals.ipynb)\n", - " 4. [Recursion & Looping](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration.ipynb)" + " - *Chapter 3*: [Conditionals & Exceptions](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals_00_content.ipynb)\n", + " - *Chapter 4*: [Recursion & Looping](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_00_content.ipynb)" ] }, { @@ -789,15 +789,16 @@ } }, "source": [ - "**Part 2: Managing Data and Memory**\n", + "**Part B: Managing Data and Memory**\n", "\n", "- How is data stored in memory?\n", - " 5. [Bits & Numbers](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers.ipynb)\n", - " 6. [Bytes & Text](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text.ipynb)\n", - " 7. [Sequential Data](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences.ipynb)\n", - " 8. [Mappings & Sets](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings.ipynb)\n", + " - *Chapter 5*: [Bits & Numbers](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers_00_content.ipynb)\n", + " - *Chapter 6*: [Bytes & Text](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text_00_content.ipynb)\n", + " - *Chapter 7*: [Sequential Data](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_00_content.ipynb)\n", + " - *Chapter 8*: [Mappings & Sets](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings_00_content.ipynb)\n", + " - *Chapter 9*: [Arrays & Dataframes](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/09_arrays_00_content.ipynb)\n", "- How can we create custom data types?\n", - " 9. Object-Orientation" + " - *Chapter 10*: Object-Orientation" ] }, { @@ -863,7 +864,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.4" }, "livereveal": { "auto_select": "code", @@ -891,5 +892,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/00_start_up_review_and_exercises.ipynb b/00_start_up_10_review.ipynb similarity index 60% rename from 00_start_up_review_and_exercises.ipynb rename to 00_start_up_10_review.ipynb index 109a2fc..e8cb215 100644 --- a/00_start_up_review_and_exercises.ipynb +++ b/00_start_up_10_review.ipynb @@ -11,14 +11,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Content Review" + "## Review" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Read [Chapter 0](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/00_start_up.ipynb) of the book. Then work through the ten review questions." + "Read [Chapter 0](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/00_start_up_00_content.ipynb) of the book. Then, work through the questions below." ] }, { @@ -32,14 +32,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Answer the following questions briefly with *at most* 300 characters per question!" + "Answer the following questions *briefly*!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "**Q1**: Describe the difference between the terms *programming* and *computer science*!" + "**Q1**: Describe the difference between the terms **programming** and **computer science**!" ] }, { @@ -53,7 +53,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q2**: Explain what is a *pull request* and elaborate on how this concept fits a *distributed* organization of work!" + "**Q2**: Explain what is a **pull request** and elaborate on how this concept fits a *distributed* organization of work!" ] }, { @@ -67,7 +67,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q3**: In what sense are open-source communities democracies? How are they near-\"perfect\" [meritocracies](https://en.wikipedia.org/wiki/Meritocracy)? How is open-source software development similar to academia?" + "**Q3**: In what sense are **open-source** communities democracies? How are they near-perfect [meritocracies](https://en.wikipedia.org/wiki/Meritocracy)? How is open-source software development similar to academia?" ] }, { @@ -81,7 +81,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q4**: What is a significant advantage of a \"slow\" programming language like Python over a faster one like C?" + "**Q4**: What is a *significant* advantage of a \"slow\" programming language like Python over a faster one like C?" ] }, { @@ -182,69 +182,6 @@ "**Q10**: The primary purpose of PEPs is to regulate how code should be documented and styled." ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## \"Coding\" Exercises" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Mastering Markdown" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Briefly review GitHub's guide on [Mastering Markdown](https://guides.github.com/features/mastering-markdown/) and create nicely formatted \"text\" cells below!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q11**: Check the latest [Bundesliga standings](https://www.bundesliga.com/en/bundesliga/table) and provide a table of the top three teams with the following four columns: rank, team name, games played, and points scored. Render the rank in **bold**, make the team name a clickable link (to the team's website), and put both the games played and points scored in *italics*. The header row should be visually different from the three rows with the teams' information." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q12**: The quote \"Education is what remains after one has forgotten what one has learned in school\" is attributed to Albert Einstein. Display the author and his quote appropriately!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q13**: Integrate this image (https://i.ytimg.com/vi/-BoSRlzy9c4/maxresdefault.jpg) of the delicious dessert **milk rice** into this notebook." - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -269,7 +206,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.4" }, "toc": { "base_numbering": 1, @@ -286,5 +223,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/00_start_up_20_exercises.ipynb b/00_start_up_20_exercises.ipynb new file mode 100644 index 0000000..afd7f26 --- /dev/null +++ b/00_start_up_20_exercises.ipynb @@ -0,0 +1,115 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Chapter 0: Start up" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## \"Coding\" Exercises" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Read [Chapter 0](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/00_start_up_00_content.ipynb) of the book. Then, work through the exercises below." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Mastering Markdown" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Briefly review GitHub's guide on [Mastering Markdown](https://guides.github.com/features/mastering-markdown/) and create nicely formatted \"text\" cells below!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1**: Check the latest [Bundesliga standings](https://www.bundesliga.com/en/bundesliga/table) and provide a table of the top three teams with the following four columns: rank, team name, games played, and points scored. Render the rank in **bold**, make the team name a clickable link (to the team's website), and put both the games played and points scored in *italics*. The header row should be visually different from the three rows with the teams' information." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q2**: The quote \"Education is what remains after one has forgotten what one has learned in school\" is attributed to Albert Einstein. Display the author and his quote appropriately!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q3**: Integrate this image (https://i.ytimg.com/vi/-BoSRlzy9c4/maxresdefault.jpg) of the delicious dessert **milk rice** into this notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + } + ], + "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.4" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": true, + "skip_h1_title": true, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": false, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/01_elements.ipynb b/01_elements_00_content.ipynb similarity index 97% rename from 01_elements.ipynb rename to 01_elements_00_content.ipynb index 07d6774..38b63b1 100644 --- a/01_elements.ipynb +++ b/01_elements_00_content.ipynb @@ -936,9 +936,9 @@ "source": [ "Python is a so-called **object-oriented** language, which is a paradigm of organizing a program's memory.\n", "\n", - "An **object** may be viewed as a \"bag\" of $0$s and $1$s in a distinct memory location. The concrete $0$s and $1$s in a bag portray the idea of the object's **value**, and there exist different **types** of bags that each come with associated rules as to how the $0$s and $1$s are interpreted and may be worked with.\n", + "An **object** may be viewed as a \"bag\" of $0$s and $1$s in a given memory location. The $0$s and $1$s in a bag make up the object's **value**. There exist different **types** of bags: Each type comes with distinct rules how the $0$s and $1$s are interpreted and may be worked with.\n", "\n", - "So, an object *always* has **three** main characteristics. Let's look at the following examples and work them out." + "So, an object *always* has *three* main characteristics. Let's look at the following examples and work them out." ] }, { @@ -990,7 +990,7 @@ { "data": { "text/plain": [ - "140398796190992" + "140173037405648" ] }, "execution_count": 28, @@ -1014,7 +1014,7 @@ { "data": { "text/plain": [ - "140398796375888" + "140173037405584" ] }, "execution_count": 29, @@ -1038,7 +1038,7 @@ { "data": { "text/plain": [ - "140398796056176" + "140173037234160" ] }, "execution_count": 30, @@ -1082,7 +1082,7 @@ } }, "source": [ - "`a` and `d` indeed have the same value as is checked with the **equality operator** `==`. The resulting `True` (and the `False` further below) is yet another data type, a so-called **boolean**. We look into them closely in [Chapter 3](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals.ipynb#Boolean-Expressions)." + "`a` and `d` indeed have the same value as is checked with the **equality operator** `==`. The resulting `True` (and the `False` further below) is yet another data type, a so-called **boolean**. We look into them closely in [Chapter 3](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals_00_content.ipynb#Boolean-Expressions)." ] }, { @@ -1259,7 +1259,7 @@ "source": [ "Different types imply different behaviors for the objects. The `b` object, for example, can be \"asked\" if it could also be interpreted as an `int` with the [is_integer()](https://docs.python.org/3/library/stdtypes.html#float.is_integer) \"functionality\" that comes with every `float` object.\n", "\n", - "Formally, we call such type-specific functionalities **methods** (to differentiate them from functions) and we formally introduce them in Chapter 9. For now, it suffices to know that we access them using the **dot operator** `.`. Of course, `b` could be converted into an `int`, which the boolean value `True` tells us." + "Formally, we call such type-specific functionalities **methods** (to differentiate them from functions) and we formally introduce them in Chapter 10. For now, it suffices to know that we access them using the **dot operator** `.`. Of course, `b` could be converted into an `int`, which the boolean value `True` tells us." ] }, { @@ -1448,7 +1448,7 @@ } }, "source": [ - "Almost trivially, every object also has a value to which it \"evaluates\" when referenced. We think of the value as the **conceptual idea** of what the $0$s and $1$s in memory mean to humans as machines cannot see beyond $0$s and $1$s.\n", + "Almost trivially, every object also has a value to which it \"evaluates\" when referenced. We think of the value as the **conceptual idea** of what the $0$s and $1$s in the bag mean to *humans* as machines cannot see beyond $0$s and $1$s.\n", "\n", "For built-in data types, Python prints out the object's value as a so-called **[literal](https://docs.python.org/3/reference/lexical_analysis.html#literals)**: This means that we can copy and paste the output back into a code cell to create a *new* object with the *same* value." ] @@ -1854,7 +1854,7 @@ " " ], "text/plain": [ - "" + "" ] }, "execution_count": 52, @@ -1875,7 +1875,7 @@ } }, "source": [ - "For example, while the above code to calculate the average of the even numbers in `[7, 11, 8, 5, 3, 12, 2, 6, 9, 10, 1, 4]` is correct, a Pythonista would rewrite it in a more \"Pythonic\" way and use the [sum()](https://docs.python.org/3/library/functions.html#sum) and [len()](https://docs.python.org/3/library/functions.html#len) (= \"length\") [built-in functions](https://docs.python.org/3/library/functions.html) (cf., [Chapter 2](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions.ipynb#Built-in-Functions)) as well as a so-called **list comprehension** (cf., [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences.ipynb#List-Comprehensions)). Pythonic code runs faster in many cases and is less error-prone." + "For example, while the above code to calculate the average of the even numbers in `[7, 11, 8, 5, 3, 12, 2, 6, 9, 10, 1, 4]` is correct, a Pythonista would rewrite it in a more \"Pythonic\" way and use the [sum()](https://docs.python.org/3/library/functions.html#sum) and [len()](https://docs.python.org/3/library/functions.html#len) (= \"length\") [built-in functions](https://docs.python.org/3/library/functions.html) (cf., [Chapter 2](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions_00_content.ipynb#Built-in-Functions)) as well as a so-called **list comprehension** (cf., [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_00_content.ipynb#List-Comprehensions)). Pythonic code runs faster in many cases and is less error-prone." ] }, { @@ -2077,7 +2077,7 @@ "\n", "At the same time, for a beginner's course, it is often easier to code linearly.\n", "\n", - "In real data science projects, one would probably employ a mixed approach and put reusable code into so-called Python modules (i.e., *.py* files; cf., [Chapter 2](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions.ipynb#Local-Modules-and-Packages)) and then use Jupyter notebooks to build up a linear report or storyline for a business argument to be made." + "In real data science projects, one would probably employ a mixed approach and put reusable code into so-called Python modules (i.e., *.py* files; cf., [Chapter 2](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions_00_content.ipynb#Local-Modules-and-Packages)) and then use Jupyter notebooks to build up a linear report or storyline for a business argument to be made." ] }, { @@ -2367,7 +2367,7 @@ } }, "source": [ - "Some variables magically exist when we start a Python process or are added by Jupyter. We may safely ignore the former until Chapter 9 and the latter for good." + "Some variables magically exist when we start a Python process or are added by Jupyter. We may safely ignore the former until Chapter 10 and the latter for good." ] }, { @@ -2818,7 +2818,7 @@ "source": [ "Let's change the first element of `x`.\n", "\n", - "[Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences.ipynb#The-list-Type) discusses lists in more depth. For now, let's view a `list` object as some sort of **container** that holds an arbitrary number of references to other objects and treat the brackets `[]` attached to it as just another operator, called the **indexing operator**. `x[0]` instructs Python to first follow the reference from the global list of all names to the `x` object. Then, it follows the first reference it finds there to the `1` object. The indexing operator must be an operator as we merely read the first element and do not change anything in memory.\n", + "[Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_00_content.ipynb#The-list-Type) discusses lists in more depth. For now, let's view a `list` object as some sort of **container** that holds an arbitrary number of references to other objects and treat the brackets `[]` attached to it as just another operator, called the **indexing operator**. `x[0]` instructs Python to first follow the reference from the global list of all names to the `x` object. Then, it follows the first reference it finds there to the `1` object. The indexing operator must be an operator as we merely read the first element and do not change anything in memory.\n", "\n", "Note how Python **begins counting at 0**. This is not the case for many other languages, for example, [MATLAB](https://en.wikipedia.org/wiki/MATLAB), [R](https://en.wikipedia.org/wiki/R_%28programming_language%29), or [Stata](https://en.wikipedia.org/wiki/Stata). To understand why this makes sense, see this short [note](https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html) by one of the all-time greats in computer science, the late [Edsger Dijkstra](https://en.wikipedia.org/wiki/Edsger_W._Dijkstra)." ] @@ -3182,65 +3182,6 @@ "__name__" ] }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "skip" - } - }, - "source": [ - "### The big Picture" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "skip" - } - }, - "source": [ - "This PyCon talk by [Ned Batchelder](https://nedbatchelder.com/), a well-known Pythonista and the organizer of the [Python User Group](https://www.meetup.com/bostonpython/) in Boston, summarizes all situations where some sort of assignment is done in Python. The content is intermediate, and, thus, it might be worthwhile to come back to this talk at a later point in time. However, the contents should be known by everyone claiming to be proficient in Python." - ] - }, - { - "cell_type": "code", - "execution_count": 95, - "metadata": { - "slideshow": { - "slide_type": "skip" - } - }, - "outputs": [ - { - "data": { - "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2MBERISGBUYLxoaL2NCOEJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY//AABEIAWgB4AMBIgACEQEDEQH/xAAbAAEAAgMBAQAAAAAAAAAAAAAAAQMCBAUHBv/EAEgQAAIBAwEEBAwDBQUHBQEAAAABAgMEERIFITFRE0Fh0RUWIjM0VXFzgZGTsQYUMkJSVHKhByNTwfBigpKi0uHiJGOUsvFD/8QAFwEBAQEBAAAAAAAAAAAAAAAAAAECA//EACIRAQACAwACAwEAAwAAAAAAAAABAhESEwMhMVFhQSMysf/aAAwDAQACEQMRAD8A8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzpRUqiT4AYA2ugh2/MzpWcq89FGlUqS/dgm3/QDSB1PAt76vu/oy7h4FvfV939GXcBywdTwLe+r7v6Mu4eBb31fd/Rl3AcsHU8C3vq+7+jLuHgW99X3f0ZdwHLB1PAt7/AXf0Zdw8C3v8AAXf0ZdwHLB1PAt76vu/oy7h4FvfV939GXcBywdTwLe+r7v6Mu4eBb31fd/Rl3AcsHU8C3vq+7+jLuHgW99X3f0ZdwHLB1PAt76vu/oy7h4Fvf4C7+jLuA5YOp4FvfV939GXcPAt76vu/oy7gOWDqeBb3+Au/oy7h4FvfV939GXcBywdTwLe+r7v6Mu4eBb31fd/Rl3AcsHU8C3v8Bd/Rl3DwLe/wF39GXcBywdTwLe+r7v6Mu4eBb31fd/Rl3AcsHU8C3vq+7+jLuHgW99X3f0ZdwHLB1PAt76vu/oy7h4FvfV939GXcBywdTwLe/wABd/Rl3DwLe+r7v6Mu4Dlg6ngW99X3f0Zdw8C3vq+7+jLuA5YOp4FvfV939GXcPAt76vu/oy7gOWDcqWnRTcKlOcJrjGSaaMeghyYGqDKaUZyS4JmIAAAAAAAAAAAAAAAAAAAAAALKHno/H7FZZQ87H4gbcIOc4wj+qTSXtPWdj7MobKs4W9CKT/bn1zfNnlll6db+9j90ewR4GZGZJAIJBAAkEACQQSAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMZptxaeMPPEyAHI2ts5XFlUqVYU6lSlFyjJpN43trev6HnW1K9vXqUnbQ0qMFF+Qo7/gerXnoVx7qX2Z47PiaqNGr52XtMDOr52XtMAAAAAAAAAAAAAAAAAAAAAAAWUPOorLKHnV8QOjZenW/vY/dHsEeB4/ZenW/vY/dHsEeBmywzPmLTbVzV2+nK4g7C4q1LejTwsxlBLEs8fKakfS1IudKUFJxcotKS4rtOMvwts6FpQpUqcadajKM43EYR6RuLzlvAhC2/EDuLm7pxtY6bbXqSrLpXp/8Abx19W81Kv4iqXewa97CkqUYypqLoXUZSWqSWH5PkvfvWDoeA1K//ADlW+uJ1YxnGk9MF0ertUcvHVnJTL8M0alK6Va7rVKl04a6jjCL8h5W5JIehje/iKrb3NSlRsoVVTrwt253GhucsYwtL3b+JFx+JalCVxJ7OlK3trhUa1VVluzjDSxv4o0rmx2r4Vubm3o1oXMqy6KemlKloWEm5SepblvSOtW2FRrWt7QlVqKN3X6aTWPJeY7l2eSijWv8A8SVLOrfKOzZ1aVjOCrVFWS3SS3pY3vfw/qWeMToq9/PWU7d2tJVsKopucXuXseeouudhUbmntGEqtRK/cXPGPJ044fIzuNi211WuZ15TlG5oKhOPDcm2mu3eQc+H4spu1vKjoU5VLakq2mjcxqRlFvH6ktzXLBc9v11+cp1NnulWoW35inF1U9UeG/k93DeXT2G6uz7izuNoXFanWgoJyjBOKz1YSz8S6psijVu6tec5t1bb8tKO7GnLefbvAbEvbq+2ZQuLuhClOpCMlonlSTSeez2GqvxA2o0/yj/NSvHauj0nDG/VnHDTv4G9sywezrOFt+Zq14U0owdRRzGKWEtyXIqWxrdbbe1FKfSuONGfJ1YS1Y54WANZfiCK2xCwnSo4qVJU4yp3UZyTSz5UEtyftNatt+4uNlX1xCyq0aVCM100a0U3KMsYjufV147DZs/w1RtKlu4XdxKnbVXVpU5acRbznfjL49bL/AlHwRcbO6Wp0ddzbluytUsso1dq/iDwVGDnSpVIqnGctV1GNTfyhjMv6E334gq21e7p0NnyrxtKcatSfTKPkNZ5cdz3E3f4ao3VS6l+buKcbqEY1oQ04lpWE8tZXDgbNTYtGpK+k6tT/wBbRjRnw8lKLWV8x6Gt4Zu6m3aNpb2kZ287eNZylUUZJNpZ+HIz2Pt2W1a9WMbaFOFPKea6dSLTx5UMZX9Sx7Fgr22uqV1WpVKNGNB6dLVSCecPK+xNrsVUNo/nq13WuK3RumnOMFhN5/ZSzw6yDppgJYGCKAAIAAACQUQCQBAAIAJBRAJIAAkAUXnoVx7qX2Z49Piew3noVx7qX2Z49PiaqNGr52XtMDOr52XtMAAAAAAAAAAAAAAAAAAAAAAAWUPOr4lZZQ86viB0bL06397H7o9gjwPH7L06397H7o9gjwM2VmA+DNOd7RhdxtZSl00llR0veufs3fbmjOWLWw3Aate6o2+jpqsYa3pjqeMsyhXhObjGUm1x3NE2Z6fjYBpyvaMa/QOb6TUo6cPflNr4YT+Rfl82Njp+LQVZfMnL5sbnWFgK8vmRl82Nk6/i0FeXzYy+bGx1WAry+Yy+bG51WAry+bGXzY2Xr+LAV5fNjL5jc6rAV5fMZfMbJ1WAry+Yy+Y3Ov4tBVl82MvmNzqtBVl82MvmN16rQVZfNjL5jdOq0FWXzGXzG51WElWXzGXzG51Wgqy+YyxudVoKsvmWFict1tsqvPQrj3Uvszx2fE9hvPQrj3Uvszx6fE6VaaNXzsvaYGdXzsvaYAAAAAAAAAAAAAAAAAAAAAAAsoedXxKyyh51fEDo2Xp1v72P3R7BHgeP2Xp1v72P3R7BHgZlWT4M0p2tvO7VxJf38cJS1vdue7jweeHWbr4M5tXZ/SbUhfdIlKEdKhoymt/Ht37n1b+ZiXK/y2qlGnV064atL1LsZEKFClNzjSpwnN75KKTZXd2ULtQ1VJR05/TGDzn+aLF/Zq9tJW7nojNrMkt6Sed3J9vUYckKzhPaH51yUpKn0cElwWd+d+//AC3mymmtzTXYU29v0VpChKSemChmC0bsY3Y4EWdpG0oqnGc5rLeZyb+7Ekr1KLxhp54byTn7Ps5Ubm5qzeFOeKdPOdEf1P5ybfswb4lJhIC9o4BAEZWM5WOZK3gCvp6XTdDrXSfulhqKwS2g7p1G28+TjsS/yfzINpyjHGWlncssh1IJPy47tz38Civaupc0q8ZQTgmmpw1ZTae7fue7ialPYyi466kZKOEl0eMpKSWd+9+Vx7AOnrjnGpZxnGSOkhu8uO/hv4nPWymqdSn00XGpTUW3T8pNRS3PPDdwK47Kkq1OMp0tKWW1B5b1at2ZNr+oHSp16VRNwqReG1x61/8AhMqsEm9WcLLUd7x7EaD2dKUWqVelFKrKcWqecZUk09+/9W4mns6rTuOljcwcow0xUoPduS/e7ANuN3Rl0OHLFZaoPS8Pdn4bi1Si+DT3ZNGnZXFOFrFVqUlbrGOiflbsfvcjLZtpK2pyc90pPdHOdMF+mPw/zA3QAAAAEggkAQSCiAAQCSCQILSotN1dvGqvPQrj3Uvszx2fE9hvPQrj3Uvszx6fE7VdWjV87L2mBnV87L2mAAAAAAAAAAAAAAAAAAAAAAALKHnY/ErLKHnV8QOjZenW/vY/dHsEeB4/ZenW/vY/dHsEeBmysn+k5lWF49qQnBy/KJJTjrW+WHvXZwyuvdy39TqwY6FzZmcudomfhqXMLiWn8vUUMZ1ZaX3izG/jcztXG0lprtrTJtJR38XzXYbuhc2NC7TOJY0s0reVenSpRr05bqeak5VE2pbt27j1vJb+Zo/v/wBGbGhc2NC5samkuNKF7m86GjJdJUThJzXDCT4ST6ua3GtO12xOFNyea9OGYVHNaYy6Jx4c9b4n0Whc2NC5svtdbOZYqVsqv5hSpupU1pTlqeMJb2vYydozVexqQpZnvi5xS3ygpLUu3Mc7jpaFzY0LmyY95TSflyoyry2nKEZS/KRgqjeHxaxoxjh+0XbLhOnYU4zTisycYtYcYOTcV8I4Rv6FzY0LmxMSTSzA56ta72s67f8Adb8eV2LG7PtOnoXNjQu0mspzlz72F3KvQ/LZUE05tSx1rKxldWeZRUtrqrbSjUVV1Y1Iy3VViSUs+Tv3buZ19C5saFzY1k5y5VSN/rmqcJuG9xzUX7qSXHnkxpUbtO1dalKpOnUk5TzHdF5S4vPWuZ19C7RoXNjWTnZxan5mhTm6NGVKpKtmENzUk1jfjPDj8DdoUJU7qVSTlJOlCGp9bTl3m7oXNk6FzY1lOcqwZ6FzY0LmxrK87MAZ6FzY0LmxrJzswBnoXaNC7RrJzswBnoXNk6FzY1k52VkmWhc2NC5sayc5Ygy0LmxoXNjWTnZgDPQubGhc2NZOdmBaY6F2mRqsYbpWY+VN56Fce6l9mePT4nsV56Fce6l9meOz4nWro0avnZe0wM6vnZe0wAAAAAAAAAAAAAAAAAAAAAABZQ87H4lZZQ86viB0bL06397H7o9gieP2Xp1v72P3R7BHgZsrN8DDX2GT4HLq2VaptWFzrXRxxuzLqUu3HXyMWmYcr2mPh0tfYNfYc3aVO4q1KVO3lUi3CflRm4pS3Ybx9iupbXzdxoqy0zknHNRp4zvSw9272Gdpc97Otr7AqibeMPG57+ByJ2+0dKjTqvOn9cqnB6Gt6697TK/yN8tXRylDVJtf37bTxHDb/a4PcNpOlnc19g19hpXVK4nSkqdTOZJ6U9D053rV7DUq2t+5t0akoeTiLlWbSWjGGut6t+RtJ0s66qp5xh43PeFVTbxh43PfwONGyvVJOEpwg5uTSrNy/Zw2+vg+J0Lei6dW4k15ypq4/wCzFf5DaTeza19g19hgBtJvZnr7Br7DADaTezPX2DX2GAG0m9mevsGvsMANpN7M9fYNfYYAbSb2Z6+wa+wwA2k3sz19g19hgBtJvZnr7Br7DADaTezPX2DX2GAG0m9mevsGvsMCRtJvZlr7Br7DAkbSb2Za+wa+wxIG0m9mevsMissNVnLpS0z8qrz0K491L7M8dnxPYbz0K491L7M8enxOtXRo1fOy9pgZ1fOy9pgAAAAAAAAAAAAAAAAAAAAAACyh51fErLKHnV8QOjZenW/vY/dHsEeB4/ZenW/vY/dHsEeBmys3wZzp16qv3RfkUVBPPRybnxziS3LGEbtf0er/ACP7FFvZW0qFOUqSbcU28vkI+WZpE+5ct31zRsYOlCrUqaqmddKUspS3LPHg0Xzu7xO5jGnDNOS0Po5aXHVjjzx8O06P5C1/wV82U3VC0tqcZfltblJQjGL4t+1nXMTP+rOlSnVqVbBVdM4zlS1YcNLTxy3mvO5nKlZyUp/qXSLo5Z/T3lFndWlfooOxnOpKCc3TT0puOccf9ZNnZdKnd2ca9a2jFz8qKSawn/vPPt3GLeGYzK1pWFFW5vZRuowWiVOScZRouScdTXPe8LfuN2nUqOtCDkpJ09TxSksvPHPBeziXfkLX/BXzZq1qVtRuZxnQjGlCi6mW+OO3O74o56NTStvUNwbzk1Lq0dP+5sn0md+t7orVFZ4/7RbZStru7qQjaqNJUozg298syks8eHkomjPD9dEFdSztKdOU3RWIpt731GjF0KUbVXNqtdws6o5UIZaxFtvjvXtwxozyj7dIbzkyr21a2rVbW0ceiSkpVYNxmm2t2Gt+7+qLVGE9sTtI2sY0qVOM5ScW86nLr1bl5PJjQ5R9uiDCNjaSSapRafWmzkO+s50YzoWEpOToySlJLMKktMXx7HuGhyj7dok5Erm2o1bmNxYyUKTajKLznEYvHHjmXsLKdW2qVKcI7Mrtyy5ZwtKUtOd7+O7qHM5R9ulvBoUo0sXEZ2inOhWVPEHjUnpae99Slv8AYy+jThSvK8KcdMdMHjPtJNcJPijEzlsAAw4pIAKJIAAkAAACABIAAAAQWlRaaq7eJTeehXHupfZnj0+J7DeehXHupfZnj0+J2q6tGr52XtMDOr52XtMAAAAAAAAAAAAAAAAAAAAAAAWUPOorLKHnV8QOjZenW/vY/dHsEeB4/ZenW/vY/dHsEeBmVKsXKjOK4uLS+RqU617TpxgrWi9KSz07Wf8AlN18PgVmJnDFvJr6wo/M338HQ/8AkP8A6DCtO5r03TrbPtqkHv0yrtr/AOhtAm9mOv5DShCpTlCVPZdnGUIqMXGrjC6l+gsp1bulCMKdjbxjFYSVdpJf8BsgvS0/07fkOT+au2pNV1iMtLarx45xjzXHJH5hSqJ1rK2quVFzdxUrRxKG5PL0cN/IuqbGo1HXc6tVutJT4QxFpt7lpw+PF5ZnRsI0rmnKF1UzSpaOiUaaWn2KOeK6uRdm+341bKtRv7eFa32VYypp5h/fReHued0Xh8O0l1405TlQo2dtNySnOlXim3l4y3T55+Jv0rNUaFvRp1asY0MYw15SSxh7jUew7ZwrU5SqOlWeZwSisrLeNSWrGebJsdvz/qmntGv+YlCVRSUKaqy114qDi89fR9jJhc0acaFKVCzm4PFLpLnLjhrCXkdTaXyNqeyqdXV0latJVKHQVU9P95FZxndx8p8MFUdm2lu6VKdeSnPMYZUIuXlKfBRS/Z+WS7HWJ/jXne2//qKfgyzqKOmc1GompylJxSXk73qT+ZsO+6GdSCtbSnVUFGSjX8pJLKX6OrOcdphHZtvmtToXU5VoqCSk01T0Sc4rCS637cG0tn03dOvKpUeXq6PK0qTjpb4Z4buOBsdY+mpabVjQo2tCjbUKcJ006SlcNbtyS/Tx3ofmreFKpD8ls5U5SWtdNuby8fsb96ePYbUNmQVKnTlWqz6NRjFvTnCkpJbl/spGFrsa3tZJ0pSwpqUVpisYTSWUsteU+LY3TrH0rhcdNPoY7NtJRqU+ki+mzGpFpJ48jfuwvY0bNN16WOj2dawwsLTWxu4/uGats3qryaxCn0cIpcMtN/ZfI2MGZvKdfyGjGnWVOcJWFvUVSp0ktdfOZZTT/R1YWPYi6gqzrVatanCnqUUlGerhnsXM2ASbTKT5ZmMYAAZcgABAAFAkEASQCQIJBBAAJKILSotNVdvGpvPQrj3Uvszx6fE9hvPQrj3Uvszx6fE7VdWjV87L2mBnV87L2mAAAAAAAAAAAAAAAAAAAAAAALKHnY/ErLKHnY/EDo2Xp1v72P3R7BHgeP2Xp1v72P3R7BHgZssMn+krLeox0rkYmMud6zb4YAz0x/0ydMTOssc5Vgs0x5DTHkXWU5y49XZdSVtUUKrjWnVc3JSeHHW2ovKa4djMPBNRRlpnHXO16B1JSblGWJJSzhZ49nA7emPIaI8jt18jWlnJhs6rUrxqXUoOOZPTCctzejHLhpfzM7KxqW1xOpKonGcEmtTflapPO/saXwOnojyGiPIk+S8xg0s5F5s+5r3NedGuqUatF09WcuL04TW7dv7fgYUtn3dKFqtcJ9DXdWWupzjKOFiCX7WeB2tEeQ0R5HP2a2aNnaK2lWeZPpJuW+pKW74m0WaY8hpXImsyk+OZVgs0rkNK5DWU5yrBZpjyGhchrJzlWCzSuQ0rkNZOcsCCzSuQ0rkNZOcqwWaVyGlchrJzlgDPTHkNMeQ1k5ywILNK5DSuQ1k5ywBnpXIaVyGsnOVZJnpXIaVyGsnOVYLNK5DQuQ1lecqy0jSuRkWIw3Ss1UXnoVx7qX2Z49PiexXnoVx7qX2Z47PidattGr52XtMDOr52XtMAAAAAAAAAAAAAAAAAAAAAAAWUPOr4lZZQ86viB0bL06397H7o9gieP2Xp1v72P3R7BHgZssMwCCCQAAAAQAAAAAACQIJAKAAAAAAQSCCCQAIJAAgkEFEggkgAAAAAAIJAgkgBVV56Fce6l9meOz4nsN56Fce6l9mePT4m6o0avnZe0wM6vnZe0wAAAAAAAAAAAAAAAAAAAAAABZQ86viVllDzq+IHRsvTrf3sfuj2CPA8fsvTrf3sfuj2CPAzZYZkEkEEgAIAAAACgAAAJAEAkAQSAAAAAAACASAAIIAAAkEEgfNfjPbt5sOjaSs1SbqykpdJHPDHefK+P22f3bX6b7zr/wBpvo2zv55/aJ5+zUD6nx+2z+7a/TfePH7bP7tr9N958uAPqfH7bP7tr9N95Hj9tn921+m+8+XAH1Hj9tn921+m+8zX47221lQtfpvvPmral0tVI7MbKnGC3ZfNmZmIbrWZbNX8cbZnSnCcLbTJOL/u31/E+ddxN8vkdCtbx1tJbjlzjpm48mWJZmMMZeU23xZGESCojAwSCiMIYJAEYIJfAgAAAAAAAAAAAAAAFlDzqKyyh51fEDo2Xp1v72P3R7BHgeP2Xp1v72P3R7BHgZssMwCCCQAEAAAABRIIJAAAAAAAAAAAAAAAAIIBJBQJBBBJAAHxH9pvo2z/AOep9onwB9//AGm+jbP/AJ6n2ifAPgahQAAAABs2Dxcpamm+tLJ3cdJjFSUeXs/1g+et903U1Rj0a1Ybw5b0sL5nao46PpFLEeKwzF3XxymVJSrLe9y5/wCu04VZ6q05ZynJ4Z2LlSnbykk1nc/YcVrHEtGboABpgDACAAAh8CCXwIKAAAAAAAAAAAAAAWUPOx+JWWUPOx+IHRsvTrf3sfuj2CJ4/ZenW/vY/dHsEeBmyswARAAAAAAAJAgkAoAAAAAAAAEEkEEggkoAgASQSAIJBAEggkD4f+030bZ/89T7RPgOo+//ALTfRtn/AM9T7RPgHwLCgJI6wBlCEpyxFEHQtqeKSWN/FhVNO2S/VvN+hWVKCWhSxwecFeklIxPtqPSytczqR04UY8kak6WrjFSL8N8E37DFxcXvTXY1wEeifbUqWy0twymt+Gap1Tn3EOjqtLg96NRLMwqDAZpkYHWCA+BiS+BBQAAAAAAAAAAAAACyh52JWWUPOr4gdGy9Ot/ex+6PYInj9l6db+9j90ewRM2VmQURvbaVKNRVoaJdeVu4cfmix1qanKLnFNR1PL6uZEWAwlWpwzrnGKWMtvC3mLuKCgputTUXwepY/wBb0BaCr8zQSz01PGnV+tcOYV1buMpKvSajxetbgLQVSuaMf/6JtNJqO/GeHAtyUCSAQSCAUSAQBIIJAAAAACAAAAAAgEkASCCQPh/7TfRtn/z1PtE+AZ9//ab6Ps/+ep9onwlGl01TTqxuznGTUKwO/wDhzZNrtGnUdxGpKSeFpnpSSx2PmcxWK/xP+X/udLZt3PZtCdOioSlN51TjldXV8CTKuxU/DWzYSgnSq4lJRy6vs38O0zjsPZai3BVquXFYWrreFv3GrH8QVPJ129J6WpbvJ3iW3oyg4Ozel9XTyXs+XVyMe2vTansvZ9OiqkLbMZPCblJf5lf5a0e78st+d2qXVjt7Smp+INawrRLfnzjfVgwW3WuFpTxybbHtPTTcGrqvClFqMKkoJtvqf9SitHTUeVjO/jkmdxUncOs5b9Umo9SzxRM5SupxWIppPgX2uYn3/WvqWppmvdw1x1x4x4+w2JW9VVsOOE1xJvKSpWspRnqfW8dRcmJcoMBmmAABB8DEl8CCgAAAAAAAAAAAAAFlDzq+JWZU5KM03wA3qdR0qkakf1QakvgeubOvaO0bOFzbyUoTXxi+tPtPHenh2/I2LTaleym52lzVot8dEms+1dZJjI9bhYQjFf3tWTjFRUnjKSxjq7Catp0lSEnNy8pOTbxuWd2Eu3B5h42bW9YVvku4eNm1vWNb5LuGB6lVoOUVom4y1qbl1/Yqp2EYVXJyeFp0797aabb3deF8jzLxs2t6wrfJdw8bNresa3yXcMD0+VjCVRSdSru4RysL+hMrKnJLy55UnJPdxbb5drPL/Gza3rGt8l3Dxs2t6xrfJdwwPUYWkIakpyxLHkrCSw+SRsYPJvGza3rGt8l3Dxs2t6xrfJdwwPWQeTeNm1vWNb5LuHjZtb1hW+S7iYHrIPJvGza3rCt8l3Dxs2t6xrfJdxcD1kHk3jZtb1jW+S7h42bW9Y1vku4YHrIPJvGza3rGt8l3Dxs2t6xrfJdxMD1oHkvjZtb1jW+S7h42bW9Y1vku4uB60QeTeNm1vWNb5LuHjZtb1jW+S7hgesknkvjZtb1jW+S7h42bW9Y1vku4mB60DyXxs2t6xrfJdw8bNresa3yXcXA9ZB5N42bW9Y1vku4eNm1vWNb5LuJgetA8l8bNresa3yXcPGza3rGt8l3FwPpP7SoSnR2dGEXKTnNJLr3RPjraxuKdVSqQUFj9qSX+Znf7autoqCvLmpV6PLhq6mzXjdUoz1Ri0l1Nk9tRj+unG1b41aa+Lf2RmrWPXW+UTnraUP8ADRktp0eujn2P/sTWXXHj+2/+WpddSb/3V3k/l6H71T5ruNFbUteu3n/xr/pMltWz/hZ/UX/STWV/x/bb/L2/71T5ruI6C3/fq/0ZreFrP+Dn9X/xHhe0/hJ/V/8AEayn+P7bEqNt1Vanxiu8iMKdKWpXC3c4FK2xafwcvq/9hU2xaypyjGz0yaaUnUbx8MDEmfG2lXg15ynPs3r74InWmoOpRjGcorOJPccOtdOpHTpjjOU0ki2x2hK0quUodLFxa0ylzWP8xrj2xN1NzSnQrzp1ViabUlnOHneVM29p38b+5lWjbxouTbai85y8mnk25p6wRkZKD4EE5IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//2Q==\n", - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 95, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import YouTubeVideo\n", - "YouTubeVideo(\"_AEJHKGk9ns\", width=\"60%\")" - ] - }, { "cell_type": "markdown", "metadata": { @@ -3271,7 +3212,7 @@ }, { "cell_type": "code", - "execution_count": 96, + "execution_count": 95, "metadata": { "slideshow": { "slide_type": "slide" @@ -3284,7 +3225,7 @@ "123" ] }, - "execution_count": 96, + "execution_count": 95, "metadata": {}, "output_type": "execute_result" } @@ -3295,7 +3236,7 @@ }, { "cell_type": "code", - "execution_count": 97, + "execution_count": 96, "metadata": {}, "outputs": [ { @@ -3304,7 +3245,7 @@ "42" ] }, - "execution_count": 97, + "execution_count": 96, "metadata": {}, "output_type": "execute_result" } @@ -3322,7 +3263,7 @@ }, { "cell_type": "code", - "execution_count": 98, + "execution_count": 97, "metadata": { "slideshow": { "slide_type": "-" @@ -3335,7 +3276,7 @@ "165" ] }, - "execution_count": 98, + "execution_count": 97, "metadata": {}, "output_type": "execute_result" } @@ -3357,7 +3298,7 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 98, "metadata": { "slideshow": { "slide_type": "-" @@ -3370,7 +3311,7 @@ "4492125" ] }, - "execution_count": 99, + "execution_count": 98, "metadata": {}, "output_type": "execute_result" } @@ -3392,7 +3333,7 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 99, "metadata": { "slideshow": { "slide_type": "-" @@ -3405,7 +3346,7 @@ "3" ] }, - "execution_count": 100, + "execution_count": 99, "metadata": {}, "output_type": "execute_result" } @@ -3427,7 +3368,7 @@ }, { "cell_type": "code", - "execution_count": 101, + "execution_count": 100, "metadata": { "slideshow": { "slide_type": "-" @@ -3440,7 +3381,7 @@ "104" ] }, - "execution_count": 101, + "execution_count": 100, "metadata": {}, "output_type": "execute_result" } @@ -3473,7 +3414,7 @@ }, { "cell_type": "code", - "execution_count": 102, + "execution_count": 101, "metadata": { "slideshow": { "slide_type": "slide" @@ -3487,7 +3428,7 @@ }, { "cell_type": "code", - "execution_count": 103, + "execution_count": 102, "metadata": { "slideshow": { "slide_type": "fragment" @@ -3500,7 +3441,7 @@ "'Hi class'" ] }, - "execution_count": 103, + "execution_count": 102, "metadata": {}, "output_type": "execute_result" } @@ -3522,7 +3463,7 @@ }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 103, "metadata": { "slideshow": { "slide_type": "fragment" @@ -3535,7 +3476,7 @@ "'Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi '" ] }, - "execution_count": 104, + "execution_count": 103, "metadata": {}, "output_type": "execute_result" } @@ -3570,7 +3511,7 @@ }, { "cell_type": "code", - "execution_count": 105, + "execution_count": 104, "metadata": { "slideshow": { "slide_type": "slide" @@ -3583,7 +3524,7 @@ }, { "cell_type": "code", - "execution_count": 106, + "execution_count": 105, "metadata": { "slideshow": { "slide_type": "-" @@ -3607,7 +3548,7 @@ }, { "cell_type": "code", - "execution_count": 107, + "execution_count": 106, "metadata": { "slideshow": { "slide_type": "skip" @@ -3654,7 +3595,7 @@ }, { "cell_type": "code", - "execution_count": 108, + "execution_count": 107, "metadata": { "slideshow": { "slide_type": "slide" @@ -3682,7 +3623,7 @@ }, { "cell_type": "code", - "execution_count": 109, + "execution_count": 108, "metadata": { "slideshow": { "slide_type": "fragment" @@ -3695,7 +3636,7 @@ }, { "cell_type": "code", - "execution_count": 110, + "execution_count": 109, "metadata": { "slideshow": { "slide_type": "-" @@ -3751,7 +3692,7 @@ " - distinct and well-contained areas/parts of the memory that hold the actual data\n", " - the concept by which Python manages the memory for us\n", " - can be classified into objects of the same **type** (i.e., same abstract \"structure\" but different concrete data)\n", - " - built-in objects (incl. **literals**) vs. user-defined objects (cf., Chapter 9)\n", + " - built-in objects (incl. **literals**) vs. user-defined objects (cf., Chapter 10)\n", " - e.g., `1`, `1.0`, and `\"one\"` are three different objects of distinct types that are also literals (i.e., by the way we type them into the command line Python knows what the value and type are)\n", "\n", "\n", @@ -3786,18 +3727,76 @@ " - ignored by Python\n", "\n", "\n", - "- functions (cf., [Chapter 2](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions.ipynb))\n", + "- functions (cf., [Chapter 2](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions_00_content.ipynb))\n", " - named sequences of instructions\n", " - the smaller parts in a larger program\n", " - make a program more modular and thus easier to understand\n", " - include [built-in functions](https://docs.python.org/3/library/functions.html) like [print()](https://docs.python.org/3/library/functions.html#print), [sum()](https://docs.python.org/3/library/functions.html#sum), or [len()](https://docs.python.org/3/library/functions.html#len)\n", "\n", "\n", - "- flow control (cf., [Chapter 3](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals.ipynb))\n", + "- flow control (cf., [Chapter 3](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals_00_content.ipynb))\n", " - expression of **business logic** or an **algorithm**\n", " - conditional execution of parts of a program (e.g., `if` statements)\n", " - repetitive execution of parts of a program (e.g., `for`-loops)" ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "source": [ + "## Further Resources" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "source": [ + "This PyCon 2015 talk by [Ned Batchelder](https://nedbatchelder.com/), a well-known Pythonista and the organizer of the [Python User Group](https://www.meetup.com/bostonpython/) in Boston, summarizes all situations where some sort of assignment is done in Python. The content is intermediate, and, thus, it might be worthwhile to come back to this talk at a later point in time. However, the contents should be known by everyone claiming to be proficient in Python." + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [ + { + "data": { + "image/jpeg": "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\n", + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 110, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "YouTubeVideo(\"_AEJHKGk9ns\", width=\"60%\")" + ] } ], "metadata": { @@ -3816,7 +3815,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.4" }, "livereveal": { "auto_select": "code", @@ -3844,5 +3843,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/01_elements_review_and_exercises.ipynb b/01_elements_10_review.ipynb similarity index 64% rename from 01_elements_review_and_exercises.ipynb rename to 01_elements_10_review.ipynb index 21ba4c5..1c2ee76 100644 --- a/01_elements_review_and_exercises.ipynb +++ b/01_elements_10_review.ipynb @@ -19,7 +19,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Read [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb) of the book. Then work through the ten review questions." + "Read [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb) of the book. Then, work through the questions below." ] }, { @@ -33,7 +33,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Answer the following questions briefly with *at most* 300 characters per question!" + "Answer the following questions *briefly*!" ] }, { @@ -152,7 +152,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q8**: The **Zen of Python** has a high opinion on Indian genius programmers." + "**Q8**: The **Zen of Python** talks about Indian genius programmers." ] }, { @@ -189,92 +189,6 @@ "source": [ " " ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Coding Exercises" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Printing Output" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q11.1**: Read about the [print()](https://docs.python.org/3/library/functions.html#print) built-in. How can you use it to print both `greeting` and `audience` *without* concatenating the two strings with the `+` operator?\n", - "\n", - "Hint: The `*objects` in the documentation implies that we can insert several comma-seperated variables." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "greeting = \"Hello\"\n", - "audience = \"World\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(...)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q11.2**: What does the `sep=\" \"` mean in the documentation? Use it to print out the three names in `first`, `second`, and `third` on one line seperated by commas with one [print()](https://docs.python.org/3/library/functions.html#print) statement." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "first = \"Anthony\"\n", - "second = \"Berta\"\n", - "third = \"Christian\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(...)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q11.3**: Lastly, what does the `end=\"\\n\"` mean in the documentation? Use it in the `for`-loop to print the numbers 1 through 10 in just one line." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for number in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:\n", - " print(...)" - ] } ], "metadata": { @@ -293,7 +207,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.4" }, "toc": { "base_numbering": 1, @@ -310,5 +224,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/01_elements_20_exercises.ipynb b/01_elements_20_exercises.ipynb new file mode 100644 index 0000000..e34097c --- /dev/null +++ b/01_elements_20_exercises.ipynb @@ -0,0 +1,139 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# Chapter 1: Elements of a Program" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Coding Exercises" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Read [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb) of the book. Then, work through the exercises below." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Printing Output" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1.1**: Read about the [print()](https://docs.python.org/3/library/functions.html#print) built-in. How can you use it to print both `greeting` and `audience` *without* concatenating the two strings with the `+` operator?\n", + "\n", + "Hint: The `*objects` in the documentation implies that we can insert several comma-seperated variables." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "greeting = \"Hello\"\n", + "audience = \"World\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(...)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1.2**: What does the `sep=\" \"` mean in the documentation? Use it to print out the three names in `first`, `second`, and `third` on one line seperated by commas with one [print()](https://docs.python.org/3/library/functions.html#print) statement." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "first = \"Anthony\"\n", + "second = \"Berta\"\n", + "third = \"Christian\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(...)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1.3**: Lastly, what does the `end=\"\\n\"` mean in the documentation? Use it in the `for`-loop to print the numbers 1 through 10 in just one line." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for number in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:\n", + " print(...)" + ] + } + ], + "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.4" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": true, + "skip_h1_title": true, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": false, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/02_functions.ipynb b/02_functions_00_content.ipynb similarity index 91% rename from 02_functions.ipynb rename to 02_functions_00_content.ipynb index 39d7084..d0000d8 100644 --- a/02_functions.ipynb +++ b/02_functions_00_content.ipynb @@ -19,7 +19,7 @@ } }, "source": [ - "In [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb#Example:-Averaging-Even-Numbers), we typed the code to calculate the average of the even numbers in a list into several code cells. Then, we executed them one after another. We had no way of **reusing** the code except for either executing cells multiple times or copying and pasting their contents into other cells. And, whenever we find ourselves doing repetitive manual work, we can be sure that there must be a way of automating what we are doing.\n", + "In [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb#Example:-Averaging-Even-Numbers), we typed the code to calculate the average of the even numbers in a list into several code cells. Then, we executed them one after another. We had no way of **reusing** the code except for either executing cells multiple times or copying and pasting their contents into other cells. And, whenever we find ourselves doing repetitive manual work, we can be sure that there must be a way of automating what we are doing.\n", "\n", "At the same time, we executed built-in functions (e.g., [print()](https://docs.python.org/3/library/functions.html#print), [sum()](https://docs.python.org/3/library/functions.html#sum), [len()](https://docs.python.org/3/library/functions.html#len), [id()](https://docs.python.org/3/library/functions.html#id), or [type()](https://docs.python.org/3/library/functions.html#type)) that obviously must be reusing the same parts inside core Python every time we use them.\n", "\n", @@ -45,7 +45,7 @@ } }, "source": [ - "So-called **[user-defined functions](https://docs.python.org/3/reference/compound_stmts.html#function-definitions)** may be created with the `def` statement. To extend an already familiar example, we reuse the introductory example from [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb#Best-Practices) in its final Pythonic version and transform it into the function `average_evens()` below. \n", + "So-called **[user-defined functions](https://docs.python.org/3/reference/compound_stmts.html#function-definitions)** may be created with the `def` statement. To extend an already familiar example, we reuse the introductory example from [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb#Best-Practices) in its final Pythonic version and transform it into the function `average_evens()` below. \n", "\n", "A function's **name** must be chosen according to the same naming rules as ordinary variables as Python manages function names like variables. In this book, we further adopt the convention of ending function names with parentheses `()` in text cells for faster comprehension when reading (i.e., `average_evens()` vs. `average_evens`). These are *not* part of the name but must always be written out in the `def` statement for syntactic reasons.\n", "\n", @@ -57,7 +57,7 @@ "\n", "A function may come with an *explicit* **return value** (i.e., \"result\" or \"output\") specified with the `return` statement (cf., [reference](https://docs.python.org/3/reference/simple_stmts.html#the-return-statement)): Functions that have one are considered **fruitful**; otherwise, they are **void**. Functions of the latter kind are still useful because of their **side effects** as, for example, the built-in [print()](https://docs.python.org/3/library/functions.html#print) function. Strictly speaking, they also have an *implicit* return value of `None`.\n", "\n", - "A function should define a **docstring** that describes what it does in a short subject line, what parameters it expects (i.e., their types), and what it returns (if anything). A docstring is a syntactically valid multi-line string (i.e., type `str`) defined within **triple-double quotes** `\"\"\"`. Strings are covered in depth in [Chapter 6](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text.ipynb#The-str-Type). Widely adopted standards as to how to format a docstring are [PEP 257](https://www.python.org/dev/peps/pep-0257/) and section 3.8 in [Google's Python Style Guide](https://github.com/google/styleguide/blob/gh-pages/pyguide.md)." + "A function should define a **docstring** that describes what it does in a short subject line, what parameters it expects (i.e., their types), and what it returns (if anything). A docstring is a syntactically valid multi-line string (i.e., type `str`) defined within **triple-double quotes** `\"\"\"`. Strings are covered in depth in [Chapter 6](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text_00_content.ipynb#The-str-Type). Widely adopted standards as to how to format a docstring are [PEP 257](https://www.python.org/dev/peps/pep-0257/) and section 3.8 in [Google's Python Style Guide](https://github.com/google/styleguide/blob/gh-pages/pyguide.md)." ] }, { @@ -142,7 +142,7 @@ { "data": { "text/plain": [ - "140384699277792" + "140371816700960" ] }, "execution_count": 3, @@ -241,7 +241,27 @@ "slide_type": "skip" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[0;31mSignature:\u001b[0m \u001b[0maverage_evens\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnumbers\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mDocstring:\u001b[0m\n", + "Calculate the average of all even numbers in a list.\n", + "\n", + "Args:\n", + " numbers (list): a list of numbers; may be integers or floats\n", + "\n", + "Returns:\n", + " float: average\n", + "\u001b[0;31mFile:\u001b[0m ~/repos/intro-to-python/\n", + "\u001b[0;31mType:\u001b[0m function\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "average_evens?" ] @@ -265,7 +285,32 @@ "slide_type": "skip" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[0;31mSignature:\u001b[0m \u001b[0maverage_evens\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnumbers\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mSource:\u001b[0m \n", + "\u001b[0;32mdef\u001b[0m \u001b[0maverage_evens\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnumbers\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"Calculate the average of all even numbers in a list.\u001b[0m\n", + "\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m Args:\u001b[0m\n", + "\u001b[0;34m numbers (list): a list of numbers; may be integers or floats\u001b[0m\n", + "\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m Returns:\u001b[0m\n", + "\u001b[0;34m float: average\u001b[0m\n", + "\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mevens\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mn\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mnumbers\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mn\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;36m2\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0maverage\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mevens\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mevens\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0maverage\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mFile:\u001b[0m ~/repos/intro-to-python/\n", + "\u001b[0;31mType:\u001b[0m function\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "average_evens??" ] @@ -337,12 +382,71 @@ } }, "source": [ - "The return value is commonly assigned to a variable for later reference. Otherwise, we would lose access to it in memory right away." + "If we are ever unsure if a variable references a `function` object that may be called, we can verify that with the built-in [callable()](https://docs.python.org/3/library/functions.html#callable) function that takes any object as its only argument and tells us `True` if that is **callable** and `False` otherwise." ] }, { "cell_type": "code", "execution_count": 10, + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "callable(average_evens)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "callable(nums)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "source": [ + "The return value is commonly assigned to a variable for later reference. Otherwise, we would lose access to it in memory right away." + ] + }, + { + "cell_type": "code", + "execution_count": 12, "metadata": { "slideshow": { "slide_type": "fragment" @@ -355,7 +459,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "metadata": { "slideshow": { "slide_type": "-" @@ -368,7 +472,7 @@ "7.0" ] }, - "execution_count": 11, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -412,7 +516,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "metadata": { "slideshow": { "slide_type": "slide" @@ -426,7 +530,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnumbers\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnumbers\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'numbers' is not defined" ] } @@ -437,7 +541,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "metadata": { "slideshow": { "slide_type": "-" @@ -451,7 +555,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mevens\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mevens\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'evens' is not defined" ] } @@ -462,7 +566,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "metadata": { "slideshow": { "slide_type": "skip" @@ -476,7 +580,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0maverage\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0maverage\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'average' is not defined" ] } @@ -520,7 +624,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 17, "metadata": { "slideshow": { "slide_type": "slide" @@ -555,7 +659,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 18, "metadata": { "slideshow": { "slide_type": "slide" @@ -568,7 +672,7 @@ "[7, 11, 8, 5, 3, 12, 2, 6, 9, 10, 1, 4]" ] }, - "execution_count": 16, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -590,7 +694,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 19, "metadata": { "slideshow": { "slide_type": "-" @@ -603,7 +707,7 @@ "7.0" ] }, - "execution_count": 17, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -625,7 +729,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 20, "metadata": { "slideshow": { "slide_type": "-" @@ -638,7 +742,7 @@ "7.0" ] }, - "execution_count": 18, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -657,7 +761,7 @@ "source": [ "[PythonTutor](http://pythontutor.com/visualize.html#code=nums%20%3D%20%5B1,%202,%203,%204,%205,%206,%207,%208,%209,%2010,%2011,%2012%5D%0A%0Adef%20average_wrong%28numbers%29%3A%0A%20%20%20%20evens%20%3D%20%5Bn%20for%20n%20in%20nums%20if%20n%20%25%202%20%3D%3D%200%5D%0A%20%20%20%20average%20%3D%20sum%28evens%29%20/%20len%28evens%29%0A%20%20%20%20return%20average%0A%0Arv%20%3D%20average_wrong%28%5B123,%20456,%20789%5D%29&cumulative=false&curInstr=0&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false) is again helpful at visualizing the error interactively: Creating the `list` object `evens` eventually references takes *16* computational steps, namely two for managing the list comprehension, one for setting up an empty `list` object, *twelve* for filling it with elements derived from `nums` in the global scope (i.e., that is the error), and one to make `evens` reference it (cf., steps 6-21).\n", "\n", - "The frames logic shown by PythonTutor is the mechanism by which Python not only manages the names inside *one* function call but also for *many* potentially *simultaneous* calls, as revealed in [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration.ipynb#Trivial-Example:-Countdown). It is the reason why we may reuse the same names for the parameters and variables inside both `average_evens()` and `average_wrong()` without Python mixing them up. So, as we already read in the [Zen of Python](https://www.python.org/dev/peps/pep-0020/), \"namespaces are one honking great idea\" (cf., `import this`), and a frame is just a special kind of namespace." + "The frames logic shown by PythonTutor is the mechanism by which Python not only manages the names inside *one* function call but also for *many* potentially *simultaneous* calls, as revealed in [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_00_content.ipynb#Trivial-Example:-Countdown). It is the reason why we may reuse the same names for the parameters and variables inside both `average_evens()` and `average_wrong()` without Python mixing them up. So, as we already read in the [Zen of Python](https://www.python.org/dev/peps/pep-0020/), \"namespaces are one honking great idea\" (cf., `import this`), and a frame is just a special kind of namespace." ] }, { @@ -686,7 +790,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 21, "metadata": { "slideshow": { "slide_type": "slide" @@ -722,7 +826,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 22, "metadata": { "slideshow": { "slide_type": "slide" @@ -735,7 +839,7 @@ "[7, 11, 8, 5, 3, 12, 2, 6, 9, 10, 1, 4]" ] }, - "execution_count": 20, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -757,7 +861,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 23, "metadata": { "slideshow": { "slide_type": "-" @@ -770,7 +874,7 @@ "3.0" ] }, - "execution_count": 21, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -792,7 +896,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 24, "metadata": { "slideshow": { "slide_type": "-" @@ -805,7 +909,7 @@ "6.0" ] }, - "execution_count": 22, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -827,7 +931,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 25, "metadata": { "slideshow": { "slide_type": "-" @@ -840,7 +944,7 @@ "[7, 11, 8, 5, 3, 12, 2, 6, 9, 10, 1, 4]" ] }, - "execution_count": 23, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -892,7 +996,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 26, "metadata": { "slideshow": { "slide_type": "slide" @@ -905,7 +1009,7 @@ "12" ] }, - "execution_count": 24, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -916,7 +1020,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 27, "metadata": { "slideshow": { "slide_type": "-" @@ -929,7 +1033,7 @@ "78" ] }, - "execution_count": 25, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -951,7 +1055,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 28, "metadata": { "slideshow": { "slide_type": "slide" @@ -964,7 +1068,7 @@ "7.0" ] }, - "execution_count": 26, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -975,7 +1079,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 29, "metadata": { "slideshow": { "slide_type": "-" @@ -988,7 +1092,7 @@ "7" ] }, - "execution_count": 27, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -999,7 +1103,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 30, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1012,7 +1116,7 @@ "7" ] }, - "execution_count": 28, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -1034,7 +1138,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 31, "metadata": { "slideshow": { "slide_type": "slide" @@ -1047,7 +1151,7 @@ "7" ] }, - "execution_count": 29, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -1058,7 +1162,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 32, "metadata": { "slideshow": { "slide_type": "-" @@ -1071,7 +1175,7 @@ "8" ] }, - "execution_count": 30, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -1093,7 +1197,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 33, "metadata": { "slideshow": { "slide_type": "slide" @@ -1107,7 +1211,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"seven\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"seven\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mValueError\u001b[0m: invalid literal for int() with base 10: 'seven'" ] } @@ -1129,7 +1233,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 34, "metadata": { "slideshow": { "slide_type": "skip" @@ -1142,7 +1246,7 @@ "42.0" ] }, - "execution_count": 32, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } @@ -1170,12 +1274,12 @@ } }, "source": [ - "So far, we have only specified one parameter in each of our user-defined functions. In [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb#%28Arithmetic%29-Operators), however, we saw the built-in function [divmod()](https://docs.python.org/3/library/functions.html#divmod) take two arguments. And, the order of the numbers passed in mattered! Whenever we call a function and list its arguments in a comma separated manner, we say that we pass in the arguments by position or refer to them as **positional arguments**." + "So far, we have only specified one parameter in each of our user-defined functions. In [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb#%28Arithmetic%29-Operators), however, we saw the built-in function [divmod()](https://docs.python.org/3/library/functions.html#divmod) take two arguments. And, the order of the numbers passed in mattered! Whenever we call a function and list its arguments in a comma separated manner, we say that we pass in the arguments by position or refer to them as **positional arguments**." ] }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 35, "metadata": { "slideshow": { "slide_type": "slide" @@ -1188,7 +1292,7 @@ "(4, 2)" ] }, - "execution_count": 33, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -1199,7 +1303,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 36, "metadata": { "slideshow": { "slide_type": "-" @@ -1212,7 +1316,7 @@ "(0, 10)" ] }, - "execution_count": 34, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -1234,7 +1338,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 37, "metadata": { "slideshow": { "slide_type": "slide" @@ -1271,7 +1375,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 38, "metadata": { "slideshow": { "slide_type": "slide" @@ -1284,7 +1388,7 @@ "14.0" ] }, - "execution_count": 36, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -1306,54 +1410,6 @@ "Luckily, we may also reference the formal parameter names as **keyword arguments**. We can even combine positional and keyword arguments in the same function call. Each of the following does the *same*." ] }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "14.0" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "scaled_average_evens(nums, scalar=2)" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "14.0" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "scaled_average_evens(numbers=nums, scalar=2)" - ] - }, { "cell_type": "code", "execution_count": 39, @@ -1374,6 +1430,54 @@ "output_type": "execute_result" } ], + "source": [ + "scaled_average_evens(nums, scalar=2)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "14.0" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "scaled_average_evens(numbers=nums, scalar=2)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "14.0" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "scaled_average_evens(scalar=2, numbers=nums)" ] @@ -1391,7 +1495,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 42, "metadata": { "slideshow": { "slide_type": "slide" @@ -1400,10 +1504,10 @@ "outputs": [ { "ename": "SyntaxError", - "evalue": "positional argument follows keyword argument (, line 1)", + "evalue": "positional argument follows keyword argument (, line 1)", "output_type": "error", "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m scaled_average_evens(numbers=nums, 2)\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m positional argument follows keyword argument\n" + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m scaled_average_evens(numbers=nums, 2)\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m positional argument follows keyword argument\n" ] } ], @@ -1439,7 +1543,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 43, "metadata": { "slideshow": { "slide_type": "slide" @@ -1450,7 +1554,13 @@ "def scaled_average_evens(numbers, scalar):\n", " \"\"\"Calculate a scaled average of all even numbers in a list.\n", "\n", - " ...\n", + " Args:\n", + " numbers (list): a list of numbers; may be integers or floats\n", + " scalar (float): the scalar that multiplies the average\n", + " of the even numbers\n", + "\n", + " Returns:\n", + " float: scaled average\n", " \"\"\"\n", " evens = [n for n in numbers if n % 2 == 0]\n", " average = sum(evens) / len(evens)\n", @@ -1459,7 +1569,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 44, "metadata": { "slideshow": { "slide_type": "-" @@ -1470,7 +1580,11 @@ "def average_evens(numbers):\n", " \"\"\"Calculate the average of all even numbers in a list.\n", "\n", - " ...\n", + " Args:\n", + " numbers (list): a list of numbers; may be integers or floats\n", + "\n", + " Returns:\n", + " float: average\n", " \"\"\"\n", " return scaled_average_evens(numbers, scalar=1) # refactored to use the logic in scaled_average_evens()" ] @@ -1488,7 +1602,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 45, "metadata": { "slideshow": { "slide_type": "-" @@ -1501,7 +1615,7 @@ "7.0" ] }, - "execution_count": 43, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } @@ -1523,7 +1637,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 46, "metadata": { "slideshow": { "slide_type": "slide" @@ -1562,7 +1676,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 47, "metadata": { "slideshow": { "slide_type": "slide" @@ -1575,7 +1689,7 @@ "7.0" ] }, - "execution_count": 45, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } @@ -1586,7 +1700,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 48, "metadata": { "slideshow": { "slide_type": "-" @@ -1599,7 +1713,7 @@ "14.0" ] }, - "execution_count": 46, + "execution_count": 48, "metadata": {}, "output_type": "execute_result" } @@ -1610,7 +1724,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 49, "metadata": { "slideshow": { "slide_type": "-" @@ -1623,7 +1737,7 @@ "14.0" ] }, - "execution_count": 47, + "execution_count": 49, "metadata": {}, "output_type": "execute_result" } @@ -1658,7 +1772,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 50, "metadata": { "slideshow": { "slide_type": "slide" @@ -1695,7 +1809,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 51, "metadata": { "slideshow": { "slide_type": "slide" @@ -1708,7 +1822,7 @@ "7.0" ] }, - "execution_count": 49, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" } @@ -1719,7 +1833,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 52, "metadata": { "slideshow": { "slide_type": "-" @@ -1732,7 +1846,7 @@ "14.0" ] }, - "execution_count": 50, + "execution_count": 52, "metadata": {}, "output_type": "execute_result" } @@ -1754,7 +1868,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 53, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1768,7 +1882,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0maverage_evens\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnums\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0maverage_evens\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnums\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: average_evens() takes 1 positional argument but 2 were given" ] } @@ -1811,7 +1925,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 54, "metadata": { "slideshow": { "slide_type": "slide" @@ -1824,7 +1938,7 @@ "(x)>" ] }, - "execution_count": 52, + "execution_count": 54, "metadata": {}, "output_type": "execute_result" } @@ -1850,7 +1964,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 55, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1874,7 +1988,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 56, "metadata": { "slideshow": { "slide_type": "-" @@ -1887,7 +2001,7 @@ "13" ] }, - "execution_count": 54, + "execution_count": 56, "metadata": {}, "output_type": "execute_result" } @@ -1909,7 +2023,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 57, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1922,7 +2036,7 @@ "42" ] }, - "execution_count": 55, + "execution_count": 57, "metadata": {}, "output_type": "execute_result" } @@ -1941,7 +2055,7 @@ "source": [ "The main point of having functions without a name is to use them in a situation where we know ahead of time that we use the function only *once*.\n", "\n", - "Popular applications of lambda expressions occur in combination with the **map-filter-reduce** paradigm or when we do \"number crunching\" with **arrays** and **data frames**. We look at both in detail in [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences.ipynb)." + "Popular applications of lambda expressions occur in combination with the **map-filter-reduce** paradigm or when we do \"number crunching\" with **arrays** and **data frames**. We look at both in detail in [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_00_content.ipynb)." ] }, { @@ -2026,7 +2140,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 58, "metadata": { "slideshow": { "slide_type": "slide" @@ -2050,7 +2164,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 59, "metadata": { "slideshow": { "slide_type": "fragment" @@ -2060,10 +2174,10 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 57, + "execution_count": 59, "metadata": {}, "output_type": "execute_result" } @@ -2074,7 +2188,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 60, "metadata": { "slideshow": { "slide_type": "fragment" @@ -2084,10 +2198,10 @@ { "data": { "text/plain": [ - "140384754610488" + "140371899337520" ] }, - "execution_count": 58, + "execution_count": 60, "metadata": {}, "output_type": "execute_result" } @@ -2098,7 +2212,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 61, "metadata": { "slideshow": { "slide_type": "-" @@ -2111,7 +2225,7 @@ "module" ] }, - "execution_count": 59, + "execution_count": 61, "metadata": {}, "output_type": "execute_result" } @@ -2137,7 +2251,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 62, "metadata": { "slideshow": { "slide_type": "slide" @@ -2205,7 +2319,7 @@ " 'trunc']" ] }, - "execution_count": 60, + "execution_count": 62, "metadata": {}, "output_type": "execute_result" } @@ -2227,7 +2341,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 63, "metadata": { "slideshow": { "slide_type": "slide" @@ -2240,7 +2354,7 @@ "3.141592653589793" ] }, - "execution_count": 61, + "execution_count": 63, "metadata": {}, "output_type": "execute_result" } @@ -2251,7 +2365,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 64, "metadata": { "slideshow": { "slide_type": "-" @@ -2264,7 +2378,7 @@ "2.718281828459045" ] }, - "execution_count": 62, + "execution_count": 64, "metadata": {}, "output_type": "execute_result" } @@ -2275,7 +2389,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 65, "metadata": { "slideshow": { "slide_type": "slide" @@ -2288,7 +2402,7 @@ "" ] }, - "execution_count": 63, + "execution_count": 65, "metadata": {}, "output_type": "execute_result" } @@ -2299,7 +2413,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 66, "metadata": { "slideshow": { "slide_type": "-" @@ -2324,7 +2438,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 67, "metadata": { "slideshow": { "slide_type": "-" @@ -2337,7 +2451,7 @@ "1.4142135623730951" ] }, - "execution_count": 65, + "execution_count": 67, "metadata": {}, "output_type": "execute_result" } @@ -2356,14 +2470,14 @@ "source": [ "Observe how the arguments passed to functions do not need to be just variables or simple literals. Instead, we may pass in any *expression* that evaluates to a *new* object of the type the function expects.\n", "\n", - "So just as a reminder from the expression vs. statement discussion in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb#Expressions): An expression is *any* syntactically correct combination of variables and literals with operators. And the call operator `()` is yet another operator. So both of the next two code cells are just expressions! They have no permanent side effects in memory. We may execute them as often as we want *without* changing the state of the program (i.e., this Jupyter notebook).\n", + "So just as a reminder from the expression vs. statement discussion in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb#Expressions): An expression is *any* syntactically correct combination of variables and literals with operators. And the call operator `()` is yet another operator. So both of the next two code cells are just expressions! They have no permanent side effects in memory. We may execute them as often as we want *without* changing the state of the program (i.e., this Jupyter notebook).\n", "\n", "So, regarding the very next cell in particular: Although the `2 ** 2` creates a *new* object `4` in memory that is then immediately passed into the [math.sqrt()](https://docs.python.org/3/library/math.html#math.sqrt) function, once that function call returns, \"all is lost\" and the newly created `4` object is forgotten again, as well as the return value of [math.sqrt()](https://docs.python.org/3/library/math.html#math.sqrt)." ] }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 68, "metadata": { "slideshow": { "slide_type": "-" @@ -2376,7 +2490,7 @@ "2.0" ] }, - "execution_count": 66, + "execution_count": 68, "metadata": {}, "output_type": "execute_result" } @@ -2398,7 +2512,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 69, "metadata": { "slideshow": { "slide_type": "-" @@ -2411,7 +2525,7 @@ "10.0" ] }, - "execution_count": 67, + "execution_count": 69, "metadata": {}, "output_type": "execute_result" } @@ -2435,7 +2549,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 70, "metadata": { "slideshow": { "slide_type": "skip" @@ -2448,7 +2562,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 71, "metadata": { "slideshow": { "slide_type": "skip" @@ -2461,7 +2575,7 @@ "4.0" ] }, - "execution_count": 69, + "execution_count": 71, "metadata": {}, "output_type": "execute_result" } @@ -2494,7 +2608,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 72, "metadata": { "slideshow": { "slide_type": "slide" @@ -2507,7 +2621,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 73, "metadata": { "slideshow": { "slide_type": "-" @@ -2517,10 +2631,10 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 71, + "execution_count": 73, "metadata": {}, "output_type": "execute_result" } @@ -2537,12 +2651,12 @@ } }, "source": [ - "Besides the usual dunder-style attributes, the built-in [dir()](https://docs.python.org/3/library/functions.html#dir) function lists some attributes in an upper case naming convention and many others starting with a *single* underscore `_`. To understand the former, we must wait until Chapter 9, while the latter is explained further below." + "Besides the usual dunder-style attributes, the built-in [dir()](https://docs.python.org/3/library/functions.html#dir) function lists some attributes in an upper case naming convention and many others starting with a *single* underscore `_`. To understand the former, we must wait until Chapter 10, while the latter is explained further below." ] }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 74, "metadata": { "slideshow": { "slide_type": "slide" @@ -2616,7 +2730,7 @@ " 'weibullvariate']" ] }, - "execution_count": 72, + "execution_count": 74, "metadata": {}, "output_type": "execute_result" } @@ -2638,7 +2752,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 75, "metadata": { "slideshow": { "slide_type": "slide" @@ -2651,7 +2765,7 @@ "" ] }, - "execution_count": 73, + "execution_count": 75, "metadata": {}, "output_type": "execute_result" } @@ -2662,7 +2776,7 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 76, "metadata": { "slideshow": { "slide_type": "-" @@ -2687,7 +2801,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 77, "metadata": { "slideshow": { "slide_type": "-" @@ -2697,10 +2811,10 @@ { "data": { "text/plain": [ - "0.17184403163109208" + "0.64575874518665" ] }, - "execution_count": 75, + "execution_count": 77, "metadata": {}, "output_type": "execute_result" } @@ -2722,7 +2836,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 78, "metadata": { "slideshow": { "slide_type": "slide" @@ -2732,10 +2846,10 @@ { "data": { "text/plain": [ - ">" + ">" ] }, - "execution_count": 76, + "execution_count": 78, "metadata": {}, "output_type": "execute_result" } @@ -2746,7 +2860,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 79, "metadata": { "slideshow": { "slide_type": "-" @@ -2771,7 +2885,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 80, "metadata": { "slideshow": { "slide_type": "-" @@ -2781,10 +2895,10 @@ { "data": { "text/plain": [ - "2" + "12" ] }, - "execution_count": 78, + "execution_count": 80, "metadata": {}, "output_type": "execute_result" } @@ -2808,7 +2922,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 81, "metadata": { "slideshow": { "slide_type": "slide" @@ -2821,7 +2935,7 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": 82, "metadata": { "slideshow": { "slide_type": "fragment" @@ -2834,7 +2948,7 @@ "0.6394267984578837" ] }, - "execution_count": 80, + "execution_count": 82, "metadata": {}, "output_type": "execute_result" } @@ -2845,7 +2959,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 83, "metadata": { "slideshow": { "slide_type": "-" @@ -2858,7 +2972,7 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 84, "metadata": { "slideshow": { "slide_type": "-" @@ -2871,7 +2985,7 @@ "0.6394267984578837" ] }, - "execution_count": 82, + "execution_count": 84, "metadata": {}, "output_type": "execute_result" } @@ -2927,16 +3041,16 @@ } }, "source": [ - "[numpy](http://www.numpy.org/) is the de-facto standard in the Python world for handling **array-like** data. That is a fancy word for data that can be put into a matrix or vector format. We look at it in depth in [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences.ipynb).\n", + "[numpy](http://www.numpy.org/) is the de-facto standard in the Python world for handling **array-like** data. That is a fancy word for data that can be put into a matrix or vector format. We look at it in depth in [Chapter 9](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/09_arrays_00_content.ipynb).\n", "\n", - "As [numpy](http://www.numpy.org/) is *not* in the [standard library](https://docs.python.org/3/library/index.html), it must be *manually* installed, for example, with the [pip](https://pip.pypa.io/en/stable/) tool. As mentioned in [Chapter 0](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/00_start_up.ipynb#Markdown-vs.-Code-Cells), to execute terminal commands from within a Jupyter notebook, we start a code cell with an exclamation mark.\n", + "As [numpy](http://www.numpy.org/) is *not* in the [standard library](https://docs.python.org/3/library/index.html), it must be *manually* installed, for example, with the [pip](https://pip.pypa.io/en/stable/) tool. As mentioned in [Chapter 0](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/00_start_up_00_content.ipynb#Markdown-vs.-Code-Cells), to execute terminal commands from within a Jupyter notebook, we start a code cell with an exclamation mark.\n", "\n", "If you are running this notebook with an installation of the [Anaconda Distribution](https://www.anaconda.com/distribution/), then [numpy](http://www.numpy.org/) is probably already installed. Running the cell below confirms that." ] }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 85, "metadata": { "slideshow": { "slide_type": "slide" @@ -2947,7 +3061,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Requirement already satisfied: numpy in /home/webartifex/.pyenv/versions/anaconda3-2019.07/lib/python3.7/site-packages (1.16.4)\r\n" + "Requirement already satisfied: numpy in /home/webartifex/.pyenv/versions/anaconda3-2019.10/lib/python3.7/site-packages (1.17.2)\n" ] } ], @@ -2968,7 +3082,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 86, "metadata": { "slideshow": { "slide_type": "slide" @@ -2992,7 +3106,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 87, "metadata": { "slideshow": { "slide_type": "fragment" @@ -3002,10 +3116,10 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 85, + "execution_count": 87, "metadata": {}, "output_type": "execute_result" } @@ -3027,7 +3141,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 88, "metadata": { "slideshow": { "slide_type": "slide" @@ -3040,7 +3154,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 89, "metadata": { "slideshow": { "slide_type": "fragment" @@ -3053,7 +3167,7 @@ "array([ 7, 11, 8, 5, 3, 12, 2, 6, 9, 10, 1, 4])" ] }, - "execution_count": 87, + "execution_count": 89, "metadata": {}, "output_type": "execute_result" } @@ -3064,7 +3178,7 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 90, "metadata": { "slideshow": { "slide_type": "-" @@ -3077,7 +3191,7 @@ "numpy.ndarray" ] }, - "execution_count": 88, + "execution_count": 90, "metadata": {}, "output_type": "execute_result" } @@ -3101,7 +3215,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 91, "metadata": { "slideshow": { "slide_type": "slide" @@ -3114,7 +3228,7 @@ "array([14, 22, 16, 10, 6, 24, 4, 12, 18, 20, 2, 8])" ] }, - "execution_count": 89, + "execution_count": 91, "metadata": {}, "output_type": "execute_result" } @@ -3136,7 +3250,7 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 92, "metadata": { "slideshow": { "slide_type": "fragment" @@ -3149,7 +3263,7 @@ "[7, 11, 8, 5, 3, 12, 2, 6, 9, 10, 1, 4, 7, 11, 8, 5, 3, 12, 2, 6, 9, 10, 1, 4]" ] }, - "execution_count": 90, + "execution_count": 92, "metadata": {}, "output_type": "execute_result" } @@ -3171,7 +3285,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 93, "metadata": { "slideshow": { "slide_type": "fragment" @@ -3184,7 +3298,7 @@ "78" ] }, - "execution_count": 91, + "execution_count": 93, "metadata": {}, "output_type": "execute_result" } @@ -3195,7 +3309,7 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": 94, "metadata": { "slideshow": { "slide_type": "-" @@ -3208,7 +3322,7 @@ "7" ] }, - "execution_count": 92, + "execution_count": 94, "metadata": {}, "output_type": "execute_result" } @@ -3247,7 +3361,7 @@ }, { "cell_type": "code", - "execution_count": 93, + "execution_count": 95, "metadata": { "slideshow": { "slide_type": "slide" @@ -3260,7 +3374,7 @@ }, { "cell_type": "code", - "execution_count": 94, + "execution_count": 96, "metadata": { "slideshow": { "slide_type": "fragment" @@ -3273,7 +3387,7 @@ "" ] }, - "execution_count": 94, + "execution_count": 96, "metadata": {}, "output_type": "execute_result" } @@ -3299,7 +3413,7 @@ }, { "cell_type": "code", - "execution_count": 95, + "execution_count": 97, "metadata": { "slideshow": { "slide_type": "fragment" @@ -3324,7 +3438,7 @@ " 'average_odds']" ] }, - "execution_count": 95, + "execution_count": 97, "metadata": {}, "output_type": "execute_result" } @@ -3346,7 +3460,7 @@ }, { "cell_type": "code", - "execution_count": 96, + "execution_count": 98, "metadata": { "slideshow": { "slide_type": "slide" @@ -3379,7 +3493,7 @@ }, { "cell_type": "code", - "execution_count": 97, + "execution_count": 99, "metadata": { "slideshow": { "slide_type": "slide" @@ -3392,7 +3506,7 @@ "7.0" ] }, - "execution_count": 97, + "execution_count": 99, "metadata": {}, "output_type": "execute_result" } @@ -3403,7 +3517,7 @@ }, { "cell_type": "code", - "execution_count": 98, + "execution_count": 100, "metadata": { "slideshow": { "slide_type": "-" @@ -3416,7 +3530,7 @@ "14.0" ] }, - "execution_count": 98, + "execution_count": 100, "metadata": {}, "output_type": "execute_result" } @@ -3433,7 +3547,7 @@ } }, "source": [ - "Packages are a generalization of modules, and we look at one in detail in Chapter 9. You may, however, already look at a [sample package](https://github.com/webartifex/intro-to-python/tree/master/sample_package) in the repository, which is nothing but a folder with *.py* files in it.\n", + "Packages are a generalization of modules, and we look at one in detail in Chapter 10. You may, however, already look at a [sample package](https://github.com/webartifex/intro-to-python/tree/master/sample_package) in the repository, which is nothing but a folder with *.py* files in it.\n", "\n", "As a further reading on modules and packages, we refer to the [official tutorial](https://docs.python.org/3/tutorial/modules.html)." ] @@ -3494,7 +3608,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.4" }, "livereveal": { "auto_select": "code", @@ -3522,5 +3636,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/02_functions_review_and_exercises.ipynb b/02_functions_10_review.ipynb similarity index 50% rename from 02_functions_review_and_exercises.ipynb rename to 02_functions_10_review.ipynb index ca631a7..a320a3d 100644 --- a/02_functions_review_and_exercises.ipynb +++ b/02_functions_10_review.ipynb @@ -18,7 +18,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Read [Chapter 2](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions.ipynb) of the book. Then work through the ten review questions." + "Read [Chapter 2](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions_00_content.ipynb) of the book. Then, work through the questions below." ] }, { @@ -32,14 +32,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Answer the following questions briefly with *at most* 300 characters per question!" + "Answer the following questions *briefly*!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "**Q1**: What property of the `def` statement makes it a **statement**? Is there a way to use an **expression** to create a function?" + "**Q1**: What behavior of the `def` statement makes it a **statement**? Is there a way to use an **expression** to create a function?" ] }, { @@ -182,188 +182,6 @@ "**Q10**: The [standard library](https://docs.python.org/3/library/index.html) is a collection of numerical tools often used in scientific computing, for example, advanced mathematical functions or utilities for simulation." ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Coding Exercises" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Volume of a Sphere" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q11.1**: The [volume of a sphere](https://en.wikipedia.org/wiki/Sphere) is defined as $\\frac{4}{3} * \\pi * r^3$. Calculate this value for $r=10.0$ and round it to 10 digits after the comma. Use the [standard library](https://docs.python.org/3/library/index.html) to obtain a good approximation of $\\pi$." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import ..." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "r = ..." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "..." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q11.2**: Encapsulate the logic into a function `sphere_volume()` that takes one *positional* argument `radius` and one *keyword-only* argument `digits` defaulting to `5`. The volume should be returned as a `float` object under *all* circumstances. Document your work appropriately in a docstring according to [Google's Python Style Guide](https://github.com/google/styleguide/blob/gh-pages/pyguide.md)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def sphere_volume(...):\n", - " ..." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q11.3**: Evaluate the function with `radius = 100.0` and 1, 5, 10, 15, and 20 digits respectively." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "radius = ..." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sphere_volume(...)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sphere_volume(...)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sphere_volume(...)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sphere_volume(...)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sphere_volume(...)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q11.4**: What observation do you make?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q11.5**: Using the [range()](https://docs.python.org/3/library/functions.html#func-range) built-in, write a `for`-loop and calculate the volume of a sphere with `radius = 42.0` for all `digits` from `1` through `20`. Print out each volume on a separate line.\n", - "\n", - "Note: This is the first task where you need to use the built-in [print()](https://docs.python.org/3/library/functions.html#print) function." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "radius = ..." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for ... in ...:\n", - " ..." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q11.6**: What lesson do you learn about the `float` type?" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -388,7 +206,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.4" }, "toc": { "base_numbering": 1, @@ -405,5 +223,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/02_functions_20_exercises.ipynb b/02_functions_20_exercises.ipynb new file mode 100644 index 0000000..0f449e4 --- /dev/null +++ b/02_functions_20_exercises.ipynb @@ -0,0 +1,234 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Chapter 2: Functions & Modularization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Coding Exercises" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Read [Chapter 2](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions_00_content.ipynb) of the book. Then, work through the exercises below." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Volume of a Sphere" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1.1**: The [volume of a sphere](https://en.wikipedia.org/wiki/Sphere) is defined as $\\frac{4}{3} * \\pi * r^3$. Calculate this value for $r=10.0$ and round it to 10 digits after the comma. Use the [standard library](https://docs.python.org/3/library/index.html) to obtain a good approximation of $\\pi$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import ..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "r = ..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1.2**: Encapsulate the logic into a function `sphere_volume()` that takes one *positional* argument `radius` and one *keyword-only* argument `digits` defaulting to `5`. The volume should be returned as a `float` object under *all* circumstances. Document your work appropriately in a docstring according to [Google's Python Style Guide](https://github.com/google/styleguide/blob/gh-pages/pyguide.md)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def sphere_volume(...):\n", + " ..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1.3**: Evaluate the function with `radius = 100.0` and 1, 5, 10, 15, and 20 digits respectively." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "radius = ..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sphere_volume(...)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sphere_volume(...)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sphere_volume(...)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sphere_volume(...)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sphere_volume(...)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1.4**: What observation do you make?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1.5**: Using the [range()](https://docs.python.org/3/library/functions.html#func-range) built-in, write a `for`-loop and calculate the volume of a sphere with `radius = 42.0` for all `digits` from `1` through `20`. Print out each volume on a separate line.\n", + "\n", + "Note: This is the first task where you need to use the built-in [print()](https://docs.python.org/3/library/functions.html#print) function." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "radius = ..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for ... in ...:\n", + " ..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1.6**: What lesson do you learn about the `float` type?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + } + ], + "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.4" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": true, + "skip_h1_title": true, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": false, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/03_conditionals.ipynb b/03_conditionals_00_content.ipynb similarity index 95% rename from 03_conditionals.ipynb rename to 03_conditionals_00_content.ipynb index 9ffe09e..a9113a3 100644 --- a/03_conditionals.ipynb +++ b/03_conditionals_00_content.ipynb @@ -19,7 +19,7 @@ } }, "source": [ - "We analyzed every aspect of the `average_evens()` function in [Chapter 2](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions.ipynb) except for the `if`-related parts. While it seems to do what we expect it to, there is a whole lot more we learn from taking it apart. In particular, the `if` may occur within both a **statement** or an **expression**, analogous as to how a noun in a natural language is *either* the subject of *or* an object in a sentence. What is common to both usages is that it leads to code being executed for *parts* of the input only. It is our first way of **controlling** the **flow of execution** in a program.\n", + "We analyzed every aspect of the `average_evens()` function in [Chapter 2](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions_00_content.ipynb) except for the `if`-related parts. While it seems to do what we expect it to, there is a whole lot more we learn from taking it apart. In particular, the `if` may occur within both a **statement** or an **expression**, analogous as to how a noun in a natural language is *either* the subject of *or* an object in a sentence. What is common to both usages is that it leads to code being executed for *parts* of the input only. It is our first way of **controlling** the **flow of execution** in a program.\n", "\n", "After deconstructing `if` in the first part of this chapter, we take a close look at a similar concept, namely handling **exceptions**." ] @@ -139,7 +139,7 @@ } }, "source": [ - "There are, however, cases where even well-behaved Python does not make us happy. [Chapter 5](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers.ipynb#Imprecision) provides more insights into this \"bug.\"" + "There are, however, cases where even well-behaved Python does not make us happy. [Chapter 5](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers_00_content.ipynb#Imprecision) provides more insights into this \"bug.\"" ] }, { @@ -189,7 +189,7 @@ { "data": { "text/plain": [ - "93918328484832" + "94426021241472" ] }, "execution_count": 5, @@ -213,7 +213,7 @@ { "data": { "text/plain": [ - "93918328484800" + "94426021241440" ] }, "execution_count": 6, @@ -281,7 +281,7 @@ } }, "source": [ - "Let's not confuse the boolean `False` with `None`, another built-in object! We saw the latter before in [Chapter 2](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions.ipynb#Function-Definition) as the *implicit* return value of a function without a `return` statement.\n", + "Let's not confuse the boolean `False` with `None`, another built-in object! We saw the latter before in [Chapter 2](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions_00_content.ipynb#Function-Definition) as the *implicit* return value of a function without a `return` statement.\n", "\n", "We might think of `None` in a boolean context indicating a \"maybe\" or even an \"unknown\" answer; however, for Python, there are no \"maybe\" or \"unknown\" objects, as we see further below!\n", "\n", @@ -313,7 +313,7 @@ { "data": { "text/plain": [ - "93918328471792" + "94426021228432" ] }, "execution_count": 10, @@ -357,7 +357,7 @@ } }, "source": [ - "`True`, `False`, and `None` have the property that they each exist in memory only *once*. Objects designed this way are so-called **singletons**. This **[design pattern](https://en.wikipedia.org/wiki/Design_Patterns)** was originally developed to keep a program's memory usage at a minimum. It may only be employed in situations where we know that an object does *not* mutate its value (i.e., to reuse the bag analogy from [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb#Objects-vs.-Types-vs.-Values), no flipping of $0$s and $1$s in the bag is allowed). In languages \"closer\" to the memory like C, we would have to code this singleton logic ourselves, but Python has this built in for *some* types.\n", + "`True`, `False`, and `None` have the property that they each exist in memory only *once*. Objects designed this way are so-called **singletons**. This **[design pattern](https://en.wikipedia.org/wiki/Design_Patterns)** was originally developed to keep a program's memory usage at a minimum. It may only be employed in situations where we know that an object does *not* mutate its value (i.e., to reuse the bag analogy from [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb#Objects-vs.-Types-vs.-Values), no flipping of $0$s and $1$s in the bag is allowed). In languages \"closer\" to the memory like C, we would have to code this singleton logic ourselves, but Python has this built in for *some* types.\n", "\n", "We verify this with either the `is` operator or by comparing memory addresses." ] @@ -1116,6 +1116,65 @@ "bool([False])" ] }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "source": [ + "With `str` objects, the empty `\"\"` evaluates to `False`, and any other to `True`." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bool(\"\")" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bool(\"Lorem ipsum dolor sit amet, ...\")" + ] + }, { "cell_type": "markdown", "metadata": { @@ -1162,7 +1221,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 38, "metadata": { "slideshow": { "slide_type": "slide" @@ -1187,75 +1246,12 @@ "With the `or` operator, the first truthy sub-expression is returned." ] }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Arg: 0\n", - "Arg: 1\n" - ] - }, - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "expr(0) or expr(1)" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Arg: 1\n" - ] - }, - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "expr(1) or expr(2) # 2 is not evaluated due to short-circuiting" - ] - }, { "cell_type": "code", "execution_count": 39, "metadata": { "slideshow": { - "slide_type": "-" + "slide_type": "slide" } }, "outputs": [ @@ -1278,6 +1274,69 @@ "output_type": "execute_result" } ], + "source": [ + "expr(0) or expr(1)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Arg: 1\n" + ] + }, + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "expr(1) or expr(2) # 2 is not evaluated due to short-circuiting" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Arg: 0\n", + "Arg: 1\n" + ] + }, + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "expr(0) or expr(1) or expr(2) # 2 is not evaluated due to short-circuiting" ] @@ -1295,7 +1354,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 42, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1317,7 +1376,7 @@ "0" ] }, - "execution_count": 40, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" } @@ -1339,7 +1398,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 43, "metadata": { "slideshow": { "slide_type": "slide" @@ -1359,7 +1418,7 @@ "0" ] }, - "execution_count": 41, + "execution_count": 43, "metadata": {}, "output_type": "execute_result" } @@ -1370,7 +1429,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 44, "metadata": { "slideshow": { "slide_type": "-" @@ -1391,7 +1450,7 @@ "0" ] }, - "execution_count": 42, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } @@ -1402,7 +1461,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 45, "metadata": { "slideshow": { "slide_type": "-" @@ -1423,7 +1482,7 @@ "0" ] }, - "execution_count": 43, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } @@ -1445,7 +1504,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 46, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1466,7 +1525,7 @@ "2" ] }, - "execution_count": 44, + "execution_count": 46, "metadata": {}, "output_type": "execute_result" } @@ -1522,7 +1581,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 47, "metadata": { "code_folding": [], "slideshow": { @@ -1536,7 +1595,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 48, "metadata": { "code_folding": [], "slideshow": { @@ -1578,7 +1637,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 49, "metadata": { "slideshow": { "slide_type": "slide" @@ -1591,7 +1650,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 50, "metadata": { "slideshow": { "slide_type": "-" @@ -1616,7 +1675,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 51, "metadata": { "slideshow": { "slide_type": "skip" @@ -1653,7 +1712,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 52, "metadata": { "slideshow": { "slide_type": "slide" @@ -1696,7 +1755,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 53, "metadata": { "slideshow": { "slide_type": "slide" @@ -1769,7 +1828,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 54, "metadata": { "slideshow": { "slide_type": "slide" @@ -1793,7 +1852,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 55, "metadata": { "slideshow": { "slide_type": "-" @@ -1807,60 +1866,12 @@ " y = x ** 2" ] }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "9" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "skip" - } - }, - "source": [ - "On the contrary, the `if` expression fits into one line. The main downside is a potential loss in readability, in particular, if the functional relationship is not that simple. Also, some practitioners do *not* like that the condition is in the middle of the expression." - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "y = 0 if x <= 0 else x ** 2" - ] - }, { "cell_type": "code", "execution_count": 56, "metadata": { "slideshow": { - "slide_type": "skip" + "slide_type": "-" } }, "outputs": [ @@ -1887,7 +1898,7 @@ } }, "source": [ - "In this example, however, the most elegant solution is to use the built-in [max()](https://docs.python.org/3/library/functions.html#max) function." + "On the contrary, the `if` expression fits into one line. The main downside is a potential loss in readability, in particular, if the functional relationship is not that simple. Also, some practitioners do *not* like that the condition is in the middle of the expression." ] }, { @@ -1900,7 +1911,7 @@ }, "outputs": [], "source": [ - "y = max(0, x) ** 2" + "y = 0 if x <= 0 else x ** 2" ] }, { @@ -1927,6 +1938,54 @@ "y" ] }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "source": [ + "In this example, however, the most elegant solution is to use the built-in [max()](https://docs.python.org/3/library/functions.html#max) function." + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "y = max(0, x) ** 2" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "9" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y" + ] + }, { "cell_type": "markdown", "metadata": { @@ -1955,7 +2014,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 61, "metadata": { "slideshow": { "slide_type": "slide" @@ -1968,7 +2027,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 62, "metadata": { "slideshow": { "slide_type": "-" @@ -2007,7 +2066,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 63, "metadata": { "slideshow": { "slide_type": "fragment" @@ -2046,7 +2105,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 64, "metadata": { "slideshow": { "slide_type": "slide" @@ -2057,7 +2116,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Oops. Division by 0. How does that work?\n", + "Yes, division worked smoothly.\n", "I am always printed\n" ] } @@ -2119,7 +2178,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.4" }, "livereveal": { "auto_select": "code", @@ -2147,5 +2206,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/03_conditionals_10_review.ipynb b/03_conditionals_10_review.ipynb new file mode 100644 index 0000000..de1a419 --- /dev/null +++ b/03_conditionals_10_review.ipynb @@ -0,0 +1,214 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# Chapter 3: Conditionals & Exceptions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Content Review" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Read [Chapter 3](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals_00_content.ipynb) of the book. Then, work through the questions below." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Essay Questions " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Answer the following questions *briefly*!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1**: What is the **singleton** design pattern? How many objects does the expression `[True, False, True, False]` generate in memory?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q2**: What do we mean when we talk about **truthy** and **falsy** expressions?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q3**: Describe in your own words the concept of **short-circuiting**! What does it imply for an individual sub-expression in a boolean expression?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q4**: Explain how the conceptual difference between a **statement** and an **expression** relates to the difference between a **conditional statement** and a **conditional expression**." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q5**: Why is the use of **temporary variables** encouraged in Python?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q6**: What does the `finally`-clause enforce in this code snippet? How can a `try` statement be useful *without* an `except`-clause?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```python\n", + "try:\n", + " print(\"Make a request to a service on the internet\")\n", + "finally:\n", + " print(\"This could be clean-up code\")\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### True / False Questions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Motivate your answer with *one short* sentence!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q7**: The objects `True`, `False`, and `None` represent the idea of *yes*, *no*, and *maybe* answers in a natural language.\n", + "\n", + "Hint: you also respond with a code cell." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q8**: The `try` statement is useful for handling **syntax** errors." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + } + ], + "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.4" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": true, + "skip_h1_title": true, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": false, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/03_conditionals_review_and_exercises.ipynb b/03_conditionals_20_exercises.ipynb similarity index 53% rename from 03_conditionals_review_and_exercises.ipynb rename to 03_conditionals_20_exercises.ipynb index 90b4ff9..23692a3 100644 --- a/03_conditionals_review_and_exercises.ipynb +++ b/03_conditionals_20_exercises.ipynb @@ -8,174 +8,6 @@ "# Chapter 3: Conditionals & Exceptions" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Content Review" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Read [Chapter 3](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals.ipynb) of the book. Then work through the eight review questions." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Essay Questions " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Answer the following questions briefly with *at most* 300 characters per question!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q1**: What is the **singleton** design pattern? How many objects does the expression `[True, False, True, False]` generate in memory?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q2**: What do we mean when we talk about **truthy** and **falsy** expressions?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q3**: Describe in your own words the concept of **short-circuiting**! What does it imply for an individual sub-expression in a boolean expression?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q4**: Explain how the conceptual difference between a **statement** and an **expression** relates to the difference between a **conditional statement** and a **conditional expression**." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q5**: Why is the use of **temporary variables** encouraged in Python?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q6**: What does the `finally`-clause enforce in this code snippet? How can a `try` statement be useful *without* an `except`-clause?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```python\n", - "try:\n", - " print(\"Make a request to a service on the internet\")\n", - "finally:\n", - " print(\"This could be clean-up code\")\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### True / False Questions" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Motivate your answer with *one short* sentence!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q7**: The objects `True`, `False`, and `None` represent the idea of *yes*, *no*, and *maybe* answers in a natural language.\n", - "\n", - "Hint: you also respond with a code cell." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q8**: The `try` statement is useful for handling **syntax** errors." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -183,6 +15,13 @@ "## Coding Exercises" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Read [Chapter 3](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals_00_content.ipynb) of the book. Then, work through the exercises below." + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -194,7 +33,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q9.1**: Write a function `discounted_price()` that takes the positional arguments `unit_price` (of type `float`) and `quantity` (of type `int`) and implements a discount scheme for a line item in a customer order as follows:\n", + "**Q1.1**: Write a function `discounted_price()` that takes the positional arguments `unit_price` (of type `float`) and `quantity` (of type `int`) and implements a discount scheme for a line item in a customer order as follows:\n", "\n", "- if the unit price is over 100 dollars, grant 10% relative discount\n", "- if a customer orders more than 10 items, one in every five items is for free\n", @@ -218,7 +57,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q9.2**: Calculate the final price for the following line items of an order:\n", + "**Q1.2**: Calculate the final price for the following line items of an order:\n", "- $7$ smartphones @ $99.00$ USD\n", "- $3$ workstations @ $999.00$ USD\n", "- $19$ GPUs @ $879.95$ USD\n", @@ -265,7 +104,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q9.3**: Calculate the last two line items with order quantities of $20$ and $15$. What do you observe?" + "**Q1.3**: Calculate the last two line items with order quantities of $20$ and $15$. What do you observe?" ] }, { @@ -297,7 +136,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q9.4**: Looking at the `if`-`else`-logic in the function, why do you think the four example line items in **Q9.2** were chosen as they were?" + "**Q1.4**: Looking at the `if`-`else`-logic in the function, why do you think the four example line items in **Q9.2** were chosen as they were?" ] }, { @@ -327,7 +166,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q10.1**: First, create a list `numbers` with the numbers from 1 through 100. You could type all numbers manually, but there is, of course, a smarter way. The built-in [range()](https://docs.python.org/3/library/functions.html#func-range) may be useful here. Read how it works in the documentation. To make the output of [range()](https://docs.python.org/3/library/functions.html#func-range) a `list` object, you have to wrap it with the [list()](https://docs.python.org/3/library/functions.html#func-list) built-in (i.e., `list(range(...))`)." + "**Q2.1**: First, create a list `numbers` with the numbers from 1 through 100. You could type all numbers manually, but there is, of course, a smarter way. The built-in [range()](https://docs.python.org/3/library/functions.html#func-range) may be useful here. Read how it works in the documentation. To make the output of [range()](https://docs.python.org/3/library/functions.html#func-range) a `list` object, you have to wrap it with the [list()](https://docs.python.org/3/library/functions.html#func-list) built-in (i.e., `list(range(...))`)." ] }, { @@ -343,9 +182,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q10.2**: Loop over the `numbers` list and replace numbers for which one of the two (or both) conditions apply with text strings `\"Fizz\"`, `\"Buzz\"`, or `\"FizzBuzz\"` using the indexing operator `[]` and the assignment statement `=`.\n", + "**Q2.2**: Loop over the `numbers` list and replace numbers for which one of the two (or both) conditions apply with text strings `\"Fizz\"`, `\"Buzz\"`, or `\"FizzBuzz\"` using the indexing operator `[]` and the assignment statement `=`.\n", "\n", - "In [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb), we saw that Python starts indexing with `0` as the first element. Keep that in mind.\n", + "In [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb), we saw that Python starts indexing with `0` as the first element. Keep that in mind.\n", "\n", "So in each iteration of the `for`-loop, you have to determine an `index` variable as well as check the actual `number` for its divisors.\n", "\n", @@ -366,7 +205,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q10.3**: Create a loop that prints out either the number or any of the Fizz Buzz substitutes. Do it in such a way that we do not end up with 100 lines of output here." + "**Q2.3**: Create a loop that prints out either the number or any of the Fizz Buzz substitutes. Do it in such a way that we do not end up with 100 lines of output here." ] }, { @@ -396,7 +235,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.4" }, "toc": { "base_numbering": 1, @@ -413,5 +252,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/04_iteration.ipynb b/04_iteration_00_content.ipynb similarity index 96% rename from 04_iteration.ipynb rename to 04_iteration_00_content.ipynb index aabaaef..ba6467d 100644 --- a/04_iteration.ipynb +++ b/04_iteration_00_content.ipynb @@ -839,9 +839,9 @@ "source": [ "This implementation is *highly* **inefficient** as small Fibonacci numbers already take a very long time to compute. The reason for this is **exponential growth** in the number of function calls. As [PythonTutor](http://pythontutor.com/visualize.html#code=def%20fibonacci%28i%29%3A%0A%20%20%20%20if%20i%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20return%200%0A%20%20%20%20elif%20i%20%3D%3D%201%3A%0A%20%20%20%20%20%20%20%20return%201%0A%20%20%20%20return%20fibonacci%28i%20-%201%29%20%2B%20fibonacci%28i%20-%202%29%0A%0Arv%20%3D%20fibonacci%285%29&cumulative=false&curInstr=0&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false) shows, `fibonacci()` is called again and again with the same `i` arguments.\n", "\n", - "To understand this in detail, we would have to study algorithms and data structures (e.g., with [this book](https://www.amazon.de/Introduction-Algorithms-Press-Thomas-Cormen/dp/0262033844/ref=sr_1_1?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=1JNE8U0VZGU0O&qid=1569837169&s=gateway&sprefix=algorithms+an%2Caps%2C180&sr=8-1)), a discipline within computer science, and dive into the analysis of **[time complexity of algorithms](https://en.wikipedia.org/wiki/Time_complexity)**.\n", + "To understand this in detail, we have to study algorithms and data structures (e.g., with [this book](https://www.amazon.de/Introduction-Algorithms-Press-Thomas-Cormen/dp/0262033844/ref=sr_1_1?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=1JNE8U0VZGU0O&qid=1569837169&s=gateway&sprefix=algorithms+an%2Caps%2C180&sr=8-1)), a discipline within computer science, and dive into the analysis of **[time complexity of algorithms](https://en.wikipedia.org/wiki/Time_complexity)**.\n", "\n", - "Luckily, in the Fibonacci case, the inefficiency can be resolved with a **caching** (i.e., \"reuse\") strategy from the field of **[dynamic programming](https://en.wikipedia.org/wiki/Dynamic_programming)**, namely **[memoization](https://en.wikipedia.org/wiki/Memoization)**. We do so in [Chapter 8](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings.ipynb#Memoization), after introducing the [dictionaries](https://docs.python.org/3/library/stdtypes.html#dict) data type.\n", + "Luckily, in the Fibonacci case, the inefficiency can be resolved with a **caching** (i.e., \"reuse\") strategy from the field of **[dynamic programming](https://en.wikipedia.org/wiki/Dynamic_programming)**, namely **[memoization](https://en.wikipedia.org/wiki/Memoization)**. We do so in [Chapter 8](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings_00_content.ipynb#Memoization), after introducing the `dict` data type.\n", "\n", "Let's measure the average run times for `fibonacci()` and varying `i` arguments with the `%%timeit` [cell magic](https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-timeit) that comes with Jupyter." ] @@ -859,7 +859,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "37.5 µs ± 4.26 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" + "49.8 µs ± 20.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" ] } ], @@ -881,7 +881,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "1.49 ms ± 22.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" + "1.63 ms ± 14.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" ] } ], @@ -903,7 +903,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "199 ms ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n" + "202 ms ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n" ] } ], @@ -925,7 +925,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "2.04 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n" + "2.25 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n" ] } ], @@ -947,7 +947,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "5.33 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n" + "5.79 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n" ] } ], @@ -4538,7 +4538,7 @@ } }, "source": [ - "##### Efficiency of Algorithms (revisited)" + "##### Efficiency of Algorithms (continued)" ] }, { @@ -4565,7 +4565,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "4.6 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n" + "5.14 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n" ] } ], @@ -4877,7 +4877,7 @@ } }, "source": [ - "For sequences of integers, the [range()](https://docs.python.org/3/library/functions.html#func-range) built-in makes the `for` statement even more convenient: It creates a `list`-like object of type `range` that generates integers \"on the fly,\" and we look closely at the underlying effects in memory in [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences.ipynb#Mapping)." + "For sequences of integers, the [range()](https://docs.python.org/3/library/functions.html#func-range) built-in makes the `for` statement even more convenient: It creates a `list`-like object of type `range` that generates integers \"on the fly,\" and we look closely at the underlying effects in memory in [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_00_content.ipynb#Mapping)." ] }, { @@ -5008,11 +5008,11 @@ "\n", "Now, just as we classify objects by data type, we also classify these data types (e.g., `int`, `float`, `str`, or `list`) into **abstract concepts**.\n", "\n", - "We did this already in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb#Who-am-I?-And-how-many?) when we described a `list` object as \"some sort of container that holds [...] references to other objects\". So, abstractly speaking, **containers** are any objects that are \"composed\" of other objects and also \"manage\" how these objects are organized. `list` objects, for example, have the property that they model an order associated with their elements. There exist, however, other container types, many of which do *not* come with an order. So, containers primarily \"contain\" other objects and have *nothing* to do with looping.\n", + "We did this already in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb#Who-am-I?-And-how-many?) when we described a `list` object as \"some sort of container that holds [...] references to other objects\". So, abstractly speaking, **containers** are any objects that are \"composed\" of other objects and also \"manage\" how these objects are organized. `list` objects, for example, have the property that they model an order associated with their elements. There exist, however, other container types, many of which do *not* come with an order. So, containers primarily \"contain\" other objects and have *nothing* to do with looping.\n", "\n", "On the contrary, the abstract concept of **iterables** is all about looping: Any object that we can loop over is, by definition, an iterable. So, `range` objects, for example, are iterables, even though they hold no references to other objects. Moreover, looping does *not* have to occur in a *predictable* order, although this is the case for both `list` and `range` objects.\n", "\n", - "Typically, containers are iterables, and iterables are containers. Yet, only because these two concepts coincide often, we must not think of them as the same. In [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences.ipynb#Collections-vs.-Sequences), we formalize these two concepts and introduce many more. Finally, Chapter 9 gives an explanation how abstract concepts are implemented and play together.\n", + "Typically, containers are iterables, and iterables are containers. Yet, only because these two concepts coincide often, we must not think of them as the same. In [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_00_content.ipynb#Collections-vs.-Sequences), we formalize these two concepts and introduce many more. Finally, Chapter 10 gives an explanation how abstract concepts are implemented and play together.\n", "\n", "Let's continue with `first_names` below as an example an illustrate what iterable containers are." ] @@ -5399,7 +5399,7 @@ } }, "source": [ - "##### Efficiency of Algorithms (revisited)" + "##### Efficiency of Algorithms (continued)" ] }, { @@ -5574,7 +5574,7 @@ } }, "source": [ - "Let's say we have a `samples` list and want to check if the square of at least one of its elements is above a `threshold` of `100`." + "Let's say we have a list of `numbers` and want to check if the square of at least one of its elements is above a `threshold` of `100`." ] }, { @@ -5587,7 +5587,7 @@ }, "outputs": [], "source": [ - "samples = [3, 7, 2, 9, 11, 4, 7, 9, 4, 5]" + "numbers = [7, 11, 8, 5, 3, 12, 2, 6, 9, 10, 1, 4]" ] }, { @@ -5611,7 +5611,7 @@ } }, "source": [ - "A first naive implementation could look like this: We loop over *every* element in `samples` and set an **indicator variable** `is_above`, initialized as `False`, to `True` once we encounter an element satisfying the search condition." + "A first naive implementation could look like this: We loop over *every* element in `numbers` and set an **indicator variable** `is_above`, initialized as `False`, to `True` once we encounter an element satisfying the search condition." ] }, { @@ -5627,22 +5627,22 @@ "name": "stdout", "output_type": "stream", "text": [ - "3 7 2 9 11 4 7 9 4 5 => at least one sample's square is above 100\n" + "7 11 8 5 3 12 2 6 9 10 1 4 => at least one number's square is above 100\n" ] } ], "source": [ "is_above = False\n", "\n", - "for sample in samples:\n", - " print(sample, end=\" \") # added for didactical purposes\n", - " if sample ** 2 > threshold:\n", + "for number in numbers:\n", + " print(number, end=\" \") # added for didactical purposes\n", + " if number ** 2 > threshold:\n", " is_above = True\n", "\n", "if is_above:\n", - " print(\"=> at least one sample's square is above\", threshold)\n", + " print(\"=> at least one number's square is above\", threshold)\n", "else:\n", - " print(\"=> no sample's square is above\", threshold)" + " print(\"=> no number's square is above\", threshold)" ] }, { @@ -5653,7 +5653,7 @@ } }, "source": [ - "This implementation is *inefficient* as even if the *first* element in `samples` has a square greater than `100`, we loop until the last element: This could take a long time for a big list.\n", + "This implementation is *inefficient* as even if the *first* element in `numbers` has a square greater than `100`, we loop until the last element: This could take a long time for a big list.\n", "\n", "Moreover, we must initialize `is_above` *before* the `for`-loop and write an `if`-`else`-logic *after* it to check for the result. The actual business logic is *not* clear right away.\n", "\n", @@ -5673,23 +5673,23 @@ "name": "stdout", "output_type": "stream", "text": [ - "3 7 2 9 11 => at least one sample's square is above 100\n" + "7 11 => at least one number's square is above 100\n" ] } ], "source": [ "is_above = False\n", "\n", - "for sample in samples:\n", - " print(sample, end=\" \") # added for didactical purposes\n", - " if sample ** 2 > threshold:\n", + "for number in numbers:\n", + " print(number, end=\" \") # added for didactical purposes\n", + " if number ** 2 > threshold:\n", " is_above = True\n", " break\n", "\n", "if is_above:\n", - " print(\"=> at least one sample's square is above\", threshold)\n", + " print(\"=> at least one number's square is above\", threshold)\n", "else:\n", - " print(\"=> no sample's square is above\", threshold)" + " print(\"=> no number's square is above\", threshold)" ] }, { @@ -5751,23 +5751,23 @@ "name": "stdout", "output_type": "stream", "text": [ - "3 7 2 9 11 => at least one sample's square is above 100\n" + "7 11 => at least one number's square is above 100\n" ] } ], "source": [ - "for sample in samples:\n", - " print(sample, end=\" \") # added for didactical purposes\n", - " if sample ** 2 > threshold:\n", + "for number in numbers:\n", + " print(number, end=\" \") # added for didactical purposes\n", + " if number ** 2 > threshold:\n", " is_above = True\n", " break\n", "else:\n", " is_above = False\n", "\n", "if is_above:\n", - " print(\"=> at least one sample's square is above\", threshold)\n", + " print(\"=> at least one number's square is above\", threshold)\n", "else:\n", - " print(\"=> no sample's square is above\", threshold)" + " print(\"=> no number's square is above\", threshold)" ] }, { @@ -5794,18 +5794,18 @@ "name": "stdout", "output_type": "stream", "text": [ - "3 7 2 9 11 => at least one sample's square is above 100\n" + "7 11 => at least one number's square is above 100\n" ] } ], "source": [ - "for sample in samples:\n", - " print(sample, end=\" \") # added for didactical purposes\n", - " if sample ** 2 > threshold:\n", - " print(\"=> at least one sample's square is above\", threshold)\n", + "for number in numbers:\n", + " print(number, end=\" \") # added for didactical purposes\n", + " if number ** 2 > threshold:\n", + " print(\"=> at least one number's square is above\", threshold)\n", " break\n", "else:\n", - " print(\"=> no sample's square is above\", threshold)" + " print(\"=> no number's square is above\", threshold)" ] }, { @@ -5816,7 +5816,7 @@ } }, "source": [ - "Of course, if we set the `threshold` an element's square has to pass higher, for example, to `200`, we have to loop over all `samples`. There is *no way* to optimize this **[linear search](https://en.wikipedia.org/wiki/Linear_search)** further, at least as long as we model `samples` as a `list` object. More advanced data types, however, exist that mitigate that downside." + "Of course, if we set the `threshold` an element's square has to pass higher, for example, to `200`, we have to loop over all `numbers`. There is *no way* to optimize this **[linear search](https://en.wikipedia.org/wiki/Linear_search)** further, at least as long as we model `numbers` as a `list` object. More advanced data types, however, exist that mitigate that downside." ] }, { @@ -5832,20 +5832,20 @@ "name": "stdout", "output_type": "stream", "text": [ - "3 7 2 9 11 4 7 9 4 5 => no sample's square is above 200\n" + "7 11 8 5 3 12 2 6 9 10 1 4 => no number's square is above 200\n" ] } ], "source": [ "threshold = 200\n", "\n", - "for sample in samples:\n", - " print(sample, end=\" \") # added for didactical purposes\n", - " if sample ** 2 > threshold:\n", - " print(\"=> at least one sample's square is above\", threshold)\n", + "for number in numbers:\n", + " print(number, end=\" \") # added for didactical purposes\n", + " if number ** 2 > threshold:\n", + " print(\"=> at least one number's square is above\", threshold)\n", " break\n", "else:\n", - " print(\"=> no sample's square is above\", threshold)" + " print(\"=> no number's square is above\", threshold)" ] }, { @@ -5867,17 +5867,17 @@ } }, "source": [ - "Often, we process some iterable with numeric data, for example, a list of `numbers` as in this book's introductory example in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb#Example:-Averaging-Even-Numbers) or, more realistically, data from a CSV file with many rows and columns.\n", + "Often, we process some iterable with numeric data, for example, a list of `numbers` as in this book's introductory example in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb#Example:-Averaging-Even-Numbers) or, more realistically, data from a CSV file with many rows and columns.\n", "\n", "Processing numeric data usually comes down to operations that may be grouped into one of the following three categories:\n", "\n", - "- **mapping**: transform a sample according to some functional relationship $y = f(x)$\n", - "- **filtering**: throw away individual samples (e.g., statistical outliers)\n", - "- **reducing**: collect individual samples into summary statistics\n", + "- **mapping**: transform a number according to some functional relationship $y = f(x)$\n", + "- **filtering**: throw away individual numbers (e.g., statistical outliers in a sample)\n", + "- **reducing**: collect individual numbers into summary statistics\n", "\n", - "We study this **map-filter-reduce** paradigm extensively in [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences.ipynb#The-Map-Filter-Reduce-Paradigm) after introducing more advanced data types that are needed to work with \"big\" data.\n", + "We study this **map-filter-reduce** paradigm extensively in [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_00_content.ipynb#The-Map-Filter-Reduce-Paradigm) after introducing more advanced data types that are needed to work with \"big\" data.\n", "\n", - "In the remainder of this section, we focus on *filtering out* some samples within a `for`-loop." + "Here, we focus on *filtering out* some numbers with a `for`-loop." ] }, { @@ -6074,7 +6074,7 @@ } }, "source": [ - "With already three levels of indentation, less horizontal space is available for the actual code block. Of course, one could flatten the two `if` statements with the logical `and` operator, as shown in [Chapter 3](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals.ipynb#The-if-Statement). Then, however, we trade off horizontal space against a more \"complex\" `if` logic, and this is *not* a real improvement.\n", + "With already three levels of indentation, less horizontal space is available for the actual code block. Of course, one could flatten the two `if` statements with the logical `and` operator, as shown in [Chapter 3](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals_00_content.ipynb#The-if-Statement). Then, however, we trade off horizontal space against a more \"complex\" `if` logic, and this is *not* a real improvement.\n", "\n", "A Pythonista would instead make use of the `continue` statement (cf., [reference](https://docs.python.org/3/reference/simple_stmts.html#the-continue-statement)) that causes a loop to jump into the next iteration skipping the rest of the code block.\n", "\n", @@ -6236,13 +6236,31 @@ } }, "outputs": [ + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Guess if the coin comes up as heads or tails: Tails\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ooops, it was tails\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Guess if the coin comes up as heads or tails: heads\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "Guess if the coin comes up as heads or tails: Tails\n", - "Ooops, it was tails\n", - "Guess if the coin comes up as heads or tails: heads\n", "Yes, it was heads\n" ] } @@ -6402,13 +6420,31 @@ } }, "outputs": [ + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Guess if the coin comes up as heads or tails: invalid\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Make sure to enter your guess correctly!\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Guess if the coin comes up as heads or tails: Heads\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "Guess if the coin comes up as heads or tails: invalid\n", - "Make sure to enter your guess correctly!\n", - "Guess if the coin comes up as heads or tails: Heads\n", "Yes, it was heads\n" ] } @@ -6485,7 +6521,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.4" }, "livereveal": { "auto_select": "code", @@ -6513,5 +6549,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/04_iteration_10_review.ipynb b/04_iteration_10_review.ipynb new file mode 100644 index 0000000..808e309 --- /dev/null +++ b/04_iteration_10_review.ipynb @@ -0,0 +1,281 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# Chapter 4: Recursion & Looping" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Content Review" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Read [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_00_content.ipynb) of the book. Then, work through the questions below." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Essay Questions " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Answer the following questions *briefly*!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1**: Solving a problem by **recursion** is not only popular in computer science and math. Name some examples from the fields of business or economics where problems are also solved in a **backward** fashion!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q2**: Explain what **duck typing** means! Why can it cause problems? Why is it [not a bug but a feature](https://www.urbandictionary.com/define.php?term=It%27s%20not%20a%20bug%2C%20it%27s%20a%20feature)?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q3**: What is **syntactic sugar**?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q4**: Describe in your own words why the **recursive** version of `fibonacci()`, the \"Easy at first Glance\" example in the chapter, is computationally **inefficient**! Why does the **iterative** version of `fibonacci()`, the \"Hard at first Glance\" example, run so much faster?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q5**: What is the conceptual difference between a **container** and a **list**?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q6**: What is a good use case for the `for`-loop's optional `else`-clause?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### True / False Questions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Motivate your answer with *one short* sentence!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q7**: When a **recursion** does **not** reach the base case, this is an example of the **early exit** strategy." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q8**: Any programming language **without** looping constructs like the `for` or `while` statements is **not** Turing complete." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q9**: A **recursive** formulation is the same as a **circular** one: The terms are **synonyms**." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q10**: Formulating a computational problem as a **recursion** results in an **efficient** implementation." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q11**: Whereas a **recursion** may accidentally result in a **never-ending** program, `while`-loops and `for`-loops are guaranteed to **terminate**." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q12**: Before writing **any** kind of **loop**, we **always** need to think about a **stopping criterion** ahead of time." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q13**: **Container** types such as `list` objects are characterized by their **support** for **being looped over**, for example as in:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```python\n", + "for element in container:\n", + " # do something for every element\n", + " ...\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + } + ], + "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.4" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": true, + "skip_h1_title": true, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": false, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/04_iteration_review_and_exercises.ipynb b/04_iteration_20_exercises.ipynb similarity index 64% rename from 04_iteration_review_and_exercises.ipynb rename to 04_iteration_20_exercises.ipynb index 9e2b28f..81f6928 100644 --- a/04_iteration_review_and_exercises.ipynb +++ b/04_iteration_20_exercises.ipynb @@ -8,255 +8,6 @@ "# Chapter 4: Recursion & Looping" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Content Review" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Read [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration.ipynb) of the book. Then work through the fourteen review questions." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Essay Questions " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Answer the following questions briefly with *at most* 300 characters per question!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q1**: What is so \"special\" about the number **7919**?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q2**: Solving a problem by **recursion** is not only popular in computer science and math. Name some examples from the fields of business or economics where problems are also solved in a **backward** fashion!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q3**: Explain what **duck typing** means! Why can it cause problems? Why is it [not a bug but a feature](https://www.urbandictionary.com/define.php?term=It%27s%20not%20a%20bug%2C%20it%27s%20a%20feature)?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q4**: What is **syntactic sugar**?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q5**: Describe in your own words why the **recursive** version of `fibonacci()`, the \"Easy at first Glance\" example in the chapter, is computationally **inefficient**! Why does the **iterative** version of `fibonacci()`, the \"Hard at first Glance\" example, run so much faster?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q6**: What is the conceptual difference between a **container** and a **list**?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q7**: What is a good use case for the `for`-loop's optional `else`-clause?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### True / False Questions" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Motivate your answer with *one short* sentence!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q8**: When a **recursion** does **not** reach the base case, this is an example of the **early exit** strategy." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q9**: Any programming language **without** looping constructs like the `for` or `while` statements is **not** Turing complete." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q10**: A **recursive** formulation is the same as a **circular** one: The terms are **synonyms**." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q11**: Formulating a computational problem as a **recursion** results in an **efficient** implementation." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q12**: Whereas a **recursion** may accidentally result in a **never-ending** program, `while`-loops and `for`-loops are guaranteed to **terminate**." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q13**: Before writing **any** kind of **loop**, we **always** need to think about a **stopping criterion** ahead of time." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q14**: **Container** types such as `list` objects are characterized by their **support** for **being looped over**, for example as in:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```python\n", - "for element in container:\n", - " # do something for every element\n", - " ...\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -264,6 +15,13 @@ "## Coding Exercises" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Read [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_00_content.ipynb) of the book. Then, work through the exercises below." + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -330,7 +88,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q15.1**: Explain for the $n = 3$ case why it can be solved as a **recursion**!" + "**Q1.1**: Explain for the $n = 3$ case why it can be solved as a **recursion**!" ] }, { @@ -344,7 +102,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q15.2**: How does the number of minimal moves needed to solve a problem with three spots and $n$ disks grow as a function of $n$? How does this relate to the answer to **Q15.1**?" + "**Q1.2**: How does the number of minimal moves needed to solve a problem with three spots and $n$ disks grow as a function of $n$? How does this relate to the answer to **Q1.1**?" ] }, { @@ -358,7 +116,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q15.3**: The **[Towers of Hanoi](https://en.wikipedia.org/wiki/Tower_of_Hanoi)** problem is of **exponential growth**. What does that mean? What does that imply for large $n$?" + "**Q1.3**: The **[Towers of Hanoi](https://en.wikipedia.org/wiki/Tower_of_Hanoi)** problem is of **exponential growth**. What does that mean? What does that imply for large $n$?" ] }, { @@ -372,7 +130,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q15.4**: The video introduces the recursive relationship $Sol(4, 1, 3) = Sol(3, 1, 2) ~ \\bigoplus ~ Sol(1, 1, 3) ~ \\bigoplus ~ Sol(3, 2, 3)$. The $\\bigoplus$ is to be interpreted as some sort of \"plus\" operation. How does this \"plus\" operation work? How does this way of expressing the problem relate to the answer to **Q15.1**?" + "**Q1.4**: The video introduces the recursive relationship $Sol(4, 1, 3) = Sol(3, 1, 2) ~ \\bigoplus ~ Sol(1, 1, 3) ~ \\bigoplus ~ Sol(3, 2, 3)$. The $\\bigoplus$ is to be interpreted as some sort of \"plus\" operation. How does this \"plus\" operation work? How does this way of expressing the problem relate to the answer to **Q1.1**?" ] }, { @@ -439,7 +197,7 @@ "\n", "Once completed, `sol()` should print out all the moves in the correct order. With **printing a move**, we mean a line like \"1 -> 3\", short for \"Move the top-most disk from spot 1 to spot 3\".\n", "\n", - "Write your answers to **Q15.5** to **Q15.7** into the subsequent code cell and finalize `sol()`! No need to write a docstring or validate the input here." + "Write your answers to **Q1.5** to **Q1.7** into the subsequent code cell and finalize `sol()`! No need to write a docstring or validate the input here." ] }, { @@ -464,14 +222,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q15.5**: What is the `disks` argument when the function reaches its **base case**? Check for the base case with a simple `if` statement and return from the function using the **early exit** pattern!" + "**Q1.5**: What is the `disks` argument when the function reaches its **base case**? Check for the base case with a simple `if` statement and return from the function using the **early exit** pattern!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "**Q15.6**: If not in the base case, `sol()` needs to determine the `intermediate` spot given concrete `origin` and `destination` arguments. For example, if called with `origin=1` and `destination=2`, `intermediate` must be `3`.\n", + "**Q1.6**: If not in the base case, `sol()` needs to determine the `intermediate` spot given concrete `origin` and `destination` arguments. For example, if called with `origin=1` and `destination=2`, `intermediate` must be `3`.\n", "\n", "Add **one** compound `if` statement to `sol()` that has a branch for **every** possible `origin`-`destination` pair that sets a variable `intermediate` to the correct temporary spot. **How many** branches will there be?" ] @@ -480,7 +238,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q15.7**: `sol()` needs to call itself **two more times** with the correct 2-pairs chosen from the three available spots `origin`, `intermediate`, and `destination`.\n", + "**Q1.7**: `sol()` needs to call itself **two more times** with the correct 2-pairs chosen from the three available spots `origin`, `intermediate`, and `destination`.\n", "\n", "In between the two recursive function calls, write a `print()` statement that prints out from where to where the \"remaining and largest\" disk has to be moved!" ] @@ -489,7 +247,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q15.8**: Execute the code cells below and confirm that the printed moves are correct!" + "**Q1.8**: Execute the code cells below and confirm that the printed moves are correct!" ] }, { @@ -543,7 +301,7 @@ "\n", "Let's create a more concise `hanoi()` function that, in addition to a positional `disks` argument, takes three keyword-only arguments `origin`, `intermediate`, and `destination` with default values `\"left\"`, `\"center\"`, and `\"right\"`.\n", "\n", - "Write your answers to **Q15.9** and **Q15.10** into the subsequent code cell and finalize `hanoi()`! No need to write a docstring or validate the input here." + "Write your answers to **Q1.9** and **Q1.10** into the subsequent code cell and finalize `hanoi()`! No need to write a docstring or validate the input here." ] }, { @@ -565,14 +323,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q15.9**: Copy the base case from `sol()`!" + "**Q1.9**: Copy the base case from `sol()`!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "**Q15.10**: Instead of conditional logic, `hanoi()` calls itself **two times** with the **three** arguments `origin`, `intermediate`, and `destination` passed on in a **different** order.\n", + "**Q1.10**: Instead of conditional logic, `hanoi()` calls itself **two times** with the **three** arguments `origin`, `intermediate`, and `destination` passed on in a **different** order.\n", "\n", "Figure out how the arguments are passed on in the two recursive `hanoi()` calls!\n", "\n", @@ -583,7 +341,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q15.11**: Execute the code cells below and confirm that the printed moves are correct!" + "**Q1.11**: Execute the code cells below and confirm that the printed moves are correct!" ] }, { @@ -653,11 +411,11 @@ "\n", "In such cases, we could modify a recursive function to return a count value to be passed up the recursion tree.\n", "\n", - "This is similar to what we do in the recursive versions of `factorial()` and `fibonacci()` in [Chapter 4](https://github.com/webartifex/intro-to-python/blob/master/04_iteration.ipynb), where we pass up an intermediate result.\n", + "This is similar to what we do in the recursive versions of `factorial()` and `fibonacci()` in [Chapter 4](https://github.com/webartifex/intro-to-python/blob/master/04_iteration_00_content.ipynb), where we pass up an intermediate result.\n", "\n", "Let's create a `hanoi_moves()` function that follows the same internal logic as `hanoi()`, but, instead of printing out the moves, returns the number of steps done so far in the recursion.\n", "\n", - "Write your answers to **Q15.12** to **Q15.14** into the subsequent code cell and finalize `hanoi_moves()`! No need to write a docstring or validate the input here." + "Write your answers to **Q1.12** to **Q1.14** into the subsequent code cell and finalize `hanoi_moves()`! No need to write a docstring or validate the input here." ] }, { @@ -682,21 +440,21 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q15.12**: Copy the base case from `hanoi()`! What count should be returned when it is reached?" + "**Q1.12**: Copy the base case from `hanoi()`! What count should be returned when it is reached?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "**Q15.13**: Initialize the variable `moves` with an appropriate count! This is the number of moves that corresponds to **one** recursive function call." + "**Q1.13**: Initialize the variable `moves` with an appropriate count! This is the number of moves that corresponds to **one** recursive function call." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "**Q15.14**: `moves` is updated with the counts passed up from the two recursive calls.\n", + "**Q1.14**: `moves` is updated with the counts passed up from the two recursive calls.\n", "\n", "Complete the two recursive function calls with the same arguments as in `hanoi()`!" ] @@ -705,7 +463,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q15.15**: Write a `for`-loop that prints out the **minimum number** of moves needed to solve Towers of Hanoi for any number of `disks` from `1` through `20` to confirm your answer to **Q15.2**." + "**Q1.15**: Write a `for`-loop that prints out the **minimum number** of moves needed to solve Towers of Hanoi for any number of `disks` from `1` through `20` to confirm your answer to **Q1.2**." ] }, { @@ -733,7 +491,7 @@ "\n", "With `disks` in the range from `24` through `26`, the computation time roughly doubles for each increase of `disks` by 1.\n", "\n", - "**Q15.16**: Execute the code cells below and see for yourself!" + "**Q1.16**: Execute the code cells below and see for yourself!" ] }, { @@ -779,7 +537,7 @@ "source": [ "The above `hanoi()` prints the optimal solution's moves in the correct order but fails to label each move with an order number. This can be built in by passing on one more argument `offset` down the recursion tree. As the logic gets a bit \"involved,\" `hanoi_ordered()` below is almost finished.\n", "\n", - "Write your answers to **Q15.17** and **Q15.18** into the subsequent code cell and finalize `hanoi_ordered()`! No need to write a docstring or validate the input here." + "Write your answers to **Q1.17** and **Q1.18** into the subsequent code cell and finalize `hanoi_ordered()`! No need to write a docstring or validate the input here." ] }, { @@ -809,14 +567,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q15.17**: Copy the base case from the original `hanoi()`!" + "**Q1.17**: Copy the base case from the original `hanoi()`!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "**Q15.18**: Complete the two recursive function calls with the same arguments as in `hanoi()` or `hanoi_moves()`! Do not change the already filled in `offset` arguments!\n", + "**Q1.18**: Complete the two recursive function calls with the same arguments as in `hanoi()` or `hanoi_moves()`! Do not change the already filled in `offset` arguments!\n", "\n", "Then, copy the `print()` statement from `hanoi()` and adjust it to print out `count` as well!" ] @@ -825,7 +583,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q15.19**: Execute the code cells below and confirm that the order numbers are correct!" + "**Q1.19**: Execute the code cells below and confirm that the order numbers are correct!" ] }, { @@ -882,7 +640,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q15.20**: Conducting your own research on the internet (max. 15 minutes), what can you say about generalizing the **[Towers of Hanoi](https://en.wikipedia.org/wiki/Tower_of_Hanoi)** problem to a setting with **more than three** landing spots?" + "**Q1.20**: Conducting your own research on the internet (max. 15 minutes), what can you say about generalizing the **[Towers of Hanoi](https://en.wikipedia.org/wiki/Tower_of_Hanoi)** problem to a setting with **more than three** landing spots?" ] }, { @@ -909,7 +667,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.4" }, "toc": { "base_numbering": 1, @@ -926,5 +684,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/05_numbers.ipynb b/05_numbers_00_content.ipynb similarity index 96% rename from 05_numbers.ipynb rename to 05_numbers_00_content.ipynb index 48d8623..1f7ebc2 100644 --- a/05_numbers.ipynb +++ b/05_numbers_00_content.ipynb @@ -21,15 +21,15 @@ "source": [ "After learning about the basic building blocks of expressing and structuring the business logic in programs, we focus our attention on the **data types** Python offers us, both built-in and available via the [standard library](https://docs.python.org/3/library/index.html) or third-party packages.\n", "\n", - "We start with the \"simple\" ones: Numeric types in this chapter and textual data in [Chapter 6](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text.ipynb). An important fact that holds for all objects of these types is that they are **immutable**. To reuse the bag analogy from [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb#Objects-vs.-Types-vs.-Values), this means that the $0$s and $1$s making up an object's *value* cannot be changed once the bag is created in memory, implying that any operation with or method on the object creates a *new* object in a *different* memory location.\n", + "We start with the \"simple\" ones: Numeric types in this chapter and textual data in [Chapter 6](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text_00_content.ipynb). An important fact that holds for all objects of these types is that they are **immutable**. To reuse the bag analogy from [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb#Objects-vs.-Types-vs.-Values), this means that the $0$s and $1$s making up an object's *value* cannot be changed once the bag is created in memory, implying that any operation with or method on the object creates a *new* object in a *different* memory location.\n", "\n", - "[Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences.ipynb) and [Chapter 8](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings.ipynb) then cover the more \"complex\" data types, including, for example, the `list` type. Finally, Chapter 9 completes the picture by introducing language constructs to create custom types.\n", + "[Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_00_content.ipynb), [Chapter 8](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings_00_content.ipynb), and [Chapter 9](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/09_arrays_00_content.ipynb) then cover the more \"complex\" data types, including, for example, the `list` type. Finally, Chapter 10 completes the picture by introducing language constructs to create custom types.\n", "\n", "We have already seen many hints indicating that numbers are not as trivial to work with as it seems at first sight:\n", "\n", - "- [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb#%28Data%29-Type-%2F-%22Behavior%22) reveals that numbers may come in *different* data types (i.e., `int` vs. `float` so far),\n", - "- [Chapter 3](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals.ipynb#Boolean-Expressions) raises questions regarding the **limited precision** of `float` numbers (e.g., `42 == 42.000000000000001` evaluates to `True`), and\n", - "- [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration.ipynb#Infinite-Recursion) shows that sometimes a `float` \"walks\" and \"quacks\" like an `int`, whereas the reverse is true in other cases.\n", + "- [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb#%28Data%29-Type-%2F-%22Behavior%22) reveals that numbers may come in *different* data types (i.e., `int` vs. `float` so far),\n", + "- [Chapter 3](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals_00_content.ipynb#Boolean-Expressions) raises questions regarding the **limited precision** of `float` numbers (e.g., `42 == 42.000000000000001` evaluates to `True`), and\n", + "- [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_00_content.ipynb#Infinite-Recursion) shows that sometimes a `float` \"walks\" and \"quacks\" like an `int`, whereas the reverse is true in other cases.\n", "\n", "This chapter introduces all the [built-in numeric types](https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex): `int`, `float`, and `complex`. To mitigate the limited precision of floating-point numbers, we also look at two replacements for the `float` type in the [standard library](https://docs.python.org/3/library/index.html), namely the `Decimal` type in the [decimals](https://docs.python.org/3/library/decimal.html#decimal.Decimal) and the `Fraction` type in the [fractions](https://docs.python.org/3/library/fractions.html#fractions.Fraction) module." ] @@ -53,7 +53,7 @@ } }, "source": [ - "The simplest numeric type is the `int` type: It behaves like an [integer in ordinary math](https://en.wikipedia.org/wiki/Integer) (i.e., the set $\\mathbb{Z}$) and supports operators in the way we saw in the section on arithmetic operators in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb#%28Arithmetic%29-Operators)." + "The simplest numeric type is the `int` type: It behaves like an [integer in ordinary math](https://en.wikipedia.org/wiki/Integer) (i.e., the set $\\mathbb{Z}$) and supports operators in the way we saw in the section on arithmetic operators in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb#%28Arithmetic%29-Operators)." ] }, { @@ -92,7 +92,7 @@ { "data": { "text/plain": [ - "140673805309168" + "140166838695792" ] }, "execution_count": 2, @@ -1481,7 +1481,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 47, "metadata": { "slideshow": { "slide_type": "slide" @@ -1494,7 +1494,7 @@ "'0b1011 & 0b1101'" ] }, - "execution_count": 42, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } @@ -1505,7 +1505,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 48, "metadata": { "slideshow": { "slide_type": "-" @@ -1518,7 +1518,7 @@ "'0b1001'" ] }, - "execution_count": 43, + "execution_count": 48, "metadata": {}, "output_type": "execute_result" } @@ -1540,7 +1540,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 49, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1553,7 +1553,7 @@ "9" ] }, - "execution_count": 44, + "execution_count": 49, "metadata": {}, "output_type": "execute_result" } @@ -1564,7 +1564,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 50, "metadata": { "slideshow": { "slide_type": "-" @@ -1577,7 +1577,7 @@ "9" ] }, - "execution_count": 45, + "execution_count": 50, "metadata": {}, "output_type": "execute_result" } @@ -1599,7 +1599,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 51, "metadata": { "slideshow": { "slide_type": "slide" @@ -1612,7 +1612,7 @@ "'0b1001 | 0b1101'" ] }, - "execution_count": 46, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" } @@ -1623,7 +1623,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 52, "metadata": { "slideshow": { "slide_type": "-" @@ -1636,7 +1636,7 @@ "'0b1101'" ] }, - "execution_count": 47, + "execution_count": 52, "metadata": {}, "output_type": "execute_result" } @@ -1658,7 +1658,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 53, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1671,7 +1671,7 @@ "13" ] }, - "execution_count": 48, + "execution_count": 53, "metadata": {}, "output_type": "execute_result" } @@ -1682,7 +1682,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 54, "metadata": { "slideshow": { "slide_type": "-" @@ -1695,7 +1695,7 @@ "13" ] }, - "execution_count": 49, + "execution_count": 54, "metadata": {}, "output_type": "execute_result" } @@ -1717,7 +1717,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 55, "metadata": { "slideshow": { "slide_type": "slide" @@ -1730,7 +1730,7 @@ "'0b1001 ^ 0b1101'" ] }, - "execution_count": 50, + "execution_count": 55, "metadata": {}, "output_type": "execute_result" } @@ -1741,7 +1741,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 56, "metadata": { "slideshow": { "slide_type": "-" @@ -1754,7 +1754,7 @@ "'0b100'" ] }, - "execution_count": 51, + "execution_count": 56, "metadata": {}, "output_type": "execute_result" } @@ -1776,7 +1776,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 57, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1789,7 +1789,7 @@ "4" ] }, - "execution_count": 52, + "execution_count": 57, "metadata": {}, "output_type": "execute_result" } @@ -1800,7 +1800,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 58, "metadata": { "slideshow": { "slide_type": "-" @@ -1813,7 +1813,7 @@ "4" ] }, - "execution_count": 53, + "execution_count": 58, "metadata": {}, "output_type": "execute_result" } @@ -1837,7 +1837,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 59, "metadata": { "slideshow": { "slide_type": "slide" @@ -1850,7 +1850,7 @@ "'-0b1001'" ] }, - "execution_count": 54, + "execution_count": 59, "metadata": {}, "output_type": "execute_result" } @@ -1861,7 +1861,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 60, "metadata": { "slideshow": { "slide_type": "-" @@ -1874,7 +1874,7 @@ "'-0b1001'" ] }, - "execution_count": 55, + "execution_count": 60, "metadata": {}, "output_type": "execute_result" } @@ -1896,7 +1896,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 61, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1909,7 +1909,7 @@ "-1" ] }, - "execution_count": 56, + "execution_count": 61, "metadata": {}, "output_type": "execute_result" } @@ -1933,7 +1933,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 62, "metadata": { "slideshow": { "slide_type": "slide" @@ -1946,7 +1946,7 @@ "'0b1001'" ] }, - "execution_count": 57, + "execution_count": 62, "metadata": {}, "output_type": "execute_result" } @@ -1957,7 +1957,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 63, "metadata": { "slideshow": { "slide_type": "-" @@ -1970,7 +1970,7 @@ "'0b100100'" ] }, - "execution_count": 58, + "execution_count": 63, "metadata": {}, "output_type": "execute_result" } @@ -1981,7 +1981,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 64, "metadata": { "slideshow": { "slide_type": "-" @@ -1994,7 +1994,7 @@ "36" ] }, - "execution_count": 59, + "execution_count": 64, "metadata": {}, "output_type": "execute_result" } @@ -2016,7 +2016,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 65, "metadata": { "slideshow": { "slide_type": "fragment" @@ -2029,7 +2029,7 @@ "'0b10'" ] }, - "execution_count": 60, + "execution_count": 65, "metadata": {}, "output_type": "execute_result" } @@ -2040,7 +2040,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 66, "metadata": { "slideshow": { "slide_type": "-" @@ -2053,7 +2053,7 @@ "2" ] }, - "execution_count": 61, + "execution_count": 66, "metadata": {}, "output_type": "execute_result" } @@ -2092,7 +2092,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 67, "metadata": { "slideshow": { "slide_type": "slide" @@ -2105,7 +2105,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 68, "metadata": { "slideshow": { "slide_type": "fragment" @@ -2115,10 +2115,10 @@ { "data": { "text/plain": [ - "140673805486768" + "140166567715664" ] }, - "execution_count": 63, + "execution_count": 68, "metadata": {}, "output_type": "execute_result" } @@ -2129,7 +2129,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 69, "metadata": { "slideshow": { "slide_type": "-" @@ -2142,7 +2142,7 @@ "float" ] }, - "execution_count": 64, + "execution_count": 69, "metadata": {}, "output_type": "execute_result" } @@ -2153,7 +2153,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 70, "metadata": { "slideshow": { "slide_type": "-" @@ -2166,7 +2166,7 @@ "1.23" ] }, - "execution_count": 65, + "execution_count": 70, "metadata": {}, "output_type": "execute_result" } @@ -2188,7 +2188,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 71, "metadata": { "slideshow": { "slide_type": "skip" @@ -2201,7 +2201,7 @@ "0.123456789" ] }, - "execution_count": 66, + "execution_count": 71, "metadata": {}, "output_type": "execute_result" } @@ -2223,7 +2223,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 72, "metadata": { "slideshow": { "slide_type": "slide" @@ -2236,7 +2236,7 @@ "1.0" ] }, - "execution_count": 67, + "execution_count": 72, "metadata": {}, "output_type": "execute_result" } @@ -2247,7 +2247,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 73, "metadata": { "slideshow": { "slide_type": "-" @@ -2260,7 +2260,7 @@ "1.0" ] }, - "execution_count": 68, + "execution_count": 73, "metadata": {}, "output_type": "execute_result" } @@ -2271,7 +2271,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 74, "metadata": { "slideshow": { "slide_type": "skip" @@ -2284,7 +2284,7 @@ "1.0" ] }, - "execution_count": 69, + "execution_count": 74, "metadata": {}, "output_type": "execute_result" } @@ -2306,7 +2306,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 75, "metadata": { "slideshow": { "slide_type": "slide" @@ -2319,7 +2319,7 @@ "0.3333333333333333" ] }, - "execution_count": 70, + "execution_count": 75, "metadata": {}, "output_type": "execute_result" } @@ -2341,7 +2341,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 76, "metadata": { "slideshow": { "slide_type": "fragment" @@ -2354,7 +2354,7 @@ "42.0" ] }, - "execution_count": 71, + "execution_count": 76, "metadata": {}, "output_type": "execute_result" } @@ -2365,7 +2365,7 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 77, "metadata": { "slideshow": { "slide_type": "-" @@ -2378,7 +2378,7 @@ "42.0" ] }, - "execution_count": 72, + "execution_count": 77, "metadata": {}, "output_type": "execute_result" } @@ -2411,7 +2411,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 78, "metadata": { "slideshow": { "slide_type": "slide" @@ -2424,7 +2424,7 @@ "1.23" ] }, - "execution_count": 73, + "execution_count": 78, "metadata": {}, "output_type": "execute_result" } @@ -2446,7 +2446,7 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 79, "metadata": { "slideshow": { "slide_type": "skip" @@ -2455,10 +2455,10 @@ "outputs": [ { "ename": "SyntaxError", - "evalue": "invalid syntax (, line 1)", + "evalue": "invalid syntax (, line 1)", "output_type": "error", "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m 1.23 e0\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m 1.23 e0\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" ] } ], @@ -2468,7 +2468,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 80, "metadata": { "slideshow": { "slide_type": "skip" @@ -2477,10 +2477,10 @@ "outputs": [ { "ename": "SyntaxError", - "evalue": "invalid syntax (, line 1)", + "evalue": "invalid syntax (, line 1)", "output_type": "error", "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m 1.23e 0\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m 1.23e 0\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" ] } ], @@ -2490,7 +2490,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 81, "metadata": { "slideshow": { "slide_type": "skip" @@ -2499,10 +2499,10 @@ "outputs": [ { "ename": "SyntaxError", - "evalue": "invalid syntax (, line 1)", + "evalue": "invalid syntax (, line 1)", "output_type": "error", "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m 1.23e0.0\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m 1.23e0.0\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" ] } ], @@ -2523,7 +2523,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 82, "metadata": { "slideshow": { "slide_type": "fragment" @@ -2537,7 +2537,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0me1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0me1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'e1' is not defined" ] } @@ -2559,7 +2559,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 83, "metadata": { "slideshow": { "slide_type": "fragment" @@ -2572,7 +2572,7 @@ "10.0" ] }, - "execution_count": 78, + "execution_count": 83, "metadata": {}, "output_type": "execute_result" } @@ -2605,7 +2605,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 84, "metadata": { "slideshow": { "slide_type": "slide" @@ -2618,166 +2618,13 @@ "nan" ] }, - "execution_count": 79, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "float(\"nan\") # also works as float(\"NaN\")" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "metadata": { - "slideshow": { - "slide_type": "skip" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "inf" - ] - }, - "execution_count": 80, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "float(\"+inf\") # also works as float(\"+infinity\")" - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "inf" - ] - }, - "execution_count": 81, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "float(\"inf\") # by omitting the plus sign we mean positive infinity" - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "-inf" - ] - }, - "execution_count": 82, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "float(\"-inf\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "skip" - } - }, - "source": [ - "`nan` objects *never* compare equal to *anything*, not even to themselves. This happens in accordance with the [IEEE 754](https://en.wikipedia.org/wiki/IEEE_754) standard." - ] - }, - { - "cell_type": "code", - "execution_count": 83, - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 83, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "float(\"nan\") == float(\"nan\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "skip" - } - }, - "source": [ - "On the contrary, as two values go to infinity, there is no such concept as difference and *everything* compares equal." - ] - }, - { - "cell_type": "code", - "execution_count": 84, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "float(\"inf\") == float(\"inf\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "skip" - } - }, - "source": [ - "Adding `42` to `inf` makes no difference." + "float(\"nan\") # also works as float(\"NaN\")" ] }, { @@ -2801,12 +2648,106 @@ } ], "source": [ - "float(\"inf\") + 42" + "float(\"+inf\") # also works as float(\"+infinity\")" ] }, { "cell_type": "code", "execution_count": 86, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "inf" + ] + }, + "execution_count": 86, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "float(\"inf\") # by omitting the plus sign we mean positive infinity" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "-inf" + ] + }, + "execution_count": 87, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "float(\"-inf\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "source": [ + "`nan` objects *never* compare equal to *anything*, not even to themselves. This happens in accordance with the [IEEE 754](https://en.wikipedia.org/wiki/IEEE_754) standard." + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 88, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "float(\"nan\") == float(\"nan\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "source": [ + "On the contrary, as two values go to infinity, there is no such concept as difference and *everything* compares equal." + ] + }, + { + "cell_type": "code", + "execution_count": 89, "metadata": { "slideshow": { "slide_type": "fragment" @@ -2819,7 +2760,66 @@ "True" ] }, - "execution_count": 86, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "float(\"inf\") == float(\"inf\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "source": [ + "Adding `42` to `inf` makes no difference." + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "inf" + ] + }, + "execution_count": 90, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "float(\"inf\") + 42" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 91, "metadata": {}, "output_type": "execute_result" } @@ -2841,7 +2841,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 92, "metadata": { "slideshow": { "slide_type": "skip" @@ -2854,7 +2854,7 @@ "inf" ] }, - "execution_count": 87, + "execution_count": 92, "metadata": {}, "output_type": "execute_result" } @@ -2865,7 +2865,7 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 93, "metadata": { "slideshow": { "slide_type": "skip" @@ -2878,7 +2878,7 @@ "True" ] }, - "execution_count": 88, + "execution_count": 93, "metadata": {}, "output_type": "execute_result" } @@ -2900,7 +2900,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 94, "metadata": { "slideshow": { "slide_type": "skip" @@ -2913,7 +2913,7 @@ "inf" ] }, - "execution_count": 89, + "execution_count": 94, "metadata": {}, "output_type": "execute_result" } @@ -2924,7 +2924,7 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 95, "metadata": { "slideshow": { "slide_type": "skip" @@ -2937,7 +2937,7 @@ "True" ] }, - "execution_count": 90, + "execution_count": 95, "metadata": {}, "output_type": "execute_result" } @@ -2959,7 +2959,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 96, "metadata": { "slideshow": { "slide_type": "skip" @@ -2972,7 +2972,7 @@ "inf" ] }, - "execution_count": 91, + "execution_count": 96, "metadata": {}, "output_type": "execute_result" } @@ -2983,7 +2983,7 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": 97, "metadata": { "slideshow": { "slide_type": "fragment" @@ -2996,7 +2996,7 @@ "True" ] }, - "execution_count": 92, + "execution_count": 97, "metadata": {}, "output_type": "execute_result" } @@ -3018,7 +3018,7 @@ }, { "cell_type": "code", - "execution_count": 93, + "execution_count": 98, "metadata": { "slideshow": { "slide_type": "slide" @@ -3031,7 +3031,7 @@ "nan" ] }, - "execution_count": 93, + "execution_count": 98, "metadata": {}, "output_type": "execute_result" } @@ -3042,7 +3042,7 @@ }, { "cell_type": "code", - "execution_count": 94, + "execution_count": 99, "metadata": { "slideshow": { "slide_type": "-" @@ -3055,7 +3055,7 @@ "nan" ] }, - "execution_count": 94, + "execution_count": 99, "metadata": {}, "output_type": "execute_result" } @@ -3085,12 +3085,12 @@ "source": [ "`float` objects are *inherently* imprecise, and there is *nothing* we can do about it! In particular, arithmetic operations with two `float` objects may result in \"weird\" rounding \"errors\" that are strictly deterministic and occur in accordance with the [IEEE 754](https://en.wikipedia.org/wiki/IEEE_754) standard.\n", "\n", - "For example, let's add `1e0` to `1e15` and `1e16`, respectively. In the latter case, the `1e0` somehow gets \"lost\"." + "For example, let's add `1e0` to `1e15` and `1e16`, respectively. In the latter case, the `1e0` somehow gets \"lost.\"" ] }, { "cell_type": "code", - "execution_count": 95, + "execution_count": 100, "metadata": { "slideshow": { "slide_type": "skip" @@ -3103,7 +3103,7 @@ "1000000000000001.0" ] }, - "execution_count": 95, + "execution_count": 100, "metadata": {}, "output_type": "execute_result" } @@ -3114,7 +3114,7 @@ }, { "cell_type": "code", - "execution_count": 96, + "execution_count": 101, "metadata": { "slideshow": { "slide_type": "skip" @@ -3127,7 +3127,7 @@ "1e+16" ] }, - "execution_count": 96, + "execution_count": 101, "metadata": {}, "output_type": "execute_result" } @@ -3149,7 +3149,7 @@ }, { "cell_type": "code", - "execution_count": 97, + "execution_count": 102, "metadata": { "slideshow": { "slide_type": "slide" @@ -3162,7 +3162,7 @@ "1000000000000001.0" ] }, - "execution_count": 97, + "execution_count": 102, "metadata": {}, "output_type": "execute_result" } @@ -3173,7 +3173,7 @@ }, { "cell_type": "code", - "execution_count": 98, + "execution_count": 103, "metadata": { "slideshow": { "slide_type": "-" @@ -3186,7 +3186,7 @@ "1e+16" ] }, - "execution_count": 98, + "execution_count": 103, "metadata": {}, "output_type": "execute_result" } @@ -3208,7 +3208,7 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 104, "metadata": { "slideshow": { "slide_type": "slide" @@ -3221,7 +3221,7 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 105, "metadata": { "slideshow": { "slide_type": "-" @@ -3234,7 +3234,7 @@ "2.0000000000000004" ] }, - "execution_count": 100, + "execution_count": 105, "metadata": {}, "output_type": "execute_result" } @@ -3245,7 +3245,7 @@ }, { "cell_type": "code", - "execution_count": 101, + "execution_count": 106, "metadata": { "slideshow": { "slide_type": "fragment" @@ -3258,7 +3258,7 @@ "0.30000000000000004" ] }, - "execution_count": 101, + "execution_count": 106, "metadata": {}, "output_type": "execute_result" } @@ -3280,7 +3280,7 @@ }, { "cell_type": "code", - "execution_count": 102, + "execution_count": 107, "metadata": { "slideshow": { "slide_type": "fragment" @@ -3293,7 +3293,7 @@ "False" ] }, - "execution_count": 102, + "execution_count": 107, "metadata": {}, "output_type": "execute_result" } @@ -3304,7 +3304,7 @@ }, { "cell_type": "code", - "execution_count": 103, + "execution_count": 108, "metadata": { "slideshow": { "slide_type": "-" @@ -3317,7 +3317,7 @@ "False" ] }, - "execution_count": 103, + "execution_count": 108, "metadata": {}, "output_type": "execute_result" } @@ -3339,7 +3339,7 @@ }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 109, "metadata": { "slideshow": { "slide_type": "slide" @@ -3352,7 +3352,7 @@ }, { "cell_type": "code", - "execution_count": 105, + "execution_count": 110, "metadata": { "slideshow": { "slide_type": "fragment" @@ -3365,7 +3365,7 @@ "True" ] }, - "execution_count": 105, + "execution_count": 110, "metadata": {}, "output_type": "execute_result" } @@ -3376,7 +3376,7 @@ }, { "cell_type": "code", - "execution_count": 106, + "execution_count": 111, "metadata": { "slideshow": { "slide_type": "-" @@ -3389,7 +3389,7 @@ "True" ] }, - "execution_count": 106, + "execution_count": 111, "metadata": {}, "output_type": "execute_result" } @@ -3413,7 +3413,7 @@ }, { "cell_type": "code", - "execution_count": 107, + "execution_count": 112, "metadata": { "slideshow": { "slide_type": "slide" @@ -3426,7 +3426,7 @@ "'0.10000000000000000555111512312578270211815834045410'" ] }, - "execution_count": 107, + "execution_count": 112, "metadata": {}, "output_type": "execute_result" } @@ -3437,7 +3437,7 @@ }, { "cell_type": "code", - "execution_count": 108, + "execution_count": 113, "metadata": { "slideshow": { "slide_type": "-" @@ -3450,7 +3450,7 @@ "'0.20000000000000001110223024625156540423631668090820'" ] }, - "execution_count": 108, + "execution_count": 113, "metadata": {}, "output_type": "execute_result" } @@ -3461,7 +3461,7 @@ }, { "cell_type": "code", - "execution_count": 109, + "execution_count": 114, "metadata": { "slideshow": { "slide_type": "-" @@ -3474,7 +3474,7 @@ "'0.29999999999999998889776975374843459576368331909180'" ] }, - "execution_count": 109, + "execution_count": 114, "metadata": {}, "output_type": "execute_result" } @@ -3485,7 +3485,7 @@ }, { "cell_type": "code", - "execution_count": 110, + "execution_count": 115, "metadata": { "slideshow": { "slide_type": "slide" @@ -3498,7 +3498,7 @@ "'0.33333333333333331482961625624739099293947219848633'" ] }, - "execution_count": 110, + "execution_count": 115, "metadata": {}, "output_type": "execute_result" } @@ -3524,7 +3524,7 @@ }, { "cell_type": "code", - "execution_count": 111, + "execution_count": 116, "metadata": { "slideshow": { "slide_type": "fragment" @@ -3537,7 +3537,7 @@ }, { "cell_type": "code", - "execution_count": 112, + "execution_count": 117, "metadata": { "slideshow": { "slide_type": "-" @@ -3550,7 +3550,7 @@ "0.33333" ] }, - "execution_count": 112, + "execution_count": 117, "metadata": {}, "output_type": "execute_result" } @@ -3561,7 +3561,7 @@ }, { "cell_type": "code", - "execution_count": 113, + "execution_count": 118, "metadata": { "slideshow": { "slide_type": "-" @@ -3574,7 +3574,7 @@ "'0.33333000000000001517008740847813896834850311279297'" ] }, - "execution_count": 113, + "execution_count": 118, "metadata": {}, "output_type": "execute_result" } @@ -3596,7 +3596,7 @@ }, { "cell_type": "code", - "execution_count": 114, + "execution_count": 119, "metadata": { "slideshow": { "slide_type": "slide" @@ -3609,7 +3609,7 @@ "'0.12500000000000000000000000000000000000000000000000'" ] }, - "execution_count": 114, + "execution_count": 119, "metadata": {}, "output_type": "execute_result" } @@ -3620,7 +3620,7 @@ }, { "cell_type": "code", - "execution_count": 115, + "execution_count": 120, "metadata": { "slideshow": { "slide_type": "-" @@ -3633,7 +3633,7 @@ "'0.25000000000000000000000000000000000000000000000000'" ] }, - "execution_count": 115, + "execution_count": 120, "metadata": {}, "output_type": "execute_result" } @@ -3644,7 +3644,7 @@ }, { "cell_type": "code", - "execution_count": 116, + "execution_count": 121, "metadata": { "slideshow": { "slide_type": "-" @@ -3657,7 +3657,7 @@ "True" ] }, - "execution_count": 116, + "execution_count": 121, "metadata": {}, "output_type": "execute_result" } @@ -3689,7 +3689,7 @@ "\n", "$$float = (-1)^{sign} * 1.fraction * 2^{exponent-1023}$$\n", "\n", - "A $1.$ is implicitly prepended as the first digit, and both, $fraction$ and $exponent$, are stored in base $2$ representation (i.e., they both are interpreted like integers above). As $exponent$ is consequently non-negative, between $0_{10}$ and $2047_{10}$ to be precise, the $-1023$ centers the entire $2^{exponent-1023}$ term around $1$ and allows the period within the $1.fraction$ part be shifted into either direction by the same amount. Floating-point numbers received their name as the period, formally called the **[radix point](https://en.wikipedia.org/wiki/Radix_point)**, \"floats\" along the significant digits. As an aside, an $exponent$ of all $0$s or all $1$s is used to model the special values `nan` or `inf`.\n", + "A $1.$ is implicitly prepended as the first digit, and both, $fraction$ and $exponent$, are stored in base $2$ representation (i.e., they both are interpreted like integers above). As $exponent$ is consequently non-negative, between $0_{10}$ and $2047_{10}$ to be precise, the $-1023$, called the exponent bias, centers the entire $2^{exponent-1023}$ term around $1$ and allows the period within the $1.fraction$ part be shifted into either direction by the same amount. Floating-point numbers received their name as the period, formally called the **[radix point](https://en.wikipedia.org/wiki/Radix_point)**, \"floats\" along the significant digits. As an aside, an $exponent$ of all $0$s or all $1$s is used to model the special values `nan` or `inf`.\n", "\n", "As the standard defines the exponent part to come as a power of $2$, we now see why `0.125` is a *precise* float: It can be represented as a power of $2$, i.e., $0.125 = (-1)^0 * 1.0 * 2^{1020-1023} = 2^{-3} = \\frac{1}{8}$. In other words, the floating-point representation of $0.125_{10}$ is $0_2$, $1111111100_2 = 1020_{10}$, and $0_2$ for the three groups, respectively." ] @@ -3726,7 +3726,7 @@ }, { "cell_type": "code", - "execution_count": 117, + "execution_count": 122, "metadata": { "slideshow": { "slide_type": "slide" @@ -3739,7 +3739,7 @@ }, { "cell_type": "code", - "execution_count": 118, + "execution_count": 123, "metadata": { "slideshow": { "slide_type": "-" @@ -3752,7 +3752,7 @@ "'0x1.0000000000000p-3'" ] }, - "execution_count": 118, + "execution_count": 123, "metadata": {}, "output_type": "execute_result" } @@ -3774,7 +3774,7 @@ }, { "cell_type": "code", - "execution_count": 119, + "execution_count": 124, "metadata": { "slideshow": { "slide_type": "-" @@ -3787,7 +3787,7 @@ "(1, 8)" ] }, - "execution_count": 119, + "execution_count": 124, "metadata": {}, "output_type": "execute_result" } @@ -3798,7 +3798,7 @@ }, { "cell_type": "code", - "execution_count": 120, + "execution_count": 125, "metadata": { "slideshow": { "slide_type": "fragment" @@ -3811,7 +3811,7 @@ "'0x1.555475a31a4bep-2'" ] }, - "execution_count": 120, + "execution_count": 125, "metadata": {}, "output_type": "execute_result" } @@ -3822,7 +3822,7 @@ }, { "cell_type": "code", - "execution_count": 121, + "execution_count": 126, "metadata": { "slideshow": { "slide_type": "-" @@ -3835,7 +3835,7 @@ "(3002369727582815, 9007199254740992)" ] }, - "execution_count": 121, + "execution_count": 126, "metadata": {}, "output_type": "execute_result" } @@ -3857,7 +3857,7 @@ }, { "cell_type": "code", - "execution_count": 122, + "execution_count": 127, "metadata": { "slideshow": { "slide_type": "slide" @@ -3870,7 +3870,7 @@ }, { "cell_type": "code", - "execution_count": 123, + "execution_count": 128, "metadata": { "slideshow": { "slide_type": "-" @@ -3883,7 +3883,7 @@ "'0x0.0p+0'" ] }, - "execution_count": 123, + "execution_count": 128, "metadata": {}, "output_type": "execute_result" } @@ -3894,7 +3894,7 @@ }, { "cell_type": "code", - "execution_count": 124, + "execution_count": 129, "metadata": { "slideshow": { "slide_type": "-" @@ -3907,7 +3907,7 @@ "(0, 1)" ] }, - "execution_count": 124, + "execution_count": 129, "metadata": {}, "output_type": "execute_result" } @@ -3924,12 +3924,12 @@ } }, "source": [ - "As seen in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb#%28Data%29-Type-%2F-%22Behavior%22), the [is_integer()](https://docs.python.org/3/library/stdtypes.html#float.is_integer) method tells us if a `float` can be casted as an `int` object without any loss in precision." + "As seen in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb#%28Data%29-Type-%2F-%22Behavior%22), the [is_integer()](https://docs.python.org/3/library/stdtypes.html#float.is_integer) method tells us if a `float` can be casted as an `int` object without any loss in precision." ] }, { "cell_type": "code", - "execution_count": 125, + "execution_count": 130, "metadata": { "slideshow": { "slide_type": "skip" @@ -3942,7 +3942,7 @@ "False" ] }, - "execution_count": 125, + "execution_count": 130, "metadata": {}, "output_type": "execute_result" } @@ -3953,7 +3953,7 @@ }, { "cell_type": "code", - "execution_count": 126, + "execution_count": 131, "metadata": { "slideshow": { "slide_type": "skip" @@ -3966,7 +3966,7 @@ "True" ] }, - "execution_count": 126, + "execution_count": 131, "metadata": {}, "output_type": "execute_result" } @@ -3990,7 +3990,7 @@ }, { "cell_type": "code", - "execution_count": 127, + "execution_count": 132, "metadata": { "slideshow": { "slide_type": "skip" @@ -4003,7 +4003,7 @@ }, { "cell_type": "code", - "execution_count": 128, + "execution_count": 133, "metadata": { "slideshow": { "slide_type": "skip" @@ -4016,7 +4016,7 @@ "sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)" ] }, - "execution_count": 128, + "execution_count": 133, "metadata": {}, "output_type": "execute_result" } @@ -4051,7 +4051,7 @@ }, { "cell_type": "code", - "execution_count": 129, + "execution_count": 134, "metadata": { "slideshow": { "slide_type": "slide" @@ -4075,7 +4075,7 @@ }, { "cell_type": "code", - "execution_count": 130, + "execution_count": 135, "metadata": { "slideshow": { "slide_type": "fragment" @@ -4088,7 +4088,7 @@ "Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])" ] }, - "execution_count": 130, + "execution_count": 135, "metadata": {}, "output_type": "execute_result" } @@ -4110,7 +4110,7 @@ }, { "cell_type": "code", - "execution_count": 131, + "execution_count": 136, "metadata": { "slideshow": { "slide_type": "slide" @@ -4123,7 +4123,7 @@ "Decimal('42')" ] }, - "execution_count": 131, + "execution_count": 136, "metadata": {}, "output_type": "execute_result" } @@ -4134,7 +4134,7 @@ }, { "cell_type": "code", - "execution_count": 132, + "execution_count": 137, "metadata": { "slideshow": { "slide_type": "-" @@ -4147,7 +4147,7 @@ "Decimal('0.1')" ] }, - "execution_count": 132, + "execution_count": 137, "metadata": {}, "output_type": "execute_result" } @@ -4158,7 +4158,7 @@ }, { "cell_type": "code", - "execution_count": 133, + "execution_count": 138, "metadata": { "slideshow": { "slide_type": "-" @@ -4171,7 +4171,7 @@ "Decimal('1E+5')" ] }, - "execution_count": 133, + "execution_count": 138, "metadata": {}, "output_type": "execute_result" } @@ -4193,7 +4193,7 @@ }, { "cell_type": "code", - "execution_count": 134, + "execution_count": 139, "metadata": { "slideshow": { "slide_type": "fragment" @@ -4206,7 +4206,7 @@ "Decimal('0.1000000000000000055511151231257827021181583404541015625')" ] }, - "execution_count": 134, + "execution_count": 139, "metadata": {}, "output_type": "execute_result" } @@ -4228,7 +4228,7 @@ }, { "cell_type": "code", - "execution_count": 135, + "execution_count": 140, "metadata": { "slideshow": { "slide_type": "slide" @@ -4241,7 +4241,7 @@ "Decimal('0.3')" ] }, - "execution_count": 135, + "execution_count": 140, "metadata": {}, "output_type": "execute_result" } @@ -4252,7 +4252,7 @@ }, { "cell_type": "code", - "execution_count": 136, + "execution_count": 141, "metadata": { "slideshow": { "slide_type": "-" @@ -4265,7 +4265,7 @@ "True" ] }, - "execution_count": 136, + "execution_count": 141, "metadata": {}, "output_type": "execute_result" } @@ -4287,7 +4287,7 @@ }, { "cell_type": "code", - "execution_count": 137, + "execution_count": 142, "metadata": { "slideshow": { "slide_type": "fragment" @@ -4300,7 +4300,7 @@ "Decimal('0.30000')" ] }, - "execution_count": 137, + "execution_count": 142, "metadata": {}, "output_type": "execute_result" } @@ -4311,7 +4311,7 @@ }, { "cell_type": "code", - "execution_count": 138, + "execution_count": 143, "metadata": { "slideshow": { "slide_type": "-" @@ -4324,7 +4324,7 @@ "True" ] }, - "execution_count": 138, + "execution_count": 143, "metadata": {}, "output_type": "execute_result" } @@ -4346,7 +4346,7 @@ }, { "cell_type": "code", - "execution_count": 139, + "execution_count": 144, "metadata": { "slideshow": { "slide_type": "slide" @@ -4359,7 +4359,7 @@ "Decimal('42')" ] }, - "execution_count": 139, + "execution_count": 144, "metadata": {}, "output_type": "execute_result" } @@ -4370,7 +4370,7 @@ }, { "cell_type": "code", - "execution_count": 140, + "execution_count": 145, "metadata": { "slideshow": { "slide_type": "-" @@ -4383,7 +4383,7 @@ "Decimal('42')" ] }, - "execution_count": 140, + "execution_count": 145, "metadata": {}, "output_type": "execute_result" } @@ -4394,7 +4394,7 @@ }, { "cell_type": "code", - "execution_count": 141, + "execution_count": 146, "metadata": { "slideshow": { "slide_type": "slide" @@ -4407,7 +4407,7 @@ "Decimal('0.1')" ] }, - "execution_count": 141, + "execution_count": 146, "metadata": {}, "output_type": "execute_result" } @@ -4429,7 +4429,7 @@ }, { "cell_type": "code", - "execution_count": 142, + "execution_count": 147, "metadata": { "slideshow": { "slide_type": "fragment" @@ -4442,7 +4442,7 @@ "'0.10000000000000000000000000000000000000000000000000'" ] }, - "execution_count": 142, + "execution_count": 147, "metadata": {}, "output_type": "execute_result" } @@ -4453,7 +4453,7 @@ }, { "cell_type": "code", - "execution_count": 143, + "execution_count": 148, "metadata": { "slideshow": { "slide_type": "-" @@ -4466,7 +4466,7 @@ "'0.10000000000000000555111512312578270211815834045410'" ] }, - "execution_count": 143, + "execution_count": 148, "metadata": {}, "output_type": "execute_result" } @@ -4488,7 +4488,7 @@ }, { "cell_type": "code", - "execution_count": 144, + "execution_count": 149, "metadata": { "slideshow": { "slide_type": "slide" @@ -4502,7 +4502,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;36m1.0\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mDecimal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m42\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;36m1.0\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mDecimal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m42\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for *: 'float' and 'decimal.Decimal'" ] } @@ -4524,7 +4524,7 @@ }, { "cell_type": "code", - "execution_count": 145, + "execution_count": 150, "metadata": { "slideshow": { "slide_type": "slide" @@ -4537,7 +4537,7 @@ "Decimal('2')" ] }, - "execution_count": 145, + "execution_count": 150, "metadata": {}, "output_type": "execute_result" } @@ -4548,7 +4548,7 @@ }, { "cell_type": "code", - "execution_count": 146, + "execution_count": 151, "metadata": { "slideshow": { "slide_type": "-" @@ -4561,7 +4561,7 @@ "Decimal('1.414213562373095048801688724')" ] }, - "execution_count": 146, + "execution_count": 151, "metadata": {}, "output_type": "execute_result" } @@ -4585,7 +4585,7 @@ }, { "cell_type": "code", - "execution_count": 147, + "execution_count": 152, "metadata": { "slideshow": { "slide_type": "fragment" @@ -4598,7 +4598,7 @@ "Decimal('1.999999999999999999999999999')" ] }, - "execution_count": 147, + "execution_count": 152, "metadata": {}, "output_type": "execute_result" } @@ -4624,7 +4624,7 @@ }, { "cell_type": "code", - "execution_count": 148, + "execution_count": 153, "metadata": { "slideshow": { "slide_type": "fragment" @@ -4637,7 +4637,7 @@ "Decimal('2.0000')" ] }, - "execution_count": 148, + "execution_count": 153, "metadata": {}, "output_type": "execute_result" } @@ -4655,7 +4655,7 @@ }, { "cell_type": "code", - "execution_count": 149, + "execution_count": 154, "metadata": {}, "outputs": [ { @@ -4665,7 +4665,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mInvalidOperation\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtwo\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquantize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mDecimal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"0.1\"\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m**\u001b[0m \u001b[0;36m28\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtwo\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquantize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mDecimal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"0.1\"\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m**\u001b[0m \u001b[0;36m28\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mInvalidOperation\u001b[0m: []" ] } @@ -4687,7 +4687,7 @@ }, { "cell_type": "code", - "execution_count": 150, + "execution_count": 155, "metadata": { "slideshow": { "slide_type": "skip" @@ -4700,7 +4700,7 @@ "True" ] }, - "execution_count": 150, + "execution_count": 155, "metadata": {}, "output_type": "execute_result" } @@ -4722,7 +4722,7 @@ }, { "cell_type": "code", - "execution_count": 151, + "execution_count": 156, "metadata": { "slideshow": { "slide_type": "fragment" @@ -4735,7 +4735,7 @@ "True" ] }, - "execution_count": 151, + "execution_count": 156, "metadata": {}, "output_type": "execute_result" } @@ -4757,7 +4757,7 @@ }, { "cell_type": "code", - "execution_count": 152, + "execution_count": 157, "metadata": { "slideshow": { "slide_type": "skip" @@ -4770,7 +4770,7 @@ "Decimal('NaN')" ] }, - "execution_count": 152, + "execution_count": 157, "metadata": {}, "output_type": "execute_result" } @@ -4781,7 +4781,7 @@ }, { "cell_type": "code", - "execution_count": 153, + "execution_count": 158, "metadata": { "slideshow": { "slide_type": "skip" @@ -4794,7 +4794,7 @@ "False" ] }, - "execution_count": 153, + "execution_count": 158, "metadata": {}, "output_type": "execute_result" } @@ -4805,7 +4805,7 @@ }, { "cell_type": "code", - "execution_count": 154, + "execution_count": 159, "metadata": { "slideshow": { "slide_type": "skip" @@ -4818,7 +4818,7 @@ "Decimal('Infinity')" ] }, - "execution_count": 154, + "execution_count": 159, "metadata": {}, "output_type": "execute_result" } @@ -4829,7 +4829,7 @@ }, { "cell_type": "code", - "execution_count": 155, + "execution_count": 160, "metadata": { "slideshow": { "slide_type": "skip" @@ -4842,7 +4842,7 @@ "Decimal('-Infinity')" ] }, - "execution_count": 155, + "execution_count": 160, "metadata": {}, "output_type": "execute_result" } @@ -4853,7 +4853,7 @@ }, { "cell_type": "code", - "execution_count": 156, + "execution_count": 161, "metadata": { "slideshow": { "slide_type": "skip" @@ -4866,7 +4866,7 @@ "Decimal('Infinity')" ] }, - "execution_count": 156, + "execution_count": 161, "metadata": {}, "output_type": "execute_result" } @@ -4877,7 +4877,7 @@ }, { "cell_type": "code", - "execution_count": 157, + "execution_count": 162, "metadata": { "slideshow": { "slide_type": "skip" @@ -4890,7 +4890,7 @@ "True" ] }, - "execution_count": 157, + "execution_count": 162, "metadata": {}, "output_type": "execute_result" } @@ -4912,7 +4912,7 @@ }, { "cell_type": "code", - "execution_count": 158, + "execution_count": 163, "metadata": { "slideshow": { "slide_type": "skip" @@ -4926,7 +4926,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mInvalidOperation\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mDecimal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"inf\"\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mDecimal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"-inf\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mDecimal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"inf\"\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mDecimal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"-inf\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mInvalidOperation\u001b[0m: []" ] } @@ -4937,7 +4937,7 @@ }, { "cell_type": "code", - "execution_count": 159, + "execution_count": 164, "metadata": { "slideshow": { "slide_type": "skip" @@ -4951,7 +4951,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mInvalidOperation\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mDecimal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"inf\"\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mDecimal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"inf\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mDecimal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"inf\"\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mDecimal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"inf\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mInvalidOperation\u001b[0m: []" ] } @@ -4997,7 +4997,7 @@ }, { "cell_type": "code", - "execution_count": 160, + "execution_count": 165, "metadata": { "slideshow": { "slide_type": "slide" @@ -5021,7 +5021,7 @@ }, { "cell_type": "code", - "execution_count": 161, + "execution_count": 166, "metadata": { "slideshow": { "slide_type": "fragment" @@ -5034,7 +5034,7 @@ "Fraction(1, 3)" ] }, - "execution_count": 161, + "execution_count": 166, "metadata": {}, "output_type": "execute_result" } @@ -5045,7 +5045,7 @@ }, { "cell_type": "code", - "execution_count": 162, + "execution_count": 167, "metadata": { "slideshow": { "slide_type": "-" @@ -5058,7 +5058,7 @@ "Fraction(1, 3)" ] }, - "execution_count": 162, + "execution_count": 167, "metadata": {}, "output_type": "execute_result" } @@ -5069,7 +5069,7 @@ }, { "cell_type": "code", - "execution_count": 163, + "execution_count": 168, "metadata": { "slideshow": { "slide_type": "-" @@ -5082,7 +5082,7 @@ "Fraction(3333333333, 10000000000)" ] }, - "execution_count": 163, + "execution_count": 168, "metadata": {}, "output_type": "execute_result" } @@ -5093,7 +5093,7 @@ }, { "cell_type": "code", - "execution_count": 164, + "execution_count": 169, "metadata": { "slideshow": { "slide_type": "-" @@ -5106,7 +5106,7 @@ "Fraction(3333333333, 10000000000)" ] }, - "execution_count": 164, + "execution_count": 169, "metadata": {}, "output_type": "execute_result" } @@ -5128,7 +5128,7 @@ }, { "cell_type": "code", - "execution_count": 165, + "execution_count": 170, "metadata": { "slideshow": { "slide_type": "slide" @@ -5141,7 +5141,7 @@ "Fraction(3, 2)" ] }, - "execution_count": 165, + "execution_count": 170, "metadata": {}, "output_type": "execute_result" } @@ -5152,7 +5152,7 @@ }, { "cell_type": "code", - "execution_count": 166, + "execution_count": 171, "metadata": { "slideshow": { "slide_type": "-" @@ -5165,7 +5165,7 @@ "Fraction(3, 2)" ] }, - "execution_count": 166, + "execution_count": 171, "metadata": {}, "output_type": "execute_result" } @@ -5187,7 +5187,7 @@ }, { "cell_type": "code", - "execution_count": 167, + "execution_count": 172, "metadata": { "slideshow": { "slide_type": "slide" @@ -5200,7 +5200,7 @@ "Fraction(1, 10)" ] }, - "execution_count": 167, + "execution_count": 172, "metadata": {}, "output_type": "execute_result" } @@ -5222,7 +5222,7 @@ }, { "cell_type": "code", - "execution_count": 168, + "execution_count": 173, "metadata": { "slideshow": { "slide_type": "-" @@ -5235,7 +5235,7 @@ "Fraction(3602879701896397, 36028797018963968)" ] }, - "execution_count": 168, + "execution_count": 173, "metadata": {}, "output_type": "execute_result" } @@ -5257,7 +5257,7 @@ }, { "cell_type": "code", - "execution_count": 169, + "execution_count": 174, "metadata": { "slideshow": { "slide_type": "slide" @@ -5270,7 +5270,7 @@ "Fraction(7, 4)" ] }, - "execution_count": 169, + "execution_count": 174, "metadata": {}, "output_type": "execute_result" } @@ -5281,7 +5281,7 @@ }, { "cell_type": "code", - "execution_count": 170, + "execution_count": 175, "metadata": { "slideshow": { "slide_type": "-" @@ -5294,7 +5294,7 @@ "Fraction(1, 2)" ] }, - "execution_count": 170, + "execution_count": 175, "metadata": {}, "output_type": "execute_result" } @@ -5305,7 +5305,7 @@ }, { "cell_type": "code", - "execution_count": 171, + "execution_count": 176, "metadata": { "slideshow": { "slide_type": "-" @@ -5318,7 +5318,7 @@ "Fraction(1, 1)" ] }, - "execution_count": 171, + "execution_count": 176, "metadata": {}, "output_type": "execute_result" } @@ -5329,7 +5329,7 @@ }, { "cell_type": "code", - "execution_count": 172, + "execution_count": 177, "metadata": { "slideshow": { "slide_type": "-" @@ -5342,7 +5342,7 @@ "Fraction(1, 1)" ] }, - "execution_count": 172, + "execution_count": 177, "metadata": {}, "output_type": "execute_result" } @@ -5364,7 +5364,7 @@ }, { "cell_type": "code", - "execution_count": 173, + "execution_count": 178, "metadata": { "slideshow": { "slide_type": "slide" @@ -5377,7 +5377,7 @@ "0.1" ] }, - "execution_count": 173, + "execution_count": 178, "metadata": {}, "output_type": "execute_result" } @@ -5388,7 +5388,7 @@ }, { "cell_type": "code", - "execution_count": 174, + "execution_count": 179, "metadata": { "slideshow": { "slide_type": "fragment" @@ -5401,7 +5401,7 @@ "'0.10000000000000000555111512312578270211815834045410'" ] }, - "execution_count": 174, + "execution_count": 179, "metadata": {}, "output_type": "execute_result" } @@ -5475,7 +5475,7 @@ }, { "cell_type": "code", - "execution_count": 175, + "execution_count": 180, "metadata": { "slideshow": { "slide_type": "slide" @@ -5488,7 +5488,7 @@ }, { "cell_type": "code", - "execution_count": 176, + "execution_count": 181, "metadata": { "slideshow": { "slide_type": "fragment" @@ -5498,10 +5498,10 @@ { "data": { "text/plain": [ - "140673804641712" + "140166567772848" ] }, - "execution_count": 176, + "execution_count": 181, "metadata": {}, "output_type": "execute_result" } @@ -5512,7 +5512,7 @@ }, { "cell_type": "code", - "execution_count": 177, + "execution_count": 182, "metadata": { "slideshow": { "slide_type": "-" @@ -5525,7 +5525,7 @@ "complex" ] }, - "execution_count": 177, + "execution_count": 182, "metadata": {}, "output_type": "execute_result" } @@ -5536,7 +5536,7 @@ }, { "cell_type": "code", - "execution_count": 178, + "execution_count": 183, "metadata": { "slideshow": { "slide_type": "-" @@ -5549,7 +5549,7 @@ "1j" ] }, - "execution_count": 178, + "execution_count": 183, "metadata": {}, "output_type": "execute_result" } @@ -5571,7 +5571,7 @@ }, { "cell_type": "code", - "execution_count": 179, + "execution_count": 184, "metadata": { "slideshow": { "slide_type": "slide" @@ -5584,7 +5584,7 @@ "True" ] }, - "execution_count": 179, + "execution_count": 184, "metadata": {}, "output_type": "execute_result" } @@ -5606,7 +5606,7 @@ }, { "cell_type": "code", - "execution_count": 180, + "execution_count": 185, "metadata": { "slideshow": { "slide_type": "slide" @@ -5619,7 +5619,7 @@ "(2+0.5j)" ] }, - "execution_count": 180, + "execution_count": 185, "metadata": {}, "output_type": "execute_result" } @@ -5641,7 +5641,7 @@ }, { "cell_type": "code", - "execution_count": 181, + "execution_count": 186, "metadata": { "slideshow": { "slide_type": "-" @@ -5654,7 +5654,7 @@ "(2+0.5j)" ] }, - "execution_count": 181, + "execution_count": 186, "metadata": {}, "output_type": "execute_result" } @@ -5665,7 +5665,7 @@ }, { "cell_type": "code", - "execution_count": 182, + "execution_count": 187, "metadata": { "slideshow": { "slide_type": "-" @@ -5678,7 +5678,7 @@ "(2+0j)" ] }, - "execution_count": 182, + "execution_count": 187, "metadata": {}, "output_type": "execute_result" } @@ -5689,7 +5689,7 @@ }, { "cell_type": "code", - "execution_count": 183, + "execution_count": 188, "metadata": { "slideshow": { "slide_type": "skip" @@ -5702,7 +5702,7 @@ "(2+0.5j)" ] }, - "execution_count": 183, + "execution_count": 188, "metadata": {}, "output_type": "execute_result" } @@ -5713,7 +5713,7 @@ }, { "cell_type": "code", - "execution_count": 184, + "execution_count": 189, "metadata": { "slideshow": { "slide_type": "skip" @@ -5726,7 +5726,7 @@ "(2+0.5j)" ] }, - "execution_count": 184, + "execution_count": 189, "metadata": {}, "output_type": "execute_result" } @@ -5748,7 +5748,7 @@ }, { "cell_type": "code", - "execution_count": 185, + "execution_count": 190, "metadata": { "slideshow": { "slide_type": "slide" @@ -5762,7 +5762,7 @@ }, { "cell_type": "code", - "execution_count": 186, + "execution_count": 191, "metadata": { "slideshow": { "slide_type": "fragment" @@ -5775,7 +5775,7 @@ "(4+6j)" ] }, - "execution_count": 186, + "execution_count": 191, "metadata": {}, "output_type": "execute_result" } @@ -5786,7 +5786,7 @@ }, { "cell_type": "code", - "execution_count": 187, + "execution_count": 192, "metadata": { "slideshow": { "slide_type": "-" @@ -5799,7 +5799,7 @@ "(-2-2j)" ] }, - "execution_count": 187, + "execution_count": 192, "metadata": {}, "output_type": "execute_result" } @@ -5810,7 +5810,7 @@ }, { "cell_type": "code", - "execution_count": 188, + "execution_count": 193, "metadata": { "slideshow": { "slide_type": "skip" @@ -5823,7 +5823,7 @@ "(40+2j)" ] }, - "execution_count": 188, + "execution_count": 193, "metadata": {}, "output_type": "execute_result" } @@ -5834,7 +5834,7 @@ }, { "cell_type": "code", - "execution_count": 189, + "execution_count": 194, "metadata": { "slideshow": { "slide_type": "skip" @@ -5847,7 +5847,7 @@ "-4j" ] }, - "execution_count": 189, + "execution_count": 194, "metadata": {}, "output_type": "execute_result" } @@ -5858,7 +5858,7 @@ }, { "cell_type": "code", - "execution_count": 190, + "execution_count": 195, "metadata": { "slideshow": { "slide_type": "skip" @@ -5871,7 +5871,7 @@ "(5+10j)" ] }, - "execution_count": 190, + "execution_count": 195, "metadata": {}, "output_type": "execute_result" } @@ -5882,7 +5882,7 @@ }, { "cell_type": "code", - "execution_count": 191, + "execution_count": 196, "metadata": { "slideshow": { "slide_type": "skip" @@ -5895,7 +5895,7 @@ "(0.5+0.6666666666666666j)" ] }, - "execution_count": 191, + "execution_count": 196, "metadata": {}, "output_type": "execute_result" } @@ -5906,7 +5906,7 @@ }, { "cell_type": "code", - "execution_count": 192, + "execution_count": 197, "metadata": { "slideshow": { "slide_type": "fragment" @@ -5919,7 +5919,7 @@ "(-5+10j)" ] }, - "execution_count": 192, + "execution_count": 197, "metadata": {}, "output_type": "execute_result" } @@ -5930,7 +5930,7 @@ }, { "cell_type": "code", - "execution_count": 193, + "execution_count": 198, "metadata": { "slideshow": { "slide_type": "-" @@ -5943,7 +5943,7 @@ "(0.44+0.08j)" ] }, - "execution_count": 193, + "execution_count": 198, "metadata": {}, "output_type": "execute_result" } @@ -5965,7 +5965,7 @@ }, { "cell_type": "code", - "execution_count": 194, + "execution_count": 199, "metadata": { "slideshow": { "slide_type": "slide" @@ -5978,7 +5978,7 @@ "5.0" ] }, - "execution_count": 194, + "execution_count": 199, "metadata": {}, "output_type": "execute_result" } @@ -6000,7 +6000,7 @@ }, { "cell_type": "code", - "execution_count": 195, + "execution_count": 200, "metadata": { "slideshow": { "slide_type": "fragment" @@ -6013,7 +6013,7 @@ "1.0" ] }, - "execution_count": 195, + "execution_count": 200, "metadata": {}, "output_type": "execute_result" } @@ -6024,7 +6024,7 @@ }, { "cell_type": "code", - "execution_count": 196, + "execution_count": 201, "metadata": { "slideshow": { "slide_type": "-" @@ -6037,7 +6037,7 @@ "2.0" ] }, - "execution_count": 196, + "execution_count": 201, "metadata": {}, "output_type": "execute_result" } @@ -6059,7 +6059,7 @@ }, { "cell_type": "code", - "execution_count": 197, + "execution_count": 202, "metadata": { "slideshow": { "slide_type": "fragment" @@ -6072,7 +6072,7 @@ "(1-2j)" ] }, - "execution_count": 197, + "execution_count": 202, "metadata": {}, "output_type": "execute_result" } @@ -6111,7 +6111,7 @@ } }, "source": [ - "Analogous to the discussion of *containers* and *iterables* in [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration.ipynb#Containers-vs.-Iterables), we contrast the *concrete* numeric data types in this chapter with the *abstract* ideas behind [numbers in mathematics](https://en.wikipedia.org/wiki/Number).\n", + "Analogous to the discussion of *containers* and *iterables* in [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_00_content.ipynb#Containers-vs.-Iterables), we contrast the *concrete* numeric data types in this chapter with the *abstract* ideas behind [numbers in mathematics](https://en.wikipedia.org/wiki/Number).\n", "\n", "The figure below summarizes five *major* sets of [numbers in mathematics](https://en.wikipedia.org/wiki/Number) as we know them from high school:\n", "\n", @@ -6151,16 +6151,16 @@ "\n", "The abstract concepts behind the four outer-most mathematical sets are formalized in Python since [PEP 3141](https://www.python.org/dev/peps/pep-3141/) in 2007. The [numbers](https://docs.python.org/3/library/numbers.html) module in the [standard library](https://docs.python.org/3/library/index.html) defines what programmers call the **[numerical tower](https://en.wikipedia.org/wiki/Numerical_tower)**, a collection of five **[abstract data types](https://en.wikipedia.org/wiki/Abstract_data_type)**, or **abstract base classes** (ABCs) as they are called in Python jargon:\n", "\n", - "- `numbers.Number`: \"any number\" (cf., [documentation](https://docs.python.org/3/library/numbers.html#numbers.Number))\n", - "- `numbers.Complex`: \"all complex numbers\" (cf., [documentation](https://docs.python.org/3/library/numbers.html#numbers.Complex))\n", - "- `numbers.Real`: \"all real numbers\" (cf., [documentation](https://docs.python.org/3/library/numbers.html#numbers.Real))\n", - "- `numbers.Rational`: \"all rational numbers\" (cf., [documentation](https://docs.python.org/3/library/numbers.html#numbers.Rational))\n", - "- `numbers.Integral`: \"all integers\" (cf., [documentation](https://docs.python.org/3/library/numbers.html#numbers.Integral))" + "- `Number`: \"any number\" (cf., [documentation](https://docs.python.org/3/library/numbers.html#numbers.Number))\n", + "- `Complex`: \"all complex numbers\" (cf., [documentation](https://docs.python.org/3/library/numbers.html#numbers.Complex))\n", + "- `Real`: \"all real numbers\" (cf., [documentation](https://docs.python.org/3/library/numbers.html#numbers.Real))\n", + "- `Rational`: \"all rational numbers\" (cf., [documentation](https://docs.python.org/3/library/numbers.html#numbers.Rational))\n", + "- `Integral`: \"all integers\" (cf., [documentation](https://docs.python.org/3/library/numbers.html#numbers.Integral))" ] }, { "cell_type": "code", - "execution_count": 198, + "execution_count": 203, "metadata": { "slideshow": { "slide_type": "slide" @@ -6173,7 +6173,7 @@ }, { "cell_type": "code", - "execution_count": 199, + "execution_count": 204, "metadata": { "slideshow": { "slide_type": "-" @@ -6201,7 +6201,7 @@ " 'abstractmethod']" ] }, - "execution_count": 199, + "execution_count": 204, "metadata": {}, "output_type": "execute_result" } @@ -6227,7 +6227,7 @@ }, { "cell_type": "code", - "execution_count": 200, + "execution_count": 205, "metadata": { "scrolled": true, "slideshow": { @@ -6338,7 +6338,7 @@ }, { "cell_type": "code", - "execution_count": 201, + "execution_count": 206, "metadata": { "slideshow": { "slide_type": "skip" @@ -6505,7 +6505,7 @@ }, { "cell_type": "code", - "execution_count": 202, + "execution_count": 207, "metadata": { "slideshow": { "slide_type": "slide" @@ -6518,7 +6518,7 @@ "42" ] }, - "execution_count": 202, + "execution_count": 207, "metadata": {}, "output_type": "execute_result" } @@ -6529,7 +6529,7 @@ }, { "cell_type": "code", - "execution_count": 203, + "execution_count": 208, "metadata": { "slideshow": { "slide_type": "-" @@ -6542,7 +6542,7 @@ "Decimal('0.1')" ] }, - "execution_count": 203, + "execution_count": 208, "metadata": {}, "output_type": "execute_result" } @@ -6553,7 +6553,7 @@ }, { "cell_type": "code", - "execution_count": 204, + "execution_count": 209, "metadata": { "slideshow": { "slide_type": "-" @@ -6566,7 +6566,7 @@ "5.0" ] }, - "execution_count": 204, + "execution_count": 209, "metadata": {}, "output_type": "execute_result" } @@ -6588,7 +6588,7 @@ }, { "cell_type": "code", - "execution_count": 205, + "execution_count": 210, "metadata": { "slideshow": { "slide_type": "fragment" @@ -6601,7 +6601,7 @@ "42" ] }, - "execution_count": 205, + "execution_count": 210, "metadata": {}, "output_type": "execute_result" } @@ -6612,7 +6612,7 @@ }, { "cell_type": "code", - "execution_count": 206, + "execution_count": 211, "metadata": { "slideshow": { "slide_type": "-" @@ -6625,7 +6625,7 @@ "0" ] }, - "execution_count": 206, + "execution_count": 211, "metadata": {}, "output_type": "execute_result" } @@ -6647,7 +6647,7 @@ }, { "cell_type": "code", - "execution_count": 207, + "execution_count": 212, "metadata": { "slideshow": { "slide_type": "-" @@ -6661,7 +6661,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mround\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m4\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m3j\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mround\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m4\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m3j\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: type complex doesn't define __round__ method" ] } @@ -6683,7 +6683,7 @@ }, { "cell_type": "code", - "execution_count": 208, + "execution_count": 213, "metadata": { "slideshow": { "slide_type": "slide" @@ -6707,7 +6707,7 @@ }, { "cell_type": "code", - "execution_count": 209, + "execution_count": 214, "metadata": { "slideshow": { "slide_type": "-" @@ -6720,7 +6720,7 @@ "0" ] }, - "execution_count": 209, + "execution_count": 214, "metadata": {}, "output_type": "execute_result" } @@ -6742,7 +6742,7 @@ }, { "cell_type": "code", - "execution_count": 210, + "execution_count": 215, "metadata": { "slideshow": { "slide_type": "fragment" @@ -6756,7 +6756,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0.9\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1j\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0.9\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1j\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: type complex doesn't define __trunc__ method" ] } @@ -6780,7 +6780,7 @@ }, { "cell_type": "code", - "execution_count": 211, + "execution_count": 216, "metadata": { "slideshow": { "slide_type": "slide" @@ -6793,7 +6793,7 @@ "True" ] }, - "execution_count": 211, + "execution_count": 216, "metadata": {}, "output_type": "execute_result" } @@ -6804,7 +6804,7 @@ }, { "cell_type": "code", - "execution_count": 212, + "execution_count": 217, "metadata": { "slideshow": { "slide_type": "fragment" @@ -6817,7 +6817,7 @@ "True" ] }, - "execution_count": 212, + "execution_count": 217, "metadata": {}, "output_type": "execute_result" } @@ -6828,7 +6828,7 @@ }, { "cell_type": "code", - "execution_count": 213, + "execution_count": 218, "metadata": { "slideshow": { "slide_type": "-" @@ -6841,7 +6841,7 @@ "True" ] }, - "execution_count": 213, + "execution_count": 218, "metadata": {}, "output_type": "execute_result" } @@ -6852,7 +6852,7 @@ }, { "cell_type": "code", - "execution_count": 214, + "execution_count": 219, "metadata": { "slideshow": { "slide_type": "-" @@ -6865,7 +6865,7 @@ "True" ] }, - "execution_count": 214, + "execution_count": 219, "metadata": {}, "output_type": "execute_result" } @@ -6887,7 +6887,7 @@ }, { "cell_type": "code", - "execution_count": 215, + "execution_count": 220, "metadata": { "slideshow": { "slide_type": "slide" @@ -6900,7 +6900,7 @@ "False" ] }, - "execution_count": 215, + "execution_count": 220, "metadata": {}, "output_type": "execute_result" } @@ -6922,7 +6922,7 @@ }, { "cell_type": "code", - "execution_count": 216, + "execution_count": 221, "metadata": { "slideshow": { "slide_type": "fragment" @@ -6935,7 +6935,7 @@ "True" ] }, - "execution_count": 216, + "execution_count": 221, "metadata": {}, "output_type": "execute_result" } @@ -6946,7 +6946,7 @@ }, { "cell_type": "code", - "execution_count": 217, + "execution_count": 222, "metadata": { "slideshow": { "slide_type": "-" @@ -6959,7 +6959,7 @@ "False" ] }, - "execution_count": 217, + "execution_count": 222, "metadata": {}, "output_type": "execute_result" } @@ -7005,7 +7005,7 @@ }, { "cell_type": "code", - "execution_count": 218, + "execution_count": 223, "metadata": { "slideshow": { "slide_type": "slide" @@ -7055,7 +7055,7 @@ }, { "cell_type": "code", - "execution_count": 219, + "execution_count": 224, "metadata": { "slideshow": { "slide_type": "slide" @@ -7068,7 +7068,7 @@ "1" ] }, - "execution_count": 219, + "execution_count": 224, "metadata": {}, "output_type": "execute_result" } @@ -7079,7 +7079,7 @@ }, { "cell_type": "code", - "execution_count": 220, + "execution_count": 225, "metadata": { "slideshow": { "slide_type": "-" @@ -7092,7 +7092,7 @@ "6" ] }, - "execution_count": 220, + "execution_count": 225, "metadata": {}, "output_type": "execute_result" } @@ -7103,7 +7103,7 @@ }, { "cell_type": "code", - "execution_count": 221, + "execution_count": 226, "metadata": { "slideshow": { "slide_type": "fragment" @@ -7116,7 +7116,7 @@ "6" ] }, - "execution_count": 221, + "execution_count": 226, "metadata": {}, "output_type": "execute_result" } @@ -7138,7 +7138,7 @@ }, { "cell_type": "code", - "execution_count": 222, + "execution_count": 227, "metadata": { "slideshow": { "slide_type": "slide" @@ -7152,8 +7152,8 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mfactorial\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m3.1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mfactorial\u001b[0;34m(n, strict)\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnumbers\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mReal\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mn\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mmath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mstrict\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 18\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"n is not an integer-like value; it has decimals\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 19\u001b[0m \u001b[0mn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mfactorial\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m3.1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mfactorial\u001b[0;34m(n, strict)\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnumbers\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mReal\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mn\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mmath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mstrict\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 18\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"n is not an integer-like value; it has decimals\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 19\u001b[0m \u001b[0mn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mTypeError\u001b[0m: n is not an integer-like value; it has decimals" ] } @@ -7175,7 +7175,7 @@ }, { "cell_type": "code", - "execution_count": 223, + "execution_count": 228, "metadata": { "slideshow": { "slide_type": "fragment" @@ -7188,7 +7188,7 @@ "6" ] }, - "execution_count": 223, + "execution_count": 228, "metadata": {}, "output_type": "execute_result" } @@ -7210,7 +7210,7 @@ }, { "cell_type": "code", - "execution_count": 224, + "execution_count": 229, "metadata": { "slideshow": { "slide_type": "slide" @@ -7224,8 +7224,8 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mfactorial\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m2j\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mfactorial\u001b[0;34m(n, strict)\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0mn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 21\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Factorial is only defined for integers\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 22\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mn\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mfactorial\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m2j\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mfactorial\u001b[0;34m(n, strict)\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0mn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 21\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Factorial is only defined for integers\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 22\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mn\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mTypeError\u001b[0m: Factorial is only defined for integers" ] } @@ -7287,7 +7287,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.4" }, "livereveal": { "auto_select": "code", @@ -7315,5 +7315,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/05_numbers_10_review.ipynb b/05_numbers_10_review.ipynb new file mode 100644 index 0000000..819d668 --- /dev/null +++ b/05_numbers_10_review.ipynb @@ -0,0 +1,347 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# Chapter 5: Bits & Numbers" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Content Review" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Read [Chapter 5](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers_00_content.ipynb) of the book. Then, work through the questions below." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Essay Questions " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Answer the following questions briefly with *at most* 300 characters per question!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1**: In what way is the **binary representation** of `int` objects *similar* to the **decimal system** taught in elementary school?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q2**: Why may objects of type `bool` be regarded a **numeric type** as well?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q3**: Why is it *inefficient* to store `bool` objects in bits resembling a **hexadecimal representation**?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q4**: Colors are commonly expressed in the **hexadecimal system** in websites (cf., the [HTML](https://en.wikipedia.org/wiki/HTML) and [CSS](https://en.wikipedia.org/wiki/Cascading_Style_Sheets) formats).\n", + "\n", + "For example, $#000000$, $#ff9900$, and $#ffffff$ turn out to be black, orange, and white. The six digits are read in *pairs of two* from left to right, and the *three pairs* correspond to the proportions of red, green, and blue mixed together. They reach from $0_{16} = 0_{10}$ for $0$% to $\\text{ff}_{16} = 255_{10}$ for $100$% (cf., this [article](https://en.wikipedia.org/wiki/RGB_color_model) for an in-depth discussion).\n", + "\n", + "In percent, what are the proportions of red, green, and blue that make up orange? Calculate the three percentages separately! How many **bytes** are needed to encode a color? How many **bits** are that?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q5**: What does it mean for a code fragment to **fail silently**?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q6**: Explain why the mathematical set of all real numbers $\\mathbb{R}$ can only be **approximated** by floating-point numbers on a computer!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q7**: How do we deal with a `float` object's imprecision if we need to **check for equality**?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q8**: What data type, built-in or from the [standard library](https://docs.python.org/3/library/index.html), is best suited to represent the [transcendental numbers](https://en.wikipedia.org/wiki/Transcendental_number) $\\pi$ and $\\text{e}$?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q9**: How can **abstract base classes**, for example, as defined in the **numerical tower**, be helpful in enabling **duck typing**?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### True / False Questions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Motivate your answer with *one short* sentence!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q10**: The precision of `int` objects depends on how we choose to represent them in memory. For example, using a **hexadecimal representation** gives us $16^8$ digits whereas with a **binary representation** an `int` object can have *at most* $2^8$ digits." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q11**: With the built-in [round()](https://docs.python.org/3/library/functions.html#round) function, we obtain a *precise* representation for any `float` object if we can live with *less than* $15$ digits of precision." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q12**: As most currencies operate with $2$ or $3$ decimals (e.g., EUR $9.99$), the `float` type's limitation of *at most* $15$ digits is *not* a problem in practice." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q13**: The [IEEE 754](https://en.wikipedia.org/wiki/IEEE_754) standard's **special values** provide no benefit in practice as we could always use a **[sentinel](https://en.wikipedia.org/wiki/Sentinel_value)** value (i.e., a \"dummy\"). For example, instead of `nan`, we can always use `0` to indicate a *missing* value." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q14**: The following code fragment raises an `InvalidOperation` exception. That is an example of code **failing loudly**.\n", + "```python\n", + "float(\"inf\") + float(\"-inf\")\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q15**: Python provides a `scientific` type (e.g., `1.23e4`) that is useful mainly to model problems in the domains of physics or astrophysics." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q16**: From a practitioner's point of view, the built-in [format()](https://docs.python.org/3/library/functions.html#format) function does the *same* as the built-in [round()](https://docs.python.org/3/library/functions.html#round) function." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q17**: The `Decimal` type from the [decimal](https://docs.python.org/3/library/decimal.html) module in the [standard library](https://docs.python.org/3/library/index.html) allows us to model the set of the real numbers $\\mathbb{R}$ *precisely*." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q18**: The `Fraction` type from the [fractions](https://docs.python.org/3/library/fractions.html) module in the [standard library](https://docs.python.org/3/library/index.html) allows us to model the set of the rational numbers $\\mathbb{Q}$ *precisely*." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + } + ], + "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.4" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": true, + "skip_h1_title": true, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": false, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/05_numbers_20_exercises.ipynb b/05_numbers_20_exercises.ipynb new file mode 100644 index 0000000..d00ef2e --- /dev/null +++ b/05_numbers_20_exercises.ipynb @@ -0,0 +1,412 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# Chapter 5: Bits & Numbers" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Coding Exercises" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Read [Chapter 5](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers_00_content.ipynb) of the book. Then, work through the exercises below." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Discounting Customer Orders (revisited)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1** in [Chapter 2's Exercises](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions_20_exercises.ipynb#Volume-of-a-Sphere) section already revealed that we must consider the effects of the `float` type's imprecision.\n", + "\n", + "This becomes even more important when we deal with numeric data modeling accounting or finance data (cf., [this comment](https://stackoverflow.com/a/24976426) on \"falsehoods programmers believe about money\").\n", + "\n", + "In addition to the *inherent imprecision* of numbers in general, the topic of **[rounding numbers](https://en.wikipedia.org/wiki/Rounding)** is also not as trivial as we might expect! [This article](https://realpython.com/python-rounding/) summarizes everything the data science practitioner needs to know.\n", + "\n", + "In this exercise, we revisit **Q1** from [Chapter 3's Exercises](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals_20_exercises.ipynb#Discounting-Customer-Orders) section, and make the `discounted_price()` function work *correctly* for real-life sales data." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1.1**: Execute the code cells below! What results would you have *expected*, and why?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "round(1.5)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "round(2.5)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "round(2.675, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1.2**: The built-in [round()](https://docs.python.org/3/library/functions.html#round) function implements the \"**[round half to even](https://en.wikipedia.org/wiki/Rounding#Round_half_to_even)**\" strategy. Describe in one or two sentences what that means!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1.3**: For the revised `discounted_price()` function, we have to tackle *two* issues: First, we have to replace the built-in `float` type with a data type that allows us to control the precision. Second, the discounted price should be rounded according to a more human-friendly rounding strategy, namely \"**[round half away from zero](https://en.wikipedia.org/wiki/Rounding#Round_half_away_from_zero)**.\"\n", + "\n", + "Describe in one or two sentences how \"**[round half away from zero](https://en.wikipedia.org/wiki/Rounding#Round_half_away_from_zero)**\" is more in line with how humans think of rounding!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1.4**: We use the `Decimal` type from the [decimal](https://docs.python.org/3/library/decimal.html) module in the [standard library](https://docs.python.org/3/library/index.html) to tackle *both* issues simultaneously.\n", + "\n", + "Assign `euro` a numeric object such that both `Decimal(\"1.5\")` and `Decimal(\"2.5\")` are rounded to `Decimal(\"2\")` (i.e., no decimal) with the [quantize()](https://docs.python.org/3/library/decimal.html#decimal.Decimal.quantize) method!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from decimal import Decimal" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "euro = ..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Decimal(\"1.5\").quantize(...)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Decimal(\"2.5\").quantize(...)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1.5**: Obviously, the two preceding code cells still [round half to even](https://en.wikipedia.org/wiki/Rounding#Round_half_to_even).\n", + "\n", + "The [decimal](https://docs.python.org/3/library/decimal.html) module defines a `ROUND_HALF_UP` flag that we can pass as the second argument to the [quantize()](https://docs.python.org/3/library/decimal.html#decimal.Decimal.quantize) method. Then, it [rounds half away from zero](https://en.wikipedia.org/wiki/Rounding#Round_half_away_from_zero).\n", + "\n", + "Add `ROUND_HALF_UP` to the code cells! `Decimal(\"2.5\")` should now be rounded to `Decimal(\"3\")`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from decimal import ROUND_HALF_UP" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Decimal(\"1.5\").quantize(...)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Decimal(\"2.5\").quantize(...)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1.6**: Instead of `euro`, define `cents` such that rounding occurs to *two* decimals! `Decimal(\"2.675\")` should now be rounded to `Decimal(\"2.68\")`. Do *not* forget to include the `ROUND_HALF_UP` flag!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cents = ..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Decimal(\"2.675\").quantize(...)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1.7**: Rewrite the function `discounted_price()` from [Chapter 3's Exercises](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals_20_exercises.ipynb#Discounting-Customer-Orders) section!\n", + "\n", + "It takes the *positional* arguments `unit_price` and `quantity` and implements a discount scheme for a line item in a customer order as follows:\n", + "\n", + "- if the unit price is over 100 dollars, grant 10% relative discount\n", + "- if a customer orders more than 10 items, one in every five items is for free\n", + "\n", + "Only one of the two discounts is granted, whichever is better for the customer.\n", + "\n", + "The function then returns the overall price for the line item as a `Decimal` number with a precision of *two* decimals.\n", + "\n", + "Enable **duck typing** by allowing the function to be called with various numeric types as the arguments, in particular, `quantity` may be a non-integer as well: Use an appropriate **abstract base class** from the [numbers](https://docs.python.org/3/library/numbers.html) module in the [standard library](https://docs.python.org/3/library/index.html) to verify the arguments' types and also that they are both positive!\n", + "\n", + "It is considered a *best practice* to only round towards the *end* of the calculations." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numbers" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def discounted_price(...):\n", + " ..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1.8**: Execute the code cells below and verify the final price for the following four test cases:\n", + "\n", + "- $7$ smartphones @ $99.00$ USD\n", + "- $3$ workstations @ $999.00$ USD\n", + "- $19$ GPUs @ $879.95$ USD\n", + "- $14$ Raspberry Pis @ $35.00$ USD\n", + "\n", + "The output should now *always* be a `Decimal` number with *two* decimals!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "discounted_price(99, 7)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "discounted_price(999, 3)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "discounted_price(879.95, 19)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "discounted_price(35, 14)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This also works if `quantity` is passed in as a `float` type." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "discounted_price(99, 7.0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Decimals beyond the first two are gracefully discarded (i.e., *without* rounding errors accumulating)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "discounted_price(99.0001, 7)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The basic input validation ensures that the user of `discounted_price()` does not pass in invalid data. Here, the `\"abc\"` creates a `TypeError`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "discounted_price(\"abc\", 7)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A `-1` passed in as `unit_price` results in a `ValueError`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "discounted_price(-1, 7)" + ] + } + ], + "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.4" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": true, + "skip_h1_title": true, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": false, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/05_numbers_review_and_exercises.ipynb b/05_numbers_review_and_exercises.ipynb deleted file mode 100644 index 2ae8301..0000000 --- a/05_numbers_review_and_exercises.ipynb +++ /dev/null @@ -1,706 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "# Chapter 5: Bits & Numbers" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Content Review" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Read [Chapter 5](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers.ipynb) of the book. Then work through the eighteen review questions." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Essay Questions " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Answer the following questions briefly with *at most* 300 characters per question!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q1**: In what way is the **binary representation** of `int` objects *similar* to the **decimal system** taught in elementary school?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q2**: Why may objects of type `bool` be regarded a **numeric type** as well?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q3**: Why is it *inefficient* to store `bool` objects in bits resembling a **hexadecimal representation**?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q4**: Colors are commonly expressed in the **hexadecimal system** in websites (cf., the [HTML](https://en.wikipedia.org/wiki/HTML) and [CSS](https://en.wikipedia.org/wiki/Cascading_Style_Sheets) formats).\n", - "\n", - "For example, $#000000$, $#ff9900$, and $#ffffff$ turn out to be black, orange, and white. The six digits are read in *pairs of two* from left to right, and the *three pairs* correspond to the proportions of red, green, and blue mixed together. They reach from $0_{16} = 0_{10}$ for $0$% to $\\text{ff}_{16} = 255_{10}$ for $100$% (cf., this [article](https://en.wikipedia.org/wiki/RGB_color_model) for an in-depth discussion).\n", - "\n", - "In percent, what are the proportions of red, green, and blue that make up orange? Calculate the three percentages separately! How many **bytes** are needed to encode a color? How many **bits** are that?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q5**: What does it mean for a code fragment to **fail silently**?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q6**: Explain why the mathematical set of all real numbers $\\mathbb{R}$ can only be **approximated** by floating-point numbers on a computer!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q7**: How do we deal with a `float` object's imprecision if we need to **check for equality**?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q8**: What data type, built-in or from the [standard library](https://docs.python.org/3/library/index.html), is best suited to represent the [transcendental numbers](https://en.wikipedia.org/wiki/Transcendental_number) $\\pi$ and $\\text{e}$?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q9**: How can **abstract base classes**, for example, as defined in the **numerical tower**, be helpful in enabling **duck typing**?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### True / False Questions" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Motivate your answer with *one short* sentence!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q10**: The precision of `int` objects depends on how we choose to represent them in memory. For example, using a **hexadecimal representation** gives us $16^8$ digits whereas with a **binary representation** an `int` object can have *at most* $2^8$ digits." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q11**: With the built-in [round()](https://docs.python.org/3/library/functions.html#round) function, we obtain a *precise* representation for any `float` object if we can live with *less than* $15$ digits of precision." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q12**: As most currencies operate with $2$ or $3$ decimals (e.g., EUR $9.99$), the `float` type's limitation of *at most* $15$ digits is *not* a problem in practice." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q13**: The [IEEE 754](https://en.wikipedia.org/wiki/IEEE_754) standard's **special values** provide no benefit in practice as we could always use a **[sentinel](https://en.wikipedia.org/wiki/Sentinel_value)** value (i.e., a \"dummy\"). For example, instead of `nan`, we can always use `0` to indicate a *missing* value." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q14**: The following code fragment raises an `InvalidOperation` exception. That is an example of code **failing loudly**.\n", - "```python\n", - "float(\"inf\") + float(\"-inf\")\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q15**: Python provides a `scientific` type (e.g., `1.23e4`) that is useful mainly to model problems in the domains of physics or astrophysics." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q16**: From a practitioner's point of view, the built-in [format()](https://docs.python.org/3/library/functions.html#format) function does the *same* as the built-in [round()](https://docs.python.org/3/library/functions.html#round) function." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q17**: The `Decimal` type from the [decimal](https://docs.python.org/3/library/decimal.html) module in the [standard library](https://docs.python.org/3/library/index.html) allows us to model the set of the real numbers $\\mathbb{R}$ *precisely*." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q18**: The `Fraction` type from the [fractions](https://docs.python.org/3/library/fractions.html) module in the [standard library](https://docs.python.org/3/library/index.html) allows us to model the set of the rational numbers $\\mathbb{Q}$ *precisely*." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Coding Exercises" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Discounting Customer Orders (revisited)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q11** in [Chapter 2's Review & Exercises](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions_review_and_exercises.ipynb#Volume-of-a-Sphere) section already revealed that we must consider the effects of the `float` type's imprecision.\n", - "\n", - "This becomes even more important when we deal with numeric data modeling accounting or finance data (cf., [this comment](https://stackoverflow.com/a/24976426) on \"falsehoods programmers believe about money\").\n", - "\n", - "In addition to the *inherent imprecision* of numbers in general, the topic of **[rounding numbers](https://en.wikipedia.org/wiki/Rounding)** is also not as trivial as we might expect! [This article](https://realpython.com/python-rounding/) summarizes everything the data science practitioner needs to know.\n", - "\n", - "In this exercise, we revisit **Q9** from [Chapter 3's Review & Exercises](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals_review_and_exercises.ipynb#Discounting-Customer-Orders) section, and make the `discounted_price()` function work *correctly* for real-life sales data." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q19.1**: Execute the code cells below! What results would you have *expected*, and why?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "round(1.5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "round(2.5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "round(2.675, 2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q19.2**: The built-in [round()](https://docs.python.org/3/library/functions.html#round) function implements the \"**[round half to even](https://en.wikipedia.org/wiki/Rounding#Round_half_to_even)**\" strategy. Describe in one or two sentences what that means!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q19.3**: For the revised `discounted_price()` function, we have to tackle *two* issues: First, we have to replace the built-in `float` type with a data type that allows us to control the precision. Second, the discounted price should be rounded according to a more human-friendly rounding strategy, namely \"**[round half away from zero](https://en.wikipedia.org/wiki/Rounding#Round_half_away_from_zero)**.\"\n", - "\n", - "Describe in one or two sentences how \"**[round half away from zero](https://en.wikipedia.org/wiki/Rounding#Round_half_away_from_zero)**\" is more in line with how humans think of rounding!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q19.4**: We use the `Decimal` type from the [decimal](https://docs.python.org/3/library/decimal.html) module in the [standard library](https://docs.python.org/3/library/index.html) to tackle *both* issues simultaneously.\n", - "\n", - "Assign `euro` a numeric object such that both `Decimal(\"1.5\")` and `Decimal(\"2.5\")` are rounded to `Decimal(\"2\")` (i.e., no decimal) with the [quantize()](https://docs.python.org/3/library/decimal.html#decimal.Decimal.quantize) method!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from decimal import Decimal" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "euro = ..." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Decimal(\"1.5\").quantize(...)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Decimal(\"2.5\").quantize(...)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q19.5**: Obviously, the two preceding code cells still [round half to even](https://en.wikipedia.org/wiki/Rounding#Round_half_to_even).\n", - "\n", - "The [decimal](https://docs.python.org/3/library/decimal.html) module defines a `ROUND_HALF_UP` flag that we can pass as the second argument to the [quantize()](https://docs.python.org/3/library/decimal.html#decimal.Decimal.quantize) method. Then, it [rounds half away from zero](https://en.wikipedia.org/wiki/Rounding#Round_half_away_from_zero).\n", - "\n", - "Add `ROUND_HALF_UP` to the code cells! `Decimal(\"2.5\")` should now be rounded to `Decimal(\"3\")`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from decimal import ROUND_HALF_UP" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Decimal(\"1.5\").quantize(...)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Decimal(\"2.5\").quantize(...)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q19.6**: Instead of `euro`, define `cents` such that rounding occurs to *two* decimals! `Decimal(\"2.675\")` should now be rounded to `Decimal(\"2.68\")`. Do *not* forget to include the `ROUND_HALF_UP` flag!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cents = ..." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Decimal(\"2.675\").quantize(...)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q19.7**: Rewrite the function `discounted_price()` from [Chapter 3's Review & Exercises](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals_review_and_exercises.ipynb#Discounting-Customer-Orders) section!\n", - "\n", - "It takes the *positional* arguments `unit_price` and `quantity` and implements a discount scheme for a line item in a customer order as follows:\n", - "\n", - "- if the unit price is over 100 dollars, grant 10% relative discount\n", - "- if a customer orders more than 10 items, one in every five items is for free\n", - "\n", - "Only one of the two discounts is granted, whichever is better for the customer.\n", - "\n", - "The function then returns the overall price for the line item as a `Decimal` number with a precision of *two* decimals.\n", - "\n", - "Enable **duck typing** by allowing the function to be called with various numeric types as the arguments, in particular, `quantity` may be a non-integer as well: Use an appropriate **abstract base class** from the [numbers](https://docs.python.org/3/library/numbers.html) module in the [standard library](https://docs.python.org/3/library/index.html) to verify the arguments' types and also that they are both positive!\n", - "\n", - "It is considered a *best practice* to only round towards the *end* of the calculations." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def discounted_price(...):\n", - " ..." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q19.8**: Execute the code cells below and verify the final price for the following four test cases:\n", - "\n", - "- $7$ smartphones @ $99.00$ USD\n", - "- $3$ workstations @ $999.00$ USD\n", - "- $19$ GPUs @ $879.95$ USD\n", - "- $14$ Raspberry Pis @ $35.00$ USD\n", - "\n", - "The output should now *always* be a `Decimal` number with *two* decimals!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "discounted_price(99, 7)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "discounted_price(999, 3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "discounted_price(879.95, 19)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "discounted_price(35, 14)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This also works if `quantity` is passed in as a `float` type." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "discounted_price(99, 7.0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Decimals beyond the first two are gracefully discarded (i.e., *without* rounding errors accumulating)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "discounted_price(99.0001, 7)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The basic input validation ensures that the user of `discounted_price()` does not pass in invalid data. Here, the `\"abc\"` creates a `TypeError`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "discounted_price(\"abc\", 7)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `-1` passed in as `unit_price` results in a `ValueError`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "discounted_price(-1, 7)" - ] - } - ], - "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.3" - }, - "toc": { - "base_numbering": 1, - "nav_menu": {}, - "number_sections": false, - "sideBar": true, - "skip_h1_title": true, - "title_cell": "Table of Contents", - "title_sidebar": "Contents", - "toc_cell": false, - "toc_position": {}, - "toc_section_display": false, - "toc_window_display": false - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/06_text.ipynb b/06_text_00_content.ipynb similarity index 90% rename from 06_text.ipynb rename to 06_text_00_content.ipynb index 3fbbcb5..912142e 100644 --- a/06_text.ipynb +++ b/06_text_00_content.ipynb @@ -54,7 +54,7 @@ }, "outputs": [], "source": [ - "text = \"Lorem ipsum dolor sit amet, consectetur ...\"" + "text = \"Lorem ipsum dolor sit amet, ...\"" ] }, { @@ -80,7 +80,7 @@ { "data": { "text/plain": [ - "139674889049360" + "140483431254256" ] }, "execution_count": 2, @@ -124,7 +124,7 @@ } }, "source": [ - "A `str` object evaluates to itself in a literal notation with enclosing **single quotes** `'` by default. In [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb#Value), we already specified the double quotes `\"` convention we stick to in this book. Yet, single quotes `'` and double quotes `\"` are *perfect* substitutes for all `str` objects that do *not* contain any of the two symbols in it. We could use the reverse convention, as well.\n", + "A `str` object evaluates to itself in a literal notation with enclosing **single quotes** `'` by default. In [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb#Value), we already specified the double quotes `\"` convention we stick to in this book. Yet, single quotes `'` and double quotes `\"` are *perfect* substitutes for all `str` objects that do *not* contain any of the two symbols in it. We could use the reverse convention, as well.\n", "\n", "As [this discussion](https://stackoverflow.com/questions/56011/single-quotes-vs-double-quotes-in-python) shows, many programmers have *strong* opinions about that and make up *new* conventions for their projects. Consequently, the discussion was \"closed as not constructive\" by the moderators." ] @@ -141,7 +141,7 @@ { "data": { "text/plain": [ - "'Lorem ipsum dolor sit amet, consectetur ...'" + "'Lorem ipsum dolor sit amet, ...'" ] }, "execution_count": 4, @@ -161,7 +161,7 @@ } }, "source": [ - "As the single quote `'` is often used in the English language as a shortener, we could make an argument in favor of using the double quotes `\"`: There are possibly fewer situations like in the two code cells below, in which we must revert to using a `\\` to **escape** a single quote `'` in a text (cf., the [Special Characters](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text.ipynb#Special-Characters) section further below). However, double quotes `\"` are often used as well. So, this argument is somewhat not convincing.\n", + "As the single quote `'` is often used in the English language as a shortener, we could make an argument in favor of using the double quotes `\"`: There are possibly fewer situations like in the two code cells below, in which we must revert to using a `\\` to **escape** a single quote `'` in a text (cf., the [Special Characters](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text_00_content.ipynb#Special-Characters) section further below). However, double quotes `\"` are often used as well. So, this argument is somewhat not convincing.\n", "\n", "Many proponents of the single quote `'` usage claim that double quotes `\"` make more **visual noise** on the screen. This argument is also not convincing. On the contrary, one could claim that *two* single quotes `''` look so similar to *one* double quote `\"` that it might not be apparent right away what we are looking at. By sticking to double quotes `\"`, we avoid such danger of confusion.\n", "\n", @@ -182,7 +182,7 @@ { "data": { "text/plain": [ - "\"It's cool that strings are so versatile!\"" + "'It\\'s cool that \"strings\" are versatile'" ] }, "execution_count": 5, @@ -191,7 +191,7 @@ } ], "source": [ - "\"It's cool that strings are so versatile!\"" + "\"It's cool that \\\"strings\\\" are versatile\"" ] }, { @@ -206,7 +206,7 @@ { "data": { "text/plain": [ - "\"It's cool that strings are so versatile!\"" + "'It\\'s cool that \"strings\" are versatile'" ] }, "execution_count": 6, @@ -215,7 +215,7 @@ } ], "source": [ - "'It\\'s cool that strings are so versatile!'" + "'It\\'s cool that \"strings\" are versatile'" ] }, { @@ -615,7 +615,7 @@ } }, "source": [ - "To use constructs familiar from [Chapter 3](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals.ipynb#The-try-Statement) to explain what `with open(...) as file:` does, below is a formulation with a `try` statement *equivalent* to the `with` statement above. The `finally`-branch is always executed, even if an exception is raised in the `for`-loop. So, `file` is sure to be closed too, with a somewhat less expressive formulation." + "To use constructs familiar from [Chapter 3](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals_00_content.ipynb#The-try-Statement) to explain what `with open(...) as file:` does, below is a formulation with a `try` statement *equivalent* to the `with` statement above. The `finally`-branch is *always* executed, even if an exception is raised in the `for`-loop. So, `file` is sure to be closed too, with a somewhat less expressive formulation." ] }, { @@ -737,7 +737,7 @@ } }, "source": [ - "A **sequence** is yet another *abstract* concept (cf., the \"*Containers vs. Iterables*\" section in [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration.ipynb#Containers-vs.-Iterables)).\n", + "A **sequence** is yet another *abstract* concept (cf., the \"*Containers vs. Iterables*\" section in [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_00_content.ipynb#Containers-vs.-Iterables)).\n", "\n", "It unifies *four* [orthogonal](https://en.wikipedia.org/wiki/Orthogonality) (i.e., \"independent\") behaviors into one idea: Any data type, such as `str`, is considered a sequence if it simultaneously\n", "\n", @@ -746,9 +746,9 @@ "3. comes with a *predictable* **order** of its\n", "4. **finite** number of \"things.\"\n", "\n", - "[Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences.ipynb#Collections-vs.-Sequences) formalizes sequences in great detail. Here, we keep our focus on the `str` type that historically received its name as it models a \"**[string of characters](https://en.wikipedia.org/wiki/String_%28computer_science%29)**,\" and a \"string\" is more formally called a sequence in the computer science literature.\n", + "[Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_00_content.ipynb#Collections-vs.-Sequences) formalizes sequences in great detail. Here, we keep our focus on the `str` type that historically received its name as it models a \"**[string of characters](https://en.wikipedia.org/wiki/String_%28computer_science%29)**,\" and a \"string\" is more formally called a sequence in the computer science literature.\n", "\n", - "Behaving like a sequence, `str` objects may be treated like `list` objects in many cases. For example, the built-in [len()](https://docs.python.org/3/library/functions.html#len) function tells us how many elements (i.e., characters) make up `text`. [len()](https://docs.python.org/3/library/functions.html#len) would not work with an *infinite* object: As anything modeled in a program must fit into a computer's finite memory at runtime, there cannot exist objects containing a truly infinite number of elements; however, [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences.ipynb#Iterators-vs.-Iterables) introduces iterable data types that can be used to model an *infinite* series of elements and that, consequently, have no concept of \"length.\"" + "Behaving like a sequence, `str` objects may be treated like `list` objects in many cases. For example, the built-in [len()](https://docs.python.org/3/library/functions.html#len) function tells us how many elements (i.e., characters) make up `text`. [len()](https://docs.python.org/3/library/functions.html#len) would not work with an *infinite* object: As anything modeled in a program must fit into a computer's finite memory at runtime, there cannot exist objects containing a truly infinite number of elements; however, [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_00_content.ipynb#Iterators-vs.-Iterables) introduces iterable data types that can be used to model an *infinite* series of elements and that, consequently, have no concept of \"length.\"" ] }, { @@ -763,7 +763,7 @@ { "data": { "text/plain": [ - "43" + "31" ] }, "execution_count": 23, @@ -799,7 +799,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "L o r e m i p s u m d o l o r s i t a m e t , c o n s e c t e t u r . . . " + "L o r e m i p s u m d o l o r s i t a m e t , . . . " ] } ], @@ -912,7 +912,7 @@ } }, "source": [ - "As `str` objects have the additional property of being *ordered*, we may **index** into them to obtain individual characters with the **indexing operator** `[]`. This is analogous to how we obtained individual elements of a `list` object in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb#Who-am-I?-And-how-many?)." + "As `str` objects have the additional property of being *ordered*, we may **index** into them to obtain individual characters with the **indexing operator** `[]`. This is analogous to how we obtained individual elements of a `list` object in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb#Who-am-I?-And-how-many?)." ] }, { @@ -1031,7 +1031,7 @@ } ], "source": [ - "text[42] # = len(text) - 1" + "text[30] # = len(text) - 1" ] }, { @@ -1061,13 +1061,13 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtext\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m43\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m# = len(text)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtext\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m31\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m# = len(text)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mIndexError\u001b[0m: string index out of range" ] } ], "source": [ - "text[43] # = len(text)" + "text[31] # = len(text)" ] }, { @@ -1078,7 +1078,21 @@ } }, "source": [ - "We may use *negative* indexes to start counting from the end of the `str` object. That only works because sequences are *finite*." + "We may use *negative* indexes to start counting from the end of the `str` object, as shown in the figure below. That only works because sequences are *finite*." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "| Slot | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10| 11| 12| 13| 14| 15| 16| 17| 18| 19| 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| 30|\n", + "|:---------:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|\n", + "|**Reverse**|-31|-30|-29|-28|-27|-26|-25|-24|-23|-22|-21|-20|-19|-18|-17|-16|-15|-14|-13|-12|-11|-10|-9 |-8 |-7 |-6 |-5 |-4 |-3 |-2 |-1 |\n", + "| **Char** |`L`|`o`|`r`|`e`|`m`|` `|`i`|`p`|`s`|`u`|`m`|` `|`d`|`o`|`l`|`o`|`r`|` `|`s`|`i`|`t`|` `|`a`|`m`|`e`|`t`|`,`|` `|`.`|`.`|`.`|" ] }, { @@ -1086,7 +1100,7 @@ "execution_count": 33, "metadata": { "slideshow": { - "slide_type": "slide" + "slide_type": "-" } }, "outputs": [ @@ -1105,17 +1119,6 @@ "text[-1]" ] }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "skip" - } - }, - "source": [ - "One reason why programmers like to start counting at 0 is that a positive index and its *corresponding* negative index always add up to the length of the sequence." - ] - }, { "cell_type": "code", "execution_count": 34, @@ -1128,7 +1131,7 @@ { "data": { "text/plain": [ - "'i'" + "'L'" ] }, "execution_count": 34, @@ -1137,7 +1140,18 @@ } ], "source": [ - "text[6]" + "text[-31] # = -len(text)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "source": [ + "One reason why programmers like to start counting at 0 is that a positive index and its *corresponding* negative index always add up to the length of the sequence. Here, `6` and `25` add to `31`." ] }, { @@ -1145,7 +1159,7 @@ "execution_count": 35, "metadata": { "slideshow": { - "slide_type": "-" + "slide_type": "fragment" } }, "outputs": [ @@ -1161,7 +1175,31 @@ } ], "source": [ - "text[-37]" + "text[6]" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'i'" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "text[-25]" ] }, { @@ -1192,7 +1230,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 37, "metadata": { "slideshow": { "slide_type": "slide" @@ -1205,7 +1243,7 @@ "'Lorem'" ] }, - "execution_count": 36, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -1222,14 +1260,14 @@ } }, "source": [ - "Whereas the *start* is always included in the result, the *end* is not. Counter-intuitive at first, this makes working with individual slices easier as they add up to the original `str` object again.\n", + "Whereas the *start* is always included in the result, the *end* is not. Counter-intuitive at first, this makes working with individual slices easier as they \"add\" up to the original `str` object again (cf., the \"*String Operations*\" sub-section below regarding the overloaded `+` operator). Because the *end* is *not* included, we end the second slice below with `len(text)` or `31` below.\n", "\n", - "So, as the *end* is *not* included, we must end the second slice with `len(text)` or `43` below." + "Not including the *end* has another advantage: The difference \"*end* minus *start*\" tells us how many elements the resulting slice has. Above, for example, `5 - 0` implies that `\"Lorem\"` consists of `5` characters. So, colloquially, `0:5` means \"taking the first five characters.\" That rule only works if both *start* and *end* are *positive*." ] }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 38, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1239,10 +1277,10 @@ { "data": { "text/plain": [ - "'Lorem ipsum dolor sit amet, consectetur ...'" + "'Lorem ipsum dolor sit amet, ...'" ] }, - "execution_count": 37, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -1259,12 +1297,12 @@ } }, "source": [ - "For convenience, the indexes do not need to lie within the range from `0` to `len(text)` when slicing." + "By combining a *positive* start with a *negative* end index, we specify both ends of the slice *relative* to the ends of the entire `str` object. So, colloquially, `6:-5` below means \"drop the first six and last five characters.\" The length of the resulting slice can *not* be calculated from the indexes and depends only on the length of the original `str` object." ] }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 39, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1274,10 +1312,45 @@ { "data": { "text/plain": [ - "'Lorem ipsum dolor sit amet, consectetur ...'" + "'ipsum dolor sit amet'" ] }, - "execution_count": 38, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "text[6:-5]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "source": [ + "For convenience, the indexes do not need to lie within the range from `0` to `len(text)` when slicing. So, no `IndexError` is raised here." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'Lorem ipsum dolor sit amet, ...'" + ] + }, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } @@ -1294,12 +1367,12 @@ } }, "source": [ - "Commonly, we leave out the `0` for the *start* and the *end* if it is equal to the \"length.\"" + "If left out, *start* defaults to `0` and *end* to the \"length\" of the `str` object. Here, we take a \"full\" slice that is essentially a copy of the original `str` object." ] }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 41, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1309,16 +1382,16 @@ { "data": { "text/plain": [ - "'Lorem ipsum dolor sit amet, consectetur ...'" + "'Lorem ipsum dolor sit amet, ...'" ] }, - "execution_count": 39, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "text[:5] + text[5:]" + "text[:]" ] }, { @@ -1329,12 +1402,12 @@ } }, "source": [ - "Slicing makes it easy to obtain shorter versions of the original `str` object." + "Slicing (and indexing) makes it easy to obtain shorter versions of the original `str` object." ] }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 42, "metadata": { "slideshow": { "slide_type": "skip" @@ -1347,13 +1420,13 @@ "'Lorem ipsum dolor sit amet.'" ] }, - "execution_count": 40, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "text[:26] + text[42]" + "text[:26] + text[30]" ] }, { @@ -1369,7 +1442,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 43, "metadata": { "slideshow": { "slide_type": "slide" @@ -1379,10 +1452,10 @@ { "data": { "text/plain": [ - "'Lrmismdlrstae,cnettr..'" + "'Lrmismdlrstae,..'" ] }, - "execution_count": 41, + "execution_count": 43, "metadata": {}, "output_type": "execute_result" } @@ -1404,7 +1477,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 44, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1414,10 +1487,10 @@ { "data": { "text/plain": [ - "'... rutetcesnoc ,tema tis rolod muspi meroL'" + "'... ,tema tis rolod muspi meroL'" ] }, - "execution_count": 42, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } @@ -1445,16 +1518,16 @@ } }, "source": [ - "Whereas elements of a `list` object *may* be *re-assigned*, as shortly hinted at in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb#Who-am-I?-And-how-many?), this is *not* allowed for `str` objects. Once created, they *cannot* be *changed*. Formally, we say that they are **immutable**. In that regard, `str` objects and all the numeric types in [Chapter 5](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers.ipynb) are alike.\n", + "Whereas elements of a `list` object *may* be *re-assigned*, as shortly hinted at in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb#Who-am-I?-And-how-many?), this is *not* allowed for `str` objects. Once created, they *cannot* be *changed*. Formally, we say that they are **immutable**. In that regard, `str` objects and all the numeric types in [Chapter 5](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers_00_content.ipynb) are alike.\n", "\n", - "On the contrary, objects that may be changed after creation, are called **mutable**. We already saw in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb#Who-am-I?-And-how-many?) how mutable objects are more difficult to reason about for a beginner, in particular, if more than *one* variable references it. Yet, mutability does have its place in a programmer's toolbox, and we revisit this idea in the next chapters.\n", + "On the contrary, objects that may be changed after creation, are called **mutable**. We already saw in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb#Who-am-I?-And-how-many?) how mutable objects are more difficult to reason about for a beginner, in particular, if more than *one* variable references it. Yet, mutability does have its place in a programmer's toolbox, and we revisit this idea in the next chapters.\n", "\n", "The `TypeError` indicates that `str` objects are *immutable*: Assignment to an index or a slice are *not* supported." ] }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 45, "metadata": { "slideshow": { "slide_type": "slide" @@ -1468,7 +1541,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtext\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"Z\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtext\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"Z\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: 'str' object does not support item assignment" ] } @@ -1479,7 +1552,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 46, "metadata": { "slideshow": { "slide_type": "-" @@ -1493,7 +1566,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtext\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"random\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtext\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"random\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: 'str' object does not support item assignment" ] } @@ -1528,7 +1601,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 47, "metadata": { "slideshow": { "slide_type": "slide" @@ -1538,10 +1611,10 @@ { "data": { "text/plain": [ - "'Lorem ipsum dolor sit amet, consectetur ...'" + "'Lorem ipsum dolor sit amet, ...'" ] }, - "execution_count": 45, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } @@ -1552,7 +1625,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 48, "metadata": { "slideshow": { "slide_type": "-" @@ -1565,7 +1638,7 @@ "22" ] }, - "execution_count": 46, + "execution_count": 48, "metadata": {}, "output_type": "execute_result" } @@ -1576,7 +1649,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 49, "metadata": { "slideshow": { "slide_type": "-" @@ -1589,7 +1662,7 @@ "-1" ] }, - "execution_count": 47, + "execution_count": 49, "metadata": {}, "output_type": "execute_result" } @@ -1600,7 +1673,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 50, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1613,7 +1686,7 @@ "12" ] }, - "execution_count": 48, + "execution_count": 50, "metadata": {}, "output_type": "execute_result" } @@ -1635,7 +1708,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 51, "metadata": { "slideshow": { "slide_type": "slide" @@ -1648,7 +1721,7 @@ "1" ] }, - "execution_count": 49, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" } @@ -1659,7 +1732,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 52, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1672,7 +1745,7 @@ "13" ] }, - "execution_count": 50, + "execution_count": 52, "metadata": {}, "output_type": "execute_result" } @@ -1683,7 +1756,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 53, "metadata": { "slideshow": { "slide_type": "skip" @@ -1696,7 +1769,7 @@ "-1" ] }, - "execution_count": 51, + "execution_count": 53, "metadata": {}, "output_type": "execute_result" } @@ -1718,7 +1791,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 54, "metadata": { "slideshow": { "slide_type": "slide" @@ -1731,7 +1804,7 @@ "1" ] }, - "execution_count": 52, + "execution_count": 54, "metadata": {}, "output_type": "execute_result" } @@ -1753,7 +1826,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 55, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1766,7 +1839,7 @@ "2" ] }, - "execution_count": 53, + "execution_count": 55, "metadata": {}, "output_type": "execute_result" } @@ -1788,7 +1861,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 56, "metadata": { "slideshow": { "slide_type": "skip" @@ -1801,7 +1874,7 @@ "2" ] }, - "execution_count": 54, + "execution_count": 56, "metadata": {}, "output_type": "execute_result" } @@ -1823,7 +1896,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 57, "metadata": { "slideshow": { "slide_type": "slide" @@ -1834,43 +1907,6 @@ "example = \"random\"" ] }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "139674947440512" - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "id(example)" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "lower = example.lower()" - ] - }, { "cell_type": "code", "execution_count": 58, @@ -1883,7 +1919,7 @@ { "data": { "text/plain": [ - "139674887826488" + "140483525349552" ] }, "execution_count": 58, @@ -1891,6 +1927,43 @@ "output_type": "execute_result" } ], + "source": [ + "id(example)" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "lower = example.lower()" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "140483422704176" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "id(lower)" ] @@ -1908,7 +1981,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 61, "metadata": { "slideshow": { "slide_type": "fragment" @@ -1921,7 +1994,7 @@ "False" ] }, - "execution_count": 59, + "execution_count": 61, "metadata": {}, "output_type": "execute_result" } @@ -1932,7 +2005,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 62, "metadata": { "slideshow": { "slide_type": "-" @@ -1945,7 +2018,7 @@ "True" ] }, - "execution_count": 60, + "execution_count": 62, "metadata": {}, "output_type": "execute_result" } @@ -1969,7 +2042,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 63, "metadata": { "slideshow": { "slide_type": "slide" @@ -1985,7 +2058,6 @@ "dolor\n", "sit\n", "amet,\n", - "consectetur\n", "...\n" ] } @@ -2008,7 +2080,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 64, "metadata": { "slideshow": { "slide_type": "slide" @@ -2021,7 +2093,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 65, "metadata": { "slideshow": { "slide_type": "-" @@ -2034,7 +2106,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 66, "metadata": { "slideshow": { "slide_type": "-" @@ -2047,7 +2119,7 @@ "'This will become a sentence'" ] }, - "execution_count": 64, + "execution_count": 66, "metadata": {}, "output_type": "execute_result" } @@ -2069,7 +2141,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 67, "metadata": { "slideshow": { "slide_type": "fragment" @@ -2082,7 +2154,7 @@ "'a b c d e'" ] }, - "execution_count": 65, + "execution_count": 67, "metadata": {}, "output_type": "execute_result" } @@ -2104,7 +2176,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 68, "metadata": { "slideshow": { "slide_type": "slide" @@ -2117,7 +2189,7 @@ "'This is a sentence'" ] }, - "execution_count": 66, + "execution_count": 68, "metadata": {}, "output_type": "execute_result" } @@ -2145,12 +2217,12 @@ } }, "source": [ - "As mentioned in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb#Operator-Overloading), the `+` and `*` operators are *overloaded* and used for **string concatenation**. They always create *new* `str` objects. That has nothing to do with the `str` type's immutability, but is the default behavior of operators." + "As mentioned in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb#Operator-Overloading), the `+` and `*` operators are *overloaded* and used for **string concatenation**. They always create *new* `str` objects. That has nothing to do with the `str` type's immutability, but is the default behavior of operators." ] }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 69, "metadata": { "slideshow": { "slide_type": "slide" @@ -2163,7 +2235,7 @@ "'Hello Lore'" ] }, - "execution_count": 67, + "execution_count": 69, "metadata": {}, "output_type": "execute_result" } @@ -2174,7 +2246,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 70, "metadata": { "slideshow": { "slide_type": "-" @@ -2187,7 +2259,7 @@ "'Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum '" ] }, - "execution_count": 68, + "execution_count": 70, "metadata": {}, "output_type": "execute_result" } @@ -2220,7 +2292,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 71, "metadata": { "slideshow": { "slide_type": "slide" @@ -2233,65 +2305,6 @@ "B = \"Banana\"" ] }, - { - "cell_type": "code", - "execution_count": 70, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 70, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "A < B" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 71, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "a < B" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "skip" - } - }, - "source": [ - "One way to fix this is to only compare lower-cased `str` objects." - ] - }, { "cell_type": "code", "execution_count": 72, @@ -2312,6 +2325,65 @@ "output_type": "execute_result" } ], + "source": [ + "A < B" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a < B" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "source": [ + "One way to fix this is to only compare lower-cased `str` objects." + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "a < B.lower()" ] @@ -2329,7 +2401,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 75, "metadata": { "slideshow": { "slide_type": "slide" @@ -2425,7 +2497,7 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 76, "metadata": { "slideshow": { "slide_type": "slide" @@ -2439,7 +2511,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 77, "metadata": { "slideshow": { "slide_type": "-" @@ -2452,7 +2524,7 @@ "'Hello Alexander! Good morning.'" ] }, - "execution_count": 75, + "execution_count": 77, "metadata": {}, "output_type": "execute_result" } @@ -2474,7 +2546,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 78, "metadata": { "slideshow": { "slide_type": "slide" @@ -2487,7 +2559,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 79, "metadata": { "slideshow": { "slide_type": "-" @@ -2500,7 +2572,7 @@ "'Pi is 3.14'" ] }, - "execution_count": 77, + "execution_count": 79, "metadata": {}, "output_type": "execute_result" } @@ -2511,7 +2583,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 80, "metadata": { "slideshow": { "slide_type": "-" @@ -2524,7 +2596,7 @@ "'Pi is 3.142'" ] }, - "execution_count": 78, + "execution_count": 80, "metadata": {}, "output_type": "execute_result" } @@ -2557,7 +2629,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 81, "metadata": { "slideshow": { "slide_type": "slide" @@ -2570,7 +2642,7 @@ "'Hello Alexander! Good morning.'" ] }, - "execution_count": 79, + "execution_count": 81, "metadata": {}, "output_type": "execute_result" } @@ -2592,7 +2664,7 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": 82, "metadata": { "slideshow": { "slide_type": "fragment" @@ -2605,7 +2677,7 @@ "'Good morning, Alexander'" ] }, - "execution_count": 80, + "execution_count": 82, "metadata": {}, "output_type": "execute_result" } @@ -2627,7 +2699,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 83, "metadata": { "slideshow": { "slide_type": "fragment" @@ -2640,7 +2712,7 @@ "'Hello Alexander! Good morning.'" ] }, - "execution_count": 81, + "execution_count": 83, "metadata": {}, "output_type": "execute_result" } @@ -2662,7 +2734,7 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 84, "metadata": { "slideshow": { "slide_type": "fragment" @@ -2675,7 +2747,7 @@ "'Pi is 3.14'" ] }, - "execution_count": 82, + "execution_count": 84, "metadata": {}, "output_type": "execute_result" } @@ -2703,14 +2775,14 @@ } }, "source": [ - "The `%` operator that we saw in the context of modulo division in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb#%28Arithmetic%29-Operators) is overloaded with string interpolation when its first operand is a `str` object. The second operand consists of all expressions to be filled in. Format specifiers work with a `%` instead of curly braces and according to a different set of rules referred to as **[printf-style string formatting](https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting)**. So, `{:.2f}` becomes `%.2f`.\n", + "The `%` operator that we saw in the context of modulo division in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb#%28Arithmetic%29-Operators) is overloaded with string interpolation when its first operand is a `str` object. The second operand consists of all expressions to be filled in. Format specifiers work with a `%` instead of curly braces and according to a different set of rules referred to as **[printf-style string formatting](https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting)**. So, `{:.2f}` becomes `%.2f`.\n", "\n", "This way of string interpolation is the oldest and originates from the [C language](https://en.wikipedia.org/wiki/C_%28programming_language%29). It is still widely spread, but we should use one of the other two ways instead. We show it here mainly for completeness sake." ] }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 85, "metadata": { "slideshow": { "slide_type": "skip" @@ -2723,7 +2795,7 @@ "'Pi is 3.14'" ] }, - "execution_count": 83, + "execution_count": 85, "metadata": {}, "output_type": "execute_result" } @@ -2740,12 +2812,12 @@ } }, "source": [ - "To insert more than one expression, we must list them in order and between parenthesis `(` and `)`. As [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences.ipynb#The-tuple-Type) reveals, this literal syntax creates an object of type `tuple`. Also, to format an expression as text, we use the format specifier `%s`." + "To insert more than one expression, we must list them in order and between parenthesis `(` and `)`. As [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_00_content.ipynb#The-tuple-Type) reveals, this literal syntax creates an object of type `tuple`. Also, to format an expression as text, we use the format specifier `%s`." ] }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 86, "metadata": { "slideshow": { "slide_type": "skip" @@ -2758,7 +2830,7 @@ "'Hello Alexander! Good morning.'" ] }, - "execution_count": 84, + "execution_count": 86, "metadata": {}, "output_type": "execute_result" } @@ -2793,7 +2865,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 87, "metadata": { "slideshow": { "slide_type": "slide" @@ -2816,7 +2888,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 88, "metadata": { "slideshow": { "slide_type": "fragment" @@ -2848,7 +2920,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 89, "metadata": { "slideshow": { "slide_type": "fragment" @@ -2880,7 +2952,7 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 90, "metadata": { "slideshow": { "slide_type": "skip" @@ -2893,7 +2965,7 @@ "'This is a sentence\\nthat is printed\\non three lines.'" ] }, - "execution_count": 88, + "execution_count": 90, "metadata": {}, "output_type": "execute_result" } @@ -2928,7 +3000,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 91, "metadata": { "slideshow": { "slide_type": "slide" @@ -2961,7 +3033,7 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 92, "metadata": { "slideshow": { "slide_type": "fragment" @@ -2970,10 +3042,10 @@ "outputs": [ { "ename": "SyntaxError", - "evalue": "(unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \\UXXXXXXXX escape (, line 1)", + "evalue": "(unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \\UXXXXXXXX escape (, line 1)", "output_type": "error", "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m print(\"C:\\Users\\Administrator\\Desktop\\Project_Folder\")\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \\UXXXXXXXX escape\n" + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m print(\"C:\\Users\\Administrator\\Desktop\\Project_Folder\")\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \\UXXXXXXXX escape\n" ] } ], @@ -2994,7 +3066,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 93, "metadata": { "slideshow": { "slide_type": "slide" @@ -3015,7 +3087,7 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": 94, "metadata": { "slideshow": { "slide_type": "-" @@ -3047,7 +3119,7 @@ }, { "cell_type": "code", - "execution_count": 93, + "execution_count": 95, "metadata": { "slideshow": { "slide_type": "slide" @@ -3068,7 +3140,7 @@ }, { "cell_type": "code", - "execution_count": 94, + "execution_count": 96, "metadata": { "slideshow": { "slide_type": "-" @@ -3111,7 +3183,7 @@ }, { "cell_type": "code", - "execution_count": 95, + "execution_count": 97, "metadata": { "slideshow": { "slide_type": "slide" @@ -3120,10 +3192,10 @@ "outputs": [ { "ename": "SyntaxError", - "evalue": "EOL while scanning string literal (, line 1)", + "evalue": "EOL while scanning string literal (, line 1)", "output_type": "error", "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m \"\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m EOL while scanning string literal\n" + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m \"\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m EOL while scanning string literal\n" ] } ], @@ -3146,7 +3218,7 @@ }, { "cell_type": "code", - "execution_count": 96, + "execution_count": 98, "metadata": { "slideshow": { "slide_type": "fragment" @@ -3173,7 +3245,7 @@ }, { "cell_type": "code", - "execution_count": 97, + "execution_count": 99, "metadata": { "slideshow": { "slide_type": "fragment" @@ -3186,7 +3258,7 @@ "'\\nI am a multi-line string\\nconsisting of 4 lines.\\n'" ] }, - "execution_count": 97, + "execution_count": 99, "metadata": {}, "output_type": "execute_result" } @@ -3208,7 +3280,7 @@ }, { "cell_type": "code", - "execution_count": 98, + "execution_count": 100, "metadata": { "slideshow": { "slide_type": "fragment" @@ -3243,7 +3315,7 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 101, "metadata": { "slideshow": { "slide_type": "slide" @@ -3279,7 +3351,7 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 102, "metadata": { "slideshow": { "slide_type": "slide" @@ -3293,7 +3365,7 @@ }, { "cell_type": "code", - "execution_count": 101, + "execution_count": 103, "metadata": { "slideshow": { "slide_type": "-" @@ -3306,7 +3378,7 @@ "\"Lorem Ipsum is simply dummy text of the printing and typesetting industry.\\nLorem Ipsum has been the industry's standard dummy text ever since the 1500s\\nwhen an unknown printer took a galley of type and scrambled it to make a type\\nspecimen book. It has survived not only five centuries but also the leap into\\nelectronic typesetting, remaining essentially unchanged. It was popularised in\\nthe 1960s with the release of Letraset sheets.\\n\"" ] }, - "execution_count": 101, + "execution_count": 103, "metadata": {}, "output_type": "execute_result" } @@ -3317,7 +3389,7 @@ }, { "cell_type": "code", - "execution_count": 102, + "execution_count": 104, "metadata": { "slideshow": { "slide_type": "-" @@ -3383,7 +3455,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.4" }, "livereveal": { "auto_select": "code", @@ -3411,5 +3483,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/06_text_review_and_exercises.ipynb b/06_text_10_review.ipynb similarity index 94% rename from 06_text_review_and_exercises.ipynb rename to 06_text_10_review.ipynb index 40ac8c4..fe9588e 100644 --- a/06_text_review_and_exercises.ipynb +++ b/06_text_10_review.ipynb @@ -19,7 +19,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Read [Chapter 6](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text.ipynb) of the book. Then work through the eight review questions." + "Read [Chapter 6](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text_00_content.ipynb) of the book. Then, work through the questions below." ] }, { @@ -33,7 +33,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Answer the following questions briefly with *at most* 300 characters per question!" + "Answer the following questions *briefly*!" ] }, { @@ -184,7 +184,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.4" }, "toc": { "base_numbering": 1, @@ -201,5 +201,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/07_sequences.ipynb b/07_sequences_00_content.ipynb similarity index 97% rename from 07_sequences.ipynb rename to 07_sequences_00_content.ipynb index f20b670..924467a 100644 --- a/07_sequences.ipynb +++ b/07_sequences_00_content.ipynb @@ -19,11 +19,11 @@ } }, "source": [ - "We studied numbers (cf., [Chapter 5](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers.ipynb)) and textual data (cf., [Chapter 6](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text.ipynb)) first, mainly because objects of the presented data types are \"simple,\" for two reasons: First, they are *immutable*, and, as we saw in the \"*Who am I? And how many?*\" section in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb#Who-am-I?-And-how-many?), mutable objects can quickly become hard to reason about. Second, they are \"flat\" in the sense that they are *not* composed of other objects.\n", + "We studied numbers (cf., [Chapter 5](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers_00_content.ipynb)) and textual data (cf., [Chapter 6](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text_00_content.ipynb)) first, mainly because objects of the presented data types are \"simple,\" for two reasons: First, they are *immutable*, and, as we saw in the \"*Who am I? And how many?*\" section in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb#Who-am-I?-And-how-many?), mutable objects can quickly become hard to reason about. Second, they are \"flat\" in the sense that they are *not* composed of other objects.\n", "\n", "The `str` type is a bit of a corner case in this regard. While one could argue that a longer `str` object, for example, `\"text\"`, is composed of individual characters, this is *not* the case in memory as the literal `\"text\"` only creates *one* object (i.e., one \"bag\" of $0$s and $1$s modeling all characters).\n", "\n", - "This chapter and [Chapter 8](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings.ipynb) introduce various \"complex\" data types. While some are mutable and others are not, they all share that they are primarily used to \"manage,\" or structure, the memory in a program. Unsurprisingly, computer scientists refer to the ideas and theories behind these data types as **[data structures](https://en.wikipedia.org/wiki/Data_structure)**.\n", + "This chapter, [Chapter 8](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings_00_content.ipynb), and [Chapter 9](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/09_arrays_00_content.ipynb) introduce various \"complex\" data types. While some are mutable and others are not, they all share that they are primarily used to \"manage,\" or structure, the memory in a program. Unsurprisingly, computer scientists refer to the ideas and theories behind these data types as **[data structures](https://en.wikipedia.org/wiki/Data_structure)**.\n", "\n", "In this chapter, we focus on data types that model all kinds of sequential data. Examples of such data are [spreadsheets](https://en.wikipedia.org/wiki/Spreadsheet) or [matrices](https://en.wikipedia.org/wiki/Matrix_%28mathematics%29)/[vectors](https://en.wikipedia.org/wiki/Vector_%28mathematics_and_physics%29). Such formats share the property that they are composed of smaller units that come in a sequence of, for example, rows/columns/cells or elements/entries." ] @@ -47,9 +47,9 @@ } }, "source": [ - "[Chapter 6](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text.ipynb#A-\"String\"-of-Characters) already describes the *sequence* properties of `str` objects. Here, we take a step back and study these properties on their own before looking at bigger ideas.\n", + "[Chapter 6](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text_00_content.ipynb#A-\"String\"-of-Characters) already describes the *sequence* properties of `str` objects. Here, we take a step back and study these properties on their own before looking at bigger ideas.\n", "\n", - "The [collections.abc](https://docs.python.org/3/library/collections.abc.html) module in the [standard library](https://docs.python.org/3/library/index.html) defines a variety of **abstract base classes** (ABCs). We saw ABCs already in [Chapter 5](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers.ipynb#The-Numerical-Tower), where we use the ones from the [numbers](https://docs.python.org/3/library/numbers.html) module in the [standard library](https://docs.python.org/3/library/index.html) to classify Python's numeric data types according to mathematical ideas. Now, we take the ABCs from the [collections.abc](https://docs.python.org/3/library/collections.abc.html) module to classify the data types in this chapter and [Chapter 8](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings.ipynb) according to their behavior in various contexts.\n", + "The [collections.abc](https://docs.python.org/3/library/collections.abc.html) module in the [standard library](https://docs.python.org/3/library/index.html) defines a variety of **abstract base classes** (ABCs). We saw ABCs already in [Chapter 5](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers_00_content.ipynb#The-Numerical-Tower), where we use the ones from the [numbers](https://docs.python.org/3/library/numbers.html) module in the [standard library](https://docs.python.org/3/library/index.html) to classify Python's numeric data types according to mathematical ideas. Now, we take the ABCs from the [collections.abc](https://docs.python.org/3/library/collections.abc.html) module to classify the data types in this chapter and [Chapter 8](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings_00_content.ipynb) according to their behavior in various contexts.\n", "\n", "As an illustration, consider `numbers` and `text` below, two objects of *different* types." ] @@ -65,7 +65,7 @@ "outputs": [], "source": [ "numbers = [7, 11, 8, 5, 3, 12, 2, 6, 9, 10, 1, 4]\n", - "text = \"Lorem ipsum dolor sit amet, consectetur ...\"" + "text = \"Lorem ipsum dolor sit amet, ...\"" ] }, { @@ -114,7 +114,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "L o r e m i p s u m d o l o r s i t a m e t , c o n s e c t e t u r . . . " + "L o r e m i p s u m d o l o r s i t a m e t , . . . " ] } ], @@ -131,7 +131,7 @@ } }, "source": [ - "In [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration.ipynb#Containers-vs.-Iterables), we referred to such types as *iterables*. That is *not* a proper [English](https://dictionary.cambridge.org/spellcheck/english-german/?q=iterable) word, even if it may sound like one at first sight. Yet, it is an official term in the Python world formalized with the `Iterable` ABC in the [collections.abc](https://docs.python.org/3/library/collections.abc.html) module.\n", + "In [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_00_content.ipynb#Containers-vs.-Iterables), we referred to such types as *iterables*. That is *not* a proper [English](https://dictionary.cambridge.org/spellcheck/english-german/?q=iterable) word, even if it may sound like one at first sight. Yet, it is an official term in the Python world formalized with the `Iterable` ABC in the [collections.abc](https://docs.python.org/3/library/collections.abc.html) module.\n", "\n", "For the data science practitioner, it is worthwhile to know such terms as, for example, the documentation on the [built-ins](https://docs.python.org/3/library/functions.html) uses them extensively: In simple words, any built-in that takes an argument called \"*iterable*\" may be called with *any* object that supports being looped over. Already familiar [built-ins](https://docs.python.org/3/library/functions.html) include [enumerate()](https://docs.python.org/3/library/functions.html#enumerate), [sum()](https://docs.python.org/3/library/functions.html#sum), or [zip()](https://docs.python.org/3/library/functions.html#zip). So, they do *not* require the argument to be of a certain data type (e.g., `list`); instead, any *iterable* type works." ] @@ -181,7 +181,7 @@ } }, "source": [ - "As in the context of *goose typing* in [Chapter 5](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers.ipynb#Goose-Typing), we can use ABCs with the built-in [isinstance()](https://docs.python.org/3/library/functions.html#isinstance) function to check if an object supports a behavior.\n", + "As in the context of *goose typing* in [Chapter 5](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers_00_content.ipynb#Goose-Typing), we can use ABCs with the built-in [isinstance()](https://docs.python.org/3/library/functions.html#isinstance) function to check if an object supports a behavior.\n", "\n", "So, let's \"ask\" Python if it can loop over `numbers` or `text`." ] @@ -536,7 +536,7 @@ { "data": { "text/plain": [ - "43" + "31" ] }, "execution_count": 17, @@ -767,7 +767,7 @@ "name": "stdout", "output_type": "stream", "text": [ - ". . . r u t e t c e s n o c , t e m a t i s r o l o d m u s p i m e r o L " + ". . . , t e m a t i s r o l o d m u s p i m e r o L " ] } ], @@ -1028,7 +1028,7 @@ { "data": { "text/plain": [ - "140157873498184" + "140417317434464" ] }, "execution_count": 34, @@ -1074,7 +1074,7 @@ "source": [ "Alternatively, we use the [list()](https://docs.python.org/3/library/functions.html#func-list) built-in to create a `list` object out of an iterable we pass to it as the argument.\n", "\n", - "For example, we can wrap the [range()](https://docs.python.org/3/library/functions.html#func-range) built-in with [list()](https://docs.python.org/3/library/functions.html#func-list): As described in [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration.ipynb#Containers-vs.-Iterables), `range` objects, like `range(1, 13)` below, are iterable and generate `int` objects \"on the fly\" (i.e., one by one). The [list()](https://docs.python.org/3/library/functions.html#func-list) around it acts like a `for`-loop and **materializes** twelve `int` objects in memory that then become the elements of the newly created `list` object. [PythonTutor](http://www.pythontutor.com/visualize.html#code=r%20%3D%20range%281,%2013%29%0Al%20%3D%20list%28range%281,%2013%29%29&cumulative=false&curInstr=0&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false) shows this difference visually." + "For example, we can wrap the [range()](https://docs.python.org/3/library/functions.html#func-range) built-in with [list()](https://docs.python.org/3/library/functions.html#func-list): As described in [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_00_content.ipynb#Containers-vs.-Iterables), `range` objects, like `range(1, 13)` below, are iterable and generate `int` objects \"on the fly\" (i.e., one by one). The [list()](https://docs.python.org/3/library/functions.html#func-list) around it acts like a `for`-loop and **materializes** twelve `int` objects in memory that then become the elements of the newly created `list` object. [PythonTutor](http://www.pythontutor.com/visualize.html#code=r%20%3D%20range%281,%2013%29%0Al%20%3D%20list%28range%281,%2013%29%29&cumulative=false&curInstr=0&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false) shows this difference visually." ] }, { @@ -1299,11 +1299,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "[] \t140157882223304 \t\n", - "10 \t93987402609984 \t\n", - "20.0 \t140157882328912 \t\n", - "Thirty \t140157873509520 \t\n", - "[40, 50] \t140157873031176 \t\n" + "[] \t140417315676720 \t\n", + "10 \t94860849595456 \t\n", + "20.0 \t140417316476784 \t\n", + "Thirty \t140417315739568 \t\n", + "[40, 50] \t140417315720800 \t\n" ] } ], @@ -2017,7 +2017,7 @@ { "data": { "text/plain": [ - "140157882223304" + "140417315676720" ] }, "execution_count": 65, @@ -2041,7 +2041,7 @@ { "data": { "text/plain": [ - "140157882223304" + "140417315676720" ] }, "execution_count": 66, @@ -2065,7 +2065,7 @@ { "data": { "text/plain": [ - "140157882223304" + "140417315676720" ] }, "execution_count": 67, @@ -2191,7 +2191,7 @@ { "data": { "text/plain": [ - "140157882223304" + "140417315676720" ] }, "execution_count": 72, @@ -2215,7 +2215,7 @@ { "data": { "text/plain": [ - "140157873029448" + "140417376809600" ] }, "execution_count": 73, @@ -2392,7 +2392,7 @@ { "data": { "text/plain": [ - "140157873498184" + "140417317434464" ] }, "execution_count": 79, @@ -2401,7 +2401,7 @@ } ], "source": [ - "id(nested)" + "id(nested) # same memory location as before" ] }, { @@ -2678,7 +2678,7 @@ "source": [ "The `list` type is an essential data structure in any real-world Python application, and many typical `list`-related algorithms from computer science theory are already built into it at the C level (cf., the [documentation](https://docs.python.org/3/library/stdtypes.html#mutable-sequence-types) or the [tutorial](https://docs.python.org/3/tutorial/datastructures.html#more-on-lists) for a full overview; unfortunately, not all methods have direct links). So, understanding and applying the built-in methods of the `list` type not only speeds up the development process but also makes programs significantly faster.\n", "\n", - "In contrast to the `str` type's methods in [Chapter 6](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text.ipynb#String-Methods) (e.g., [upper()](https://docs.python.org/3/library/stdtypes.html#str.upper) or [lower()](https://docs.python.org/3/library/stdtypes.html#str.lower)), the `list` type's methods that mutate an object do so *in place*. That means they *never* create *new* `list` objects and return `None` to indicate that. So, we must *never* assign the return value of `list` methods to the variable holding the list!\n", + "In contrast to the `str` type's methods in [Chapter 6](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text_00_content.ipynb#String-Methods) (e.g., [upper()](https://docs.python.org/3/library/stdtypes.html#str.upper) or [lower()](https://docs.python.org/3/library/stdtypes.html#str.lower)), the `list` type's methods that mutate an object do so *in place*. That means they *never* create *new* `list` objects and return `None` to indicate that. So, we must *never* assign the return value of `list` methods to the variable holding the list!\n", "\n", "Let's look at the following `names` example." ] @@ -3016,7 +3016,7 @@ "source": [ "The [sort()](https://docs.python.org/3/library/stdtypes.html#list.sort) method and the [sorted()](https://docs.python.org/3/library/functions.html#sorted) function sort the elements in `names` in alphabetical order, forward or backward. However, that does *not* hold in general.\n", "\n", - "We mention above that `list` objects may contain objects of *any* type and even of *mixed* types. Because of that, the sorting is **[delegated](https://en.wikipedia.org/wiki/Delegation_(object-oriented_programming))** to the elements in a `list` object. In a way, Python \"asks\" the elements in a `list` object to sort themselves. As `names` contains only `str` objects, they are sorted according the the comparison rules explained in [Chapter 6](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text.ipynb#String-Comparison).\n", + "We mention above that `list` objects may contain objects of *any* type and even of *mixed* types. Because of that, the sorting is **[delegated](https://en.wikipedia.org/wiki/Delegation_(object-oriented_programming))** to the elements in a `list` object. In a way, Python \"asks\" the elements in a `list` object to sort themselves. As `names` contains only `str` objects, they are sorted according the the comparison rules explained in [Chapter 6](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text_00_content.ipynb#String-Comparison).\n", "\n", "To customize the sorting, we pass a keyword-only `key` argument to [sort()](https://docs.python.org/3/library/stdtypes.html#list.sort) or [sorted()](https://docs.python.org/3/library/functions.html#sorted), which must be a `function` object accepting *one* positional argument. Then, the elements in the `list` object are passed to that one by one, and the return values are used as the **sort keys**. The `key` argument is also a popular use case for `lambda` expressions.\n", "\n", @@ -4150,7 +4150,7 @@ "\n", "The revised `add_xyz()` function below is more natural to reason about as it does *not* modify the passed in `arg` internally. This approach is following the **[functional programming](https://en.wikipedia.org/wiki/Functional_programming)** paradigm that is going through a \"renaissance\" currently. Two essential characteristics of functional programming are that a function *never* changes its inputs and *always* returns the same output given the same inputs.\n", "\n", - "For a beginner, it is probably better to stick to this idea and not change any arguments as the original `add_xyz()` above. However, functions that modify and return the argument passed in are an important aspect of object-oriented programming, as explained in Chapter 9." + "For a beginner, it is probably better to stick to this idea and not change any arguments as the original `add_xyz()` above. However, functions that modify and return the argument passed in are an important aspect of object-oriented programming, as explained in Chapter 10." ] }, { @@ -4511,7 +4511,7 @@ { "data": { "text/plain": [ - "140157873009144" + "140417315626832" ] }, "execution_count": 158, @@ -5227,7 +5227,6 @@ "cell_type": "code", "execution_count": 184, "metadata": { - "scrolled": false, "slideshow": { "slide_type": "skip" } @@ -6154,7 +6153,7 @@ } }, "source": [ - "Unpacking allows us to rewrite the iterative `fibonacci()` function from [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration.ipynb#\"Hard-at-first-Glance\"-Example:-Fibonacci-Numbers-%28revisited%29) in a concise way, now also supporting *goose typing* with the [numbers](https://docs.python.org/3/library/numbers.html) module from the [standard library](https://docs.python.org/3/library/index.html)." + "Unpacking allows us to rewrite the iterative `fibonacci()` function from [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_00_content.ipynb#\"Hard-at-first-Glance\"-Example:-Fibonacci-Numbers-%28revisited%29) in a concise way, now also supporting *goose typing* with the [numbers](https://docs.python.org/3/library/numbers.html) module from the [standard library](https://docs.python.org/3/library/index.html)." ] }, { @@ -6577,7 +6576,7 @@ } }, "source": [ - "In the \"*Packing & Unpacking with Functions*\" [exercise](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_review_and_exercises.ipynb#Packing-&-Unpacking-with-Functions) at the end of this chapter, we look at `product()` in more detail.\n", + "In the \"*Packing & Unpacking with Functions*\" [exercise](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_review_and_exercises_00_content.ipynb#Packing-&-Unpacking-with-Functions) at the end of this chapter, we look at `product()` in more detail.\n", "\n", "While we needed to unpack `one_hundred` above to avoid the semantic error, unpacking an argument in a function call may also be a convenience in general.\n", "\n", @@ -6699,7 +6698,7 @@ "source": [ "We implicitly assume that the first element represents the $x$ and the second the $y$ coordinate. While that follows intuitively from convention in math, we should at least add comments somewhere in the code to document this assumption.\n", "\n", - "A better way is to create a *custom* data type. While that is covered in depth in Chapter 9, the [collections](https://docs.python.org/3/library/collections.html) module in the [standard library](https://docs.python.org/3/library/index.html) provides a [namedtuple()](https://docs.python.org/3/library/collections.html#collections.namedtuple) **factory function** that creates \"simple\" custom data types on top of the standard `tuple` type." + "A better way is to create a *custom* data type. While that is covered in depth in Chapter 10, the [collections](https://docs.python.org/3/library/collections.html) module in the [standard library](https://docs.python.org/3/library/index.html) provides a [namedtuple()](https://docs.python.org/3/library/collections.html#collections.namedtuple) **factory function** that creates \"simple\" custom data types on top of the standard `tuple` type." ] }, { @@ -6762,7 +6761,7 @@ { "data": { "text/plain": [ - "140157466523464" + "140416708056240" ] }, "execution_count": 238, @@ -6915,7 +6914,7 @@ { "data": { "text/plain": [ - "140157872590424" + "140417315422528" ] }, "execution_count": 243, @@ -7354,7 +7353,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 258, @@ -7654,7 +7653,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 269, @@ -7875,7 +7874,7 @@ } }, "source": [ - "Using the [map()](https://docs.python.org/3/library/functions.html#map) and [filter()](https://docs.python.org/3/library/functions.html#filter) built-ins, we can quickly switch the order: Filter first and then transform the remaining elements. This variant equals the \"*A simple Filter*\" example from [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration.ipynb#Example:-A-simple-Filter). On the contrary, code with `for`-loops and `if` statements is more tedious to adapt. Additionally, `map` and `filter` objects are optimized at the C level and, therefore, a lot faster as well." + "Using the [map()](https://docs.python.org/3/library/functions.html#map) and [filter()](https://docs.python.org/3/library/functions.html#filter) built-ins, we can quickly switch the order: Filter first and then transform the remaining elements. This variant equals the \"*A simple Filter*\" example from [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_00_content.ipynb#Example:-A-simple-Filter). On the contrary, code with `for`-loops and `if` statements is more tedious to adapt. Additionally, `map` and `filter` objects are optimized at the C level and, therefore, a lot faster as well." ] }, { @@ -8209,7 +8208,7 @@ "\n", "Often, such functions are used *only once* in a program. However, the primary purpose of functions is to *reuse* them. In such cases, it makes more sense to define them \"anonymously\" right at the position where the first argument goes.\n", "\n", - "As mentioned in [Chapter 2](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions.ipynb#Anonymous-Functions), Python provides `lambda` expressions to create `function` objects *without* a name referencing them.\n", + "As mentioned in [Chapter 2](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions_00_content.ipynb#Anonymous-Functions), Python provides `lambda` expressions to create `function` objects *without* a name referencing them.\n", "\n", "So, the above `add()` function could be rewritten as a `lambda` expression like so ..." ] @@ -8423,7 +8422,7 @@ "source": [ "For [map()](https://docs.python.org/3/library/functions.html#map) and [filter()](https://docs.python.org/3/library/functions.html#filter), Python provides a nice syntax appealing to people who like mathematics.\n", "\n", - "Consider again the \"*A simple Filter*\" example from [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration.ipynb#Example:-A-simple-Filter), written with combined `for` and `if` statements. So, the mapping and filtering steps happen simultaneously." + "Consider again the \"*A simple Filter*\" example from [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_00_content.ipynb#Example:-A-simple-Filter), written with combined `for` and `if` statements. So, the mapping and filtering steps happen simultaneously." ] }, { @@ -8488,7 +8487,7 @@ } }, "source": [ - "**List comprehensions**, or **list-comps** for short, are *expressions* to derive *new* `list` objects out of *existing* ones (cf., [reference](https://docs.python.org/3/reference/expressions.html#displays-for-lists-sets-and-dictionaries)). A single *expression* like below can replace the compound `for` *statement* from above." + "**List comprehensions**, or **listcomps** for short, are *expressions* to derive *new* `list` objects out of *existing* ones (cf., [reference](https://docs.python.org/3/reference/expressions.html#displays-for-lists-sets-and-dictionaries)). A single *expression* like below can replace the compound `for` *statement* from above." ] }, { @@ -9108,7 +9107,7 @@ { "data": { "text/plain": [ - " at 0x7f790c3a55e8>" + " at 0x7fb57436f3d0>" ] }, "execution_count": 312, @@ -9263,7 +9262,7 @@ { "data": { "text/plain": [ - " at 0x7f790c3a5a20>" + " at 0x7fb57436f650>" ] }, "execution_count": 317, @@ -9728,7 +9727,7 @@ { "data": { "text/plain": [ - " at 0x7f790c3a5b10>" + " at 0x7fb57436fad0>" ] }, "execution_count": 333, @@ -10074,7 +10073,7 @@ } }, "source": [ - "[all()](https://docs.python.org/3/library/functions.html#all) can be viewed as syntactic sugar replacing a `for`-loop: Internally, [all()](https://docs.python.org/3/library/functions.html#all) implements the *short-circuiting* strategy from [Chapter 3](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals.ipynb#Short-Circuiting), and we mimic that by testing for the *opposite* condition in the `if` statement and leaving the `for`-loop early with the `break` statement. In the worst case, if `threshold` were, for example, `150`, we would loop over *all* elements in the *iterable*, which must be *finite* for the code to work. So, [all()](https://docs.python.org/3/library/functions.html#all) is a *linear search* in disguise." + "[all()](https://docs.python.org/3/library/functions.html#all) can be viewed as syntactic sugar replacing a `for`-loop: Internally, [all()](https://docs.python.org/3/library/functions.html#all) implements the *short-circuiting* strategy from [Chapter 3](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals_00_content.ipynb#Short-Circuiting), and we mimic that by testing for the *opposite* condition in the `if` statement and leaving the `for`-loop early with the `break` statement. In the worst case, if `threshold` were, for example, `150`, we would loop over *all* elements in the *iterable*, which must be *finite* for the code to work. So, [all()](https://docs.python.org/3/library/functions.html#all) is a *linear search* in disguise." ] }, { @@ -10388,13 +10387,13 @@ } }, "source": [ - "With the new concepts in this chapter, let's rewrite the book's introductory \"*Averaging Even Numbers*\" example in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb#Example:-Averaging-Even-Numbers) such that it efficiently handles a large sequence of numbers.\n", + "With the new concepts in this chapter, let's rewrite the book's introductory \"*Averaging Even Numbers*\" example in [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb#Example:-Averaging-Even-Numbers) such that it efficiently handles a large sequence of numbers.\n", "\n", "We assume the `average_evens()` function below is called with a *finite* and *iterable* object, which generates a \"stream\" of numeric objects that can be cast as `int` objects because the idea of even and odd numbers only makes sense in the context of whole numbers.\n", "\n", "The generator expression `(int(n) for n in numbers)` implements the type casting, and when it is evaluated, *nothing* happens except that a `generator` object is stored in `integers`. Then, with the [reduce()](https://docs.python.org/3/library/functools.html#functools.reduce) function from the [functools](https://docs.python.org/3/library/functools.html) module, we *simultaneously* add up *and* count the even numbers produced by the inner generator expression `((n, 1) for n in integers if n % 2 == 0)`. That results in a `generator` object producing `tuple` objects consisting of the next *even* number in line and `1`. Two such `tuple` objects are then iteratively passed to the `lambda` expression as the `x` and `y` arguments. `x` represents the total and the count of the even numbers processed so far, while `y`'s first element, `y[0]`, is the next even number to be added to the running total. The result of the [reduce()](https://docs.python.org/3/library/functools.html#functools.reduce) function is again a `tuple` object, namely the final `total` and `count`. Lastly, we calculate the simple average.\n", "\n", - "In summary, the implementation of `average_evens()` does *not* keep materialized `list` objects internally like its predecessors from [Chapter 2](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions.ipynb), but processes the elements of the `numbers` argument on a one-by-one basis." + "In summary, the implementation of `average_evens()` does *not* keep materialized `list` objects internally like its predecessors from [Chapter 2](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions_00_content.ipynb), but processes the elements of the `numbers` argument on a one-by-one basis." ] }, { @@ -11014,7 +11013,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 375, @@ -11110,7 +11109,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 379, @@ -11318,7 +11317,7 @@ } }, "source": [ - "In [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration.ipynb#The-for-Statement), we argue that the `for` statement is syntactic sugar, replacing the `while` statement in many scenarios. In particular, a `for`-loop saves us two tasks: Managing an index variable *and* obtaining the individual elements by indexing. In this sub-section, we look at a more realistic picture, using the new terminology as well.\n", + "In [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_00_content.ipynb#The-for-Statement), we argue that the `for` statement is syntactic sugar, replacing the `while` statement in many scenarios. In particular, a `for`-loop saves us two tasks: Managing an index variable *and* obtaining the individual elements by indexing. In this sub-section, we look at a more realistic picture, using the new terminology as well.\n", "\n", "Let's print out the elements of a `list` object as the *iterable* to be looped over." ] @@ -11460,7 +11459,7 @@ "source": [ "Now that we know the concept of an *iterator*, let's compare some of the built-ins introduced in this chapter in detail and make sure we understand what is going on in memory. This sub-section is thus a great summary of this chapter as well.\n", "\n", - "We use two simple examples, `numbers` and `memoryless`, to guide us through the discussion. `numbers` creates *thirteen* objects in memory and `memoryless` only *one* (cf., [PythonTutor](http://www.pythontutor.com/visualize.html#code=numbers%20%3D%20%5B7,%2011,%208,%205,%203,%2012,%202,%206,%209,%2010,%201,%204%5D%0Amemoryless%20%3D%20range%281,%2013%29&cumulative=false&curInstr=2&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false))" + "We use two simple examples, `numbers` and `memoryless`, to guide us through the discussion. `numbers` creates *thirteen* objects in memory and `memoryless` only *one* (cf., [PythonTutor](http://www.pythontutor.com/visualize.html#code=numbers%20%3D%20%5B7,%2011,%208,%205,%203,%2012,%202,%206,%209,%2010,%201,%204%5D%0Amemoryless%20%3D%20range%281,%2013%29&cumulative=false&curInstr=2&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false))." ] }, { @@ -11499,7 +11498,7 @@ "source": [ "The [sorted()](https://docs.python.org/3/library/functions.html#sorted) function takes a *finite* and *iterable* object as its argument and *materializes* its elements into a *new* `list` object that is returned.\n", "\n", - "The argument may already be materialized, as is the case with `numbers`, but could also be an *iterator* that generates *new* objects, such as `memoryless`. In both cases, we end up with materialized `list` objects with the elements sorted in *forward* order (cf., [PythonTutor](http://www.pythontutor.com/visualize.html#code=numbers%20%3D%20%5B7,%2011,%208,%205,%203,%2012,%202,%206,%209,%2010,%201,%204%5D%0Amemoryless%20%3D%20range%281,%2013%29%0Aresult1%20%3D%20sorted%28numbers%29%0Aresult2%20%3D%20sorted%28memoryless%29&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false))." + "The argument may already be materialized, as is the case with `numbers`, but may also be an *iterable* without any objects in it, such as `memoryless`. In both cases, we end up with materialized `list` objects with the elements sorted in *forward* order (cf., [PythonTutor](http://www.pythontutor.com/visualize.html#code=numbers%20%3D%20%5B7,%2011,%208,%205,%203,%2012,%202,%206,%209,%2010,%201,%204%5D%0Amemoryless%20%3D%20range%281,%2013%29%0Aresult1%20%3D%20sorted%28numbers%29%0Aresult2%20%3D%20sorted%28memoryless%29&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false))." ] }, { @@ -11693,7 +11692,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 397, @@ -11717,7 +11716,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 398, @@ -12216,7 +12215,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.4" }, "livereveal": { "auto_select": "code", @@ -12244,5 +12243,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/07_sequences_10_review.ipynb b/07_sequences_10_review.ipynb new file mode 100644 index 0000000..a2d2f5c --- /dev/null +++ b/07_sequences_10_review.ipynb @@ -0,0 +1,397 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# Chapter 7: Sequential Data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Content Review" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Read [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_00_content.ipynb) of the book. Then, work through the questions below." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Essay Questions " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Answer the following questions *briefly*!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1**: We have seen **containers** and **iterables** before in [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_00_content.ipynb#Containers-vs.-Iterables). How do they relate to **sequences**? " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q2**: What are **abstract base classes**? How can we make use of the ones from the [collections.abc](https://docs.python.org/3/library/collections.abc.html) module in the [standard library](https://docs.python.org/3/library/index.html)?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q3**: How are the *abstract behaviors* of **reversibility** and **finiteness** essential for *indexing* and *slicing* sequences?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q4**: Explain the difference between **mutable** and **immutable** objects in Python with the examples of the `list` and `tuple` types!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q5**: What is the difference between a **shallow** and a **deep** copy of an object? How can one of them become a \"problem?\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q6**: Many **list methods** change `list` objects \"**in place**.\" What do we mean by that?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q7.1**: `tuple` objects have *two* primary usages. First, they can be used in place of `list` objects where **mutability** is *not* required. Second, we use them to model data **records**.\n", + "\n", + "Describe why `tuple` objects are a suitable replacement for `list` objects in general!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q7.2**: What do we mean by a **record**? How are `tuple` objects suitable to model records? How can we integrate a **semantic meaning** when working with records into our code?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q8**: How is (iterable) **packing** and **unpacking** useful in the context of **function definitions** and **calls**?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q9**: With the [map()](https://docs.python.org/3/library/functions.html#map) and [filter()](https://docs.python.org/3/library/functions.html#filter) built-ins and the [reduce()](https://docs.python.org/3/library/functools.html#functools.reduce) function from the [functools](https://docs.python.org/3/library/functools.html) module in the [standard library](https://docs.python.org/3/library/index.html), we can replace many tedious `for`-loops and `if` statements. What are some advantages of doing so?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q10**: Looking at the `lambda` expression inside [reduce()](https://docs.python.org/3/library/functools.html#functools.reduce) below, what \"simple\" [built-in function](https://docs.python.org/3/library/functions.html) is mimicked here?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```python\n", + "from functools import reduce\n", + "\n", + "numbers = [7, 11, 8, 5, 3, 12, 2, 6, 9, 10, 1, 4]\n", + "\n", + "reduce(lambda x, y: x if x > y else y, numbers)\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q11**: What is the primary use case of **list comprehensions**? Why do we describe them as **eager**?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q12**: **Generator expressions** may replace `list` objects and list comprehensions in many scenarios. When evaluated, they create a **lazy** `generator` object that does *not* **materialize** its elements right away. What do we mean by that? What does it mean for a `generator` object to be **exhausted**?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q13**: What does it mean for the **boolean reducers**, the built-in [all()](https://docs.python.org/3/library/functions.html#all) and [any()](https://docs.python.org/3/library/functions.html#any) functions, to follow the **short-circuiting** strategy?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q14**: What is an **iterator**? How does it relate to an **iterable**?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### True / False Questions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Motivate your answer with *one short* sentence!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q15**: `sequence` objects are *not* part of core Python but may be imported from the [standard library](https://docs.python.org/3/library/index.html)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q16**: The built-in [sort()](https://docs.python.org/3/library/stdtypes.html#list.sort) function takes a *finite* **iterable** as its argument an returns a *new* `list` object. On the contrary, the [sorted()](https://docs.python.org/3/library/functions.html#sorted) method on `list` objects *mutates* them *in place*." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q17**: Passing **mutable** objects as arguments to functions is not problematic because functions operate in a **local** scope without affecting the **global** scope." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q18**: `lambda` expressions are useful in the context of the **map-filter-reduce** paradigm, where we often do *not* re-use a `function` object more than once." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q19**: Using **generator expressions** in place of **list comprehensions** wherever possible is a good practice as it makes our programs use memory more efficiently." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q20**: Just as **list comprehensions** create `list` objects, **tuple comprehensions** create `tuple` objects." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + } + ], + "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.4" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": true, + "skip_h1_title": true, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": false, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/07_sequences_review_and_exercises.ipynb b/07_sequences_20_exercises.ipynb similarity index 70% rename from 07_sequences_review_and_exercises.ipynb rename to 07_sequences_20_exercises.ipynb index 68582b2..b2a8169 100644 --- a/07_sequences_review_and_exercises.ipynb +++ b/07_sequences_20_exercises.ipynb @@ -8,357 +8,6 @@ "# Chapter 7: Sequential Data" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Content Review" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Read [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences.ipynb) of the book. Then work through the twenty review questions." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Essay Questions " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Answer the following questions briefly with *at most* 300 characters per question!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q1**: We have seen **containers** and **iterables** before in [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration.ipynb#Containers-vs.-Iterables). How do they relate to **sequences**? " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q2**: What are **abstract base classes**? How can we make use of the ones from the [collections.abc](https://docs.python.org/3/library/collections.abc.html) module in the [standard library](https://docs.python.org/3/library/index.html)?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q3**: How are the *abstract behaviors* of **reversibility** and **finiteness** essential for *indexing* and *slicing* sequences?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q4**: Explain the difference between **mutable** and **immutable** objects in Python with the examples of the `list` and `tuple` types!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q5**: What is the difference between a **shallow** and a **deep** copy of an object? How can one of them become a \"problem?\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q6**: Many **list methods** change `list` objects \"**in place**.\" What do we mean by that?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q7.1**: `tuple` objects have *two* primary usages. First, they can be used in place of `list` objects where **mutability** is *not* required. Second, we use them to model data **records**.\n", - "\n", - "Describe why `tuple` objects are a suitable replacement for `list` objects in general!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q7.2**: What do we mean by a **record**? How are `tuple` objects suitable to model records? How can we integrate a **semantic meaning** when working with records into our code?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q8**: How is (iterable) **packing** and **unpacking** useful in the context of **function definitions** and **calls**?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q9**: With the [map()](https://docs.python.org/3/library/functions.html#map) and [filter()](https://docs.python.org/3/library/functions.html#filter) built-ins and the [reduce()](https://docs.python.org/3/library/functools.html#functools.reduce) function from the [functools](https://docs.python.org/3/library/functools.html) module in the [standard library](https://docs.python.org/3/library/index.html), we can replace many tedious `for`-loops and `if` statements. What are some advantages of doing so?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q10**: Looking at the `lambda` expression inside [reduce()](https://docs.python.org/3/library/functools.html#functools.reduce) below, what \"simple\" [built-in function](https://docs.python.org/3/library/functions.html) is mimicked here?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```python\n", - "from functools import reduce\n", - "\n", - "numbers = [7, 11, 8, 5, 3, 12, 2, 6, 9, 10, 1, 4]\n", - "\n", - "reduce(lambda x, y: x if x > y else y, numbers)\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q11**: What is the primary use case of **list comprehensions**? Why do we describe them as **eager**?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q12**: **Generator expressions** may replace `list` objects and list comprehensions in many scenarios. When evaluated, they create a **lazy** `generator` object that does *not* **materialize** its elements right away. What do we mean by that? What does it mean for a `generator` object to be **exhausted**?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q13**: What does it mean for the **boolean reducers**, the built-in [all()](https://docs.python.org/3/library/functions.html#all) and [any()](https://docs.python.org/3/library/functions.html#any) functions, to follow the **short-circuiting** strategy?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q14**: What is an **iterator**? How does it relate to an **iterable**?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### True / False Questions" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Motivate your answer with *one short* sentence!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q15**: `sequence` objects are *not* part of core Python but may be imported from the [standard library](https://docs.python.org/3/library/index.html)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q16**: The built-in [sort()](https://docs.python.org/3/library/stdtypes.html#list.sort) function takes a *finite* **iterable** as its argument an returns a *new* `list` object. On the contrary, the [sorted()](https://docs.python.org/3/library/functions.html#sorted) method on `list` objects *mutates* them *in place*." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q17**: Passing **mutable** objects as arguments to functions is not problematic because functions operate in a **local** scope without affecting the **global** scope." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q18**: `lambda` expressions are useful in the context of the **map-filter-reduce** paradigm, where we often do *not* re-use a `function` object more than once." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q19**: Using **generator expressions** in place of **list comprehensions** wherever possible is a good practice as it makes our programs use memory more efficiently." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q20**: Just as **list comprehensions** create `list` objects, **tuple comprehensions** create `tuple` objects." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -366,6 +15,13 @@ "## Coding Exercises" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Read [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_00_content.ipynb) of the book. Then, work through the exercises below." + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -377,7 +33,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q21.1**: Write a function `nested_sum()` that takes a `list` object as its argument, which contains other `list` objects with numbers, and adds up the numbers! Use `nested_numbers` below to test your function!\n", + "**Q1.1**: Write a function `nested_sum()` that takes a `list` object as its argument, which contains other `list` objects with numbers, and adds up the numbers! Use `nested_numbers` below to test your function!\n", "\n", "Hint: You need at least one `for`-loop." ] @@ -414,7 +70,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q21.2**: Provide a one-line expression to obtain the *same* result as `nested_sum()`!\n", + "**Q1.2**: Provide a one-line expression to obtain the *same* result as `nested_sum()`!\n", "\n", "Hints: Use a *list comprehension*, or maybe even a *generator expression*. You may want to use the built-in [sum()](https://docs.python.org/3/library/functions.html#sum) function several times." ] @@ -432,9 +88,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q21.3**: Generalize `nested_sum()` into a function `mixed_sum()` that can process a \"mixed\" `list` object, which contains numbers and other `list` objects with numbers! Use `mixed_numbers` below for testing!\n", + "**Q1.3**: Generalize `nested_sum()` into a function `mixed_sum()` that can process a \"mixed\" `list` object, which contains numbers and other `list` objects with numbers! Use `mixed_numbers` below for testing!\n", "\n", - "Hints: Use the built-in [isinstance()](https://docs.python.org/3/library/functions.html#isinstance) function to check how an element is to be processed. Get extra credit for adhering to *goose typing*, as explained in [Chapter 5](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers.ipynb#Goose-Typing)." + "Hints: Use the built-in [isinstance()](https://docs.python.org/3/library/functions.html#isinstance) function to check how an element is to be processed. Get extra credit for adhering to *goose typing*, as explained in [Chapter 5](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers_00_content.ipynb#Goose-Typing)." ] }, { @@ -478,7 +134,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q21.4.1**: Write a function `cum_sum()` that takes a `list` object with numbers as its argument and returns a *new* `list` object with the **cumulative sums** of these numbers! So, `sum_up` below, `[1, 2, 3, 4, 5]`, should return `[1, 3, 6, 10, 15]`.\n", + "**Q1.4.1**: Write a function `cum_sum()` that takes a `list` object with numbers as its argument and returns a *new* `list` object with the **cumulative sums** of these numbers! So, `sum_up` below, `[1, 2, 3, 4, 5]`, should return `[1, 3, 6, 10, 15]`.\n", "\n", "Hint: The idea behind is similar to the [cumulative distribution function](https://en.wikipedia.org/wiki/Cumulative_distribution_function) from statistics." ] @@ -515,7 +171,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q21.4.2**: We should always make sure that our functions also work in corner cases. What happens if your implementation of `cum_sum()` is called with an empty list `[]`? Make sure it handles that case *without* crashing! What would be a good return value in this corner case? Describe everything in the docstring.\n", + "**Q1.4.2**: We should always make sure that our functions also work in corner cases. What happens if your implementation of `cum_sum()` is called with an empty list `[]`? Make sure it handles that case *without* crashing! What would be a good return value in this corner case? Describe everything in the docstring.\n", "\n", "Hint: It is possible to write this without any extra input validation." ] @@ -540,7 +196,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In the \"*Function Definitions & Calls*\" section in [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences.ipynb#Function-Definitions-&-Calls), we define the following function `product()`. In this exercise, you will improve it by making it more \"user-friendly.\"" + "In the \"*Function Definitions & Calls*\" section in [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_00_content.ipynb#Function-Definitions-&-Calls), we define the following function `product()`. In this exercise, you will improve it by making it more \"user-friendly.\"" ] }, { @@ -565,7 +221,7 @@ "source": [ "The `*` in the function's header line *packs* all *positional* arguments passed to `product()` into one *iterable* called `args`.\n", "\n", - "**Q22.1**: What is the data type of `args` within the function's body?" + "**Q2.1**: What is the data type of `args` within the function's body?" ] }, { @@ -620,7 +276,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q22.2**: What line in the body of `product()` causes this exception? What is the exact problem?" + "**Q2.2**: What line in the body of `product()` causes this exception? What is the exact problem?" ] }, { @@ -634,7 +290,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences.ipynb#Function-Definitions-&-Calls), we also pass a `list` object, like `one_hundred`, to `product()`, and *no* exception is raised." + "In [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_00_content.ipynb#Function-Definitions-&-Calls), we also pass a `list` object, like `one_hundred`, to `product()`, and *no* exception is raised." ] }, { @@ -659,7 +315,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q22.3**: What is wrong with that? What *kind* of error (cf., [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb#Formal-vs.-Natural-Languages)) is that conceptually? Describe precisely what happens to the passed in `one_hundred` in every line within `product()`!" + "**Q2.3**: What is wrong with that? What *kind* of error (cf., [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb#Formal-vs.-Natural-Languages)) is that conceptually? Describe precisely what happens to the passed in `one_hundred` in every line within `product()`!" ] }, { @@ -723,7 +379,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q22.4**: Describe why no error occurs by going over every line in `product()`!" + "**Q2.4**: Describe why no error occurs by going over every line in `product()`!" ] }, { @@ -762,7 +418,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q22.5**: What line causes troubles now? What is the exact problem?" + "**Q2.5**: What line causes troubles now? What is the exact problem?" ] }, { @@ -776,7 +432,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q22.6**: Replace the `None` in `product()` above with something reasonable that does *not* cause exceptions! Ensure that `product(42)` and `product(2, 5, 10)` return a correct result.\n", + "**Q2.6**: Replace the `None` in `product()` above with something reasonable that does *not* cause exceptions! Ensure that `product(42)` and `product(2, 5, 10)` return a correct result.\n", "\n", "Hints: It is ok if `product()` returns a result *different* from the `None` above. Look at the documentation of the built-in [sum()](https://docs.python.org/3/library/functions.html#sum) function for some inspiration." ] @@ -835,9 +491,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q22.7**: Rewrite `product()` so that it takes a *keyword-only* argument `start`, defaulting to the above *default* or *start* value, and use `start` internally instead of `result`!\n", + "**Q2.7**: Rewrite `product()` so that it takes a *keyword-only* argument `start`, defaulting to the above *default* or *start* value, and use `start` internally instead of `result`!\n", "\n", - "Hint: Remember that a *keyword-only* argument is any parameter specified in a function's header line after the first (and only) `*` (cf., [Chapter 2](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions.ipynb#Keyword-only-Arguments))." + "Hint: Remember that a *keyword-only* argument is any parameter specified in a function's header line after the first (and only) `*` (cf., [Chapter 2](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions_00_content.ipynb#Keyword-only-Arguments))." ] }, { @@ -946,7 +602,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q22.8**: What is a **collection**? How is that different from a **sequence**?" + "**Q2.8**: What is a **collection**? How is that different from a **sequence**?" ] }, { @@ -960,7 +616,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q22.9**: Rewrite the latest version of `product()` to check if the *only* positional argument is a *collection* type! If so, its elements are multiplied together. Otherwise, the logic remains the same.\n", + "**Q2.9**: Rewrite the latest version of `product()` to check if the *only* positional argument is a *collection* type! If so, its elements are multiplied together. Otherwise, the logic remains the same.\n", "\n", "Hints: Use the built-in [len()](https://docs.python.org/3/library/functions.html#len) and [isinstance()](https://docs.python.org/3/library/functions.html#isinstance) functions to check if there is only *one* positional argument and if it is a *collection* type. Use the *abstract base class* `Collection` from the [collections.abc](https://docs.python.org/3/library/collections.abc.html) module in the [standard library](https://docs.python.org/3/library/index.html). You may want to *re-assign* `args` inside the body." ] @@ -1041,7 +697,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Side Note**: Above, we make `product()` work with a single *collection* type argument instead of a *sequence* type to keep it more generic: For example, we can pass in a `set` object, like `{2, 5, 10}` below, and `product()` continues to work correctly. The `set` type is introducted in [Chapter 8](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings.ipynb#The-set-Type), and one essential difference to the `list` type is that objects of type `set` have *no* order regarding their elements. So, even though `[2, 5, 10]` and `{2, 5, 10}` look almost the same, the order implied in the literal notation gets lost in memory!" + "**Side Note**: Above, we make `product()` work with a single *collection* type argument instead of a *sequence* type to keep it more generic: For example, we can pass in a `set` object, like `{2, 5, 10}` below, and `product()` continues to work correctly. The `set` type is introducted in [Chapter 8](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings_00_content.ipynb#The-set-Type), and one essential difference to the `list` type is that objects of type `set` have *no* order regarding their elements. So, even though `[2, 5, 10]` and `{2, 5, 10}` look almost the same, the order implied in the literal notation gets lost in memory!" ] }, { @@ -1091,7 +747,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q22.10**: Adapt the latest version of `product()` to also raise a `TypeError` if called *without* any *positional* arguments!" + "**Q2.10**: Adapt the latest version of `product()` to also raise a `TypeError` if called *without* any *positional* arguments!" ] }, { @@ -1279,7 +935,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q22.11**: What line causes the `TypeError`? What line is really the problem in the latest implementation of `product()`? Describe what happens on each line in the function's body until the exception is raised!" + "**Q2.11**: What line causes the `TypeError`? What line is really the problem in the latest implementation of `product()`? Describe what happens on each line in the function's body until the exception is raised!" ] }, { @@ -1293,7 +949,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q22.12**: Adapt `product()` one last time to make it work with *iterators* as well!\n", + "**Q2.12**: Adapt `product()` one last time to make it work with *iterators* as well!\n", "\n", "Hints: This task is as easy as replacing `Collection` with something else. Which of the three behaviors of *collections* do *iterators* also exhibit? You may want to look at the documentations on the built-in [max()](https://docs.python.org/3/library/functions.html#max), [min()](https://docs.python.org/3/library/functions.html#min), and [sum()](https://docs.python.org/3/library/functions.html#sum) functions: What kind of argument do they take?" ] @@ -1442,7 +1098,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q23.1**: `list` objects are **sequences**. What *four* behaviors do they always come with?" + "**Q3.1**: `list` objects are **sequences**. What *four* behaviors do they always come with?" ] }, { @@ -1456,7 +1112,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q23.2**: Write a function `mean()` that calculates the simple arithmetic mean of a given `sequence` with numbers!\n", + "**Q3.2**: Write a function `mean()` that calculates the simple arithmetic mean of a given `sequence` with numbers!\n", "\n", "Hints: You can solve this task with [built-in functions](https://docs.python.org/3/library/functions.html) only. A `for`-loop is *not* needed." ] @@ -1493,7 +1149,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q23.3**: Write a function `std()` that calculates the [standard deviation](https://en.wikipedia.org/wiki/Standard_deviation) of a `sequence` of numbers! Integrate your `mean()` version from before and the [sqrt()](https://docs.python.org/3/library/math.html#math.sqrt) function from the [math](https://docs.python.org/3/library/math.html) module in the [standard library](https://docs.python.org/3/library/index.html) provided to you below. Make sure `std()` calls `mean()` only *once* internally! Repeated calls to `mean()` would be a waste of computational resources.\n", + "**Q3.3**: Write a function `std()` that calculates the [standard deviation](https://en.wikipedia.org/wiki/Standard_deviation) of a `sequence` of numbers! Integrate your `mean()` version from before and the [sqrt()](https://docs.python.org/3/library/math.html#math.sqrt) function from the [math](https://docs.python.org/3/library/math.html) module in the [standard library](https://docs.python.org/3/library/index.html) provided to you below. Make sure `std()` calls `mean()` only *once* internally! Repeated calls to `mean()` would be a waste of computational resources.\n", "\n", "Hints: Parts of the code are probably too long to fit within the suggested 79 characters per line. So, use *temporary variables* inside your function. Instead of a `for`-loop, you may want to use a *list comprehension* or, even better, a memoryless *generator expression*." ] @@ -1539,7 +1195,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q23.4**: Complete `standardize()` below that takes a `sequence` of numbers and returns a `list` object with the **[z-scores](https://en.wikipedia.org/wiki/Standard_score)** of these numbers! A z-score is calculated by subtracting the mean and dividing by the standard deviation. Re-use `mean()` and `std()` from before. Again, ensure that `standardize()` calls `mean()` and `std()` only *once*! Further, round all z-scores with the built-in [round()](https://docs.python.org/3/library/functions.html#round) function and pass on the keyword-only argument `digits` to it.\n", + "**Q3.4**: Complete `standardize()` below that takes a `sequence` of numbers and returns a `list` object with the **[z-scores](https://en.wikipedia.org/wiki/Standard_score)** of these numbers! A z-score is calculated by subtracting the mean and dividing by the standard deviation. Re-use `mean()` and `std()` from before. Again, ensure that `standardize()` calls `mean()` and `std()` only *once*! Further, round all z-scores with the built-in [round()](https://docs.python.org/3/library/functions.html#round) function and pass on the keyword-only argument `digits` to it.\n", "\n", "Hint: You may want to use a *list comprehension* instead of a `for`-loop." ] @@ -1610,7 +1266,7 @@ "source": [ "Even though `standardize()` calls `mean()` and `std()` only once each, `mean()` is called *twice*! That is so because `std()` internally also re-uses `mean()`!\n", "\n", - "**Q23.5.1**: Rewrite `std()` to take an optional keyword-only argument `seq_mean`, defaulting to `None`. If provided, `seq_mean` is used instead of the result of calling `mean()`. Otherwise, the latter is called.\n", + "**Q3.5.1**: Rewrite `std()` to take an optional keyword-only argument `seq_mean`, defaulting to `None`. If provided, `seq_mean` is used instead of the result of calling `mean()`. Otherwise, the latter is called.\n", "\n", "Hint: You must check if `seq_mean` is still the default value." ] @@ -1654,7 +1310,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q23.5.2**: Now, rewrite `standardize()` to pass on the return value of `mean()` to `std()`! In summary, `standardize()` calculates the z-scores for the numbers in the `sequence` with as few computational steps as possible." + "**Q3.5.2**: Now, rewrite `standardize()` to pass on the return value of `mean()` to `std()`! In summary, `standardize()` calculates the z-scores for the numbers in the `sequence` with as few computational steps as possible." ] }, { @@ -1689,7 +1345,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q23.6**: With both `sample` and `z_scores` being materialized `list` objects, we can loop over pairs consisting of a number from `sample` and its corresponding z-score. Write a `for`-loop that prints out all the \"outliers,\" as which we define numbers with an absolute z-score above `1.96`. There are *four* of them in the `sample`.\n", + "**Q3.6**: With both `sample` and `z_scores` being materialized `list` objects, we can loop over pairs consisting of a number from `sample` and its corresponding z-score. Write a `for`-loop that prints out all the \"outliers,\" as which we define numbers with an absolute z-score above `1.96`. There are *four* of them in the `sample`.\n", "\n", "Hint: Use the [abs()](https://docs.python.org/3/library/functions.html#abs) and [zip()](https://docs.python.org/3/library/functions.html#zip) built-ins." ] @@ -1798,7 +1454,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q23.7**: What happens if you call `mean()` with `data` as the argument? What is the problem?\n", + "**Q3.7**: What happens if you call `mean()` with `data` as the argument? What is the problem?\n", "\n", "Hints: If you try it out, you may have to press the \"Stop\" button in the toolbar at the top. Your computer should *not* crash, but you will *have to* restart this Jupyter notebook with \"Kernel\" > \"Restart\" and import `data` again." ] @@ -1823,7 +1479,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q23.8**: Write a function `take_sample()` that takes an `iterator` as its argument, like `data`, and creates a *materialized* `list` object out of its first `n` elements, defaulting to `1_000`!\n", + "**Q3.8**: Write a function `take_sample()` that takes an `iterator` as its argument, like `data`, and creates a *materialized* `list` object out of its first `n` elements, defaulting to `1_000`!\n", "\n", "Hints: [next()](https://docs.python.org/3/library/functions.html#next) and the [range()](https://docs.python.org/3/library/functions.html#func-range) built-in may be helpful. You may want to use a *list comprehension* instead of a `for`-loop and write a one-liner. Audacious students may want to look at [isclice()](https://docs.python.org/3/library/itertools.html#itertools.islice) in the [itertools](https://docs.python.org/3/library/itertools.html) module in the [standard library](https://docs.python.org/3/library/index.html)." ] @@ -1885,7 +1541,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q23.9**: Convert `standardize()` into a *new* function `standardized()` that implements the *same* logic but works on a possibly *infinite* stream of data, provided as an `iterable`, instead of a *finite* `sequence`.\n", + "**Q3.9**: Convert `standardize()` into a *new* function `standardized()` that implements the *same* logic but works on a possibly *infinite* stream of data, provided as an `iterable`, instead of a *finite* `sequence`.\n", "\n", "To calculate a z-score, we need the stream's overall mean and standard deviation, and that is *impossible* to calculate if we do not know how long the stream is, and, in particular, if it is *infinite*. So, `standardized()` first takes a sample from the `iterable` internally, and uses the sample's mean and standard deviation to calculate the z-scores.\n", "\n", @@ -1949,7 +1605,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q23.10.1**: `standardized()` allows us to go over an *infinite* stream of z-scores. What we want to do instead is to loop over the stream's raw numbers and skip the outliers. In the remainder of this exercise, you look at the parts that make up the `skip_outliers()` function below to achieve precisely that.\n", + "**Q3.10.1**: `standardized()` allows us to go over an *infinite* stream of z-scores. What we want to do instead is to loop over the stream's raw numbers and skip the outliers. In the remainder of this exercise, you look at the parts that make up the `skip_outliers()` function below to achieve precisely that.\n", "\n", "The first steps in `skip_outliers()` are the same as in `standardized()`: We take a `sample` from the stream of `data` and calculate its statistics." ] @@ -1969,9 +1625,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q23.10.2**: Just as in `standardized()`, write a *generator expression* that produces z-scores one by one! However, instead of just generating a z-score, the resulting `generator` object should produce `tuple` objects consisting of a \"raw\" number from `data` and its z-score.\n", + "**Q3.10.2**: Just as in `standardized()`, write a *generator expression* that produces z-scores one by one! However, instead of just generating a z-score, the resulting `generator` object should produce `tuple` objects consisting of a \"raw\" number from `data` and its z-score.\n", "\n", - "Hint: Look at the revisited \"*Averaging Even Numbers*\" example in [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences.ipynb#Example:-Averaging-Even-Numbers-%28revisited%29) for some inspiration, which also contains a generator expression producing `tuple` objects." + "Hint: Look at the revisited \"*Averaging Even Numbers*\" example in [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_00_content.ipynb#Example:-Averaging-Even-Numbers-%28revisited%29) for some inspiration, which also contains a generator expression producing `tuple` objects." ] }, { @@ -2003,7 +1659,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q23.10.3**: Write another generator expression that loops over `standardizer`. It contains an `if`-clause that keeps only numbers with an absolute z-score below the `threshold_z`. If you fancy, use *tuple unpacking*." + "**Q3.10.3**: Write another generator expression that loops over `standardizer`. It contains an `if`-clause that keeps only numbers with an absolute z-score below the `threshold_z`. If you fancy, use *tuple unpacking*." ] }, { @@ -2044,7 +1700,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q23.10.4**: Lastly, put everything together in the `skip_outliers()` function! Make sure you refer to `iterable` inside the function and not the global `data`." + "**Q3.10.4**: Lastly, put everything together in the `skip_outliers()` function! Make sure you refer to `iterable` inside the function and not the global `data`." ] }, { @@ -2109,7 +1765,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q23.11**: You implemented the functions `mean()`, `std()`, `standardize()`, `standardized()`, and `skip_outliers()`. Which of them are **eager**, and which are **lazy**? How do these two concepts relate to **finite** and **infinite** data?" + "**Q3.11**: You implemented the functions `mean()`, `std()`, `standardize()`, `standardized()`, and `skip_outliers()`. Which of them are **eager**, and which are **lazy**? How do these two concepts relate to **finite** and **infinite** data?" ] }, { @@ -2136,7 +1792,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.4" }, "toc": { "base_numbering": 1, @@ -2153,5 +1809,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/08_mappings.ipynb b/08_mappings_00_content.ipynb similarity index 96% rename from 08_mappings.ipynb rename to 08_mappings_00_content.ipynb index d42237b..2e19dbe 100644 --- a/08_mappings.ipynb +++ b/08_mappings_00_content.ipynb @@ -19,9 +19,9 @@ } }, "source": [ - "While [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences.ipynb) focuses on one special kind of *collection* types, namely *sequences*, this chapter introduces two more: **Mappings** and **sets**. We present the data types belonging to these two groups in one chapter as they share the *same* underlying implementation at the C Level, known as **[hash tables](https://en.wikipedia.org/wiki/Hash_table)**.\n", + "While [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_00_content.ipynb) focuses on one special kind of *collection* types, namely *sequences*, this chapter introduces two more kinds: **Mappings** and **sets**. We present the data types belonging to these two groups in one chapter as they share the *same* underlying implementation at the C Level, known as **[hash tables](https://en.wikipedia.org/wiki/Hash_table)**.\n", "\n", - "The most important mapping type in this chapter is the `dict` type that we have not yet seen before (cf, [documentation](https://docs.python.org/3/library/stdtypes.html#dict)). It is an essential part in a data science practitioner's toolbox for two reasons: First, Python employs `dict` objects basically \"everywhere\" internally. So, we must understand how they work to become better at Python in general. Second, after the many concepts related to *sequential* data, the ideas behind *mappings* enhance our general problem solving skills. As a concrete example, we look at the concept of **memoization** to complete our picture of *recursion*, as depicted in [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration.ipynb#Recursion). We end this chapter with a discussion of *set* types." + "The most important mapping type in this chapter is the `dict` type that we have not yet seen before (cf, [documentation](https://docs.python.org/3/library/stdtypes.html#dict)). It is an essential part in a data science practitioner's toolbox for two reasons: First, Python employs `dict` objects basically \"everywhere\" internally. So, we must understand how they work to become better at Python in general. Second, after the many concepts related to *sequential* data, the ideas behind *mappings* enhance our general problem solving skills. As a concrete example, we look at the concept of **memoization** to complete our picture of *recursion*, as depicted in [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_00_content.ipynb#Recursion). We end this chapter with a discussion of *set* types." ] }, { @@ -45,7 +45,7 @@ "source": [ "A *mapping* is a one-to-one correspondence from a set of **keys** to a set of **values**. In other words, a *mapping* is a *collection* of **key-value pairs**, also called **items** for short.\n", "\n", - "In the context of mappings, the term *value* has a meaning different from the general *value* that *every* object has: In the \"bag\" analogy from [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb#Value), we descibe an object's value to be the concrete $0$s and $1$s it contains. Here, the terms *key* and *value* mean the *role* an object takes within a mapping. Both, *keys* and *values*, are real *objects* with a distinct *value*. So, the student should always remember the double meaning of the term *value* in this chapter!\n", + "In the context of mappings, the term *value* has a meaning different from the general *value* that *every* object has: In the \"bag\" analogy from [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb#Value), we descibe an object's value to be the concrete $0$s and $1$s it contains. Here, the terms *key* and *value* mean the *role* an object takes within a mapping. Both, *keys* and *values*, are real *objects* with a distinct *value*. So, the student should always remember the double meaning of the term *value* in this chapter!\n", "\n", "Let's continue with an example. To create a `dict` object, we commonly use the literal notation, `{..: .., ..: .., ...}`, and list all the items. `to_words` below maps the `int` objects `0`, `1`, and `2` to their English word equivalents, `\"zero\"`, `\"one\"`, and `\"two\"`, and `from_words` does the opposite. A stylistic side note: Pythonistas often expand `dict` or `list` definitions by writing each item or element on a line on their own. The commas `,` after the *last* items are *not* a mistake, as well, although they *may* be left out. Besides easier reading, such style has actual technical advantages (cf., [source](https://www.python.org/dev/peps/pep-0008/#when-to-use-trailing-commas)) that we do not go into detail about here." ] @@ -107,7 +107,7 @@ { "data": { "text/plain": [ - "139752734794304" + "139953979690352" ] }, "execution_count": 3, @@ -502,7 +502,7 @@ } }, "source": [ - "In [Chapter 0](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/00_start_up.ipynb#Isn't-C-a-lot-faster?), we argue that a major advantage of using Python is that it takes care of the memory managment for us. In line with that, we have never talked about the C level implementation thus far in the book. However, the `dict` type, among others, exhibits some behaviors that may seem \"weird\" for a beginner. To built a solid intuition that enables the student to better \"predict\" how `dict` objects behave, we describe the underlying implementation details on a conceptual level (i.e., without C code).\n", + "In [Chapter 0](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/00_start_up_00_content.ipynb#Isn't-C-a-lot-faster?), we argue that a major advantage of using Python is that it takes care of the memory managment for us. In line with that, we have never talked about the C level implementation thus far in the book. However, the `dict` type, among others, exhibits some behaviors that may seem \"weird\" for a beginner. To built a solid intuition that enables the student to better \"predict\" how `dict` objects behave, we describe the underlying implementation details on a conceptual level (i.e., without C code).\n", "\n", "The first unintuitive behavior is that we may *not* use a *mutable* object as a key. That results in a `TypeError`." ] @@ -597,10 +597,10 @@ } }, "source": [ - "| Bucket | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |\n", - "| :---: |:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n", - "| Key |*...*|*...*|*...*|*...*|*...*|*...*|*...*|*...*|\n", - "| Value |*...*|*...*|*...*|*...*|*...*|*...*|*...*|*...*|" + "| Bucket | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |\n", + "| :---: |:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n", + "| **Key** |*...*|*...*|*...*|*...*|*...*|*...*|*...*|*...*|\n", + "|**Value**|*...*|*...*|*...*|*...*|*...*|*...*|*...*|*...*|" ] }, { @@ -628,7 +628,7 @@ { "data": { "text/plain": [ - "-2242252796476499076" + "-1033934764475250610" ] }, "execution_count": 17, @@ -707,7 +707,7 @@ } }, "source": [ - "The [glossary](https://docs.python.org/3/glossary.html#term-hashable) states a second requirement for hashability, namely that \"objects which *compare equal* must have the *same* hash value.\" The purpose of this is to ensure that if we put, for example, `1` as a key in a `dict` object, we can look it up later with `1.0`. In other words, we can look up keys by their object's value (i.e., in the meaning of [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb#Value)). The converse statement does *not* hold: Two objects *may* (accidentally) have the *same* hash value and *not* compare equal." + "The [glossary](https://docs.python.org/3/glossary.html#term-hashable) states a second requirement for hashability, namely that \"objects which *compare equal* must have the *same* hash value.\" The purpose of this is to ensure that if we put, for example, `1` as a key in a `dict` object, we can look it up later with `1.0`. In other words, we can look up keys by their object's value (i.e., in the meaning of [Chapter 1](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb#Value)). The converse statement does *not* hold: Two objects *may* (accidentally) have the *same* hash value and *not* compare equal." ] }, { @@ -951,12 +951,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "zero\t-2242252796476499076\t0b...010010000100\t100\t4\n", - "one\t6742734203392562231\t0b...010000110111\t111\t7\n", - "two\t8400825950927958036\t0b...000000010100\t100\t4\n", - "three\t-7473701886709619306\t0b...101001101010\t010\t2\n", - "four\t5854090567539607813\t0b...100100000101\t101\t5\n", - "five\t5010767421024509913\t0b...111111011001\t001\t1\n" + "zero\t-1033934764475250610\t0b...011110110010\t010\t2\n", + "one\t-3496683303036773129\t0b...001100001001\t001\t1\n", + "two\t-4468022785493412346\t0b...100111111010\t010\t2\n", + "three\t1491334499222274950\t0b...001110000110\t110\t6\n", + "four\t490235692124377396\t0b...000100110100\t100\t4\n", + "five\t-550474145318920636\t0b...000110111100\t100\t4\n" ] } ], @@ -983,10 +983,10 @@ } }, "source": [ - "| Bucket | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |\n", - "| :---: | :---: |:---:| :---: | :---: |:---:| :---: |:---:| :---: |\n", - "| Key |`\"one\"`|*...*|`\"two\"`|`\"four\"`|*...*|`\"three\"`|*...*|`\"zero\"`|\n", - "| Value | `1` |*...*| `2` | `4` |*...*| `3` |*...*| `0` |" + "| Bucket | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |\n", + "| :---: | :---: |:---:| :---: | :---: |:---:| :---: |:---:| :---: |\n", + "| **Key** |`\"one\"`|*...*|`\"two\"`|`\"four\"`|*...*|`\"three\"`|*...*|`\"zero\"`|\n", + "|**Value**| `1` |*...*| `2` | `4` |*...*| `3` |*...*| `0` |" ] }, { @@ -1008,10 +1008,10 @@ } }, "source": [ - "| Bucket | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |\n", - "| :---: | :---: |:---:|:---:|:---:|:---:|:---:|:---:| :---: |:---:|:---:| :---: | :---: |:---:| :---: |:---:| :---: |\n", - "| Key |`\"one\"`|*...*|*...*|*...*|*...*|*...*|*...*|`\"five\"`|*...*|*...*|`\"two\"`|`\"four\"`|*...*|`\"three\"`|*...*|`\"zero\"`|\n", - "| Value | `1` |*...*|*...*|*...*|*...*|*...*|*...*| `5` |*...*|*...*| `2` | `4` |*...*| `3` |*...*| `0` |" + "| Bucket | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |\n", + "| :---: | :---: |:---:|:---:|:---:|:---:|:---:|:---:| :---: |:---:|:---:| :---: | :---: |:---:| :---: |:---:| :---: |\n", + "| **Key** |`\"one\"`|*...*|*...*|*...*|*...*|*...*|*...*|`\"five\"`|*...*|*...*|`\"two\"`|`\"four\"`|*...*|`\"three\"`|*...*|`\"zero\"`|\n", + "|**Value**| `1` |*...*|*...*|*...*|*...*|*...*|*...*| `5` |*...*|*...*| `2` | `4` |*...*| `3` |*...*| `0` |" ] }, { @@ -1038,12 +1038,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "zero\t-2242252796476499076\t0b...010010000100\t0100\t4\n", - "one\t6742734203392562231\t0b...010000110111\t0111\t7\n", - "two\t8400825950927958036\t0b...000000010100\t0100\t4\n", - "three\t-7473701886709619306\t0b...101001101010\t1010\t10\n", - "four\t5854090567539607813\t0b...100100000101\t0101\t5\n", - "five\t5010767421024509913\t0b...111111011001\t1001\t9\n" + "zero\t-1033934764475250610\t0b...011110110010\t0010\t2\n", + "one\t-3496683303036773129\t0b...001100001001\t1001\t9\n", + "two\t-4468022785493412346\t0b...100111111010\t1010\t10\n", + "three\t1491334499222274950\t0b...001110000110\t0110\t6\n", + "four\t490235692124377396\t0b...000100110100\t0100\t4\n", + "five\t-550474145318920636\t0b...000110111100\t1100\t12\n" ] } ], @@ -1070,7 +1070,7 @@ } }, "source": [ - "### Mappings are Collections without \"Predictable Order\"" + "### Mappings are Collections without \"Predictable\" Order" ] }, { @@ -1081,7 +1081,7 @@ } }, "source": [ - "In [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences.ipynb#Collections-vs.-Sequences), we show how *sequences* are a special kind of *collections*. The latter can be described as iterable containers with a finite number of elements.\n", + "In [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_00_content.ipynb#Collections-vs.-Sequences), we show how *sequences* are a special kind of *collections*. The latter can be described as iterable containers with a finite number of elements.\n", "\n", "The `dict` type is a special kind of a *collection*, as well, as revealed with the `Collection` ABC from the [collections.abc](https://docs.python.org/3/library/collections.abc.html) module in the [standard library](https://docs.python.org/3/library/index.html)." ] @@ -1291,12 +1291,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "Python 3.7.3\r\n" + "Python 3.7.4\n" ] } ], "source": [ - "!python --version # the order in the for-loops is predictable for Python 3.7 or higher only" + "!python --version # the order in the for-loops is predictable only for Python 3.7 or higher" ] }, { @@ -1811,7 +1811,7 @@ }, "outputs": [], "source": [ - "haystack = [random.randint(99, 9999) for _ in range(10_000_000)] + [42]" + "needle = 42" ] }, { @@ -1824,7 +1824,8 @@ }, "outputs": [], "source": [ - "needle = 42" + "haystack = [random.randint(99, 9999) for _ in range(10_000_000)]\n", + "haystack.append(needle)" ] }, { @@ -1863,7 +1864,7 @@ { "data": { "text/plain": [ - "[8126, 7370, 3735, 213, 7922, 1434, 8557, 9609, 9704, 9564, 9601, 3444]" + "[8126, 7370, 3735, 213, 7922, 1434, 8557, 9609, 9704, 9564]" ] }, "execution_count": 57, @@ -1872,7 +1873,7 @@ } ], "source": [ - "haystack[:12]" + "haystack[:10]" ] }, { @@ -1887,7 +1888,7 @@ { "data": { "text/plain": [ - "[5842, 1894, 7237, 886, 5945, 4014, 4998, 2055, 3531, 6919, 7875, 1944]" + "[7237, 886, 5945, 4014, 4998, 2055, 3531, 6919, 7875, 1944]" ] }, "execution_count": 58, @@ -1896,7 +1897,7 @@ } ], "source": [ - "haystack[-12:]" + "haystack[-10:]" ] }, { @@ -1923,7 +1924,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "4.37 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n" + "4.32 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n" ] } ], @@ -1965,7 +1966,7 @@ } }, "source": [ - "Because the hash table implementation is *extremely* fast, we search the `needle` not `10` but `10_000` times. The code cell still runs in only a fraction of the time its counterpart does above." + "To show the *massive* effect of the hash table implementation, we search the `needle` not `10` but `10_000_000` times. The code cell still runs in only a fraction of the time its counterpart does above." ] }, { @@ -1981,7 +1982,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "426 ms ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n" + "419 ms ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n" ] } ], @@ -2447,7 +2448,7 @@ { "data": { "text/plain": [ - "139752734711240" + "139953979638320" ] }, "execution_count": 75, @@ -2638,7 +2639,7 @@ } }, "source": [ - "`dict` objects come with many methods bound on them, many of which are standardized by the `Mapping` and `MutableMapping` ABCs from the [collections.abc](https://docs.python.org/3/library/collections.abc.html) module. While the former requires a data type adhering to it to implement the [keys()](https://docs.python.org/3/library/stdtypes.html#dict.keys), [values()](https://docs.python.org/3/library/stdtypes.html#dict.values), [items()](https://docs.python.org/3/library/stdtypes.html#dict.items), and [get()](https://docs.python.org/3/library/stdtypes.html#dict.get) methods, which *never* mutate an object, the latter formalizes the [update()](https://docs.python.org/3/library/stdtypes.html#dict.update), [pop()](https://docs.python.org/3/library/stdtypes.html#dict.pop), [popitem()](https://docs.python.org/3/library/stdtypes.html#dict.popitem), [clear()](https://docs.python.org/3/library/stdtypes.html#dict.clear), and [setdefault()](https://docs.python.org/3/library/stdtypes.html#dict.setdefault) methods, which *may* do so." + "`dict` objects come with many methods bound on them (cf., [documentation](https://docs.python.org/3/library/stdtypes.html#dict)), many of which are standardized by the `Mapping` and `MutableMapping` ABCs from the [collections.abc](https://docs.python.org/3/library/collections.abc.html) module. While the former requires a data type adhering to it to implement the [keys()](https://docs.python.org/3/library/stdtypes.html#dict.keys), [values()](https://docs.python.org/3/library/stdtypes.html#dict.values), [items()](https://docs.python.org/3/library/stdtypes.html#dict.items), and [get()](https://docs.python.org/3/library/stdtypes.html#dict.get) methods, which *never* mutate an object, the latter formalizes the [update()](https://docs.python.org/3/library/stdtypes.html#dict.update), [pop()](https://docs.python.org/3/library/stdtypes.html#dict.pop), [popitem()](https://docs.python.org/3/library/stdtypes.html#dict.popitem), [clear()](https://docs.python.org/3/library/stdtypes.html#dict.clear), and [setdefault()](https://docs.python.org/3/library/stdtypes.html#dict.setdefault) methods, which *may* do so." ] }, { @@ -2929,7 +2930,7 @@ } }, "source": [ - "Above, we see how the look-up operator fails *loudly* if a key is not in a `dict` object. For example, `to_words` does *not* have a key `0` any more." + "Above, we see how the look-up operator fails *loudly* with a `KeyError` if a key is *not* in a `dict` object. For example, `to_words` does *not* have a key `0` any more." ] }, { @@ -3768,7 +3769,7 @@ } }, "source": [ - "Just as a single `*` symbol is used for packing and unpacking iterables in [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences.ipynb#Packing-&-Unpacking), a double `**` symbol implements packing and unpacking for mappings.\n", + "Just as a single `*` symbol is used for packing and unpacking iterables in [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_00_content.ipynb#Packing-&-Unpacking), a double `**` symbol implements packing and unpacking for mappings.\n", "\n", "Let's say we have `to_words` and `more_words` as below and want to merge the items together into a *new* `dict` object." ] @@ -3815,7 +3816,7 @@ } }, "source": [ - "By *unpacking* the items with `**`, the newly created `dict` objects is first filled with the items from `to_words` and then from `more_words`. The item with the key `2` from `more_words` overwrites its counterpart from `to_words` as it is mentioned last." + "By *unpacking* the items with `**`, the newly created `dict` object is first filled with the items from `to_words` and then from `more_words`. The item with the key `2` from `more_words` overwrites its counterpart from `to_words` as it is mentioned last." ] }, { @@ -4194,7 +4195,7 @@ } }, "source": [ - "Analogous to list comprehensions in [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences.ipynb#List-Comprehensions), **dictionary comprehensions**, or **dictcomps** for short, are a concise literal notation to derive new `dict` objects out of existing ones.\n", + "Analogous to list comprehensions in [Chapter 7](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_00_content.ipynb#List-Comprehensions), **dictionary comprehensions**, or **dictcomps** for short, are a concise literal notation to derive new `dict` objects out of existing ones.\n", "\n", "For example, let's derive `from_words` from `to_words` below by swapping the keys and values." ] @@ -4409,7 +4410,7 @@ } }, "source": [ - "The *recursive* implementation of the [Fibonacci numbers](https://en.wikipedia.org/wiki/Fibonacci_number) in [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration.ipynb#\"Easy-at-first-Glance\"-Example:-Fibonacci-Numbers) takes long to compute for large Fibonacci numbers as the number of function calls grows exponentially.\n", + "The *recursive* implementation of the [Fibonacci numbers](https://en.wikipedia.org/wiki/Fibonacci_number) in [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_00_content.ipynb#\"Easy-at-first-Glance\"-Example:-Fibonacci-Numbers) takes long to compute for large Fibonacci numbers as the number of function calls grows exponentially.\n", "\n", "The graph below visualizes what the problem is and also suggests a solution: Instead of calculating the return value of the `fibonacci()` function for the *same* argument over and over again, it makes sense to **cache** the result and reuse it. This concept is called **[memoization](https://en.wikipedia.org/wiki/Memoization)** in the computer science literature." ] @@ -4563,7 +4564,7 @@ } }, "source": [ - "Now, calling `fibonacci()` has the *side effect* of growing the `memo` in the *global scope*. So, subsequent calls to `fibonacci()` need not calculate any Fibonacci number with an index `i` smaller than the maximum `i` used so far." + "Now, calling `fibonacci()` has the *side effect* of growing the `memo` in the *global scope*. So, subsequent calls to `fibonacci()` need not calculate any Fibonacci number with an index `i` smaller than the maximum `i` used so far. Because of that, this `fibonacci()` is *not* a *pure* function." ] }, { @@ -4663,8 +4664,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "The slowest run took 195.30 times longer than the fastest. This could mean that an intermediate result is being cached.\n", - "18.9 µs ± 44.4 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + "The slowest run took 183.70 times longer than the fastest. This could mean that an intermediate result is being cached.\n", + "21.4 µs ± 50.4 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], @@ -4686,8 +4687,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "The slowest run took 1919.60 times longer than the fastest. This could mean that an intermediate result is being cached.\n", - "346 µs ± 844 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + "The slowest run took 1974.48 times longer than the fastest. This could mean that an intermediate result is being cached.\n", + "580 µs ± 1.41 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], @@ -4727,12 +4728,12 @@ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mRecursionError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mget_ipython\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun_cell_magic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'timeit'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'-n 1'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'fibonacci(9999) # = 10,000th number\\n'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/.pyenv/versions/anaconda3-2019.07/lib/python3.7/site-packages/IPython/core/interactiveshell.py\u001b[0m in \u001b[0;36mrun_cell_magic\u001b[0;34m(self, magic_name, line, cell)\u001b[0m\n\u001b[1;32m 2356\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuiltin_trap\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2357\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mmagic_arg_s\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcell\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2358\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2359\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2360\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, line, cell, local_ns)\u001b[0m\n", - "\u001b[0;32m~/.pyenv/versions/anaconda3-2019.07/lib/python3.7/site-packages/IPython/core/magic.py\u001b[0m in \u001b[0;36m\u001b[0;34m(f, *a, **k)\u001b[0m\n\u001b[1;32m 185\u001b[0m \u001b[0;31m# but it's overkill for just that one bit of state.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 186\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmagic_deco\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 187\u001b[0;31m \u001b[0mcall\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 188\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 189\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcallable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.pyenv/versions/anaconda3-2019.07/lib/python3.7/site-packages/IPython/core/magics/execution.py\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, line, cell, local_ns)\u001b[0m\n\u001b[1;32m 1160\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1161\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1162\u001b[0;31m \u001b[0mall_runs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtimer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrepeat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrepeat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1163\u001b[0m \u001b[0mbest\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mall_runs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mnumber\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1164\u001b[0m \u001b[0mworst\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mall_runs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mnumber\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.pyenv/versions/anaconda3-2019.07/lib/python3.7/timeit.py\u001b[0m in \u001b[0;36mrepeat\u001b[0;34m(self, repeat, number)\u001b[0m\n\u001b[1;32m 202\u001b[0m \u001b[0mr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 203\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrepeat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 204\u001b[0;31m \u001b[0mt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 205\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 206\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.pyenv/versions/anaconda3-2019.07/lib/python3.7/site-packages/IPython/core/magics/execution.py\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, number)\u001b[0m\n\u001b[1;32m 167\u001b[0m \u001b[0mgc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdisable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 168\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 169\u001b[0;31m \u001b[0mtiming\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minner\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mit\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 170\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 171\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mgcold\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.pyenv/versions/anaconda3-2019.10/lib/python3.7/site-packages/IPython/core/interactiveshell.py\u001b[0m in \u001b[0;36mrun_cell_magic\u001b[0;34m(self, magic_name, line, cell)\u001b[0m\n\u001b[1;32m 2357\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuiltin_trap\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2358\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mmagic_arg_s\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcell\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2359\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2360\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2361\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, line, cell, local_ns)\u001b[0m\n", + "\u001b[0;32m~/.pyenv/versions/anaconda3-2019.10/lib/python3.7/site-packages/IPython/core/magic.py\u001b[0m in \u001b[0;36m\u001b[0;34m(f, *a, **k)\u001b[0m\n\u001b[1;32m 185\u001b[0m \u001b[0;31m# but it's overkill for just that one bit of state.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 186\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmagic_deco\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 187\u001b[0;31m \u001b[0mcall\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 188\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 189\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcallable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.pyenv/versions/anaconda3-2019.10/lib/python3.7/site-packages/IPython/core/magics/execution.py\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, line, cell, local_ns)\u001b[0m\n\u001b[1;32m 1160\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1161\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1162\u001b[0;31m \u001b[0mall_runs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtimer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrepeat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrepeat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1163\u001b[0m \u001b[0mbest\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mall_runs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mnumber\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1164\u001b[0m \u001b[0mworst\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mall_runs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mnumber\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.pyenv/versions/anaconda3-2019.10/lib/python3.7/timeit.py\u001b[0m in \u001b[0;36mrepeat\u001b[0;34m(self, repeat, number)\u001b[0m\n\u001b[1;32m 202\u001b[0m \u001b[0mr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 203\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrepeat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 204\u001b[0;31m \u001b[0mt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 205\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 206\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.pyenv/versions/anaconda3-2019.10/lib/python3.7/site-packages/IPython/core/magics/execution.py\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, number)\u001b[0m\n\u001b[1;32m 167\u001b[0m \u001b[0mgc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdisable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 168\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 169\u001b[0;31m \u001b[0mtiming\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minner\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mit\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 170\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 171\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mgcold\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m\u001b[0m in \u001b[0;36minner\u001b[0;34m(_it, _timer)\u001b[0m\n", "\u001b[0;32m\u001b[0m in \u001b[0;36mfibonacci\u001b[0;34m(i, debug)\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"fibonacci({i}) is calculated\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 26\u001b[0;31m \u001b[0mrecurse\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfibonacci\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdebug\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdebug\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mfibonacci\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdebug\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdebug\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 27\u001b[0m \u001b[0mmemo\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrecurse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 28\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mrecurse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "... last 1 frames repeated, from the frame below ...\n", @@ -4844,8 +4845,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "The slowest run took 25077.61 times longer than the fastest. This could mean that an intermediate result is being cached.\n", - "2.36 ms ± 5.77 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + "The slowest run took 27724.52 times longer than the fastest. This could mean that an intermediate result is being cached.\n", + "3.11 ms ± 7.61 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], @@ -4994,7 +4995,7 @@ } }, "source": [ - "Because `fibonacci()` is now independent from *global state*, the same eleven recursive function calls are made each time." + "Because `fibonacci()` is now independent from *global state*, the same eleven recursive function calls are made each time. So, this `fibonacci()` is a *pure* function." ] }, { @@ -5073,7 +5074,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "330 µs ± 18.7 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + "138 µs ± 5.01 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], @@ -5095,7 +5096,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "3.53 ms ± 75.2 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + "1.55 ms ± 56.7 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], @@ -5130,7 +5131,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "15.5 ms ± 572 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + "20.8 ms ± 8.09 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], @@ -5193,7 +5194,7 @@ } }, "source": [ - "The [OrderedDict](https://docs.python.org/3/library/collections.html#collections.OrderedDict) type may be used to create a `dict`-like object with the added feature that *explicitly* remembers the *insertion* order of its items.\n", + "The [OrderedDict](https://docs.python.org/3/library/collections.html#collections.OrderedDict) type may be used to create a `dict`-like object with the added feature of *explicitly* remembering the *insertion* order of its items.\n", "\n", "Let's look at a quick example: We create an `OrderedDict` object by passing an iterable of $2$-element iterables, one of the three ways to use [dict()](https://docs.python.org/3/library/functions.html#func-dict)." ] @@ -6360,8 +6361,8 @@ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mchain\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/.pyenv/versions/anaconda3-2019.07/lib/python3.7/collections/__init__.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 912\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 913\u001b[0m \u001b[0;32mpass\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 914\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__missing__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# support subclasses that define __missing__\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 915\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 916\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/.pyenv/versions/anaconda3-2019.07/lib/python3.7/collections/__init__.py\u001b[0m in \u001b[0;36m__missing__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 904\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 905\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__missing__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 906\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 907\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 908\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.pyenv/versions/anaconda3-2019.10/lib/python3.7/collections/__init__.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 914\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 915\u001b[0m \u001b[0;32mpass\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 916\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__missing__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# support subclasses that define __missing__\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 917\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 918\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.pyenv/versions/anaconda3-2019.10/lib/python3.7/collections/__init__.py\u001b[0m in \u001b[0;36m__missing__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 906\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 907\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__missing__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 908\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 909\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 910\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mKeyError\u001b[0m: 10" ] } @@ -6430,7 +6431,7 @@ { "data": { "text/plain": [ - "139751998783784" + "139953088728672" ] }, "execution_count": 207, @@ -6929,7 +6930,7 @@ } ], "source": [ - "1.0 in numbers" + "2.0 in numbers" ] }, { @@ -7421,7 +7422,7 @@ { "data": { "text/plain": [ - "139751998783784" + "139953088728672" ] }, "execution_count": 243, @@ -8041,7 +8042,7 @@ } }, "source": [ - "This section provides some conference talks that go into great detail regarding the workings of the `dict` type." + "Next, we list some conference talks that go into great detail regarding the workings of the `dict` type." ] }, { @@ -8068,7 +8069,7 @@ " " ], "text/plain": [ - "" + "" ] }, "execution_count": 261, @@ -8105,7 +8106,7 @@ " " ], "text/plain": [ - "" + "" ] }, "execution_count": 262, @@ -8141,7 +8142,7 @@ " " ], "text/plain": [ - "" + "" ] }, "execution_count": 263, @@ -8152,6 +8153,20 @@ "source": [ "YouTubeVideo(\"npw4s1QTmPg\", width=\"60%\")" ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "source": [ + "The `dict` type's order has been worked on in many PEPs in recent years:\n", + "- [PEP 412](https://www.python.org/dev/peps/pep-0412/): Key-Sharing Dictionary\n", + "- [PEP 468](https://www.python.org/dev/peps/pep-0468/): Preserving the order of \\*\\*kwargs in a function\n", + "- [PEP 520](https://www.python.org/dev/peps/pep-0520/): Preserving Class Attribute Definition Order" + ] } ], "metadata": { @@ -8170,7 +8185,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.4" }, "livereveal": { "auto_select": "code", @@ -8198,5 +8213,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/08_mappings_10_review.ipynb b/08_mappings_10_review.ipynb new file mode 100644 index 0000000..471bd41 --- /dev/null +++ b/08_mappings_10_review.ipynb @@ -0,0 +1,261 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# Chapter 8: Mappings & Sets" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Content Review" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Read [Chapter 8](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings_00_content.ipynb) of the book. Then, work through the questions below." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Essay Questions " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Answer the following questions *briefly*!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q1**: `dict` objects are well-suited **to model** discrete mathematical **functions** and to approximate continuous ones. What property of dictionaries is the basis for that claim, and how does it relate to functions in the mathematical sense?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q2**: Explain why **hash tables** are a **trade-off** between **computational speed** and **memory** usage!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q3:** The `dict` type is an **iterable** that **contains** a **finite** number of key-value pairs. Despite that, why is it *not* considered a **sequence**?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q4**: Whereas *key* **look-ups** in a `dict` object run in so-called **[constant time](https://en.wikipedia.org/wiki/Time_complexity#Constant_time)** (i.e., *extremely* fast), that does not hold for *reverse* look-ups. Why is that?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q5**: Why is it conceptually correct that the Python core developers do not implement **slicing** with the `[]` operator for `dict` objects?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q6**: **Memoization** is an essential concept to know to solve problems in the real world. Together with the idea of **recursion**, it enables us to solve problems in a \"backwards\" fashion *effectively*.\n", + "\n", + "\n", + "Compare the **recursive** formulation of `fibonacci()` in [Chapter 8](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings_00_content.ipynb#\"Easy-at-third-Glance\"-Example:-Fibonacci-Numbers-%28revisited%29), the \"*Easy at third Glance*\" example, with the **iterative** version in [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_00_content.ipynb#\"Hard-at-first-Glance\"-Example:-Fibonacci-Numbers-%28revisited%29), the \"*Hard at first Glance*\" example!\n", + "\n", + "How are they similar and how do they differ?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q7**: How are the `set` and the `dict` type related? How could we use the latter to mimic the former?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### True / False Questions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Motivate your answer with *one short* sentence!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q8**: We may *not* put `dict` objects inside other `dict` objects because they are **mutable**." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q9**: **Mutable** objects (e.g., `list`) may generally *not* be used as keys in a `dict` object. However, if we collect, for example, `list` objects in a `tuple` object, the composite object becomes **hashable**." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q10**: **Mutability** of a `dict` object works until the underlying hash table becomes too crowded. Then, we cannot insert any items any more making the `dict` object effectively **immutable**. Luckily, that almost never happens in practice." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q11**: A `dict` object's [update()](https://docs.python.org/3/library/stdtypes.html#dict.update) method only inserts key-value pairs whose key is *not* yet in the `dict` object. So, it does *not* overwrite anything." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Q12**: The `set` type is both a mapping and a sequence." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + } + ], + "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.4" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": true, + "skip_h1_title": true, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": false, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/08_mappings_review_and_exercises.ipynb b/08_mappings_20_exercises.ipynb similarity index 56% rename from 08_mappings_review_and_exercises.ipynb rename to 08_mappings_20_exercises.ipynb index c05004e..0f3f1a5 100644 --- a/08_mappings_review_and_exercises.ipynb +++ b/08_mappings_20_exercises.ipynb @@ -8,221 +8,6 @@ "# Chapter 8: Mappings & Sets" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Content Review" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Read [Chapter 8](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings.ipynb) of the book. Then work through the twelve review questions." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Essay Questions " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Answer the following questions briefly with *at most* 300 characters per question!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q1**: `dict` objects are well-suited **to model** discrete mathematical **functions** and to approximate continuous ones. What property of dictionaries is the basis for that claim, and how does it relate to functions in the mathematical sense?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q2**: Explain why **hash tables** are a **trade-off** between **computational speed** and **memory** usage!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q3:** The `dict` type is an **iterable** that **contains** a **finite** number of key-value pairs. Despite that, why is it *not* considered a **sequence**?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q4**: Whereas *key* **look-ups** in a `dict` object run in so-called **[constant time](https://en.wikipedia.org/wiki/Time_complexity#Constant_time)** (i.e., *extremely* fast), that does not hold for *reverse* look-ups. Why is that?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q5**: Why is it conceptually correct that the Python core developers do not implement **slicing** with the `[]` operator for `dict` objects?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q6**: **Memoization** is an essential concept to know to solve problems in the real world. Together with the idea of **recursion**, it enables us to solve problems in a \"backwards\" fashion *effectively*.\n", - "\n", - "\n", - "Compare the **recursive** formulation of `fibonacci()` in [Chapter 8](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings.ipynb#\"Easy-at-third-Glance\"-Example:-Fibonacci-Numbers-%28revisited%29), the \"*Easy at third Glance*\" example, with the **iterative** version in [Chapter 4](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration.ipynb#\"Hard-at-first-Glance\"-Example:-Fibonacci-Numbers-%28revisited%29), the \"*Hard at first Glance*\" example!\n", - "\n", - "How are they similar and how do they differ?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q7**: How are the `set` and the `dict` type related? How could we use the latter to mimic the former?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### True / False Questions" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Motivate your answer with *one short* sentence!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q8**: We may *not* put `dict` objects inside other `dict` objects because they are **mutable**." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q9**: **Mutable** objects (e.g., `list`) may generally *not* be used as keys in a `dict` object. However, if we collect, for example, `list` objects in a `tuple` object, the composite object becomes **hashable**." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q10**: **Mutability** of a `dict` object works until the underlying hash table becomes too crowded. Then, we cannot insert any items any more making the `dict` object effectively **immutable**. Luckily, that almost never happens in practice." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q11**: A `dict` object's [update()](https://docs.python.org/3/library/stdtypes.html#dict.update) method only inserts key-value pairs whose key is *not* yet in the `dict` object. So, it does *not* overwrite anything." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Q12**: The `set` type is both a mapping and a sequence." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " " - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -230,6 +15,13 @@ "## Coding Exercises" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Read [Chapter 8](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings_00_content.ipynb) of the book. Then, work through the exercises below." + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -291,7 +83,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q13.1**: Write a dictionary comprehension to derive a new `dict` object, called `brazilian_players`, that maps a Brazilian player's name to his position!" + "**Q1.1**: Write a dictionary comprehension to derive a new `dict` object, called `brazilian_players`, that maps a Brazilian player's name to his position!" ] }, { @@ -316,7 +108,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q13.2**: Generalize the code fragment into a `get_players()` function: Passed a `team` name, it returns a `dict` object like `brazilian_players`. Verify that the function works for the German team!" + "**Q1.2**: Generalize the code fragment into a `get_players()` function: Passed a `team` name, it returns a `dict` object like `brazilian_players`. Verify that the function works for the German team!" ] }, { @@ -344,7 +136,7 @@ "source": [ "Often, we are given a `dict` object like the one returned from `get_players()`: It is characterized by the observation that a large set of unique keys (i.e., the players' names) is mapped onto a smaller set of non-unique values (i.e., the positions).\n", "\n", - "**Q13.3**: Create a generic `invert()` function that swaps the keys and values of a `mapping` argument passed to it and returns them in a *new* `dict` object! Ensure that *no* key gets lost. Verify your implementation with the `brazilian_players` dictionary!\n", + "**Q1.3**: Create a generic `invert()` function that swaps the keys and values of a `mapping` argument passed to it and returns them in a *new* `dict` object! Ensure that *no* key gets lost. Verify your implementation with the `brazilian_players` dictionary!\n", "\n", "Hints: Think of this as a grouping operation. The *new* values are `list` or `tuple` objects that hold the original keys. You may want to use either the the [defaultdict](https://docs.python.org/3/library/collections.html#collections.defaultdict) type from the [collections](https://docs.python.org/3/library/collections.html) module in the [standard library](https://docs.python.org/3/library/index.html) or the [setdefault()](https://docs.python.org/3/library/stdtypes.html#dict.setdefault) method of the ordinary `dict` type." ] @@ -372,7 +164,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q13.4**: Write a `score_at_minute()` function: It takes two arguments, `team` and `minute`, and returns the number of goals the `team` has scored up until this time in the game.\n", + "**Q1.4**: Write a `score_at_minute()` function: It takes two arguments, `team` and `minute`, and returns the number of goals the `team` has scored up until this time in the game.\n", "\n", "Hints: The function may reference the global `players` for simplicity. Earn bonus points if you can write this in a one-line expression using some *reduction* function and a *generator expression*." ] @@ -441,7 +233,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q13.5**: Write a `goals_by_player()` function: It takes an argument like the global `players`, and returns a `dict` object mapping the players to the number of goals they scored.\n", + "**Q1.5**: Write a `goals_by_player()` function: It takes an argument like the global `players`, and returns a `dict` object mapping the players to the number of goals they scored.\n", "\n", "Hints: Do *not* \"hard code\" the names of the teams! Earn bonus points if you can solve it in a single dictionary comprehension." ] @@ -469,7 +261,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q13.6**: Write a *dictionary comprehension* to filter out the players who did *not* score from the preceding result. Then, write a *set comprehension* that does the same but discards the number of goals scored.\n", + "**Q1.6**: Write a *dictionary comprehension* to filter out the players who did *not* score from the preceding result. Then, write a *set comprehension* that does the same but discards the number of goals scored.\n", "\n", "Hints: Reference the `goals_by_player()` function from before." ] @@ -496,7 +288,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q13.7**: Write a `all_goals()` function: It takes one argument like the global `players` and returns a `list` object containing $2$-element `tuple` objects, where the first element is the minute a player scored and the second his name. The list should be sorted by the time.\n", + "**Q1.7**: Write a `all_goals()` function: It takes one argument like the global `players` and returns a `list` object containing $2$-element `tuple` objects, where the first element is the minute a player scored and the second his name. The list should be sorted by the time.\n", "\n", "Hints: You may want to use either the built-in [sorted()](https://docs.python.org/3/library/functions.html#sorted) function or the `list` type's [sort()](https://docs.python.org/3/library/stdtypes.html#list.sort) method. Earn bonus points if you can write a one-line expression with a *generator expression*." ] @@ -524,7 +316,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Q13.8**: Lastly, write a `summary()` function: It takes one argument like the global `players` and prints out a concise report of the goals, the score at the half, and the final result.\n", + "**Q1.8**: Lastly, write a `summary()` function: It takes one argument like the global `players` and prints out a concise report of the goals, the score at the half, and the final result.\n", "\n", "Hints: Use the `all_goals()` and `score_at_minute()` functions from before.\n", "\n", @@ -575,7 +367,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.4" }, "toc": { "base_numbering": 1, @@ -592,5 +384,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/README.md b/README.md index a227cb2..0da3f5e 100644 --- a/README.md +++ b/README.md @@ -13,23 +13,52 @@ studies** in the "field" of **data science**. The "chapters" are written in [Jupyter notebooks](https://jupyter-notebook.readthedocs.io/en/stable/) which are a de-facto standard for exchanging code and results among data science professionals and researchers. -As such they can be viewed in a plain web browser: +They can be viewed in a plain web browser with the help of +[nbviewer](https://nbviewer.jupyter.org/): -- [00 - Start up](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/00_start_up.ipynb) -- [01 - Elements of a Program](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements.ipynb) -- [02 - Functions & Modularization](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions.ipynb) -- [03 - Conditionals & Exceptions](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals.ipynb) -- [04 - Recursion & Looping](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration.ipynb) -- [05 - Bits & Numbers](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers.ipynb) -- [06 - Bytes & Text](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text.ipynb) -- [07 - Sequential Data](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences.ipynb) -- [08 - Mappings & Sets](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings.ipynb) +- *Introduction*: Start up + ([content](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/00_start_up_00_content.ipynb) + | [review](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/00_start_up_10_review.ipynb) + | [exercises](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/00_start_up_20_exercises.ipynb)) +- **Part A: Expressing Logic** + - *Chapter 1*: Elements of a Program + ([content](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_00_content.ipynb) + | [review](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_10_review.ipynb) + | [exercises](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/01_elements_20_exercises.ipynb)) + - *Chapter 2*: Functions & Modularization + ([content](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions_00_content.ipynb) + | [review](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions_10_review.ipynb) + | [exercises](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/02_functions_20_exercises.ipynb)) + - *Chapter 3*: Conditionals & Exceptions + ([content](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals_00_content.ipynb) + | [review](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals_10_review.ipynb) + | [exercises](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/03_conditionals_20_exercises.ipynb)) + - *Chapter 4*: Recursion & Looping + ([content](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_00_content.ipynb) + | [review](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_10_review.ipynb) + | [exercises](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/04_iteration_20_exercises.ipynb)) +- **Part B: Managing Data and Memory** + - *Chapter 5*: Bits & Numbers + ([content](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers_00_content.ipynb) + | [review](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers_10_review.ipynb) + | [exercises](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/05_numbers_20_exercises.ipynb)) + - *Chapter 6*: Bytes & Text + ([content](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text_00_content.ipynb) + | [review](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/06_text_10_review.ipynb)) + - *Chapter 7*: Sequential Data + ([content](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_00_content.ipynb) + | [review](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_10_review.ipynb) + | [exercises](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/07_sequences_20_exercises.ipynb)) + - *Chapter 8*: Mappings & Sets + ([content](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings_00_content.ipynb) + | [review](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings_10_review.ipynb) + | [exercises](https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/08_mappings_20_exercises.ipynb)) However, it is recommended that students **install Python and Jupyter locally** and run the code in the notebooks on their own. This way, the student can play with the code and learn more efficiently. Precise **installation instructions** are either in the [00th notebook]( -https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/00_start_up.ipynb) +https://nbviewer.jupyter.org/github/webartifex/intro-to-python/blob/master/00_start_up_00_content.ipynb) or further below. Feedback is encouraged and will be incorporated. From 759271b6a144d4823c37b1060f6772020d60f39c Mon Sep 17 00:00:00 2001 From: Alexander Hess Date: Tue, 28 Jan 2020 13:07:53 +0100 Subject: [PATCH 3/4] Update pyproject.toml, poetry.lock, requirements.txt - use JupyterLab instead of just Jupyter - update dependencies --- poetry.lock | 814 ++++++++++++++++++++++++++++++++--------------- pyproject.toml | 13 +- requirements.txt | 74 ++--- 3 files changed, 595 insertions(+), 306 deletions(-) diff --git a/poetry.lock b/poetry.lock index ad1610a..07e1126 100644 --- a/poetry.lock +++ b/poetry.lock @@ -9,7 +9,7 @@ version = "1.4.3" [[package]] category = "main" description = "Disable App Nap on OS X 10.9" -marker = "python_version >= \"3.3\" and sys_platform == \"darwin\" or sys_platform == \"darwin\"" +marker = "sys_platform == \"darwin\" or platform_system == \"Darwin\"" name = "appnope" optional = false python-versions = "*" @@ -21,7 +21,13 @@ description = "Classes Without Boilerplate" name = "attrs" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "19.1.0" +version = "19.3.0" + +[package.extras] +azure-pipelines = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "pytest-azurepipelines"] +dev = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "pre-commit"] +docs = ["sphinx", "zope.interface"] +tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] [[package]] category = "main" @@ -37,13 +43,19 @@ description = "The uncompromising code formatter." name = "black" optional = false python-versions = ">=3.6" -version = "18.9b0" +version = "19.10b0" [package.dependencies] appdirs = "*" -attrs = ">=17.4.0" +attrs = ">=18.1.0" click = ">=6.5" +pathspec = ">=0.6,<1" +regex = "*" toml = ">=0.9.4" +typed-ast = ">=1.4.0" + +[package.extras] +d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] [[package]] category = "dev" @@ -80,19 +92,19 @@ version = "7.0" [[package]] category = "main" description = "Cross-platform colored terminal text." -marker = "python_version >= \"3.3\" and sys_platform == \"win32\" or sys_platform == \"win32\"" +marker = "sys_platform == \"win32\"" name = "colorama" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.4.1" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.4.3" [[package]] category = "main" -description = "Better living through Python with decorators" +description = "Decorators for Humans" name = "decorator" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*" -version = "4.4.0" +version = "4.4.1" [[package]] category = "main" @@ -110,27 +122,47 @@ optional = false python-versions = ">=2.7" version = "0.3" +[[package]] +category = "main" +description = "Read metadata from Python packages" +marker = "python_version < \"3.8\"" +name = "importlib-metadata" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +version = "1.4.0" + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx", "rst.linker"] +testing = ["packaging", "importlib-resources"] + [[package]] category = "main" description = "IPython Kernel for Jupyter" name = "ipykernel" optional = false python-versions = ">=3.4" -version = "5.1.2" +version = "5.1.4" [package.dependencies] +appnope = "*" ipython = ">=5.0.0" jupyter-client = "*" tornado = ">=4.2" traitlets = ">=4.1.0" +[package.extras] +test = ["pytest", "pytest-cov", "flaky", "nose"] + [[package]] category = "main" description = "IPython: Productive Interactive Computing" name = "ipython" optional = false -python-versions = ">=3.5" -version = "7.8.0" +python-versions = ">=3.6" +version = "7.11.1" [package.dependencies] appnope = "*" @@ -140,11 +172,22 @@ decorator = "*" jedi = ">=0.10" pexpect = "*" pickleshare = "*" -prompt-toolkit = ">=2.0.0,<2.1.0" +prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" pygments = "*" setuptools = ">=18.5" traitlets = ">=4.2" +[package.extras] +all = ["ipywidgets", "ipyparallel", "qtconsole", "ipykernel", "nbconvert", "notebook", "nbformat", "testpath", "pygments", "requests", "numpy (>=1.14)", "nose (>=0.10.1)", "Sphinx (>=1.3)"] +doc = ["Sphinx (>=1.3)"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["notebook", "ipywidgets"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.14)"] + [[package]] category = "main" description = "Vestigial utilities from IPython" @@ -153,53 +196,50 @@ optional = false python-versions = "*" version = "0.2.0" -[[package]] -category = "main" -description = "IPython HTML widgets for Jupyter" -name = "ipywidgets" -optional = false -python-versions = "*" -version = "7.5.1" - -[package.dependencies] -ipykernel = ">=4.5.1" -nbformat = ">=4.2.0" -traitlets = ">=4.3.1" -widgetsnbextension = ">=3.5.0,<3.6.0" - -[package.dependencies.ipython] -python = ">=3.3" -version = ">=4.0.0" - [[package]] category = "main" description = "An autocompletion tool for Python that can be used for text editors." name = "jedi" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.15.1" +version = "0.16.0" [package.dependencies] -parso = ">=0.5.0" +parso = ">=0.5.2" + +[package.extras] +qa = ["flake8 (3.7.9)"] +testing = ["colorama (0.4.1)", "docopt", "pytest (>=3.9.0,<5.0.0)"] [[package]] category = "main" -description = "A small but fast and easy to use stand-alone template engine written in pure python." +description = "A very fast and expressive template engine." name = "jinja2" optional = false -python-versions = "*" -version = "2.10.1" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "2.11.0" [package.dependencies] MarkupSafe = ">=0.23" +[package.extras] +i18n = ["Babel (>=0.8)"] + +[[package]] +category = "main" +description = "A Python implementation of the JSON5 data format." +name = "json5" +optional = false +python-versions = "*" +version = "0.8.5" + [[package]] category = "main" description = "An implementation of JSON Schema validation for Python" name = "jsonschema" optional = false python-versions = "*" -version = "3.0.2" +version = "3.2.0" [package.dependencies] attrs = ">=17.4.0" @@ -207,21 +247,13 @@ pyrsistent = ">=0.14.0" setuptools = "*" six = ">=1.11.0" -[[package]] -category = "main" -description = "Jupyter metapackage. Install all the Jupyter components in one go." -name = "jupyter" -optional = false -python-versions = "*" -version = "1.0.0" +[package.dependencies.importlib-metadata] +python = "<3.8" +version = "*" -[package.dependencies] -ipykernel = "*" -ipywidgets = "*" -jupyter-console = "*" -nbconvert = "*" -notebook = "*" -qtconsole = "*" +[package.extras] +format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] +format_nongpl = ["idna", "jsonpointer (>1.13)", "webcolors", "rfc3986-validator (>0.1.0)", "rfc3339-validator"] [[package]] category = "main" @@ -229,67 +261,18 @@ description = "Jupyter protocol implementation and client libraries" name = "jupyter-client" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "5.3.2" +version = "5.3.4" [package.dependencies] -jupyter-core = "*" +jupyter-core = ">=4.6.0" python-dateutil = ">=2.1" pywin32 = ">=1.0" pyzmq = ">=13" tornado = ">=4.1" traitlets = "*" -[[package]] -category = "main" -description = "Jupyter terminal console" -name = "jupyter-console" -optional = false -python-versions = ">=3.5" -version = "6.0.0" - -[package.dependencies] -ipykernel = "*" -ipython = "*" -jupyter-client = "*" -prompt-toolkit = ">=2.0.0,<2.1.0" -pygments = "*" - -[[package]] -category = "dev" -description = "Common utilities for jupyter-contrib projects." -name = "jupyter-contrib-core" -optional = false -python-versions = "*" -version = "0.3.3" - -[package.dependencies] -jupyter-core = "*" -notebook = ">=4.0" -setuptools = "*" -tornado = "*" -traitlets = "*" - -[[package]] -category = "dev" -description = "A collection of Jupyter nbextensions." -name = "jupyter-contrib-nbextensions" -optional = false -python-versions = "*" -version = "0.5.1" - -[package.dependencies] -ipython-genutils = "*" -jupyter-contrib-core = ">=0.3.3" -jupyter-core = "*" -jupyter-highlight-selected-word = ">=0.1.1" -jupyter-latex-envs = ">=1.3.8" -jupyter-nbextensions-configurator = ">=0.4.0" -lxml = "*" -nbconvert = ">=4.2" -notebook = ">=4.0" -pyyaml = "*" -tornado = "*" -traitlets = ">=4.1" +[package.extras] +test = ["ipykernel", "ipython", "mock", "pytest"] [[package]] category = "main" @@ -297,57 +280,46 @@ description = "Jupyter core package. A base package on which Jupyter projects re name = "jupyter-core" optional = false python-versions = ">=2.7, !=3.0, !=3.1, !=3.2" -version = "4.5.0" +version = "4.6.1" [package.dependencies] +pywin32 = ">=1.0" traitlets = "*" [[package]] -category = "dev" -description = "Jupyter notebook extension that enables highlighting every instance of the current word in the notebook." -name = "jupyter-highlight-selected-word" +category = "main" +description = "The JupyterLab notebook server extension." +name = "jupyterlab" optional = false -python-versions = "*" -version = "0.2.0" - -[[package]] -category = "dev" -description = "Jupyter notebook extension which supports (some) LaTeX environments within markdown cells. Also provides support for labels and crossreferences, document wide numbering, bibliography, and more..." -name = "jupyter-latex-envs" -optional = false -python-versions = "*" -version = "1.4.6" +python-versions = ">=3.5" +version = "1.2.6" [package.dependencies] -ipython = "*" -jupyter_core = "*" -nbconvert = "*" -notebook = ">=4.0" -traitlets = ">=4.1" +jinja2 = ">=2.10" +jupyterlab-server = ">=1.0.0,<1.1.0" +notebook = ">=4.3.1" +tornado = "<6.0.0 || >6.0.0,<6.0.1 || >6.0.1,<6.0.2 || >6.0.2" + +[package.extras] +docs = ["sphinx", "recommonmark", "sphinx-rtd-theme", "sphinx-copybutton"] +test = ["pytest", "pytest-check-links", "requests"] [[package]] -category = "dev" -description = "jupyter serverextension providing configuration interfaces for nbextensions." -name = "jupyter-nbextensions-configurator" +category = "main" +description = "JupyterLab Server" +name = "jupyterlab-server" optional = false -python-versions = "*" -version = "0.4.1" +python-versions = ">=3.5" +version = "1.0.6" [package.dependencies] -jupyter_contrib_core = ">=0.3.3" -jupyter_core = "*" -notebook = ">=4.0" -pyyaml = "*" -tornado = "*" -traitlets = "*" +jinja2 = ">=2.10" +json5 = "*" +jsonschema = ">=3.0.1" +notebook = ">=4.2.0" -[[package]] -category = "dev" -description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -name = "lxml" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" -version = "4.4.1" +[package.extras] +test = ["pytest", "requests"] [[package]] category = "main" @@ -371,7 +343,7 @@ description = "Converting Jupyter Notebooks" name = "nbconvert" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "5.6.0" +version = "5.6.1" [package.dependencies] bleach = "*" @@ -386,13 +358,20 @@ pygments = "*" testpath = "*" traitlets = ">=4.2" +[package.extras] +all = ["pytest", "pytest-cov", "ipykernel", "jupyter-client (>=5.3.1)", "ipywidgets (>=7)", "pebble", "tornado (>=4.0)", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "sphinxcontrib-github-alt", "ipython", "mock"] +docs = ["sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "sphinxcontrib-github-alt", "ipython", "jupyter-client (>=5.3.1)"] +execute = ["jupyter-client (>=5.3.1)"] +serve = ["tornado (>=4.0)"] +test = ["pytest", "pytest-cov", "ipykernel", "jupyter-client (>=5.3.1)", "ipywidgets (>=7)", "pebble", "mock"] + [[package]] category = "main" description = "The Jupyter Notebook format" name = "nbformat" optional = false -python-versions = "*" -version = "4.4.0" +python-versions = ">=3.5" +version = "5.0.4" [package.dependencies] ipython-genutils = "*" @@ -400,21 +379,24 @@ jsonschema = ">=2.4,<2.5.0 || >2.5.0" jupyter-core = "*" traitlets = ">=4.1" +[package.extras] +test = ["testpath", "pytest", "pytest-cov"] + [[package]] category = "main" description = "A web-based notebook environment for interactive computing" name = "notebook" optional = false python-versions = ">=3.5" -version = "6.0.1" +version = "6.0.3" [package.dependencies] Send2Trash = "*" ipykernel = "*" ipython-genutils = "*" jinja2 = "*" -jupyter-client = ">=5.3.1" -jupyter-core = ">=4.4.0" +jupyter-client = ">=5.3.4" +jupyter-core = ">=4.6.1" nbconvert = "*" nbformat = "*" prometheus-client = "*" @@ -423,13 +405,16 @@ terminado = ">=0.8.1" tornado = ">=5.0" traitlets = ">=4.2.1" +[package.extras] +test = ["nose", "coverage", "requests", "nose-warnings-filters", "nbval", "nose-exclude", "selenium", "pytest", "pytest-cov", "nose-exclude"] + [[package]] category = "main" description = "NumPy is the fundamental package for array computing with Python." name = "numpy" optional = false python-versions = ">=3.5" -version = "1.17.2" +version = "1.18.1" [[package]] category = "main" @@ -444,17 +429,28 @@ category = "main" description = "A Python Parser" name = "parso" optional = false -python-versions = "*" -version = "0.5.1" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "0.6.0" + +[package.extras] +testing = ["docopt", "pytest (>=3.0.7)"] + +[[package]] +category = "dev" +description = "Utility library for gitignore style pattern matching of file paths." +name = "pathspec" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.7.0" [[package]] category = "main" description = "Pexpect allows easy control of interactive console applications." -marker = "python_version >= \"3.3\" and sys_platform != \"win32\" or sys_platform != \"win32\"" +marker = "sys_platform != \"win32\"" name = "pexpect" optional = false python-versions = "*" -version = "4.7.0" +version = "4.8.0" [package.dependencies] ptyprocess = ">=0.5" @@ -475,22 +471,24 @@ optional = false python-versions = "*" version = "0.7.1" +[package.extras] +twisted = ["twisted"] + [[package]] category = "main" description = "Library for building powerful interactive command lines in Python" name = "prompt-toolkit" optional = false -python-versions = "*" -version = "2.0.9" +python-versions = ">=3.6" +version = "3.0.3" [package.dependencies] -six = ">=1.9.0" wcwidth = "*" [[package]] category = "main" description = "Run a subprocess in a pseudo terminal" -marker = "sys_platform != \"win32\" or os_name != \"nt\" or python_version >= \"3.3\" and sys_platform != \"win32\"" +marker = "sys_platform != \"win32\" or os_name != \"nt\"" name = "ptyprocess" optional = false python-versions = "*" @@ -502,7 +500,7 @@ description = "Pygments is a syntax highlighting package written in Python." name = "pygments" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.4.2" +version = "2.5.2" [[package]] category = "main" @@ -510,7 +508,7 @@ description = "Persistent/Functional/Immutable data structures" name = "pyrsistent" optional = false python-versions = "*" -version = "0.15.4" +version = "0.15.7" [package.dependencies] six = "*" @@ -520,8 +518,8 @@ category = "main" description = "Extensions to the standard Python datetime module" name = "python-dateutil" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -version = "2.8.0" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +version = "2.8.1" [package.dependencies] six = ">=1.5" @@ -533,7 +531,7 @@ marker = "sys_platform == \"win32\"" name = "pywin32" optional = false python-versions = "*" -version = "225" +version = "227" [[package]] category = "main" @@ -542,15 +540,7 @@ marker = "os_name == \"nt\"" name = "pywinpty" optional = false python-versions = "*" -version = "0.5.5" - -[[package]] -category = "dev" -description = "YAML parser and emitter for Python" -name = "pyyaml" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "5.1.2" +version = "0.5.7" [[package]] category = "main" @@ -558,23 +548,15 @@ description = "Python bindings for 0MQ" name = "pyzmq" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" -version = "18.1.0" +version = "18.1.1" [[package]] -category = "main" -description = "Jupyter Qt console" -name = "qtconsole" +category = "dev" +description = "Alternative regular expression module, to replace re." +name = "regex" optional = false python-versions = "*" -version = "4.5.5" - -[package.dependencies] -ipykernel = ">=4.1" -ipython-genutils = "*" -jupyter-client = ">=4.1" -jupyter-core = "*" -pygments = "*" -traitlets = "*" +version = "2020.1.8" [[package]] category = "dev" @@ -582,7 +564,7 @@ description = "Reveal.js - Jupyter/IPython Slideshow Extension" name = "rise" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4" -version = "5.5.1" +version = "5.6.0" [package.dependencies] notebook = ">=5.5.0" @@ -600,8 +582,8 @@ category = "main" description = "Python 2 and 3 compatibility utilities" name = "six" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*" -version = "1.12.0" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +version = "1.14.0" [[package]] category = "main" @@ -609,7 +591,7 @@ description = "Terminals served to xterm.js using Tornado websockets" name = "terminado" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.8.2" +version = "0.8.3" [package.dependencies] ptyprocess = "*" @@ -622,7 +604,10 @@ description = "Test utilities for code working with files and commands" name = "testpath" optional = false python-versions = "*" -version = "0.4.2" +version = "0.4.4" + +[package.extras] +test = ["pathlib2"] [[package]] category = "dev" @@ -646,20 +631,31 @@ description = "Traitlets Python config system" name = "traitlets" optional = false python-versions = "*" -version = "4.3.2" +version = "4.3.3" [package.dependencies] decorator = "*" ipython-genutils = "*" six = "*" +[package.extras] +test = ["pytest", "mock"] + +[[package]] +category = "dev" +description = "a fork of Python 2 and 3 ast modules with type comment support" +name = "typed-ast" +optional = false +python-versions = "*" +version = "1.4.1" + [[package]] category = "main" description = "Measures number of Terminal column cells of wide-character codes" name = "wcwidth" optional = false python-versions = "*" -version = "0.1.7" +version = "0.1.8" [[package]] category = "main" @@ -671,78 +667,376 @@ version = "0.5.1" [[package]] category = "main" -description = "IPython HTML widgets for Jupyter" -name = "widgetsnbextension" +description = "Backport of pathlib-compatible object wrapper for zip files" +marker = "python_version < \"3.8\"" +name = "zipp" optional = false -python-versions = "*" -version = "3.5.1" +python-versions = ">=3.6" +version = "2.1.0" -[package.dependencies] -notebook = ">=4.4.1" +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] +testing = ["jaraco.itertools"] [metadata] -content-hash = "7c3d541c65a27324b49fc7ed2b84067e223eb4e20c20310ff9e485b016f65f91" -python-versions = "^3.6" +content-hash = "c7cc19bb83c0f0869c6fbe7c1a65a57cf18f5d46d115e007080e497af615c1a3" +python-versions = "^3.7" -[metadata.hashes] -appdirs = ["9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92", "d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e"] -appnope = ["5b26757dc6f79a3b7dc9fab95359328d5747fcb2409d331ea66d0272b90ab2a0", "8b995ffe925347a2138d7ac0fe77155e4311a0ea6d6da4f5128fe4b3cbe5ed71"] -attrs = ["69c0dbf2ed392de1cb5ec704444b08a5ef81680a61cb899dc08127123af36a79", "f0b870f674851ecbfbbbd364d6b5cbdff9dcedbc7f3f5e18a6891057f21fe399"] -backcall = ["38ecd85be2c1e78f77fd91700c76e14667dc21e2713b63876c0eb901196e01e4", "bbbf4b1e5cd2bdb08f915895b51081c041bac22394fdfcfdfbe9f14b77c08bf2"] -black = ["817243426042db1d36617910df579a54f1afd659adb96fc5032fcf4b36209739", "e030a9a28f542debc08acceb273f228ac422798e5215ba2a791a6ddeaaca22a5"] -blackcellmagic = ["089b98d28aa647f2d86c3161b60cbf09793384ea94ceb1227f4f1d425db4002c"] -bleach = ["213336e49e102af26d9cde77dd2d0397afabc5a6bf2fed985dc35b5d1e285a16", "3fdf7f77adcf649c9911387df51254b813185e32b2c6619f690b593a617e19fa"] -click = ["2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", "5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"] -colorama = ["05eed71e2e327246ad6b38c540c4a3117230b19679b875190486ddd2d721422d", "f8ac84de7840f5b9c4e3347b3c1eaa50f7e49c2b07596221daec5edaabbd7c48"] -decorator = ["86156361c50488b84a3f148056ea716ca587df2f0de1d34750d35c21312725de", "f069f3a01830ca754ba5258fde2278454a0b5b79e0d7f5c13b3b97e57d4acff6"] -defusedxml = ["6687150770438374ab581bb7a1b327a847dd9c5749e396102de3fad4e8a3ef93", "f684034d135af4c6cbb949b8a4d2ed61634515257a67299e5f940fbaa34377f5"] -entrypoints = ["589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19", "c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"] -ipykernel = ["167c3ef08450f5e060b76c749905acb0e0fbef9365899377a4a1eae728864383", "b503913e0b4cce7ed2de965457dfb2edd633e8234161a60e23f2fe2161345d12"] -ipython = ["c4ab005921641e40a68e405e286e7a1fcc464497e14d81b6914b4fd95e5dee9b", "dd76831f065f17bddd7eaa5c781f5ea32de5ef217592cf019e34043b56895aa1"] -ipython-genutils = ["72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8", "eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"] -ipywidgets = ["13ffeca438e0c0f91ae583dc22f50379b9d6b28390ac7be8b757140e9a771516", "e945f6e02854a74994c596d9db83444a1850c01648f1574adf144fbbabe05c97"] -jedi = ["786b6c3d80e2f06fd77162a07fed81b8baa22dde5d62896a790a331d6ac21a27", "ba859c74fa3c966a22f2aeebe1b74ee27e2a462f56d3f5f7ca4a59af61bfe42e"] -jinja2 = ["065c4f02ebe7f7cf559e49ee5a95fb800a9e4528727aec6f24402a5374c65013", "14dd6caf1527abb21f08f86c784eac40853ba93edb79552aa1e4b8aef1b61c7b"] -jsonschema = ["5f9c0a719ca2ce14c5de2fd350a64fd2d13e8539db29836a86adc990bb1a068f", "8d4a2b7b6c2237e0199c8ea1a6d3e05bf118e289ae2b9d7ba444182a2959560d"] -jupyter = ["3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7", "5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78", "d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"] -jupyter-client = ["4274f2eef4265bfd00216f44993aa50d890a1abe55e414c817128cf0338ae66a", "4c274aaa3d87b83fa6c6853463f54b8bbff137aeb71e65896ab111c17a62ae63"] -jupyter-console = ["308ce876354924fb6c540b41d5d6d08acfc946984bf0c97777c1ddcb42e0b2f5", "cc80a97a5c389cbd30252ffb5ce7cefd4b66bde98219edd16bf5cb6f84bb3568"] -jupyter-contrib-core = ["1ec81e275a8f5858d56b0c4c6cd85335aa8e915001b8657fe51c620c3cdde50f", "e65bc0e932ff31801003cef160a4665f2812efe26a53801925a634735e9a5794"] -jupyter-contrib-nbextensions = ["2c071f0aa208c569666f656bdc0f66906ca493cf9f06f46db6350db11030ff40", "eecd28ecc2fc410226c0a3d4932ed2fac4860ccf8d9e9b1b29548835a35b22ab"] -jupyter-core = ["2c6e7c1e9f2ac45b5c2ceea5730bc9008d92fe59d0725eac57b04c0edfba24f7", "f4fa22d6cf25f34807c995f22d2923693575c70f02557bcbfbe59bd5ec8d8b84"] -jupyter-highlight-selected-word = ["9545dfa9cb057eebe3a5795604dcd3a5294ea18637e553f61a0b67c1b5903c58", "9fa740424859a807950ca08d2bfd28a35154cd32dd6d50ac4e0950022adc0e7b"] -jupyter-latex-envs = ["070a31eb2dc488bba983915879a7c2939247bf5c3b669b398bdb36a9b5343872"] -jupyter-nbextensions-configurator = ["e5e86b5d9d898e1ffb30ebb08e4ad8696999f798fef3ff3262d7b999076e4e83"] -lxml = ["02ca7bf899da57084041bb0f6095333e4d239948ad3169443f454add9f4e9cb4", "096b82c5e0ea27ce9138bcbb205313343ee66a6e132f25c5ed67e2c8d960a1bc", "0a920ff98cf1aac310470c644bc23b326402d3ef667ddafecb024e1713d485f1", "17cae1730a782858a6e2758fd20dd0ef7567916c47757b694a06ffafdec20046", "17e3950add54c882e032527795c625929613adbd2ce5162b94667334458b5a36", "1f4f214337f6ee5825bf90a65d04d70aab05526c08191ab888cb5149501923c5", "2e8f77db25b0a96af679e64ff9bf9dddb27d379c9900c3272f3041c4d1327c9d", "4dffd405390a45ecb95ab5ab1c1b847553c18b0ef8ed01e10c1c8b1a76452916", "6b899931a5648862c7b88c795eddff7588fb585e81cecce20f8d9da16eff96e0", "726c17f3e0d7a7200718c9a890ccfeab391c9133e363a577a44717c85c71db27", "760c12276fee05c36f95f8040180abc7fbebb9e5011447a97cdc289b5d6ab6fc", "796685d3969815a633827c818863ee199440696b0961e200b011d79b9394bbe7", "891fe897b49abb7db470c55664b198b1095e4943b9f82b7dcab317a19116cd38", "a471628e20f03dcdfde00770eeaf9c77811f0c331c8805219ca7b87ac17576c5", "a63b4fd3e2cabdcc9d918ed280bdde3e8e9641e04f3c59a2a3109644a07b9832", "b0b84408d4eabc6de9dd1e1e0bc63e7731e890c0b378a62443e5741cfd0ae90a", "be78485e5d5f3684e875dab60f40cddace2f5b2a8f7fede412358ab3214c3a6f", "c27eaed872185f047bb7f7da2d21a7d8913457678c9a100a50db6da890bc28b9", "c81cb40bff373ab7a7446d6bbca0190bccc5be3448b47b51d729e37799bb5692", "d11874b3c33ee441059464711cd365b89fa1a9cf19ae75b0c189b01fbf735b84", "e9c028b5897901361d81a4718d1db217b716424a0283afe9d6735fe0caf70f79", "fe489d486cd00b739be826e8c1be188ddb74c7a1ca784d93d06fda882a6a1681"] -markupsafe = ["00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", "09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161", "09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235", "1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5", "24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff", "29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", "43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1", "46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e", "500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183", "535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66", "62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1", "6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1", "717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e", "79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b", "7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905", "88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735", "8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d", "98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e", "9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d", "9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c", "ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21", "b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2", "b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5", "b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b", "ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6", "c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f", "cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f", "e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"] -mistune = ["59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e", "88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"] -nbconvert = ["427a468ec26e7d68a529b95f578d5cbf018cb4c1f889e897681c2b6d11897695", "48d3c342057a2cf21e8df820d49ff27ab9f25fc72b8f15606bd47967333b2709"] -nbformat = ["b9a0dbdbd45bb034f4f8893cafd6f652ea08c8c1674ba83f2dc55d3955743b0b", "f7494ef0df60766b7cabe0a3651556345a963b74dbc16bc7c18479041170d402"] -notebook = ["660976fe4fe45c7aa55e04bf4bccb9f9566749ff637e9020af3422f9921f9a5d", "b0a290f5cc7792d50a21bec62b3c221dd820bf00efa916ce9aeec4b5354bde20"] -numpy = ["05dbfe72684cc14b92568de1bc1f41e5f62b00f714afc9adee42f6311738091f", "0d82cb7271a577529d07bbb05cb58675f2deb09772175fab96dc8de025d8ac05", "10132aa1fef99adc85a905d82e8497a580f83739837d7cbd234649f2e9b9dc58", "12322df2e21f033a60c80319c25011194cd2a21294cc66fee0908aeae2c27832", "16f19b3aa775dddc9814e02a46b8e6ae6a54ed8cf143962b4e53f0471dbd7b16", "3d0b0989dd2d066db006158de7220802899a1e5c8cf622abe2d0bd158fd01c2c", "438a3f0e7b681642898fd7993d38e2bf140a2d1eafaf3e89bb626db7f50db355", "5fd214f482ab53f2cea57414c5fb3e58895b17df6e6f5bca5be6a0bb6aea23bb", "73615d3edc84dd7c4aeb212fa3748fb83217e00d201875a47327f55363cef2df", "7bd355ad7496f4ce1d235e9814ec81ee3d28308d591c067ce92e49f745ba2c2f", "7d077f2976b8f3de08a0dcf5d72083f4af5411e8fddacd662aae27baa2601196", "a4092682778dc48093e8bda8d26ee8360153e2047826f95a3f5eae09f0ae3abf", "b458de8624c9f6034af492372eb2fee41a8e605f03f4732f43fc099e227858b2", "e70fc8ff03a961f13363c2c95ef8285e0cf6a720f8271836f852cc0fa64e97c8", "ee8e9d7cad5fe6dde50ede0d2e978d81eafeaa6233fb0b8719f60214cf226578", "f4a4f6aba148858a5a5d546a99280f71f5ee6ec8182a7d195af1a914195b21a2"] -pandocfilters = ["b3dd70e169bb5449e6bc6ff96aea89c5eea8c5f6ab5e207fc2f521a2cf4a0da9"] -parso = ["63854233e1fadb5da97f2744b6b24346d2750b85965e7e399bec1620232797dc", "666b0ee4a7a1220f65d367617f2cd3ffddff3e205f3f16a0284df30e774c2a9c"] -pexpect = ["2094eefdfcf37a1fdbfb9aa090862c1a4878e5c7e0e7e7088bdb511c558e5cd1", "9e2c1fd0e6ee3a49b28f95d4b33bc389c89b20af6a1255906e90ff1262ce62eb"] -pickleshare = ["87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca", "9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"] -prometheus-client = ["71cd24a2b3eb335cb800c7159f423df1bd4dcd5171b234be15e3f31ec9f622da"] -prompt-toolkit = ["11adf3389a996a6d45cc277580d0d53e8a5afd281d0c9ec71b28e6f121463780", "2519ad1d8038fd5fc8e770362237ad0364d16a7650fb5724af6997ed5515e3c1", "977c6583ae813a37dc1c2e1b715892461fcbdaa57f6fc62f33a528c4886c8f55"] -ptyprocess = ["923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0", "d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f"] -pygments = ["71e430bc85c88a430f000ac1d9b331d2407f681d6f6aec95e8bcfbc3df5b0127", "881c4c157e45f30af185c1ffe8d549d48ac9127433f2c380c24b84572ad66297"] -pyrsistent = ["34b47fa169d6006b32e99d4b3c4031f155e6e68ebcc107d6454852e8e0ee6533"] -python-dateutil = ["7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb", "c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e"] -pywin32 = ["0443e9bb196e72480f50cbddc2cf98fbb858a77d02e281ba79489ea3287b36e9", "09bbe7cdb29eb40ab2e83f7a232eeeedde864be7a0622b70a90f456aad07a234", "0d8e0f47808798d320c983574c36c49db642678902933a210edd40157d206fd0", "0db7c9f4b93528afd080d35912a60be2f86a1d6c49c0a9cf9cedd106eed81ea3", "749e590875051661ecefbd9dfa957a485016de0f25e43f5e70f888ef1e29587b", "779d3e9d4b934f2445d2920c3941416d99af72eb7f7fd57a63576cc8aa540ad6", "7c89d2c11a31c7aaa16dc4d25054d7e0e99d6f6b24193cf62c83850484658c87", "81f7732b662c46274d7d8c411c905d53e71999cba95457a0686467c3ebc745ca", "9db1fb8830bfa99c5bfd335d4482c14db5c6f5028db3b006787ef4200206242b", "bd8d04835db28646d9e07fd0ab7c7b18bd90e89dfdc559e60389179495ef30da", "fc6822a68afd79e97b015985dd455767c72009b81bcd18957068626c43f11e75", "fe6cfc2045931866417740b575231c7e12d69d481643be1493487ad53b089959"] -pywinpty = ["0e01321e53a230233358a6d608a1a8bc86c3882cf82769ba3c62ca387dc9cc51", "333e0bc5fca8ad9e9a1516ebedb2a65da38dc1f399f8b2ea57d6cccec1ff2cc8", "3ca3123aa6340ab31bbf9bd012b92e72f9ec905e4c9ee152cc997403e1778cd3", "44a6dddcf2abf402e22f87e2c9a341f7d0b296afbec3d28184c8de4d7f514ee4", "53d94d574c3d4da2df5b1c3ae728b8d90e4d33502b0388576bbd4ddeb4de0f77", "c3955f162c53dde968f3fc11361658f1d83b683bfe601d4b6f94bb01ea4300bc", "cec9894ecb34de3d7b1ca121dd98433035b9f8949b5095e84b103b349231509c", "dcd45912e2fe2e6f72cee997a4da6ed1ad2056165a277ce5ec7f7ac98dcdf667", "f2bcdd9a2ffd8b223752a971b3d377fb7bfed85f140ec9710f1218d760f2ccb7"] -pyyaml = ["0113bc0ec2ad727182326b61326afa3d1d8280ae1122493553fd6f4397f33df9", "01adf0b6c6f61bd11af6e10ca52b7d4057dd0be0343eb9283c878cf3af56aee4", "5124373960b0b3f4aa7df1707e63e9f109b5263eca5976c66e08b1c552d4eaf8", "5ca4f10adbddae56d824b2c09668e91219bb178a1eee1faa56af6f99f11bf696", "7907be34ffa3c5a32b60b95f4d95ea25361c951383a894fec31be7252b2b6f34", "7ec9b2a4ed5cad025c2278a1e6a19c011c80a3caaac804fd2d329e9cc2c287c9", "87ae4c829bb25b9fe99cf71fbb2140c448f534e24c998cc60f39ae4f94396a73", "9de9919becc9cc2ff03637872a440195ac4241c80536632fffeb6a1e25a74299", "a5a85b10e450c66b49f98846937e8cfca1db3127a9d5d1e31ca45c3d0bef4c5b", "b0997827b4f6a7c286c01c5f60384d218dca4ed7d9efa945c3e1aa623d5709ae", "b631ef96d3222e62861443cc89d6563ba3eeb816eeb96b2629345ab795e53681", "bf47c0607522fdbca6c9e817a6e81b08491de50f3766a7a0e6a5be7905961b41", "f81025eddd0327c7d4cfe9b62cf33190e1e736cc6e97502b3ec425f574b3e7a8"] -pyzmq = ["01636e95a88d60118479041c6aaaaf5419c6485b7b1d37c9c4dd424b7b9f1121", "021dba0d1436516092c624359e5da51472b11ba8edffa334218912f7e8b65467", "0463bd941b6aead494d4035f7eebd70035293dd6caf8425993e85ad41de13fa3", "05fd51edd81eed798fccafdd49c936b6c166ffae7b32482e4d6d6a2e196af4e6", "1fadc8fbdf3d22753c36d4172169d184ee6654f8d6539e7af25029643363c490", "22efa0596cf245a78a99060fe5682c4cd00c58bb7614271129215c889062db80", "260c70b7c018905ec3659d0f04db735ac830fe27236e43b9dc0532cf7c9873ef", "2762c45e289732d4450406cedca35a9d4d71e449131ba2f491e0bf473e3d2ff2", "2fc6cada8dc53521c1189596f1898d45c5f68603194d3a6453d6db4b27f4e12e", "343b9710a61f2b167673bea1974e70b5dccfe64b5ed10626798f08c1f7227e72", "41bf96d5f554598a0632c3ec28e3026f1d6591a50f580df38eff0b8067efb9e7", "856b2cdf7a1e2cbb84928e1e8db0ea4018709b39804103d3a409e5584f553f57", "85b869abc894672de9aecdf032158ea8ad01e2f0c3b09ef60e3687fb79418096", "93f44739db69234c013a16990e43db1aa0af3cf5a4b8b377d028ff24515fbeb3", "98fa3e75ccb22c0dc99654e3dd9ff693b956861459e8c8e8734dd6247b89eb29", "9a22c94d2e93af8bebd4fcf5fa38830f5e3b1ff0d4424e2912b07651eb1bafb4", "a7d3f4b4bbb5d7866ae727763268b5c15797cbd7b63ea17f3b0ec1067da8994b", "b645a49376547b3816433a7e2d2a99135c8e651e50497e7ecac3bd126e4bea16", "cf0765822e78cf9e45451647a346d443f66792aba906bc340f4e0ac7870c169c", "dc398e1e047efb18bfab7a8989346c6921a847feae2cad69fedf6ca12fb99e2c", "dd5995ae2e80044e33b5077fb4bc2b0c1788ac6feaf15a6b87a00c14b4bdd682", "e03fe5e07e70f245dc9013a9d48ae8cc4b10c33a1968039c5a3b64b5d01d083d", "ea09a306144dff2795e48439883349819bef2c53c0ee62a3c2fae429451843bb", "f4e37f33da282c3c319849877e34f97f0a3acec09622ec61b7333205bdd13b52", "fa4bad0d1d173dee3e8ef3c3eb6b2bb6c723fc7a661eeecc1ecb2fa99860dd45"] -qtconsole = ["40d5d8e00d070ea266dbf6f0da74c4b9597b8b8d67cd8233c3ffd8debf923703", "b91e7412587e6cfe1644696538f73baf5611e837be5406633218443b2827c6d9"] -rise = ["5a3d529170d707ff0af42bf12f9584b5089baf401643d136d052a66cb4210052", "ba94321aee993cb2f0647c0db8688064afcff6000576f0fcb1e98652abc629e3"] -send2trash = ["60001cc07d707fe247c94f74ca6ac0d3255aabcb930529690897ca2a39db28b2", "f1691922577b6fa12821234aeb57599d887c4900b9ca537948d2dac34aea888b"] -six = ["3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", "d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73"] -terminado = ["d9d012de63acb8223ac969c17c3043337c2fcfd28f3aea1ee429b345d01ef460", "de08e141f83c3a0798b050ecb097ab6259c3f0331b2f7b7750c9075ced2c20c2"] -testpath = ["46c89ebb683f473ffe2aab0ed9f12581d4d078308a3cb3765d79c6b2317b0109", "b694b3d9288dbd81685c5d2e7140b81365d46c29f5db4bc659de5aa6b98780f8"] -toml = ["229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c", "235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e", "f1db651f9657708513243e61e6cc67d101a39bad662eaa9b5546f789338e07a3"] -tornado = ["349884248c36801afa19e342a77cc4458caca694b0eda633f5878e458a44cb2c", "398e0d35e086ba38a0427c3b37f4337327231942e731edaa6e9fd1865bbd6f60", "4e73ef678b1a859f0cb29e1d895526a20ea64b5ffd510a2307b5998c7df24281", "559bce3d31484b665259f50cd94c5c28b961b09315ccd838f284687245f416e5", "abbe53a39734ef4aba061fca54e30c6b4639d3e1f59653f0da37a0003de148c7", "c845db36ba616912074c5b1ee897f8e0124df269468f25e4fe21fe72f6edd7a9", "c9399267c926a4e7c418baa5cbe91c7d1cf362d505a1ef898fde44a07c9dd8a5"] -traitlets = ["9c4bd2d267b7153df9152698efb1050a5d84982d3384a37b2c1f7723ba3e7835", "c6cb5e6f57c5a9bdaa40fa71ce7b4af30298fbab9ece9815b5d995ab6217c7d9"] -wcwidth = ["3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e", "f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c"] -webencodings = ["a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", "b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"] -widgetsnbextension = ["079f87d87270bce047512400efd70238820751a11d2d8cb137a5a5bdbaf255c7", "bd314f8ceb488571a5ffea6cc5b9fc6cba0adaf88a9d2386b93a489751938bcd"] +[metadata.files] +appdirs = [ + {file = "appdirs-1.4.3-py2.py3-none-any.whl", hash = "sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e"}, + {file = "appdirs-1.4.3.tar.gz", hash = "sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92"}, +] +appnope = [ + {file = "appnope-0.1.0-py2.py3-none-any.whl", hash = "sha256:5b26757dc6f79a3b7dc9fab95359328d5747fcb2409d331ea66d0272b90ab2a0"}, + {file = "appnope-0.1.0.tar.gz", hash = "sha256:8b995ffe925347a2138d7ac0fe77155e4311a0ea6d6da4f5128fe4b3cbe5ed71"}, +] +attrs = [ + {file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"}, + {file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"}, +] +backcall = [ + {file = "backcall-0.1.0.tar.gz", hash = "sha256:38ecd85be2c1e78f77fd91700c76e14667dc21e2713b63876c0eb901196e01e4"}, + {file = "backcall-0.1.0.zip", hash = "sha256:bbbf4b1e5cd2bdb08f915895b51081c041bac22394fdfcfdfbe9f14b77c08bf2"}, +] +black = [ + {file = "black-19.10b0-py36-none-any.whl", hash = "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b"}, + {file = "black-19.10b0.tar.gz", hash = "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"}, +] +blackcellmagic = [ + {file = "blackcellmagic-0.0.2.tar.gz", hash = "sha256:089b98d28aa647f2d86c3161b60cbf09793384ea94ceb1227f4f1d425db4002c"}, +] +bleach = [ + {file = "bleach-3.1.0-py2.py3-none-any.whl", hash = "sha256:213336e49e102af26d9cde77dd2d0397afabc5a6bf2fed985dc35b5d1e285a16"}, + {file = "bleach-3.1.0.tar.gz", hash = "sha256:3fdf7f77adcf649c9911387df51254b813185e32b2c6619f690b593a617e19fa"}, +] +click = [ + {file = "Click-7.0-py2.py3-none-any.whl", hash = "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13"}, + {file = "Click-7.0.tar.gz", hash = "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"}, +] +colorama = [ + {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"}, + {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"}, +] +decorator = [ + {file = "decorator-4.4.1-py2.py3-none-any.whl", hash = "sha256:5d19b92a3c8f7f101c8dd86afd86b0f061a8ce4540ab8cd401fa2542756bce6d"}, + {file = "decorator-4.4.1.tar.gz", hash = "sha256:54c38050039232e1db4ad7375cfce6748d7b41c29e95a081c8a6d2c30364a2ce"}, +] +defusedxml = [ + {file = "defusedxml-0.6.0-py2.py3-none-any.whl", hash = "sha256:6687150770438374ab581bb7a1b327a847dd9c5749e396102de3fad4e8a3ef93"}, + {file = "defusedxml-0.6.0.tar.gz", hash = "sha256:f684034d135af4c6cbb949b8a4d2ed61634515257a67299e5f940fbaa34377f5"}, +] +entrypoints = [ + {file = "entrypoints-0.3-py2.py3-none-any.whl", hash = "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19"}, + {file = "entrypoints-0.3.tar.gz", hash = "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"}, +] +importlib-metadata = [ + {file = "importlib_metadata-1.4.0-py2.py3-none-any.whl", hash = "sha256:bdd9b7c397c273bcc9a11d6629a38487cd07154fa255a467bf704cd2c258e359"}, + {file = "importlib_metadata-1.4.0.tar.gz", hash = "sha256:f17c015735e1a88296994c0697ecea7e11db24290941983b08c9feb30921e6d8"}, +] +ipykernel = [ + {file = "ipykernel-5.1.4-py3-none-any.whl", hash = "sha256:ba8c9e5561f3223fb47ce06ad7925cb9444337ac367341c0c520ffb68ea6d120"}, + {file = "ipykernel-5.1.4.tar.gz", hash = "sha256:7f1f01df22f1229c8879501057877ccaf92a3b01c1d00db708aad5003e5f9238"}, +] +ipython = [ + {file = "ipython-7.11.1-py3-none-any.whl", hash = "sha256:387686dd7fc9caf29d2fddcf3116c4b07a11d9025701d220c589a430b0171d8a"}, + {file = "ipython-7.11.1.tar.gz", hash = "sha256:0f4bcf18293fb666df8511feec0403bdb7e061a5842ea6e88a3177b0ceb34ead"}, +] +ipython-genutils = [ + {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, + {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, +] +jedi = [ + {file = "jedi-0.16.0-py2.py3-none-any.whl", hash = "sha256:b4f4052551025c6b0b0b193b29a6ff7bdb74c52450631206c262aef9f7159ad2"}, + {file = "jedi-0.16.0.tar.gz", hash = "sha256:d5c871cb9360b414f981e7072c52c33258d598305280fef91c6cae34739d65d5"}, +] +jinja2 = [ + {file = "Jinja2-2.11.0-py2.py3-none-any.whl", hash = "sha256:6e7a3c2934694d59ad334c93dd1b6c96699cf24c53fdb8ec848ac6b23e685734"}, + {file = "Jinja2-2.11.0.tar.gz", hash = "sha256:d6609ae5ec3d56212ca7d802eda654eaf2310000816ce815361041465b108be4"}, +] +json5 = [ + {file = "json5-0.8.5-py2.py3-none-any.whl", hash = "sha256:32bd17e0553bf53927f6c29b6089f3a320c12897120a4bcfea76ea81c10b2d9c"}, + {file = "json5-0.8.5.tar.gz", hash = "sha256:124b0f0da1ed2ff3bfe3a3e9b8630abd3c650852465cb52c15ef60b8e82a73b0"}, +] +jsonschema = [ + {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, + {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, +] +jupyter-client = [ + {file = "jupyter_client-5.3.4-py2.py3-none-any.whl", hash = "sha256:d0c077c9aaa4432ad485e7733e4d91e48f87b4f4bab7d283d42bb24cbbba0a0f"}, + {file = "jupyter_client-5.3.4.tar.gz", hash = "sha256:60e6faec1031d63df57f1cc671ed673dced0ed420f4377ea33db37b1c188b910"}, +] +jupyter-core = [ + {file = "jupyter_core-4.6.1-py2.py3-none-any.whl", hash = "sha256:464769f7387d7a62a2403d067f1ddc616655b7f77f5d810c0dd62cb54bfd0fb9"}, + {file = "jupyter_core-4.6.1.tar.gz", hash = "sha256:a183e0ec2e8f6adddf62b0a3fc6a2237e3e0056d381e536d3e7c7ecc3067e244"}, +] +jupyterlab = [ + {file = "jupyterlab-1.2.6-py2.py3-none-any.whl", hash = "sha256:56c108e28934ac463754b7656441c0d92e76a81ad5dad446fe1071c6fd86245c"}, + {file = "jupyterlab-1.2.6.tar.gz", hash = "sha256:42134b13fb0c410a9f55e8492a31ba5a1a346430a22690a512b8307764b68355"}, +] +jupyterlab-server = [ + {file = "jupyterlab_server-1.0.6-py3-none-any.whl", hash = "sha256:d9c3bcf097f7ad8d8fd2f8d0c1e8a1b833671c02808e5f807088975495364447"}, + {file = "jupyterlab_server-1.0.6.tar.gz", hash = "sha256:d0977527bfce6f47c782cb6bf79d2c949ebe3f22ac695fa000b730c671445dad"}, +] +markupsafe = [ + {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, + {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, + {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, + {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, +] +mistune = [ + {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, + {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, +] +nbconvert = [ + {file = "nbconvert-5.6.1-py2.py3-none-any.whl", hash = "sha256:f0d6ec03875f96df45aa13e21fd9b8450c42d7e1830418cccc008c0df725fcee"}, + {file = "nbconvert-5.6.1.tar.gz", hash = "sha256:21fb48e700b43e82ba0e3142421a659d7739b65568cc832a13976a77be16b523"}, +] +nbformat = [ + {file = "nbformat-5.0.4-py3-none-any.whl", hash = "sha256:f4bbbd8089bd346488f00af4ce2efb7f8310a74b2058040d075895429924678c"}, + {file = "nbformat-5.0.4.tar.gz", hash = "sha256:562de41fc7f4f481b79ab5d683279bf3a168858268d4387b489b7b02be0b324a"}, +] +notebook = [ + {file = "notebook-6.0.3-py3-none-any.whl", hash = "sha256:3edc616c684214292994a3af05eaea4cc043f6b4247d830f3a2f209fa7639a80"}, + {file = "notebook-6.0.3.tar.gz", hash = "sha256:47a9092975c9e7965ada00b9a20f0cf637d001db60d241d479f53c0be117ad48"}, +] +numpy = [ + {file = "numpy-1.18.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:20b26aaa5b3da029942cdcce719b363dbe58696ad182aff0e5dcb1687ec946dc"}, + {file = "numpy-1.18.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:70a840a26f4e61defa7bdf811d7498a284ced303dfbc35acb7be12a39b2aa121"}, + {file = "numpy-1.18.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:17aa7a81fe7599a10f2b7d95856dc5cf84a4eefa45bc96123cbbc3ebc568994e"}, + {file = "numpy-1.18.1-cp35-cp35m-win32.whl", hash = "sha256:f3d0a94ad151870978fb93538e95411c83899c9dc63e6fb65542f769568ecfa5"}, + {file = "numpy-1.18.1-cp35-cp35m-win_amd64.whl", hash = "sha256:1786a08236f2c92ae0e70423c45e1e62788ed33028f94ca99c4df03f5be6b3c6"}, + {file = "numpy-1.18.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ae0975f42ab1f28364dcda3dde3cf6c1ddab3e1d4b2909da0cb0191fa9ca0480"}, + {file = "numpy-1.18.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:cf7eb6b1025d3e169989416b1adcd676624c2dbed9e3bcb7137f51bfc8cc2572"}, + {file = "numpy-1.18.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:b765ed3930b92812aa698a455847141869ef755a87e099fddd4ccf9d81fffb57"}, + {file = "numpy-1.18.1-cp36-cp36m-win32.whl", hash = "sha256:2d75908ab3ced4223ccba595b48e538afa5ecc37405923d1fea6906d7c3a50bc"}, + {file = "numpy-1.18.1-cp36-cp36m-win_amd64.whl", hash = "sha256:9acdf933c1fd263c513a2df3dceecea6f3ff4419d80bf238510976bf9bcb26cd"}, + {file = "numpy-1.18.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:56bc8ded6fcd9adea90f65377438f9fea8c05fcf7c5ba766bef258d0da1554aa"}, + {file = "numpy-1.18.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e422c3152921cece8b6a2fb6b0b4d73b6579bd20ae075e7d15143e711f3ca2ca"}, + {file = "numpy-1.18.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:b3af02ecc999c8003e538e60c89a2b37646b39b688d4e44d7373e11c2debabec"}, + {file = "numpy-1.18.1-cp37-cp37m-win32.whl", hash = "sha256:d92350c22b150c1cae7ebb0ee8b5670cc84848f6359cf6b5d8f86617098a9b73"}, + {file = "numpy-1.18.1-cp37-cp37m-win_amd64.whl", hash = "sha256:77c3bfe65d8560487052ad55c6998a04b654c2fbc36d546aef2b2e511e760971"}, + {file = "numpy-1.18.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c98c5ffd7d41611407a1103ae11c8b634ad6a43606eca3e2a5a269e5d6e8eb07"}, + {file = "numpy-1.18.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:9537eecf179f566fd1c160a2e912ca0b8e02d773af0a7a1120ad4f7507cd0d26"}, + {file = "numpy-1.18.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:e840f552a509e3380b0f0ec977e8124d0dc34dc0e68289ca28f4d7c1d0d79474"}, + {file = "numpy-1.18.1-cp38-cp38-win32.whl", hash = "sha256:590355aeade1a2eaba17617c19edccb7db8d78760175256e3cf94590a1a964f3"}, + {file = "numpy-1.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:39d2c685af15d3ce682c99ce5925cc66efc824652e10990d2462dfe9b8918c6a"}, + {file = "numpy-1.18.1.zip", hash = "sha256:b6ff59cee96b454516e47e7721098e6ceebef435e3e21ac2d6c3b8b02628eb77"}, +] +pandocfilters = [ + {file = "pandocfilters-1.4.2.tar.gz", hash = "sha256:b3dd70e169bb5449e6bc6ff96aea89c5eea8c5f6ab5e207fc2f521a2cf4a0da9"}, +] +parso = [ + {file = "parso-0.6.0-py2.py3-none-any.whl", hash = "sha256:1376bdc8cb81377ca481976933773295218a2df47d3e1182ba76d372b1acb128"}, + {file = "parso-0.6.0.tar.gz", hash = "sha256:597f36de5102a8db05ffdf7ecdc761838b86565a4a111604c6e78beaedf1b045"}, +] +pathspec = [ + {file = "pathspec-0.7.0-py2.py3-none-any.whl", hash = "sha256:163b0632d4e31cef212976cf57b43d9fd6b0bac6e67c26015d611a647d5e7424"}, + {file = "pathspec-0.7.0.tar.gz", hash = "sha256:562aa70af2e0d434367d9790ad37aed893de47f1693e4201fd1d3dca15d19b96"}, +] +pexpect = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] +pickleshare = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] +prometheus-client = [ + {file = "prometheus_client-0.7.1.tar.gz", hash = "sha256:71cd24a2b3eb335cb800c7159f423df1bd4dcd5171b234be15e3f31ec9f622da"}, +] +prompt-toolkit = [ + {file = "prompt_toolkit-3.0.3-py3-none-any.whl", hash = "sha256:c93e53af97f630f12f5f62a3274e79527936ed466f038953dfa379d4941f651a"}, + {file = "prompt_toolkit-3.0.3.tar.gz", hash = "sha256:a402e9bf468b63314e37460b68ba68243d55b2f8c4d0192f85a019af3945050e"}, +] +ptyprocess = [ + {file = "ptyprocess-0.6.0-py2.py3-none-any.whl", hash = "sha256:d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f"}, + {file = "ptyprocess-0.6.0.tar.gz", hash = "sha256:923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0"}, +] +pygments = [ + {file = "Pygments-2.5.2-py2.py3-none-any.whl", hash = "sha256:2a3fe295e54a20164a9df49c75fa58526d3be48e14aceba6d6b1e8ac0bfd6f1b"}, + {file = "Pygments-2.5.2.tar.gz", hash = "sha256:98c8aa5a9f778fcd1026a17361ddaf7330d1b7c62ae97c3bb0ae73e0b9b6b0fe"}, +] +pyrsistent = [ + {file = "pyrsistent-0.15.7.tar.gz", hash = "sha256:cdc7b5e3ed77bed61270a47d35434a30617b9becdf2478af76ad2c6ade307280"}, +] +python-dateutil = [ + {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, + {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, +] +pywin32 = [ + {file = "pywin32-227-cp27-cp27m-win32.whl", hash = "sha256:371fcc39416d736401f0274dd64c2302728c9e034808e37381b5e1b22be4a6b0"}, + {file = "pywin32-227-cp27-cp27m-win_amd64.whl", hash = "sha256:4cdad3e84191194ea6d0dd1b1b9bdda574ff563177d2adf2b4efec2a244fa116"}, + {file = "pywin32-227-cp35-cp35m-win32.whl", hash = "sha256:f4c5be1a293bae0076d93c88f37ee8da68136744588bc5e2be2f299a34ceb7aa"}, + {file = "pywin32-227-cp35-cp35m-win_amd64.whl", hash = "sha256:a929a4af626e530383a579431b70e512e736e9588106715215bf685a3ea508d4"}, + {file = "pywin32-227-cp36-cp36m-win32.whl", hash = "sha256:300a2db938e98c3e7e2093e4491439e62287d0d493fe07cce110db070b54c0be"}, + {file = "pywin32-227-cp36-cp36m-win_amd64.whl", hash = "sha256:9b31e009564fb95db160f154e2aa195ed66bcc4c058ed72850d047141b36f3a2"}, + {file = "pywin32-227-cp37-cp37m-win32.whl", hash = "sha256:47a3c7551376a865dd8d095a98deba954a98f326c6fe3c72d8726ca6e6b15507"}, + {file = "pywin32-227-cp37-cp37m-win_amd64.whl", hash = "sha256:31f88a89139cb2adc40f8f0e65ee56a8c585f629974f9e07622ba80199057511"}, + {file = "pywin32-227-cp38-cp38-win32.whl", hash = "sha256:7f18199fbf29ca99dff10e1f09451582ae9e372a892ff03a28528a24d55875bc"}, + {file = "pywin32-227-cp38-cp38-win_amd64.whl", hash = "sha256:7c1ae32c489dc012930787f06244426f8356e129184a02c25aef163917ce158e"}, + {file = "pywin32-227-cp39-cp39-win32.whl", hash = "sha256:c054c52ba46e7eb6b7d7dfae4dbd987a1bb48ee86debe3f245a2884ece46e295"}, + {file = "pywin32-227-cp39-cp39-win_amd64.whl", hash = "sha256:f27cec5e7f588c3d1051651830ecc00294f90728d19c3bf6916e6dba93ea357c"}, +] +pywinpty = [ + {file = "pywinpty-0.5.7-cp27-cp27m-win32.whl", hash = "sha256:b358cb552c0f6baf790de375fab96524a0498c9df83489b8c23f7f08795e966b"}, + {file = "pywinpty-0.5.7-cp27-cp27m-win_amd64.whl", hash = "sha256:1e525a4de05e72016a7af27836d512db67d06a015aeaf2fa0180f8e6a039b3c2"}, + {file = "pywinpty-0.5.7-cp35-cp35m-win32.whl", hash = "sha256:2740eeeb59297593a0d3f762269b01d0285c1b829d6827445fcd348fb47f7e70"}, + {file = "pywinpty-0.5.7-cp35-cp35m-win_amd64.whl", hash = "sha256:33df97f79843b2b8b8bc5c7aaf54adec08cc1bae94ee99dfb1a93c7a67704d95"}, + {file = "pywinpty-0.5.7-cp36-cp36m-win32.whl", hash = "sha256:e854211df55d107f0edfda8a80b39dfc87015bef52a8fe6594eb379240d81df2"}, + {file = "pywinpty-0.5.7-cp36-cp36m-win_amd64.whl", hash = "sha256:dbd838de92de1d4ebf0dce9d4d5e4fc38d0b7b1de837947a18b57a882f219139"}, + {file = "pywinpty-0.5.7-cp37-cp37m-win32.whl", hash = "sha256:5fb2c6c6819491b216f78acc2c521b9df21e0f53b9a399d58a5c151a3c4e2a2d"}, + {file = "pywinpty-0.5.7-cp37-cp37m-win_amd64.whl", hash = "sha256:dd22c8efacf600730abe4a46c1388355ce0d4ab75dc79b15d23a7bd87bf05b48"}, + {file = "pywinpty-0.5.7-cp38-cp38-win_amd64.whl", hash = "sha256:8fc5019ff3efb4f13708bd3b5ad327589c1a554cb516d792527361525a7cb78c"}, + {file = "pywinpty-0.5.7.tar.gz", hash = "sha256:2d7e9c881638a72ffdca3f5417dd1563b60f603e1b43e5895674c2a1b01f95a0"}, +] +pyzmq = [ + {file = "pyzmq-18.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:0573b9790aa26faff33fba40f25763657271d26f64bffb55a957a3d4165d6098"}, + {file = "pyzmq-18.1.1-cp27-cp27m-win32.whl", hash = "sha256:972d723a36ab6a60b7806faa5c18aa3c080b7d046c407e816a1d8673989e2485"}, + {file = "pyzmq-18.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:0fa82b9fc3334478be95a5566f35f23109f763d1669bb762e3871a8fa2a4a037"}, + {file = "pyzmq-18.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:80c928d5adcfa12346b08d31360988d843b54b94154575cccd628f1fe91446bc"}, + {file = "pyzmq-18.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:efdde21febb9b5d7a8e0b87ea2549d7e00fda1936459cfb27fb6fca0c36af6c1"}, + {file = "pyzmq-18.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:aa3872f2ebfc5f9692ef8957fe69abe92d905a029c0608e45ebfcd451ad30ab5"}, + {file = "pyzmq-18.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:01b588911714a6696283de3904f564c550c9e12e8b4995e173f1011755e01086"}, + {file = "pyzmq-18.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8ff946b20d13a99dc5c21cb76f4b8b253eeddf3eceab4218df8825b0c65ab23d"}, + {file = "pyzmq-18.1.1-cp35-cp35m-win32.whl", hash = "sha256:2a294b4f44201bb21acc2c1a17ff87fbe57b82060b10ddb00ac03e57f3d7fcfa"}, + {file = "pyzmq-18.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:6fca7d11310430e751f9832257866a122edf9d7b635305c5d8c51f74a5174d3d"}, + {file = "pyzmq-18.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:f4e72646bfe79ff3adbf1314906bbd2d67ef9ccc71a3a98b8b2ccbcca0ab7bec"}, + {file = "pyzmq-18.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:1e59b7b19396f26e360f41411a5d4603356d18871049cd7790f1a7d18f65fb2c"}, + {file = "pyzmq-18.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:cf08435b14684f7f2ca2df32c9df38a79cdc17c20dc461927789216cb43d8363"}, + {file = "pyzmq-18.1.1-cp36-cp36m-win32.whl", hash = "sha256:75d73ee7ca4b289a2a2dfe0e6bd8f854979fc13b3fe4ebc19381be3b04e37a4a"}, + {file = "pyzmq-18.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:7369656f89878455a5bcd5d56ca961884f5d096268f71c0750fc33d6732a25e5"}, + {file = "pyzmq-18.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4ec47f2b50bdb97df58f1697470e5c58c3c5109289a623e30baf293481ff0166"}, + {file = "pyzmq-18.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:5541dc8cad3a8486d58bbed076cb113b65b5dd6b91eb94fb3e38a3d1d3022f20"}, + {file = "pyzmq-18.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ed6205ca0de035f252baa0fd26fdd2bc8a8f633f92f89ca866fd423ff26c6f25"}, + {file = "pyzmq-18.1.1-cp37-cp37m-win32.whl", hash = "sha256:8b8498ceee33a7023deb2f3db907ca41d6940321e282297327a9be41e3983792"}, + {file = "pyzmq-18.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e37f22eb4bfbf69cd462c7000616e03b0cdc1b65f2d99334acad36ea0e4ddf6b"}, + {file = "pyzmq-18.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:355b38d7dd6f884b8ee9771f59036bcd178d98539680c4f87e7ceb2c6fd057b6"}, + {file = "pyzmq-18.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:4b73d20aec63933bbda7957e30add233289d86d92a0bb9feb3f4746376f33527"}, + {file = "pyzmq-18.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:d30db4566177a6205ed1badb8dbbac3c043e91b12a2db5ef9171b318c5641b75"}, + {file = "pyzmq-18.1.1-cp38-cp38-win32.whl", hash = "sha256:83ce18b133dc7e6789f64cb994e7376c5aa6b4aeced993048bf1d7f9a0fe6d3a"}, + {file = "pyzmq-18.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:d5ac84f38575a601ab20c1878818ffe0d09eb51d6cb8511b636da46d0fd8949a"}, + {file = "pyzmq-18.1.1-pp271-pypy_41-macosx_10_15_x86_64.whl", hash = "sha256:e6549dd80de7b23b637f586217a4280facd14ac01e9410a037a13854a6977299"}, + {file = "pyzmq-18.1.1-pp371-pypy3_71-macosx_10_15_x86_64.whl", hash = "sha256:a6c9c42bbdba3f9c73aedbb7671815af1943ae8073e532c2b66efb72f39f4165"}, + {file = "pyzmq-18.1.1.tar.gz", hash = "sha256:8c69a6cbfa94da29a34f6b16193e7c15f5d3220cb772d6d17425ff3faa063a6d"}, +] +regex = [ + {file = "regex-2020.1.8-cp27-cp27m-win32.whl", hash = "sha256:4e8f02d3d72ca94efc8396f8036c0d3bcc812aefc28ec70f35bb888c74a25161"}, + {file = "regex-2020.1.8-cp27-cp27m-win_amd64.whl", hash = "sha256:e6c02171d62ed6972ca8631f6f34fa3281d51db8b326ee397b9c83093a6b7242"}, + {file = "regex-2020.1.8-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:4eae742636aec40cf7ab98171ab9400393360b97e8f9da67b1867a9ee0889b26"}, + {file = "regex-2020.1.8-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:bd25bb7980917e4e70ccccd7e3b5740614f1c408a642c245019cff9d7d1b6149"}, + {file = "regex-2020.1.8-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3e77409b678b21a056415da3a56abfd7c3ad03da71f3051bbcdb68cf44d3c34d"}, + {file = "regex-2020.1.8-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:07b39bf943d3d2fe63d46281d8504f8df0ff3fe4c57e13d1656737950e53e525"}, + {file = "regex-2020.1.8-cp36-cp36m-win32.whl", hash = "sha256:23e2c2c0ff50f44877f64780b815b8fd2e003cda9ce817a7fd00dea5600c84a0"}, + {file = "regex-2020.1.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27429b8d74ba683484a06b260b7bb00f312e7c757792628ea251afdbf1434003"}, + {file = "regex-2020.1.8-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0e182d2f097ea8549a249040922fa2b92ae28be4be4895933e369a525ba36576"}, + {file = "regex-2020.1.8-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e3cd21cc2840ca67de0bbe4071f79f031c81418deb544ceda93ad75ca1ee9f7b"}, + {file = "regex-2020.1.8-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:ecc6de77df3ef68fee966bb8cb4e067e84d4d1f397d0ef6fce46913663540d77"}, + {file = "regex-2020.1.8-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:26ff99c980f53b3191d8931b199b29d6787c059f2e029b2b0c694343b1708c35"}, + {file = "regex-2020.1.8-cp37-cp37m-win32.whl", hash = "sha256:7bcd322935377abcc79bfe5b63c44abd0b29387f267791d566bbb566edfdd146"}, + {file = "regex-2020.1.8-cp37-cp37m-win_amd64.whl", hash = "sha256:10671601ee06cf4dc1bc0b4805309040bb34c9af423c12c379c83d7895622bb5"}, + {file = "regex-2020.1.8-cp38-cp38-manylinux1_i686.whl", hash = "sha256:98b8ed7bb2155e2cbb8b76f627b2fd12cf4b22ab6e14873e8641f266e0fb6d8f"}, + {file = "regex-2020.1.8-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6a6ba91b94427cd49cd27764679024b14a96874e0dc638ae6bdd4b1a3ce97be1"}, + {file = "regex-2020.1.8-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:6a6ae17bf8f2d82d1e8858a47757ce389b880083c4ff2498dba17c56e6c103b9"}, + {file = "regex-2020.1.8-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:0932941cdfb3afcbc26cc3bcf7c3f3d73d5a9b9c56955d432dbf8bbc147d4c5b"}, + {file = "regex-2020.1.8-cp38-cp38-win32.whl", hash = "sha256:d58e4606da2a41659c84baeb3cfa2e4c87a74cec89a1e7c56bee4b956f9d7461"}, + {file = "regex-2020.1.8-cp38-cp38-win_amd64.whl", hash = "sha256:e7c7661f7276507bce416eaae22040fd91ca471b5b33c13f8ff21137ed6f248c"}, + {file = "regex-2020.1.8.tar.gz", hash = "sha256:d0f424328f9822b0323b3b6f2e4b9c90960b24743d220763c7f07071e0778351"}, +] +rise = [ + {file = "rise-5.6.0-py2.py3-none-any.whl", hash = "sha256:24d22dabe4d1ddfab83c42de113353b377dd6d212a1d6fd667a29d00b2ede581"}, + {file = "rise-5.6.0.tar.gz", hash = "sha256:2be45c3dbe27e63aae047c6a90be19798b6e17e9b6b0e25408b3c4f645658e26"}, +] +send2trash = [ + {file = "Send2Trash-1.5.0-py3-none-any.whl", hash = "sha256:f1691922577b6fa12821234aeb57599d887c4900b9ca537948d2dac34aea888b"}, + {file = "Send2Trash-1.5.0.tar.gz", hash = "sha256:60001cc07d707fe247c94f74ca6ac0d3255aabcb930529690897ca2a39db28b2"}, +] +six = [ + {file = "six-1.14.0-py2.py3-none-any.whl", hash = "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"}, + {file = "six-1.14.0.tar.gz", hash = "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a"}, +] +terminado = [ + {file = "terminado-0.8.3-py2.py3-none-any.whl", hash = "sha256:a43dcb3e353bc680dd0783b1d9c3fc28d529f190bc54ba9a229f72fe6e7a54d7"}, + {file = "terminado-0.8.3.tar.gz", hash = "sha256:4804a774f802306a7d9af7322193c5390f1da0abb429e082a10ef1d46e6fb2c2"}, +] +testpath = [ + {file = "testpath-0.4.4-py2.py3-none-any.whl", hash = "sha256:bfcf9411ef4bf3db7579063e0546938b1edda3d69f4e1fb8756991f5951f85d4"}, + {file = "testpath-0.4.4.tar.gz", hash = "sha256:60e0a3261c149755f4399a1fff7d37523179a70fdc3abdf78de9fc2604aeec7e"}, +] +toml = [ + {file = "toml-0.10.0-py2.7.egg", hash = "sha256:f1db651f9657708513243e61e6cc67d101a39bad662eaa9b5546f789338e07a3"}, + {file = "toml-0.10.0-py2.py3-none-any.whl", hash = "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e"}, + {file = "toml-0.10.0.tar.gz", hash = "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c"}, +] +tornado = [ + {file = "tornado-6.0.3-cp35-cp35m-win32.whl", hash = "sha256:c9399267c926a4e7c418baa5cbe91c7d1cf362d505a1ef898fde44a07c9dd8a5"}, + {file = "tornado-6.0.3-cp35-cp35m-win_amd64.whl", hash = "sha256:398e0d35e086ba38a0427c3b37f4337327231942e731edaa6e9fd1865bbd6f60"}, + {file = "tornado-6.0.3-cp36-cp36m-win32.whl", hash = "sha256:4e73ef678b1a859f0cb29e1d895526a20ea64b5ffd510a2307b5998c7df24281"}, + {file = "tornado-6.0.3-cp36-cp36m-win_amd64.whl", hash = "sha256:349884248c36801afa19e342a77cc4458caca694b0eda633f5878e458a44cb2c"}, + {file = "tornado-6.0.3-cp37-cp37m-win32.whl", hash = "sha256:559bce3d31484b665259f50cd94c5c28b961b09315ccd838f284687245f416e5"}, + {file = "tornado-6.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:abbe53a39734ef4aba061fca54e30c6b4639d3e1f59653f0da37a0003de148c7"}, + {file = "tornado-6.0.3.tar.gz", hash = "sha256:c845db36ba616912074c5b1ee897f8e0124df269468f25e4fe21fe72f6edd7a9"}, +] +traitlets = [ + {file = "traitlets-4.3.3-py2.py3-none-any.whl", hash = "sha256:70b4c6a1d9019d7b4f6846832288f86998aa3b9207c6821f3578a6a6a467fe44"}, + {file = "traitlets-4.3.3.tar.gz", hash = "sha256:d023ee369ddd2763310e4c3eae1ff649689440d4ae59d7485eb4cfbbe3e359f7"}, +] +typed-ast = [ + {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"}, + {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb"}, + {file = "typed_ast-1.4.1-cp35-cp35m-win32.whl", hash = "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919"}, + {file = "typed_ast-1.4.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01"}, + {file = "typed_ast-1.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75"}, + {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652"}, + {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"}, + {file = "typed_ast-1.4.1-cp36-cp36m-win32.whl", hash = "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1"}, + {file = "typed_ast-1.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa"}, + {file = "typed_ast-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614"}, + {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41"}, + {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b"}, + {file = "typed_ast-1.4.1-cp37-cp37m-win32.whl", hash = "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe"}, + {file = "typed_ast-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355"}, + {file = "typed_ast-1.4.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6"}, + {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907"}, + {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d"}, + {file = "typed_ast-1.4.1-cp38-cp38-win32.whl", hash = "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c"}, + {file = "typed_ast-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4"}, + {file = "typed_ast-1.4.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34"}, + {file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"}, +] +wcwidth = [ + {file = "wcwidth-0.1.8-py2.py3-none-any.whl", hash = "sha256:8fd29383f539be45b20bd4df0dc29c20ba48654a41e661925e612311e9f3c603"}, + {file = "wcwidth-0.1.8.tar.gz", hash = "sha256:f28b3e8a6483e5d49e7f8949ac1a78314e740333ae305b4ba5defd3e74fb37a8"}, +] +webencodings = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] +zipp = [ + {file = "zipp-2.1.0-py3-none-any.whl", hash = "sha256:ccc94ed0909b58ffe34430ea5451f07bc0c76467d7081619a454bf5c98b89e28"}, + {file = "zipp-2.1.0.tar.gz", hash = "sha256:feae2f18633c32fc71f2de629bfb3bd3c9325cd4419642b1f1da42ee488d9b98"}, +] diff --git a/pyproject.toml b/pyproject.toml index f25a893..c30f700 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,20 +1,19 @@ [tool.poetry] name = "intro-to-python" -version = "0.6.0" +version = "0.6.1" description = "An introduction to Python and programming for wanna-be data scientists" authors = ["Alexander Hess "] license = "MIT" [tool.poetry.dependencies] -python = "^3.6" -jupyter = "^1.0" -numpy = "^1.17" +python = "^3.7" +jupyterlab = "^1.2.6" +numpy = "^1.18.1" [tool.poetry.dev-dependencies] -black = {version = "^18.3-alpha.0", allows-prereleases = true} +black = "^19.10b0" blackcellmagic = "^0.0.2" -jupyter-contrib-nbextensions = "^0.5" -rise = "^5.5" +RISE = "^5.6.0" [build-system] requires = ["poetry>=0.12"] diff --git a/requirements.txt b/requirements.txt index 28405c8..f9ab033 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,57 +1,53 @@ appdirs==1.4.3 -attrs==19.1.0 +attrs==19.3.0 backcall==0.1.0 -black==18.9b0 +black==19.10b0 blackcellmagic==0.0.2 bleach==3.1.0 Click==7.0 -decorator==4.4.0 +decorator==4.4.1 defusedxml==0.6.0 entrypoints==0.3 -ipykernel==5.1.2 -ipython==7.8.0 +importlib-metadata==1.4.0 +ipykernel==5.1.4 +ipython==7.11.1 ipython-genutils==0.2.0 -ipywidgets==7.5.1 -jedi==0.15.1 -Jinja2==2.10.1 -jsonschema==3.0.2 -jupyter==1.0.0 -jupyter-client==5.3.2 -jupyter-console==6.0.0 -jupyter-contrib-core==0.3.3 -jupyter-contrib-nbextensions==0.5.1 -jupyter-core==4.5.0 -jupyter-highlight-selected-word==0.2.0 -jupyter-latex-envs==1.4.6 -jupyter-nbextensions-configurator==0.4.1 -lxml==4.4.1 +jedi==0.16.0 +Jinja2==2.11.0 +json5==0.8.5 +jsonschema==3.2.0 +jupyter-client==5.3.4 +jupyter-core==4.6.1 +jupyterlab==1.2.6 +jupyterlab-server==1.0.6 MarkupSafe==1.1.1 mistune==0.8.4 -nbconvert==5.6.0 -nbformat==4.4.0 -notebook==6.0.1 -numpy==1.17.2 +nbconvert==5.6.1 +nbformat==5.0.4 +notebook==6.0.3 +numpy==1.18.1 pandocfilters==1.4.2 -parso==0.5.1 -pexpect==4.7.0 +parso==0.6.0 +pathspec==0.7.0 +pexpect==4.8.0 pickleshare==0.7.5 prometheus-client==0.7.1 -prompt-toolkit==2.0.9 +prompt-toolkit==3.0.3 ptyprocess==0.6.0 -Pygments==2.4.2 -pyrsistent==0.15.4 -python-dateutil==2.8.0 -PyYAML==5.1.2 -pyzmq==18.1.0 -qtconsole==4.5.5 -rise==5.5.1 +Pygments==2.5.2 +pyrsistent==0.15.7 +python-dateutil==2.8.1 +pyzmq==18.1.1 +regex==2020.1.8 +rise==5.6.0 Send2Trash==1.5.0 -six==1.12.0 -terminado==0.8.2 -testpath==0.4.2 +six==1.14.0 +terminado==0.8.3 +testpath==0.4.4 toml==0.10.0 tornado==6.0.3 -traitlets==4.3.2 -wcwidth==0.1.7 +traitlets==4.3.3 +typed-ast==1.4.1 +wcwidth==0.1.8 webencodings==0.5.1 -widgetsnbextension==3.5.1 +zipp==2.1.0 From e8cd8a7e6303fbbb759d1563f0af6d8a5a369738 Mon Sep 17 00:00:00 2001 From: Alexander Hess Date: Tue, 28 Jan 2020 18:23:55 +0100 Subject: [PATCH 4/4] Update the installation notes to JupyterLab --- 00_start_up_00_content.ipynb | 14 ++++---- README.md | 59 +++++++++++++++++++++++---------- static/anaconda.png | Bin 142513 -> 0 bytes static/anaconda_navigator.png | Bin 0 -> 317986 bytes static/anaconda_start_menu.png | Bin 0 -> 187769 bytes static/jupyter_lab.png | Bin 0 -> 129745 bytes 6 files changed, 49 insertions(+), 24 deletions(-) delete mode 100644 static/anaconda.png create mode 100644 static/anaconda_navigator.png create mode 100644 static/anaconda_start_menu.png create mode 100644 static/jupyter_lab.png diff --git a/00_start_up_00_content.ipynb b/00_start_up_00_content.ipynb index 6e3d84a..3ca98d4 100644 --- a/00_start_up_00_content.ipynb +++ b/00_start_up_00_content.ipynb @@ -156,7 +156,7 @@ "\n", "A popular and beginner-friendly way is to install the [Anaconda Distribution](https://www.anaconda.com/distribution/) that not only ships Python and the standard library but comes pre-packaged with a lot of third-party libraries from the so-called \"scientific stack.\" Just go to the [download](https://www.anaconda.com/download/) page and install the latest version (i.e., *2019-10* with Python 3.7 at the time of this writing) for your operating system.\n", "\n", - "Then, among others, you find an entry \"Jupyter Notebook\" in your start menu like below. Click on it to open a new tab in your web browser where you can switch between folders as you could in your computer's default file browser." + "Then, among others, you will find an entry \"Anaconda Navigator\" in your start menu like below. Click on it." ] }, { @@ -167,7 +167,7 @@ } }, "source": [ - "" + "" ] }, { @@ -178,7 +178,7 @@ } }, "source": [ - "To download the materials accompanying this book as a ZIP file, open this [GitHub repository](https://github.com/webartifex/intro-to-python) in a web browser and click on the green \"Clone or download\" button on the right. Then, unpack the ZIP file into a folder of your choosing (ideally somewhere within your user folder so that the files show up right away)." + "A window opens showing you several applications that come with the Anaconda Distribution. Now, click on \"JupyterLab.\"" ] }, { @@ -189,7 +189,7 @@ } }, "source": [ - "### Alternative Installation" + "" ] }, { @@ -200,7 +200,7 @@ } }, "source": [ - "Python can also be installed in a \"pure\" way as obtained from its core development team. However, this is somewhat too \"advanced\" for a beginner who would then also be responsible for setting up all the third-party libraries needed to view this document. Plus, many of the involved steps are typed in a [terminal](https://en.wikipedia.org/wiki/Terminal_emulator) window, which tends to be a bit intimidating for most beginners." + "A new tab in your web browser opens with the website being \"localhost\" and some number (e.g., 8888). This is the [JupyterLab](https://jupyterlab.readthedocs.io/en/stable/) application that is used to display and run the Jupyter notebooks mentioned above. On the left, you see the files and folders in your local user folder. This file browser works like any other. In the center, you have several options to launch a new notebook file." ] }, { @@ -211,7 +211,7 @@ } }, "source": [ - "" + "" ] }, { @@ -222,7 +222,7 @@ } }, "source": [ - "For more \"courageous\" beginners wanting to learn how to accomplish this, here is a rough sketch of the aspects to know. First, all Python releases are available for free on the official [download](https://www.python.org/downloads/) page for any supported operating system. Choose the latest one applicable, then download and install it (cf., the [instruction notes](https://wiki.python.org/moin/BeginnersGuide/Download)). As this only includes core Python and the standard library, the beginner then needs to learn about the [pip](https://pip.pypa.io/en/stable/) module. With the command `python -m pip install jupyter`, all necessary third-party libraries are installed (cf., more background [here](https://jupyter.readthedocs.io/en/latest/install.html)). However, this would be done in a *system-wide* fashion and is not recommended. Instead, the best practice is to create a so-called **virtual environment** with the [venv](https://docs.python.org/3/library/venv.html) module with which the installed third-party packages are *isolated* on a per-project basis (the command `python -m venv env-name` creates a virtual environment called \"env-name\"). This tactic is employed to avoid a situation known as **[dependency hell](https://en.wikipedia.org/wiki/Dependency_hell)**. Once created, the virtual environment must then be activated each time before resuming work in each terminal (with the command `source env-name/bin/activate`). While there exist convenience tools that automate parts of this (e.g., [poetry](https://poetry.eustace.io/docs/) or [virtualenvwrapper](https://virtualenvwrapper.readthedocs.io/en/latest/)), it only distracts a beginner from studying the Python language. Yet, it is still worthwhile to have heard about these terms and concepts as many online resources often implicitly assume the user to know about them." + "Next, to download the materials accompanying this book as a ZIP file, open this [GitHub repository](https://github.com/webartifex/intro-to-python) in a web browser, and click on the green \"Clone or download\" button on the top right. Then, unpack the ZIP file into a folder of your choosing, ideally somewhere within your personal user folder so that the files show up right away in JupyterLab." ] }, { diff --git a/README.md b/README.md index 0da3f5e..8c1cba2 100644 --- a/README.md +++ b/README.md @@ -91,33 +91,52 @@ Just go to the [download](https://www.anaconda.com/distribution/#download-sectio section and install the latest version (i.e., *2019-10* with Python 3.7 at the time of this writing) for your operating system. -Then, among others, you will find an entry "Jupyter Notebook" in your start +Then, among others, you will find an entry "Anaconda Navigator" in your start menu like below. -Click on it and a new tab in your web browser will open where you can switch -between folders as you could in your computer's default file browser. +Click on it. - + -To download the course's materials as a ZIP file, click on the green "Clone or -download" button on the top right on this website. -Then, unpack the ZIP file into a folder of your choosing (ideally somewhere -within your personal user folder so that the files show up right away). +A window opens showing you several applications that come with the Anaconda +Distribution. +Now, click on "JupyterLab." + + + +A new tab in your web browser opens with the website being "localhost" and some +number (e.g., 8888). +This is the [JupyterLab](https://jupyterlab.readthedocs.io/en/stable/) +application that is used to display and run the Jupyter notebooks mentioned +above. +On the left, you see the files and folders in your local user folder. +This file browser works like any other. +In the center, you have several options to launch a new notebook file. + + + +Next, to download the course's materials as a ZIP file, click on the green +"Clone or download" button on the top right on this website. +Then, unpack the ZIP file into a folder of your choosing, ideally somewhere +within your personal user folder so that the files show up right away in +JupyterLab. -### Alternative Installation +### Alternative Installation (for Instructors) Python can also be installed in a "pure" way as obtained from its core development team (i.e., without any third-party packages installed). -However, this is somewhat too "advanced" for a beginner as it involves working -with a terminal emulator, which looks similar to the picture below and is -used without a mouse by typing commands into it. +However, this may be too "advanced" for a beginner as it involves working +with a [terminal emulator](https://en.wikipedia.org/wiki/Terminal_emulator), +which looks like the one in the picture below and is used *without* a mouse by +typing commands into it. Assuming that you already have a working version of Python 3.7 or higher installed (cf., the official [download page](https://www.python.org/downloads/)), the following summarizes the commands to be typed into a terminal emulator to -get the course materials up and running on a local machine without Anaconda. +get the course materials up and running on a local machine without the +Anaconda Distribution. You are then responsible for understanding the concepts behind them. First, the [git](https://git-scm.com/) command line tool is a more professional @@ -156,17 +175,23 @@ are popular tools to automate the described management of virtual environments. After activation for the first time, you must install the project's **dependencies** (= the third-party packages needed to run the code), most -notably [Jupyter](https://pypi.org/project/jupyter/) in this project (the -"python -m" is often left out [but should not be](https://snarky.ca/why-you-should-use-python-m-pip/); +notably [JupyterLab](https://pypi.org/project/jupyterlab/) in this project +(the "python -m" is often left out [but should not be](https://snarky.ca/why-you-should-use-python-m-pip/); if you have poetry installed, you may just type `poetry install` instead). - `python -m pip install -r requirements.txt` +The *requirements.txt* file also installs the [black](https://github.com/psf/black) +tool (incl. the [blackcellmagic](https://github.com/csurfer/blackcellmagic) +extension) and the [RISE](https://github.com/damianavila/RISE) extension. +With them, the instructor can easily re-format code in a class session and +execute code in presentation mode (currently RISE only works with the +older `jupyter notebook` command). With everything installed, you can now do the equivalent of clicking the -"Jupyter Notebook" entry in your start menu. +"JupyterLab" entry in the Anaconda Navigator. -- `jupyter notebook` +- `jupyter lab` This opens a new tab in your web browser just as above. diff --git a/static/anaconda.png b/static/anaconda.png deleted file mode 100644 index f82cbfa6c4db758358f17de439b31d3f45e49711..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142513 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 diff --git a/static/anaconda_navigator.png b/static/anaconda_navigator.png new file mode 100644 index 0000000000000000000000000000000000000000..5b35574836f666e5c6b34503f51348d25ac2fe46 GIT binary patch literal 317986 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%0Dp+^aytqg4qOusMLs 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�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

}LV`DPVoZ1er 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 literal 0 HcmV?d00001 diff --git a/static/anaconda_start_menu.png b/static/anaconda_start_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..e7120648b32887ba0ce80304df27e9cd2f989855 GIT binary patch literal 187769 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