diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..3ec9613 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,125 @@ +# ============================================================ +# .editorconfig (Keep files consistent across editors and IDEs) +# ============================================================ + +# REQ.UNIVERSAL: All professional GitHub project repositories MUST include .editorconfig. +# WHY: Establish a cross-editor baseline so diffs stay clean and formatting is consistent. +# ALT: Repository may omit .editorconfig ONLY if formatting is enforced equivalently by CI and formatter tooling. +# CUSTOM: Adjust indent_size defaults only if organizational standards change; keep stable across projects. +# NOTE: Sections are ordered by editorial importance, not strict alphabetical order. +# EditorConfig is documented at https://editorconfig.org + +root = true + +# === Global defaults (always apply) === + +[*] +# WHY: Normalize line endings and encoding across Windows, macOS, and Linux. +end_of_line = lf +charset = utf-8 + +# WHY: Newline at EOF avoids noisy diffs and tool warnings. +insert_final_newline = true + +# WHY: Remove accidental whitespace noise in diffs. +trim_trailing_whitespace = true + +# WHY: Default to 2 spaces for configs and markup; language-specific overrides follow. +indent_style = space +indent_size = 2 + + +# === Build systems (special rules) === + +[Makefile] +# WHY: Makefiles require tabs. +indent_style = tab + +[*.mk] +# WHY: Makefile includes require tabs. +indent_style = tab + + +# === Citation and metadata === + +[CITATION.cff] +# WHY: Citation tooling expects stable YAML formatting. +indent_size = 2 +indent_style = space + + +# === Markup and documentation === + +[*.md] +# WHY: Keep Markdown clean; use explicit
for hard line breaks. +indent_size = 2 +trim_trailing_whitespace = true + +[*.{tex,cls,sty}] +# WHY: LaTeX convention is 2 spaces. +indent_size = 2 +indent_style = space + +[*.xml] +# WHY: XML convention is 2 spaces. +indent_size = 2 +indent_style = space + +[*.{yml,yaml}] +# WHY: YAML convention is 2 spaces. +indent_size = 2 +indent_style = space + + +# === Data and configuration === + +[*.{json,jsonc,jsonl,ndjson}] +# WHY: JSON tooling typically expects 2 spaces. +indent_size = 2 +indent_style = space + +[*.toml] +# WHY: TOML often follows 4-space indentation in many projects. +indent_size = 4 +indent_style = space + + +# === Programming languages === + +[*.{js,ts}] +# WHY: JS/TS ecosystem commonly uses 2 spaces. +indent_size = 2 +indent_style = space + +[*.{py,pyi}] +# WHY: Python convention is 4 spaces. +indent_size = 4 +indent_style = space + +[*.ps1] +# WHY: PowerShell convention is 4 spaces. +indent_size = 4 +indent_style = space + +[*.{c,cpp,h,java,cs,go,rs}] +# WHY: Many C-family and systems languages commonly use 4 spaces. +indent_size = 4 +indent_style = space + +[*.{sh,bash}] +# WHY: Shell script convention is 2 spaces. +indent_size = 2 +indent_style = space + + +# === Proof assistants and formal languages === + +[*.lean] +# WHY: Lean 4 convention is 2 spaces; matches Mathlib and stdlib style. +indent_size = 2 +indent_style = space + +[*.{v,vo}] +# WHY: Coq convention is 2 spaces. +indent_size = 2 +indent_style = space diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..32a9a4d --- /dev/null +++ b/.gitattributes @@ -0,0 +1,130 @@ +# ============================================================ +# .gitattributes (Keep files consistent across operating systems) +# ============================================================ + +# REQ.UNIVERSAL: All professional GitHub project repositories MUST include .gitattributes. +# WHY: Ensure consistent line endings, diff behavior, and file classification +# across Windows, macOS, and Linux environments. +# ALT: Repository may omit .gitattributes ONLY if equivalent normalization is +# enforced reliably by tooling and CI (rare and fragile). +# CUSTOM: Update file-type rules only when introducing new languages, +# binary artifacts, or documentation formats. +# NOTE: Rules are ordered by impact and generality, not alphabetically. +# Git attributes are documented at https://git-scm.com/docs/gitattributes + +# === Core defaults (always apply) === + +# WHY: Auto-detect text files and normalize line endings to avoid cross-platform drift. +* text=auto + + +# === Programming languages and scripts === + +# WHY: Python and shell scripts must use LF for CI/CD, Linux environments, and containers. +*.py text eol=lf +*.sh text eol=lf + +# WHY: PowerShell convention on Windows uses CRLF. +*.ps1 text eol=crlf + + +# === Markup and documentation === + +# WHY: Documentation and markup files use LF; standard for cross-platform tooling. +*.md text eol=lf +*.tex text eol=lf +*.sty text eol=lf +*.cls text eol=lf +*.bib text eol=lf + + +# === Configuration and structured text === + +# WHY: Configuration and structured text formats use LF for stable diffs. +*.json text eol=lf +*.jsonc text eol=lf +*.jsonl text eol=lf +*.ndjson text eol=lf +*.toml text eol=lf +*.yaml text eol=lf +*.yml text eol=lf + + +# === Proof assistants and formal languages === + +# WHY: Lean source files must use LF for cross-platform consistency and CI. +*.lean text eol=lf + +# WHY: Lean build artifacts are binary; prevent normalization and meaningless diffs. +*.olean binary +*.ilean binary +*.trace binary + +# WHY: Coq source uses LF; compiled objects are binary. +*.v text eol=lf +*.vo binary +*.vok binary +*.vos binary +*.glob binary + +# WHY: Lake build directory should be excluded, but if tracked, treat as binary. +.lake/** binary + + +# === Notebooks === + +# WHY: Jupyter notebooks require specialized diff and merge handling. +*.ipynb diff=jupyternotebook +*.ipynb merge=jupyternotebook + + +# === Databases (binary) === + +# WHY: Database files are binary; prevent text normalization and meaningless diffs. +*.db binary +*.duckdb binary +*.sqlite binary +*.sqlite3 binary + + +# === Columnar and analytical data (binary) === + +# WHY: Columnar and analytical data formats are binary; diffs are not meaningful. +*.arrow binary +*.avro binary +*.feather binary +*.orc binary +*.parquet binary + + +# === Office, BI, PDFs, and compressed artifacts (binary) === + +# WHY: Office documents, BI files, PDFs, and compressed artifacts are binary. +*.7z binary +*.bz2 binary +*.docx binary +*.gz binary +*.pbix binary +*.pbit binary +*.pdf binary +*.pptx binary +*.rar binary +*.tar binary +*.tgz binary +*.xls binary +*.xlsm binary +*.xlsx binary +*.xz binary +*.zip binary + + +# === GitHub metadata and UI === + +# WHY: Exclude documentation and tests from GitHub language statistics. +docs/** linguist-documentation +tests/** linguist-documentation + +# === LOG FILES === +# WHY: Log files are typically large and binary in nature; prevent text normalization. +*.log binary +project.log binary diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4dece6f --- /dev/null +++ b/.gitignore @@ -0,0 +1,113 @@ +# ============================================================ +# .gitignore (Keep unnecessary files out of the repository) +# ============================================================ + +# REQ.UNIVERSAL: All professional GitHub project repositories MUST include .gitignore. +# WHY: Prevent committing generated artifacts, local state, secrets, and OS-specific files. +# ALT: Repository may customize ignores, but MUST preserve universal safety rules. +# CUSTOM: Logs may be temporarily committed for verification; keep ignored for +# production use and security. + +# === DIETEL PROJECT SPECIFIC RULES === + +# WHY: Textbook examples are available at https://github.com/pdeitel/IntroToPython +examples/ + +# === Universal (all projects, all languages) === + +# WHY: Logs are useful during debugging and verification. +# ALT: Comment if logs must be inspected or validated. +*.log +logs/ +PRIVATE_NOTES.md +PRIVATE-NOTES.md + +# WHY: Temporary and swap files are machine-local noise and create meaningless diffs. +*.swo +*.swp +*.tmp +*~ + +# === VS Code (special case) === + +# WHY: Ignore editor state while allowing a shared baseline configuration. +.vscode/ + +# WHY: Commit recommended extensions (opt-in) for consistent development experience. +# NOTE: Share recommendations, not personal editor styles or preferences. +!.vscode/extensions.json +!.vscode/settings.json + +# === OS-specific files (macOS / Windows) === + +# WHY: OS-generated metadata files should never be tracked. +.AppleDouble +.DS_Store +.LSOverride +Icon\r +._* +.Spotlight-V100/ +.Trashes +desktop.ini +ehthumbs.db +Thumbs.db + +# === Editors / IDEs (non-VS Code) === + +# WHY: IDE metadata is machine-local and should not be tracked. +*.code-workspace +.idea/ + +# === Environment variables and secrets === + +# WHY: Never commit credentials or environment-specific configuration. +.env +.env.* +*.env + +# === Documentation build output === + +# WHY: Static site build output is generated. +site/ + +# === Generic caches === + +# WHY: Generic caches are machine-local and should not be tracked. +.cache/ + +# === Python === + +# WHY: Virtual environments are machine-local and reproducible. +.venv/ +venv/ + +# REQ.PYTHON: Do NOT git ignore uv.lock. Commit it and use it in CI/CD pipelines. + +# WHY: Python version when using scm matches any repo depth and any package name +**/src/**/_version.py + +# WHY: Python bytecode is generated. +__pycache__/ +*.pyc +*.pyd +*.pyo + +# WHY: Build and packaging artifacts are generated. +.eggs/ +build/ +dist/ +*.egg +*.egg-info/ +*.whl + +# WHY: Tooling caches should not be tracked. +.coverage +.coverage.* +.mypy_cache/ +.pytest_cache/ +.pytype/ +.ruff_cache/ +.tox/ + +# WHY: Notebook checkpoint state is generated. +.ipynb_checkpoints/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..be943bd --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,124 @@ +# ============================================================ +# .pre-commit-config.yaml (Python Hygiene) +# ============================================================ +# VARIANT: python-hygiene +# SOURCE: https://github.com/denisecase/templates +# +# REQ: Professional Python projects SHOULD include a .pre-commit-config.yaml +# to minimize git diffs and support collaboration. +# WHY: Provide fast, consistent checks before committing code. +# +# OBS: These hooks use and do NOT override: +# - .editorconfig (whitespace / indentation) +# - .gitattributes (EOL normalization) +# - pyproject.toml (Python tool settings) +# +# OPTIONAL LOCAL USAGE (no repo venv required): +# You must have uv installed locally. +# Run these commands ONCE in from the repo root to enable pre-commit: +# +# uv self update +# uvx pre-commit install +# uvx pre-commit run --all-files +# +# This enables the pre-commit hooks for this project repo. +# ALL subsequent commits in this repo will AUTOMATICALLY run these +# pre-commit hooks, after `git add` and before `git commit`. +# +# NOTE: enabling pre-commit is optional. It is not needed to clone or commit. + +exclude: | + (?x)^( + \.DS_Store| + \.coverage| + \.ipynb_checkpoints/| + \.mypy_cache/| + \.nox/| + \.pytest_cache/| + \.ruff_cache/| + \.tox/| + \.venv/| + .*\.(egg-info)/| + .*\.log| + __pycache__/| + _minted.*/| + build/| + coverage\.xml| + dist/| + htmlcov/| + lake-packages/| + node_modules/| + out/| + site/ + ) + +repos: + # === REPO: PRE-COMMIT HOOKS (cross-platform, zero config) === + # + # These hooks prevent problems that show up later as: + # - mysterious diffs + # - broken builds on another OS + + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v6.0.0 + hooks: + # === PRE-COMMIT: NORMALIZE FILE FORMATTING === + + - id: trailing-whitespace + name: A1) Clean trailing whitespace (per .editorconfig) + args: [--markdown-linebreak-ext=md] # Preserves markdown double-space line breaks + + - id: end-of-file-fixer + name: A2) End files with a newline (per .gitattributes) + + - id: mixed-line-ending + name: A3) Normalize line endings to LF before linters + args: [--fix=lf] # OBS: Windows working copies may be CRLF. + + # === PRE-COMMIT: CHECK DATA FILE FORMATS === + + - id: check-json + name: B1) Validate JSON syntax (except .vscode/) + # WHY: VSCode settings may include comments, which are non-standard JSON. + exclude: ^\.vscode/.*\.json$ + + - id: check-toml + name: B2) Validate TOML syntax + + - id: check-yaml + name: B3) Validate YAML syntax + files: \.(yml|yaml)$ + # WHY: + # VS Code config files are editor-specific + # mkdocs.yml may use YAML anchors not supported by the checker + exclude: ^(\.vscode/|mkdocs\.ya?ml$) + + # === PRE-COMMIT:CHECK FOR COMMON PROBLEMS === + + - id: check-added-large-files + name: C1) Prevent accidental commits of large binaries + args: [--maxkb=500] + + - id: check-merge-conflict + name: C2) Prevent committing merge conflicts + + - id: check-case-conflict + name: C3) Check for filename case conflicts + + # === REPO: RUFF PRE-COMMIT (for Python code) === + + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.8.4 + hooks: + # === RUFF PRE-COMMIT CHECKS === + - id: ruff-format + name: D1) Ruff format (before linting) + + - id: ruff + name: D2) Ruff linter (autofix errors, style issues ) + args: [--fix, --exit-non-zero-on-fix] + + +# === GLOBAL SETTINGS === +# ALT: Set fail_fast to true to stop at first failure. +fail_fast: false # Run all hooks even if one fails diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..6324d40 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.14 diff --git a/.yamllint.yml b/.yamllint.yml new file mode 100644 index 0000000..d88fc39 --- /dev/null +++ b/.yamllint.yml @@ -0,0 +1,15 @@ +# ============================================================ +# .yamllint.yml (Keep YAML files clean and consistent) +# ============================================================ + +# WHY: Enforce YAML correctness (.yamllint.yml) without arbitrary style constraints. +# OBS: Default yamllint rules conflict with GitHub Actions YAML. +# Line length, document start, truthy, and comment spacing are intentionally disabled. + +extends: default + +rules: + line-length: disable + document-start: disable + truthy: disable + comments: disable diff --git a/ANNOTATIONS.md b/ANNOTATIONS.md new file mode 100644 index 0000000..99a351b --- /dev/null +++ b/ANNOTATIONS.md @@ -0,0 +1,10 @@ +# Annotations + + + +This repository uses the annotation standard defined at: + diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000..0f16cbd --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,66 @@ +# ============================================================ +# CITATION.cff (Citation File Format) +# ============================================================ + +# REQ.UNIVERSAL: Professional open projects SHOULD include CITATION.cff. +# WHY: Support correct citation and attribution. +# USAGE: Update fields below; see https://citation-file-format.github.io/ for details. + +cff-version: "1.2.0" +type: software + +title: "IntroToPython: Tooling and Local Setup" +version: "0.1.0" +date-released: "2026-01-06" + +authors: + - family-names: Case + given-names: Denise M. + orcid: "https://orcid.org/0000-0001-6165-7389" + affiliation: "Northwest Missouri State University, School of Computer Science and Information Systems, Maryville, MO, USA" + +repository-code: "https://github.com/denisecase/IntroToPython" +url: "https://github.com/denisecase/IntroToPython" +license: MIT + +abstract: > + Tooling and setup notes for working with the textbook example code from + "Intro to Python for Computer Science and Data Science". This repository + does not redistribute the book's example files; it provides reproducible + local setup and run instructions. + +keywords: + - python + - education + - textbook + - programming + - development-environment + - reproducible-setup + - uv + - git + +references: + - type: book + title: "Intro to Python for Computer Science and Data Science: Learning to Program with AI, Big Data and the Cloud" + authors: + - family-names: Deitel + given-names: Paul + - family-names: Deitel + given-names: Harvey + publisher: + name: "Pearson Education, Inc." + year: 2020 + +preferred-citation: + type: book + title: "Intro to Python for Computer Science and Data Science: Learning to Program with AI, Big Data and the Cloud" + authors: + - family-names: Deitel + given-names: Paul + - family-names: Deitel + given-names: Harvey + publisher: + name: "Pearson Education, Inc." + year: 2020 + +message: "If you use this repository, please cite the book (preferred) and/or this tooling repo as appropriate." diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8f61eaf --- /dev/null +++ b/LICENSE @@ -0,0 +1,33 @@ +MIT License + +Copyright (c) 2026 Denise Case + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +--- + +This license applies only to the tooling, documentation, and configuration +files in this repository. + +Example code from the textbook +"Intro to Python for Computer Science and Data Science" +by Paul Deitel and Harvey Deitel is NOT included in this repository +and remains Copyright © Pearson Education, Inc. + +See diff --git a/NOTICE.md b/NOTICE.md new file mode 100644 index 0000000..87eb856 --- /dev/null +++ b/NOTICE.md @@ -0,0 +1,5 @@ +# ============================================================ +# NOTICE.md +# ============================================================ + +This repository does not redistribute textbook example files. diff --git a/README.md b/README.md index 643aa76..e2cf7c3 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,112 @@ # IntroToPython -This repository contains the source code and supporting files associated with our book: _Intro to Python for Computer Science and Data Science: Learning to Program with AI, Big Data and the Cloud_. - -![Cover image for Intro to Python for Computer Science and Data Science: - Learning to Program with AI, Big Data and the Cloud](https://deitel.com/wp-content/uploads/2020/01/intro-to-python-for-computer-science-and-data-science.jpg) -These files are Copyright 2020 by Pearson Education, Inc. All Rights Reserved. +> Developer tooling for [IntroToPython](https://github.com/pdeitel/IntroToPython/) -You may use these files for your personal purposes, but please do not repost them without our express written consent. +This repository does NOT redistribute example files from the Deitel/Pearson book. +Students must obtain the book and its accompanying materials separately. -If you have any questions, open an issue in the Issues tab or email us: deitel at deitel dot com. +Note: +Due to evolving software and incomplete snippets, not all code will run without additional work. +This repo is used to make much of the code runnable or inspectable in VS Code. -The authors and publisher of this book have used their best efforts in preparing this book. These efforts include the development, research, and testing of the theories and programs to determine their effectiveness. The authors and publisher make no warranty of any kind, expressed or implied, with regard to these programs or to the documentation contained in this book. The authors and publisher shall not be liable in any event for incidental or consequential damages in connection with, or arising out of, the furnishing, performance, or use of these programs. +## Recommended Installations + +- git +- Python +- VS Code (and extensions) + +## Developer + +This repository provides a professional working environment; +the book examples are added locally. + +### 1. Clone this repo + +```shell +git clone https://github.com/denisecase/IntroToPython +cd IntroToPython +code . +``` + +### 2. Obtain the textbook example files + +- See the official Deitel repository at . +- Copy the book's `examples/` folder into this repository. +- Ensure `examples/` is parallel to the `images/` folder (both in root). + +### 3. Install `uv` + +- See [Step 3: Install Tools](https://denisecase.github.io/pro-analytics-02/01-set-up-machine/) for instructions by operating system. + +### 4. Initialize (Just Once) + +Use VS Code menu option `Terminal` / `New Terminal` to open a **VS Code terminal** in the root project folder. +Run the following commands, one at a time, hitting ENTER after each: + +```shell +uv self update +uv python pin 3.14 +uv sync --extra dev --extra docs --upgrade + +# the audio features require additional installs +# start by adding the [audio] packages listed in pyproject.toml: +uv sync --extra dev --extra docs --extra audio --upgrade +``` + +If asked: "We noticed a new environment has been created. Do you want to select it for the workspace folder?" Click **"Yes"**. + +If successful, you'll see a new `.venv` folder appear in the root project folder. + +### 5. Run Individual Examples + +If you see something like this, click "Install". + + ![Popup](./images/install.gif) + +Run a file (e.g., the Roll Die Dynamic simulation): + +```shell +uv run python examples\ch01\RollDieDynamic.py 100 1 +``` + +If a window pops up, close the window (or if needed, **delete the terminal**) to continue. + +Open Notebooks and Click `Run All`. Select the kernel associated with this repo `.venv`. + +### 6. Save Progress (As Needed) + +If you update your copy of the examples, you might want to save progress. + +```shell +git add -A +git commit -m "update" +git push -u origin main +``` + +## Citation + +This repository does not redistribute textbook example files. +If you add the Deitel/Pearson examples locally, please respect the book's copyright +and do not publish or redistribute those files. + +[CITATION.cff](./CITATION.cff) + +## License + +[MIT](./LICENSE) + +## Notice + +[NOTICE.md](./NOTICE.md) + +## UPSTREAM + +[UPSTREAM.md](./UPSTREAM.md) + +## Annotations + +[Annotations.md](./ANNOTATIONS.md) + +## SE MANIFEST + +[SE_MANIFEST.toml](./SE_MANIFEST.toml) diff --git a/SE_MANIFEST.toml b/SE_MANIFEST.toml new file mode 100644 index 0000000..7dcda74 --- /dev/null +++ b/SE_MANIFEST.toml @@ -0,0 +1,77 @@ +# ============================================================ +# SE_MANIFEST.toml (Repository Intent, Scope, and Role) +# ============================================================ + +schema = "se-manifest-1" +schema_url = "https://github.com/structural-explainability/spec-se/blob/main/manifests/se-manifest-1.md" + +[meta] +# Non-normative contextual information +framework = "Structural Explainability" +framework_url = "https://github.com/structural-explainability" +framework_note = "Provides definitions and conventions for SE_MANIFEST semantics." + +description = "Declarative claim of repository intent, scope, and role." +purpose = "To make explicit the boundaries, responsibilities, and expectations of this repository relative to others." +keywords_note = "Keywords live only in CITATION.cff (canonical)." + +upstream = "https://github.com/pdeitel/IntroToPython" +upstream_note = "Canonical textbook repository; this project provides tooling and setup only and does not redistribute example files." + +[repo] +name = "IntroToPython" +org = "denisecase" +kind = "software" +status = "academic" +since = "2026" +summary = "Tooling and setup support for working with the Deitel IntroToPython textbook examples (no example code redistributed)." + +[layer] +space = "Software Engineering" +role = "curriculum-support" + +[depends] +# WHY: These tools are required to complete and run the project as designed +# (local development, execution, and dependency management). +required = [ + "python>=3.14", + "uv", +] +# WHY: Optional tools are not required to use or run the repository. +optional = [ + "mkdocs", + "ruff", + "pyright", + "pytest", +] + +[provides] +artifacts = [ + "ANNOTATIONS.md", + "CITATION.cff", + "LICENSE", + "NOTICE.md", + "README.md", + "SE_MANIFEST.toml", +] + +[scope] +includes = [ + "local environment setup for textbook examples", + "reproducible execution instructions", + "tooling configuration (pyproject, uv)", + "student-safe development workflow", +] +excludes = [ + "redistribution of textbook example code", + "modification of textbook content", + "reinterpretation of pedagogical material", +] + +[citation] +cff = "CITATION.cff" +preferred = "book" +bib_hint = "deitel2020-introtopython" + +[traceability] +identifier_map = "none" diff --git a/UPSTREAM.md b/UPSTREAM.md new file mode 100644 index 0000000..f3a9152 --- /dev/null +++ b/UPSTREAM.md @@ -0,0 +1,55 @@ +# UPSTREAM.md + +## Upstream Relationship + +This repository is NOT the upstream source of the textbook materials. + +The authoritative upstream repository for the book +**_Intro to Python for Computer Science and Data Science: Learning to Program with AI, Big Data and the Cloud_** +by Paul Deitel and Harvey Deitel is maintained by the authors at +. + +That repository contains example source code and supporting materials +associated with the textbook, which are © Pearson Education, Inc. + +## Purpose of This Repository + +This repository is a **tooling and setup companion** intended to support: + +- local execution of example code +- modern Python environment setup +- reproducible developer workflows +- VS Code–based inspection and experimentation + +It does NOT redistribute textbook example files. + +Students and instructors must obtain the textbook and any associated +materials separately. + +## Scope of Changes + +This repository may include: + +- `pyproject.toml` and environment configuration +- dependency and tooling notes +- developer documentation +- CI and hygiene configuration +- annotations about execution issues or incompatibilities + +It does NOT claim correctness, completeness, or equivalence with +the textbook examples. + +## Attribution + +All textbook content, examples, and intellectual property remain the +exclusive property of their respective authors and publisher. + +See the upstream repository and book for canonical materials. + +## Questions + +Questions about textbook content should be directed to the authors +or publisher. + +Questions about tooling or environment setup in this repository may be +raised via GitHub issues. diff --git a/examples/ch01/RollDieDynamic.py b/examples/ch01/RollDieDynamic.py deleted file mode 100755 index 45845fc..0000000 --- a/examples/ch01/RollDieDynamic.py +++ /dev/null @@ -1,59 +0,0 @@ -# RollDieDynamic.py -"""Dynamically graphing frequencies of die rolls.""" -from matplotlib import animation -import matplotlib.pyplot as plt -import random -import seaborn as sns -import sys - -def update(frame_number, rolls, faces, frequencies): - """Configures bar plot contents for each animation frame.""" - # roll die and update frequencies - for i in range(rolls): - frequencies[random.randrange(1, 7) - 1] += 1 - - # reconfigure plot for updated die frequencies - plt.cla() # clear old contents contents of current Figure - axes = sns.barplot(x=faces, y=frequencies, palette='bright') # new bars - axes.set_title(f'Die Frequencies for {sum(frequencies):,} Rolls') - axes.set(xlabel='Die Value', ylabel='Frequency') - axes.set_ylim(top=max(frequencies) * 1.10) # scale y-axis by 10% - - # display frequency & percentage above each patch (bar) - for bar, frequency in zip(axes.patches, frequencies): - text_x = bar.get_x() + bar.get_width() / 2.0 - text_y = bar.get_height() - text = f'{frequency:,}\n{frequency / sum(frequencies):.3%}' - axes.text(text_x, text_y, text, ha='center', va='bottom') - -# read command-line arguments for number of frames and rolls per frame -number_of_frames = int(sys.argv[1]) -rolls_per_frame = int(sys.argv[2]) - -sns.set_style('whitegrid') # white backround with gray grid lines -figure = plt.figure('Rolling a Six-Sided Die') # Figure for animation -values = list(range(1, 7)) # die faces for display on x-axis -frequencies = [0] * 6 # six-element list of die frequencies - -# configure and start animation that calls function update -die_animation = animation.FuncAnimation( - figure, update, repeat=False, frames=number_of_frames - 1, interval=33, - fargs=(rolls_per_frame, values, frequencies)) - -plt.show() # display window - - -#************************************************************************** -#* (C) Copyright 1992-2018 by Deitel & Associates, Inc. and * -#* Pearson Education, Inc. All Rights Reserved. * -#* * -#* DISCLAIMER: The authors and publisher of this book have used their * -#* best efforts in preparing the book. These efforts include the * -#* development, research, and testing of the theories and programs * -#* to determine their effectiveness. The authors and publisher make * -#* no warranty of any kind, expressed or implied, with regard to these * -#* programs or to the documentation contained in these books. The authors * -#* and publisher shall not be liable in any event for incidental or * -#* consequential damages in connection with, or arising out of, the * -#* furnishing, performance, or use of these programs. * -#************************************************************************** diff --git a/examples/ch01/snippets_ipynb/IPython_selfcheck.ipynb b/examples/ch01/snippets_ipynb/IPython_selfcheck.ipynb deleted file mode 100644 index 2d8cb19..0000000 --- a/examples/ch01/snippets_ipynb/IPython_selfcheck.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Evaluate the expression `5 * (3 + 4)` both with and without the parentheses. Do you get the same result? Why or why not?\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "5 * (3 + 4)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "5 * 3 + 4" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch01/snippets_ipynb/TestDrive.ipynb b/examples/ch01/snippets_ipynb/TestDrive.ipynb deleted file mode 100644 index b8f8915..0000000 --- a/examples/ch01/snippets_ipynb/TestDrive.ipynb +++ /dev/null @@ -1,122 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "117" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "45 + 72" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "21.75" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "5 * (12.7 - 4) / 2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Ensure that JupyterLab is running, then open your `TestDrive.ipynb` notebook. Add and execute two more snippets that evaluate the expression `5 * (3 + 4)` both with and without the parentheses. \n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "5 * (3 + 4)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "5 * 3 + 4" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch01/snippets_ipynb/files/art/check.png b/examples/ch01/snippets_ipynb/files/art/check.png deleted file mode 100755 index eea18cd..0000000 Binary files a/examples/ch01/snippets_ipynb/files/art/check.png and /dev/null differ diff --git a/examples/ch02/fig02_01.py b/examples/ch02/fig02_01.py deleted file mode 100755 index e6f1c52..0000000 --- a/examples/ch02/fig02_01.py +++ /dev/null @@ -1,44 +0,0 @@ -# fig02_01.py -"""Compare integers using if statements and comparison operators.""" - -print('Enter two integers and I will tell you', - 'the relationships they satisfy.') - -# read first integer -number1 = int(input('Enter first integer: ')) - -# read second integer -number2 = int(input('Enter second integer: ')) - -if number1 == number2: - print(number1, 'is equal to', number2) - -if number1 != number2: - print(number1, 'is not equal to', number2) - -if number1 < number2: - print(number1, 'is less than', number2) - -if number1 > number2: - print(number1, 'is greater than', number2) - -if number1 <= number2: - print(number1, 'is less than or equal to', number2) - -if number1 >= number2: - print(number1, 'is greater than or equal to', number2) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch02/fig02_02.py b/examples/ch02/fig02_02.py deleted file mode 100755 index 7229494..0000000 --- a/examples/ch02/fig02_02.py +++ /dev/null @@ -1,31 +0,0 @@ -# Fig. 2.2: fig02_02.py -"""Find the minimum of three values.""" - -number1 = int(input('Enter first integer: ')) -number2 = int(input('Enter second integer: ')) -number3 = int(input('Enter third integer: ')) - -minimum = number1 - -if number2 < minimum: - minimum = number2 - -if number3 < minimum: - minimum = number3 - -print('Minimum value is', minimum) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch02/snippets_ipynb/02_02.ipynb b/examples/ch02/snippets_ipynb/02_02.ipynb deleted file mode 100644 index 052264a..0000000 --- a/examples/ch02/snippets_ipynb/02_02.ipynb +++ /dev/null @@ -1,161 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 2.2 Variables and Assignment Statements" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "45 + 72" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x = 7" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "y = 3" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Adding Variable Values and Viewing the Result" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x + y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Calculations in Assignment Statements" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "total = x + y" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "total" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Python Style" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Variable Names" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Types" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "type(x)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "type(10.5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch02/snippets_ipynb/02_02selfcheck.ipynb b/examples/ch02/snippets_ipynb/02_02selfcheck.ipynb deleted file mode 100644 index e49cd67..0000000 --- a/examples/ch02/snippets_ipynb/02_02selfcheck.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 2.2 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**_(IPython Session)_** Calculate the sum of `10.8`, `12.2` and `0.2`, store it in the variable `total`, then display `total`’s value. \n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "total = 10.7 + 12.2 + 0.2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "total" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch02/snippets_ipynb/02_03.ipynb b/examples/ch02/snippets_ipynb/02_03.ipynb deleted file mode 100644 index 2dd6ee5..0000000 --- a/examples/ch02/snippets_ipynb/02_03.ipynb +++ /dev/null @@ -1,258 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 2.3 Arithmetic" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Multiplication (`*`)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "7 * 4" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exponentiation (`**`)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "2 ** 10" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "9 ** (1 / 2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### True Division (`/`) vs. Floor Division (`//`)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "7 / 4" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "7 // 4" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "3 // 5" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "14 // 7" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "-13 / 4" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "-13 // 4" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exceptions and Tracebacks" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "123 / 0" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "z + 7" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Remainder Operator" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "17 % 5" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "7.5 % 3.5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Straight-Line Form" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Grouping Expressions with Parentheses" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "10 * (5 + 3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "10 * 5 + 3" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Operator Precedence Rules\n", - "\n", - "### Operator Grouping\n", - "\n", - "### Redundant Parentheses\n", - "\n", - "### Operand Types" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch02/snippets_ipynb/02_03selfcheck.ipynb b/examples/ch02/snippets_ipynb/02_03selfcheck.ipynb deleted file mode 100644 index bd26e7e..0000000 --- a/examples/ch02/snippets_ipynb/02_03selfcheck.ipynb +++ /dev/null @@ -1,127 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 2.3 Self Check\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Evaluate the expression `3 * (4 - 5)` with and without parentheses. Are the parentheses redundant?\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "3 * (4 - 5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "3 * 4 - 5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The parentheses are not redundant—if you remove them the resulting value is different.\n", - "\n", - "**4. _(IPython Session)_** Evaluate the expressions `4 ** 3 ** 2`, `(4 ** 3) ** 2` and `4 ** (3 ** 2)`. Are any of the parentheses redundant?\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "4 ** 3 ** 2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "(4 ** 3) ** 2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "4 ** (3 ** 2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Only the parentheses in the last expression are redundant." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch02/snippets_ipynb/02_04.ipynb b/examples/ch02/snippets_ipynb/02_04.ipynb deleted file mode 100755 index 15000c6..0000000 --- a/examples/ch02/snippets_ipynb/02_04.ipynb +++ /dev/null @@ -1,139 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 2.4 Function print and an Intro to Single-and-Double-Quoted Strings" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('Welcome to Python!')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"Welcome to Python!\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Printing a Comma-Separated List of Items" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('Welcome', 'to', 'Python!')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Printing Many Lines of Text with One Statement" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('Welcome\\nto\\n\\nPython!')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Other Escape Sequences\n", - "\n", - "### Ignoring a Line Break in a Long String" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('this is a longer string, so we \\\n", - "split it over two lines')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Printing the Value of an Expression" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('Sum is', 7 + 3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch02/snippets_ipynb/02_04selfcheck.ipynb b/examples/ch02/snippets_ipynb/02_04selfcheck.ipynb deleted file mode 100755 index 0072cd5..0000000 --- a/examples/ch02/snippets_ipynb/02_04selfcheck.ipynb +++ /dev/null @@ -1,95 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 2.4 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Write an expression that displays the type of `'word'`.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "type('word')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**4. _(IPython Session)_** What does the following print statement display?\n", - "\n", - "```\n", - "print('int(5.2)', 'truncates 5.2 to', int(5.2))\n", - "```\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('int(5.2)', 'truncates 5.2 to', int(5.2))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch02/snippets_ipynb/02_05.ipynb b/examples/ch02/snippets_ipynb/02_05.ipynb deleted file mode 100755 index de8c4f0..0000000 --- a/examples/ch02/snippets_ipynb/02_05.ipynb +++ /dev/null @@ -1,150 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 2.5 Triple-Quoted Strings" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Including Quotes in Strings" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('Display \"hi\" in quotes')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('Display 'hi' in quotes')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('Display \\'hi\\' in quotes')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"Display the name O'Brien\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"Display \\\"hi\\\" in quotes\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"\"\"Display \"hi\" and 'bye' in quotes\"\"\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Multiline Strings" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "triple_quoted_string = \"\"\"This is a triple-quoted\n", - "string that spans two lines\"\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(triple_quoted_string)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "triple_quoted_string" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch02/snippets_ipynb/02_05selfcheck.ipynb b/examples/ch02/snippets_ipynb/02_05selfcheck.ipynb deleted file mode 100755 index d4b5ce0..0000000 --- a/examples/ch02/snippets_ipynb/02_05selfcheck.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 2.5 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "**2. _(IPython Session)_** What displays when you execute the following statement?\n", - "\n", - "````\n", - "print(\"\"\"This is a lengthy\n", - " multiline string containing \n", - "a few lines \\\n", - "of text\"\"\")\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"\"\"This is a lengthy\n", - " multiline string containing \n", - "a few lines \\\n", - "of text\"\"\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch02/snippets_ipynb/02_06.ipynb b/examples/ch02/snippets_ipynb/02_06.ipynb deleted file mode 100755 index e3aa5e5..0000000 --- a/examples/ch02/snippets_ipynb/02_06.ipynb +++ /dev/null @@ -1,221 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 2.6 Getting Input from the User" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "name = input(\"What's your name? \")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "name" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(name)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "name = input(\"What's your name? \")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "name" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(name)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Function `input` Always Returns a String" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "value1 = input('Enter first number: ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "value2 = input('Enter second number: ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "value1 + value2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting an Integer from the User" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "value = input('Enter an integer: ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "value = int(value)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "value" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "another_value = int(input('Enter another integer: '))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "another_value" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "value + another_value" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "bad_value = int(input('Enter another integer: '))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "int(10.5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch02/snippets_ipynb/02_06selfcheck.ipynb b/examples/ch02/snippets_ipynb/02_06selfcheck.ipynb deleted file mode 100755 index 851a93c..0000000 --- a/examples/ch02/snippets_ipynb/02_06selfcheck.ipynb +++ /dev/null @@ -1,74 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 2.6 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "**3. _(IPython Session)_** Use `float` to convert `'6.2'` (a string) to a floating-point value. Multiply that value by `3.3` and show the result. \n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "float('6.2') * 3.3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch02/snippets_ipynb/02_07.ipynb b/examples/ch02/snippets_ipynb/02_07.ipynb deleted file mode 100755 index ffa12e9..0000000 --- a/examples/ch02/snippets_ipynb/02_07.ipynb +++ /dev/null @@ -1,124 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 2.7 Decision Making: The if Statement and Comparison Operators" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "7 > 4" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "7 < 4" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "7 > = 4" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Chaining Comparisons" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x = 3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "1 <= x <= 5" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x = 10" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "1 <= x <= 5" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch02/snippets_ipynb/02_07selfcheck.ipynb b/examples/ch02/snippets_ipynb/02_07selfcheck.ipynb deleted file mode 100755 index 7f30c23..0000000 --- a/examples/ch02/snippets_ipynb/02_07selfcheck.ipynb +++ /dev/null @@ -1,91 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 2.7 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** For any of the operators `!=`, `>=` or `<=`, show that a syntax error occurs if you reverse the symbols in a condition.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "7 =< 10" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**4. _(IPython Session)_** Use all six comparison operators to compare the values `5` and `9`. Display the values on one line using `print`.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(5 < 9, 5 <= 9, 5 > 9, 5 >= 9, 5 == 9, 5 != 9)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch02/snippets_ipynb/02_08.ipynb b/examples/ch02/snippets_ipynb/02_08.ipynb deleted file mode 100755 index 5c2e703..0000000 --- a/examples/ch02/snippets_ipynb/02_08.ipynb +++ /dev/null @@ -1,192 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 2.8 Objects and Dynamic Typing" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "type(7)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "type(4.1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "type('dog')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Variables Refer to Objects" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x = 7" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x + 10" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x = x + 10" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Dynamic Typing" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "type(x)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x = 4.1" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "type(x)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x = 'dog'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "type(x)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Garbage Collection" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch02/snippets_ipynb/02_08selfcheck.ipynb b/examples/ch02/snippets_ipynb/02_08selfcheck.ipynb deleted file mode 100755 index 23b0d7f..0000000 --- a/examples/ch02/snippets_ipynb/02_08selfcheck.ipynb +++ /dev/null @@ -1,75 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 2.8 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "**3. _(IPython Session)_** What is the type of the expression `7.5 * 3`? \n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "type(7.5 * 3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch02/snippets_ipynb/02_09.ipynb b/examples/ch02/snippets_ipynb/02_09.ipynb deleted file mode 100755 index 7c1f075..0000000 --- a/examples/ch02/snippets_ipynb/02_09.ipynb +++ /dev/null @@ -1,79 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 2.9 Intro to Data Science: Basic Descriptive Statistics" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Determining the Minimum and Maximum with Built-In Functions `min` and `max` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "min(36, 27, 12)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "max(36, 27, 12)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch02/snippets_ipynb/02_09selfcheck.ipynb b/examples/ch02/snippets_ipynb/02_09selfcheck.ipynb deleted file mode 100755 index e82bdb2..0000000 --- a/examples/ch02/snippets_ipynb/02_09selfcheck.ipynb +++ /dev/null @@ -1,93 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 2.9 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** For the values `47`, `95`, `88`, `73`, `88` and `84` calculate the minimum, maximum and range.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "min(47, 95, 88, 73, 88, 84)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "max(47, 95, 88, 73, 88, 84)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('Range:', min(47, 95, 88, 73, 88, 84), '-',\n", - " max(47, 95, 88, 73, 88, 84))\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch02/snippets_ipynb/ex02_01.ipynb b/examples/ch02/snippets_ipynb/ex02_01.ipynb deleted file mode 100755 index e4e3349..0000000 --- a/examples/ch02/snippets_ipynb/ex02_01.ipynb +++ /dev/null @@ -1,101 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x = 2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "y = 3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('x =', x) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('Value of', x, '+', x, 'is', (x + x)) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('x =') " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print((x + y), '=', (y + x)) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch02/snippets_ipynb/ex02_02.ipynb b/examples/ch02/snippets_ipynb/ex02_02.ipynb deleted file mode 100755 index 4d25f78..0000000 --- a/examples/ch02/snippets_ipynb/ex02_02.ipynb +++ /dev/null @@ -1,56 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rating = input('Enter an integer rating between 1 and 10: ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch02/snippets_ipynb/ex02_03.ipynb b/examples/ch02/snippets_ipynb/ex02_03.ipynb deleted file mode 100644 index 3cfe3f9..0000000 --- a/examples/ch02/snippets_ipynb/ex02_03.ipynb +++ /dev/null @@ -1,57 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if grade >= 90:\n", - " ***" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch02/snippets_ipynb/ex02_09.ipynb b/examples/ch02/snippets_ipynb/ex02_09.ipynb deleted file mode 100644 index e2e7e94..0000000 --- a/examples/ch02/snippets_ipynb/ex02_09.ipynb +++ /dev/null @@ -1,56 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ord('A')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch02/snippets_ipynb/files/art/check.png b/examples/ch02/snippets_ipynb/files/art/check.png deleted file mode 100755 index eea18cd..0000000 Binary files a/examples/ch02/snippets_ipynb/files/art/check.png and /dev/null differ diff --git a/examples/ch02/snippets_py/02_02.py b/examples/ch02/snippets_py/02_02.py deleted file mode 100644 index dfedb7c..0000000 --- a/examples/ch02/snippets_py/02_02.py +++ /dev/null @@ -1,36 +0,0 @@ -# Section 2.2 snippets -45 + 72 - -x = 7 - -y = 3 - -# Adding Variable Values and Viewing the Result -x + y - -# Calculations in Assignment Statements -total = x + y - -total - -# Python Style - -# Types -type(x) - -type(10.5) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch02/snippets_py/02_02selfcheck.py b/examples/ch02/snippets_py/02_02selfcheck.py deleted file mode 100644 index 684daf0..0000000 --- a/examples/ch02/snippets_py/02_02selfcheck.py +++ /dev/null @@ -1,20 +0,0 @@ -# Section 2.2 Self Check snippets - -total = 10.7 + 12.2 + 0.2 - -total - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch02/snippets_py/02_03.py b/examples/ch02/snippets_py/02_03.py deleted file mode 100644 index a3fad3a..0000000 --- a/examples/ch02/snippets_py/02_03.py +++ /dev/null @@ -1,64 +0,0 @@ -# Section 2.3 snippets - - -# Multiplication (*) -7 * 4 - -# Exponentiation (**) -2 ** 10 - -9 ** (1 / 2) - -# True Division (/) vs. Floor Division (//) -7 / 4 - -7 // 4 - -3 // 5 - -14 // 7 - --13 / 4 - --13 // 4 - -# Exceptions and Tracebacks -123 / 0 - -z + 7 - -# Remainder Operator -17 % 5 - -7.5 % 3.5 - -# Straight-Line Form - -# Grouping Expressions with Parentheses -10 * (5 + 3) - -10 * 5 + 3 - -# Operator Precedence Rules - -# Operator Grouping - -# Redundant Parentheses - -# Operand Types - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch02/snippets_py/02_03selfcheck.py b/examples/ch02/snippets_py/02_03selfcheck.py deleted file mode 100644 index be24441..0000000 --- a/examples/ch02/snippets_py/02_03selfcheck.py +++ /dev/null @@ -1,21 +0,0 @@ -# Section 2.3 Self Check snippets -3 * (4 - 5) -3 * 4 - 5 -4 ** 3 ** 2 -(4 ** 3) ** 2 -4 ** (3 ** 2) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch02/snippets_py/02_04.py b/examples/ch02/snippets_py/02_04.py deleted file mode 100755 index e191182..0000000 --- a/examples/ch02/snippets_py/02_04.py +++ /dev/null @@ -1,34 +0,0 @@ -# Section 2.4 snippets -print('Welcome to Python!') - -print("Welcome to Python!") - -# Printing a Comma-Separated List of Items -print('Welcome', 'to', 'Python!') - -# Printing Many Lines of Text with One Statement -print('Welcome\nto\n\nPython!') - -# Other Escape Sequences - -# Ignoring a Line Break in a Long String -print('this is a longer string, so we \ -split it over two lines') - -# Printing the Value of an Expression -print('Sum is', 7 + 3) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch02/snippets_py/02_04selfcheck.py b/examples/ch02/snippets_py/02_04selfcheck.py deleted file mode 100755 index 13bca1d..0000000 --- a/examples/ch02/snippets_py/02_04selfcheck.py +++ /dev/null @@ -1,18 +0,0 @@ -# Section 2.4 Self Check snippets -type('word') -print('int(5.2)', 'truncates 5.2 to', int(5.2)) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch02/snippets_py/02_05.py b/examples/ch02/snippets_py/02_05.py deleted file mode 100755 index 4cadaf0..0000000 --- a/examples/ch02/snippets_py/02_05.py +++ /dev/null @@ -1,37 +0,0 @@ -# Section 2.5 snippets - -# Including Quotes in Strings -print('Display "hi" in quotes') - -print('Display 'hi' in quotes') - -print('Display \'hi\' in quotes') - -print("Display the name O'Brien") - -print("Display \"hi\" in quotes") - -print("""Display "hi" and 'bye' in quotes""") - -# Multiline Strings -triple_quoted_string = """This is a triple-quoted -string that spans two lines""" - -print(triple_quoted_string) - -triple_quoted_string - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch02/snippets_py/02_05selfcheck.py b/examples/ch02/snippets_py/02_05selfcheck.py deleted file mode 100755 index 29093b3..0000000 --- a/examples/ch02/snippets_py/02_05selfcheck.py +++ /dev/null @@ -1,20 +0,0 @@ -# Section 2.5 Self Check snippets -print("""This is a lengthy - multiline string containing -a few lines \ -of text""") - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch02/snippets_py/02_06.py b/examples/ch02/snippets_py/02_06.py deleted file mode 100755 index 361c33d..0000000 --- a/examples/ch02/snippets_py/02_06.py +++ /dev/null @@ -1,52 +0,0 @@ -# Section 2.6 snippets -name = input("What's your name? ") - -name - -print(name) - -name = input("What's your name? ") - -name - -print(name) - -# Function input Always Returns a String -value1 = input('Enter first number: ') - -value2 = input('Enter second number: ') - -value1 + value2 - -# Getting an Integer from the User -value = input('Enter an integer: ') - -value = int(value) - -value - -another_value = int(input('Enter another integer: ')) - - -another_value - -value + another_value - -bad_value = int(input('Enter another integer: ')) - -int(10.5) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch02/snippets_py/02_06selfcheck.py b/examples/ch02/snippets_py/02_06selfcheck.py deleted file mode 100755 index 48f4544..0000000 --- a/examples/ch02/snippets_py/02_06selfcheck.py +++ /dev/null @@ -1,17 +0,0 @@ -# Section 2.6 Self Check snippets -float('6.2') * 3.3 - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch02/snippets_py/02_07.py b/examples/ch02/snippets_py/02_07.py deleted file mode 100755 index 12da2a8..0000000 --- a/examples/ch02/snippets_py/02_07.py +++ /dev/null @@ -1,31 +0,0 @@ -# Section 2.7 snippets - -7 > 4 - -7 < 4 - -7 > = 4 - -# Chaining Comparisons -x = 3 - -1 <= x <= 5 - -x = 10 - -1 <= x <= 5 - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch02/snippets_py/02_07selfcheck.py b/examples/ch02/snippets_py/02_07selfcheck.py deleted file mode 100755 index b52c987..0000000 --- a/examples/ch02/snippets_py/02_07selfcheck.py +++ /dev/null @@ -1,18 +0,0 @@ -# Section 2.7 Self Check snippets -7 =< 10 -print(5 < 9, 5 <= 9, 5 > 9, 5 >= 9, 5 == 9, 5 != 9) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch02/snippets_py/02_08.py b/examples/ch02/snippets_py/02_08.py deleted file mode 100755 index e19bce5..0000000 --- a/examples/ch02/snippets_py/02_08.py +++ /dev/null @@ -1,47 +0,0 @@ -# Section 2.8 snippets - -type(7) - -type(4.1) - -type('dog') - -# Variables Refer to Objects -x = 7 - -x + 10 - -x - -x = x + 10 - -x - -# Dynamic Typing -type(x) - -x = 4.1 - -type(x) - -x = 'dog' - -type(x) - -# Garbage Collection - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch02/snippets_py/02_08selfcheck.py b/examples/ch02/snippets_py/02_08selfcheck.py deleted file mode 100755 index b1233c2..0000000 --- a/examples/ch02/snippets_py/02_08selfcheck.py +++ /dev/null @@ -1,17 +0,0 @@ -# Section 2.8 Self Check snippets -type(7.5 * 3) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch02/snippets_py/02_09.py b/examples/ch02/snippets_py/02_09.py deleted file mode 100755 index 5f7815d..0000000 --- a/examples/ch02/snippets_py/02_09.py +++ /dev/null @@ -1,18 +0,0 @@ -# Section 2.9 snippets -min(36, 27, 12) -max(36, 27, 12) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch02/snippets_py/02_09selfcheck.py b/examples/ch02/snippets_py/02_09selfcheck.py deleted file mode 100755 index bf77b38..0000000 --- a/examples/ch02/snippets_py/02_09selfcheck.py +++ /dev/null @@ -1,21 +0,0 @@ -# Section 2.9 Self Checksnippets -min(47, 95, 88, 73, 88, 84) -max(47, 95, 88, 73, 88, 84) -print('Range:', min(47, 95, 88, 73, 88, 84), '-', - max(47, 95, 88, 73, 88, 84)) - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch02/snippets_py/ex02_01.py b/examples/ch02/snippets_py/ex02_01.py deleted file mode 100755 index 30393c2..0000000 --- a/examples/ch02/snippets_py/ex02_01.py +++ /dev/null @@ -1,22 +0,0 @@ -# Exercise 2.1 snippets -x = 2 -y = 3 -print('x =', x) -print('Value of', x, '+', x, 'is', (x + x)) -print('x =') -print((x + y), '=', (y + x)) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch02/snippets_py/ex02_02.py b/examples/ch02/snippets_py/ex02_02.py deleted file mode 100755 index 8168ffb..0000000 --- a/examples/ch02/snippets_py/ex02_02.py +++ /dev/null @@ -1,17 +0,0 @@ -# Exercise 2.2 snippets -rating = input('Enter an integer rating between 1 and 10: ') - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch02/snippets_py/ex02_03.py b/examples/ch02/snippets_py/ex02_03.py deleted file mode 100644 index 189a241..0000000 --- a/examples/ch02/snippets_py/ex02_03.py +++ /dev/null @@ -1,18 +0,0 @@ -# Exercise 2.3 snippets -if grade >= 90: - *** - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch02/snippets_py/ex02_09.py b/examples/ch02/snippets_py/ex02_09.py deleted file mode 100644 index dba2c4c..0000000 --- a/examples/ch02/snippets_py/ex02_09.py +++ /dev/null @@ -1,17 +0,0 @@ -# Exercise 2.9 snippets -ord('A') - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/fig03_01.py b/examples/ch03/fig03_01.py deleted file mode 100755 index 317c578..0000000 --- a/examples/ch03/fig03_01.py +++ /dev/null @@ -1,31 +0,0 @@ -# fig03_01.py -"""Class average program with sequence-controlled repetition.""" - -# initialization phase -total = 0 # sum of grades -grade_counter = 0 -grades = [98, 76, 71, 87, 83, 90, 57, 79, 82, 94] # list of 10 grades - -# processing phase -for grade in grades: - total += grade # add current grade to the running total - grade_counter += 1 # indicate that one more grade was processed - -# termination phase -average = total / grade_counter -print(f'Class average is {average}') - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/fig03_02.py b/examples/ch03/fig03_02.py deleted file mode 100755 index 33c35dd..0000000 --- a/examples/ch03/fig03_02.py +++ /dev/null @@ -1,36 +0,0 @@ -# fig03_02.py -"""Class average program with sentinel-controlled iteration.""" - -# initialization phase -total = 0 # sum of grades -grade_counter = 0 # number of grades entered - -# processing phase -grade = int(input('Enter grade, -1 to end: ')) # get one grade - -while grade != -1: - total += grade - grade_counter += 1 - grade = int(input('Enter grade, -1 to end: ')) - -# termination phase -if grade_counter != 0: - average = total / grade_counter - print(f'Class average is {average:.2f}') -else: - print('No grades were entered') - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/fig03_03.py b/examples/ch03/fig03_03.py deleted file mode 100755 index fb46c95..0000000 --- a/examples/ch03/fig03_03.py +++ /dev/null @@ -1,38 +0,0 @@ -# fig03_03.py -"""Using nested control statements to analyze examination results.""" - -# initialize variables -passes = 0 # number of passes -failures = 0 # number of failures - -# process 10 students -for student in range(10): - # get one exam result - result = int(input('Enter result (1=pass, 2=fail): ')) - - if result == 1: - passes = passes + 1 - else: - failures = failures + 1 - -# termination phase -print('Passed:', passes) -print('Failed:', failures) - -if passes > 8: - print('Bonus to instructor') - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_ipynb/03_03selfcheck.ipynb b/examples/ch03/snippets_ipynb/03_03selfcheck.ipynb deleted file mode 100644 index 2c9c28a..0000000 --- a/examples/ch03/snippets_ipynb/03_03selfcheck.ipynb +++ /dev/null @@ -1,104 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 3.3 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Write Python statements that perform the tasks described by this section’s pseudocode. \n", - "\n", - "```\n", - "Enter the integers 10 and 5. \n", - "```\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "number1 = int(input('Enter first integer: '))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "number2 = int(input('Enter second integer: '))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "total = number1 + number2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('The sum of', number1, 'and', number2, 'is', total)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/03_05.ipynb b/examples/ch03/snippets_ipynb/03_05.ipynb deleted file mode 100644 index d273520..0000000 --- a/examples/ch03/snippets_ipynb/03_05.ipynb +++ /dev/null @@ -1,129 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 3.5 `if` Statement" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grade = 85" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if grade >= 60:\n", - " print('Passed')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Suite Indentation" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if grade >= 60:\n", - "print('Passed') # statement is not indented properly" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if grade >= 60:\n", - " print('Passed')\n", - " print('Good job!)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### `if` Statement Flowchart\n", - "### Every Expression Can Be Treated as `True` or `False`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if 1:\n", - " print('Nonzero values are true, so this will print')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if 0:\n", - " print('Zero is false, so this will not print')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/03_05selfcheck.ipynb b/examples/ch03/snippets_ipynb/03_05selfcheck.ipynb deleted file mode 100755 index 192757a..0000000 --- a/examples/ch03/snippets_ipynb/03_05selfcheck.ipynb +++ /dev/null @@ -1,102 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 3.5 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Redo this section’s snippets [1] and [2], then change `grade` to `55` and repeat the if statement to show that its suite does not execute. The next section shows how to recall and re-execute earlier snippets to avoid having to re-enter the code.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grade = 85" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if grade >= 60:\n", - " print('Passed')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grade = 55" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if grade >= 60:\n", - " print('Passed')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/03_06.ipynb b/examples/ch03/snippets_ipynb/03_06.ipynb deleted file mode 100755 index a07e239..0000000 --- a/examples/ch03/snippets_ipynb/03_06.ipynb +++ /dev/null @@ -1,266 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 3.6 `if`…`else` and `if`…`elif`…`else` Statements" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grade = 85" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if grade >= 60: \n", - " print('Passed')\n", - "else:\n", - " print('Failed')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grade = 57" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if grade >= 60: \n", - " print('Passed')\n", - "else:\n", - " print('Failed')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grade = 99" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if grade >= 60: \n", - " print('Passed')\n", - "else:\n", - " print('Failed')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Conditional Expressions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grade = 87" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if grade >= 60:\n", - " result = 'Passed'\n", - "else:\n", - " result = 'Failed'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result = ('Passed' if grade >= 60 else 'Failed')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Passed' if grade >= 60 else 'Failed'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Multiple Statements in a Suite" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grade = 49" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if grade >= 60:\n", - " print('Passed')\n", - "else:\n", - " print('Failed')\n", - " print('You must take this course again')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grade = 100" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if grade >= 60:\n", - " print('Passed')\n", - "else:\n", - " print('Failed')\n", - "print('You must take this course again')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### `if`…`elif`…`else` Statement" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grade = 77" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if grade >= 90:\n", - " print('A')\n", - "elif grade >= 80:\n", - " print('B')\n", - "elif grade >= 70:\n", - " print('C')\n", - "elif grade >= 60:\n", - " print('D')\n", - "else:\n", - " print('F')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/03_06selfcheck.ipynb b/examples/ch03/snippets_ipynb/03_06selfcheck.ipynb deleted file mode 100755 index 2cb4be9..0000000 --- a/examples/ch03/snippets_ipynb/03_06selfcheck.ipynb +++ /dev/null @@ -1,88 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 3.6 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "**2. _(IPython Session)_** Show that a `SyntaxError` occurs if an `if`…`elif` statement specifies an `else` before the last `elif`.\n", - "\n", - "**Answer:**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grade = 80" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if grade >= 90:\n", - " print('A')\n", - "else:\n", - " print('Not A or B')\n", - "elif grade >= 80:\n", - " print('B')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/03_07.ipynb b/examples/ch03/snippets_ipynb/03_07.ipynb deleted file mode 100755 index 0518198..0000000 --- a/examples/ch03/snippets_ipynb/03_07.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 3.7 `while` Statement" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "product = 3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "while product <= 50:\n", - " product = product * 3 " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "product" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/03_07selfcheck.ipynb b/examples/ch03/snippets_ipynb/03_07selfcheck.ipynb deleted file mode 100755 index 6fcf20a..0000000 --- a/examples/ch03/snippets_ipynb/03_07selfcheck.ipynb +++ /dev/null @@ -1,83 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 3.7 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Write statements to determine the first power of 7 greater than 1000." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "product = 7\n", - "while product <= 1000:\n", - " product = product * 7\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "product" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/03_08.ipynb b/examples/ch03/snippets_ipynb/03_08.ipynb deleted file mode 100755 index 0aacae6..0000000 --- a/examples/ch03/snippets_ipynb/03_08.ipynb +++ /dev/null @@ -1,133 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 3.8 `for` Statement " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for character in 'Programming':\n", - " print(character, end=' ')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Function `print`’s `end` Keyword Argument \n", - "### Function `print`’s `sep` Keyword Argument " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(10, 20, 30, sep=', ')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 3.8.1 Iterables, Lists and Iterators" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "total = 0" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for number in [2, -3, 0, 17, 9]:\n", - " total = total + number" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "total" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 3.8.2 Built-In `range` Function and Generators" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for counter in range(10):\n", - " print(counter, end=' ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/03_08selfcheck.ipynb b/examples/ch03/snippets_ipynb/03_08selfcheck.ipynb deleted file mode 100755 index 263e1f4..0000000 --- a/examples/ch03/snippets_ipynb/03_08selfcheck.ipynb +++ /dev/null @@ -1,90 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 3.8 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Use the `range` function and a `for` statement to calculate the total of the integers from 0 through 1,000,000. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "total = 0" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for number in range(1000001):\n", - " total = total + number" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "total" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/03_09.ipynb b/examples/ch03/snippets_ipynb/03_09.ipynb deleted file mode 100755 index e62723c..0000000 --- a/examples/ch03/snippets_ipynb/03_09.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 3.9 Augmented Assignments " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "total = 0" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for number in [1, 2, 3, 4, 5]:\n", - " total += number # add number to total and store in number" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "total" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/03_09selfcheck.ipynb b/examples/ch03/snippets_ipynb/03_09selfcheck.ipynb deleted file mode 100755 index c630a0d..0000000 --- a/examples/ch03/snippets_ipynb/03_09selfcheck.ipynb +++ /dev/null @@ -1,89 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 3.9 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Create a variable `x` with the value `12`. Use an exponentiation augmented assignment statement to square `x`’s value. Show `x`’s new value." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x = 12" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x **= 2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/03_10selfcheck.ipynb b/examples/ch03/snippets_ipynb/03_10selfcheck.ipynb deleted file mode 100755 index 296615c..0000000 --- a/examples/ch03/snippets_ipynb/03_10selfcheck.ipynb +++ /dev/null @@ -1,92 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 3.10 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Display an f-string in which you insert the values of the variables `number1` (`7`) and `number2` (`5`) and their product. The displayed string should be\n", - "```\n", - " 7 times 5 is 35\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "number1 = 7" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "number2 = 5" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'{number1} times {number2} is {number1 * number2}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/03_12selfcheck.ipynb b/examples/ch03/snippets_ipynb/03_12selfcheck.ipynb deleted file mode 100644 index 82cefc5..0000000 --- a/examples/ch03/snippets_ipynb/03_12selfcheck.ipynb +++ /dev/null @@ -1,76 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 3.12 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Use a `for` statement to input two integers. Use a nested `if`…`else` statement to display whether each value is even or odd. Enter `10` and `7` to test your code." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for count in range(2):\n", - " value = int(input('Enter an integer: '))\n", - " if value % 2 == 0:\n", - " print(f'{value} is even')\n", - " else:\n", - " print(f'{value} is odd')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/03_13.ipynb b/examples/ch03/snippets_ipynb/03_13.ipynb deleted file mode 100755 index e50c165..0000000 --- a/examples/ch03/snippets_ipynb/03_13.ipynb +++ /dev/null @@ -1,84 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 3.13 Built-In Function `range`: A Deeper Look" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for number in range(5, 10):\n", - " print(number, end=' ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for number in range(0, 10, 2):\n", - " print(number, end=' ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for number in range(10, 0, -2):\n", - " print(number, end=' ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/03_13selfcheck.ipynb b/examples/ch03/snippets_ipynb/03_13selfcheck.ipynb deleted file mode 100755 index 81b10c9..0000000 --- a/examples/ch03/snippets_ipynb/03_13selfcheck.ipynb +++ /dev/null @@ -1,124 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 3.13 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** What happens if you try to print the items in `range(10,` `0,` `2)`? " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for number in range(10, 0, 2):\n", - " print(number, end=' ')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Use a `for` statement, `range` and `print` to display on one line the sequence of values `99` `88` `77` `66` `55` `44` `33` `22` `11` `0`, each separated by one space." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for number in range(99, -1, -11):\n", - " print(number, end=' ')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**4. _(IPython Session)_** Use `for` and `range` to sum the even integers from 2 through 100, then display the sum." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "total = 0" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for number in range(2, 101, 2):\n", - " total += number" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "total" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/03_14.ipynb b/examples/ch03/snippets_ipynb/03_14.ipynb deleted file mode 100755 index 6db8802..0000000 --- a/examples/ch03/snippets_ipynb/03_14.ipynb +++ /dev/null @@ -1,219 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 3.14 Using Type Decimal for Monetary Amounts" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "amount = 112.31" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(amount)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'{amount:.20f}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Importing Type Decimal from the decimal Module " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from decimal import Decimal" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating Decimals" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "principal = Decimal('1000.00')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "principal" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rate = Decimal('0.05')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rate" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Decimal Arithmetic " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x = Decimal('10.5')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "y = Decimal('2')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x + y" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x // y" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x += y" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Calculating Compound Interest" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for year in range(1, 11):\n", - " amount = principal * (1 + rate) ** year \n", - " print(f'{year:>2}{amount:>10.2f}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/03_14selfcheck.ipynb b/examples/ch03/snippets_ipynb/03_14selfcheck.ipynb deleted file mode 100755 index e8e279e..0000000 --- a/examples/ch03/snippets_ipynb/03_14selfcheck.ipynb +++ /dev/null @@ -1,80 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 3.14 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Assume that the tax on a restaurant bill is 6.25% and that the bill amount is $37.45. Use type `Decimal` to calculate the bill total then print the result with two digits to the right of the decimal point. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from decimal import Decimal" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f\"{Decimal('37.45') * Decimal('1.0625'):.2f}\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/03_15.ipynb b/examples/ch03/snippets_ipynb/03_15.ipynb deleted file mode 100755 index 6055659..0000000 --- a/examples/ch03/snippets_ipynb/03_15.ipynb +++ /dev/null @@ -1,78 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 3.15 `break` and `continue` Statements" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for number in range(100):\n", - " if number == 10:\n", - " break\n", - " print(number, end=' ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for number in range(10):\n", - " if number == 5:\n", - " continue\n", - " print(number, end=' ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/03_16.ipynb b/examples/ch03/snippets_ipynb/03_16.ipynb deleted file mode 100755 index 0b506ff..0000000 --- a/examples/ch03/snippets_ipynb/03_16.ipynb +++ /dev/null @@ -1,160 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 3.16 Boolean Operators `and`, `or` and `not` " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Boolean Operator `and`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "gender = 'Female'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "age = 70" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if gender == 'Female' and age >= 65:\n", - " print('Senior female')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Boolean Operator `or`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "semester_average = 83" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "final_exam = 95" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if semester_average >= 90 or final_exam >= 90:\n", - " print('Student gets an A')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Boolean Operator `not` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grade = 87" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if not grade == -1:\n", - " print('The next grade is', grade)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if grade != -1:\n", - " print('The next grade is', grade)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/03_16selfcheck.ipynb b/examples/ch03/snippets_ipynb/03_16selfcheck.ipynb deleted file mode 100755 index 83f7f94..0000000 --- a/examples/ch03/snippets_ipynb/03_16selfcheck.ipynb +++ /dev/null @@ -1,156 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 3.16 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Assume that `i` `=` `1`, `j` `=` `2`, `k` `=` `3` and `m` `=` `2`. What does each of the following conditions display? " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```python\n", - "(i >= 1) and (j < 4) \n", - "(m <= 99) and (k < m) \n", - "(j >= i) or (k == m) \n", - "(k + m < j) or (3 - j >= k) \n", - "not (k > m) \n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "i = 1" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "j = 2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "k = 3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "m = 2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "(i >= 1) and (j < 4)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "(m <= 99) and (k < m)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "(j >= i) or (k == m)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "(k + m < j) or (3 - j >= k)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "not (k > m)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/03_17.ipynb b/examples/ch03/snippets_ipynb/03_17.ipynb deleted file mode 100755 index 55b8d77..0000000 --- a/examples/ch03/snippets_ipynb/03_17.ipynb +++ /dev/null @@ -1,117 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 3.17 Intro to Data Science: Measures of Central Tendency—Mean, Median and Mode " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades = [85, 93, 45, 89, 85]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sum(grades) / len(grades)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import statistics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "statistics.mean(grades)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "statistics.median(grades)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "statistics.mode(grades)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sorted(grades)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/03_17selfcheck.ipynb b/examples/ch03/snippets_ipynb/03_17selfcheck.ipynb deleted file mode 100755 index 5743159..0000000 --- a/examples/ch03/snippets_ipynb/03_17selfcheck.ipynb +++ /dev/null @@ -1,107 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 3.17 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**4. _(IPython Session)_** For the values `47`, `95`, `88`, `73`, `88` and `84`, use the `statistics` module to calculate the mean, median and mode." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import statistics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "values = [47, 95, 88, 73, 88, 84]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "statistics.mean(values)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "statistics.median(values)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "statistics.mode(values)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/ex03_02.ipynb b/examples/ch03/snippets_ipynb/ex03_02.ipynb deleted file mode 100644 index 3ea3c22..0000000 --- a/examples/ch03/snippets_ipynb/ex03_02.ipynb +++ /dev/null @@ -1,79 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(What’s Wrong with This Code?)_** What is wrong with the following code:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a = b = 7" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('a =', a, '\\nb =', b)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First, answer the question, then check your work in an IPython session." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/ex03_03.ipynb b/examples/ch03/snippets_ipynb/ex03_03.ipynb deleted file mode 100644 index f2dd243..0000000 --- a/examples/ch03/snippets_ipynb/ex03_03.ipynb +++ /dev/null @@ -1,66 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(What Does This Code Do?)_** What does the following program print?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for row in range(10):\n", - " for column in range(10):\n", - " print('<' if row % 2 == 1 else '>', end='')\n", - " print()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/ex03_04.ipynb b/examples/ch03/snippets_ipynb/ex03_04.ipynb deleted file mode 100644 index 213fb44..0000000 --- a/examples/ch03/snippets_ipynb/ex03_04.ipynb +++ /dev/null @@ -1,78 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**4. _(Fill in the missing code)_** In the code below " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for ***:\n", - " for ***:\n", - " print('@')\n", - " print()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "replace the *** so that when you execute the code, it displays two rows each containing seven @ symbols, as in:\n", - "\n", - "```\n", - "@@@@@@@\n", - "@@@@@@@\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/ex03_22.ipynb b/examples/ch03/snippets_ipynb/ex03_22.ipynb deleted file mode 100644 index 0e84994..0000000 --- a/examples/ch03/snippets_ipynb/ex03_22.ipynb +++ /dev/null @@ -1,78 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**22. _(Optional else Clause of a Loop)_** The `while` and `for` statements each have an optional `else` clause. In a `while`, the `else` clause executes when the condition becomes `False`. In a `for` statement, the `else` clause executes when there are no more items to process. If you `break` out of a `while` or `for` that has an `else`, the `else` part does _not_ execute. Execute the following code to see that the `else` clause executes only if the `break` statement does not:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for i in range(2):\n", - " value = int(input('Enter an integer (-1 to break): '))\n", - " print('You entered:', value)\n", - " \n", - " if value == -1:\n", - " break\n", - "else:\n", - " print('The loop terminated without executing the break')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For more information on loop else clauses, see \n", - "https://docs.python.org/3/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch03/snippets_ipynb/files/art/check.png b/examples/ch03/snippets_ipynb/files/art/check.png deleted file mode 100755 index eea18cd..0000000 Binary files a/examples/ch03/snippets_ipynb/files/art/check.png and /dev/null differ diff --git a/examples/ch03/snippets_py/03_03selfcheck.py b/examples/ch03/snippets_py/03_03selfcheck.py deleted file mode 100755 index 1aff7a3..0000000 --- a/examples/ch03/snippets_py/03_03selfcheck.py +++ /dev/null @@ -1,24 +0,0 @@ -# Section 3.3 Self Check snippets -number1 = int(input('Enter first integer: ')) - -number2 = int(input('Enter second integer: ')) - -total = number1 + number2 - -print('The sum of', number1, 'and', number2, 'is', total) - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/03_05.py b/examples/ch03/snippets_py/03_05.py deleted file mode 100755 index 9a2086c..0000000 --- a/examples/ch03/snippets_py/03_05.py +++ /dev/null @@ -1,37 +0,0 @@ -# Section 3.5 snippets - -grade = 85 - -if grade >= 60: - print('Passed') - -# Suite Indentation -if grade >= 60: -print('Passed') # statement is not indented properly - -if grade >= 60: - print('Passed') - print('Good job!) - -# if Statement Flowchart - -# Every Expression Can Be Treated as True or False -if 1: - print('Nonzero values are true, so this will print') -if 0: - print('Zero is false, so this will not print') - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/03_05selfcheck.py b/examples/ch03/snippets_py/03_05selfcheck.py deleted file mode 100755 index 144d283..0000000 --- a/examples/ch03/snippets_py/03_05selfcheck.py +++ /dev/null @@ -1,28 +0,0 @@ -# Section 3.5 Self Check snippets - -# Exercise 2 -grade = 85 - -if grade >= 60: - print('Passed') - -grade = 55 - -if grade >= 60: - print('Passed') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/03_06.py b/examples/ch03/snippets_py/03_06.py deleted file mode 100755 index e2eb4d8..0000000 --- a/examples/ch03/snippets_py/03_06.py +++ /dev/null @@ -1,87 +0,0 @@ -# Section 3.6 snippets -grade = 85 - -if grade >= 60: - print('Passed') -else: - print('Failed') - -grade = 57 - -if grade >= 60: - print('Passed') -else: - print('Failed') - -grade = 99 - -if grade >= 60: - print('Passed') -else: - print('Failed') - -# Conditional Expressions - -grade = 87 - -if grade >= 60: - result = 'Passed' -else: - result = 'Failed' - -result - -result = ('Passed' if grade >= 60 else 'Failed') - -result - -'Passed' if grade >= 60 else 'Failed' - -# Multiple Statements in a Suite - -grade = 49 - -if grade >= 60: - print('Passed') -else: - print('Failed') - print('You must take this course again') - -grade = 100 - -if grade >= 60: - print('Passed') -else: - print('Failed') -print('You must take this course again') - -# if…elif…else Statement -grade = 77 - -if grade >= 90: - print('A') -elif grade >= 80: - print('B') -elif grade >= 70: - print('C') -elif grade >= 60: - print('D') -else: - print('F') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/03_06selfcheck.py b/examples/ch03/snippets_py/03_06selfcheck.py deleted file mode 100755 index 1131607..0000000 --- a/examples/ch03/snippets_py/03_06selfcheck.py +++ /dev/null @@ -1,26 +0,0 @@ -# Section 3.6 Self Check snippets - -# Exercise 2 -grade = 80: - -if grade >= 90: - print('A') -else: - print('Not A or B') -elif grade >= 80: - print('B') - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/03_07.py b/examples/ch03/snippets_py/03_07.py deleted file mode 100755 index 80cdd59..0000000 --- a/examples/ch03/snippets_py/03_07.py +++ /dev/null @@ -1,25 +0,0 @@ -# Section 3.7 snippets -product = 3 - -while product <= 50: - product = product * 3 - -product - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/03_07selfcheck.py b/examples/ch03/snippets_py/03_07selfcheck.py deleted file mode 100755 index 6aa90de..0000000 --- a/examples/ch03/snippets_py/03_07selfcheck.py +++ /dev/null @@ -1,24 +0,0 @@ -# Section 3.7 Self Check snippets - -# Exercise 2 -product = 7 - -while product <= 1000: - product = product * 7 - -product - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/03_08.py b/examples/ch03/snippets_py/03_08.py deleted file mode 100755 index 910942d..0000000 --- a/examples/ch03/snippets_py/03_08.py +++ /dev/null @@ -1,35 +0,0 @@ -# Section 3.8 snippets - -for character in 'Programming': - print(character, end=' ') - -# Function print’s sep Keyword Argument -print(10, 20, 30, sep=', ') - -# 3.8.1 Iterables, Lists and Iterators -total = 0 - -for number in [2, -3, 0, 17, 9]: - total = total + number - -total - -# 3.8.2 Built-In range Function and Generators -for counter in range(10): - print(counter, end=' ') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/03_08selfcheck.py b/examples/ch03/snippets_py/03_08selfcheck.py deleted file mode 100755 index c18d312..0000000 --- a/examples/ch03/snippets_py/03_08selfcheck.py +++ /dev/null @@ -1,25 +0,0 @@ -# Section 3.8 Self Check snippets - -# Exercise 2 -total = 0 - -for number in range(1000001): - total = total + number - -total - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/03_09.py b/examples/ch03/snippets_py/03_09.py deleted file mode 100755 index b423a45..0000000 --- a/examples/ch03/snippets_py/03_09.py +++ /dev/null @@ -1,22 +0,0 @@ -# Section 3.9 snippets -total = 0 - -for number in [1, 2, 3, 4, 5]: - total += number # add number to total and store in number - -total - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/03_09selfcheck.py b/examples/ch03/snippets_py/03_09selfcheck.py deleted file mode 100755 index d9c2bde..0000000 --- a/examples/ch03/snippets_py/03_09selfcheck.py +++ /dev/null @@ -1,21 +0,0 @@ -# Section 3.9 Self Checksnippets - -# Exercise 2 -x = 12 -x **= 2 -x - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/03_10selfcheck.py b/examples/ch03/snippets_py/03_10selfcheck.py deleted file mode 100755 index ae9a4af..0000000 --- a/examples/ch03/snippets_py/03_10selfcheck.py +++ /dev/null @@ -1,19 +0,0 @@ -# Section 3.10 Self Check snippets -number1 = 7 -number2 = 5 -print(f'{number1} times {number2} is {number1 * number2}') - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/03_12selfcheck.py b/examples/ch03/snippets_py/03_12selfcheck.py deleted file mode 100644 index 8cb7617..0000000 --- a/examples/ch03/snippets_py/03_12selfcheck.py +++ /dev/null @@ -1,27 +0,0 @@ -# Section 3.12 Self Check snippets - -# Exercise 1 - -for count in range(2): - value = int(input('Enter an integer: ')) - if value % 2 == 0: - print(f'{value} is even') - else: - print(f'{value} is odd') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/03_13.py b/examples/ch03/snippets_py/03_13.py deleted file mode 100755 index 6d53bc6..0000000 --- a/examples/ch03/snippets_py/03_13.py +++ /dev/null @@ -1,24 +0,0 @@ -# Section 3.13 snippets -for number in range(5, 10): - print(number, end=' ') - -for number in range(0, 10, 2): - print(number, end=' ') - -for number in range(10, 0, -2): - print(number, end=' ') - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/03_13selfcheck.py b/examples/ch03/snippets_py/03_13selfcheck.py deleted file mode 100755 index 5e63860..0000000 --- a/examples/ch03/snippets_py/03_13selfcheck.py +++ /dev/null @@ -1,33 +0,0 @@ -# Section 3.13 Self Check snippets - -# Exercise 2 -for number in range(10, 0, 2): - print(number, end=' ') - -# Exercise 3 -for number in range(99, -1, -11): - print(number, end=' ') - -# Exercise 4 -total = 0 - -for number in range(2, 101, 2): - total += number - -total - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/03_14.py b/examples/ch03/snippets_py/03_14.py deleted file mode 100755 index fd5d9bf..0000000 --- a/examples/ch03/snippets_py/03_14.py +++ /dev/null @@ -1,46 +0,0 @@ -# Section 3.14 snippets -amount = 112.31 - -print(amount) - -print(f'{amount:.20f}') - -# Importing Type Decimal from the decimal Module -from decimal import Decimal - -# Creating Decimals -principal = Decimal('1000.00') -principal - -rate = Decimal('0.05') -rate - -# Decimal Arithmetic -x = Decimal('10.5') -y = Decimal('2') -x + y -x // y -x += y -x - -# Calculating Compound Interest -for year in range(1, 11): - amount = principal * (1 + rate) ** year - print(f'{year:>2}{amount:>10.2f}') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/03_14selfcheck.py b/examples/ch03/snippets_py/03_14selfcheck.py deleted file mode 100755 index 1092f4b..0000000 --- a/examples/ch03/snippets_py/03_14selfcheck.py +++ /dev/null @@ -1,20 +0,0 @@ -# Section 3.14 Self Check snippets - -# Exercise 2 -from decimal import Decimal -print(f"{Decimal('37.45') * Decimal('1.0625'):.2f}") - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/03_15y.py b/examples/ch03/snippets_py/03_15y.py deleted file mode 100755 index b860c46..0000000 --- a/examples/ch03/snippets_py/03_15y.py +++ /dev/null @@ -1,26 +0,0 @@ -# Section 3.15 snippets -for number in range(100): - if number == 10: - break - print(number, end=' ') - -for number in range(10): - if number == 5: - continue - print(number, end=' ') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/03_16.py b/examples/ch03/snippets_py/03_16.py deleted file mode 100755 index 69b9b52..0000000 --- a/examples/ch03/snippets_py/03_16.py +++ /dev/null @@ -1,40 +0,0 @@ -# Section 3.16 snippets - -# Boolean Operator and -gender = 'Female' -age = 70 - -if gender == 'Female' and age >= 65: - print('Senior female') - -# Boolean Operator or -semester_average = 83 -final_exam = 95 - -if semester_average >= 90 or final_exam >= 90: - print('Student gets an A') - -# Boolean Operator not -grade = 87 - -if not grade == -1: - print('The grade is', grade) - -if grade != -1: - print('The next grade is', grade) - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/03_16selfcheck.py b/examples/ch03/snippets_py/03_16selfcheck.py deleted file mode 100755 index 5684906..0000000 --- a/examples/ch03/snippets_py/03_16selfcheck.py +++ /dev/null @@ -1,32 +0,0 @@ -# Section 3.16 Self Check snippets - -# Exercise 1 -i = 1 -j = 2 -k = 3 -m = 2 - -(i >= 1) and (j < 4) - -(m <= 99) and (k < m) - -(j >= i) or (k == m) - -(k + m < j) or (3 - j >= k) - -not (k > m) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/03_17.py b/examples/ch03/snippets_py/03_17.py deleted file mode 100755 index 69b9b52..0000000 --- a/examples/ch03/snippets_py/03_17.py +++ /dev/null @@ -1,40 +0,0 @@ -# Section 3.16 snippets - -# Boolean Operator and -gender = 'Female' -age = 70 - -if gender == 'Female' and age >= 65: - print('Senior female') - -# Boolean Operator or -semester_average = 83 -final_exam = 95 - -if semester_average >= 90 or final_exam >= 90: - print('Student gets an A') - -# Boolean Operator not -grade = 87 - -if not grade == -1: - print('The grade is', grade) - -if grade != -1: - print('The next grade is', grade) - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/03_17selfcheck.py b/examples/ch03/snippets_py/03_17selfcheck.py deleted file mode 100755 index 14ea8b8..0000000 --- a/examples/ch03/snippets_py/03_17selfcheck.py +++ /dev/null @@ -1,27 +0,0 @@ -# Section 3.17 Self Check snippets - -# Exercise 4 -import statistics -values = [47, 95, 88, 73, 88, 84] - -statistics.mean(values) - -statistics.median(values) - -statistics.mode(values) - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/ex03_02.py b/examples/ch03/snippets_py/ex03_02.py deleted file mode 100644 index fff7838..0000000 --- a/examples/ch03/snippets_py/ex03_02.py +++ /dev/null @@ -1,19 +0,0 @@ -# Exercise 3.2 -a = b = 7 -print('a =', a, '\\nb =', b) - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/ex03_03.py b/examples/ch03/snippets_py/ex03_03.py deleted file mode 100644 index b56001c..0000000 --- a/examples/ch03/snippets_py/ex03_03.py +++ /dev/null @@ -1,20 +0,0 @@ -# Exercise 3.3 -for row in range(10): - for column in range(10): - print('<' if row % 2 == 1 else '>', end='') - print() - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/ex03_04.py b/examples/ch03/snippets_py/ex03_04.py deleted file mode 100644 index 1e697c8..0000000 --- a/examples/ch03/snippets_py/ex03_04.py +++ /dev/null @@ -1,20 +0,0 @@ -# Exercise 3.4 -for ***: - for ***: - print('@') - print() - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/snippets_py/ex03_22.py b/examples/ch03/snippets_py/ex03_22.py deleted file mode 100644 index 626d238..0000000 --- a/examples/ch03/snippets_py/ex03_22.py +++ /dev/null @@ -1,24 +0,0 @@ -# Exercise 3.22 -for i in range(2): - value = int(input('Enter an integer (-1 to break): ')) - print('You entered:', value) - - if value == -1: - break -else: - print('The loop terminated without executing the break') - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch03/validate_indents.py b/examples/ch03/validate_indents.py deleted file mode 100644 index 2a318a6..0000000 --- a/examples/ch03/validate_indents.py +++ /dev/null @@ -1,22 +0,0 @@ -# validate_indents.py -grade = 93 - -if grade >= 90: - print('A') - print('Great Job!') - print('Take a break from studying') - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/fig04_01.py b/examples/ch04/fig04_01.py deleted file mode 100755 index c94e8eb..0000000 --- a/examples/ch04/fig04_01.py +++ /dev/null @@ -1,53 +0,0 @@ -# fig04_01.py -"""Roll a six-sided die 6,000,000 times.""" -import random - -# face frequency counters -frequency1 = 0 -frequency2 = 0 -frequency3 = 0 -frequency4 = 0 -frequency5 = 0 -frequency6 = 0 - -# 6,000,000 die rolls -for roll in range(6_000_000): # note underscore separators - face = random.randrange(1, 7) - - # increment appropriate face counter - if face == 1: - frequency1 += 1 - elif face == 2: - frequency2 += 1 - elif face == 3: - frequency3 += 1 - elif face == 4: - frequency4 += 1 - elif face == 5: - frequency5 += 1 - elif face == 6: - frequency6 += 1 - -print(f'Face{"Frequency":>13}') -print(f'{1:>4}{frequency1:>13}') -print(f'{2:>4}{frequency2:>13}') -print(f'{3:>4}{frequency3:>13}') -print(f'{4:>4}{frequency4:>13}') -print(f'{5:>4}{frequency5:>13}') -print(f'{6:>4}{frequency6:>13}') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/fig04_02.py b/examples/ch04/fig04_02.py deleted file mode 100755 index f68e143..0000000 --- a/examples/ch04/fig04_02.py +++ /dev/null @@ -1,61 +0,0 @@ -# fig04_02.py -"""Simulating the dice game Craps.""" -import random - -def roll_dice(): - """Roll two dice and return their face values as a tuple.""" - die1 = random.randrange(1, 7) - die2 = random.randrange(1, 7) - return (die1, die2) # pack die face values into a tuple - -def display_dice(dice): - """Display one roll of the two dice.""" - die1, die2 = dice # unpack the tuple into variables die1 and die2 - print(f'Player rolled {die1} + {die2} = {sum(dice)}') - -die_values = roll_dice() # first roll -display_dice(die_values) - -# determine game status and point, based on first roll -sum_of_dice = sum(die_values) - -if sum_of_dice in (7, 11): # win - game_status = 'WON' -elif sum_of_dice in (2, 3, 12): # lose - game_status = 'LOST' -else: # remember point - game_status = 'CONTINUE' - my_point = sum_of_dice - print('Point is', my_point) - -# continue rolling until player wins or loses -while game_status == 'CONTINUE': - die_values = roll_dice() - display_dice(die_values) - sum_of_dice = sum(die_values) - - if sum_of_dice == my_point: # win by making point - game_status = 'WON' - elif sum_of_dice == 7: # lose by rolling 7 - game_status = 'LOST' - -# display "wins" or "loses" message -if game_status == 'WON': - print('Player wins') -else: - print('Player loses') - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/fig04_03.py b/examples/ch04/fig04_03.py deleted file mode 100755 index 18f2d3e..0000000 --- a/examples/ch04/fig04_03.py +++ /dev/null @@ -1,28 +0,0 @@ -# fig04_03.py -"""Function-call stack demonstration script.""" - -def main(): - result = square(7) # square's stack frame pushed onto stack here - print('square(7):', result) - # main's stack frame is popped here - -def square(number): - return number ** 2 # square's stack frame is popped here - -main() # execution begins here -# when main returns, the script terminates here - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_ipynb/04_02.ipynb b/examples/ch04/snippets_ipynb/04_02.ipynb deleted file mode 100644 index 29e44d2..0000000 --- a/examples/ch04/snippets_ipynb/04_02.ipynb +++ /dev/null @@ -1,127 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 4.2 Defining Functions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def square(number):\n", - " \"\"\"Calculate the square of number.\"\"\"\n", - " return number ** 2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "square(7)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "square(2.5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Defining a Custom Function\n", - "### Specifying a Custom Function’s Docstring \n", - "### Returning a Result to a Function’s Caller" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('The square of 7 is', square(7))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### What Happens When You Call a Function\n", - "### Accessing a Function’s Docstring Via IPython’s Help Mechanism " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "square?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "square??" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/04_02selfcheck.ipynb b/examples/ch04/snippets_ipynb/04_02selfcheck.ipynb deleted file mode 100644 index eae757b..0000000 --- a/examples/ch04/snippets_ipynb/04_02selfcheck.ipynb +++ /dev/null @@ -1,94 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 4.2 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Define a function `square_root` that receives a number as a parameter and returns the square root of that number. Determine the square root of `6.25`.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "def square_root(number):\n", - " return number ** 0.5 # or number ** (1 / 2)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2.5" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "square_root(6.25)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/04_03.ipynb b/examples/ch04/snippets_ipynb/04_03.ipynb deleted file mode 100644 index 0518c36..0000000 --- a/examples/ch04/snippets_ipynb/04_03.ipynb +++ /dev/null @@ -1,132 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 4.3 Functions with Multiple Parameters" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def maximum(value1, value2, value3):\n", - " \"\"\"Return the maximum of three values.\"\"\"\n", - " max_value = value1\n", - " if value2 > max_value:\n", - " max_value = value2\n", - " if value3 > max_value:\n", - " max_value = value3\n", - " return max_value" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "maximum(12, 27, 36)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "maximum(12.3, 45.6, 9.7)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "maximum('yellow', 'red', 'orange')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "maximum(13.5, -3, 7)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Function maximum’s Definition\n", - "### Python’s Built-In max and min Functions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "max('yellow', 'red', 'orange', 'blue', 'green')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "min(15, 9, 27, 14)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/04_03selfcheck.ipynb b/examples/ch04/snippets_ipynb/04_03selfcheck.ipynb deleted file mode 100755 index d10edce..0000000 --- a/examples/ch04/snippets_ipynb/04_03selfcheck.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 4.3 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Call function `max` with the list `[14, 27, 5, 3]` as an argument, then call function `min` with the string `'orange'` as an argument. \n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "max([14, 27, 5, 3])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "min('orange')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/04_04.ipynb b/examples/ch04/snippets_ipynb/04_04.ipynb deleted file mode 100644 index b49c677..0000000 --- a/examples/ch04/snippets_ipynb/04_04.ipynb +++ /dev/null @@ -1,199 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 4.4 Random-Number Generation" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Rolling a Six-Sided Die" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import random" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for roll in range(10):\n", - " print(random.randrange(1, 7), end=' ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for roll in range(10):\n", - " print(random.randrange(1, 7), end=' ')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Rolling a Six-Sided Die 6,000,000 Times" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "### Rolling a Six-Sided Die 6,000,000 Times\n", - "\n", - "# fig04_01.py\n", - "\"\"\"Roll a six-sided die 6,000,000 times.\"\"\"\n", - "import random\n", - "\n", - "# face frequency counters\n", - "frequency1 = 0\n", - "frequency2 = 0\n", - "frequency3 = 0\n", - "frequency4 = 0\n", - "frequency5 = 0\n", - "frequency6 = 0\n", - "\n", - "# 6,000,000 die rolls\n", - "for roll in range(6_000_000): # note underscore separators\n", - " face = random.randrange(1, 7)\n", - "\n", - " # increment appropriate face counter\n", - " if face == 1:\n", - " frequency1 += 1\n", - " elif face == 2:\n", - " frequency2 += 1\n", - " elif face == 3:\n", - " frequency3 += 1\n", - " elif face == 4:\n", - " frequency4 += 1\n", - " elif face == 5:\n", - " frequency5 += 1\n", - " elif face == 6:\n", - " frequency6 += 1\n", - "\n", - "print(f'Face{\"Frequency\":>13}')\n", - "print(f'{1:>4}{frequency1:>13}')\n", - "print(f'{2:>4}{frequency2:>13}')\n", - "print(f'{3:>4}{frequency3:>13}')\n", - "print(f'{4:>4}{frequency4:>13}')\n", - "print(f'{5:>4}{frequency5:>13}')\n", - "print(f'{6:>4}{frequency6:>13}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Seeding the Random-Number Generator for Reproducibility" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "random.seed(32)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for roll in range(10):\n", - " print(random.randrange(1, 7), end=' ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for roll in range(10):\n", - " print(random.randrange(1, 7), end=' ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "random.seed(32)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for roll in range(10):\n", - " print(random.randrange(1, 7), end=' ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/04_04selfcheck.ipynb b/examples/ch04/snippets_ipynb/04_04selfcheck.ipynb deleted file mode 100644 index 47e9f85..0000000 --- a/examples/ch04/snippets_ipynb/04_04selfcheck.ipynb +++ /dev/null @@ -1,83 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 4.4 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Requirements statement: Use a `for` statement, `randrange` and a conditional expression (introduced in the preceding chapter) to simulate 20 coin flips, displaying `H` for heads and `T` for tails all on the same line, each separated by a space. \n", - " \n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import random" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for i in range(20):\n", - " print('H' if random.randrange(2) == 0 else 'T', end=' ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/04_05.ipynb b/examples/ch04/snippets_ipynb/04_05.ipynb deleted file mode 100755 index 33caa73..0000000 --- a/examples/ch04/snippets_ipynb/04_05.ipynb +++ /dev/null @@ -1,108 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 4.5 Case Study: A Game of Chance" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# fig04_02.py\n", - "\"\"\"Simulating the dice game Craps.\"\"\"\n", - "import random\n", - "\n", - "def roll_dice():\n", - " \"\"\"Roll two dice and return their face values as a tuple.\"\"\"\n", - " die1 = random.randrange(1, 7)\n", - " die2 = random.randrange(1, 7)\n", - " return (die1, die2) # pack die face values into a tuple\n", - "\n", - "def display_dice(dice):\n", - " \"\"\"Display one roll of the two dice.\"\"\"\n", - " die1, die2 = dice # unpack the tuple into variables die1 and die2\n", - " print(f'Player rolled {die1} + {die2} = {sum(dice)}')\n", - "\n", - "die_values = roll_dice() # first roll\n", - "display_dice(die_values)\n", - "\n", - "# determine game status and point, based on first roll\n", - "sum_of_dice = sum(die_values)\n", - "\n", - "if sum_of_dice in (7, 11): # win\n", - " game_status = 'WON'\n", - "elif sum_of_dice in (2, 3, 12): # lose\n", - " game_status = 'LOST'\n", - "else: # remember point\n", - " game_status = 'CONTINUE'\n", - " my_point = sum_of_dice\n", - " print('Point is', my_point)\n", - "\n", - "# continue rolling until player wins or loses\n", - "while game_status == 'CONTINUE':\n", - " die_values = roll_dice()\n", - " display_dice(die_values)\n", - " sum_of_dice = sum(die_values)\n", - "\n", - " if sum_of_dice == my_point: # win by making point\n", - " game_status = 'WON'\n", - " elif sum_of_dice == 7: # lose by rolling 7\n", - " game_status = 'LOST'\n", - "\n", - "# display \"wins\" or \"loses\" message\n", - "if game_status == 'WON':\n", - " print('Player wins')\n", - "else:\n", - " print('Player loses')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/04_05selfcheck.ipynb b/examples/ch04/snippets_ipynb/04_05selfcheck.ipynb deleted file mode 100755 index 0a84d11..0000000 --- a/examples/ch04/snippets_ipynb/04_05selfcheck.ipynb +++ /dev/null @@ -1,100 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 4.5 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Pack a `student` tuple with the name `'Sue'` and the list `[89, 94, 85]`, display the tuple, then unpack it into variables `name` and `grades`, and display their values.\n", - "\n", - "**Answer:**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "student = ('Sue', [89, 94, 85])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "student" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "name, grades = student" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'{name}: {grades}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/04_07.ipynb b/examples/ch04/snippets_ipynb/04_07.ipynb deleted file mode 100755 index 3f805ce..0000000 --- a/examples/ch04/snippets_ipynb/04_07.ipynb +++ /dev/null @@ -1,81 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 4.7 `math` Module Functions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import math" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "math.sqrt(900)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "math.fabs(-10)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/04_08.ipynb b/examples/ch04/snippets_ipynb/04_08.ipynb deleted file mode 100755 index eae506d..0000000 --- a/examples/ch04/snippets_ipynb/04_08.ipynb +++ /dev/null @@ -1,106 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 4.8 Using IPython Tab Completion for Discovery" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import math" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# press after ma \n", - "ma" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Viewing Identifiers in a Module" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# press after the dot \n", - "math." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using the Currently Highlighted Function" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "math.fabs?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/04_09.ipynb b/examples/ch04/snippets_ipynb/04_09.ipynb deleted file mode 100755 index b0c957d..0000000 --- a/examples/ch04/snippets_ipynb/04_09.ipynb +++ /dev/null @@ -1,92 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 4.9 Default Parameter Values" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def rectangle_area(length=2, width=3):\n", - " \"\"\"Return a rectangle's area.\"\"\"\n", - " return length * width" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rectangle_area()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rectangle_area(10)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rectangle_area(10, 5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/04_10.ipynb b/examples/ch04/snippets_ipynb/04_10.ipynb deleted file mode 100644 index 79241b3..0000000 --- a/examples/ch04/snippets_ipynb/04_10.ipynb +++ /dev/null @@ -1,74 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 4.10 Keyword Arguments" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def rectangle_area(length, width):\n", - " \"\"\"Return a rectangle's area.\"\"\"\n", - " return length * width" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rectangle_area(width=5, length=10)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/04_11.ipynb b/examples/ch04/snippets_ipynb/04_11.ipynb deleted file mode 100644 index d7c287c..0000000 --- a/examples/ch04/snippets_ipynb/04_11.ipynb +++ /dev/null @@ -1,123 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 4.11 Arbitrary Argument Lists" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Defining a Function with an Arbitrary Argument List" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def average(*args):\n", - " return sum(args) / len(args)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "average(5, 10)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "average(5, 10, 15)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "average(5, 10, 15, 20)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Passing an Iterable’s Individual Elements as Function Arguments " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades = [88, 75, 96, 55, 83]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "average(*grades)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/04_11selfcheck.ipynb b/examples/ch04/snippets_ipynb/04_11selfcheck.ipynb deleted file mode 100755 index 1b387fc..0000000 --- a/examples/ch04/snippets_ipynb/04_11selfcheck.ipynb +++ /dev/null @@ -1,95 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 4.11 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Create a function named `calculate_product` that receives an arbitrary argument list and returns the product of all the arguments. Call the function with the arguments `10`, `20` and `30` then with the sequence of integers produced by `range(1, 6, 2)`. \n", - "\n", - "**Answer:**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def calculate_product(*args):\n", - " product = 1\n", - " for value in args:\n", - " product *= value\n", - " return product" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "calculate_product(10, 20, 30)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "calculate_product(*range(1, 6, 2))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/04_12.ipynb b/examples/ch04/snippets_ipynb/04_12.ipynb deleted file mode 100755 index 7f7e003..0000000 --- a/examples/ch04/snippets_ipynb/04_12.ipynb +++ /dev/null @@ -1,90 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 4.12 Methods: Functions That Belong to Objects" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "s = 'Hello'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "s.lower() # call lower method on string object s" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "s.upper()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "s" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/04_13.ipynb b/examples/ch04/snippets_ipynb/04_13.ipynb deleted file mode 100755 index 760423f..0000000 --- a/examples/ch04/snippets_ipynb/04_13.ipynb +++ /dev/null @@ -1,205 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 4.13 Scope Rules" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Local Scope" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Global Scope" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Accessing a Global Variable from a Function " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x = 7" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def access_global():\n", - " print('x printed from access_global:', x)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "access_global()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def try_to_modify_global():\n", - " x = 3.5\n", - " print('x printed from try_to_modify_global:', x)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "try_to_modify_global()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def modify_global():\n", - " global x;\n", - " x = 'hello'\n", - " print('x printed from modify_global:', x)\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "modify_global()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Blocks vs. Suites \n", - "### Shadowing Functions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sum = 10 + 5" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sum" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sum([10, 5])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Statements at Global Scope " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/04_14.ipynb b/examples/ch04/snippets_ipynb/04_14.ipynb deleted file mode 100755 index 205fa86..0000000 --- a/examples/ch04/snippets_ipynb/04_14.ipynb +++ /dev/null @@ -1,156 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 4.14 `import`: A Deeper Look" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Importing Multiple Identifiers from a Module" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from math import ceil, floor" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ceil(10.3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "floor(10.7)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Caution: Avoid Wildcard Imports " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "e = 'hello'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from math import *" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "e" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Binding Names for Modules and Module Identifiers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import statistics as stats" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades = [85, 93, 45, 87, 93]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "stats.mean(grades)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/04_14selfcheck.ipynb b/examples/ch04/snippets_ipynb/04_14selfcheck.ipynb deleted file mode 100755 index 1960393..0000000 --- a/examples/ch04/snippets_ipynb/04_14selfcheck.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 4.14 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Import the `decimal` module with the shorthand name `dec`, then create a `Decimal` object with the value `2.5` and square its value.\n", - "\n", - "**Answer:**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import decimal as dec" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dec.Decimal('2.5') ** 2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/04_15.ipynb b/examples/ch04/snippets_ipynb/04_15.ipynb deleted file mode 100755 index 021c030..0000000 --- a/examples/ch04/snippets_ipynb/04_15.ipynb +++ /dev/null @@ -1,173 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 4.15 Passing Arguments to Functions: A Deeper Look \n", - "### Memory Addresses, References and “Pointers”\n", - "### Built-In Function id and Object Identities " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x = 7" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "id(x)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Passing an Object to a Function " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def cube(number):\n", - " print('id(number):', id(number))\n", - " return number ** 3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cube(x)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Testing Object Identities with the is Operator " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def cube(number):\n", - " print('number is x:', number is x) # x is a global variable\n", - " return number ** 3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cube(x)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Immutable Objects as Arguments" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def cube(number):\n", - " print('id(number) before modifying number:', id(number))\n", - " number **= 3\n", - " print('id(number) after modifying number:', id(number))\n", - " return number" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cube(x)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'x = {x}; id(x) = {id(x)}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Mutable Objects as Arguments" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/04_15selfcheck.ipynb b/examples/ch04/snippets_ipynb/04_15selfcheck.ipynb deleted file mode 100755 index 3a1157c..0000000 --- a/examples/ch04/snippets_ipynb/04_15selfcheck.ipynb +++ /dev/null @@ -1,100 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 4.15 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Create a variable `width` with the value `15.5`, then show that modifying the variable creates a new object. Display `width`’s identity and value before and after modifying its value.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "width = 15.5" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('id:', id(width), ' value:', width)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "width *= 3 " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('id:', id(width), ' value:', width)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/04_17.ipynb b/examples/ch04/snippets_ipynb/04_17.ipynb deleted file mode 100644 index b7eb750..0000000 --- a/examples/ch04/snippets_ipynb/04_17.ipynb +++ /dev/null @@ -1,97 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 4.17 Functional-Style Programming" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Pure Functions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "values = [1, 2, 3]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sum(values)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sum(values) # same call always returns same result" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "values" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/04_18.ipynb b/examples/ch04/snippets_ipynb/04_18.ipynb deleted file mode 100755 index 2d356b8..0000000 --- a/examples/ch04/snippets_ipynb/04_18.ipynb +++ /dev/null @@ -1,113 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 4.18 Intro to Data Science: Measures of Dispersion" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Variance" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import statistics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "statistics.pvariance([1, 3, 4, 2, 6, 5, 3, 4, 5, 2])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Standard Deviation" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "statistics.pstdev([1, 3, 4, 2, 6, 5, 3, 4, 5, 2])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import math" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "math.sqrt(statistics.pvariance([1, 3, 4, 2, 6, 5, 3, 4, 5, 2]))\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/04_18selfcheck.ipynb b/examples/ch04/snippets_ipynb/04_18selfcheck.ipynb deleted file mode 100755 index fb3fa1e..0000000 --- a/examples/ch04/snippets_ipynb/04_18selfcheck.ipynb +++ /dev/null @@ -1,91 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 4.18 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** In this section, we worked with population variance and population standard deviation. There is a subtle difference between the _population variance_ and the _sample variance_. In our example, instead of dividing by 10 (the number of die rolls), sample variance would divide by 9 (which is one less than the sample size). The difference is pronounced for small samples but becomes insignificant as the sample size increases. The `statistics` module provides the functions `variance` and `stdev` to calculate the sample variance and sample standard deviation, respectively. Redo the manual calculations, then use the `statistics` module’s functions to confirm this difference between the two methods of calculation.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import statistics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "statistics.variance([1, 3, 4, 2, 6, 5, 3, 4, 5, 2])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "statistics.stdev([1, 3, 4, 2, 6, 5, 3, 4, 5, 2])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/ex04_03.ipynb b/examples/ch04/snippets_ipynb/ex04_03.ipynb deleted file mode 100755 index 60b33e4..0000000 --- a/examples/ch04/snippets_ipynb/ex04_03.ipynb +++ /dev/null @@ -1,74 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**4.3 _(What’s Wrong with This Code?)_** What is wrong with the following `cube` function’s definition?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def cube(x):\n", - " \"\"\"Calculate the cube of x.\"\"\"\n", - " x ** 3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('The cube of 2 is', cube(2))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/ex04_04.ipynb b/examples/ch04/snippets_ipynb/ex04_04.ipynb deleted file mode 100755 index afa1183..0000000 --- a/examples/ch04/snippets_ipynb/ex04_04.ipynb +++ /dev/null @@ -1,77 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**4.4 _(What’s Does This Code Do?)_** What does the following `mystery` function do? Assume you pass the list `[1, 2, 3, 4, 5]` as an argument." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def mystery(x):\n", - " y = 0\n", - "\n", - " for value in x:\n", - " y += value ** 2\n", - "\n", - " return y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Answer: ** \n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/ex04_05.ipynb b/examples/ch04/snippets_ipynb/ex04_05.ipynb deleted file mode 100755 index 65d092d..0000000 --- a/examples/ch04/snippets_ipynb/ex04_05.ipynb +++ /dev/null @@ -1,66 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**4.5 _(Fill in the Missing Code?)_** Replace the `***`s in the `seconds_since_midnight` function so that it returns the number of seconds since midnight. The function should receive three integers representing the current time of day. Assume that the hour is a value from `0` (midnight) through `23` (11 PM) and that the minute and second are values from `0` to `59`. Test your function with actual times. For example, if you call the function for 1:30:45 PM by passing `13`, `30` and `45`, the function should return `48645`. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def seconds_since_midnight(***, ***, ***):\n", - " hour_in_seconds = ***\n", - " minute_in_seconds = ***\n", - " return hour_in_seconds + minute_in_seconds + seconds" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch04/snippets_ipynb/files/art/check.png b/examples/ch04/snippets_ipynb/files/art/check.png deleted file mode 100755 index eea18cd..0000000 Binary files a/examples/ch04/snippets_ipynb/files/art/check.png and /dev/null differ diff --git a/examples/ch04/snippets_py/04_02.py b/examples/ch04/snippets_py/04_02.py deleted file mode 100755 index 0b52206..0000000 --- a/examples/ch04/snippets_py/04_02.py +++ /dev/null @@ -1,33 +0,0 @@ -# Section 4.2 snippets - -def square(number): - """Calculate the square of number.""" - return number ** 2 - -square(7) - -square(2.5) - -# Returning a Result to a Function’s Caller -print('The square of 7 is', square(7)) - -# Accessing a Function’s Docstring Via IPython’s Help Mechanism -square? - -square?? - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_02selfcheck.py b/examples/ch04/snippets_py/04_02selfcheck.py deleted file mode 100755 index 5fdea1d..0000000 --- a/examples/ch04/snippets_py/04_02selfcheck.py +++ /dev/null @@ -1,23 +0,0 @@ -# Section 4.2 Self Check snippets - -# Exercise 3 -def square_root(number): - return number ** 0.5 # or number ** (1 / 2) - -square_root(6.25) - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_03.py b/examples/ch04/snippets_py/04_03.py deleted file mode 100755 index c855981..0000000 --- a/examples/ch04/snippets_py/04_03.py +++ /dev/null @@ -1,40 +0,0 @@ -# Section 4.3 snippets - -def maximum(value1, value2, value3): - """Return the maximum of three values.""" - max_value = value1 - if value2 > max_value: - max_value = value2 - if value3 > max_value: - max_value = value3 - return max_value - -maximum(12, 27, 36) - -maximum(12.3, 45.6, 9.7) - -maximum('yellow', 'red', 'orange') - -maximum(13.5, -3, 7) - -# Python’s Built-In max and min Functions -max('yellow', 'red', 'orange', 'blue', 'green') - -min(15, 9, 27, 14) - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_03selfcheck.py b/examples/ch04/snippets_py/04_03selfcheck.py deleted file mode 100755 index 8c21e57..0000000 --- a/examples/ch04/snippets_py/04_03selfcheck.py +++ /dev/null @@ -1,23 +0,0 @@ -# Section 4.3 Self Check snippets - -# Exercise 3 -max([14, 27, 5, 3]) - -min('orange') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_04.py b/examples/ch04/snippets_py/04_04.py deleted file mode 100755 index efb9c91..0000000 --- a/examples/ch04/snippets_py/04_04.py +++ /dev/null @@ -1,43 +0,0 @@ -# Section 4.4 snippets - -# Rolling a Six-Sided Die -import random - -for roll in range(10): - print(random.randrange(1, 7), end=' ') - -for roll in range(10): - print(random.randrange(1, 7), end=' ') - -# Seeding the Random-Number Generator for Reproducibility - -random.seed(32) - -for roll in range(10): - print(random.randrange(1, 7), end=' ') - -for roll in range(10): - print(random.randrange(1, 7), end=' ') - -random.seed(32) - -for roll in range(10): - print(random.randrange(1, 7), end=' ') - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_04selfcheck.py b/examples/ch04/snippets_py/04_04selfcheck.py deleted file mode 100755 index 77fdffa..0000000 --- a/examples/ch04/snippets_py/04_04selfcheck.py +++ /dev/null @@ -1,23 +0,0 @@ -# Section 4.4 Self Check snippets - -# Exercise 3 -import random - -for i in range(20): - print('H' if random.randrange(2) == 0 else 'T', end=' ') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_05selfcheck.py b/examples/ch04/snippets_py/04_05selfcheck.py deleted file mode 100755 index 114456e..0000000 --- a/examples/ch04/snippets_py/04_05selfcheck.py +++ /dev/null @@ -1,27 +0,0 @@ -# Section 4.5 Self Check snippets - -# Exercise 2 -student = ('Sue', [89, 94, 85]) - -student - -name, grades = student - -print(f'{name}: {grades}') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_07.py b/examples/ch04/snippets_py/04_07.py deleted file mode 100755 index d7ba12e..0000000 --- a/examples/ch04/snippets_py/04_07.py +++ /dev/null @@ -1,23 +0,0 @@ -# Section 4.7 snippets -import math - -math.sqrt(900) - -math.fabs(-10) - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_08.py b/examples/ch04/snippets_py/04_08.py deleted file mode 100755 index e7af8ed..0000000 --- a/examples/ch04/snippets_py/04_08.py +++ /dev/null @@ -1,26 +0,0 @@ -# Section 4.8 snippets - -import math - -ma # press after ma - -# Viewing Identifiers in a Module -math. # press after the dot - -# Using the Currently Highlighted Function -math.fabs? - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_09.py b/examples/ch04/snippets_py/04_09.py deleted file mode 100755 index e2e87f9..0000000 --- a/examples/ch04/snippets_py/04_09.py +++ /dev/null @@ -1,25 +0,0 @@ -# Section 4.9 snippets -def rectangle_area(length=2, width=3): - """Return a rectangle's area.""" - return length * width - -rectangle_area() - -rectangle_area(10) - -rectangle_area(10, 5) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_09selfcheck.py b/examples/ch04/snippets_py/04_09selfcheck.py deleted file mode 100755 index d9c2bde..0000000 --- a/examples/ch04/snippets_py/04_09selfcheck.py +++ /dev/null @@ -1,21 +0,0 @@ -# Section 3.9 Self Checksnippets - -# Exercise 2 -x = 12 -x **= 2 -x - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_10.py b/examples/ch04/snippets_py/04_10.py deleted file mode 100755 index f84e467..0000000 --- a/examples/ch04/snippets_py/04_10.py +++ /dev/null @@ -1,21 +0,0 @@ -# Section 4.10 snippets -def rectangle_area(length, width): - """Return a rectangle's area.""" - return length * width - -rectangle_area(width=5, length=10) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_10selfcheck.py b/examples/ch04/snippets_py/04_10selfcheck.py deleted file mode 100755 index ae9a4af..0000000 --- a/examples/ch04/snippets_py/04_10selfcheck.py +++ /dev/null @@ -1,19 +0,0 @@ -# Section 3.10 Self Check snippets -number1 = 7 -number2 = 5 -print(f'{number1} times {number2} is {number1 * number2}') - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_11.py b/examples/ch04/snippets_py/04_11.py deleted file mode 100755 index 69a791b..0000000 --- a/examples/ch04/snippets_py/04_11.py +++ /dev/null @@ -1,32 +0,0 @@ -# Section 4.11 snippets - -# Defining a Function with an Arbitrary Argument List -def average(*args): - return sum(args) / len(args) - -average(5, 10) - -average(5, 10, 15) - -average(5, 10, 15, 20) - -# Passing an Iterable’s Individual Elements as Function Arguments -grades = [88, 75, 96, 55, 83] - -average(*grades) - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_11selfcheck.py b/examples/ch04/snippets_py/04_11selfcheck.py deleted file mode 100755 index 6aa90de..0000000 --- a/examples/ch04/snippets_py/04_11selfcheck.py +++ /dev/null @@ -1,24 +0,0 @@ -# Section 3.7 Self Check snippets - -# Exercise 2 -product = 7 - -while product <= 1000: - product = product * 7 - -product - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_12.py b/examples/ch04/snippets_py/04_12.py deleted file mode 100755 index 4c86016..0000000 --- a/examples/ch04/snippets_py/04_12.py +++ /dev/null @@ -1,24 +0,0 @@ -# Section 4.12 snippets -s = 'Hello' - -s.lower() # call lower method on string object s - -s.upper() - -s - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_12selfcheck.py b/examples/ch04/snippets_py/04_12selfcheck.py deleted file mode 100755 index c18d312..0000000 --- a/examples/ch04/snippets_py/04_12selfcheck.py +++ /dev/null @@ -1,25 +0,0 @@ -# Section 3.8 Self Check snippets - -# Exercise 2 -total = 0 - -for number in range(1000001): - total = total + number - -total - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_13.py b/examples/ch04/snippets_py/04_13.py deleted file mode 100755 index 2b93236..0000000 --- a/examples/ch04/snippets_py/04_13.py +++ /dev/null @@ -1,48 +0,0 @@ -# Section 4.13 snippets - -# Accessing a Global Variable from a Function -x = 7 - -def access_global(): - print('x printed from access_global:', x) - -access_global() - -def try_to_modify_global(): - x = 3.5 - print('x printed from try_to_modify_global:', x) - -try_to_modify_global() - -x - -def modify_global(): - global x; - x = 'hello' - print('x printed from modify_global:', x) - -modify_global() - -x - -# Shadowing Functions -sum = 10 + 5 - -sum - -sum([10, 5]) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_14.py b/examples/ch04/snippets_py/04_14.py deleted file mode 100755 index 136144c..0000000 --- a/examples/ch04/snippets_py/04_14.py +++ /dev/null @@ -1,39 +0,0 @@ -# Section 4.14 snippets - -# Importing Multiple Identifiers from a Module -from math import ceil, floor - -ceil(10.3) - -floor(10.7) - -# Caution: Avoid Wildcard Imports -e = 'hello' - -from math import * - -e - -# Binding Names for Modules and Module Identifiers -import statistics as stats - -grades = [85, 93, 45, 87, 93] - -stats.mean(grades) - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_14selfcheck.py b/examples/ch04/snippets_py/04_14selfcheck.py deleted file mode 100755 index 9687480..0000000 --- a/examples/ch04/snippets_py/04_14selfcheck.py +++ /dev/null @@ -1,22 +0,0 @@ -# Section 4.14 Self Check snippets - -# Exercise 2 -import decimal as dec - -dec.Decimal('2.5') ** 2 -Decimal('6.25') - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_15.py b/examples/ch04/snippets_py/04_15.py deleted file mode 100755 index ff7af30..0000000 --- a/examples/ch04/snippets_py/04_15.py +++ /dev/null @@ -1,46 +0,0 @@ -# Section 4.15 snippets - -# Built-In Function id and Object Identities -x = 7 - -id(x) - -# Passing an Object to a Function -def cube(number): - print('id(number):', id(number)) - return number ** 3 - -cube(x) - -# Testing Object Identities with the is Operator -def cube(number): - print('number is x:', number is x) # x is a global variable - return number ** 3 - -cube(x) - -# Immutable Objects as Arguments -def cube(number): - print('id(number) before modifying number:', id(number)) - number **= 3 - print('id(number) after modifying number:', id(number)) - return number - -cube(x) - -print(f'x = {x}; id(x) = {id(x)}') - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_15selfcheck.py b/examples/ch04/snippets_py/04_15selfcheck.py deleted file mode 100755 index 5fc74d1..0000000 --- a/examples/ch04/snippets_py/04_15selfcheck.py +++ /dev/null @@ -1,26 +0,0 @@ -# Section 4.15 Self Check snippets - -# Exercise 3 -width = 15.5 - -print('id:', id(width), ' value:', width) - -width = width * 3 - -print('id:', id(width), ' value:', width) - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_17.py b/examples/ch04/snippets_py/04_17.py deleted file mode 100644 index b62c01a..0000000 --- a/examples/ch04/snippets_py/04_17.py +++ /dev/null @@ -1,27 +0,0 @@ -# Section 4.17 snippets - -values = [1, 2, 3] - -sum(values) - -sum(values) # same call always returns same result - -values - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_18.py b/examples/ch04/snippets_py/04_18.py deleted file mode 100755 index e9ed62b..0000000 --- a/examples/ch04/snippets_py/04_18.py +++ /dev/null @@ -1,30 +0,0 @@ -# Section 4.18 snippets - -# Variance -import statistics - -statistics.pvariance([1, 3, 4, 2, 6, 5, 3, 4, 5, 2]) - -# Standard Deviation -statistics.pstdev([1, 3, 4, 2, 6, 5, 3, 4, 5, 2]) - -import math - -math.sqrt(statistics.pvariance([1, 3, 4, 2, 6, 5, 3, 4, 5, 2])) - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/04_18selfcheck.py b/examples/ch04/snippets_py/04_18selfcheck.py deleted file mode 100755 index f3e0add..0000000 --- a/examples/ch04/snippets_py/04_18selfcheck.py +++ /dev/null @@ -1,23 +0,0 @@ -# Section 4.18 Self Check snippets - -# Exercise 3 -import statistics - -statistics.variance([1, 3, 4, 2, 6, 5, 3, 4, 5, 2]) - -statistics.stdev([1, 3, 4, 2, 6, 5, 3, 4, 5, 2]) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/ex04_03.py b/examples/ch04/snippets_py/ex04_03.py deleted file mode 100755 index 06a4c7f..0000000 --- a/examples/ch04/snippets_py/ex04_03.py +++ /dev/null @@ -1,21 +0,0 @@ -# Exercise 4.3 -def cube(x): - """Calculate the cube of x.""" - x ** 3 - -print('The cube of 2 is', cube(2)) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/ex04_04.py b/examples/ch04/snippets_py/ex04_04.py deleted file mode 100755 index ed32546..0000000 --- a/examples/ch04/snippets_py/ex04_04.py +++ /dev/null @@ -1,23 +0,0 @@ -# Exercise 4.4 -def mystery(x): - y = 0 - - for value in x: - y += value ** 2 - - return y - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch04/snippets_py/ex04_05.py b/examples/ch04/snippets_py/ex04_05.py deleted file mode 100755 index 9e37d8c..0000000 --- a/examples/ch04/snippets_py/ex04_05.py +++ /dev/null @@ -1,20 +0,0 @@ -# Exercise 4.5 -def seconds_since_midnight(***, ***, ***): - hour_in_seconds = *** - minute_in_seconds = *** - return *** - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/RollDie.py b/examples/ch05/RollDie.py deleted file mode 100755 index d6f07fe..0000000 --- a/examples/ch05/RollDie.py +++ /dev/null @@ -1,50 +0,0 @@ -# RollDie.py -"""Graphing frequencies of die rolls with Seaborn.""" -import matplotlib.pyplot as plt -import numpy as np -import random -import seaborn as sns -import sys - -# use list comprehension to create a list of rolls of a six-sided die -rolls = [random.randrange(1, 7) for i in range(int(sys.argv[1]))] - -# NumPy unique function returns unique faces and frequency of each face -values, frequencies = np.unique(rolls, return_counts=True) - -title = f'Rolling a Six-Sided Die {len(rolls):,} Times' -sns.set_style('whitegrid') # white backround with gray grid lines -axes = sns.barplot(x=values, y=frequencies, palette='bright') # create bars -axes.set_title(title) # set graph title -axes.set(xlabel='Die Value', ylabel='Frequency') # label the axes - -# scale y-axis by 10% to make room for text above bars -axes.set_ylim(top=max(frequencies) * 1.10) - -# display frequency & percentage above each patch (bar) -for bar, frequency in zip(axes.patches, frequencies): - text_x = bar.get_x() + bar.get_width() / 2.0 - text_y = bar.get_height() - text = f'{frequency:,}\n{frequency / len(rolls):.3%}' - axes.text(text_x, text_y, text, - fontsize=11, ha='center', va='bottom') - -plt.show() # display graph - - - - -#************************************************************************** -#* (C) Copyright 1992-2018 by Deitel & Associates, Inc. and * -#* Pearson Education, Inc. All Rights Reserved. * -#* * -#* DISCLAIMER: The authors and publisher of this book have used their * -#* best efforts in preparing the book. These efforts include the * -#* development, research, and testing of the theories and programs * -#* to determine their effectiveness. The authors and publisher make * -#* no warranty of any kind, expressed or implied, with regard to these * -#* programs or to the documentation contained in these books. The authors * -#* and publisher shall not be liable in any event for incidental or * -#* consequential damages in connection with, or arising out of, the * -#* furnishing, performance, or use of these programs. * -#************************************************************************** diff --git a/examples/ch05/fig05_01.py b/examples/ch05/fig05_01.py deleted file mode 100755 index 6edbc51..0000000 --- a/examples/ch05/fig05_01.py +++ /dev/null @@ -1,41 +0,0 @@ -# fig05_01.py -"""Displaying a bar chart""" -numbers = [19, 3, 15, 7, 11] - -print('\nCreating a bar chart from numbers:') -print(f'Index{"Value":>8} Bar') - -for index, value in enumerate(numbers): - print(f'{index:>5}{value:>8} {"*" * value}') - - - - - - - - - - - - - - - - - - -#************************************************************************** -#* (C) Copyright 1992-2018 by Deitel & Associates, Inc. and * -#* Pearson Education, Inc. All Rights Reserved. * -#* * -#* DISCLAIMER: The authors and publisher of this book have used their * -#* best efforts in preparing the book. These efforts include the * -#* development, research, and testing of the theories and programs * -#* to determine their effectiveness. The authors and publisher make * -#* no warranty of any kind, expressed or implied, with regard to these * -#* programs or to the documentation contained in these books. The authors * -#* and publisher shall not be liable in any event for incidental or * -#* consequential damages in connection with, or arising out of, the * -#* furnishing, performance, or use of these programs. * -#************************************************************************** diff --git a/examples/ch05/snippets_ipynb/05_02.ipynb b/examples/ch05/snippets_ipynb/05_02.ipynb deleted file mode 100755 index 5ce1333..0000000 --- a/examples/ch05/snippets_ipynb/05_02.ipynb +++ /dev/null @@ -1,462 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 5.2 Lists" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a List" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c = [-45, 6, 0, 72, 1543]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Accessing Elements of a List" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c[0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c[4]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Determining a List’s Length " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "len(c)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Accessing Elements from the End of the List with Negative Indices" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c[-1]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c[-5]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Indices Must Be Integers or Integer Expressions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a = 1" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "b = 2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c[a + b]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Lists Are Mutable" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c[4] = 17" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Some Sequences Are Immutable" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "s = 'hello'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "s[0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "s[0] = 'H'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Attempting to Access a Nonexistent Element" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c[100]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using List Elements in Expressions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c[0] + c[1] + c[2]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Appending to a List with +=" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a_list = []" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for number in range(1, 6):\n", - " a_list += [number]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a_list" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "letters = []" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "letters += 'Python'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "letters" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Concatenating Lists with +" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list1 = [10, 20, 30]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list2 = [40, 50]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "concatenated_list = list1 + list2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "concatenated_list" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using `for` and `range` to Access List Indices and Values" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for i in range(len(concatenated_list)): \n", - " print(f'{i}: {concatenated_list[i]}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Comparison Operators" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a = [1, 2, 3]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "b = [1, 2, 3]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c = [1, 2, 3, 4]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a == b" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a == c" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a < c" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c >= b" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_02selfcheck.ipynb b/examples/ch05/snippets_ipynb/05_02selfcheck.ipynb deleted file mode 100755 index 8acddef..0000000 --- a/examples/ch05/snippets_ipynb/05_02selfcheck.ipynb +++ /dev/null @@ -1,140 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Check mark indicating Self Check exercises.](files/art/check.png)\n", - "\n", - "# 5.2 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Create a function `cube_list` that cubes each element of a list. Call the function with the list `numbers` containing 1 through 10. Show `numbers` after the call.\n", - "\n", - "**Answer:**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def cube_list(values):\n", - " for i in range(len(values)):\n", - " values[i] **= 3\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cube_list(numbers)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**4. _(IPython Session)_** Use an empty list named `characters` and a `+=` augmented assignment statement to convert the string `'Birthday'` into a list of its characters. \n", - "\n", - "**Answer:**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "characters = []" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "characters += 'Birthday'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "characters" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_03.ipynb b/examples/ch05/snippets_ipynb/05_03.ipynb deleted file mode 100755 index 384f031..0000000 --- a/examples/ch05/snippets_ipynb/05_03.ipynb +++ /dev/null @@ -1,320 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 5.3 Tuples" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating Tuples" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "student_tuple = ()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "student_tuple" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "len(student_tuple)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "student_tuple = 'John', 'Green', 3.3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "student_tuple" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "len(student_tuple)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "another_student_tuple = ('Mary', 'Red', 3.3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "another_student_tuple" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a_singleton_tuple = ('red',) # note the comma" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a_singleton_tuple" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " \n", - "\n", - "### Accessing Tuple Elements" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "time_tuple = (9, 16, 1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "time_tuple" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "time_tuple[0] * 3600 + time_tuple[1] * 60 + time_tuple[2] " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Adding Items to a String or Tuple" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tuple1 = (10, 20, 30)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tuple2 = tuple1" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tuple2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tuple1 += (40, 50)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tuple1 " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tuple2 " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " \n", - "\n", - "### Appending Tuples to Lists" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = [1, 2, 3, 4, 5]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers += (6, 7)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " \n", - "\n", - "### Tuples May Contain Mutable Objects" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "student_tuple = ('Amanda', 'Blue', [98, 75, 87])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "student_tuple[2][1] = 85" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "student_tuple" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_03selfcheck.ipynb b/examples/ch05/snippets_ipynb/05_03selfcheck.ipynb deleted file mode 100755 index 1524573..0000000 --- a/examples/ch05/snippets_ipynb/05_03selfcheck.ipynb +++ /dev/null @@ -1,102 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "\n", - "\n", - "# 5.3 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Create a single-element tuple containing 123.45, then display it. \n", - "\n", - "**Answer:**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "single = (123.45,)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "single" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**4. _(IPython Session)_** Show what happens when you attempt to concatenate sequences of different types—the list `[1, 2, 3]` and the tuple `(4, 5, 6)`—using the `+` operator.\n", - "\n", - "**Answer:**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "[1, 2, 3] + (4, 5, 6)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_04.ipynb b/examples/ch05/snippets_ipynb/05_04.ipynb deleted file mode 100755 index 78f5356..0000000 --- a/examples/ch05/snippets_ipynb/05_04.ipynb +++ /dev/null @@ -1,255 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 5.4 Unpacking Sequences" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "student_tuple = ('Amanda', [98, 85, 87])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "first_name, grades = student_tuple" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "first_name" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "first, second = 'hi'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'{first} {second}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "number1, number2, number3 = [2, 3, 5]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'{number1} {number2} {number3}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "number1, number2, number3 = range(10, 40, 10)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'{number1} {number2} {number3}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Swapping Values Via Packing and Unpacking" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "number1 = 99" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "number2 = 22" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "number1, number2 = (number2, number1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'number1 = {number1}; number2 = {number2}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Accessing Indices and Values Safely with Built-in Function enumerate" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "colors = ['red', 'orange', 'yellow']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list(enumerate(colors))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tuple(enumerate(colors))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for index, value in enumerate(colors):\n", - " print(f'{index}: {value}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a Primitive Bar Chart" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# fig05_01.py\n", - "\"\"\"Displaying a bar chart\"\"\"\n", - "numbers = [19, 3, 15, 7, 11]\n", - "\n", - "print('\\nCreating a bar chart from numbers:')\n", - "print(f'Index{\"Value\":>8} Bar')\n", - "\n", - "for index, value in enumerate(numbers):\n", - " print(f'{index:>5}{value:>8} {\"*\" * value}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_04selfcheck.ipynb b/examples/ch05/snippets_ipynb/05_04selfcheck.ipynb deleted file mode 100755 index 5b76bf9..0000000 --- a/examples/ch05/snippets_ipynb/05_04selfcheck.ipynb +++ /dev/null @@ -1,137 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 5.4 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Create a tuple `high_low` representing a day of the week (a string) and its high and low temperatures (integers), display its string representation, then perform the following tasks in an interactive IPython session: \n", - "\n", - "a. Use the `[]` operator to access and display the `high_low` tuple’s elements. \n", - "\n", - "b. Unpack the `high_low` tuple into the variables `day` and `high`. What happens and why? " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "high_low = ('Monday', 87, 65)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "high_low" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'{high_low[0]}: High={high_low[1]}, Low={high_low[2]}') " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "day, high = high_low" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Answer:** For Part (b) an error occurs because you must unpack _all_ the elements of a sequence. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**4. _(IPython Session)_** Create the list `names` containing three name strings. Use a `for` loop and the `enumerate` function to iterate through the elements and display each element’s index and value. \n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "names = ['Amanda', 'Sam', 'David']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for i, name in enumerate(names):\n", - " print(f'{i}: {name}')\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_05.ipynb b/examples/ch05/snippets_ipynb/05_05.ipynb deleted file mode 100755 index a83e23e..0000000 --- a/examples/ch05/snippets_ipynb/05_05.ipynb +++ /dev/null @@ -1,319 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 5.5 Sequence Slicing" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Specifying a Slice with Starting and Ending Indices" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = [2, 3, 5, 7, 11, 13, 17, 19]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers[2:6]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Specifying a Slice with Only an Ending Index" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers[:6]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers[0:6]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Specifying a Slice with Only a Starting Index" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers[6:]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers[6:len(numbers)]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Specifying a Slice with No Indices" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers[:]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Slicing with Steps" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers[::2]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Slicing with Negative Indices and Steps" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers[::-1]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers[-1:-9:-1]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Modifying Lists Via Slices" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers[0:3] = ['two', 'three', 'five']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers[0:3] = []" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = [2, 3, 5, 7, 11, 13, 17, 19]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers[::2] = [100, 100, 100, 100]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "id(numbers)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers[:] = []" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "id(numbers)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = []" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "id(numbers)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_05selfcheck.ipynb b/examples/ch05/snippets_ipynb/05_05selfcheck.ipynb deleted file mode 100755 index b102fc2..0000000 --- a/examples/ch05/snippets_ipynb/05_05selfcheck.ipynb +++ /dev/null @@ -1,153 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 5.5 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Create a list called `numbers` containing the values from `1` through `15`, then use _slices_ to perform the following operations consecutively:\n", - "\n", - "a. Select `number`’s even integers. \n", - "\n", - "b. Replace the elements at indices `5` through `9` with `0`s, then show the resulting list.\n", - "\n", - "c. Keep only the first five elements, then show the resulting list.\n", - "\n", - "d. Delete all the remaining elements by assigning to a slice. Show the resulting list.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = list(range(1, 16))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers[1:len(numbers):2]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers[5:10] = [0] * len(numbers[5:10])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers[5:] = []" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers[:] = []" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_06.ipynb b/examples/ch05/snippets_ipynb/05_06.ipynb deleted file mode 100755 index 3ef2c20..0000000 --- a/examples/ch05/snippets_ipynb/05_06.ipynb +++ /dev/null @@ -1,190 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 5.6 del Statement" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Deleting the Element at a Specific List Index" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = list(range(0, 10))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "del numbers[-1]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Deleting a Slice from a List" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "del numbers[0:2]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "del numbers[::2]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Deleting a Slice Representing the Entire List" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "del numbers[:]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Deleting a Variable from the Current Session" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "del numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_06selfcheck.ipynb b/examples/ch05/snippets_ipynb/05_06selfcheck.ipynb deleted file mode 100755 index 67b93f0..0000000 --- a/examples/ch05/snippets_ipynb/05_06selfcheck.ipynb +++ /dev/null @@ -1,122 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 5.6 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Create a list called `numbers` containing the values from `1` through `15`, then use the `del` statement to perform the following operations consecutively:\n", - "\n", - "a. Delete a slice containing the first four elements, then show the resulting list.\n", - "\n", - "b. Starting with the first element, use a slice to delete every other element of the list, then show the resulting list.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = list(range(1, 16))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "del numbers[0:4]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "del numbers[::2]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_07.ipynb b/examples/ch05/snippets_ipynb/05_07.ipynb deleted file mode 100755 index 4989b61..0000000 --- a/examples/ch05/snippets_ipynb/05_07.ipynb +++ /dev/null @@ -1,141 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 5.7 Passing Lists to Functions" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Passing an Entire List to a Function" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def modify_elements(items):\n", - " \"\"\"\"Multiplies all element values in items by 2.\"\"\"\n", - " for i in range(len(items)):\n", - " items[i] *= 2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = [10, 3, 7, 1, 9]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "modify_elements(numbers)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Passing a Tuple to a Function" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers_tuple = (10, 20, 30)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers_tuple" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "modify_elements(numbers_tuple)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### A Note Regarding Tracebacks" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_08.ipynb b/examples/ch05/snippets_ipynb/05_08.ipynb deleted file mode 100755 index ef0e81c..0000000 --- a/examples/ch05/snippets_ipynb/05_08.ipynb +++ /dev/null @@ -1,228 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 5.8 Sorting Lists" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Sorting a List in Ascending Order" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = [10, 3, 7, 1, 9, 4, 2, 8, 5, 6]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers.sort()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Sorting a List in Descending Order" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers.sort(reverse=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Built-In Function `sorted`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = [10, 3, 7, 1, 9, 4, 2, 8, 5, 6]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ascending_numbers = sorted(numbers)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ascending_numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "letters = 'fadgchjebi'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ascending_letters = sorted(letters)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ascending_letters" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "letters" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "colors = ('red', 'orange', 'yellow', 'green', 'blue')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ascending_colors = sorted(colors)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ascending_colors" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "colors" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_08selfcheck.ipynb b/examples/ch05/snippets_ipynb/05_08selfcheck.ipynb deleted file mode 100755 index 5b9e55b..0000000 --- a/examples/ch05/snippets_ipynb/05_08selfcheck.ipynb +++ /dev/null @@ -1,98 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 5.8 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Create a foods list containing `'Cookies'`, `'pizza'`, `'Grapes'`, `'apples'`, `'steak'` and `'Bacon'`. Use list method `sort` to sort the list in ascending order. Are the strings in alphabetical order? \n", - " \n", - "**Answer:**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "foods = ['Cookies', 'pizza', 'Grapes', 'apples', 'steak', 'Bacon']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "foods.sort()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "foods" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "They are probably not in what you’d consider alphabetical order, but they are in order as defined by the underlying character set. As you’ll see later in the chapter, strings are compared by their character’s values in the underlying character set, not their letters, and the values of uppercase letters are lower than the values of lowercase letters." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_09.ipynb b/examples/ch05/snippets_ipynb/05_09.ipynb deleted file mode 100755 index 289fe9e..0000000 --- a/examples/ch05/snippets_ipynb/05_09.ipynb +++ /dev/null @@ -1,207 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 5.9 Searching Sequences" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### List Method index" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = [3, 7, 1, 4, 2, 8, 5, 6]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers.index(5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Specifying the Starting Index of a Search" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers *= 2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers.index(5, 7)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Specifying the Starting and Ending Indices of a Search" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers.index(7, 0, 4)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Operators `in` and `not in`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "1000 in numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "5 in numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "1000 not in numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "5 not in numbers" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using Operator `in` to Prevent a `ValueError`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "key = 1000" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if key in numbers:\n", - " print(f'found {key} at index {numbers.index(search_key)}')\n", - "else:\n", - " print(f'{key} not found')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Built-In Functions `any` and `all`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_09selfcheck.ipynb b/examples/ch05/snippets_ipynb/05_09selfcheck.ipynb deleted file mode 100755 index df3a73c..0000000 --- a/examples/ch05/snippets_ipynb/05_09selfcheck.ipynb +++ /dev/null @@ -1,92 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 5.9 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Create a five-element list containing `67`, `12`, `46`, `43` and `13`, then use list method `index` to search for a `43` and `44`. Ensure that no `ValueError` occurs when searching for `44`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = [67, 12, 46, 43, 13]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers.index(43)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if 44 in numbers:\n", - " print(f'Found 44 at index: {numbers.index(44)}')\n", - "else:\n", - " print('44 not found')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_10.ipynb b/examples/ch05/snippets_ipynb/05_10.ipynb deleted file mode 100755 index ff6c1b3..0000000 --- a/examples/ch05/snippets_ipynb/05_10.ipynb +++ /dev/null @@ -1,354 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 5.10 Other List Methods " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "color_names = ['orange', 'yellow', 'green']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Inserting an Element at a Specific List Index" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "color_names.insert(0, 'red')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "color_names" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Adding an Element to the End of a List" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "color_names.append('blue')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "color_names" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Adding All the Elements of a Sequence to the End of a List" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "color_names.extend(['indigo', 'violet'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "color_names" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sample_list = []" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "s = 'abc'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sample_list.extend(s)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sample_list" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "t = (1, 2, 3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sample_list.extend(t)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sample_list" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sample_list.extend((4, 5, 6)) # note the extra parentheses" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sample_list" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Removing the First Occurrence of an Element in a List " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "color_names.remove('green')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "color_names" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Emptying a List" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "color_names.clear()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "color_names" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Counting the Number of Occurrences of an Item" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "responses = [1, 2, 5, 4, 3, 5, 2, 1, 3, 3, 1, 4, 3, 3, 3, 2, 3, 3, 2, 2]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for i in range(1, 6):\n", - " print(f'{i} appears {responses.count(i)} times in responses')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Reversing a List’s Elements" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "color_names = ['red', 'orange', 'yellow', 'green', 'blue']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "color_names.reverse()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "color_names" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Copying a List" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "copied_list = color_names.copy()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "copied_list" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_10selfcheck.ipynb b/examples/ch05/snippets_ipynb/05_10selfcheck.ipynb deleted file mode 100755 index 31064e6..0000000 --- a/examples/ch05/snippets_ipynb/05_10selfcheck.ipynb +++ /dev/null @@ -1,153 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 5.10 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Create a list called `rainbow` containing `'green'`, `'orange'` and `'violet'`. Perform the following operations consecutively using list methods and show the list’s contents after each operation: \n", - "\n", - "a. Determine the index of `'violet'` then use it to insert `'red'` before `'violet'`.\n", - "\n", - "b. Append `'yellow'` to the end of the list.\n", - "\n", - "c. Reverse the list’s elements.\n", - "\n", - "d. Remove the element `'orange'`.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rainbow = ['green', 'orange', 'violet']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rainbow.insert(rainbow.index('violet'), 'red')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rainbow" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rainbow.append('yellow')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rainbow" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rainbow.reverse()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rainbow" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rainbow.remove('orange')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rainbow" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_11.ipynb b/examples/ch05/snippets_ipynb/05_11.ipynb deleted file mode 100755 index 28025df..0000000 --- a/examples/ch05/snippets_ipynb/05_11.ipynb +++ /dev/null @@ -1,144 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 5.11 Simulating Stacks with Lists " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "stack = []" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "stack.append('red')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "stack" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "stack.append('green')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "stack" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "stack.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "stack" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "stack.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "stack" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "stack.pop()\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_12.ipynb b/examples/ch05/snippets_ipynb/05_12.ipynb deleted file mode 100755 index f6ada31..0000000 --- a/examples/ch05/snippets_ipynb/05_12.ipynb +++ /dev/null @@ -1,200 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 5.12 List Comprehensions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list1 = []" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for item in range(1, 6):\n", - " list1.append(item)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using a List Comprehension to Create a List of Integers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list2 = [item for item in range(1, 6)]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Mapping: Performing Operations in a List Comprehension’s Expression" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list3 = [item ** 3 for item in range(1, 6)]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list3" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Filtering: List Comprehensions with `if` Clauses " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list4 = [item for item in range(1, 11) if item % 2 == 0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list4" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### List Comprehension That Processes Another List’s Elements " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "colors = ['red', 'orange', 'yellow', 'green', 'blue']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "colors2 = [item.upper() for item in colors]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "colors2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "colors" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_12selfcheck.ipynb b/examples/ch05/snippets_ipynb/05_12selfcheck.ipynb deleted file mode 100755 index 714bf2e..0000000 --- a/examples/ch05/snippets_ipynb/05_12selfcheck.ipynb +++ /dev/null @@ -1,109 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 5.12 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Use a list comprehension to create a list of tuples containing the numbers 1–5 and their cubes—that is, `[(1, 1), (2, 8), (3, 27), …]`. To create tuples, place parentheses around the expression to the left of the list comprehension’s `for` clause. \n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cubes = [(x, x ** 3) for x in range(1, 6)]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cubes" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**4. _(IPython Session)_** Use a list comprehension and the `range` function with a step to create a list of the multiples of 3 that are less than 30.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "multiples = [x for x in range(3, 30, 3)]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "multiples" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_13.ipynb b/examples/ch05/snippets_ipynb/05_13.ipynb deleted file mode 100755 index afab9f1..0000000 --- a/examples/ch05/snippets_ipynb/05_13.ipynb +++ /dev/null @@ -1,91 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 5.13 Generator Expressions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = [10, 3, 7, 1, 9, 4, 2, 8, 5, 6]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for value in (x ** 2 for x in numbers if x % 2 != 0):\n", - " print(value, end=' ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "squares_of_odds = (x ** 2 for x in numbers if x % 2 != 0)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "squares_of_odds " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_13selfcheck.ipynb b/examples/ch05/snippets_ipynb/05_13selfcheck.ipynb deleted file mode 100755 index d8f6903..0000000 --- a/examples/ch05/snippets_ipynb/05_13selfcheck.ipynb +++ /dev/null @@ -1,73 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 5.13 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Create a generator expression that cubes the even integers in a list containing 10, 3, 7, 1, 9, 4 and 2. Use function `list` to create a list of the results. Note that the function call’s parentheses also act as the generator expression’s parentheses. \n", - "\n", - "**Answer:**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list(x ** 3 for x in [10, 3, 7, 1, 9, 4, 2] if x % 2 == 0)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_14.ipynb b/examples/ch05/snippets_ipynb/05_14.ipynb deleted file mode 100755 index 91b0080..0000000 --- a/examples/ch05/snippets_ipynb/05_14.ipynb +++ /dev/null @@ -1,182 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 5.14 Filter, Map and Reduce " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Filtering a Sequence’s Values with the Built-In `filter` Function" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = [10, 3, 7, 1, 9, 4, 2, 8, 5, 6]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def is_odd(x):\n", - " \"\"\"Returns True only if x is odd.\"\"\"\n", - " return x % 2 != 0" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list(filter(is_odd, numbers))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "[item for item in numbers if is_odd(item)]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using a `lambda` Rather than a Function " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list(filter(lambda x: x % 2 != 0, numbers))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Mapping a Sequence’s Values to New Values" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list(map(lambda x: x ** 2, numbers))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "[item ** 2 for item in numbers]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Combining `filter` and `map`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list(map(lambda x: x ** 2, \n", - " filter(lambda x: x % 2 != 0, numbers)))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "[x ** 2 for x in numbers if x % 2 != 0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Reduction: Totaling the Elements of a Sequence with `sum`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_14selfcheck.ipynb b/examples/ch05/snippets_ipynb/05_14selfcheck.ipynb deleted file mode 100755 index fb7e314..0000000 --- a/examples/ch05/snippets_ipynb/05_14selfcheck.ipynb +++ /dev/null @@ -1,142 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 5.14 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Create a list called `numbers` containing 1 through 15, then perform the following tasks:\n", - "\n", - "a. Use the built-in function `filter` with a lambda to select only `numbers`’ even elements. Create a new list containing the result.\n", - "\n", - "b. Use the built-in function `map` with a `lambda` to square the values of `numbers`’ elements. Create a new list containing the result.\n", - "\n", - "c. Filter `numbers`’ even elements then map them to their squares. Create a new list containing the result.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = list(range(1, 16))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list(filter(lambda x: x % 2 == 0, numbers))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list(map(lambda x: x ** 2, numbers))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list(map(lambda x: x**2, filter(lambda x: x % 2 == 0, numbers)))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**4._(IPython Session)_** Map a list of the three Fahrenheit temperatures 41, 32 and 212 to a list of tuples containing the Fahrenheit temperatures and their Celsius equivalents. Convert Fahrenheit temperatures to Celsius with the following formula: \n", - "\n", - "Celsius = (Fahrenheit – 32) * (5 / 9)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fahrenheit = [41, 32, 212]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list(map(lambda x: (x, (x - 32) * 5 / 9), fahrenheit)) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_15.ipynb b/examples/ch05/snippets_ipynb/05_15.ipynb deleted file mode 100755 index ffac3e7..0000000 --- a/examples/ch05/snippets_ipynb/05_15.ipynb +++ /dev/null @@ -1,184 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 5.15 Other Sequence Processing Functions " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Finding the Minimum and Maximum Values Using a Key Function" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Red' < 'orange'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ord('R')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ord('o')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "colors = ['Red', 'orange', 'Yellow', 'green', 'Blue']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "min(colors, key=lambda s: s.lower())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "max(colors, key=lambda s: s.lower())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Iterating Backwards Through a Sequence" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = [10, 3, 7, 1, 9, 4, 2, 8, 5, 6]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "reversed_numbers = [item ** 2 for item in reversed(numbers)]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "reversed_numbers" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Combining Iterables into Tuples of Corresponding Elements" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "names = ['Bob', 'Sue', 'Amanda']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grade_point_averages = [3.5, 4.0, 3.75] " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for name, gpa in zip(names, grade_point_averages):\n", - " print(f'Name={name}; GPA={gpa}')\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_15selfcheck.ipynb b/examples/ch05/snippets_ipynb/05_15selfcheck.ipynb deleted file mode 100755 index d80fecd..0000000 --- a/examples/ch05/snippets_ipynb/05_15selfcheck.ipynb +++ /dev/null @@ -1,115 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 5.15 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Create the list `foods` containing `'Cookies'`, `'pizza'`, `'Grapes'`, `'apples'`, `'steak'` and `'Bacon'`. Find the smallest string with `min`, then reimplement the `min` call using the `key` function to ignore the strings’ case. Do you get the same results? Why or why not?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "foods = ['Cookies', 'pizza', 'Grapes', \n", - " 'apples', 'steak', 'Bacon']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "min(foods)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "min(foods, key=lambda s: s.lower())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Answer:** The `min` result was different because `'apples'` is the smallest string when you compare them without case sensitivity. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**4. _(IPython Session)_** Use `zip` with two integer lists to create a new list containing the sum of the elements from corresponding indices in both lists (that is, add the elements at index 0, add the elements at index 1, …).\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "[(a + b) for a, b in zip([10, 20, 30], [1, 2, 3])]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_16.ipynb b/examples/ch05/snippets_ipynb/05_16.ipynb deleted file mode 100755 index 4801e63..0000000 --- a/examples/ch05/snippets_ipynb/05_16.ipynb +++ /dev/null @@ -1,116 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 5.16 Two-Dimensional Lists" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a Two-Dimensional List" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a = [[77, 68, 86, 73], [96, 87, 89, 81], [70, 90, 86, 81]]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Illustrating a Two-Dimensional List" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Identifying the Elements in a Two-Dimensional List" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for row in a:\n", - " for item in row:\n", - " print(item, end=' ')\n", - " print()\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### How the Nested Loops Execute" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for i, row in enumerate(a):\n", - " for j, item in enumerate(row):\n", - " print(f'a[{i}][{j}]={item} ', end=' ')\n", - " print()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_16selfcheck.ipynb b/examples/ch05/snippets_ipynb/05_16selfcheck.ipynb deleted file mode 100755 index 0c93dfb..0000000 --- a/examples/ch05/snippets_ipynb/05_16selfcheck.ipynb +++ /dev/null @@ -1,178 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 5.16 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**4. _(IPython Session)_** Given the two-by-three integer list `t` \n", - "```python\n", - "t = [[10, 7, 3], [20, 4, 17]]\n", - "```\n", - "\n", - "a. Determine and display the average of `t`’s elements using nested `for` statements to iterate through the elements.\n", - "\n", - "b. Write a `for` statement that determines and displays the average of `t`'s elements using the reductions `sum` and `len` to calculate the sum of each row’s elements and the number of elements in each row." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "t = [[10, 7, 3], [20, 4, 17]]" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "total = 0" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "items = 0" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "for row in t:\n", - " for item in row:\n", - " total += item\n", - " items += 1" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "10.166666666666666" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "total / items" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "total = 0" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "items = 0" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "for row in t:\n", - " total += sum(row)\n", - " items += len(row)\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "10.166666666666666" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "total / items" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/05_17.ipynb b/examples/ch05/snippets_ipynb/05_17.ipynb deleted file mode 100755 index e3dd1b4..0000000 --- a/examples/ch05/snippets_ipynb/05_17.ipynb +++ /dev/null @@ -1,373 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 5.17 Intro to Data Science: Simulation and Static Visualizations\n", - "\n", - "Note: This notebook's code has been organized into cells differently than the snippets presented in the book. In a notebook, all the code that affects the visualization's appearance must appear in the same cell. Any code that modifies that appearance would have to re-display the visualization. FOr this reason, snippet numbers in this notebook do not match with the snippet numbers in the book." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 5.17.1 Sample Graphs for 600, 60,000 and 6,000,000 Die Rolls" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 5.17.2 Visualizing Die-Roll Frequencies and Percentages" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Launching IPython for Interactive Matplotlib Development" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Importing the Libraries\n", - "\n", - "Note: `%matplotlib inline` is an IPython magic that enables Matplotlib-based graphics to be displayed directly in the notebook. Also, to ensure that all visualization operations are applied properly to a visualization in a notebook, you need to execute them in a single cell, so the snippet numbers in this notebook will not match up with the code in the book.\n", - "\n", - "We've separated by two blank lines the snippets that were combined into a single cell." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import random" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "import seaborn as sns" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Rolling the Die and Calculating Die Frequencies" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "rolls = [random.randrange(1, 7) for i in range(600)]" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "values, frequencies = np.unique(rolls, return_counts=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating the Initial Bar Plot" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Setting the Window Title and Labeling the x- and y-Axes" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Finalizing the Bar Plot" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "title = f'Rolling a Six-Sided Die {len(rolls):,} Times'\n", - "\n", - "\n", - "sns.set_style('whitegrid')\n", - "\n", - "\n", - "axes = sns.barplot(x=values, y=frequencies, palette='bright')\n", - "\n", - "\n", - "axes.set_title(title)\n", - "\n", - "\n", - "axes.set(xlabel='Die Value', ylabel='Frequency') \n", - "\n", - "\n", - "axes.set_ylim(top=max(frequencies) * 1.10)\n", - "\n", - "\n", - "for bar, frequency in zip(axes.patches, frequencies):\n", - " text_x = bar.get_x() + bar.get_width() / 2.0 \n", - " text_y = bar.get_height() \n", - " text = f'{frequency:,}\\n{frequency / len(rolls):.3%}'\n", - " axes.text(text_x, text_y, text, \n", - " fontsize=11, ha='center', va='bottom')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Rolling Again and Updating the Bar Plot—Introducing IPython Magics" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "# plt.cla()\n", - "# We placed this code in a comment because it was meant for use \n", - "# in an interactive IPython session in which we clear the window,\n", - "# then display a new graph in it. In a notebook, we can simply \n", - "# display a new graph inline." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When you execute the next cell, the notebook will add another cell below it containing the code in Snippet 5. You should then change 600 to 60000." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "%recall 5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When you execute the next cell, the notebook will add another cell below it containing the code in Snippets 6-7. Executing that cell will produce a new graph." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "%recall 6-7" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Saving Snippets to a File with the %save Magic " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%save RollDie.py 1-7" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```\n", - "The following commands were written to file `RollDie.py`:\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import random\n", - "import seaborn as sns\n", - "rolls = [random.randrange(1, 7) for i in range(600)]\n", - "values, frequencies = np.unique(rolls, return_counts=True)\n", - "title = f'Rolling a Six-Sided Die {len(rolls):,} Times'\n", - "sns.set_style(\"whitegrid\") \n", - "axes = sns.barplot(values, frequencies, palette='bright') \n", - "axes.set_title(title) \n", - "axes.set(xlabel='Die Value', ylabel='Frequency') \n", - "axes.set_ylim(top=max(frequencies) * 1.10)\n", - "for bar, frequency in zip(axes.patches, frequencies):\n", - " text_x = bar.get_x() + bar.get_width() / 2.0 \n", - " text_y = bar.get_height() \n", - " text = f'{frequency:,}\\n{frequency / len(rolls):.3%}'\n", - " axes.text(text_x, text_y, text, \n", - " fontsize=11, ha='center', va='bottom')\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Command-Line Arguments; Displaying a Plot from a Script" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 5.17.2 Self Check\n", - "\n", - "**5. _(IPython Session)_** Use the `%recall` magic to repeat the steps in snippets `[14]` through `[18]` to redraw the bar plot for 6,000,000 die rolls. This exercise assumes that you’re continuing this section’s IPython session. Notice that the heights of the six bars look the same, although each frequency is close to 1,000,000 and each percentage is close to 16.667%.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# plt.cla()\n", - "# We placed this code in a comment because it was meant for use \n", - "# in an interactive IPython session in which we clear the window,\n", - "# then display a new graph in it. In a notebook, we can simply \n", - "# display a new graph inline." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When you execute the next cell, the notebook will add another cell below it containing the code in Snippet 5. You should then change 600 to 60000000 (or 60_000_000 for better readability)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%recall 5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When you execute the next cell, the notebook will add another cell below it containing the code in Snippets 6-7. Executing that cell will produce a new graph." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%recall 6-7" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/RollDie.py b/examples/ch05/snippets_ipynb/RollDie.py deleted file mode 100644 index a273774..0000000 --- a/examples/ch05/snippets_ipynb/RollDie.py +++ /dev/null @@ -1,20 +0,0 @@ -# coding: utf-8 -get_ipython().run_line_magic('matplotlib', 'inline') -import matplotlib.pyplot as plt -import numpy as np -import random -import seaborn as sns -rolls = [random.randrange(1, 7) for i in range(600)] -values, frequencies = np.unique(rolls, return_counts=True) -title = f'Rolling a Six-Sided Die {len(rolls):,} Times' -sns.set_style('whitegrid') -axes = sns.barplot(x=values, y=frequencies, palette='bright') -axes.set_title(title) -axes.set(xlabel='Die Value', ylabel='Frequency') -axes.set_ylim(top=max(frequencies) * 1.10) -for bar, frequency in zip(axes.patches, frequencies): - text_x = bar.get_x() + bar.get_width() / 2.0 - text_y = bar.get_height() - text = f'{frequency:,}\n{frequency / len(rolls):.3%}' - axes.text(text_x, text_y, text, - fontsize=11, ha='center', va='bottom') diff --git a/examples/ch05/snippets_ipynb/ex05_01.ipynb b/examples/ch05/snippets_ipynb/ex05_01.ipynb deleted file mode 100755 index e8e5393..0000000 --- a/examples/ch05/snippets_ipynb/ex05_01.ipynb +++ /dev/null @@ -1,172 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**5.1 _(What’s Wrong With This Code?)_** What, if anything, is wrong with each of the following code segments?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "day, high_temperature = ('Monday', 87, 65) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = [1, 2, 3, 4, 5]\n", - "numbers[10] " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "name = 'amanda'\n", - "name[0] = 'A' " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = [1, 2, 3, 4, 5]\n", - "numbers[3.4] " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "student_tuple = ('Amanda', 'Blue', [98, 75, 87]) \n", - "student_tuple[0] = 'Ariana' " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "('Monday', 87, 65) + 'Tuesday' " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'A' += ('B', 'C') " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x = 7 \n", - "del x\n", - "print(x) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = [1, 2, 3, 4, 5]\n", - "numbers.index(10) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = [1, 2, 3, 4, 5]\n", - "numbers.extend(6, 7, 8) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = [1, 2, 3, 4, 5]\n", - "numbers.remove(10) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "values = []\n", - "values.pop() " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/ex05_02.ipynb b/examples/ch05/snippets_ipynb/ex05_02.ipynb deleted file mode 100755 index 2554ffe..0000000 --- a/examples/ch05/snippets_ipynb/ex05_02.ipynb +++ /dev/null @@ -1,64 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**5.2 _(What’s Does This Code Do?)_** What does the following function do, based on the sequence it receives as an argument?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def mystery(sequence):\n", - " return sequence == sorted(sequence)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/ex05_03.ipynb b/examples/ch05/snippets_ipynb/ex05_03.ipynb deleted file mode 100755 index 9d959b2..0000000 --- a/examples/ch05/snippets_ipynb/ex05_03.ipynb +++ /dev/null @@ -1,72 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**5.3 _(Fill in the Missing Code)_** Replace the `***`s in the following list comprehension and `map` function call, such that given a list of heights in inches, the code maps the list to a list of tuples containing the original height values and their corresponding values in meters. For example, if one element in the original list contains the height 69 inches, the corresponding element in the new list will contain the tuple `(69, 1.7526)`, representing both the height in inches and the height in meters. There are 0.0254 meters per inch. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "[*** for x in [69, 77, 54]]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list(map(lambda ***, [69, 77, 54]))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch05/snippets_ipynb/files/art/check.png b/examples/ch05/snippets_ipynb/files/art/check.png deleted file mode 100755 index eea18cd..0000000 Binary files a/examples/ch05/snippets_ipynb/files/art/check.png and /dev/null differ diff --git a/examples/ch05/snippets_py/05_02.py b/examples/ch05/snippets_py/05_02.py deleted file mode 100755 index 9971ffb..0000000 --- a/examples/ch05/snippets_py/05_02.py +++ /dev/null @@ -1,102 +0,0 @@ -# Section 5.2 snippets - -# Creating a List -c = [-45, 6, 0, 72, 1543] - -c - -# Accessing Elements of a List -c[0] - -c[4] - -# Determining a List’s Length -len(c) - -# Accessing Elements from the End of the List with Negative Indices -c[-1] - -c[-5] - -# Indices Must Be Integers or Integer Expressions -a = 1 - -b = 2 - -c[a + b] - -# Lists Are Mutable -c[4] = 17 - -c - -# Some Sequences Are Immutable -s = 'hello' - -s[0] - -s[0] = 'H' - -# Attempting to Access a Nonexistent Element -c[100] - -# Using List Elements in Expressions -c[0] + c[1] + c[2] - -# Appending to a List with += -a_list = [] - -for number in range(1, 6): - a_list += [number] - -a_list - -letters = [] - -letters += 'Python' - -letters - -# Concatenating Lists with + -list1 = [10, 20, 30] - -list2 = [40, 50] - -concatenated_list = list1 + list2 - -concatenated_list - -# Using for and range to Access List Indices and Values -for i in range(len(concatenated_list)): - print(f'{i}: {concatenated_list[i]}') - -# Comparison Operators -a = [1, 2, 3] - -b = [1, 2, 3] - -c = [1, 2, 3, 4] - -a == b - -a == c - -a < c - -c >= b - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_02selfcheck.py b/examples/ch05/snippets_py/05_02selfcheck.py deleted file mode 100755 index 8cc6aba..0000000 --- a/examples/ch05/snippets_py/05_02selfcheck.py +++ /dev/null @@ -1,39 +0,0 @@ -# Section 5.2 Self Check snippets - -# Exercise 3 - -def cube_list(values): - for i in range(len(values)): - values[i] **= 3 - -numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - -cube_list(numbers) - -numbers - - -# Exercise 4 -characters = [] - -characters += 'Birthday' - -characters - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_03.py b/examples/ch05/snippets_py/05_03.py deleted file mode 100755 index 3667896..0000000 --- a/examples/ch05/snippets_py/05_03.py +++ /dev/null @@ -1,73 +0,0 @@ -# Section 5.3 snippets - -# Creating Tuples -student_tuple = () - -student_tuple - -len(student_tuple) - -student_tuple = 'John', 'Green', 3.3 - -student_tuple - -len(student_tuple) - -another_student_tuple = ('Mary', 'Red', 3.3) - -another_student_tuple - -a_singleton_tuple = ('red',) # note the comma - -a_singleton_tuple - -# Accessing Tuple Elements -time_tuple = (9, 16, 1) - -time_tuple - -time_tuple[0] * 3600 + time_tuple[1] * 60 + time_tuple[2] - -# Adding Items to a String or Tuple -tuple1 = (10, 20, 30) - -tuple2 = tuple1 - -tuple2 - -tuple1 += (40, 50) - -tuple1 - -tuple2 - -# Appending Tuples to Lists -numbers = [1, 2, 3, 4, 5] - -numbers += (6, 7) - -numbers - -# Tuples May Contain Mutable Objects -student_tuple = ('Amanda', 'Blue', [98, 75, 87]) - -student_tuple[2][1] = 85 - -student_tuple - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_03selfcheck.py b/examples/ch05/snippets_py/05_03selfcheck.py deleted file mode 100755 index 0ec4a3c..0000000 --- a/examples/ch05/snippets_py/05_03selfcheck.py +++ /dev/null @@ -1,27 +0,0 @@ -# Section 5.3 Self Check snippets - -# Exercise 3 -single = (123.45,) - -single - -# Exercise 4 -[1, 2, 3] + (4, 5, 6) - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_04.py b/examples/ch05/snippets_py/05_04.py deleted file mode 100755 index b24f8be..0000000 --- a/examples/ch05/snippets_py/05_04.py +++ /dev/null @@ -1,62 +0,0 @@ -# Section 5.4 snippets -student_tuple = ('Amanda', [98, 85, 87]) - -first_name, grades = student_tuple - -first_name - -grades - -first, second = 'hi' - -print(f'{first} {second}') - -number1, number2, number3 = [2, 3, 5] - -print(f'{number1} {number2} {number3}') - -number1, number2, number3 = range(10, 40, 10) - -print(f'{number1} {number2} {number3}') - -# Swapping Values Via Packing and Unpacking -number1 = 99 - -number2 = 22 - -number1, number2 = (number2, number1) - -print(f'number1 = {number1}; number2 = {number2}') - -# Accessing Indices and Values Safely with Built-in Function enumerate -colors = ['red', 'orange', 'yellow'] - -list(enumerate(colors)) - -tuple(enumerate(colors)) - -for index, value in enumerate(colors): - print(f'{index}: {value}') - - - - - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_04selfcheck.py b/examples/ch05/snippets_py/05_04selfcheck.py deleted file mode 100755 index 126fa0f..0000000 --- a/examples/ch05/snippets_py/05_04selfcheck.py +++ /dev/null @@ -1,33 +0,0 @@ -# Section 5.4 Self Check snippets - -# Exercise 3 -high_low = ('Monday', 87, 65) - -high_low - -print(f'{high_low[0]}: High={high_low[1]}, Low={high_low[2]}') - -day, high = high_low - -# Exercise 4 -names = ['Amanda', 'Sam', 'David'] - -for i, name in enumerate(names): - print(f'{i}: {name}') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_05.py b/examples/ch05/snippets_py/05_05.py deleted file mode 100755 index 3746e8b..0000000 --- a/examples/ch05/snippets_py/05_05.py +++ /dev/null @@ -1,73 +0,0 @@ -# Section 5.5 snippets - -# Specifying a Slice with Starting and Ending Indices -numbers = [2, 3, 5, 7, 11, 13, 17, 19] - -numbers[2:6] - -# Specifying a Slice with Only an Ending Index -numbers[:6] - -numbers[0:6] - -# Specifying a Slice with Only a Starting Index -numbers[6:] - -numbers[6:len(numbers)] - -# Specifying a Slice with No Indices -numbers[:] - -# Slicing with Steps -numbers[::2] - -# Slicing with Negative Indices and Steps -numbers[::-1] - -numbers[-1:-9:-1] - -# Modifying Lists Via Slices -numbers[0:3] = ['two', 'three', 'five'] - -numbers - -numbers[0:3] = [] - -numbers - -numbers = [2, 3, 5, 7, 11, 13, 17, 19] - -numbers[::2] = [100, 100, 100, 100] - -numbers - -id(numbers) - -numbers[:] = [] - -numbers - -id(numbers) - -numbers = [] - -numbers - -id(numbers) - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_05selfcheck.py b/examples/ch05/snippets_py/05_05selfcheck.py deleted file mode 100755 index a2c9d9d..0000000 --- a/examples/ch05/snippets_py/05_05selfcheck.py +++ /dev/null @@ -1,39 +0,0 @@ -# Section 5.5 Self Check snippets - -# Exercise 3 -numbers = list(range(1, 16)) - -numbers - -numbers[1:len(numbers):2] - -numbers[5:10] = [0] * len(numbers[5:10]) - -numbers - -numbers[5:] = [] - -numbers - - -numbers[:] = [] - -numbers - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_06.py b/examples/ch05/snippets_py/05_06.py deleted file mode 100755 index 25583e7..0000000 --- a/examples/ch05/snippets_py/05_06.py +++ /dev/null @@ -1,44 +0,0 @@ -# Section 5.6 snippets - -# Deleting the Element at a Specific List Index -numbers = list(range(0, 10)) - -numbers - -del numbers[-1] - -numbers - -# Deleting a Slice from a List -del numbers[0:2] - -numbers - -del numbers[::2] - -numbers - -# Deleting a Slice Representing the Entire List -del numbers[:] - -numbers - -# Deleting a Variable from the Current Session -del numbers - -numbers - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_06selfcheck.py b/examples/ch05/snippets_py/05_06selfcheck.py deleted file mode 100755 index 1046852..0000000 --- a/examples/ch05/snippets_py/05_06selfcheck.py +++ /dev/null @@ -1,32 +0,0 @@ -# Section 5.6 Self Check snippets - -# Exercise 2 -numbers = list(range(1, 16)) - -numbers - -del numbers[0:4] - -numbers - -del numbers[::2] - -numbers - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_07.py b/examples/ch05/snippets_py/05_07.py deleted file mode 100755 index 360e3ba..0000000 --- a/examples/ch05/snippets_py/05_07.py +++ /dev/null @@ -1,36 +0,0 @@ -# Section 5.7 snippets - -# Passing an Entire List to a Function -def modify_elements(items): - """"Multiplies all element values in items by 2.""" - for i in range(len(items)): - items[i] *= 2 - -numbers = [10, 3, 7, 1, 9] - -modify_elements(numbers) - -numbers - -# Passing a Tuple to a Function -numbers_tuple = (10, 20, 30) - -numbers_tuple - -modify_elements(numbers_tuple) - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_08.py b/examples/ch05/snippets_py/05_08.py deleted file mode 100755 index 4c4fbd4..0000000 --- a/examples/ch05/snippets_py/05_08.py +++ /dev/null @@ -1,55 +0,0 @@ -# Section 5.8 snippets - -# Sorting a List in Ascending Order -numbers = [10, 3, 7, 1, 9, 4, 2, 8, 5, 6] - -numbers.sort() - -numbers - -# Sorting a List in Descending Order -numbers.sort(reverse=True) - -numbers - -# Built-In Function sorted -numbers = [10, 3, 7, 1, 9, 4, 2, 8, 5, 6] - -ascending_numbers = sorted(numbers) - -ascending_numbers - -numbers - -letters = 'fadgchjebi' - -ascending_letters = sorted(letters) - -ascending_letters - -letters - -colors = ('red', 'orange', 'yellow', 'green', 'blue') - -ascending_colors = sorted(colors) - -ascending_colors - -colors - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_08selfcheck.py b/examples/ch05/snippets_py/05_08selfcheck.py deleted file mode 100755 index 137bbdc..0000000 --- a/examples/ch05/snippets_py/05_08selfcheck.py +++ /dev/null @@ -1,27 +0,0 @@ -# Section 5.8 Self Check snippets - -# Exercise 3 -foods = ['Cookies', 'pizza', 'Grapes', 'apples', 'steak', 'Bacon'] - -foods.sort() - -foods - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_09.py b/examples/ch05/snippets_py/05_09.py deleted file mode 100755 index 7f7765e..0000000 --- a/examples/ch05/snippets_py/05_09.py +++ /dev/null @@ -1,50 +0,0 @@ -# Section 5.9 snippets -# 5.9 Searching Sequences - -# List Method index -numbers = [3, 7, 1, 4, 2, 8, 5, 6] - -numbers.index(5) - -# Specifying the Starting Index of a Search -numbers *= 2 - -numbers - -numbers.index(5, 7) - -# Specifying the Starting and Ending Indices of a Search -numbers.index(7, 0, 4) - -# Operators in and not in -1000 in numbers - -5 in numbers - -1000 not in numbers - -5 not in numbers - -# Using Operator in to Prevent a ValueError -key = 1000 - -if key in numbers: - print(f'found {key} at index {numbers.index(search_key)}') -else: - print(f'{key} not found') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_09selfcheck.py b/examples/ch05/snippets_py/05_09selfcheck.py deleted file mode 100755 index f22dbeb..0000000 --- a/examples/ch05/snippets_py/05_09selfcheck.py +++ /dev/null @@ -1,28 +0,0 @@ -# Section 5.9 Self Checksnippets - -# Exercise 3 -numbers = [67, 12, 46, 43, 13] - -numbers.index(43) - -if 44 in numbers: - print(f'Found 44 at index: {numbers.index(44)}') -else: - print('44 not found') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_10.py b/examples/ch05/snippets_py/05_10.py deleted file mode 100755 index 007da26..0000000 --- a/examples/ch05/snippets_py/05_10.py +++ /dev/null @@ -1,84 +0,0 @@ -# Section 5.10 snippets - -color_names = ['orange', 'yellow', 'green'] - -# Inserting an Element at a Specific List Index -color_names.insert(0, 'red') - -color_names - -# Adding an Element to the End of a List -color_names.append('blue') - -color_names - -# Adding All the Elements of a Sequence to the End of a List -color_names.extend(['indigo', 'violet']) - -color_names - -sample_list = [] - -s = 'abc' - -sample_list.extend(s) - -sample_list - -t = (1, 2, 3) - -sample_list.extend(t) - -sample_list - -sample_list.extend((4, 5, 6)) # note the extra parentheses - -sample_list - -# Removing the First Occurrence of an Element in a List -color_names.remove('green') - -color_names - - -# Emptying a List -color_names.clear() - -color_names - -# Counting the Number of Occurrences of an Item -responses = [1, 2, 5, 4, 3, 5, 2, 1, 3, 3, - 1, 4, 3, 3, 3, 2, 3, 3, 2, 2] - -for i in range(1, 6): - print(f'{i} appears {responses.count(i)} times in responses') - -# Reversing a List’s Elements -color_names = ['red', 'orange', 'yellow', 'green', 'blue'] - -color_names.reverse() - -color_names - -# Copying a List -copied_list = color_names.copy() - -copied_list - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_10selfcheck.py b/examples/ch05/snippets_py/05_10selfcheck.py deleted file mode 100755 index d2508cb..0000000 --- a/examples/ch05/snippets_py/05_10selfcheck.py +++ /dev/null @@ -1,35 +0,0 @@ -# Section 5.10 Self Check snippets - -rainbow = ['green', 'orange', 'violet'] - -rainbow.insert(rainbow.index('violet'), 'red') - -rainbow - -rainbow.append('yellow') - -rainbow - -rainbow.reverse() - -rainbow - -rainbow.remove('orange') - -rainbow - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_11.py b/examples/ch05/snippets_py/05_11.py deleted file mode 100755 index 37ae16f..0000000 --- a/examples/ch05/snippets_py/05_11.py +++ /dev/null @@ -1,38 +0,0 @@ -# Section 5.11 snippets - -# 5.11 Simulating Stacks with Lists -stack = [] - -stack.append('red') - -stack - -stack.append('green') - -stack - -stack.pop() - -stack - -stack.pop() - -stack - -stack.pop() - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_12.py b/examples/ch05/snippets_py/05_12.py deleted file mode 100755 index d81717b..0000000 --- a/examples/ch05/snippets_py/05_12.py +++ /dev/null @@ -1,49 +0,0 @@ -# Section 5.12 snippets - -list1 = [] - -for item in range(1, 6): - list1.append(item) - -list1 - -# Using a List Comprehension to Create a List of Integers -list2 = [item for item in range(1, 6)] - -list2 - -# Mapping: Performing Operations in a List Comprehension’s Expression -list3 = [item ** 3 for item in range(1, 6)] - -list3 - -# Filtering: List Comprehensions with if Clauses -list4 = [item for item in range(1, 11) if item % 2 == 0] - -list4 - - -# List Comprehension That Processes Another List’s Elements -colors = ['red', 'orange', 'yellow', 'green', 'blue'] - -colors2 = [item.upper() for item in colors] - -colors2 - -colors - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_12selfcheck.py b/examples/ch05/snippets_py/05_12selfcheck.py deleted file mode 100755 index 97dbe11..0000000 --- a/examples/ch05/snippets_py/05_12selfcheck.py +++ /dev/null @@ -1,27 +0,0 @@ -# Section 5.12 Self Check snippets - -# Exercise 3 -cubes = [(x, x ** 3) for x in range(1, 6)] - -cubes - -# Exercise 4 -multiples = [x for x in range(3, 30, 3)] - -multiples - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_13.py b/examples/ch05/snippets_py/05_13.py deleted file mode 100755 index 59fa0a4..0000000 --- a/examples/ch05/snippets_py/05_13.py +++ /dev/null @@ -1,27 +0,0 @@ -# Section 5.13 snippets -numbers = [10, 3, 7, 1, 9, 4, 2, 8, 5, 6] - -for value in (x ** 2 for x in numbers if x % 2 != 0): - print(value, end=' ') - -squares_of_odds = (x ** 2 for x in numbers if x % 2 != 0) - -squares_of_odds - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_13selfcheck.py b/examples/ch05/snippets_py/05_13selfcheck.py deleted file mode 100755 index 6d10f97..0000000 --- a/examples/ch05/snippets_py/05_13selfcheck.py +++ /dev/null @@ -1,19 +0,0 @@ -# Section 5.13 Self Check snippets - -# Exercise 2 -list(x ** 3 for x in [10, 3, 7, 1, 9, 4, 2] if x % 2 == 0) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_14.py b/examples/ch05/snippets_py/05_14.py deleted file mode 100755 index 68b59b1..0000000 --- a/examples/ch05/snippets_py/05_14.py +++ /dev/null @@ -1,46 +0,0 @@ -# Section 5.14 snippets - -# Filtering a Sequence’s Values with the Built-In filter Function -numbers = [10, 3, 7, 1, 9, 4, 2, 8, 5, 6] - -def is_odd(x): - """Returns True only if x is odd.""" - return x % 2 != 0 - -list(filter(is_odd, numbers)) - -[item for item in numbers if is_odd(item)] - -# Using a lambda Rather than a Function -list(filter(lambda x: x % 2 != 0, numbers)) - -# Mapping a Sequence’s Values to New Values -numbers - -list(map(lambda x: x ** 2, numbers)) - -[item ** 2 for item in numbers] - -# Combining filter and map -list(map(lambda x: x ** 2, - filter(lambda x: x % 2 != 0, numbers))) - -[x ** 2 for x in numbers if x % 2 != 0] - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_14selfcheck.py b/examples/ch05/snippets_py/05_14selfcheck.py deleted file mode 100755 index b0df0e0..0000000 --- a/examples/ch05/snippets_py/05_14selfcheck.py +++ /dev/null @@ -1,34 +0,0 @@ -# Section 5.14 Self Check snippets - -# Exercise 3 -numbers = list(range(1, 16)) - -numbers - -list(filter(lambda x: x % 2 == 0, numbers)) - -list(map(lambda x: x ** 2, numbers)) - -list(map(lambda x: x**2, filter(lambda x: x % 2 == 0, numbers))) - -# Exercise 4 -fahrenheit = [41, 32, 212] - -list(map(lambda x: (x, (x - 32) * 5 / 9), fahrenheit)) - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_15.py b/examples/ch05/snippets_py/05_15.py deleted file mode 100755 index c0a3f7e..0000000 --- a/examples/ch05/snippets_py/05_15.py +++ /dev/null @@ -1,45 +0,0 @@ -# Section 5.15 snippets - -# Finding the Minimum and Maximum Values Using a Key Function -'Red' < 'orange' - -ord('R') - -ord('o') - -colors = ['Red', 'orange', 'Yellow', 'green', 'Blue'] - -min(colors, key=lambda s: s.lower()) - -max(colors, key=lambda s: s.lower()) - -# Iterating Backwards Through a Sequence -numbers = [10, 3, 7, 1, 9, 4, 2, 8, 5, 6] - -reversed_numbers = [item ** 2 for item in reversed(numbers)] - -reversed_numbers - -# Combining Iterables into Tuples of Corresponding Elements -names = ['Bob', 'Sue', 'Amanda'] - -grade_point_averages = [3.5, 4.0, 3.75] - -for name, gpa in zip(names, grade_point_averages): - print(f'Name={name}; GPA={gpa}') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_15selfcheck.py b/examples/ch05/snippets_py/05_15selfcheck.py deleted file mode 100755 index 63fa5c6..0000000 --- a/examples/ch05/snippets_py/05_15selfcheck.py +++ /dev/null @@ -1,29 +0,0 @@ -# Section 5.15 Self Check snippets - -# Exercise 3 -foods = ['Cookies', 'pizza', 'Grapes', - 'apples', 'steak', 'Bacon'] - -min(foods) - -min(foods, key=lambda s: s.lower()) - -# Exercise 4 -[(a + b) for a, b in zip([10, 20, 30], [1, 2, 3])] - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_16.py b/examples/ch05/snippets_py/05_16.py deleted file mode 100755 index 6ecac78..0000000 --- a/examples/ch05/snippets_py/05_16.py +++ /dev/null @@ -1,39 +0,0 @@ -# Section 5.16 snippets - -# Creating a Two-Dimensional List -a = [[77, 68, 86, 73], [96, 87, 89, 81], [70, 90, 86, 81]] - -# Illustrating a Two-Dimensional List - -# Identifying the Elements in a Two-Dimensional List -for row in a: - for item in row: - print(item, end=' ') - print() - -# How the Nested Loops Execute -for i, row in enumerate(a): - for j, item in enumerate(row): - print(f'a[{i}][{j}]={item} ', end=' ') - print() - - - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_16selfcheck.py b/examples/ch05/snippets_py/05_16selfcheck.py deleted file mode 100755 index 19b3de7..0000000 --- a/examples/ch05/snippets_py/05_16selfcheck.py +++ /dev/null @@ -1,42 +0,0 @@ -# Section 5.16 Self Check snippets - -# Exercise 4 -t = [[10, 7, 3], [20, 4, 17]] - -total = 0 - -items = 0 - -for row in t: - for item in row: - total += item - items += 1 - -total / items - -total = 0 - -items = 0 - -for row in t: - total += sum(row) - items += len(row) - -total / items - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_17.py b/examples/ch05/snippets_py/05_17.py deleted file mode 100755 index f7fe4a1..0000000 --- a/examples/ch05/snippets_py/05_17.py +++ /dev/null @@ -1,93 +0,0 @@ -# Section 5.17 snippets - -# 5.17.1 Sample Graphs for 600, 60,000 and 6,000,000 Die Rolls - -# 5.17.2 Visualizing Die-Roll Frequencies and Percentages - -# Launching IPython for Interactive Matplotlib Development - - -# Importing the Libraries -import matplotlib.pyplot as plt - -import numpy as np - -import random - -import seaborn as sns - -# Rolling the Die and Calculating Die Frequencies -rolls = [random.randrange(1, 7) for i in range(600)] - -values, frequencies = np.unique(rolls, return_counts=True) - -# Creating the Initial Bar Plot -title = f'Rolling a Six-Sided Die {len(rolls):,} Times' - -sns.set_style('whitegrid') - -axes = sns.barplot(x=values, y=frequencies, palette='bright') - -# Setting the Window Title and Labeling the x- and y-Axes -axes.set_title(title) - -axes.set(xlabel='Die Value', ylabel='Frequency') - -# Finalizing the Bar Plot -axes.set_ylim(top=max(frequencies) * 1.10) - -for bar, frequency in zip(axes.patches, frequencies): - text_x = bar.get_x() + bar.get_width() / 2.0 - text_y = bar.get_height() - text = f'{frequency:,}\n{frequency / len(rolls):.3%}' - axes.text(text_x, text_y, text, - fontsize=11, ha='center', va='bottom') - -# Rolling Again and Updating the Bar Plot—Introducing IPython Magics -plt.cla() - -%recall 5 - -rolls = [random.randrange(1, 7) for i in range(600)] - -rolls = [random.randrange(1, 7) for i in range(60000)] - -%recall 6-13 - -values, frequencies = np.unique(rolls, return_counts=True) -title = f'Rolling a Six-Sided Die {len(rolls):,} Times' -sns.set_style('whitegrid') -axes = sns.barplot(x=values, y=frequencies, palette='bright') -axes.set_title(title) -axes.set(xlabel='Die Value', ylabel='Frequency') -axes.set_ylim(top=max(frequencies) * 1.10) -for bar, frequency in zip(axes.patches, frequencies): - text_x = bar.get_x() + bar.get_width() / 2.0 - text_y = bar.get_height() - text = f'{frequency:,}\n{frequency / len(rolls):.3%}' - axes.text(text_x, text_y, text, - fontsize=11, ha='center', va='bottom') - -# Saving Snippets to a File with the %save Magic -%save RollDie.py 1-13 - - - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/05_17selfcheck.py b/examples/ch05/snippets_py/05_17selfcheck.py deleted file mode 100755 index 12bfeb6..0000000 --- a/examples/ch05/snippets_py/05_17selfcheck.py +++ /dev/null @@ -1,40 +0,0 @@ -# Section 5.17.2 Self Check snippets - -# Exercise 5 -plt.cla() - -%recall 5 - -rolls = [random.randrange(1, 7) for i in range(6000000)] - -%recall 6-13 - -values, frequencies = np.unique(rolls, return_counts=True) -title = f'Rolling a Six-Sided Die {len(rolls):,} Times' -sns.set_style('whitegrid') -axes = sns.barplot(values, frequencies, palette='bright') -axes.set_title(title) -axes.set(xlabel='Die Value', ylabel='Frequency') -axes.set_ylim(top=max(frequencies) * 1.10) -for bar, frequency in zip(axes.patches, frequencies): - text_x = bar.get_x() + bar.get_width() / 2.0 - text_y = bar.get_height() - text = f'{frequency:,}\n{frequency / len(rolls):.3%}' - axes.text(text_x, text_y, text, - fontsize=11, ha='center', va='bottom') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/ex05_01.py b/examples/ch05/snippets_py/ex05_01.py deleted file mode 100755 index 49f7b8f..0000000 --- a/examples/ch05/snippets_py/ex05_01.py +++ /dev/null @@ -1,49 +0,0 @@ -# Exercise 5.1 -day, high_temperature = ('Monday', 87, 65) - -numbers = [1, 2, 3, 4, 5] -numbers[10] - -name = 'amanda' -name[0] = 'A' - -numbers = [1, 2, 3, 4, 5] -numbers[3.4] - -student_tuple = ('Amanda', 'Blue', [98, 75, 87]) -student_tuple[0] = 'Ariana' - -('Monday', 87, 65) + 'Tuesday' - -'A' += ('B', 'C') - -x = 7 -del x -print(x) - -numbers = [1, 2, 3, 4, 5] -numbers.index(10) - -numbers = [1, 2, 3, 4, 5] -numbers.extend(6, 7, 8) - -numbers = [1, 2, 3, 4, 5] -numbers.remove(10) - -values = [] -values.pop() - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/ex05_02.py b/examples/ch05/snippets_py/ex05_02.py deleted file mode 100755 index a05c849..0000000 --- a/examples/ch05/snippets_py/ex05_02.py +++ /dev/null @@ -1,18 +0,0 @@ -# Exercise 5.2 -def mystery(sequence): - return sequence == sorted(sequence) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch05/snippets_py/ex05_03.py b/examples/ch05/snippets_py/ex05_03.py deleted file mode 100755 index 7a3256a..0000000 --- a/examples/ch05/snippets_py/ex05_03.py +++ /dev/null @@ -1,18 +0,0 @@ -# Exercise 5.3 -[*** for x in [69, 77, 54]] -list(map(lambda ***, [69, 77, 54])) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/RollDieDynamic.py b/examples/ch06/RollDieDynamic.py deleted file mode 100755 index b95023e..0000000 --- a/examples/ch06/RollDieDynamic.py +++ /dev/null @@ -1,59 +0,0 @@ -# RollDieDynamic.py -"""Dynamically graphing frequencies of die rolls.""" -from matplotlib import animation -import matplotlib.pyplot as plt -import random -import seaborn as sns -import sys - -def update(frame_number, rolls, faces, frequencies): - """Configures bar plot contents for each animation frame.""" - # roll die and update frequencies - for i in range(rolls): - frequencies[random.randrange(1, 7) - 1] += 1 - - # reconfigure plot for updated die frequencies - plt.cla() # clear old contents contents of current Figure - axes = sns.barplot(x=faces, y=frequencies, palette='bright') # new bars - axes.set_title(f'Die Frequencies for {sum(frequencies):,} Rolls') - axes.set(xlabel='Die Value', ylabel='Frequency') - axes.set_ylim(top=max(frequencies) * 1.10) # scale y-axis by 10% - - # display frequency & percentage above each patch (bar) - for bar, frequency in zip(axes.patches, frequencies): - text_x = bar.get_x() + bar.get_width() / 2.0 - text_y = bar.get_height() - text = f'{frequency:,}\n{frequency / sum(frequencies):.3%}' - axes.text(text_x, text_y, text, ha='center', va='bottom') - -# read command-line arguments for number of frames and rolls per frame -number_of_frames = int(sys.argv[1]) -rolls_per_frame = int(sys.argv[2]) - -sns.set_style('whitegrid') # white background with gray grid lines -figure = plt.figure('Rolling a Six-Sided Die') # Figure for animation -values = list(range(1, 7)) # die faces for display on x-axis -frequencies = [0] * 6 # six-element list of die frequencies - -# configure and start animation that calls function update -die_animation = animation.FuncAnimation( - figure, update, repeat=False, frames=number_of_frames - 1, interval=33, - fargs=(rolls_per_frame, values, frequencies)) - -plt.show() # display window - - -#************************************************************************** -#* (C) Copyright 1992-2018 by Deitel & Associates, Inc. and * -#* Pearson Education, Inc. All Rights Reserved. * -#* * -#* DISCLAIMER: The authors and publisher of this book have used their * -#* best efforts in preparing the book. These efforts include the * -#* development, research, and testing of the theories and programs * -#* to determine their effectiveness. The authors and publisher make * -#* no warranty of any kind, expressed or implied, with regard to these * -#* programs or to the documentation contained in these books. The authors * -#* and publisher shall not be liable in any event for incidental or * -#* consequential damages in connection with, or arising out of, the * -#* furnishing, performance, or use of these programs. * -#************************************************************************** diff --git a/examples/ch06/fig06_01.py b/examples/ch06/fig06_01.py deleted file mode 100755 index fb0eef0..0000000 --- a/examples/ch06/fig06_01.py +++ /dev/null @@ -1,34 +0,0 @@ -# fig06_01.py -"""Using a dictionary to represent an instructor's grade book.""" -grade_book = { - 'Susan': [92, 85, 100], - 'Eduardo': [83, 95, 79], - 'Azizi': [91, 89, 82], - 'Pantipa': [97, 91, 92] -} - -all_grades_total = 0 -all_grades_count = 0 - -for name, grades in grade_book.items(): - total = sum(grades) - print(f'Average for {name} is {total/len(grades):.2f}') - all_grades_total += total - all_grades_count += len(grades) - -print(f"Class's average is: {all_grades_total / all_grades_count:.2f}") - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/fig06_02.py b/examples/ch06/fig06_02.py deleted file mode 100755 index 7fac51b..0000000 --- a/examples/ch06/fig06_02.py +++ /dev/null @@ -1,21 +0,0 @@ -# fig06_02.py -"""Tokenizing a string and counting unique words.""" - -text = ('this is sample text with several words ' - 'this is more sample text with some different words') - -word_counts = {} - -# count occurrences of each unique word -for word in text.split(): - if word in word_counts: - word_counts[word] += 1 # update existing key-value pair - else: - word_counts[word] = 1 # insert new key-value pair - -print(f'{"WORD":<12}COUNT') - -for word, count in sorted(word_counts.items()): - print(f'{word:<12}{count}') - -print('\nNumber of unique words:', len(word_counts)) diff --git a/examples/ch06/snippets_ipynb/06.02.01.ipynb b/examples/ch06/snippets_ipynb/06.02.01.ipynb deleted file mode 100644 index e1344ac..0000000 --- a/examples/ch06/snippets_ipynb/06.02.01.ipynb +++ /dev/null @@ -1,125 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 6.2.1 Creating a Dictionary" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "country_codes = {'Finland': 'fi', 'South Africa': 'za', \n", - " 'Nepal': 'np'}\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "country_codes" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Determining if a Dictionary Is Empty " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "len(country_codes)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if country_codes:\n", - " print('country_codes is not empty')\n", - "else:\n", - " print('country_codes is empty')\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "country_codes.clear()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if country_codes:\n", - " print('country_codes is not empty')\n", - "else:\n", - " print('country_codes is empty')\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/06.02.01selfcheck.ipynb b/examples/ch06/snippets_ipynb/06.02.01selfcheck.ipynb deleted file mode 100644 index 69178d6..0000000 --- a/examples/ch06/snippets_ipynb/06.02.01selfcheck.ipynb +++ /dev/null @@ -1,83 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 6.2.1 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Create a dictionary named `states` that maps three state abbreviations to their state names, then display the dictionary.\n", - "\n", - "**Answer:**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "states = {'VT': 'Vermont', 'NH': 'New Hampshire', \n", - " 'MA': 'Massachusetts'}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "states" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/06.02.02.ipynb b/examples/ch06/snippets_ipynb/06.02.02.ipynb deleted file mode 100644 index e109ff0..0000000 --- a/examples/ch06/snippets_ipynb/06.02.02.ipynb +++ /dev/null @@ -1,83 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 6.2.2 Iterating through a Dictionary " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "days_per_month = {'January': 31, 'February': 28, 'March': 31}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "days_per_month" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for month, days in days_per_month.items():\n", - " print(f'{month} has {days} days')\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/06.02.03.ipynb b/examples/ch06/snippets_ipynb/06.02.03.ipynb deleted file mode 100644 index eb8704a..0000000 --- a/examples/ch06/snippets_ipynb/06.02.03.ipynb +++ /dev/null @@ -1,258 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 6.2.3 Basic Dictionary Operations" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "roman_numerals = {'I': 1, 'II': 2, 'III': 3, 'V': 5, 'X': 100}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "roman_numerals" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Accessing the Value Associated with a Key" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "roman_numerals['V']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Updating the Value of an Existing Key–Value Pair" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "roman_numerals['X'] = 10" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "roman_numerals" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Adding a New Key–Value Pair" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "roman_numerals['L'] = 50" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "roman_numerals" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Removing a Key–Value Pair" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "del roman_numerals['III']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "roman_numerals" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "roman_numerals.pop('X')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "roman_numerals" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Attempting to Access a Nonexistent Key" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "roman_numerals['III']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "roman_numerals.get('III')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "roman_numerals.get('III', 'III not in dictionary')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "roman_numerals.get('V')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Testing Whether a Dictionary Contains a Specified Key" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'V' in roman_numerals" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'III' in roman_numerals" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'III' not in roman_numerals" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/06.02.03selfcheck.ipynb b/examples/ch06/snippets_ipynb/06.02.03selfcheck.ipynb deleted file mode 100644 index f3ae71e..0000000 --- a/examples/ch06/snippets_ipynb/06.02.03selfcheck.ipynb +++ /dev/null @@ -1,94 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 6.2.3 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** String dictionary keys are case sensitive. Confirm this by using the following dictionary and assigning `10` to the key `'x'`—doing so adds a new key–value pair rather than correcting the value for the key `'X'`: \n", - "```python\n", - "roman_numerals = {'I': 1, 'II': 2, 'III': 3, 'V': 5, 'X': 100}\n", - "```\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "roman_numerals = {'I': 1, 'II': 2, 'III': 3, 'V': 5, 'X': 100}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "roman_numerals['x'] = 10" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "roman_numerals" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/06.02.04.ipynb b/examples/ch06/snippets_ipynb/06.02.04.ipynb deleted file mode 100644 index 105a33a..0000000 --- a/examples/ch06/snippets_ipynb/06.02.04.ipynb +++ /dev/null @@ -1,191 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 6.2.4 Dictionary Methods `keys` and `values` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "months = {'January': 1, 'February': 2, 'March': 3}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for month_name in months.keys():\n", - " print(month_name, end=' ')\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for month_number in months.values():\n", - " print(month_number, end=' ')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Dictionary Views" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "months_view = months.keys()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for key in months_view:\n", - " print(key, end=' ')\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "months['December'] = 12" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "months" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for key in months_view:\n", - " print(key, end=' ')\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Converting Dictionary Keys, Values and Key–Value Pairs to Lists" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list(months.keys())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list(months.values())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list(months.items())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Processing Keys in Sorted Order " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for month_name in sorted(months.keys()):\n", - " print(month_name, end=' ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/06.02.04selfcheck.ipynb b/examples/ch06/snippets_ipynb/06.02.04selfcheck.ipynb deleted file mode 100644 index 94f85e9..0000000 --- a/examples/ch06/snippets_ipynb/06.02.04selfcheck.ipynb +++ /dev/null @@ -1,101 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 6.2.4 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** For the following dictionary, create lists of its keys, values and items and show the contents of those lists.\n", - "```python\n", - "roman_numerals = {'I': 1, 'II': 2, 'III': 3, 'V': 5}\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "roman_numerals = {'I': 1, 'II': 2, 'III': 3, 'V': 5}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list(roman_numerals.keys())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list(roman_numerals.values())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "list(roman_numerals.items())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/06.02.05.ipynb b/examples/ch06/snippets_ipynb/06.02.05.ipynb deleted file mode 100644 index 1ccce13..0000000 --- a/examples/ch06/snippets_ipynb/06.02.05.ipynb +++ /dev/null @@ -1,114 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 6.2.5 Dictionary Comparisons" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "country_capitals1 = {'Belgium': 'Brussels',\n", - " 'Haiti': 'Port-au-Prince'}\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "country_capitals2 = {'Nepal': 'Kathmandu',\n", - " 'Uruguay': 'Montevideo'}\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "country_capitals3 = {'Haiti': 'Port-au-Prince',\n", - " 'Belgium': 'Brussels'}\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "country_capitals1 == country_capitals2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "country_capitals1 == country_capitals3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "country_capitals1 != country_capitals2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/06.02.07.ipynb b/examples/ch06/snippets_ipynb/06.02.07.ipynb deleted file mode 100644 index adeb639..0000000 --- a/examples/ch06/snippets_ipynb/06.02.07.ipynb +++ /dev/null @@ -1,103 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 6.2.7 Example: Word Counts \n", - "### Python Standard Library Module `collections`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from collections import Counter" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "text = ('this is sample text with several words '\n", - " 'this is more sample text with some different words')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "counter = Counter(text.split())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for word, count in sorted(counter.items()):\n", - " print(f'{word:<12}{count}')\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('Number of unique keys:', len(counter.keys()))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/06.02.07selfcheck.ipynb b/examples/ch06/snippets_ipynb/06.02.07selfcheck.ipynb deleted file mode 100644 index aee4e6b..0000000 --- a/examples/ch06/snippets_ipynb/06.02.07selfcheck.ipynb +++ /dev/null @@ -1,111 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 6.2.7 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Use a comprehension to create a list of 50 random integers in the range 1–5. Summarize them with a `Counter`. Display the results in two-column format.\n", - "\n", - "**Answer:**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import random" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = [random.randrange(1, 6) for i in range(50)]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from collections import Counter" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "counter = Counter(numbers)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for value, count in sorted(counter.items()):\n", - " print(f'{value:<4}{count}')\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/06.02.08.ipynb b/examples/ch06/snippets_ipynb/06.02.08.ipynb deleted file mode 100644 index 008ccfc..0000000 --- a/examples/ch06/snippets_ipynb/06.02.08.ipynb +++ /dev/null @@ -1,117 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 6.2.8 Dictionary Method `update`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "country_codes = {}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "country_codes.update({'South Africa': 'za'})" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "country_codes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "country_codes.update(Australia='ar')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "country_codes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "country_codes.update(Australia='au')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "country_codes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/06.02.09.ipynb b/examples/ch06/snippets_ipynb/06.02.09.ipynb deleted file mode 100644 index 3ef3d66..0000000 --- a/examples/ch06/snippets_ipynb/06.02.09.ipynb +++ /dev/null @@ -1,108 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 6.2.9 Dictionary Comprehensions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "months = {'January': 1, 'February': 2, 'March': 3}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "months2 = {number: name for name, number in months.items()}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "months2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades = {'Sue': [98, 87, 94], 'Bob': [84, 95, 91]}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades2 = {k: sum(v) / len(v) for k, v in grades.items()}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/06.02.09selfcheck.ipynb b/examples/ch06/snippets_ipynb/06.02.09selfcheck.ipynb deleted file mode 100644 index 87d54c3..0000000 --- a/examples/ch06/snippets_ipynb/06.02.09selfcheck.ipynb +++ /dev/null @@ -1,74 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 6.2.9 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Use a dictionary comprehension to create a dictionary of the numbers 1–5 and their cubes:\n", - "\n", - "**Answer:**\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{number: number ** 3 for number in range(1, 6)}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/06.03.00.ipynb b/examples/ch06/snippets_ipynb/06.03.00.ipynb deleted file mode 100644 index c7b7b7d..0000000 --- a/examples/ch06/snippets_ipynb/06.03.00.ipynb +++ /dev/null @@ -1,192 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 6.3 Sets\n", - "\n", - "### Creating a Set with Curly Braces" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "colors = {'red', 'orange', 'yellow', 'green', 'red', 'blue'}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "colors" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Determining a Set’s Length" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "len(colors)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Checking Whether a Value Is in a Set" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'red' in colors" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'purple' in colors" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'purple' not in colors" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Iterating Through a Set" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for color in colors:\n", - " print(color.upper(), end=' ')\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a Set with the Built-In `set` Function" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = list(range(10)) + list(range(5))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "set(numbers)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "set()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Frozenset: An Immutable Set Type" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/06.03.00selfcheck.ipynb b/examples/ch06/snippets_ipynb/06.03.00selfcheck.ipynb deleted file mode 100644 index 8d851b4..0000000 --- a/examples/ch06/snippets_ipynb/06.03.00selfcheck.ipynb +++ /dev/null @@ -1,103 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 6.3 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Assign the following string to variable text, then split it into tokens with string method split and create a set from the results. Display the unique words in sorted order.\n", - "```python\n", - "'to be or not to be that is the question'\n", - "```\n", - "\n", - "**Answer:**" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "text = 'to be or not to be that is the question'" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "unique_words = set(text.split())" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "be is not or question that the to " - ] - } - ], - "source": [ - "for word in sorted(unique_words):\n", - " print(word, end=' ')\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/06.03.01.ipynb b/examples/ch06/snippets_ipynb/06.03.01.ipynb deleted file mode 100644 index 9001af6..0000000 --- a/examples/ch06/snippets_ipynb/06.03.01.ipynb +++ /dev/null @@ -1,189 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 6.3.1 Comparing Sets" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3, 5} == {3, 5, 1}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3, 5} != {3, 5, 1}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3, 5} < {3, 5, 1}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3, 5} < {7, 3, 5, 1}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3, 5} <= {3, 5, 1}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3} <= {3, 5, 1}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3, 5}.issubset({3, 5, 1})" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 2}.issubset({3, 5, 1})" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3, 5} > {3, 5, 1}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3, 5, 7} > {3, 5, 1}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3, 5} >= {3, 5, 1}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3, 5} >= {3, 1}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3} >= {3, 1, 7}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3, 5}.issuperset({3, 5, 1})" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3, 5}.issuperset({3, 2})" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/06.03.01selfcheck.ipynb b/examples/ch06/snippets_ipynb/06.03.01selfcheck.ipynb deleted file mode 100644 index de0c1fd..0000000 --- a/examples/ch06/snippets_ipynb/06.03.01selfcheck.ipynb +++ /dev/null @@ -1,73 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 6.3.1 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Use sets and `issuperset` to determine whether the characters of the string `'abc def ghi jkl mno'` are a superset of the characters in the string `'hi mom'`.\n", - "\n", - "**Answer:**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "set('abc def ghi jkl mno').issuperset('hi mom')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/06.03.02.ipynb b/examples/ch06/snippets_ipynb/06.03.02.ipynb deleted file mode 100644 index 3ebbbd3..0000000 --- a/examples/ch06/snippets_ipynb/06.03.02.ipynb +++ /dev/null @@ -1,174 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 6.3.2 Mathematical Set Operations\n", - "\n", - "### Union " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3, 5} | {2, 3, 4}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3, 5}.union([20, 20, 3, 40, 40])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Intersection " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3, 5} & {2, 3, 4}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3, 5}.intersection([1, 2, 2, 3, 3, 4, 4])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Difference " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3, 5} - {2, 3, 4}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3, 5, 7}.difference([2, 2, 3, 3, 4, 4])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Symmetric Difference " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3, 5} ^ {2, 3, 4}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3, 5, 7}.symmetric_difference([2, 2, 3, 3, 4, 4])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Disjoint" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3, 5}.isdisjoint({2, 4, 6})" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 3, 5}.isdisjoint({4, 6, 1})" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/06.03.02selfcheck.ipynb b/examples/ch06/snippets_ipynb/06.03.02selfcheck.ipynb deleted file mode 100644 index e7e9167..0000000 --- a/examples/ch06/snippets_ipynb/06.03.02selfcheck.ipynb +++ /dev/null @@ -1,108 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 6.3.2 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Given the sets `{10, 20, 30}` and `{5, 10, 15, 20}` use the mathematical set operators to produce the following results:\n", - "\n", - "**a.** `{30}`\n", - " \n", - "**b.** `{5, 15, 30}` \n", - "\n", - "**c.** `{5, 10, 15, 20, 30}` \n", - "\n", - "**d.** `{10, 20}`\n", - "\n", - "**Answer:**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{10, 20, 30} - {5, 10, 15, 20}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{10, 20, 30} ^ {5, 10, 15, 20}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{10, 20, 30} | {5, 10, 15, 20}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{10, 20, 30} & {5, 10, 15, 20}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/06.03.03.ipynb b/examples/ch06/snippets_ipynb/06.03.03.ipynb deleted file mode 100644 index 123101b..0000000 --- a/examples/ch06/snippets_ipynb/06.03.03.ipynb +++ /dev/null @@ -1,189 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 6.3.3 Mutable Set Operators and Methods\n", - "\n", - "### Mutable Mathematical Set Operations" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = {1, 3, 5}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers |= {2, 3, 4}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers.update(range(10))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Methods for Adding and Removing Elements" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers.add(17)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers.add(3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers.remove(3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers.pop()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers.clear()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/06.03.04.ipynb b/examples/ch06/snippets_ipynb/06.03.04.ipynb deleted file mode 100644 index fff4353..0000000 --- a/examples/ch06/snippets_ipynb/06.03.04.ipynb +++ /dev/null @@ -1,81 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 6.3.4 Set Comprehensions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = [1, 2, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 10]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "evens = {item for item in numbers if item % 2 == 0}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "evens" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/ex06.02.ipynb b/examples/ch06/snippets_ipynb/ex06.02.ipynb deleted file mode 100644 index 69aaec8..0000000 --- a/examples/ch06/snippets_ipynb/ex06.02.ipynb +++ /dev/null @@ -1,98 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**6.2. _(What’s Wrong with This Code?)_** The following code should display the unique words in the string `text` and the number of occurrences of each word.\n", - "```python\n", - "from collections import Counter\n", - "text = ('to be or not to be that is the question')\n", - "counter = Counter(text.split())\n", - "for word, count in sorted(counter):\n", - " print(f'{word:<12}{count}')\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from collections import Counter" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "text = ('to be or not to be that is the question')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "counter = Counter(text.split())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for word, count in sorted(counter):\n", - " print(f'{word:<12}{count}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/ex06.03.ipynb b/examples/ch06/snippets_ipynb/ex06.03.ipynb deleted file mode 100644 index e5f7c11..0000000 --- a/examples/ch06/snippets_ipynb/ex06.03.ipynb +++ /dev/null @@ -1,89 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**6.3. _(What Does This Code Do?)_** The dictionary `temperatures` contains three Fahrenheit temperature samples for each of four days. What does the `for` statement do?\n", - "```python\n", - "temperatures = { \n", - " 'Monday': [66, 70, 74], \n", - " 'Tuesday': [50, 56, 64],\n", - " 'Wednesday': [75, 80, 83],\n", - " 'Thursday': [67, 74, 81]\n", - "}\n", - "\n", - "for k, v in temperatures.items():\n", - " print(f'{k}: {sum(v)/len(v):.2f}')\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "temperatures = { \n", - " 'Monday': [66, 70, 74], \n", - " 'Tuesday': [50, 56, 64],\n", - " 'Wednesday': [75, 80, 83],\n", - " 'Thursday': [67, 74, 81]\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for k, v in temperatures.items():\n", - " print(f'{k}: {sum(v)/len(v):.2f}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/ex06.04.ipynb b/examples/ch06/snippets_ipynb/ex06.04.ipynb deleted file mode 100644 index 0de765a..0000000 --- a/examples/ch06/snippets_ipynb/ex06.04.ipynb +++ /dev/null @@ -1,109 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**6.4. _(Fill in the Missing Code)_** In each of the following expressions, replace the `***`s with a set operator that produces the result shown in the comment. The last operation should check whether the left operand is an improper subset of the right operand. For each of the first four expressions, specify the name of the set operation that produces the specified result.\n", - "\n", - "**a.** `{1, 2, 4, 8, 16} *** {1, 4, 16, 64, 256} # {1,2,4,8,16,64,256} `\n", - "\n", - "**b.** `{1, 2, 4, 8, 16} *** {1, 4, 16, 64, 256} # {1,4,16} `\n", - "\n", - "**c.** `{1, 2, 4, 8, 16} *** {1, 4, 16, 64, 256} # {2,8} `\n", - "\n", - "**d.** `{1, 2, 4, 8, 16} *** {1, 4, 16, 64, 256} # {2,8,64,256} `\n", - "\n", - "**e.** `{1, 2, 4, 8, 16} *** {1, 4, 16, 64, 256} # False`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 2, 4, 8, 16} *** {1, 4, 16, 64, 256} # {1,2,4,8,16,64,256} " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 2, 4, 8, 16} *** {1, 4, 16, 64, 256} # {1,4,16} " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 2, 4, 8, 16} *** {1, 4, 16, 64, 256} # {2,8} " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 2, 4, 8, 16} *** {1, 4, 16, 64, 256} # {2,8,64,256} " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "{1, 2, 4, 8, 16} *** {1, 4, 16, 64, 256} # False" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch06/snippets_ipynb/files/art/check.png b/examples/ch06/snippets_ipynb/files/art/check.png deleted file mode 100755 index eea18cd..0000000 Binary files a/examples/ch06/snippets_ipynb/files/art/check.png and /dev/null differ diff --git a/examples/ch06/snippets_py/06.02.01.py b/examples/ch06/snippets_py/06.02.01.py deleted file mode 100755 index 62e17db..0000000 --- a/examples/ch06/snippets_py/06.02.01.py +++ /dev/null @@ -1,38 +0,0 @@ -# Section 6.2.1 snippets -country_codes = {'Finland': 'fi', 'South Africa': 'za', - 'Nepal': 'np'} - -country_codes - -# Determining if a Dictionary Is Empty -len(country_codes) - -if country_codes: - print('country_codes is not empty') -else: - print('country_codes is empty') - -country_codes.clear() - -if country_codes: - print('country_codes is not empty') -else: - print('country_codes is empty') - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/06.02.01selfcheck.py b/examples/ch06/snippets_py/06.02.01selfcheck.py deleted file mode 100755 index a12f152..0000000 --- a/examples/ch06/snippets_py/06.02.01selfcheck.py +++ /dev/null @@ -1,24 +0,0 @@ -# Section 6.2.1 Self Check snippets - -# Exercise 3 -states = {'VT': 'Vermont', 'NH': 'New Hampshire', - 'MA': 'Massachusetts'} - -states - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/06.02.02.py b/examples/ch06/snippets_py/06.02.02.py deleted file mode 100755 index 92214b4..0000000 --- a/examples/ch06/snippets_py/06.02.02.py +++ /dev/null @@ -1,24 +0,0 @@ -# Section 6.2.2 snippets -days_per_month = {'January': 31, 'February': 28, 'March': 31} - -days_per_month - -for month, days in days_per_month.items(): - print(f'{month} has {days} days') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/06.02.03.py b/examples/ch06/snippets_py/06.02.03.py deleted file mode 100755 index 91703ed..0000000 --- a/examples/ch06/snippets_py/06.02.03.py +++ /dev/null @@ -1,61 +0,0 @@ -# Section 6.2.3 snippets - -# 6.2.3 Basic Dictionary Operations -roman_numerals = {'I': 1, 'II': 2, 'III': 3, 'V': 5, 'X': 100} - -roman_numerals - -# Accessing the Value Associated with a Key -roman_numerals['V'] - -# Updating the Value of an Existing Key–Value Pair -roman_numerals['X'] = 10 - -roman_numerals - -# Adding a New Key–Value Pair -roman_numerals['L'] = 50 - -roman_numerals - -# Removing a Key–Value Pair -del roman_numerals['III'] - -roman_numerals - -roman_numerals.pop('X') - -roman_numerals - -# Attempting to Access a Nonexistent Key -roman_numerals['III'] - -roman_numerals.get('III') - -roman_numerals.get('III', 'III not in dictionary') - -roman_numerals.get('V') - -# Testing Whether a Dictionary Contains a Specified Key -'V' in roman_numerals - -'III' in roman_numerals - -'III' not in roman_numerals - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/06.02.03selfcheck.py b/examples/ch06/snippets_py/06.02.03selfcheck.py deleted file mode 100755 index cf41a72..0000000 --- a/examples/ch06/snippets_py/06.02.03selfcheck.py +++ /dev/null @@ -1,26 +0,0 @@ -# Section 6.2.3 Self Check snippets - -# Exercise 3 -roman_numerals = {'I': 1, 'II': 2, 'III': 3, 'V': 5, 'X': 100} - -roman_numerals['x'] = 10 - -roman_numerals - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/06.02.04.py b/examples/ch06/snippets_py/06.02.04.py deleted file mode 100755 index 7b8cf35..0000000 --- a/examples/ch06/snippets_py/06.02.04.py +++ /dev/null @@ -1,50 +0,0 @@ -# Section 6.2.4 snippets - -months = {'January': 1, 'February': 2, 'March': 3} - -for month_name in months.keys(): - print(month_name, end=' ') - -for month_number in months.values(): - print(month_number, end=' ') - -# Dictionary Views -months_view = months.keys() - -for key in months_view: - print(key, end=' ') - -months['December'] = 12 - -months - -for key in months_view: - print(key, end=' ') - -# Converting Dictionary Keys, Values and Key–Value Pairs to Lists -list(months.keys()) - -list(months.values()) - -list(months.items()) - -# Processing Keys in Sorted Order - -for month_name in sorted(months.keys()): - print(month_name, end=' ') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/06.02.04selfcheck.py b/examples/ch06/snippets_py/06.02.04selfcheck.py deleted file mode 100755 index 1dad5b8..0000000 --- a/examples/ch06/snippets_py/06.02.04selfcheck.py +++ /dev/null @@ -1,28 +0,0 @@ -# Section 6.2.4 Self Check snippets - -# Exercise 3 -roman_numerals = {'I': 1, 'II': 2, 'III': 3, 'V': 5} - -list(roman_numerals.keys()) - -list(roman_numerals.values()) - -list(roman_numerals.items()) - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/06.02.05.py b/examples/ch06/snippets_py/06.02.05.py deleted file mode 100755 index c77e752..0000000 --- a/examples/ch06/snippets_py/06.02.05.py +++ /dev/null @@ -1,33 +0,0 @@ -# Section 6.2.5 snippets -country_capitals1 = {'Belgium': 'Brussels', - 'Haiti': 'Port-au-Prince'} - -country_capitals2 = {'Nepal': 'Kathmandu', - 'Uruguay': 'Montevideo'} - -country_capitals3 = {'Haiti': 'Port-au-Prince', - 'Belgium': 'Brussels'} - -country_capitals1 == country_capitals2 - -country_capitals1 == country_capitals3 - -country_capitals1 != country_capitals2 - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/06.02.07.py b/examples/ch06/snippets_py/06.02.07.py deleted file mode 100755 index e1b8437..0000000 --- a/examples/ch06/snippets_py/06.02.07.py +++ /dev/null @@ -1,31 +0,0 @@ -# Section 6.2.7 snippets -# Python Standard Library Module ‘collections‘ -from collections import Counter - -text = ('this is sample text with several words ' - 'this is more sample text with some different words') - -counter = Counter(text.split()) - -for word, count in sorted(counter.items()): - print(f'{word:<12}{count}') - -print('Number of unique keys:', len(counter.keys())) - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/06.02.07selfcheck.py b/examples/ch06/snippets_py/06.02.07selfcheck.py deleted file mode 100755 index 9cafcda..0000000 --- a/examples/ch06/snippets_py/06.02.07selfcheck.py +++ /dev/null @@ -1,31 +0,0 @@ -# Section 6.2.1 Self Check snippets - -# Exercise 2 -import random - -numbers = [random.randrange(1, 6) for i in range(50)] - -from collections import Counter - -counter = Counter(numbers) - -for value, count in sorted(counter.items()): - print(f'{value:<4}{count}') - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/06.02.08.py b/examples/ch06/snippets_py/06.02.08.py deleted file mode 100755 index c8dbb88..0000000 --- a/examples/ch06/snippets_py/06.02.08.py +++ /dev/null @@ -1,31 +0,0 @@ -# Section 6.2.8 snippets -country_codes = {} - -country_codes.update({'South Africa': 'za'}) - -country_codes - -country_codes.update(Australia='ar') - -country_codes - -country_codes.update(Australia='au') - -country_codes - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/06.02.09.py b/examples/ch06/snippets_py/06.02.09.py deleted file mode 100755 index 7736bb0..0000000 --- a/examples/ch06/snippets_py/06.02.09.py +++ /dev/null @@ -1,29 +0,0 @@ -# Section 6.2.9 snippets -months = {'January': 1, 'February': 2, 'March': 3} - -months2 = {number: name for name, number in months.items()} - -months2 - -grades = {'Sue': [98, 87, 94], 'Bob': [84, 95, 91]} - -grades2 = {k: sum(v) / len(v) for k, v in grades.items()} - -grades2 - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/06.02.09selfcheck.py b/examples/ch06/snippets_py/06.02.09selfcheck.py deleted file mode 100755 index da23e10..0000000 --- a/examples/ch06/snippets_py/06.02.09selfcheck.py +++ /dev/null @@ -1,23 +0,0 @@ -# Section 6.2.9 Self Check snippets - -# Exercise 1 -{number: number ** 3 for number in range(1, 6)} - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/06.03.00.py b/examples/ch06/snippets_py/06.03.00.py deleted file mode 100755 index 082d842..0000000 --- a/examples/ch06/snippets_py/06.03.00.py +++ /dev/null @@ -1,45 +0,0 @@ -# Section 6.3 snippets - -# Creating a Set with Curly Braces -colors = {'red', 'orange', 'yellow', 'green', 'red', 'blue'} - -colors - -# Determining a Set’s Length -len(colors) - -# Checking Whether a Value Is in a Set -'red' in colors - -'purple' in colors - -'purple' not in colors - -# Iterating Through a Set -for color in colors: - print(color.upper(), end=' ') - -# Creating a Set with the Built-In set Function -numbers = list(range(10)) + list(range(5)) - -numbers - -set(numbers) - -set() - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/06.03.00.selfcheck.py b/examples/ch06/snippets_py/06.03.00.selfcheck.py deleted file mode 100755 index 8ec1fce..0000000 --- a/examples/ch06/snippets_py/06.03.00.selfcheck.py +++ /dev/null @@ -1,28 +0,0 @@ -# Section 6.3 Self Check snippets - -# Exercise 3 -text = 'to be or not to be that is the question' - -unique_words = set(text.split()) - -for word in sorted(unique_words): - print(word, end=' ') - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/06.03.01.py b/examples/ch06/snippets_py/06.03.01.py deleted file mode 100755 index a92568f..0000000 --- a/examples/ch06/snippets_py/06.03.01.py +++ /dev/null @@ -1,47 +0,0 @@ -# Section 6.3.1 snippets -{1, 3, 5} == {3, 5, 1} - -{1, 3, 5} != {3, 5, 1} - -{1, 3, 5} < {3, 5, 1} - -{1, 3, 5} < {7, 3, 5, 1} - -{1, 3, 5} <= {3, 5, 1} - -{1, 3} <= {3, 5, 1} - -{1, 3, 5}.issubset({3, 5, 1}) - -{1, 2}.issubset({3, 5, 1}) - -{1, 3, 5} > {3, 5, 1} - -{1, 3, 5, 7} > {3, 5, 1} - -{1, 3, 5} >= {3, 5, 1} - -{1, 3, 5} >= {3, 1} - -{1, 3} >= {3, 1, 7} - -{1, 3, 5}.issuperset({3, 5, 1}) - -{1, 3, 5}.issuperset({3, 2}) - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/06.03.01selfcheck.py b/examples/ch06/snippets_py/06.03.01selfcheck.py deleted file mode 100755 index 6e4dd75..0000000 --- a/examples/ch06/snippets_py/06.03.01selfcheck.py +++ /dev/null @@ -1,23 +0,0 @@ -# Section 6.3.1 Self Check snippets - -# Exercise 3 -set('abc def ghi jkl mno').issuperset('hi mom') - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/06.03.02.py b/examples/ch06/snippets_py/06.03.02.py deleted file mode 100755 index 0600b6b..0000000 --- a/examples/ch06/snippets_py/06.03.02.py +++ /dev/null @@ -1,44 +0,0 @@ -# Section 6.3.2 snippets - -# Union -{1, 3, 5} | {2, 3, 4} - -{1, 3, 5}.union([20, 20, 3, 40, 40]) - -# Intersection -{1, 3, 5} & {2, 3, 4} - -{1, 3, 5}.intersection([1, 2, 2, 3, 3, 4, 4]) - -# Difference -{1, 3, 5} - {2, 3, 4} - -{1, 3, 5, 7}.difference([2, 2, 3, 3, 4, 4]) - -# Symmetric Difference -{1, 3, 5} ^ {2, 3, 4} - -{1, 3, 5, 7}.symmetric_difference([2, 2, 3, 3, 4, 4]) - -# Disjoint -{1, 3, 5}.isdisjoint({2, 4, 6}) - -{1, 3, 5}.isdisjoint({4, 6, 1}) - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/06.03.02selfcheck.py b/examples/ch06/snippets_py/06.03.02selfcheck.py deleted file mode 100755 index c8e632f..0000000 --- a/examples/ch06/snippets_py/06.03.02selfcheck.py +++ /dev/null @@ -1,29 +0,0 @@ -# Section 6.3.2 Self Check snippets - -# Exercise 2 -{10, 20, 30} - {5, 10, 15, 20} - -{10, 20, 30} ^ {5, 10, 15, 20} - -{10, 20, 30} | {5, 10, 15, 20} - -{10, 20, 30} & {5, 10, 15, 20} - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/06.03.03.py b/examples/ch06/snippets_py/06.03.03.py deleted file mode 100755 index ae2bb86..0000000 --- a/examples/ch06/snippets_py/06.03.03.py +++ /dev/null @@ -1,48 +0,0 @@ -# Section 6.3.3 snippets - -# Mutable Mathematical Set Operations -numbers = {1, 3, 5} - -numbers |= {2, 3, 4} - -numbers - -numbers.update(range(10)) - -numbers - -# Methods for Adding and Removing Elements -numbers.add(17) - -numbers.add(3) - -numbers - -numbers.remove(3) - -numbers - -numbers.pop() - -numbers - -numbers.clear() - -numbers - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/06.03.04.py b/examples/ch06/snippets_py/06.03.04.py deleted file mode 100755 index 74ce7af..0000000 --- a/examples/ch06/snippets_py/06.03.04.py +++ /dev/null @@ -1,24 +0,0 @@ -# Section 6.3.4 snippets -numbers = [1, 2, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 10] - -evens = {item for item in numbers if item % 2 == 0} - -evens - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/ex06.02.py b/examples/ch06/snippets_py/ex06.02.py deleted file mode 100755 index 1b38560..0000000 --- a/examples/ch06/snippets_py/ex06.02.py +++ /dev/null @@ -1,23 +0,0 @@ -# Exercise 6.2 snippets -from collections import Counter -text = ('to be or not to be that is the question') -counter = Counter(text.split()) -for word, count in sorted(counter): - print(f'{word:<12}{count}') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/ex06.03.py b/examples/ch06/snippets_py/ex06.03.py deleted file mode 100755 index e1ab9d0..0000000 --- a/examples/ch06/snippets_py/ex06.03.py +++ /dev/null @@ -1,26 +0,0 @@ -# Exercise 6.3 snippets -temperatures = { - 'Monday': [66, 70, 74], - 'Tuesday': [50, 56, 64], - 'Wednesday': [75, 80, 83], - 'Thursday': [67, 74, 81] -} - -for k, v in temperatures.items(): - print(f'{k}: {sum(v)/len(v):.2f}') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch06/snippets_py/ex06.04.py b/examples/ch06/snippets_py/ex06.04.py deleted file mode 100755 index b370a0a..0000000 --- a/examples/ch06/snippets_py/ex06.04.py +++ /dev/null @@ -1,22 +0,0 @@ -# Exercise 6.4 snippets -temperatures = { -{1, 2, 4, 8, 16} *** {1, 4, 16, 64, 256} # {1,2,4,8,16,64,256} -{1, 2, 4, 8, 16} *** {1, 4, 16, 64, 256} # {1,4,16} -{1, 2, 4, 8, 16} *** {1, 4, 16, 64, 256} # {2,8} -{1, 2, 4, 8, 16} *** {1, 4, 16, 64, 256} # {2,8,64,256} -{1, 2, 4, 8, 16} *** {1, 4, 16, 64, 256} # False - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_ipynb/07_02.ipynb b/examples/ch07/snippets_ipynb/07_02.ipynb deleted file mode 100755 index ad02188..0000000 --- a/examples/ch07/snippets_ipynb/07_02.ipynb +++ /dev/null @@ -1,106 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 7.2 Creating `arrays` from Existing Data " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = np.array([2, 3, 5, 7, 11])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "type(numbers)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Multidimensional Arguments" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.array([[1, 2, 3], [4, 5, 6]])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_02selfcheck.ipynb b/examples/ch07/snippets_ipynb/07_02selfcheck.ipynb deleted file mode 100755 index 811fef4..0000000 --- a/examples/ch07/snippets_ipynb/07_02selfcheck.ipynb +++ /dev/null @@ -1,93 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 7.2 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Create a one-dimensional `array` from a list comprehension that produces the even integers from 2 through 20. \n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "\n", - "np.array([x for x in range(2, 21, 2)])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Create a 2-by-5 `array` containing the even integers from 2 through 10 in the first row and the odd integers from 1 through 9 in the second row. \n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.array([[2, 4, 6, 8, 10], [1, 3, 5, 7, 9]])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_03.ipynb b/examples/ch07/snippets_ipynb/07_03.ipynb deleted file mode 100755 index 57a7bab..0000000 --- a/examples/ch07/snippets_ipynb/07_03.ipynb +++ /dev/null @@ -1,239 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 7.3 `array` Attributes " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "integers = np.array([[1, 2, 3], [4, 5, 6]])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "integers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "floats = np.array([0.0, 0.1, 0.2, 0.3, 0.4])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "floats" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Determining an `array`’s Element Type" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "integers.dtype" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "floats.dtype" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Determining an `array`’s Dimensions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "integers.ndim" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "floats.ndim" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "integers.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "floats.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Determining an `array`’s Number of Elements and Element Size" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "integers.size" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "integers.itemsize" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "floats.size" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "floats.itemsize" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Iterating through a Multidimensional `array`’s Elements" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for row in integers:\n", - " for column in row:\n", - " print(column, end=' ')\n", - " print() " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for i in integers.flat:\n", - " print(i, end=' ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_03selfcheck.ipynb b/examples/ch07/snippets_ipynb/07_03selfcheck.ipynb deleted file mode 100755 index 2b47879..0000000 --- a/examples/ch07/snippets_ipynb/07_03selfcheck.ipynb +++ /dev/null @@ -1,100 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 7.3 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** For the two-dimensional array in the previous section’s Self Check, display the number of dimensions and shape of the array.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a = np.array([[2, 4, 6, 8, 10], [1, 3, 5, 7, 9]])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a.ndim" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_04.ipynb b/examples/ch07/snippets_ipynb/07_04.ipynb deleted file mode 100755 index 210c918..0000000 --- a/examples/ch07/snippets_ipynb/07_04.ipynb +++ /dev/null @@ -1,90 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 7.4 Filling `array`s with Specific Values" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.zeros(5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.ones((2, 4), dtype=int)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.full((3, 5), 13)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_05.ipynb b/examples/ch07/snippets_ipynb/07_05.ipynb deleted file mode 100755 index 6336a86..0000000 --- a/examples/ch07/snippets_ipynb/07_05.ipynb +++ /dev/null @@ -1,154 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 7.5 Creating `array`s from Ranges " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating Integer Ranges with `arange`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.arange(5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.arange(5, 10)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.arange(10, 1, -2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating Floating-Point Ranges with `linspace` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.linspace(0.0, 1.0, num=5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Reshaping an `array` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.arange(1, 21).reshape(4, 5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Displaying Large `array`s " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.arange(1, 100001).reshape(4, 25000)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.arange(1, 100001).reshape(100, 1000)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_05selfcheck.ipynb b/examples/ch07/snippets_ipynb/07_05selfcheck.ipynb deleted file mode 100755 index 5f8a0c3..0000000 --- a/examples/ch07/snippets_ipynb/07_05selfcheck.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 7.5 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Use NumPy function `arange` to create an `array` of 20 even integers from 2 through 40, then reshape the result into a 4-by-5 `array`.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.arange(2, 41, 2).reshape(4, 5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_06.ipynb b/examples/ch07/snippets_ipynb/07_06.ipynb deleted file mode 100755 index 8d0ef4d..0000000 --- a/examples/ch07/snippets_ipynb/07_06.ipynb +++ /dev/null @@ -1,153 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 7.6 List vs. `array` Performance: Introducing `%timeit` " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Timing the Creation of a List Containing Results of 6,000,000 Die Rolls " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import random" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%timeit rolls_list = \\\n", - " [random.randrange(1, 7) for i in range(0, 6_000_000)]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Timing the Creation of an `array` Containing Results of 6,000,000 Die Rolls " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%timeit rolls_array = np.random.randint(1, 7, 6_000_000)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 60,000,000 and 600,000,000 Die Rolls " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%timeit rolls_array = np.random.randint(1, 7, 60_000_000)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%timeit rolls_array = np.random.randint(1, 7, 600_000_000)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Customizing the %timeit Iterations " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%timeit -n3 -r2 rolls_array = np.random.randint(1, 7, 6_000_000)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Other IPython Magics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_06selfcheck.ipynb b/examples/ch07/snippets_ipynb/07_06selfcheck.ipynb deleted file mode 100644 index f289b6d..0000000 --- a/examples/ch07/snippets_ipynb/07_06selfcheck.ipynb +++ /dev/null @@ -1,102 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 7.6 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Use `%timeit` to compare the execution time of the following two statements. The first uses a list comprehension to create a list of the integers from 0 to 9,999,999 then totals them with the built-in `sum` function. The second statement does the same thing using an `array` and its `sum` method.\n", - "```python\n", - "sum([x for x in range(10_000_000)])\n", - "np.arange(10_000_000).sum()\n", - "```\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%timeit sum([x for x in range(10_000_000)])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%timeit np.arange(10_000_000).sum()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The statement with the list comprehension took 26 times longer to execute than the one with the `array`. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_07.ipynb b/examples/ch07/snippets_ipynb/07_07.ipynb deleted file mode 100755 index 6a3b4a4..0000000 --- a/examples/ch07/snippets_ipynb/07_07.ipynb +++ /dev/null @@ -1,235 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 7.7 `array` Operators" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Arithmetic Operations with `array`s and Individual Numeric Values" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = np.arange(1, 6)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers * 2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers ** 3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers # numbers is unchanged by the arithmetic operators" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers += 10" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Broadcasting " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Arithmetic Operations Between `array`s " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers2 = np.linspace(1.1, 5.5, 5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers * numbers2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Comparing arrays" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers >= 13" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers2 < numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers == numbers2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers == numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_07selfcheck.ipynb b/examples/ch07/snippets_ipynb/07_07selfcheck.ipynb deleted file mode 100755 index f6b4d18..0000000 --- a/examples/ch07/snippets_ipynb/07_07selfcheck.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 7.7 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Create an array of the values from 1 through 5 then use broadcasting to square each value.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.arange(1, 6) ** 2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_08.ipynb b/examples/ch07/snippets_ipynb/07_08.ipynb deleted file mode 100755 index efd08a5..0000000 --- a/examples/ch07/snippets_ipynb/07_08.ipynb +++ /dev/null @@ -1,161 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 7.8 NumPy Calculation Methods" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades = np.array([[87, 96, 70], [100, 87, 90],\n", - " [94, 77, 90], [100, 81, 82]])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.sum()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.min()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.max()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.mean()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.std()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.var()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Calculations by Row or Column" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.mean(axis=0)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.mean(axis=1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_08selfcheck.ipynb b/examples/ch07/snippets_ipynb/07_08selfcheck.ipynb deleted file mode 100755 index 479240c..0000000 --- a/examples/ch07/snippets_ipynb/07_08selfcheck.ipynb +++ /dev/null @@ -1,118 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 7.8 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Use NumPy random-number generation to create an array of twelve random grades in the range 60 through 100, then reshape the result into a 3-by-4 array. Calculate the average of all the grades, the averages of the grades in each column and the averages of the grades in each row. \n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades = np.random.randint(60, 101, 12).reshape(3, 4)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.mean()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.mean(axis=0)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.mean(axis=1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_09.ipynb b/examples/ch07/snippets_ipynb/07_09.ipynb deleted file mode 100755 index 6c04bbd..0000000 --- a/examples/ch07/snippets_ipynb/07_09.ipynb +++ /dev/null @@ -1,167 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 7.9 Universal Functions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = np.array([1, 4, 9, 16, 25, 36])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.sqrt(numbers)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers2 = np.arange(1, 7) * 10" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.add(numbers, numbers2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Broadcasting with Universal Functions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.multiply(numbers2, 5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers3 = numbers2.reshape(2, 3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers4 = np.array([2, 4, 6])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.multiply(numbers3, numbers4)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Other Universal Functions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_09selfcheck.ipynb b/examples/ch07/snippets_ipynb/07_09selfcheck.ipynb deleted file mode 100755 index a666095..0000000 --- a/examples/ch07/snippets_ipynb/07_09selfcheck.ipynb +++ /dev/null @@ -1,91 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 7.9 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Create an array of the values from 1 through 5 then use the `power` universal function and broadcasting to cube each value.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = np.arange(1, 6)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.power(numbers, 3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_10.ipynb b/examples/ch07/snippets_ipynb/07_10.ipynb deleted file mode 100755 index 5433e7c..0000000 --- a/examples/ch07/snippets_ipynb/07_10.ipynb +++ /dev/null @@ -1,166 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 7.10 Indexing and Slicing " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Indexing with Two-Dimensional `array`s" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades = np.array([[87, 96, 70], [100, 87, 90],\n", - " [94, 77, 90], [100, 81, 82]])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades[0, 1] # row 0, column 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Selecting a Subset of a Two-Dimensional `array`’s Rows" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades[1]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades[0:2]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades[[1, 3]]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Selecting a Subset of a Two-Dimensional `array`’s Columns" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades[:, 0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades[:, 1:3]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades[:, [0, 2]]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_10selfcheck.ipynb b/examples/ch07/snippets_ipynb/07_10selfcheck.ipynb deleted file mode 100755 index 7873b36..0000000 --- a/examples/ch07/snippets_ipynb/07_10selfcheck.ipynb +++ /dev/null @@ -1,130 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 7.10 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Given the following array: \n", - "```python \n", - "array([[ 1, 2, 3, 4, 5],\n", - " [ 6, 7, 8, 9, 10],\n", - " [11, 12, 13, 14, 15]])\n", - "```\n", - "write statements to perform the following tasks:\n", - "\n", - "**a.** Select the second row.\n", - "\n", - "**b.** Select the first and third rows.\n", - "\n", - "**c.** Select the middle three columns.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a = np.arange(1, 16).reshape(3, 5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a[1]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a[[0, 2]]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a[:, 1:4]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_11.ipynb b/examples/ch07/snippets_ipynb/07_11.ipynb deleted file mode 100755 index b491c4b..0000000 --- a/examples/ch07/snippets_ipynb/07_11.ipynb +++ /dev/null @@ -1,250 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 7.11 Views: Shallow Copies" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = np.arange(1, 6)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers2 = numbers.view()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "id(numbers)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "id(numbers2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers[1] *= 10" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers2[1] /= 10" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Slice Views" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers2 = numbers[0:3]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "id(numbers)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "id(numbers2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers2[3]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers[1] *= 20" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_12.ipynb b/examples/ch07/snippets_ipynb/07_12.ipynb deleted file mode 100755 index 67662af..0000000 --- a/examples/ch07/snippets_ipynb/07_12.ipynb +++ /dev/null @@ -1,133 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 7.12 Deep Copies" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = np.arange(1, 6)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers2 = numbers.copy()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers[1] *= 10" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Module `copy`—Shallow vs. Deep Copies for Other Types of Python Objects" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_13.ipynb b/examples/ch07/snippets_ipynb/07_13.ipynb deleted file mode 100755 index fc2e6c0..0000000 --- a/examples/ch07/snippets_ipynb/07_13.ipynb +++ /dev/null @@ -1,316 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 7.13 Reshaping and Transposing " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### `reshape` vs. `resize` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades = np.array([[87, 96, 70], [100, 87, 90]])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.reshape(1, 6)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.resize(1, 6)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### `flatten` vs. `ravel` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades = np.array([[87, 96, 70], [100, 87, 90]])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "flattened = grades.flatten()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "flattened" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "flattened[0] = 100" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "flattened" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "raveled = grades.ravel()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "raveled" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "raveled[0] = 100" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "raveled" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Transposing Rows and Columns" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.T" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Horizontal and Vertical Stacking" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades2 = np.array([[94, 77, 90], [100, 81, 82]])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.hstack((grades, grades2))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.vstack((grades, grades2))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_13selfcheck.ipynb b/examples/ch07/snippets_ipynb/07_13selfcheck.ipynb deleted file mode 100755 index 5f3ca0f..0000000 --- a/examples/ch07/snippets_ipynb/07_13selfcheck.ipynb +++ /dev/null @@ -1,120 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 7.13 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Given a 2-by-3 `array`:\n", - "```python \n", - "array([[1, 2, 3],\n", - " [4, 5, 6]])\n", - "```\n", - "use `hstack` and `vstack` to produce the following `array`:\n", - "```python\n", - "array([[1, 2, 3, 1, 2, 3],\n", - " [4, 5, 6, 4, 5, 6],\n", - " [1, 2, 3, 1, 2, 3],\n", - " [4, 5, 6, 4, 5, 6]])\n", - "```\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a = np.arange(1, 7).reshape(2, 3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a = np.hstack((a, a))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a = np.vstack((a, a))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_14.01.ipynb b/examples/ch07/snippets_ipynb/07_14.01.ipynb deleted file mode 100755 index 1986a84..0000000 --- a/examples/ch07/snippets_ipynb/07_14.01.ipynb +++ /dev/null @@ -1,555 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 7.14.1 pandas `Series` " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a `Series` with Default Indices" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "grades = pd.Series([87, 100, 94])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Displaying a `Series`" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 -100\n", - "1 3\n", - "2 4\n", - "3 5\n", - "4 6\n", - "5 7\n", - "6 50\n", - "dtype: int64" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "grades" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a `Series` with All Elements Having the Same Value" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 98.6\n", - "1 98.6\n", - "2 98.6\n", - "dtype: float64" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.Series(98.6, range(3))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Accessing a `Series`’ Elements" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-100" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "grades[0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Producing Descriptive Statistics for a `Series`" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "7" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "grades.count()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-3.5714285714285716" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "grades.mean()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-100" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "grades.min()" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "50" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "grades.max()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "45.726932774376856" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "grades.std()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "count 7.000000\n", - "mean -3.571429\n", - "std 45.726933\n", - "min -100.000000\n", - "25% 3.500000\n", - "50% 5.000000\n", - "75% 6.500000\n", - "max 50.000000\n", - "dtype: float64" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "grades.describe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a `Series` with Custom Indices" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "grades = pd.Series([87, 100, 94], index=['Wally', 'Eva', 'Sam'])" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Wally 87\n", - "Eva 100\n", - "Sam 94\n", - "dtype: int64" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "grades" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Dictionary Initializers" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "grades = pd.Series({'Wally': 87, 'Eva': 100, 'Sam': 94})" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Wally 87\n", - "Eva 100\n", - "Sam 94\n", - "dtype: int64" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "grades" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Accessing a `Series`’ Elements Via Custom Indices" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "100" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "grades['Eva']" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "87" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "grades.Wally" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "dtype('int64')" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "grades.dtype" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 87, 100, 94])" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "grades.values" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a Series of Strings " - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "hardware = pd.Series(['Hammer', 'Saw', 'Wrench'])" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 Hammer\n", - "1 Saw\n", - "2 Wrench\n", - "dtype: object" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "hardware" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 True\n", - "1 True\n", - "2 False\n", - "dtype: bool" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "hardware.str.contains('a')" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 HAMMER\n", - "1 SAW\n", - "2 WRENCH\n", - "dtype: object" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "hardware.str.upper()" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_14.01selfcheck.ipynb b/examples/ch07/snippets_ipynb/07_14.01selfcheck.ipynb deleted file mode 100755 index 63375a8..0000000 --- a/examples/ch07/snippets_ipynb/07_14.01selfcheck.ipynb +++ /dev/null @@ -1,219 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 7.14.1 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Use the NumPy’s random number generation to create an `array` of five random integers that represent summertime temperatures in the range 60–100, then perform the following tasks:\n", - "\n", - "**a.** Convert the `array` into the `Series` named `temperatures` and display it.\n", - "\n", - "**b.** Determine the lowest, highest and average temperatures.\n", - "\n", - "**c.** Produce descriptive statistics for the `Series`. \n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "temps = np.random.randint(60, 101, 5)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "temperatures = pd.Series(temps)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 70\n", - "1 63\n", - "2 76\n", - "3 72\n", - "4 87\n", - "dtype: int64" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "temperatures" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "63" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "temperatures.min()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "87" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "temperatures.max()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "73.6" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "temperatures.mean()" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "count 5.000000\n", - "mean 73.600000\n", - "std 8.848729\n", - "min 63.000000\n", - "25% 70.000000\n", - "50% 72.000000\n", - "75% 76.000000\n", - "max 87.000000\n", - "dtype: float64" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "temperatures.describe()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_14.02.ipynb b/examples/ch07/snippets_ipynb/07_14.02.ipynb deleted file mode 100755 index 2a9c7c0..0000000 --- a/examples/ch07/snippets_ipynb/07_14.02.ipynb +++ /dev/null @@ -1,487 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 7.14.2 `DataFrame`s " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a `DataFrame` from a Dictionary" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades_dict = {'Wally': [87, 96, 70], 'Eva': [100, 87, 90],\n", - " 'Sam': [94, 77, 90], 'Katie': [100, 81, 82],\n", - " 'Bob': [83, 65, 85]}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades = pd.DataFrame(grades_dict)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Customizing a `DataFrame`’s Indices with the `index` Attribute " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```python\n", - "pd.DataFrame(grades_dict, index=['Test1', 'Test2', 'Test3'])\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.index = ['Test1', 'Test2', 'Test3']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Accessing a `DataFrame`’s Columns " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades['Eva']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.Sam" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Selecting Rows via the `loc` and `iloc` Attributes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.loc['Test1']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.iloc[1]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Selecting Rows via Slices and Lists with the `loc` and `iloc` Attributes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.loc['Test1':'Test3']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.iloc[0:2]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.loc[['Test1', 'Test3']]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.iloc[[0, 2]]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Selecting Subsets of the Rows and Columns " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.loc['Test1':'Test2', ['Eva', 'Katie']]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.iloc[[0, 2], 0:3]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Boolean Indexing" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades[grades >= 90]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades[(grades >= 80) & (grades < 90)]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Accessing a Specific `DataFrame` Cell by Row and Column" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.at['Test2', 'Eva']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.iat[2, 0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.at['Test2', 'Eva'] = 100" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.at['Test2', 'Eva']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.iat[1, 1] = 87" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.iat[1, 1]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Descriptive Statistics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.describe()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.set_option('precision', 2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.describe()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.mean()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Transposing the `DataFrame` with the `T` Attribute" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.T" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.T.describe()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.T.mean()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Sorting By Rows by Their Indices" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.sort_index(ascending=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Sorting By Column Indices" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.sort_index(axis=1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Sorting By Column Values" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.sort_values(by='Test1', axis=1, ascending=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.T.sort_values(by='Test1', ascending=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades.loc['Test1'].sort_values(ascending=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Copy vs. In-Place Sorting" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/07_14.02selfcheck.ipynb b/examples/ch07/snippets_ipynb/07_14.02selfcheck.ipynb deleted file mode 100755 index 4c6c1fd..0000000 --- a/examples/ch07/snippets_ipynb/07_14.02selfcheck.ipynb +++ /dev/null @@ -1,320 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 7.14.2 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Given the following dictionary;\n", - "```python \n", - "temps = {'Mon': [68, 89], 'Tue': [71, 93], 'Wed': [66, 82],\n", - " 'Thu': [75, 97], 'Fri': [62, 79]}\n", - "```\n", - "perform the following tasks:\n", - "\n", - "**a.** Convert the dictionary into the `DataFrame` named `temperatures` with `'Low'` and `'High'` as the indices, then display the `DataFrame`.\n", - "\n", - "**b.** Use the column names to select only the columns for `'Mon'` through `'Wed'`.\n", - "\n", - "**c.** Use the row index `'Low'` to select only the low temperatures for each day.\n", - "\n", - "**d.** Set the floating-point precision to 2, then calculate the average temperature for each day.\n", - "\n", - "**e.** Calculate the average low and high temperatures.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "temps = {'Mon': [68, 89], 'Tue': [71, 93], 'Wed': [66, 82],\n", - " 'Thu': [75, 97], 'Fri': [62, 79]}" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "temperatures = pd.DataFrame(temps, index=['Low', 'High']) # (a)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
MonTueWedThuFri
Low6871667562
High8993829779
\n", - "
" - ], - "text/plain": [ - " Mon Tue Wed Thu Fri\n", - "Low 68 71 66 75 62\n", - "High 89 93 82 97 79" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "temperatures # (a)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
MonTueWed
Low687166
High899382
\n", - "
" - ], - "text/plain": [ - " Mon Tue Wed\n", - "Low 68 71 66\n", - "High 89 93 82" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "temperatures.loc[:, 'Mon':'Wed'] # (b)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Mon 68\n", - "Tue 71\n", - "Wed 66\n", - "Thu 75\n", - "Fri 62\n", - "Name: Low, dtype: int64" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "temperatures.loc['Low'] # (c)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "pd.set_option('precision', 2) # (d)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Mon 78.5\n", - "Tue 82.0\n", - "Wed 74.0\n", - "Thu 86.0\n", - "Fri 70.5\n", - "dtype: float64" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "temperatures.mean() # (d)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Low 68.4\n", - "High 88.0\n", - "dtype: float64" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "temperatures.mean(axis=1) # (e)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch07/snippets_ipynb/files/art/check.png b/examples/ch07/snippets_ipynb/files/art/check.png deleted file mode 100755 index eea18cd..0000000 Binary files a/examples/ch07/snippets_ipynb/files/art/check.png and /dev/null differ diff --git a/examples/ch07/snippets_py/07_02.py b/examples/ch07/snippets_py/07_02.py deleted file mode 100755 index f38cba1..0000000 --- a/examples/ch07/snippets_py/07_02.py +++ /dev/null @@ -1,26 +0,0 @@ -# Section 7.2 snippets -import numpy as np - -numbers = np.array([2, 3, 5, 7, 11]) - -type(numbers) - -numbers - -# Multidimensional Arguments -np.array([[1, 2, 3], [4, 5, 6]]) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_02selfcheck.py b/examples/ch07/snippets_py/07_02selfcheck.py deleted file mode 100755 index a301558..0000000 --- a/examples/ch07/snippets_py/07_02selfcheck.py +++ /dev/null @@ -1,24 +0,0 @@ -# Section 7.2 Self Check snippets - -# Exercise 2 -import numpy as np - -np.array([x for x in range(2, 21, 2)]) - -# Exercise 3 -np.array([[2, 4, 6, 8, 10], [1, 3, 5, 7, 9]]) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_03.py b/examples/ch07/snippets_py/07_03.py deleted file mode 100755 index c90a992..0000000 --- a/examples/ch07/snippets_py/07_03.py +++ /dev/null @@ -1,59 +0,0 @@ -# Section 7.3 snippets -import numpy as np - -integers = np.array([[1, 2, 3], [4, 5, 6]]) - -integers - -floats = np.array([0.0, 0.1, 0.2, 0.3, 0.4]) - -floats - -# Determining an array’s Element Type -integers.dtype - -floats.dtype - -# Determining an array’s Dimensions -integers.ndim - -floats.ndim - -integers.shape - -floats.shape - -# Determining an array’s Number of Elements and Element Size -integers.size - -integers.itemsize - -floats.size - -floats.itemsize - -# Iterating through a Multidimensional array’s Elements -for row in integers: - for column in row: - print(column, end=' ') - print() - -for i in integers.flat: - print(i, end=' ') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_03selfcheck.py b/examples/ch07/snippets_py/07_03selfcheck.py deleted file mode 100755 index 09a93e5..0000000 --- a/examples/ch07/snippets_py/07_03selfcheck.py +++ /dev/null @@ -1,27 +0,0 @@ -# Section 7.3 Self Check snippets - -# Exercise 1 -import numpy as np - -a = np.array([[2, 4, 6, 8, 10], [1, 3, 5, 7, 9]]) - -a.ndim - -a.shape - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_04.py b/examples/ch07/snippets_py/07_04.py deleted file mode 100755 index 447bcc0..0000000 --- a/examples/ch07/snippets_py/07_04.py +++ /dev/null @@ -1,23 +0,0 @@ -# Section 7.4 snippets -import numpy as np - -np.zeros(5) - -np.ones((2, 4), dtype=int) - -np.full((3, 5), 13) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_05.py b/examples/ch07/snippets_py/07_05.py deleted file mode 100755 index 81f84c7..0000000 --- a/examples/ch07/snippets_py/07_05.py +++ /dev/null @@ -1,37 +0,0 @@ -# Section 7.5 snippets - -# Creating Integer Ranges with arange -import numpy as np - -np.arange(5) - -np.arange(5, 10) - -np.arange(10, 1, -2) - -# Creating Floating-Point Ranges with linspace -np.linspace(0.0, 1.0, num=5) - -# Reshaping an array -np.arange(1, 21).reshape(4, 5) - -# Displaying Large arrays -np.arange(1, 100001).reshape(4, 25000) - -np.arange(1, 100001).reshape(100, 1000) - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_05selfcheck.py b/examples/ch07/snippets_py/07_05selfcheck.py deleted file mode 100755 index 06d7302..0000000 --- a/examples/ch07/snippets_py/07_05selfcheck.py +++ /dev/null @@ -1,21 +0,0 @@ -# Section 7.5 Self Check snippets - -# Exercise 2 -import numpy as np - -np.arange(2, 41, 2).reshape(4, 5) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_06.py b/examples/ch07/snippets_py/07_06.py deleted file mode 100755 index 1bfafda..0000000 --- a/examples/ch07/snippets_py/07_06.py +++ /dev/null @@ -1,35 +0,0 @@ -# Section 7.6 snippets - -# Timing the Creation of a List Containing Results of 6,000,000 Die Rolls -import random - -%timeit rolls_list = \ - [random.randrange(1, 7) for i in range(0, 6_000_000)] - -# Timing the Creation of an array Containing Results of 6,000,000 Die Rolls -import numpy as np - -%timeit rolls_array = np.random.randint(1, 7, 6_000_000) - -# 60,000,000 and 600,000,000 Die Rolls -%timeit rolls_array = np.random.randint(1, 7, 60_000_000) - -%timeit rolls_array = np.random.randint(1, 7, 600_000_000) - -# Customizing the %timeit Iterations -%timeit -n3 -r2 rolls_array = np.random.randint(1, 7, 6_000_000) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_06selfcheck.py b/examples/ch07/snippets_py/07_06selfcheck.py deleted file mode 100755 index 8feb080..0000000 --- a/examples/ch07/snippets_py/07_06selfcheck.py +++ /dev/null @@ -1,25 +0,0 @@ -# Section 7.6 Self Check snippets - -# Exercise 1 -import numpy as np - -%timeit sum([x for x in range(10_000_000)]) - -%timeit np.arange(10_000_000).sum() - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_07.py b/examples/ch07/snippets_py/07_07.py deleted file mode 100755 index b742a9d..0000000 --- a/examples/ch07/snippets_py/07_07.py +++ /dev/null @@ -1,57 +0,0 @@ -# Section 7.7 snippets - -# Arithmetic Operations with arrays and Individual Numeric Values -import numpy as np - -numbers = np.arange(1, 6) - -numbers - -numbers * 2 - -numbers ** 3 - -numbers # numbers is unchanged by the arithmetic operators - -numbers += 10 - -numbers - -# Broadcasting - -# Arithmetic Operations Between arrays -numbers2 = np.linspace(1.1, 5.5, 5) - -numbers2 - -numbers * numbers2 - -# Comparing arrays -numbers - -numbers >= 13 - -numbers2 - -numbers2 < numbers - -numbers == numbers2 - -numbers == numbers - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_07selfcheck.py b/examples/ch07/snippets_py/07_07selfcheck.py deleted file mode 100755 index 221c13b..0000000 --- a/examples/ch07/snippets_py/07_07selfcheck.py +++ /dev/null @@ -1,22 +0,0 @@ -# Section 7.7 Self Check snippets - -# Exercise 2 -import numpy as np - -np.arange(1, 6) ** 2 - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_08.py b/examples/ch07/snippets_py/07_08.py deleted file mode 100755 index 5b5d2a4..0000000 --- a/examples/ch07/snippets_py/07_08.py +++ /dev/null @@ -1,42 +0,0 @@ -# Section 7.8 snippets -import numpy as np - -grades = np.array([[87, 96, 70], [100, 87, 90], - [94, 77, 90], [100, 81, 82]]) - -grades - -grades.sum() - -grades.min() - -grades.max() - -grades.mean() - -grades.std() - -grades.var() - -# Calculations by Row or Column -grades.mean(axis=0) - -grades.mean(axis=1) - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_08selfcheck.py b/examples/ch07/snippets_py/07_08selfcheck.py deleted file mode 100755 index 1e23c1d..0000000 --- a/examples/ch07/snippets_py/07_08selfcheck.py +++ /dev/null @@ -1,32 +0,0 @@ -# Section 7.8 Self Check snippets - -# Exercise 2 -import numpy as np - -grades = np.random.randint(60, 101, 12).reshape(3, 4) - -grades - -grades.mean() - -grades.mean(axis=0) - -grades.mean(axis=1) - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_09.py b/examples/ch07/snippets_py/07_09.py deleted file mode 100755 index 4bb28df..0000000 --- a/examples/ch07/snippets_py/07_09.py +++ /dev/null @@ -1,40 +0,0 @@ -# Section 7.9 snippets -import numpy as np - -numbers = np.array([1, 4, 9, 16, 25, 36]) - -np.sqrt(numbers) - -numbers2 = np.arange(1, 7) * 10 - -numbers2 - -np.add(numbers, numbers2) - -# Broadcasting with Universal Functions -np.multiply(numbers2, 5) - -numbers3 = numbers2.reshape(2, 3) - -numbers3 - -numbers4 = np.array([2, 4, 6]) - -np.multiply(numbers3, numbers4) - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_09selfcheck.py b/examples/ch07/snippets_py/07_09selfcheck.py deleted file mode 100755 index b3ed3fe..0000000 --- a/examples/ch07/snippets_py/07_09selfcheck.py +++ /dev/null @@ -1,25 +0,0 @@ -# Section 7.9 Self Checksnippets - -# Exercise 2 -import numpy as np - -numbers = np.arange(1, 6) - -np.power(numbers, 3) - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_10.py b/examples/ch07/snippets_py/07_10.py deleted file mode 100755 index b158565..0000000 --- a/examples/ch07/snippets_py/07_10.py +++ /dev/null @@ -1,40 +0,0 @@ -# Section 7.10 snippets - -# Indexing with Two-Dimensional arrays -import numpy as np - -grades = np.array([[87, 96, 70], [100, 87, 90], - [94, 77, 90], [100, 81, 82]]) - -grades - -grades[0, 1] # row 0, column 1 - -# Selecting a Subset of a Two-Dimensional array’s Rows -grades[1] - -grades[0:2] - -grades[[1, 3]] - -# Selecting a Subset of a Two-Dimensional array’s Columns -grades[:, 0] - -grades[:, 1:3] - -grades[:, [0, 2]] - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_10selfcheck.py b/examples/ch07/snippets_py/07_10selfcheck.py deleted file mode 100755 index d6fc512..0000000 --- a/examples/ch07/snippets_py/07_10selfcheck.py +++ /dev/null @@ -1,30 +0,0 @@ -# Section 7.10 Self Checksnippets - -# Exercise 1 -import numpy as np - -a = np.arange(1, 16).reshape(3, 5) - -a - -a[1] - -a[[0, 2]] - -a[:, 1:4] - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_11.py b/examples/ch07/snippets_py/07_11.py deleted file mode 100755 index 613f513..0000000 --- a/examples/ch07/snippets_py/07_11.py +++ /dev/null @@ -1,59 +0,0 @@ -# Section 7.11 snippets -import numpy as np - -numbers = np.arange(1, 6) - -numbers - -numbers2 = numbers.view() - -numbers2 - -id(numbers) - -id(numbers2) - -numbers[1] *= 10 - -numbers2 - -numbers - -numbers2[1] /= 10 - -numbers - -numbers2 - -# Slice Views -numbers2 = numbers[0:3] - -numbers2 - -id(numbers) - -id(numbers2) - -numbers2[3] - -numbers[1] /= 10 - -numbers - -numbers2 - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_12.py b/examples/ch07/snippets_py/07_12.py deleted file mode 100755 index 6a3f969..0000000 --- a/examples/ch07/snippets_py/07_12.py +++ /dev/null @@ -1,33 +0,0 @@ -# Section 7.12 snippets -import numpy as np - -numbers = np.arange(1, 6) - -numbers - -numbers2 = numbers.copy() - -numbers2 - -numbers[1] *= 10 - -numbers - -numbers2 - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_13.py b/examples/ch07/snippets_py/07_13.py deleted file mode 100755 index 601b244..0000000 --- a/examples/ch07/snippets_py/07_13.py +++ /dev/null @@ -1,75 +0,0 @@ -# Section 7.13 snippets - -# reshape vs. resize -import numpy as np - -grades = np.array([[87, 96, 70], [100, 87, 90]]) - -grades - -grades.reshape(1, 6) - -grades - -grades.resize(1, 6) - -grades - -# flatten vs. ravel -grades = np.array([[87, 96, 70], [100, 87, 90]]) - -grades - -flattened = grades.flatten() - -flattened - -grades - -flattened[0] = 100 - -flattened - -grades - -raveled = grades.ravel() - -raveled - -grades - -raveled[0] = 100 - -raveled - -grades - -# Transposing Rows and Columns - -grades.T - -grades - -# Horizontal and Vertical Stacking -grades2 = np.array([[94, 77, 90], [100, 81, 82]]) - -np.hstack((grades, grades2)) - -np.vstack((grades, grades2)) - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_13selfcheck.py b/examples/ch07/snippets_py/07_13selfcheck.py deleted file mode 100755 index 9f2b1c9..0000000 --- a/examples/ch07/snippets_py/07_13selfcheck.py +++ /dev/null @@ -1,28 +0,0 @@ -# Section 7.13 Self Check snippets - -# Exercise 1 -import numpy as np - -a = np.arange(1, 7).reshape(2, 3) - -a = np.hstack((a, a)) - -a = np.vstack((a, a)) - -a - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_14.01.py b/examples/ch07/snippets_py/07_14.01.py deleted file mode 100755 index 615c9e7..0000000 --- a/examples/ch07/snippets_py/07_14.01.py +++ /dev/null @@ -1,72 +0,0 @@ -# Section 7.14.1 snippets - -# Creating a Series with Default Indices -import pandas as pd - -grades = pd.Series([87, 100, 94]) - -# Displaying a Series -grades - -# Creating a Series with All Elements Having the Same Value -pd.Series(98.6, range(3)) - -# Accessing a Series’ Elements -grades[0] - -# Producing Descriptive Statistics for a Series -grades.count() - -grades.mean() - -grades.min() - -grades.max() - -grades.std() - -grades.describe() - -# Creating a Series with Custom Indices -grades = pd.Series([87, 100, 94], index=['Wally', 'Eva', 'Sam']) - -grades - -# Dictionary Initializers -grades = pd.Series({'Wally': 87, 'Eva': 100, 'Sam': 94}) - -grades - -# Accessing a Series’ Elements Via Custom Indices -grades['Eva'] - -grades.Wally - -grades.dtype - -grades.values - -# Creating a Series of Strings -hardware = pd.Series(['Hammer', 'Saw', 'Wrench']) - -hardware - -hardware.str.contains('a') - -hardware.str.upper() - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_14.01selfcheck.py b/examples/ch07/snippets_py/07_14.01selfcheck.py deleted file mode 100755 index 78b4dbf..0000000 --- a/examples/ch07/snippets_py/07_14.01selfcheck.py +++ /dev/null @@ -1,35 +0,0 @@ -# Section 7.14.1 Self Check snippets - -# Exercise 1 -import numpy as np - -import pandas as pd - -temps = np.random.randint(60, 101, 6) - -temperatures = pd.Series(temps) - -temperatures - -temperatures.min() - -temperatures.max() - -temperatures.mean() - -temperatures.describe() - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_14.02.py b/examples/ch07/snippets_py/07_14.02.py deleted file mode 100755 index dd5a4c2..0000000 --- a/examples/ch07/snippets_py/07_14.02.py +++ /dev/null @@ -1,104 +0,0 @@ -# Section 7.14.2 snippets - -# Creating a DataFrame from a Dictionary -import pandas as pd - -grades_dict = {'Wally': [87, 96, 70], 'Eva': [100, 87, 90], - 'Sam': [94, 77, 90], 'Katie': [100, 81, 82], - 'Bob': [83, 65, 85]} - -grades = pd.DataFrame(grades_dict) - -grades - -# Customizing a DataFrame’s Indices with the index Attribute -grades.index = ['Test1', 'Test2', 'Test3'] - -grades - -# Accessing a DataFrame’s Columns -grades['Eva'] - -grades.Sam - -# Selecting Rows via the loc and iloc Attributes -grades.loc['Test1'] - -grades.iloc[1] - -# Selecting Rows via Slices and Lists with the loc and iloc Attributes -grades.loc['Test1':'Test3'] - -grades.iloc[0:2] - -grades.loc[['Test1', 'Test3']] - -grades.iloc[[0, 2]] - -# Selecting Subsets of the Rows and Columns -grades.loc['Test1':'Test2', ['Eva', 'Katie']] - -grades.iloc[[0, 2], 0:3] - -# Boolean Indexing -grades[grades >= 90] - -grades[(grades >= 80) & (grades < 90)] - -# Accessing a Specific DataFrame Cell by Row and Column -grades.at['Test2', 'Eva'] - -grades.iat[2, 0] - -grades.at['Test2', 'Eva'] = 100 - -grades.at['Test2', 'Eva'] - -grades.iat[1, 2] = 87 - -grades.iat[1, 2] - -# Descriptive Statistics -grades.describe() - -pd.set_option('precision', 2) - -grades.describe() - -grades.mean() - -# Transposing the DataFrame with the T Attribute -grades.T - -grades.T.describe() - -grades.T.mean() - -# Sorting By Rows by Their Indices -grades.sort_index(ascending=False) - -# Sorting By Column Indices -grades.sort_index(axis=1) - -# Sorting By Column Values -grades.sort_values(by='Test1', axis=1, ascending=False) - -grades.T.sort_values(by='Test1', ascending=False) - -grades.loc['Test1'].sort_values(ascending=False) - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch07/snippets_py/07_14.02selfcheck.py b/examples/ch07/snippets_py/07_14.02selfcheck.py deleted file mode 100755 index 05fc87a..0000000 --- a/examples/ch07/snippets_py/07_14.02selfcheck.py +++ /dev/null @@ -1,37 +0,0 @@ -# Section 7.14.2 Self Check snippets - -# Exercise 1 -import pandas as pd - -temps = {'Mon': [68, 89], 'Tue': [71, 93], 'Wed': [66, 82], - 'Thu': [75, 97], 'Fri': [62, 79]} - -temperatures = pd.DataFrame(temps, index=['Low', 'High']) # (a) - -temperatures # (a) - -temperatures.loc[:, 'Mon':'Wed'] # (b) - -temperatures.loc['Low'] # (c) - -pd.set_option('precision', 2) # (d) - -temperatures.mean() # (d) - -temperatures.mean(axis=1) # (e) - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_ipynb/08_02.01.ipynb b/examples/ch08/snippets_ipynb/08_02.01.ipynb deleted file mode 100755 index 6cb6de8..0000000 --- a/examples/ch08/snippets_ipynb/08_02.01.ipynb +++ /dev/null @@ -1,145 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 8.2.1 Presentation Types" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "f'{17.489:.2f}'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Integers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "f'{10:d}'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Characters" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "f'{65:c} {97:c}'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Strings" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "f'{\"hello\":s} {7}'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Floating-Point and Decimal Values" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from decimal import Decimal" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "f'{Decimal(\"10000000000000000000000000.0\"):.3f}'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "f'{Decimal(\"10000000000000000000000000.0\"):.3e}'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_02.01selfcheck.ipynb b/examples/ch08/snippets_ipynb/08_02.01selfcheck.ipynb deleted file mode 100755 index ed52379..0000000 --- a/examples/ch08/snippets_ipynb/08_02.01selfcheck.ipynb +++ /dev/null @@ -1,73 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 8.2.1 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Use the type specifier `c` to display the characters that correspond to the character codes 58, 45 and 41.\n", - "\n", - "**Answer:**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'{58:c}{45:c}{41:c}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_02.02.ipynb b/examples/ch08/snippets_ipynb/08_02.02.ipynb deleted file mode 100755 index 0cf4d91..0000000 --- a/examples/ch08/snippets_ipynb/08_02.02.ipynb +++ /dev/null @@ -1,149 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 8.2.2 Field Widths and Alignment" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "f'[{27:10d}]'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "f'[{3.5:10f}]'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "f'[{\"hello\":10}]'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Explicitly Specifying Left and Right Alignment in a Field " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "f'[{27:<15d}]'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "f'[{3.5:<15f}]'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "f'[{\"hello\":>15}]'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Centering a Value in a Field " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "f'[{27:^7d}]'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "f'[{3.5:^7f}]'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "f'[{\"hello\":^7}]'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_02.02selfcheck.ipynb b/examples/ch08/snippets_ipynb/08_02.02selfcheck.ipynb deleted file mode 100755 index 5334aa2..0000000 --- a/examples/ch08/snippets_ipynb/08_02.02selfcheck.ipynb +++ /dev/null @@ -1,73 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 8.2.2 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Display on separate lines the name `'Amanda'` right-, center- and left-aligned in a field of 10 characters. Enclose each result in brackets so you can see the alignment results more clearly.\n", - "\n", - "**Answer:**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'[{\"Amanda\":>10}]\\n[{\"Amanda\":^10}]\\n[{\"Amanda\":<10}]')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_02.03.ipynb b/examples/ch08/snippets_ipynb/08_02.03.ipynb deleted file mode 100755 index 078d2b3..0000000 --- a/examples/ch08/snippets_ipynb/08_02.03.ipynb +++ /dev/null @@ -1,120 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 8.2.3 Numeric Formatting" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Formatting Positive Numbers with Signs" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "f'[{27:+10d}]'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "f'[{27:+010d}]'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using a Space Where a + Sign Would Appear in a Positive Value" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'{27:d}\\n{27: d}\\n{-27: d}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Grouping Digits" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "f'{12345678:,d}'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "f'{123456.78:,.2f}'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_02.03selfcheck.ipynb b/examples/ch08/snippets_ipynb/08_02.03selfcheck.ipynb deleted file mode 100755 index 9a4f147..0000000 --- a/examples/ch08/snippets_ipynb/08_02.03selfcheck.ipynb +++ /dev/null @@ -1,73 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 8.2.3 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Print the values `10240.473` and `-3210.9521`, each preceded by its sign in 10-character fields with thousands separators, their decimal points aligned vertically and two digits of precision. \n", - "\n", - "**Answer:**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'{10240.473:+10,.2f}\\n{-3210.9521:+10,.2f}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_02.04.ipynb b/examples/ch08/snippets_ipynb/08_02.04.ipynb deleted file mode 100755 index 2058551..0000000 --- a/examples/ch08/snippets_ipynb/08_02.04.ipynb +++ /dev/null @@ -1,120 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 8.2.4 String’s format Method" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'{:.2f}'.format(17.489)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Multiple Placeholders\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'{} {}'.format('Amanda', 'Cyan')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Referencing Arguments By Position Number" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'{0} {0} {1}'.format('Happy', 'Birthday')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Referencing Keyword Arguments" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'{first} {last}'.format(first='Amanda', last='Gray')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'{last} {first}'.format(first='Amanda', last='Gray')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_02.04selfcheck.ipynb b/examples/ch08/snippets_ipynb/08_02.04selfcheck.ipynb deleted file mode 100755 index 61ef448..0000000 --- a/examples/ch08/snippets_ipynb/08_02.04selfcheck.ipynb +++ /dev/null @@ -1,97 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 8.2.4 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Use string method `format` to reimplement the IPython sessions in the Self Check exercises from Sections 8.2.1–8.2.3.\n", - "**Answer:**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('{:c} {:c} {:c}'.format(58, 45, 41))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('[{0:>10}]\\n[{0:^10}]\\n[{0:<10}]'.format('Amanda'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('{:+10,.2f}\\n{:+10,.2f}'.format(10240.473, -3210.9521))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that snippet `[2]` references `format`’s argument three times via its position number (`0`) in the argument list. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_03.ipynb b/examples/ch08/snippets_ipynb/08_03.ipynb deleted file mode 100755 index ea854ed..0000000 --- a/examples/ch08/snippets_ipynb/08_03.ipynb +++ /dev/null @@ -1,117 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 8.3 Concatenating and Repeating Strings " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "s1 = 'happy'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "s2 = 'birthday'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "s1 += ' ' + s2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "s1" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "symbol = '>'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "symbol *= 5" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "symbol" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_03selfcheck.ipynb b/examples/ch08/snippets_ipynb/08_03selfcheck.ipynb deleted file mode 100755 index b35e459..0000000 --- a/examples/ch08/snippets_ipynb/08_03selfcheck.ipynb +++ /dev/null @@ -1,109 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 8.3 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Use the `+=` operator to concatenate your first and last name. Then use the `*=` operator to create a bar of asterisks with the same number of characters as your full name and display the bar above and below your name.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "name = 'Pam'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "name += ' Black'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "bar = '*'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "bar *= len(name)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'{bar}\\n{name}\\n{bar}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_04.ipynb b/examples/ch08/snippets_ipynb/08_04.ipynb deleted file mode 100755 index 7ca2b1d..0000000 --- a/examples/ch08/snippets_ipynb/08_04.ipynb +++ /dev/null @@ -1,111 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 8.4 Stripping White Space from Strings" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Removing Leading and Trailing Whitespace" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sentence = '\\t \\n This is a test string. \\t\\t \\n'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sentence.strip()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Removing Leading Whitespace" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sentence.lstrip()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Removing Trailing Whitespace" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sentence.rstrip()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_04selfcheck.ipynb b/examples/ch08/snippets_ipynb/08_04selfcheck.ipynb deleted file mode 100755 index 6dec4d0..0000000 --- a/examples/ch08/snippets_ipynb/08_04selfcheck.ipynb +++ /dev/null @@ -1,104 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 8.4 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "**1. _(IPython Session)_** Use the methods in this section to strip the whitespace from the following string, which has five spaces at the beginning and end of the string:\n", - "```python\n", - "name = ' Margo Magenta '\n", - "```\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "name = ' Margo Magenta '" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "name.strip()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "name.lstrip()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "name.rstrip()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_05.ipynb b/examples/ch08/snippets_ipynb/08_05.ipynb deleted file mode 100755 index 6104aed..0000000 --- a/examples/ch08/snippets_ipynb/08_05.ipynb +++ /dev/null @@ -1,86 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 8.5 Changing Character Case" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Capitalizing Only a String’s First Character" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'happy birthday'.capitalize()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Capitalizing the First Character of Every Word in a String" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'strings: a deeper look'.title()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_05selfcheck.ipynb b/examples/ch08/snippets_ipynb/08_05selfcheck.ipynb deleted file mode 100755 index 48bd60e..0000000 --- a/examples/ch08/snippets_ipynb/08_05selfcheck.ipynb +++ /dev/null @@ -1,91 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 8.5 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Demonstrate the results of calling `capitalize` and `title` on the string `'happy new year'`.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "test_string = 'happy new year'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "test_string.capitalize()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "test_string.title()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_06.ipynb b/examples/ch08/snippets_ipynb/08_06.ipynb deleted file mode 100755 index 6bcc3fa..0000000 --- a/examples/ch08/snippets_ipynb/08_06.ipynb +++ /dev/null @@ -1,117 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 8.6 Comparison Operators for Strings" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'A: {ord(\"A\")}; a: {ord(\"a\")}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Orange' == 'orange'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Orange' != 'orange'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Orange' < 'orange'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Orange' <= 'orange'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Orange' > 'orange'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Orange' >= 'orange'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_07.ipynb b/examples/ch08/snippets_ipynb/08_07.ipynb deleted file mode 100755 index 15309a1..0000000 --- a/examples/ch08/snippets_ipynb/08_07.ipynb +++ /dev/null @@ -1,199 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 8.7 Searching for Substrings" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Counting Occurrences" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sentence = 'to be or not to be that is the question'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sentence.count('to')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sentence.count('to', 12)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sentence.count('that', 12, 25)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Locating a Substring in a String" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sentence.index('be')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sentence.rindex('be')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Determining Whether a String Contains a Substring " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'that' in sentence" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'THAT' in sentence" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'THAT' not in sentence" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Locating a Substring at the Beginning or End of a String" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sentence.startswith('to')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sentence.startswith('be')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sentence.endswith('question')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sentence.endswith('quest')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_07selfcheck.ipynb b/examples/ch08/snippets_ipynb/08_07selfcheck.ipynb deleted file mode 100755 index 31a55f0..0000000 --- a/examples/ch08/snippets_ipynb/08_07selfcheck.ipynb +++ /dev/null @@ -1,76 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 8.7 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Create a loop that locates and displays every word that starts with `'t'` in the string `'to be or not to be that is the question'`.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for word in 'to be or not to be that is the question'.split():\n", - " if word.startswith('t'):\n", - " print(word, end=' ')\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_08.ipynb b/examples/ch08/snippets_ipynb/08_08.ipynb deleted file mode 100755 index d3a05e5..0000000 --- a/examples/ch08/snippets_ipynb/08_08.ipynb +++ /dev/null @@ -1,72 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 8.8 Replacing Substrings" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "values = '1\\t2\\t3\\t4\\t5'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "values.replace('\\t', ',')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_08selfcheck.ipynb b/examples/ch08/snippets_ipynb/08_08selfcheck.ipynb deleted file mode 100755 index 3e2ec2a..0000000 --- a/examples/ch08/snippets_ipynb/08_08selfcheck.ipynb +++ /dev/null @@ -1,73 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 8.8 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Replace the spaces in the string `'1 2 3 4 5'` with `' --> '`.\n", - "\n", - "**Answer:**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'1 2 3 4 5'.replace(' ', ' --> ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_09.ipynb b/examples/ch08/snippets_ipynb/08_09.ipynb deleted file mode 100755 index 99f7b21..0000000 --- a/examples/ch08/snippets_ipynb/08_09.ipynb +++ /dev/null @@ -1,219 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 8.9 Splitting and Joining Strings" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Splitting Strings" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "letters = 'A, B, C, D'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "letters.split(', ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "letters.split(', ', 2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Joining Strings" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "letters_list = ['A', 'B', 'C', 'D']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "','.join(letters_list)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "','.join([str(i) for i in range(10)])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### String Methods partition and rpartition " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Amanda: 89, 97, 92'.partition(': ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "url = 'http://www.deitel.com/books/PyCDS/table_of_contents.html'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rest_of_url, separator, document = url.rpartition('/')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "document" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rest_of_url" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### String Method splitlines " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "lines = \"\"\"This is line 1\n", - "This is line2\n", - "This is line3\"\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "lines" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "lines.splitlines()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "lines.splitlines(True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_09selfcheck.ipynb b/examples/ch08/snippets_ipynb/08_09selfcheck.ipynb deleted file mode 100755 index 5e7e338..0000000 --- a/examples/ch08/snippets_ipynb/08_09selfcheck.ipynb +++ /dev/null @@ -1,147 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 8.9 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Use `split` and `join` in one statement to reformat the string\n", - "```python\n", - "'Pamela White'\n", - "```\n", - "into the string\n", - "```python\n", - "'White, Pamela'\n", - "```\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "', '.join(reversed('Pamela White'.split()))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Use `partition` and `rpartition` to extract from the URL string \n", - "```\n", - "'http://www.deitel.com/books/PyCDS/table_of_contents.html'\n", - "```\n", - "the substrings `'www.deitel.com'` and `'books/PyCDS'`.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "url = 'http://www.deitel.com/books/PyCDS/table_of_contents.html'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "protocol, separator, rest_of_url = url.partition('://')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "host, separator, document_with_path = rest_of_url.partition('/')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "host" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "path, separator, document = document_with_path.rpartition('/')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "path" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_10.ipynb b/examples/ch08/snippets_ipynb/08_10.ipynb deleted file mode 100755 index f42fcf3..0000000 --- a/examples/ch08/snippets_ipynb/08_10.ipynb +++ /dev/null @@ -1,90 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 8.10 Characters and Character-Testing Methods" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'-27'.isdigit()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'27'.isdigit()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'A9876'.isalnum()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'123 Main Street'.isalnum()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_11.ipynb b/examples/ch08/snippets_ipynb/08_11.ipynb deleted file mode 100755 index c296727..0000000 --- a/examples/ch08/snippets_ipynb/08_11.ipynb +++ /dev/null @@ -1,90 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 8.11 Raw Strings" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "file_path = 'C:\\\\MyFolder\\\\MySubFolder\\\\MyFile.txt'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "file_path" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "file_path = r'C:\\MyFolder\\MySubFolder\\MyFile.txt'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "file_path" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_12.01.ipynb b/examples/ch08/snippets_ipynb/08_12.01.ipynb deleted file mode 100755 index 9eea696..0000000 --- a/examples/ch08/snippets_ipynb/08_12.01.ipynb +++ /dev/null @@ -1,307 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 8.12.1 re Module and Function fullmatch " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import re" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Matching Literal Characters" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pattern = '02215'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Match' if re.fullmatch(pattern, '02215') else 'No match'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Match' if re.fullmatch(pattern, '51220') else 'No match'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Metacharacters, Character Classes and Quantifiers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Valid' if re.fullmatch(r'\\d{5}', '02215') else 'Invalid'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Valid' if re.fullmatch(r'\\d{5}', '9876') else 'Invalid'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Other Predefined Character Classes\n", - "\n", - "### Custom Character Classes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Valid' if re.fullmatch('[A-Z][a-z]*', 'Wally') else 'Invalid'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Valid' if re.fullmatch('[A-Z][a-z]*', 'eva') else 'Invalid'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Match' if re.fullmatch('[^a-z]', 'A') else 'No match'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Match' if re.fullmatch('[^a-z]', 'a') else 'No match'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Match' if re.fullmatch('[*+$]', '*') else 'No match'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Match' if re.fullmatch('[*+$]', '!') else 'No match'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### * vs. + Quantifier" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Valid' if re.fullmatch('[A-Z][a-z]+', 'Wally') else 'Invalid'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Valid' if re.fullmatch('[A-Z][a-z]+', 'E') else 'Invalid'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Other Quantifiers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Match' if re.fullmatch('labell?ed', 'labelled') else 'No match'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Match' if re.fullmatch('labell?ed', 'labeled') else 'No match'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Match' if re.fullmatch('labell?ed', 'labellled') else 'No match'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Match' if re.fullmatch(r'\\d{3,}', '123') else 'No match'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Match' if re.fullmatch(r'\\d{3,}', '1234567890') else 'No match'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Match' if re.fullmatch(r'\\d{3,}', '12') else 'No match'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Match' if re.fullmatch(r'\\d{3,6}', '123') else 'No match'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Match' if re.fullmatch(r'\\d{3,6}', '123456') else 'No match'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Match' if re.fullmatch(r'\\d{3,6}', '1234567') else 'No match'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Match' if re.fullmatch(r'\\d{3,6}', '12') else 'No match'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_12.01selfcheck.ipynb b/examples/ch08/snippets_ipynb/08_12.01selfcheck.ipynb deleted file mode 100755 index 5c2646f..0000000 --- a/examples/ch08/snippets_ipynb/08_12.01selfcheck.ipynb +++ /dev/null @@ -1,101 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 8.12.1 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**4. _(IPython Session)_** Create and test a regular expression that matches a street address consisting of a number with one or more digits followed by two words of one or more characters each. The tokens should be separated by one space each, as in `123 Main Street`.\n", - "\n", - "**Answer:** \n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import re" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "street = r'\\d+ [A-Z][a-z]* [A-Z][a-z]*'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Match' if re.fullmatch(street, '123 Main Street') else 'No match'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'Match' if re.fullmatch(street, 'Main Street') else 'No match'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_12.02.ipynb b/examples/ch08/snippets_ipynb/08_12.02.ipynb deleted file mode 100755 index bf00e9f..0000000 --- a/examples/ch08/snippets_ipynb/08_12.02.ipynb +++ /dev/null @@ -1,113 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 8.12.2 Replacing Substrings and Splitting Strings" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Function sub—Replacing Patterns " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import re" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "re.sub(r'\\t', ', ', '1\\t2\\t3\\t4')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "re.sub(r'\\t', ', ', '1\\t2\\t3\\t4', count=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Function split " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "re.split(r',\\s*', '1, 2, 3,4, 5,6,7,8')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "re.split(r',\\s*', '1, 2, 3,4, 5,6,7,8', maxsplit=3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_12.02selfcheck.ipynb b/examples/ch08/snippets_ipynb/08_12.02selfcheck.ipynb deleted file mode 100755 index e371f5c..0000000 --- a/examples/ch08/snippets_ipynb/08_12.02selfcheck.ipynb +++ /dev/null @@ -1,106 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 8.12.2 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Replace each occurrence of one or more adjacent tab characters in the following string with a comma and a space:\n", - "```python\n", - "'A\\tB\\t\\tC\\t\\t\\tD'\n", - "```\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import re" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "re.sub(r'\\t+', ', ', 'A\\tB\\t\\tC\\t\\t\\tD')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Use a regular expression and the `split` function to split the following string at _one or more_ adjacent `$` characters. \n", - "```python\n", - "'123$Main$$Street'\n", - "```\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "re.split('\\$+', '123$Main$$Street')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_12.03.ipynb b/examples/ch08/snippets_ipynb/08_12.03.ipynb deleted file mode 100755 index 81a1c26..0000000 --- a/examples/ch08/snippets_ipynb/08_12.03.ipynb +++ /dev/null @@ -1,315 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 8.12.3 Other Search Functions; Accessing Matches" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Function search—Finding the First Match Anywhere in a String" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import re" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result = re.search('Python', 'Python is fun')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result.group() if result else 'not found'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result2 = re.search('fun!', 'Python is fun')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result2.group() if result2 else 'not found'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Ignoring Case with the Optional flags Keyword Argument" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result3 = re.search('Sam', 'SAM WHITE', flags=re.IGNORECASE)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result3.group() if result3 else 'not found'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Metacharacters that Restrict Matches to the Beginning or End of a String" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result = re.search('^Python', 'Python is fun')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result.group() if result else 'not found'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result = re.search('^fun', 'Python is fun')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result.group() if result else 'not found'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result = re.search('Python$', 'Python is fun')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result.group() if result else 'not found'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result = re.search('fun$', 'Python is fun')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result.group() if result else 'not found'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Function findall and finditer—Finding All Matches in a String" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "contact = 'Wally White, Home: 555-555-1234, Work: 555-555-4321'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "re.findall(r'\\d{3}-\\d{3}-\\d{4}', contact)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for phone in re.finditer(r'\\d{3}-\\d{3}-\\d{4}', contact):\n", - " print(phone.group())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Capturing Substrings in a Match" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "text = 'Charlie Cyan, e-mail: demo1@deitel.com'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pattern = r'([A-Z][a-z]+ [A-Z][a-z]+), e-mail: (\\w+@\\w+\\.\\w{3})'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result = re.search(pattern, text)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result.groups()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result.group()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result.group(1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result.group(2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_12.03selfcheck.ipynb b/examples/ch08/snippets_ipynb/08_12.03selfcheck.ipynb deleted file mode 100755 index 3a3f27d..0000000 --- a/examples/ch08/snippets_ipynb/08_12.03selfcheck.ipynb +++ /dev/null @@ -1,122 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 8.12.3 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Assume you have a string representing an addition problem such as \n", - "```python\n", - "'10 + 5'\n", - "```\n", - "Use a regular expression to break the string into three groups representing the two operands and the operator, then display the groups.\n", - "\n", - "**Answer:** `" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import re" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result = re.search(r'(\\d+) ([-+*/]) (\\d+)', '10 + 5')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result.groups()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result.group(1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result.group(2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result.group(3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_13.ipynb b/examples/ch08/snippets_ipynb/08_13.ipynb deleted file mode 100755 index b870bd9..0000000 --- a/examples/ch08/snippets_ipynb/08_13.ipynb +++ /dev/null @@ -1,220 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 5.13 Intro to Data Science: Pandas, Regular Expressions and Data Munging \n", - "### Cleaning Your Data \n", - "### Data Validation" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "zips = pd.Series({'Boston': '02215', 'Miami': '3310'})" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "zips" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "zips.str.match(r'\\d{5}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cities = pd.Series(['Boston, MA 02215', 'Miami, FL 33101'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cities" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cities.str.contains(r' [A-Z]{2} ')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cities.str.match(r' [A-Z]{2} ')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Reformatting Your Data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "contacts = [['Mike Green', 'demo1@deitel.com', '5555555555'],\n", - " ['Sue Brown', 'demo2@deitel.com', '5555551234']]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "contactsdf = pd.DataFrame(contacts, \n", - " columns=['Name', 'Email', 'Phone'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "contactsdf" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import re" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def get_formatted_phone(value):\n", - " result = re.fullmatch(r'(\\d{3})(\\d{3})(\\d{4})', value)\n", - " return '-'.join(result.groups()) if result else value" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "formatted_phone = contactsdf['Phone'].map(get_formatted_phone)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "formatted_phone" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "contactsdf['Phone'] = formatted_phone" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "contactsdf" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/08_13selfcheck.ipynb b/examples/ch08/snippets_ipynb/08_13selfcheck.ipynb deleted file mode 100755 index 06c39d2..0000000 --- a/examples/ch08/snippets_ipynb/08_13selfcheck.ipynb +++ /dev/null @@ -1,135 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 8.13 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Let’s assume that an application requires U.S. phone numbers in the format `(###) ###-####`. Modify the `get_formatted_phone` function in snippet `[13]` to return the phone number in this new format. Then recreate the `DataFrame` from snippets `[9]` and `[10]` and use the updated `get_formatted_phone` function to munge the data.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import re" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "contacts = [['Mike Green', 'demo1@deitel.com', '5555555555'],\n", - " ['Sue Brown', 'demo2@deitel.com', '5555551234']]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "contactsdf = pd.DataFrame(contacts, \n", - " columns=['Name', 'Email', 'Phone'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def get_formatted_phone(value):\n", - " result = re.fullmatch(r'(\\d{3})(\\d{3})(\\d{4})', value)\n", - " if result:\n", - " part1, part2, part3 = result.groups()\n", - " return '(' + part1 + ') ' + part2 + '-' + part3\n", - " else: \n", - " return value" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "contactsdf['Phone'] = contactsdf['Phone'].map(get_formatted_phone)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "contactsdf" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch08/snippets_ipynb/files/art/check.png b/examples/ch08/snippets_ipynb/files/art/check.png deleted file mode 100755 index eea18cd..0000000 Binary files a/examples/ch08/snippets_ipynb/files/art/check.png and /dev/null differ diff --git a/examples/ch08/snippets_py/08_02.01.py b/examples/ch08/snippets_py/08_02.01.py deleted file mode 100755 index 941a612..0000000 --- a/examples/ch08/snippets_py/08_02.01.py +++ /dev/null @@ -1,36 +0,0 @@ -# Section 8.2.1 snippets - -f'{17.489:.2f}' - -# Integers -f'{10:d}' - -# Characters -f'{65:c} {97:c}' - -# Strings -f'{"hello":s} {7}' - -# Floating-Point and Decimal Values -from decimal import Decimal - -f'{Decimal("10000000000000000000000000.0"):.3f}' - -f'{Decimal("10000000000000000000000000.0"):.3e}' - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_02.01selfcheck.py b/examples/ch08/snippets_py/08_02.01selfcheck.py deleted file mode 100755 index 0ef3860..0000000 --- a/examples/ch08/snippets_py/08_02.01selfcheck.py +++ /dev/null @@ -1,19 +0,0 @@ -# Section 8.2.1 Self Check snippets - -# Exercise 3 -print(f'{58:c}{45:c}{41:c}') - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_02.02.py b/examples/ch08/snippets_py/08_02.02.py deleted file mode 100755 index c1b751b..0000000 --- a/examples/ch08/snippets_py/08_02.02.py +++ /dev/null @@ -1,37 +0,0 @@ -# Section 8.2.2 snippets - -f'[{27:10d}]' - -f'[{3.5:10f}]' - -f'[{"hello":10}]' - -# Explicitly Specifying Left and Right Alignment in a Field -f'[{27:<15d}]' - -f'[{3.5:<15f}]' - -f'[{"hello":>15}]' - -# Centering a Value in a Field -f'[{27:^7d}]' - -f'[{3.5:^7f}]' - -f'[{"hello":^7}]' - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_02.02selfcheck.py b/examples/ch08/snippets_py/08_02.02selfcheck.py deleted file mode 100755 index 90be672..0000000 --- a/examples/ch08/snippets_py/08_02.02selfcheck.py +++ /dev/null @@ -1,20 +0,0 @@ -# Section 8.2.2 Self Check snippets - -# Exercise 2 -print(f'[{"Amanda":>10}]\n[{"Amanda":^10}]\n[{"Amanda":<10}]') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_02.03.py b/examples/ch08/snippets_py/08_02.03.py deleted file mode 100755 index becae82..0000000 --- a/examples/ch08/snippets_py/08_02.03.py +++ /dev/null @@ -1,31 +0,0 @@ -# Section 8.2.3 snippets - -# Formatting Positive Numbers with Signs -f'[{27:+10d}]' - -f'[{27:+010d}]' - -# Using a Space Where a + Sign Would Appear in a Positive Value -print(f'{27:d}\n{27: d}\n{-27: d}') - -# Grouping Digits -f'{12345678:,d}' - -f'{123456.78:,.2f}' - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_02.03selfcheck.py b/examples/ch08/snippets_py/08_02.03selfcheck.py deleted file mode 100755 index dd39d5f..0000000 --- a/examples/ch08/snippets_py/08_02.03selfcheck.py +++ /dev/null @@ -1,19 +0,0 @@ -# Section 8.2.3 Self Check snippets - -# Exercise 2 -print(f'{10240.473:+10,.2f}\n{-3210.9521:+10,.2f}') - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_02.04.py b/examples/ch08/snippets_py/08_02.04.py deleted file mode 100755 index d9276ca..0000000 --- a/examples/ch08/snippets_py/08_02.04.py +++ /dev/null @@ -1,32 +0,0 @@ -# Section 8.2.4 snippets - -# 8.2.4 String’s format Method -'{:.2f}'.format(17.489) - -# Multiple Placeholders -'{} {}'.format('Amanda', 'Cyan') - -# Referencing Arguments By Position Number -'{0} {0} {1}'.format('Happy', 'Birthday') - -# Referencing Keyword Arguments -'{first} {last}'.format(first='Amanda', last='Gray') - -'{last} {first}'.format(first='Amanda', last='Gray') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_02.04selfcheck.py b/examples/ch08/snippets_py/08_02.04selfcheck.py deleted file mode 100755 index 2524b9b..0000000 --- a/examples/ch08/snippets_py/08_02.04selfcheck.py +++ /dev/null @@ -1,23 +0,0 @@ -# Section 8.2.4 Self Check snippets - -# Exercise 1 -print('{:c} {:c} {:c}'.format(58, 45, 41)) - -print('[{0:>10}]\n[{0:^10}]\n[{0:<10}]'.format('Amanda')) - -print('{:+10,.2f}\n{:+10,.2f}'.format(10240.473, -3210.9521)) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_03.py b/examples/ch08/snippets_py/08_03.py deleted file mode 100755 index 6942415..0000000 --- a/examples/ch08/snippets_py/08_03.py +++ /dev/null @@ -1,31 +0,0 @@ -# Section 8.3 snippets -s1 = 'happy' - -s2 = 'birthday' - -s1 += ' ' + s2 - -s1 - -symbol = '>' - -symbol *= 5 - -symbol - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_03selfcheck.py b/examples/ch08/snippets_py/08_03selfcheck.py deleted file mode 100755 index a9f4041..0000000 --- a/examples/ch08/snippets_py/08_03selfcheck.py +++ /dev/null @@ -1,30 +0,0 @@ -# Section 8.3 Self Check snippets - -# Exercise 1 -name = 'Pam' - -name += ' Black' - -bar = '*' - -bar *= len(name) - -print(f'{bar}\n{name}\n{bar}') - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_04.py b/examples/ch08/snippets_py/08_04.py deleted file mode 100755 index 4d52a13..0000000 --- a/examples/ch08/snippets_py/08_04.py +++ /dev/null @@ -1,32 +0,0 @@ -# Section 8.4 snippets - -# Removing Leading and Trailing Whitespace -sentence = '\t \n This is a test string. \t\t \n' - -sentence.strip() - -# Removing Leading Whitespace -sentence.lstrip() - -# Removing Trailing Whitespace -sentence.rstrip() - - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_04selfcheck.py b/examples/ch08/snippets_py/08_04selfcheck.py deleted file mode 100755 index 24de3e4..0000000 --- a/examples/ch08/snippets_py/08_04selfcheck.py +++ /dev/null @@ -1,28 +0,0 @@ -# Section 8.4 Self Check snippets - -# Exercise 1 -name = ' Margo Magenta ' - -name.strip() - -name.lstrip() - -name.rstrip() - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_05.py b/examples/ch08/snippets_py/08_05.py deleted file mode 100755 index 5c8b0ff..0000000 --- a/examples/ch08/snippets_py/08_05.py +++ /dev/null @@ -1,25 +0,0 @@ -# Section 8.5 snippets - -# Capitalizing Only a String’s First Character -'happy birthday'.capitalize() - -# Capitalizing the First Character of Every Word in a String -'strings: a deeper look'.title() - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_05selfcheck.py b/examples/ch08/snippets_py/08_05selfcheck.py deleted file mode 100755 index 2744bb9..0000000 --- a/examples/ch08/snippets_py/08_05selfcheck.py +++ /dev/null @@ -1,25 +0,0 @@ -# Section 8.5 Self Check snippets - -# Exercise 1 -test_string = 'happy new year' - -test_string.capitalize() - -test_string.title() - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_06.py b/examples/ch08/snippets_py/08_06.py deleted file mode 100755 index e30b1a0..0000000 --- a/examples/ch08/snippets_py/08_06.py +++ /dev/null @@ -1,32 +0,0 @@ -# Section 8.6 snippets - -print(f'A: {ord("A")}; a: {ord("a")}') - -'Orange' == 'orange' - -'Orange' != 'orange' - -'Orange' < 'orange' - -'Orange' <= 'orange' - -'Orange' > 'orange' - -'Orange' >= 'orange' - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_07.py b/examples/ch08/snippets_py/08_07.py deleted file mode 100755 index 1d95395..0000000 --- a/examples/ch08/snippets_py/08_07.py +++ /dev/null @@ -1,49 +0,0 @@ -# Section 8.7 snippets - -# Counting Occurrences -sentence = 'to be or not to be that is the question' - -sentence.count('to') - -sentence.count('to', 12) - -sentence.count('that', 12, 25) - -# Locating a Substring in a String -sentence.index('be') - -sentence.rindex('be') - -# Determining Whether a String Contains a Substring -'that' in sentence - -'THAT' in sentence - -'THAT' not in sentence - -# Locating a Substring at the Beginning or End of a String -sentence.startswith('to') - -sentence.startswith('be') - -sentence.endswith('question') - -sentence.endswith('quest') - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_07selfcheck.py b/examples/ch08/snippets_py/08_07selfcheck.py deleted file mode 100755 index e2c2c15..0000000 --- a/examples/ch08/snippets_py/08_07selfcheck.py +++ /dev/null @@ -1,23 +0,0 @@ -# Section 8.7 Self Check snippets - -# Exercise 3 -for word in 'to be or not to be that is the question'.split(): - if word.startswith('t'): - print(word, end=' ') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_08.py b/examples/ch08/snippets_py/08_08.py deleted file mode 100755 index 9012e00..0000000 --- a/examples/ch08/snippets_py/08_08.py +++ /dev/null @@ -1,22 +0,0 @@ -# Section 8.8 snippets -values = '1\t2\t3\t4\t5' - -values.replace('\t', ',') - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_08selfcheck.py b/examples/ch08/snippets_py/08_08selfcheck.py deleted file mode 100755 index e705144..0000000 --- a/examples/ch08/snippets_py/08_08selfcheck.py +++ /dev/null @@ -1,24 +0,0 @@ -# Section 8.8 Self Check snippets - -# Exercise 1 -'1 2 3 4 5'.replace(' ', ' --> ') - - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_09.py b/examples/ch08/snippets_py/08_09.py deleted file mode 100755 index e8c6022..0000000 --- a/examples/ch08/snippets_py/08_09.py +++ /dev/null @@ -1,55 +0,0 @@ -# Section 8.9 snippets - -# Splitting Strings -letters = 'A, B, C, D' - -letters.split(', ') - -letters.split(', ', 2) - -# Joining Strings -letters_list = ['A', 'B', 'C', 'D'] - -','.join(letters_list) - -','.join([str(i) for i in range(10)]) - -# String Methods partition and rpartition -'Amanda: 89, 97, 92'.partition(': ') - -url = 'http://www.deitel.com/books/PyCDS/table_of_contents.html' - -rest_of_url, separator, document = url.rpartition('/') - -document - -rest_of_url - -# String Method splitlines -lines = """This is line 1 -This is line2 -This is line3""" - -lines - -lines.splitlines() - -lines.splitlines(True) - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_09selfcheck.py b/examples/ch08/snippets_py/08_09selfcheck.py deleted file mode 100755 index 47adccb..0000000 --- a/examples/ch08/snippets_py/08_09selfcheck.py +++ /dev/null @@ -1,36 +0,0 @@ -# Section 8.9 Self Checksnippets - -# Exercise 2 -', '.join(reversed('Pamela White'.split())) - -# Exercise 3 -url = 'http://www.deitel.com/books/PyCDS/table_of_contents.html' - -protocol, separator, rest_of_url = url.partition('://') - -host, separator, document_with_path = rest_of_url.partition('/') - -host - -path, separator, document = document_with_path.rpartition('/') - -path - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_10.py b/examples/ch08/snippets_py/08_10.py deleted file mode 100755 index f81f6d0..0000000 --- a/examples/ch08/snippets_py/08_10.py +++ /dev/null @@ -1,25 +0,0 @@ -# Section 8.10 snippets -'-27'.isdigit() - -'27'.isdigit() - -'A9876'.isalnum() - -'123 Main Street'.isalnum() - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_11.py b/examples/ch08/snippets_py/08_11.py deleted file mode 100755 index a9c6464..0000000 --- a/examples/ch08/snippets_py/08_11.py +++ /dev/null @@ -1,27 +0,0 @@ -# Section 8.11 snippets -file_path = 'C:\\MyFolder\\MySubFolder\\MyFile.txt' - -file_path - -file_path = r'C:\MyFolder\MySubFolder\MyFile.txt' - -file_path - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_12.01.py b/examples/ch08/snippets_py/08_12.01.py deleted file mode 100755 index f5c5a55..0000000 --- a/examples/ch08/snippets_py/08_12.01.py +++ /dev/null @@ -1,72 +0,0 @@ -# Section 8.12.1 snippets - -import re - -# Matching Literal Characters -pattern = '02215' - -'Match' if re.fullmatch(pattern, '02215') else 'No match' - -'Match' if re.fullmatch(pattern, '51220') else 'No match' - -# Metacharacters, Character Classes and Quantifiers -'Valid' if re.fullmatch(r'\d{5}', '02215') else 'Invalid' - -'Valid' if re.fullmatch(r'\d{5}', '9876') else 'Invalid' - -# Other Predefined Character Classes - -# Custom Character Classes -'Valid' if re.fullmatch('[A-Z][a-z]*', 'Wally') else 'Invalid' - -'Valid' if re.fullmatch('[A-Z][a-z]*', 'eva') else 'Invalid' - -'Match' if re.fullmatch('[^a-z]', 'A') else 'No match' - -'Match' if re.fullmatch('[^a-z]', 'a') else 'No match' - -'Match' if re.fullmatch('[*+$]', '*') else 'No match' - -'Match' if re.fullmatch('[*+$]', '!') else 'No match' - -# * vs. + Quantifier -'Valid' if re.fullmatch('[A-Z][a-z]+', 'Wally') else 'Invalid' - -'Valid' if re.fullmatch('[A-Z][a-z]+', 'E') else 'Invalid' - -# Other Quantifiers -'Match' if re.fullmatch('labell?ed', 'labelled') else 'No match' - -'Match' if re.fullmatch('labell?ed', 'labeled') else 'No match' - -'Match' if re.fullmatch('labell?ed', 'labellled') else 'No match' - -'Match' if re.fullmatch(r'\d{3,}', '123') else 'No match' - -'Match' if re.fullmatch(r'\d{3,}', '1234567890') else 'No match' - -'Match' if re.fullmatch(r'\d{3,}', '12') else 'No match' - -'Match' if re.fullmatch(r'\d{3,6}', '123') else 'No match' - -'Match' if re.fullmatch(r'\d{3,6}', '123456') else 'No match' - -'Match' if re.fullmatch(r'\d{3,6}', '1234567') else 'No match' - -'Match' if re.fullmatch(r'\d{3,6}', '12') else 'No match' - - -########################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################## diff --git a/examples/ch08/snippets_py/08_12.01selfcheck.py b/examples/ch08/snippets_py/08_12.01selfcheck.py deleted file mode 100755 index 8cd91bf..0000000 --- a/examples/ch08/snippets_py/08_12.01selfcheck.py +++ /dev/null @@ -1,26 +0,0 @@ -# Section 8.12.1 Self Check snippets - -# Exercise 4 -import re - -street = r'\d+ [A-Z][a-z]* [A-Z][a-z]*' - -'Match' if re.fullmatch(street, '123 Main Street') else 'No match' - -'Match' if re.fullmatch(street, 'Main Street') else 'No match' - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_12.02.py b/examples/ch08/snippets_py/08_12.02.py deleted file mode 100755 index 8531c31..0000000 --- a/examples/ch08/snippets_py/08_12.02.py +++ /dev/null @@ -1,30 +0,0 @@ -# Section 8.12.2 snippets - -# Function sub—Replacing Patterns -import re - -re.sub(r'\t', ', ', '1\t2\t3\t4') - -re.sub(r'\t', ', ', '1\t2\t3\t4', count=2) - -# Function split -re.split(r',\s*', '1, 2, 3,4, 5,6,7,8') - -re.split(r',\s*', '1, 2, 3,4, 5,6,7,8', maxsplit=3) - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_12.02selfcheck.py b/examples/ch08/snippets_py/08_12.02selfcheck.py deleted file mode 100755 index 0b01738..0000000 --- a/examples/ch08/snippets_py/08_12.02selfcheck.py +++ /dev/null @@ -1,26 +0,0 @@ -# Section 8.12.2 Self Check snippets - -# Exercise 1 -import re - -re.sub(r'\t+', ', ', 'A\tB\t\tC\t\t\tD') - -# Exercise 2 -re.split('\$+', '123$Main$$Street') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_12.03.py b/examples/ch08/snippets_py/08_12.03.py deleted file mode 100755 index adc473a..0000000 --- a/examples/ch08/snippets_py/08_12.03.py +++ /dev/null @@ -1,73 +0,0 @@ -# Section 8.12.3 snippets - -### Function search—Finding the First Match Anywhere in a String -import re - -result = re.search('Python', 'Python is fun') - -result.group() if result else 'not found' - -result2 = re.search('fun!', 'Python is fun') - -result2.group() if result2 else 'not found' - -### Ignoring Case with the Optional flags Keyword Argument -result3 = re.search('Sam', 'SAM WHITE', flags=re.IGNORECASE) - -result3.group() if result3 else 'not found' - -### Metacharacters that Restrict Matches to the Beginning or End of a String -result = re.search('^Python', 'Python is fun') - -result.group() if result else 'not found' - -result = re.search('^fun', 'Python is fun') - -result.group() if result else 'not found' - -result = re.search('Python$', 'Python is fun') - -result.group() if result else 'not found' - -result = re.search('fun$', 'Python is fun') - -result.group() if result else 'not found' - -### Function findall and finditer—Finding All Matches in a String -contact = 'Wally White, Home: 555-555-1234, Work: 555-555-4321' - -re.findall(r'\d{3}-\d{3}-\d{4}', contact) - -for phone in re.finditer(r'\d{3}-\d{3}-\d{4}', contact): - print(phone.group()) - -### Capturing Substrings in a Match -text = 'Charlie Cyan, e-mail: demo1@deitel.com' - -pattern = r'([A-Z][a-z]+ [A-Z][a-z]+), e-mail: (\w+@\w+\.\w{3})' - -result = re.search(pattern, text) - -result.groups() - -result.group() - -result.group(1) - -result.group(2) - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_12.03selfcheck.py b/examples/ch08/snippets_py/08_12.03selfcheck.py deleted file mode 100755 index a72bbd6..0000000 --- a/examples/ch08/snippets_py/08_12.03selfcheck.py +++ /dev/null @@ -1,31 +0,0 @@ -# Section 8.12.3 Self Check snippets - -# Exercise 2 -import re - -result = re.search(r'(\d+) ([-+*/]) (\d+)', '10 + 5') - -result.groups() - -result.group(1) - -result.group(2) - -result.group(3) - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_13.py b/examples/ch08/snippets_py/08_13.py deleted file mode 100755 index 7fdca69..0000000 --- a/examples/ch08/snippets_py/08_13.py +++ /dev/null @@ -1,64 +0,0 @@ -# Section 8.13 snippets - -# Cleaning Your Data - -# Data Validation -import pandas as pd - -zips = pd.Series({'Boston': '02215', 'Miami': '3310'}) - -zips - -zips.str.match(r'\d{5}') - -cities = pd.Series(['Boston, MA 02215', 'Miami, FL 33101']) - -cities - -cities.str.contains(r' [A-Z]{2} ') - -cities.str.match(r' [A-Z]{2} ') - -# Reformatting Your Data - -contacts = [['Mike Green', 'demo1@deitel.com', '5555555555'], - ['Sue Brown', 'demo2@deitel.com', '5555551234']] - -contactsdf = pd.DataFrame(contacts, - columns=['Name', 'Email', 'Phone']) - -contactsdf - -import re - -def get_formatted_phone(value): - result = re.fullmatch(r'(\d{3})(\d{3})(\d{4})', value) - return '-'.join(result.groups()) if result else value - -formatted_phone = contactsdf['Phone'].map(get_formatted_phone) - -formatted_phone - -contactsdf['Phone'] = formatted_phone - -contactsdf - - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch08/snippets_py/08_13selfcheck.py b/examples/ch08/snippets_py/08_13selfcheck.py deleted file mode 100755 index 34958c9..0000000 --- a/examples/ch08/snippets_py/08_13selfcheck.py +++ /dev/null @@ -1,44 +0,0 @@ -# Section 8.13 Self Check snippets - -# Exercise 2 -import pandas as pd - -import re - -contacts = [['Mike Green', 'demo1@deitel.com', '5555555555'], - ['Sue Brown', 'demo2@deitel.com', '5555551234']] - -contactsdf = pd.DataFrame(contacts, - columns=['Name', 'Email', 'Phone']) - -def get_formatted_phone(value): - result = re.fullmatch(r'(\d{3})(\d{3})(\d{4})', value) - if result: - part1, part2, part3 = result.groups() - return '(' + part1 + ') ' + part2 + '-' + part3 - else: - return value - -contactsdf['Phone'] = contactsdf['Phone'].map(get_formatted_phone) - -contactsdf - - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch09/dividebyzero.py b/examples/ch09/dividebyzero.py deleted file mode 100755 index 14628d0..0000000 --- a/examples/ch09/dividebyzero.py +++ /dev/null @@ -1,32 +0,0 @@ -# dividebyzero.py -"""Simple exception handling example.""" - -while True: - # attempt to convert and divide values - try: - number1 = int(input('Enter numerator: ')) - number2 = int(input('Enter denominator: ')) - result = number1 / number2 - except ValueError: # tried to convert non-numeric value to int - print('You must enter two integers\n') - except ZeroDivisionError: # denominator was 0 - print('Attempted to divide by zero\n') - else: # executes only if no exceptions occur - print(f'{number1:.3f} / {number2:.3f} = {result:.3f}') - break # terminate the loop - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch09/snippets_ipynb/09_03.01.ipynb b/examples/ch09/snippets_ipynb/09_03.01.ipynb deleted file mode 100755 index d1e7667..0000000 --- a/examples/ch09/snippets_ipynb/09_03.01.ipynb +++ /dev/null @@ -1,100 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 9.3.1 Writing to a Text File; Introducing the `with` Statement " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "with open('accounts.txt', mode='w') as accounts:\n", - " accounts.write('100 Jones 24.98\\n')\n", - " accounts.write('200 Doe 345.67\\n')\n", - " accounts.write('300 White 0.00\\n')\n", - " accounts.write('400 Stone -42.16\\n')\n", - " accounts.write('500 Rich 224.62\\n')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# macOS/Linux Users: View file contents\n", - "!cat accounts.txt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Windows Users: View file contents\n", - "!more accounts.txt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " \n", - "\n", - "### The `with` Statement\n", - "### Built-In Function `open` \n", - "### Writing to the File \n", - "### Contents of `accounts.txt` File " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch09/snippets_ipynb/09_03.01selfcheck.ipynb b/examples/ch09/snippets_ipynb/09_03.01selfcheck.ipynb deleted file mode 100755 index 7136f97..0000000 --- a/examples/ch09/snippets_ipynb/09_03.01selfcheck.ipynb +++ /dev/null @@ -1,102 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 9.3.1 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Create a `grades.txt` file and write to it the following three records consisting of student IDs, last names and letter grades:\n", - "```\n", - "1 Red A\n", - "2 Green B\n", - "3 White A\n", - "```\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "with open('grades.txt', mode='w') as grades:\n", - " grades.write('1 Red A\\n')\n", - " grades.write('2 Green B\\n')\n", - " grades.write('3 White A\\n')\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# macOS/Linux Users: View file contents\n", - "!cat grades.txt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Windows Users: View file contents\n", - "!more grades.txt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch09/snippets_ipynb/09_03.02.ipynb b/examples/ch09/snippets_ipynb/09_03.02.ipynb deleted file mode 100755 index 53ea71b..0000000 --- a/examples/ch09/snippets_ipynb/09_03.02.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 9.3.2 Reading Data from a Text File" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "with open('accounts.txt', mode='r') as accounts:\n", - " print(f'{\"Account\":<10}{\"Name\":<10}{\"Balance\":>10}')\n", - " for record in accounts:\n", - " account, name, balance = record.split()\n", - " print(f'{account:<10}{name:<10}{balance:>10}')\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### File Method `readlines`" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Seeking to a Specific File Position" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch09/snippets_ipynb/09_03.02selfcheck.ipynb b/examples/ch09/snippets_ipynb/09_03.02selfcheck.ipynb deleted file mode 100755 index a0406ed..0000000 --- a/examples/ch09/snippets_ipynb/09_03.02selfcheck.ipynb +++ /dev/null @@ -1,78 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 9.3.2 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Read the file `grades.txt` that you created in the previous section’s Self Check and display it in columns with the column heads `'ID'`, `'Name'` and `'Grade'`.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "with open('grades.txt', 'r') as grades:\n", - " print(f'{\"ID\":<4}{\"Name\":<7}{\"Grade\"}')\n", - " for record in grades: \n", - " student_id, name, grade = record.split()\n", - " print(f'{student_id:<4}{name:<7}{grade}')\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch09/snippets_ipynb/09_04.ipynb b/examples/ch09/snippets_ipynb/09_04.ipynb deleted file mode 100755 index 3bfd767..0000000 --- a/examples/ch09/snippets_ipynb/09_04.ipynb +++ /dev/null @@ -1,150 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 9.4 Updating Text Files" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Updating `accounts.txt` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "accounts = open('accounts.txt', 'r')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "temp_file = open('temp_file.txt', 'w')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "with accounts, temp_file:\n", - " for record in accounts:\n", - " account, name, balance = record.split()\n", - " if account != '300':\n", - " temp_file.write(record)\n", - " else:\n", - " new_record = ' '.join([account, 'Williams', balance])\n", - " temp_file.write(new_record + '\\n')\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### `os` Module File Processing Functions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "os.remove('accounts.txt')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "os.rename('temp_file.txt', 'accounts.txt')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# macOS/Linux Users: View file contents\n", - "!cat accounts.txt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Windows Users: View file contents\n", - "!more accounts.txt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch09/snippets_ipynb/09_04selfcheck.ipynb b/examples/ch09/snippets_ipynb/09_04selfcheck.ipynb deleted file mode 100755 index 7253eed..0000000 --- a/examples/ch09/snippets_ipynb/09_04selfcheck.ipynb +++ /dev/null @@ -1,146 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 9.4 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** In the `accounts.txt` file, update the last name `'Doe'` to `'Smith'`.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "accounts = open('accounts.txt', 'r')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "temp_file = open('temp_file.txt', 'w')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "with accounts, temp_file:\n", - " for record in accounts:\n", - " account, name, balance = record.split()\n", - " if name != 'Doe':\n", - " temp_file.write(record)\n", - " else:\n", - " new_record = ' '.join([account, 'Smith', balance])\n", - " temp_file.write(new_record + '\\n')\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "os.remove('accounts.txt')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "os.rename('temp_file.txt', 'accounts.txt')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# macOS/Linux Users: View file contents\n", - "!cat accounts.txt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Windows Users: View file contents\n", - "!more accounts.txt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch09/snippets_ipynb/09_05.ipynb b/examples/ch09/snippets_ipynb/09_05.ipynb deleted file mode 100755 index d57cf32..0000000 --- a/examples/ch09/snippets_ipynb/09_05.ipynb +++ /dev/null @@ -1,176 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 9.5 Serialization with JSON " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### JSON Data Format" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Python Standard Library Module `json` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "accounts_dict = {'accounts': [\n", - " {'account': 100, 'name': 'Jones', 'balance': 24.98},\n", - " {'account': 200, 'name': 'Doe', 'balance': 345.67}]}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Serializing an Object to JSON" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import json" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "with open('accounts.json', 'w') as accounts:\n", - " json.dump(accounts_dict, accounts)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Deserializing the JSON Text" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "with open('accounts.json', 'r') as accounts:\n", - " accounts_json = json.load(accounts)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "accounts_json" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "accounts_json['accounts']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "accounts_json['accounts'][0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "accounts_json['accounts'][1]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Displaying the JSON Text" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "with open('accounts.json', 'r') as accounts:\n", - " print(json.dumps(json.load(accounts), indent=4))\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch09/snippets_ipynb/09_05selfcheck.ipynb b/examples/ch09/snippets_ipynb/09_05selfcheck.ipynb deleted file mode 100755 index 922b490..0000000 --- a/examples/ch09/snippets_ipynb/09_05selfcheck.ipynb +++ /dev/null @@ -1,115 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 9.5 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Create a JSON file named `grades.json` and write into it the following dictionary:\n", - "```python\n", - "grades_dict = {'gradebook': \n", - " [{'student_id': 1, 'name': 'Red', 'grade': 'A'},\n", - " {'student_id': 2, 'name': 'Green', 'grade': 'B'},\n", - " {'student_id': 3, 'name': 'White', 'grade': 'A'}]}\n", - "```\n", - "Then, read the file and display its pretty-printed JSON.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import json" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grades_dict = {'gradebook': \n", - " [{'student_id': 1, 'name': 'Red', 'grade': 'A'},\n", - " {'student_id': 2, 'name': 'Green', 'grade': 'B'},\n", - " {'student_id': 3, 'name': 'White', 'grade': 'A'}]}\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "with open('grades.json', 'w') as grades:\n", - " json.dump(grades_dict, grades)\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "with open('grades.json', 'r') as grades:\n", - " print(json.dumps(json.load(grades), indent=4))\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch09/snippets_ipynb/09_08.01.ipynb b/examples/ch09/snippets_ipynb/09_08.01.ipynb deleted file mode 100755 index 342b6da..0000000 --- a/examples/ch09/snippets_ipynb/09_08.01.ipynb +++ /dev/null @@ -1,86 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 9.8.1 Division by Zero and Invalid Input" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Division By Zero " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "10 / 0 " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Invalid Input" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "value = int(input('Enter an integer: '))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch09/snippets_ipynb/09_08.02.ipynb b/examples/ch09/snippets_ipynb/09_08.02.ipynb deleted file mode 100755 index b35ec13..0000000 --- a/examples/ch09/snippets_ipynb/09_08.02.ipynb +++ /dev/null @@ -1,90 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 9.8.2 `try` Statements" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# dividebyzero.py\n", - "\"\"\"Simple exception handling example.\"\"\"\n", - "\n", - "while True:\n", - " # attempt to convert and divide values\n", - " try:\n", - " number1 = int(input('Enter numerator: '))\n", - " number2 = int(input('Enter denominator: '))\n", - " result = number1 / number2\n", - " except ValueError: # tried to convert non-numeric value to int\n", - " print('You must enter two integers\\n')\n", - " except ZeroDivisionError: # denominator was 0\n", - " print('Attempted to divide by zero\\n')\n", - " else: # executes only if no exceptions occur\n", - " print(f'{number1:.3f} / {number2:.3f} = {result:.3f}')\n", - " break # terminate the loop" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### `try` Clause\n", - "### `except` Clause\n", - "### `else` Clause\n", - "### Flow of Control for a `ZeroDivisionError` \n", - "### Flow of Control for a `ValueError` \n", - "### Flow of Control for a Successful Division " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch09/snippets_ipynb/09_08.02selfcheck.ipynb b/examples/ch09/snippets_ipynb/09_08.02selfcheck.ipynb deleted file mode 100755 index 7a7fdb6..0000000 --- a/examples/ch09/snippets_ipynb/09_08.02selfcheck.ipynb +++ /dev/null @@ -1,105 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 9.8.2 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Before executing the IPython session, determine what the following function displays if you call it with the value `10.7` then the value `'Python'`?\n", - "```python\n", - "def try_it(value)\n", - " try:\n", - " x = int(value)\n", - " except ValueError:\n", - " print(f'{value} could not be converted to an integer')\n", - " else:\n", - " print(f'int({value}) is {x}')\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def try_it(value):\n", - " try:\n", - " x = int(value)\n", - " except ValueError:\n", - " print(f'{value} could not be converted to an integer')\n", - " else:\n", - " print(f'int({value}) is {x}')\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "try_it(10.7)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "try_it('Python')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch09/snippets_ipynb/09_09.ipynb b/examples/ch09/snippets_ipynb/09_09.ipynb deleted file mode 100755 index 4b6b10a..0000000 --- a/examples/ch09/snippets_ipynb/09_09.ipynb +++ /dev/null @@ -1,125 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 9.9 finally Clause\n", - "### The `finally` Clause of the `try` Statement\n", - "### Example" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "try:\n", - " print('try suite with no exceptions raised')\n", - "except:\n", - " print('this will not execute')\n", - "else:\n", - " print('else executes because no exceptions in the try suite')\n", - "finally: \n", - " print('finally always executes')\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "try:\n", - " print('try suite that raises an exception')\n", - " int('hello')\n", - " print('this will not execute')\n", - "except ValueError:\n", - " print('a ValueError occurred')\n", - "else:\n", - " print('else will not execute because an exception occurred')\n", - "finally: \n", - " print('finally always executes')\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Combining `with` Statements and `try`…`except` Statements " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "open('gradez.txt')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "try:\n", - " with open('gradez.txt', 'r') as accounts:\n", - " print(f'{\"ID\":<3}{\"Name\":<7}{\"Grade\"}')\n", - " for record in accounts: \n", - " student_id, name, grade = record.split()\n", - " print(f'{student_id:<3}{name:<7}{grade}')\n", - "except FileNotFoundError:\n", - " print('The file name you specified does not exist')\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch09/snippets_ipynb/09_09selfcheck.ipynb b/examples/ch09/snippets_ipynb/09_09selfcheck.ipynb deleted file mode 100755 index dd43d2c..0000000 --- a/examples/ch09/snippets_ipynb/09_09selfcheck.ipynb +++ /dev/null @@ -1,109 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 9.9 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Before executing the IPython session, determine what the following function displays if you call it with the value `10.7` then the value `'Python'`?\n", - "```python\n", - "def try_it(value)\n", - " try:\n", - " x = int(value)\n", - " except ValueError:\n", - " print(f'{value} could not be converted to an integer')\n", - " else:\n", - " print(f'int({value}) is {x}')\n", - " finally:\n", - " print('finally executed')\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def try_it(value):\n", - " try:\n", - " x = int(value)\n", - " except ValueError:\n", - " print(f'{value} could not be converted to an integer')\n", - " else:\n", - " print(f'int({value}) is {x}')\n", - " finally:\n", - " print('finally executed')\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "try_it(10.7)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "try_it('Python')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch09/snippets_ipynb/09_11.ipynb b/examples/ch09/snippets_ipynb/09_11.ipynb deleted file mode 100755 index 5354592..0000000 --- a/examples/ch09/snippets_ipynb/09_11.ipynb +++ /dev/null @@ -1,94 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 9.11 (Optional) Stack Unwinding and Tracebacks" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def function1():\n", - " function2()\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def function2():\n", - " raise Exception('An exception occurred')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "function1()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Traceback Details\n", - "### Stack Unwinding\n", - "### Tip for Reading Tracebacks\n", - "### Exceptions in finally Suites" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch09/snippets_ipynb/09_12.01.ipynb b/examples/ch09/snippets_ipynb/09_12.01.ipynb deleted file mode 100755 index 1b50994..0000000 --- a/examples/ch09/snippets_ipynb/09_12.01.ipynb +++ /dev/null @@ -1,110 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 9.12.1 Python Standard Library Module `csv` \n", - "### Writing to a CSV File" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import csv" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "with open('accounts.csv', mode='w', newline='') as accounts:\n", - " writer = csv.writer(accounts)\n", - " writer.writerow([100, 'Jones', 24.98])\n", - " writer.writerow([200, 'Doe', 345.67])\n", - " writer.writerow([300, 'White', 0.00])\n", - " writer.writerow([400, 'Stone', -42.16])\n", - " writer.writerow([500, 'Rich', 224.62])\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Reading from a CSV File" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "with open('accounts.csv', 'r', newline='') as accounts:\n", - " print(f'{\"Account\":<10}{\"Name\":<10}{\"Balance\":>10}')\n", - " reader = csv.reader(accounts)\n", - " for record in reader: \n", - " account, name, balance = record\n", - " print(f'{account:<10}{name:<10}{balance:>10}')\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Caution: Commas in CSV Data Fields\n", - "### Caution: Missing Commas and Extra Commas in CSV Files" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch09/snippets_ipynb/09_12.01selfcheck.ipynb b/examples/ch09/snippets_ipynb/09_12.01selfcheck.ipynb deleted file mode 100755 index 3c61cac..0000000 --- a/examples/ch09/snippets_ipynb/09_12.01selfcheck.ipynb +++ /dev/null @@ -1,108 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 9.12.1 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Create a text file named `grades.csv` and write to it the following three records consisting of student IDs, last names and letter grades:\n", - "```\n", - "1,Red,A\n", - "2,Green,B\n", - "3,White,A\n", - "```\n", - "Then, read the file `grades.csv` and display it in columns with the column heads `'ID'`, `'Name'` and `'Grade'`.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import csv" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "with open('grades.csv', mode='w', newline='') as grades:\n", - " writer = csv.writer(grades)\n", - " writer.writerow([1, 'Red', 'A'])\n", - " writer.writerow([2, 'Green', 'B'])\n", - " writer.writerow([3, 'White', 'A'])\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "with open('grades.csv', 'r', newline='') as grades:\n", - " print(f'{\"ID\":<4}{\"Name\":<7}{\"Grade\"}')\n", - " reader = csv.reader(grades)\n", - " for record in reader: \n", - " student_id, name, grade = record\n", - " print(f'{student_id:<4}{name:<7}{grade}')\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch09/snippets_ipynb/09_12.02.ipynb b/examples/ch09/snippets_ipynb/09_12.02.ipynb deleted file mode 100755 index 893e155..0000000 --- a/examples/ch09/snippets_ipynb/09_12.02.ipynb +++ /dev/null @@ -1,93 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 9.12.2 Reading CSV Files into Pandas `DataFrame`s \n", - "### Datasets\n", - "### Working with Locally Stored CSV Files " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.read_csv('accounts.csv', \n", - " names=['account', 'name', 'balance'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "df" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "df.to_csv('accounts_from_dataframe.csv', index=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch09/snippets_ipynb/09_12.03-05.ipynb b/examples/ch09/snippets_ipynb/09_12.03-05.ipynb deleted file mode 100755 index bd6c08e..0000000 --- a/examples/ch09/snippets_ipynb/09_12.03-05.ipynb +++ /dev/null @@ -1,213 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Note: This notebook contains the code for Sections 9.12.3-9.12.5, including the 9.12.5 Self Check**\n", - "\n", - "## 9.12.3 Reading the Titanic Disaster Dataset \n", - "### Loading the Titanic Dataset via a URL" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "titanic = pd.read_csv('https://vincentarelbundock.github.io/' +\n", - " 'Rdatasets/csv/carData/TitanicSurvival.csv')\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Viewing Some of the Rows in the Titanic Dataset" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.set_option('precision', 2) # format for floating-point values" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "titanic.head()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "titanic.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Customizing the Column Names" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "titanic.columns = ['name', 'survived', 'sex', 'age', 'class']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "titanic.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 9.12.4 Simple Data Analysis with the Titanic Disaster Dataset " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "titanic.describe()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "(titanic.survived == 'yes').describe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 9.12.5 Passenger Age Histogram\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "histogram = titanic.hist()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 9.12.5 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Load the `grades.csv` file you created in the preceding section’s Self Check into a `DataFrame` then display it.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.read_csv('grades.csv', names=['ID', 'Name', 'Grade'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch09/snippets_ipynb/files/art/check.png b/examples/ch09/snippets_ipynb/files/art/check.png deleted file mode 100755 index eea18cd..0000000 Binary files a/examples/ch09/snippets_ipynb/files/art/check.png and /dev/null differ diff --git a/examples/ch09/snippets_ipynb/grades.csv b/examples/ch09/snippets_ipynb/grades.csv deleted file mode 100644 index 1e5899f..0000000 --- a/examples/ch09/snippets_ipynb/grades.csv +++ /dev/null @@ -1,3 +0,0 @@ -1,Red,A -2,Green,B -3,White,A diff --git a/examples/ch09/snippets_ipynb/grades.txt b/examples/ch09/snippets_ipynb/grades.txt deleted file mode 100644 index 63a6cd0..0000000 --- a/examples/ch09/snippets_ipynb/grades.txt +++ /dev/null @@ -1,3 +0,0 @@ -1 Red A -2 Green B -3 White A diff --git a/examples/ch09/snippets_py/09_03.01.py b/examples/ch09/snippets_py/09_03.01.py deleted file mode 100755 index bf76fe8..0000000 --- a/examples/ch09/snippets_py/09_03.01.py +++ /dev/null @@ -1,25 +0,0 @@ -# Section 9.3.1 Snippets - -with open('accounts.txt', mode='w') as accounts: - accounts.write('100 Jones 24.98\n') - accounts.write('200 Doe 345.67\n') - accounts.write('300 White 0.00\n') - accounts.write('400 Stone -42.16\n') - accounts.write('500 Rich 224.62\n') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch09/snippets_py/09_03.01selfcheck.py b/examples/ch09/snippets_py/09_03.01selfcheck.py deleted file mode 100755 index 5569f5b..0000000 --- a/examples/ch09/snippets_py/09_03.01selfcheck.py +++ /dev/null @@ -1,24 +0,0 @@ -# Section 9.3.1 Self Check snippets - -# Exercise 3 -with open('grades.txt', mode='w') as grades: - grades.write('1 Red A\n') - grades.write('2 Green B\n') - grades.write('3 White A\n') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch09/snippets_py/09_03.02.py b/examples/ch09/snippets_py/09_03.02.py deleted file mode 100755 index c8fe656..0000000 --- a/examples/ch09/snippets_py/09_03.02.py +++ /dev/null @@ -1,25 +0,0 @@ -# Section 9.3.2 snippets - -with open('accounts.txt', mode='r') as accounts: - print(f'{"Account":<10}{"Name":<10}{"Balance":>10}') - for record in accounts: - account, name, balance = record.split() - print(f'{account:<10}{name:<10}{balance:>10}') - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch09/snippets_py/09_03.02selfcheck.py b/examples/ch09/snippets_py/09_03.02selfcheck.py deleted file mode 100755 index a9ddde8..0000000 --- a/examples/ch09/snippets_py/09_03.02selfcheck.py +++ /dev/null @@ -1,25 +0,0 @@ -# Section 9.3.2 Self Check snippets - -# Exercise 3 -with open('grades.txt', 'r') as grades: - print(f'{"ID":<4}{"Name":<7}{"Grade"}') - for record in grades: - student_id, name, grade = record.split() - print(f'{student_id:<4}{name:<7}{grade}') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch09/snippets_py/09_04.py b/examples/ch09/snippets_py/09_04.py deleted file mode 100755 index 3942985..0000000 --- a/examples/ch09/snippets_py/09_04.py +++ /dev/null @@ -1,41 +0,0 @@ -# Section 9.4 snippets - -# Updating accounts.txt -accounts = open('accounts.txt', 'r') - -temp_file = open('temp_file.txt', 'w') - -with accounts, temp_file: - for record in accounts: - account, name, balance = record.split() - if account != '300': - temp_file.write(record) - else: - new_record = ' '.join([account, 'Williams', balance]) - temp_file.write(new_record + '\n') - - -# os Module File Processing Functions -import os - -os.remove('accounts.txt') - -os.rename('temp_file.txt', 'accounts.txt') - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch09/snippets_py/09_04selfcheck.py b/examples/ch09/snippets_py/09_04selfcheck.py deleted file mode 100755 index aea89a7..0000000 --- a/examples/ch09/snippets_py/09_04selfcheck.py +++ /dev/null @@ -1,40 +0,0 @@ -# Section 9.4 Self Check snippets - -# Exercise 3 -accounts = open('accounts.txt', 'r') - -temp_file = open('temp_file.txt', 'w') - -with accounts, temp_file: - for record in accounts: - account, name, balance = record.split() - if account != '200': - temp_file.write(record) - else: - new_record = ' '.join([account, 'Smith', balance]) - temp_file.write(new_record + '\n') - -import os - -os.remove('accounts.txt') - -os.rename('temp_file.txt', 'accounts.txt') - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch09/snippets_py/09_05.py b/examples/ch09/snippets_py/09_05.py deleted file mode 100755 index 0b406f6..0000000 --- a/examples/ch09/snippets_py/09_05.py +++ /dev/null @@ -1,50 +0,0 @@ -# Section 9.5 snippets - -# JSON Data Format - -# Python Standard Library Module `json` -accounts_dict = {'accounts': [ - {'account': 100, 'name': 'Jones', 'balance': 24.98}, - {'account': 200, 'name': 'Doe', 'balance': 345.67}]} - -# Serializing an Object to JSON -import json - -with open('accounts.json', 'w') as accounts: - json.dump(accounts_dict, accounts) - -# Deserializing the JSON Text -with open('accounts.json', 'r') as accounts: - accounts_json = json.load(accounts) - -accounts_json - -accounts_json['accounts'] - -accounts_json['accounts'][0] - -accounts_json['accounts'][1] - -# Displaying the JSON Text -with open('accounts.json', 'r') as accounts: - print(json.dumps(json.load(accounts), indent=4)) - - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch09/snippets_py/09_05selfcheck.py b/examples/ch09/snippets_py/09_05selfcheck.py deleted file mode 100755 index 47690b2..0000000 --- a/examples/ch09/snippets_py/09_05selfcheck.py +++ /dev/null @@ -1,33 +0,0 @@ -# Section 9.5 Self Check snippets - -# Exercise 3 -import json - -grades_dict = {'gradebook': - [{'student_id': 1, 'name': 'Red', 'grade': 'A'}, - {'student_id': 2, 'name': 'Green', 'grade': 'B'}, - {'student_id': 3, 'name': 'White', 'grade': 'A'}]} - -with open('grades.json', 'w') as grades: - json.dump(grades_dict, grades) - -with open('grades.json', 'r') as grades: - print(json.dumps(json.load(grades), indent=4)) - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch09/snippets_py/09_08.02selfcheck.py b/examples/ch09/snippets_py/09_08.02selfcheck.py deleted file mode 100755 index b8d4af3..0000000 --- a/examples/ch09/snippets_py/09_08.02selfcheck.py +++ /dev/null @@ -1,34 +0,0 @@ -# Section 9.8.2 Self Check snippets - -# Exercise 3 -def try_it(value): - try: - x = int(value) - except ValueError: - print(f'{value} could not be converted to an integer') - else: - print(f'int({value}) is {X}') - - -try_it(10.7) - -try_it('Python') - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch09/snippets_py/09_09.py b/examples/ch09/snippets_py/09_09.py deleted file mode 100755 index 851826c..0000000 --- a/examples/ch09/snippets_py/09_09.py +++ /dev/null @@ -1,54 +0,0 @@ -# Section 9.9 snippets - -# The finally Clause of the try Statement - -# Example -try: - print('try suite with no exceptions raised') -except: - print('this will not execute') -else: - print('else executes because no exceptions in the try suite') -finally: - print('finally always executes') - -try: - print('try suite that raises an exception') - int('hello') - print('this will not execute') -except ValueError: - print('a ValueError occurred') -else: - print('else will not execute because an exception occurred') -finally: - print('finally always executes') - -# Combining with Statements and try…except Statements -open('gradez.txt') - -try: - with open('gradez.txt', 'r') as accounts: - print(f'{"ID":<3}{"Name":<7}{"Grade"}') - for record in accounts: - student_id, name, grade = record.split() - print(f'{student_id:<3}{name:<7}{grade}') -except FileNotFoundError: - print('The file name you specified does not exist') - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch09/snippets_py/09_09selfcheck.py b/examples/ch09/snippets_py/09_09selfcheck.py deleted file mode 100755 index e4ebac3..0000000 --- a/examples/ch09/snippets_py/09_09selfcheck.py +++ /dev/null @@ -1,33 +0,0 @@ -# Section 9.9 Self Checksnippets - -# Exercise 3 -def try_it(value): - try: - x = int(value) - except ValueError: - print(f'{value} could not be converted to an integer') - else: - print(f'int({value}) is {x}') - finally: - print('finally executed') - -try_it(10.7) - -try_it('Python') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch09/snippets_py/09_11.py b/examples/ch09/snippets_py/09_11.py deleted file mode 100755 index e85a704..0000000 --- a/examples/ch09/snippets_py/09_11.py +++ /dev/null @@ -1,24 +0,0 @@ -# Section 9.11 snippets -def function1(): - function2() - -def function2(): - raise Exception('An exception occurred') - -function1() - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch09/snippets_py/09_12.01.py b/examples/ch09/snippets_py/09_12.01.py deleted file mode 100755 index ecab414..0000000 --- a/examples/ch09/snippets_py/09_12.01.py +++ /dev/null @@ -1,40 +0,0 @@ -# Section 9.12.1 snippets - -# Writing to a CSV File -import csv - -with open('accounts.csv', mode='w', newline='') as accounts: - writer = csv.writer(accounts) - writer.writerow([100, 'Jones', 24.98]) - writer.writerow([200, 'Doe', 345.67]) - writer.writerow([300, 'White', 0.00]) - writer.writerow([400, 'Stone', -42.16]) - writer.writerow([500, 'Rich', 224.62]) - -# Reading from a CSV File -with open('accounts.csv', 'r', newline='') as accounts: - print(f'{"Account":<10}{"Name":<10}{"Balance":>10}') - reader = csv.reader(accounts) - for record in reader: - account, name, balance = record - print(f'{account:<10}{name:<10}{balance:>10}') - -# Caution: Commas in CSV Data Fields - -# Caution: Missing Commas and Extra Commas in CSV Files - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch09/snippets_py/09_12.01selfcheck.py b/examples/ch09/snippets_py/09_12.01selfcheck.py deleted file mode 100755 index 54dd7b2..0000000 --- a/examples/ch09/snippets_py/09_12.01selfcheck.py +++ /dev/null @@ -1,34 +0,0 @@ -# Section 9.12.1 Self Check snippets - -# Exercise 3 -import csv - -with open('grades.csv', mode='w', newline='') as grades: - writer = csv.writer(grades) - writer.writerow([1, 'Red', 'A']) - writer.writerow([2, 'Green', 'B']) - writer.writerow([3, 'White', 'A']) - -with open('grades.csv', 'r', newline='') as grades: - print(f'{"ID":<4}{"Name":<7}{"Grade"}') - reader = csv.reader(grades) - for record in reader: - student_id, name, grade = record - print(f'{student_id:<4}{name:<7}{grade}') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch09/snippets_py/09_12.02.py b/examples/ch09/snippets_py/09_12.02.py deleted file mode 100755 index 2ab797e..0000000 --- a/examples/ch09/snippets_py/09_12.02.py +++ /dev/null @@ -1,29 +0,0 @@ -# Section 9.12.2 snippets - -# Datasets - -# Working with Locally Stored CSV Files -import pandas as pd - -df = pd.read_csv('accounts.csv', - names=['account', 'name', 'balance']) - -df - -df.to_csv('accounts_from_dataframe.csv', index=False) - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch09/snippets_py/09_12.03-05.py b/examples/ch09/snippets_py/09_12.03-05.py deleted file mode 100755 index a7640a3..0000000 --- a/examples/ch09/snippets_py/09_12.03-05.py +++ /dev/null @@ -1,55 +0,0 @@ -# NOTE: This file contains all the snippets for Sections 9.12.3-9.12.5, -# including the 9.12.5 Self Check - -# Section 9.12.3 snippets - -# Loading the Titanic Dataset via a URL -import pandas as pd - -titanic = pd.read_csv('https://vincentarelbundock.github.io/' + - 'Rdatasets/csv/carData/TitanicSurvival.csv') - -# Viewing Some of the Rows in the Titanic Dataset -pd.set_option('precision', 2) # format for floating-point values - -titanic.head() - -titanic.tail() - -# Customizing the Column Names -titanic.columns = ['name', 'survived', 'sex', 'age', 'class'] - -titanic.head() - -# Section 9.12.4 snippets -titanic.describe() - -(titanic.survived == 'yes').describe() - -# Section 9.12.5 snippets -%matplotlib - -histogram = titanic.hist() - -# Section 9.12.5 Self Check snippets - -# Exercise 2 -pd.read_csv('grades.csv', names=['ID', 'Name', 'Grade']) - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/account.py b/examples/ch10/account.py deleted file mode 100755 index aef0f5c..0000000 --- a/examples/ch10/account.py +++ /dev/null @@ -1,42 +0,0 @@ -# account.py -"""Account class definition.""" -from decimal import Decimal - -class Account: - """Account class for maintaining a bank account balance.""" - - def __init__(self, name, balance): - """Initialize an Account object.""" - - # if balance is less than 0.00, raise an exception - if balance < Decimal('0.00'): - raise ValueError('Initial balance must be >= to 0.00.') - - self.name = name - self.balance = balance - - def deposit(self, amount): - """Deposit money to the account.""" - - # if amount is less than 0.00, raise an exception - if amount < Decimal('0.00'): - raise ValueError('amount must be positive.') - - self.balance += amount - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/accountdoctest.py b/examples/ch10/accountdoctest.py deleted file mode 100755 index 8a40428..0000000 --- a/examples/ch10/accountdoctest.py +++ /dev/null @@ -1,57 +0,0 @@ -# accountdoctest.py -"""Account class definition.""" -from decimal import Decimal - -class Account: - """Account class for demonstrating doctest.""" - - def __init__(self, name, balance): - """Initialize an Account object. - - >>> account1 = Account('John Green', Decimal('50.00')) - >>> account1.name - 'John Green' - >>> account1.balance - Decimal('50.00') - - The balance argument must be greater than or equal to 0. - >>> account2 = Account('John Green', Decimal('-50.00')) - Traceback (most recent call last): - ... - ValueError: Initial balance must be >= to 0.00. - """ - - # if balance is less than 0.00, raise an exception - if balance < Decimal('0.00'): - raise ValueError('Initial balance must be >= to 0.00.') - - self.name = name - self.balance = balance - - def deposit(self, amount): - """Deposit money to the account.""" - - # if amount is less than 0.00, raise an exception - if amount < Decimal('0.00'): - raise ValueError('amount must be positive.') - - self.balance += amount - -if __name__ == '__main__': - import doctest - doctest.testmod(verbose=True) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/ave_hi_austin_jan_1895-2018.csv b/examples/ch10/ave_hi_austin_jan_1895-2018.csv deleted file mode 100755 index 485d137..0000000 --- a/examples/ch10/ave_hi_austin_jan_1895-2018.csv +++ /dev/null @@ -1,125 +0,0 @@ -Date,Value,Anomaly -189501,34.2,-3.2 -189601,34.7,-2.7 -189701,35.5,-1.9 -189801,39.6,2.2 -189901,36.4,-1.0 -190001,37.4,0.0 -190101,37.0,-0.4 -190201,35.0,-2.4 -190301,35.5,-1.9 -190401,29.8,-7.6 -190501,33.7,-3.7 -190601,42.3,4.9 -190701,40.5,3.1 -190801,38.3,0.9 -190901,39.6,2.2 -191001,36.1,-1.3 -191101,40.7,3.3 -191201,29.3,-8.1 -191301,46.9,9.5 -191401,36.9,-0.5 -191501,38.9,1.5 -191601,42.3,4.9 -191701,38.4,1.0 -191801,26.5,-10.9 -191901,40.6,3.2 -192001,29.7,-7.7 -192101,39.7,2.3 -192201,33.4,-4.0 -192301,35.2,-2.2 -192401,39.4,2.0 -192501,33.8,-3.6 -192601,37.2,-0.2 -192701,36.8,-0.6 -192801,40.0,2.6 -192901,37.8,0.4 -193001,38.5,1.1 -193101,38.2,0.8 -193201,47.6,10.2 -193301,45.6,8.2 -193401,39.8,2.4 -193501,35.0,-2.4 -193601,34.3,-3.1 -193701,45.7,8.3 -193801,37.3,-0.1 -193901,36.8,-0.6 -194001,30.0,-7.4 -194101,34.5,-2.9 -194201,36.5,-0.9 -194301,36.1,-1.3 -194401,39.0,1.6 -194501,31.5,-5.9 -194601,40.2,2.8 -194701,43.0,5.6 -194801,30.1,-7.3 -194901,43.5,6.1 -195001,47.6,10.2 -195101,42.5,5.1 -195201,42.4,5.0 -195301,42.4,5.0 -195401,37.0,-0.4 -195501,35.6,-1.8 -195601,36.2,-1.2 -195701,33.8,-3.6 -195801,36.4,-1.0 -195901,37.1,-0.3 -196001,37.8,0.4 -196101,31.9,-5.5 -196201,38.0,0.6 -196301,34.6,-2.8 -196401,40.2,2.8 -196501,34.0,-3.4 -196601,37.1,-0.3 -196701,41.6,4.2 -196801,31.7,-5.7 -196901,35.7,-1.7 -197001,29.9,-7.5 -197101,31.5,-5.9 -197201,40.5,3.1 -197301,40.6,3.2 -197401,39.7,2.3 -197501,41.7,4.3 -197601,32.6,-4.8 -197701,26.1,-11.3 -197801,32.3,-5.1 -197901,38.6,1.2 -198001,38.0,0.6 -198101,30.6,-6.8 -198201,30.9,-6.5 -198301,38.0,0.6 -198401,33.5,-3.9 -198501,33.0,-4.4 -198601,39.3,1.9 -198701,35.9,-1.5 -198801,34.2,-3.2 -198901,42.4,5.0 -199001,46.0,8.6 -199101,39.6,2.2 -199201,40.9,3.5 -199301,41.0,3.6 -199401,31.6,-5.8 -199501,42.6,5.2 -199601,37.0,-0.4 -199701,39.2,1.8 -199801,45.8,8.4 -199901,40.8,3.4 -200001,37.8,0.4 -200101,38.8,1.4 -200201,45.4,8.0 -200301,32.9,-4.5 -200401,31.0,-6.4 -200501,37.4,0.0 -200601,47.6,10.2 -200701,43.6,6.2 -200801,42.4,5.0 -200901,33.4,-4.0 -201001,38.1,0.7 -201101,34.8,-2.6 -201201,44.2,6.8 -201301,40.8,3.4 -201401,35.5,-1.9 -201501,36.1,-1.3 -201601,40.8,3.4 -201701,42.8,5.4 -201801,38.7,1.3 \ No newline at end of file diff --git a/examples/ch10/ave_hi_la_jan_1895-2018.csv b/examples/ch10/ave_hi_la_jan_1895-2018.csv deleted file mode 100755 index 485d137..0000000 --- a/examples/ch10/ave_hi_la_jan_1895-2018.csv +++ /dev/null @@ -1,125 +0,0 @@ -Date,Value,Anomaly -189501,34.2,-3.2 -189601,34.7,-2.7 -189701,35.5,-1.9 -189801,39.6,2.2 -189901,36.4,-1.0 -190001,37.4,0.0 -190101,37.0,-0.4 -190201,35.0,-2.4 -190301,35.5,-1.9 -190401,29.8,-7.6 -190501,33.7,-3.7 -190601,42.3,4.9 -190701,40.5,3.1 -190801,38.3,0.9 -190901,39.6,2.2 -191001,36.1,-1.3 -191101,40.7,3.3 -191201,29.3,-8.1 -191301,46.9,9.5 -191401,36.9,-0.5 -191501,38.9,1.5 -191601,42.3,4.9 -191701,38.4,1.0 -191801,26.5,-10.9 -191901,40.6,3.2 -192001,29.7,-7.7 -192101,39.7,2.3 -192201,33.4,-4.0 -192301,35.2,-2.2 -192401,39.4,2.0 -192501,33.8,-3.6 -192601,37.2,-0.2 -192701,36.8,-0.6 -192801,40.0,2.6 -192901,37.8,0.4 -193001,38.5,1.1 -193101,38.2,0.8 -193201,47.6,10.2 -193301,45.6,8.2 -193401,39.8,2.4 -193501,35.0,-2.4 -193601,34.3,-3.1 -193701,45.7,8.3 -193801,37.3,-0.1 -193901,36.8,-0.6 -194001,30.0,-7.4 -194101,34.5,-2.9 -194201,36.5,-0.9 -194301,36.1,-1.3 -194401,39.0,1.6 -194501,31.5,-5.9 -194601,40.2,2.8 -194701,43.0,5.6 -194801,30.1,-7.3 -194901,43.5,6.1 -195001,47.6,10.2 -195101,42.5,5.1 -195201,42.4,5.0 -195301,42.4,5.0 -195401,37.0,-0.4 -195501,35.6,-1.8 -195601,36.2,-1.2 -195701,33.8,-3.6 -195801,36.4,-1.0 -195901,37.1,-0.3 -196001,37.8,0.4 -196101,31.9,-5.5 -196201,38.0,0.6 -196301,34.6,-2.8 -196401,40.2,2.8 -196501,34.0,-3.4 -196601,37.1,-0.3 -196701,41.6,4.2 -196801,31.7,-5.7 -196901,35.7,-1.7 -197001,29.9,-7.5 -197101,31.5,-5.9 -197201,40.5,3.1 -197301,40.6,3.2 -197401,39.7,2.3 -197501,41.7,4.3 -197601,32.6,-4.8 -197701,26.1,-11.3 -197801,32.3,-5.1 -197901,38.6,1.2 -198001,38.0,0.6 -198101,30.6,-6.8 -198201,30.9,-6.5 -198301,38.0,0.6 -198401,33.5,-3.9 -198501,33.0,-4.4 -198601,39.3,1.9 -198701,35.9,-1.5 -198801,34.2,-3.2 -198901,42.4,5.0 -199001,46.0,8.6 -199101,39.6,2.2 -199201,40.9,3.5 -199301,41.0,3.6 -199401,31.6,-5.8 -199501,42.6,5.2 -199601,37.0,-0.4 -199701,39.2,1.8 -199801,45.8,8.4 -199901,40.8,3.4 -200001,37.8,0.4 -200101,38.8,1.4 -200201,45.4,8.0 -200301,32.9,-4.5 -200401,31.0,-6.4 -200501,37.4,0.0 -200601,47.6,10.2 -200701,43.6,6.2 -200801,42.4,5.0 -200901,33.4,-4.0 -201001,38.1,0.7 -201101,34.8,-2.6 -201201,44.2,6.8 -201301,40.8,3.4 -201401,35.5,-1.9 -201501,36.1,-1.3 -201601,40.8,3.4 -201701,42.8,5.4 -201801,38.7,1.3 \ No newline at end of file diff --git a/examples/ch10/ave_hi_nyc2_jan_1895-2018.csv b/examples/ch10/ave_hi_nyc2_jan_1895-2018.csv deleted file mode 100755 index 77cc27c..0000000 --- a/examples/ch10/ave_hi_nyc2_jan_1895-2018.csv +++ /dev/null @@ -1,125 +0,0 @@ -Date,Value,Anomaly -1895,34.2,-3.2 -1896,34.7,-2.7 -1897,35.5,-1.9 -1898,39.6,2.2 -1899,36.4,-1.0 -1900,37.4,0.0 -1901,37.0,-0.4 -1902,35.0,-2.4 -1903,35.5,-1.9 -1904,29.8,-7.6 -1905,33.7,-3.7 -1906,42.3,4.9 -1907,40.5,3.1 -1908,38.3,0.9 -1909,39.6,2.2 -1910,36.1,-1.3 -1911,40.7,3.3 -1912,29.3,-8.1 -1913,46.9,9.5 -1914,36.9,-0.5 -1915,38.9,1.5 -1916,42.3,4.9 -1917,38.4,1.0 -1918,26.5,-10.9 -1919,40.6,3.2 -1920,29.7,-7.7 -1921,39.7,2.3 -1922,33.4,-4.0 -1923,35.2,-2.2 -1924,39.4,2.0 -1925,33.8,-3.6 -1926,37.2,-0.2 -1927,36.8,-0.6 -1928,40.0,2.6 -1929,37.8,0.4 -1930,38.5,1.1 -1931,38.2,0.8 -1932,47.6,10.2 -1933,45.6,8.2 -1934,39.8,2.4 -1935,35.0,-2.4 -1936,34.3,-3.1 -1937,45.7,8.3 -1938,37.3,-0.1 -1939,36.8,-0.6 -1940,30.0,-7.4 -1941,34.5,-2.9 -1942,36.5,-0.9 -1943,36.1,-1.3 -1944,39.0,1.6 -1945,31.5,-5.9 -1946,40.2,2.8 -1947,43.0,5.6 -1948,30.1,-7.3 -1949,43.5,6.1 -1950,47.6,10.2 -1951,42.5,5.1 -1952,42.4,5.0 -1953,42.4,5.0 -1954,37.0,-0.4 -1955,35.6,-1.8 -1956,36.2,-1.2 -1957,33.8,-3.6 -1958,36.4,-1.0 -1959,37.1,-0.3 -1960,37.8,0.4 -1961,31.9,-5.5 -1962,38.0,0.6 -1963,34.6,-2.8 -1964,40.2,2.8 -1965,34.0,-3.4 -1966,37.1,-0.3 -1967,41.6,4.2 -1968,31.7,-5.7 -1969,35.7,-1.7 -1970,29.9,-7.5 -1971,31.5,-5.9 -1972,40.5,3.1 -1973,40.6,3.2 -1974,39.7,2.3 -1975,41.7,4.3 -1976,32.6,-4.8 -1977,26.1,-11.3 -1978,32.3,-5.1 -1979,38.6,1.2 -1980,38.0,0.6 -1981,30.6,-6.8 -1982,30.9,-6.5 -1983,38.0,0.6 -1984,33.5,-3.9 -1985,33.0,-4.4 -1986,39.3,1.9 -1987,35.9,-1.5 -1988,34.2,-3.2 -1989,42.4,5.0 -1990,46.0,8.6 -1991,39.6,2.2 -1992,40.9,3.5 -1993,41.0,3.6 -1994,31.6,-5.8 -1995,42.6,5.2 -1996,37.0,-0.4 -1997,39.2,1.8 -1998,45.8,8.4 -1999,40.8,3.4 -2000,37.8,0.4 -2001,38.8,1.4 -2002,45.4,8.0 -2003,32.9,-4.5 -2004,31.0,-6.4 -2005,37.4,0.0 -2006,47.6,10.2 -2007,43.6,6.2 -2008,42.4,5.0 -2009,33.4,-4.0 -2010,38.1,0.7 -2011,34.8,-2.6 -2012,44.2,6.8 -2013,40.8,3.4 -2014,35.5,-1.9 -2015,36.1,-1.3 -2016,40.8,3.4 -2017,42.8,5.4 -2018,38.7,1.3 \ No newline at end of file diff --git a/examples/ch10/ave_hi_nyc_jan_1895-2018.csv b/examples/ch10/ave_hi_nyc_jan_1895-2018.csv deleted file mode 100755 index 485d137..0000000 --- a/examples/ch10/ave_hi_nyc_jan_1895-2018.csv +++ /dev/null @@ -1,125 +0,0 @@ -Date,Value,Anomaly -189501,34.2,-3.2 -189601,34.7,-2.7 -189701,35.5,-1.9 -189801,39.6,2.2 -189901,36.4,-1.0 -190001,37.4,0.0 -190101,37.0,-0.4 -190201,35.0,-2.4 -190301,35.5,-1.9 -190401,29.8,-7.6 -190501,33.7,-3.7 -190601,42.3,4.9 -190701,40.5,3.1 -190801,38.3,0.9 -190901,39.6,2.2 -191001,36.1,-1.3 -191101,40.7,3.3 -191201,29.3,-8.1 -191301,46.9,9.5 -191401,36.9,-0.5 -191501,38.9,1.5 -191601,42.3,4.9 -191701,38.4,1.0 -191801,26.5,-10.9 -191901,40.6,3.2 -192001,29.7,-7.7 -192101,39.7,2.3 -192201,33.4,-4.0 -192301,35.2,-2.2 -192401,39.4,2.0 -192501,33.8,-3.6 -192601,37.2,-0.2 -192701,36.8,-0.6 -192801,40.0,2.6 -192901,37.8,0.4 -193001,38.5,1.1 -193101,38.2,0.8 -193201,47.6,10.2 -193301,45.6,8.2 -193401,39.8,2.4 -193501,35.0,-2.4 -193601,34.3,-3.1 -193701,45.7,8.3 -193801,37.3,-0.1 -193901,36.8,-0.6 -194001,30.0,-7.4 -194101,34.5,-2.9 -194201,36.5,-0.9 -194301,36.1,-1.3 -194401,39.0,1.6 -194501,31.5,-5.9 -194601,40.2,2.8 -194701,43.0,5.6 -194801,30.1,-7.3 -194901,43.5,6.1 -195001,47.6,10.2 -195101,42.5,5.1 -195201,42.4,5.0 -195301,42.4,5.0 -195401,37.0,-0.4 -195501,35.6,-1.8 -195601,36.2,-1.2 -195701,33.8,-3.6 -195801,36.4,-1.0 -195901,37.1,-0.3 -196001,37.8,0.4 -196101,31.9,-5.5 -196201,38.0,0.6 -196301,34.6,-2.8 -196401,40.2,2.8 -196501,34.0,-3.4 -196601,37.1,-0.3 -196701,41.6,4.2 -196801,31.7,-5.7 -196901,35.7,-1.7 -197001,29.9,-7.5 -197101,31.5,-5.9 -197201,40.5,3.1 -197301,40.6,3.2 -197401,39.7,2.3 -197501,41.7,4.3 -197601,32.6,-4.8 -197701,26.1,-11.3 -197801,32.3,-5.1 -197901,38.6,1.2 -198001,38.0,0.6 -198101,30.6,-6.8 -198201,30.9,-6.5 -198301,38.0,0.6 -198401,33.5,-3.9 -198501,33.0,-4.4 -198601,39.3,1.9 -198701,35.9,-1.5 -198801,34.2,-3.2 -198901,42.4,5.0 -199001,46.0,8.6 -199101,39.6,2.2 -199201,40.9,3.5 -199301,41.0,3.6 -199401,31.6,-5.8 -199501,42.6,5.2 -199601,37.0,-0.4 -199701,39.2,1.8 -199801,45.8,8.4 -199901,40.8,3.4 -200001,37.8,0.4 -200101,38.8,1.4 -200201,45.4,8.0 -200301,32.9,-4.5 -200401,31.0,-6.4 -200501,37.4,0.0 -200601,47.6,10.2 -200701,43.6,6.2 -200801,42.4,5.0 -200901,33.4,-4.0 -201001,38.1,0.7 -201101,34.8,-2.6 -201201,44.2,6.8 -201301,40.8,3.4 -201401,35.5,-1.9 -201501,36.1,-1.3 -201601,40.8,3.4 -201701,42.8,5.4 -201801,38.7,1.3 \ No newline at end of file diff --git a/examples/ch10/card.py b/examples/ch10/card.py deleted file mode 100755 index a4fcb9b..0000000 --- a/examples/ch10/card.py +++ /dev/null @@ -1,56 +0,0 @@ -# card.py -"""Card class that represents a playing card and its image file name.""" - -class Card: - FACES = ['Ace', '2', '3', '4', '5', '6', - '7', '8', '9', '10', 'Jack', 'Queen', 'King'] - SUITS = ['Hearts', 'Diamonds', 'Clubs', 'Spades'] - - def __init__(self, face, suit): - """Initialize a Card with a face and suit.""" - self._face = face - self._suit = suit - - @property - def face(self): - """Return the Card's self._face value.""" - return self._face - - @property - def suit(self): - """Return the Card's self._suit value.""" - return self._suit - - @property - def image_name(self): - """Return the Card's image file name.""" - return str(self).replace(' ', '_') + '.png' - - def __repr__(self): - """Return string representation for repr().""" - return f"Card(face='{self.face}', suit='{self.suit}')" - - def __str__(self): - """Return string representation for str().""" - return f'{self.face} of {self.suit}' - - def __format__(self, format): - """Return formatted string representation.""" - return f'{str(self):{format}}' - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/card_images/10_of_clubs.png b/examples/ch10/card_images/10_of_clubs.png deleted file mode 100644 index 119466a..0000000 Binary files a/examples/ch10/card_images/10_of_clubs.png and /dev/null differ diff --git a/examples/ch10/card_images/10_of_clubs.svg b/examples/ch10/card_images/10_of_clubs.svg deleted file mode 100644 index f66f403..0000000 --- a/examples/ch10/card_images/10_of_clubs.svg +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/10_of_diamonds.png b/examples/ch10/card_images/10_of_diamonds.png deleted file mode 100644 index 1533d63..0000000 Binary files a/examples/ch10/card_images/10_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/card_images/10_of_diamonds.svg b/examples/ch10/card_images/10_of_diamonds.svg deleted file mode 100644 index 4df3e66..0000000 --- a/examples/ch10/card_images/10_of_diamonds.svg +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/10_of_hearts.png b/examples/ch10/card_images/10_of_hearts.png deleted file mode 100644 index 94fe7ba..0000000 Binary files a/examples/ch10/card_images/10_of_hearts.png and /dev/null differ diff --git a/examples/ch10/card_images/10_of_hearts.svg b/examples/ch10/card_images/10_of_hearts.svg deleted file mode 100644 index 314e2ec..0000000 --- a/examples/ch10/card_images/10_of_hearts.svg +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/10_of_spades.png b/examples/ch10/card_images/10_of_spades.png deleted file mode 100644 index 0a60e3b..0000000 Binary files a/examples/ch10/card_images/10_of_spades.png and /dev/null differ diff --git a/examples/ch10/card_images/10_of_spades.svg b/examples/ch10/card_images/10_of_spades.svg deleted file mode 100644 index 6547ea8..0000000 --- a/examples/ch10/card_images/10_of_spades.svg +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/2_of_clubs.png b/examples/ch10/card_images/2_of_clubs.png deleted file mode 100644 index 11bbf22..0000000 Binary files a/examples/ch10/card_images/2_of_clubs.png and /dev/null differ diff --git a/examples/ch10/card_images/2_of_clubs.svg b/examples/ch10/card_images/2_of_clubs.svg deleted file mode 100644 index 4497cca..0000000 --- a/examples/ch10/card_images/2_of_clubs.svg +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/2_of_diamonds.png b/examples/ch10/card_images/2_of_diamonds.png deleted file mode 100644 index fbe3194..0000000 Binary files a/examples/ch10/card_images/2_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/card_images/2_of_diamonds.svg b/examples/ch10/card_images/2_of_diamonds.svg deleted file mode 100644 index f821e74..0000000 --- a/examples/ch10/card_images/2_of_diamonds.svg +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/2_of_hearts.png b/examples/ch10/card_images/2_of_hearts.png deleted file mode 100644 index 00bcf3e..0000000 Binary files a/examples/ch10/card_images/2_of_hearts.png and /dev/null differ diff --git a/examples/ch10/card_images/2_of_hearts.svg b/examples/ch10/card_images/2_of_hearts.svg deleted file mode 100644 index 6ad91dc..0000000 --- a/examples/ch10/card_images/2_of_hearts.svg +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/2_of_spades.png b/examples/ch10/card_images/2_of_spades.png deleted file mode 100644 index 6ce5eff..0000000 Binary files a/examples/ch10/card_images/2_of_spades.png and /dev/null differ diff --git a/examples/ch10/card_images/2_of_spades.svg b/examples/ch10/card_images/2_of_spades.svg deleted file mode 100644 index 288b52c..0000000 --- a/examples/ch10/card_images/2_of_spades.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/3_of_clubs.png b/examples/ch10/card_images/3_of_clubs.png deleted file mode 100644 index 06a2cad..0000000 Binary files a/examples/ch10/card_images/3_of_clubs.png and /dev/null differ diff --git a/examples/ch10/card_images/3_of_clubs.svg b/examples/ch10/card_images/3_of_clubs.svg deleted file mode 100644 index 9a0f6b5..0000000 --- a/examples/ch10/card_images/3_of_clubs.svg +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/3_of_diamonds.png b/examples/ch10/card_images/3_of_diamonds.png deleted file mode 100644 index 00646e1..0000000 Binary files a/examples/ch10/card_images/3_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/card_images/3_of_diamonds.svg b/examples/ch10/card_images/3_of_diamonds.svg deleted file mode 100644 index 7aa0a23..0000000 --- a/examples/ch10/card_images/3_of_diamonds.svg +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/3_of_hearts.png b/examples/ch10/card_images/3_of_hearts.png deleted file mode 100644 index 182e4e3..0000000 Binary files a/examples/ch10/card_images/3_of_hearts.png and /dev/null differ diff --git a/examples/ch10/card_images/3_of_hearts.svg b/examples/ch10/card_images/3_of_hearts.svg deleted file mode 100644 index 5968eb8..0000000 --- a/examples/ch10/card_images/3_of_hearts.svg +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/3_of_spades.png b/examples/ch10/card_images/3_of_spades.png deleted file mode 100644 index 54cd1d3..0000000 Binary files a/examples/ch10/card_images/3_of_spades.png and /dev/null differ diff --git a/examples/ch10/card_images/3_of_spades.svg b/examples/ch10/card_images/3_of_spades.svg deleted file mode 100644 index e89085d..0000000 --- a/examples/ch10/card_images/3_of_spades.svg +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/4_of_clubs.png b/examples/ch10/card_images/4_of_clubs.png deleted file mode 100644 index fa0cfe3..0000000 Binary files a/examples/ch10/card_images/4_of_clubs.png and /dev/null differ diff --git a/examples/ch10/card_images/4_of_clubs.svg b/examples/ch10/card_images/4_of_clubs.svg deleted file mode 100644 index 51fcc13..0000000 --- a/examples/ch10/card_images/4_of_clubs.svg +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/4_of_diamonds.png b/examples/ch10/card_images/4_of_diamonds.png deleted file mode 100644 index fed199a..0000000 Binary files a/examples/ch10/card_images/4_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/card_images/4_of_diamonds.svg b/examples/ch10/card_images/4_of_diamonds.svg deleted file mode 100644 index 4c2a35f..0000000 --- a/examples/ch10/card_images/4_of_diamonds.svg +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/4_of_hearts.png b/examples/ch10/card_images/4_of_hearts.png deleted file mode 100644 index 723e524..0000000 Binary files a/examples/ch10/card_images/4_of_hearts.png and /dev/null differ diff --git a/examples/ch10/card_images/4_of_hearts.svg b/examples/ch10/card_images/4_of_hearts.svg deleted file mode 100644 index 64aa8af..0000000 --- a/examples/ch10/card_images/4_of_hearts.svg +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/4_of_spades.png b/examples/ch10/card_images/4_of_spades.png deleted file mode 100644 index 6ab00b7..0000000 Binary files a/examples/ch10/card_images/4_of_spades.png and /dev/null differ diff --git a/examples/ch10/card_images/4_of_spades.svg b/examples/ch10/card_images/4_of_spades.svg deleted file mode 100644 index c2aa0c4..0000000 --- a/examples/ch10/card_images/4_of_spades.svg +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/5_of_clubs.png b/examples/ch10/card_images/5_of_clubs.png deleted file mode 100644 index a764120..0000000 Binary files a/examples/ch10/card_images/5_of_clubs.png and /dev/null differ diff --git a/examples/ch10/card_images/5_of_clubs.svg b/examples/ch10/card_images/5_of_clubs.svg deleted file mode 100644 index 2a8933f..0000000 --- a/examples/ch10/card_images/5_of_clubs.svg +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/5_of_diamonds.png b/examples/ch10/card_images/5_of_diamonds.png deleted file mode 100644 index be559f6..0000000 Binary files a/examples/ch10/card_images/5_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/card_images/5_of_diamonds.svg b/examples/ch10/card_images/5_of_diamonds.svg deleted file mode 100644 index f541fb8..0000000 --- a/examples/ch10/card_images/5_of_diamonds.svg +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/5_of_hearts.png b/examples/ch10/card_images/5_of_hearts.png deleted file mode 100644 index ea7d732..0000000 Binary files a/examples/ch10/card_images/5_of_hearts.png and /dev/null differ diff --git a/examples/ch10/card_images/5_of_hearts.svg b/examples/ch10/card_images/5_of_hearts.svg deleted file mode 100644 index ee5f42e..0000000 --- a/examples/ch10/card_images/5_of_hearts.svg +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/5_of_spades.png b/examples/ch10/card_images/5_of_spades.png deleted file mode 100644 index 4cabbe2..0000000 Binary files a/examples/ch10/card_images/5_of_spades.png and /dev/null differ diff --git a/examples/ch10/card_images/5_of_spades.svg b/examples/ch10/card_images/5_of_spades.svg deleted file mode 100644 index f462964..0000000 --- a/examples/ch10/card_images/5_of_spades.svg +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/6_of_clubs.png b/examples/ch10/card_images/6_of_clubs.png deleted file mode 100644 index 5cedb6e..0000000 Binary files a/examples/ch10/card_images/6_of_clubs.png and /dev/null differ diff --git a/examples/ch10/card_images/6_of_clubs.svg b/examples/ch10/card_images/6_of_clubs.svg deleted file mode 100644 index ef8053f..0000000 --- a/examples/ch10/card_images/6_of_clubs.svg +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/6_of_diamonds.png b/examples/ch10/card_images/6_of_diamonds.png deleted file mode 100644 index 3cdc948..0000000 Binary files a/examples/ch10/card_images/6_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/card_images/6_of_diamonds.svg b/examples/ch10/card_images/6_of_diamonds.svg deleted file mode 100644 index 67e8901..0000000 --- a/examples/ch10/card_images/6_of_diamonds.svg +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/6_of_hearts.png b/examples/ch10/card_images/6_of_hearts.png deleted file mode 100644 index faa7f46..0000000 Binary files a/examples/ch10/card_images/6_of_hearts.png and /dev/null differ diff --git a/examples/ch10/card_images/6_of_hearts.svg b/examples/ch10/card_images/6_of_hearts.svg deleted file mode 100644 index 960b8a2..0000000 --- a/examples/ch10/card_images/6_of_hearts.svg +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/6_of_spades.png b/examples/ch10/card_images/6_of_spades.png deleted file mode 100644 index 7640e84..0000000 Binary files a/examples/ch10/card_images/6_of_spades.png and /dev/null differ diff --git a/examples/ch10/card_images/6_of_spades.svg b/examples/ch10/card_images/6_of_spades.svg deleted file mode 100644 index 775f1e0..0000000 --- a/examples/ch10/card_images/6_of_spades.svg +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/7_of_clubs.png b/examples/ch10/card_images/7_of_clubs.png deleted file mode 100644 index eeb118f..0000000 Binary files a/examples/ch10/card_images/7_of_clubs.png and /dev/null differ diff --git a/examples/ch10/card_images/7_of_clubs.svg b/examples/ch10/card_images/7_of_clubs.svg deleted file mode 100644 index 3056277..0000000 --- a/examples/ch10/card_images/7_of_clubs.svg +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/7_of_diamonds.png b/examples/ch10/card_images/7_of_diamonds.png deleted file mode 100644 index a6643a2..0000000 Binary files a/examples/ch10/card_images/7_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/card_images/7_of_diamonds.svg b/examples/ch10/card_images/7_of_diamonds.svg deleted file mode 100644 index 335ed07..0000000 --- a/examples/ch10/card_images/7_of_diamonds.svg +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/7_of_hearts.png b/examples/ch10/card_images/7_of_hearts.png deleted file mode 100644 index 0307d02..0000000 Binary files a/examples/ch10/card_images/7_of_hearts.png and /dev/null differ diff --git a/examples/ch10/card_images/7_of_hearts.svg b/examples/ch10/card_images/7_of_hearts.svg deleted file mode 100644 index ab636e7..0000000 --- a/examples/ch10/card_images/7_of_hearts.svg +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/7_of_spades.png b/examples/ch10/card_images/7_of_spades.png deleted file mode 100644 index c92cff2..0000000 Binary files a/examples/ch10/card_images/7_of_spades.png and /dev/null differ diff --git a/examples/ch10/card_images/7_of_spades.svg b/examples/ch10/card_images/7_of_spades.svg deleted file mode 100644 index 8e1e2e6..0000000 --- a/examples/ch10/card_images/7_of_spades.svg +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/8_of_clubs.png b/examples/ch10/card_images/8_of_clubs.png deleted file mode 100644 index 3b38254..0000000 Binary files a/examples/ch10/card_images/8_of_clubs.png and /dev/null differ diff --git a/examples/ch10/card_images/8_of_clubs.svg b/examples/ch10/card_images/8_of_clubs.svg deleted file mode 100644 index 144771a..0000000 --- a/examples/ch10/card_images/8_of_clubs.svg +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/8_of_diamonds.png b/examples/ch10/card_images/8_of_diamonds.png deleted file mode 100644 index 9935565..0000000 Binary files a/examples/ch10/card_images/8_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/card_images/8_of_diamonds.svg b/examples/ch10/card_images/8_of_diamonds.svg deleted file mode 100644 index d710b85..0000000 --- a/examples/ch10/card_images/8_of_diamonds.svg +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/8_of_hearts.png b/examples/ch10/card_images/8_of_hearts.png deleted file mode 100644 index c4f82b4..0000000 Binary files a/examples/ch10/card_images/8_of_hearts.png and /dev/null differ diff --git a/examples/ch10/card_images/8_of_hearts.svg b/examples/ch10/card_images/8_of_hearts.svg deleted file mode 100644 index 16b4d34..0000000 --- a/examples/ch10/card_images/8_of_hearts.svg +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/8_of_spades.png b/examples/ch10/card_images/8_of_spades.png deleted file mode 100644 index 17c52f8..0000000 Binary files a/examples/ch10/card_images/8_of_spades.png and /dev/null differ diff --git a/examples/ch10/card_images/8_of_spades.svg b/examples/ch10/card_images/8_of_spades.svg deleted file mode 100644 index 89d8401..0000000 --- a/examples/ch10/card_images/8_of_spades.svg +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/9_of_clubs.png b/examples/ch10/card_images/9_of_clubs.png deleted file mode 100644 index 8a703f9..0000000 Binary files a/examples/ch10/card_images/9_of_clubs.png and /dev/null differ diff --git a/examples/ch10/card_images/9_of_clubs.svg b/examples/ch10/card_images/9_of_clubs.svg deleted file mode 100644 index f014643..0000000 --- a/examples/ch10/card_images/9_of_clubs.svg +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/9_of_diamonds.png b/examples/ch10/card_images/9_of_diamonds.png deleted file mode 100644 index ee0518b..0000000 Binary files a/examples/ch10/card_images/9_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/card_images/9_of_diamonds.svg b/examples/ch10/card_images/9_of_diamonds.svg deleted file mode 100644 index b0d1f61..0000000 --- a/examples/ch10/card_images/9_of_diamonds.svg +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/9_of_hearts.png b/examples/ch10/card_images/9_of_hearts.png deleted file mode 100644 index 99a824e..0000000 Binary files a/examples/ch10/card_images/9_of_hearts.png and /dev/null differ diff --git a/examples/ch10/card_images/9_of_hearts.svg b/examples/ch10/card_images/9_of_hearts.svg deleted file mode 100644 index f5e8174..0000000 --- a/examples/ch10/card_images/9_of_hearts.svg +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/9_of_spades.png b/examples/ch10/card_images/9_of_spades.png deleted file mode 100644 index b79bf9a..0000000 Binary files a/examples/ch10/card_images/9_of_spades.png and /dev/null differ diff --git a/examples/ch10/card_images/9_of_spades.svg b/examples/ch10/card_images/9_of_spades.svg deleted file mode 100644 index fdbd145..0000000 --- a/examples/ch10/card_images/9_of_spades.svg +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/ace_of_clubs.png b/examples/ch10/card_images/ace_of_clubs.png deleted file mode 100644 index 20fecb2..0000000 Binary files a/examples/ch10/card_images/ace_of_clubs.png and /dev/null differ diff --git a/examples/ch10/card_images/ace_of_clubs.svg b/examples/ch10/card_images/ace_of_clubs.svg deleted file mode 100644 index 1ffe9fd..0000000 --- a/examples/ch10/card_images/ace_of_clubs.svg +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/ace_of_diamonds.png b/examples/ch10/card_images/ace_of_diamonds.png deleted file mode 100644 index 8408c71..0000000 Binary files a/examples/ch10/card_images/ace_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/card_images/ace_of_diamonds.svg b/examples/ch10/card_images/ace_of_diamonds.svg deleted file mode 100644 index 8070a3d..0000000 --- a/examples/ch10/card_images/ace_of_diamonds.svg +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/ace_of_hearts.png b/examples/ch10/card_images/ace_of_hearts.png deleted file mode 100644 index 5cad021..0000000 Binary files a/examples/ch10/card_images/ace_of_hearts.png and /dev/null differ diff --git a/examples/ch10/card_images/ace_of_hearts.svg b/examples/ch10/card_images/ace_of_hearts.svg deleted file mode 100644 index f0c3e42..0000000 --- a/examples/ch10/card_images/ace_of_hearts.svg +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/ace_of_spades.png b/examples/ch10/card_images/ace_of_spades.png deleted file mode 100644 index 36b386d..0000000 Binary files a/examples/ch10/card_images/ace_of_spades.png and /dev/null differ diff --git a/examples/ch10/card_images/ace_of_spades.svg b/examples/ch10/card_images/ace_of_spades.svg deleted file mode 100644 index 0317ae3..0000000 --- a/examples/ch10/card_images/ace_of_spades.svg +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/jack_of_clubs.png b/examples/ch10/card_images/jack_of_clubs.png deleted file mode 100644 index 26d9ee7..0000000 Binary files a/examples/ch10/card_images/jack_of_clubs.png and /dev/null differ diff --git a/examples/ch10/card_images/jack_of_clubs.svg b/examples/ch10/card_images/jack_of_clubs.svg deleted file mode 100644 index e0eab98..0000000 --- a/examples/ch10/card_images/jack_of_clubs.svg +++ /dev/null @@ -1,1686 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/jack_of_diamonds.png b/examples/ch10/card_images/jack_of_diamonds.png deleted file mode 100644 index 5a034e8..0000000 Binary files a/examples/ch10/card_images/jack_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/card_images/jack_of_diamonds.svg b/examples/ch10/card_images/jack_of_diamonds.svg deleted file mode 100644 index 1df36ed..0000000 --- a/examples/ch10/card_images/jack_of_diamonds.svg +++ /dev/null @@ -1,1253 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/jack_of_hearts.png b/examples/ch10/card_images/jack_of_hearts.png deleted file mode 100644 index b66ae4d..0000000 Binary files a/examples/ch10/card_images/jack_of_hearts.png and /dev/null differ diff --git a/examples/ch10/card_images/jack_of_hearts.svg b/examples/ch10/card_images/jack_of_hearts.svg deleted file mode 100644 index a058669..0000000 --- a/examples/ch10/card_images/jack_of_hearts.svg +++ /dev/null @@ -1,1506 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/jack_of_spades.png b/examples/ch10/card_images/jack_of_spades.png deleted file mode 100644 index 092ac3a..0000000 Binary files a/examples/ch10/card_images/jack_of_spades.png and /dev/null differ diff --git a/examples/ch10/card_images/jack_of_spades.svg b/examples/ch10/card_images/jack_of_spades.svg deleted file mode 100644 index 667e232..0000000 --- a/examples/ch10/card_images/jack_of_spades.svg +++ /dev/null @@ -1,1692 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/king_of_clubs.png b/examples/ch10/card_images/king_of_clubs.png deleted file mode 100644 index 260f804..0000000 Binary files a/examples/ch10/card_images/king_of_clubs.png and /dev/null differ diff --git a/examples/ch10/card_images/king_of_clubs.svg b/examples/ch10/card_images/king_of_clubs.svg deleted file mode 100644 index 44308a9..0000000 --- a/examples/ch10/card_images/king_of_clubs.svg +++ /dev/null @@ -1,1673 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/king_of_diamonds.png b/examples/ch10/card_images/king_of_diamonds.png deleted file mode 100644 index 8fdbe19..0000000 Binary files a/examples/ch10/card_images/king_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/card_images/king_of_diamonds.svg b/examples/ch10/card_images/king_of_diamonds.svg deleted file mode 100644 index fd6d7b8..0000000 --- a/examples/ch10/card_images/king_of_diamonds.svg +++ /dev/null @@ -1,1306 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/king_of_hearts.png b/examples/ch10/card_images/king_of_hearts.png deleted file mode 100644 index 0d17afb..0000000 Binary files a/examples/ch10/card_images/king_of_hearts.png and /dev/null differ diff --git a/examples/ch10/card_images/king_of_hearts.svg b/examples/ch10/card_images/king_of_hearts.svg deleted file mode 100644 index 8c3c345..0000000 --- a/examples/ch10/card_images/king_of_hearts.svg +++ /dev/null @@ -1,2214 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/king_of_spades.png b/examples/ch10/card_images/king_of_spades.png deleted file mode 100644 index 349a017..0000000 Binary files a/examples/ch10/card_images/king_of_spades.png and /dev/null differ diff --git a/examples/ch10/card_images/king_of_spades.svg b/examples/ch10/card_images/king_of_spades.svg deleted file mode 100644 index e598156..0000000 --- a/examples/ch10/card_images/king_of_spades.svg +++ /dev/null @@ -1,1245 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/queen_of_clubs.png b/examples/ch10/card_images/queen_of_clubs.png deleted file mode 100644 index 1d31903..0000000 Binary files a/examples/ch10/card_images/queen_of_clubs.png and /dev/null differ diff --git a/examples/ch10/card_images/queen_of_clubs.svg b/examples/ch10/card_images/queen_of_clubs.svg deleted file mode 100644 index 40f5a96..0000000 --- a/examples/ch10/card_images/queen_of_clubs.svg +++ /dev/null @@ -1,1734 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/queen_of_diamonds.png b/examples/ch10/card_images/queen_of_diamonds.png deleted file mode 100644 index b01c2de..0000000 Binary files a/examples/ch10/card_images/queen_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/card_images/queen_of_diamonds.svg b/examples/ch10/card_images/queen_of_diamonds.svg deleted file mode 100644 index 1252425..0000000 --- a/examples/ch10/card_images/queen_of_diamonds.svg +++ /dev/null @@ -1,1304 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/queen_of_hearts.png b/examples/ch10/card_images/queen_of_hearts.png deleted file mode 100644 index e8eb29b..0000000 Binary files a/examples/ch10/card_images/queen_of_hearts.png and /dev/null differ diff --git a/examples/ch10/card_images/queen_of_hearts.svg b/examples/ch10/card_images/queen_of_hearts.svg deleted file mode 100644 index a370441..0000000 --- a/examples/ch10/card_images/queen_of_hearts.svg +++ /dev/null @@ -1,1741 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/card_images/queen_of_spades.png b/examples/ch10/card_images/queen_of_spades.png deleted file mode 100644 index a101c67..0000000 Binary files a/examples/ch10/card_images/queen_of_spades.png and /dev/null differ diff --git a/examples/ch10/card_images/queen_of_spades.svg b/examples/ch10/card_images/queen_of_spades.svg deleted file mode 100644 index 7dcd3ec..0000000 --- a/examples/ch10/card_images/queen_of_spades.svg +++ /dev/null @@ -1,1562 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/carddataclass.py b/examples/ch10/carddataclass.py deleted file mode 100644 index c088145..0000000 --- a/examples/ch10/carddataclass.py +++ /dev/null @@ -1,46 +0,0 @@ -# carddataclass.py -"""Card data class with class attributes, data attributes, -autogenerated methods and explicitly defined methods.""" -from dataclasses import dataclass -from typing import ClassVar, List - -@dataclass -class Card: - FACES: ClassVar[List[str]] = ['Ace', '2', '3', '4', '5', '6', '7', - '8', '9', '10', 'Jack', 'Queen', 'King'] - SUITS: ClassVar[List[str]] = ['Hearts', 'Diamonds', 'Clubs', 'Spades'] - - face: str - suit: str - - @property - def image_name(self): - """Return the Card's image file name.""" - return str(self).replace(' ', '_') + '.png' - - def __str__(self): - """Return string representation for str().""" - return f'{self.face} of {self.suit}' - - def __format__(self, format): - """Return formatted string representation.""" - return f'{str(self):{format}}' - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/commissionemployee.py b/examples/ch10/commissionemployee.py deleted file mode 100755 index 0b00fa0..0000000 --- a/examples/ch10/commissionemployee.py +++ /dev/null @@ -1,81 +0,0 @@ -# commmissionemployee.py -"""CommissionEmployee base class.""" -from decimal import Decimal - -class CommissionEmployee: - """An employee who gets paid commission based on gross sales.""" - - def __init__(self, first_name, last_name, ssn, - gross_sales, commission_rate): - """Initialize CommissionEmployee's attributes.""" - self._first_name = first_name - self._last_name = last_name - self._ssn = ssn - self.gross_sales = gross_sales # validate via property - self.commission_rate = commission_rate # validate via property - - @property - def first_name(self): - return self._first_name - - @property - def last_name(self): - return self._last_name - - @property - def ssn(self): - return self._ssn - - @property - def gross_sales(self): - return self._gross_sales - - @gross_sales.setter - def gross_sales(self, sales): - """Set gross sales or raise ValueError if invalid.""" - if sales < Decimal('0.00'): - raise ValueError('Gross sales must be >= to 0') - - self._gross_sales = sales - - @property - def commission_rate(self): - return self._commission_rate - - @commission_rate.setter - def commission_rate(self, rate): - """Set commission rate or raise ValueError if invalid.""" - if not (Decimal('0.0') < rate < Decimal('1.0')): - raise ValueError( - 'Interest rate must be greater than 0 and less than 1') - - self._commission_rate = rate - - def earnings(self): - """Calculate earnings.""" - return self.gross_sales * self.commission_rate - - def __repr__(self): - """Return string representation for repr().""" - return ('CommissionEmployee: ' + - f'{self.first_name} {self.last_name}\n' + - f'social security number: {self.ssn}\n' + - f'gross sales: {self.gross_sales:.2f}\n' + - f'commission rate: {self.commission_rate:.2f}') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/complexnumber.py b/examples/ch10/complexnumber.py deleted file mode 100755 index cab8de4..0000000 --- a/examples/ch10/complexnumber.py +++ /dev/null @@ -1,44 +0,0 @@ -# complexnumber.py -"""Complex class with overloaded operators.""" - -class Complex: - """Complex class that represents a complex number - with real and imaginary parts.""" - - def __init__(self, real, imaginary): - """Initialize Complex class's attributes.""" - self.real = real - self.imaginary = imaginary - - def __add__(self, right): - """Overrides the + operator.""" - return Complex(self.real + right.real, - self.imaginary + right.imaginary) - - def __iadd__(self, right): - """Overrides the += operator.""" - self.real += right.real - self.imaginary += right.imaginary - return self - - def __repr__(self): - """Return string representation for repr().""" - return (f'({self.real}' + - (' + ' if self.imaginary >= 0 else ' - ') + - f'{abs(self.imaginary)}i)') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/complexnumber2.py b/examples/ch10/complexnumber2.py deleted file mode 100755 index b2c7652..0000000 --- a/examples/ch10/complexnumber2.py +++ /dev/null @@ -1,55 +0,0 @@ -# complexnumber2.py -"""Complex class with overloaded operators.""" - -class Complex: - """Complex class that represents a complex number - with real and imaginary parts.""" - - def __init__(self, real, imaginary): - """Initialize Complex class's attributes.""" - self.real = real - self.imaginary = imaginary - - def __add__(self, right): - """Overrides the + operator.""" - return Complex(self.real + right.real, - self.imaginary + right.imaginary) - - def __iadd__(self, right): - """Overrides the += operator.""" - self.real += right.real - self.imaginary += right.imaginary - return self - - def __sub__(self, right): - """Overrides the - operator.""" - return Complex(self.real - right.real, - self.imaginary - right.imaginary) - - def __isub__(self, right): - """Overrides the -= operator.""" - self.real -= right.real - self.imaginary -= right.imaginary - return self - - def __repr__(self): - """Return string representation for repr().""" - return (f'({self.real}' + - (' + ' if self.imaginary >= 0 else ' - ') + - f'{abs(self.imaginary)}i)') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/deck.py b/examples/ch10/deck.py deleted file mode 100755 index 21e10b3..0000000 --- a/examples/ch10/deck.py +++ /dev/null @@ -1,57 +0,0 @@ -# deck.py -"""Deck class represents a deck of Cards.""" -import random -from card import Card - -class DeckOfCards: - NUMBER_OF_CARDS = 52 # constant number of Cards - - def __init__(self): - """Initialize the deck.""" - self._current_card = 0 - self._deck = [] - - for count in range(DeckOfCards.NUMBER_OF_CARDS): - self._deck.append(Card(Card.FACES[count % 13], - Card.SUITS[count // 13])) - - def shuffle(self): - """Shuffle deck.""" - self._current_card = 0 - random.shuffle(self._deck) - - def deal_card(self): - """Return one Card.""" - try: - card = self._deck[self._current_card] - self._current_card += 1 - return card - except: - return None - - def __str__(self): - """Return a string representation of the current _deck.""" - s = '' - - for index, card in enumerate(self._deck): - s += f'{self._deck[index]:<19}' - if (index + 1) % 4 == 0: - s += '\n' - - return s - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/deck2.py b/examples/ch10/deck2.py deleted file mode 100755 index d33c535..0000000 --- a/examples/ch10/deck2.py +++ /dev/null @@ -1,57 +0,0 @@ -# deck.py -"""Deck class represents a deck of Cards.""" -import random -from carddataclass import Card - -class DeckOfCards: - NUMBER_OF_CARDS = 52 # constant number of Cards - - def __init__(self): - """Initialize the deck.""" - self.current_card = 0 - self._deck = [] - - for count in range(DeckOfCards.NUMBER_OF_CARDS): - self._deck.append(Card(Card.FACES[count % 13], - Card.SUITS[count // 13])) - - def shuffle(self): - """Shuffle deck.""" - self.current_card = 0 - random.shuffle(self._deck) - - def deal_card(self): - """Return one Card.""" - try: - card = self._deck[self.current_card] - self.current_card += 1 - return card - except: - return None - - def __str__(self): - """Return a string representation of the current _deck.""" - s = '' - - for index, card in enumerate(self._deck): - s += f'{self.deal_card():<19}' - if (index + 1) % 4 == 0: - s += '\n' - - return s - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/private.py b/examples/ch10/private.py deleted file mode 100755 index 59d4f9e..0000000 --- a/examples/ch10/private.py +++ /dev/null @@ -1,26 +0,0 @@ -# private.py -"""Class with public and private attributes.""" - -class PrivateClass: - """Class with public and private attributes.""" - - def __init__(self): - """Initialize the public and private attributes.""" - self.public_data = "public" # public attribute - self.__private_data = "private" # private attribute - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/salariedcommissionemployee.py b/examples/ch10/salariedcommissionemployee.py deleted file mode 100755 index 7f0ff12..0000000 --- a/examples/ch10/salariedcommissionemployee.py +++ /dev/null @@ -1,53 +0,0 @@ -# salariedcommissionemployee.py -"""SalariedCommissionEmployee derived from CommissionEmployee.""" -from commissionemployee import CommissionEmployee -from decimal import Decimal - -class SalariedCommissionEmployee(CommissionEmployee): - """An employee who gets paid a salary plus - commission based on gross sales.""" - - def __init__(self, first_name, last_name, ssn, - gross_sales, commission_rate, base_salary): - """Initialize SalariedCommissionEmployee's attributes.""" - super().__init__(first_name, last_name, ssn, - gross_sales, commission_rate) - self.base_salary = base_salary # validate via property - - @property - def base_salary(self): - return self._base_salary - - @base_salary.setter - def base_salary(self, salary): - """Set base salary or raise ValueError if invalid.""" - if salary < Decimal('0.00'): - raise ValueError('Base salary must be >= to 0') - - self._base_salary = salary - - def earnings(self): - """Calculate earnings.""" - return super().earnings() + self.base_salary - - def __repr__(self): - """Return string representation for repr().""" - return ('Salaried' + super().__repr__() + - f'\nbase salary: {self.base_salary:.2f}') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/salariedemployee.py b/examples/ch10/salariedemployee.py deleted file mode 100755 index 1a5ce87..0000000 --- a/examples/ch10/salariedemployee.py +++ /dev/null @@ -1,51 +0,0 @@ -# salariedemployee.py -"""SalariedEmployee concrete subclass of Employee.""" -from decimal import Decimal -from employee import Employee - -class SalariedEmployee(Employee): - """Class representing an employee who gets paid a weekly salary.""" - - def __init__(self, first_name, last_name, ssn, weekly_salary): - """Initialize SalariedEmployee attributes.""" - super().__init__(first_name, last_name, ssn) - self.weekly_salary = weekly_salary - - @property - def weekly_salary(self): - return self._weekly_salary - - @weekly_salary.setter - def weekly_salary(self, salary): - """Set weekly_salary or raise ValueError if invalid.""" - if salary < Decimal('0.0'): - raise ValueError('salary worked must be >= 0.0') - - self._weekly_salary = salary - - def earnings(self): - """Calculate earnings.""" - return self.weekly_salary - - def __repr__(self): - """Return string representation for repr().""" - return ('SalariedEmployee: ' + super().__repr__() + - f'\nweekly salary: {self.weekly_salary:.2f}') - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_ipynb/10_02.01.ipynb b/examples/ch10/snippets_ipynb/10_02.01.ipynb deleted file mode 100755 index 74d1e06..0000000 --- a/examples/ch10/snippets_ipynb/10_02.01.ipynb +++ /dev/null @@ -1,161 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 10.2.1 Test-Driving Class `Account` " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Importing Classes Account and Decimal" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from account import Account" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from decimal import Decimal" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Create an `Account` Object with a Constructor Expression" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "account1 = Account('John Green', Decimal('50.00'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting an `Account`’s Name and Balance" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "account1.name" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "account1.balance" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Depositing Money into an `Account` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "account1.deposit(Decimal('25.53'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "account1.balance" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### `Account` Methods Perform Validation" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "account1.deposit(Decimal('-123.45'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_02.02.ipynb b/examples/ch10/snippets_ipynb/10_02.02.ipynb deleted file mode 100644 index c88565a..0000000 --- a/examples/ch10/snippets_ipynb/10_02.02.ipynb +++ /dev/null @@ -1,92 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 10.2.2 `Account` Class Definition\n", - "### Defining a Class \n", - "```python\n", - "# account.py\n", - "\"\"\"Account class definition.\"\"\"\n", - "from decimal import Decimal\n", - "\n", - "class Account:\n", - " \"\"\"Account class for maintaining a bank account balance.\"\"\"\n", - " \n", - "\n", - "```\n", - "\n", - "### Initializing Account Objects: Method `__init__` \n", - "```python\n", - " def __init__(self, name, balance):\n", - " \"\"\"Initialize an Account object.\"\"\"\n", - "\n", - " # if balance is less than 0.00, raise an exception\n", - " if balance < Decimal('0.00'):\n", - " raise ValueError('Initial balance must be >= to 0.00.')\n", - "\n", - " self.name = name\n", - " self.balance = balance\n", - "\n", - "\n", - "```\n", - "### Method deposit \n", - "```python\n", - " def deposit(self, amount):\n", - " \"\"\"Deposit money to the account.\"\"\"\n", - "\n", - " # if amount is less than 0.00, raise an exception\n", - " if amount < Decimal('0.00'):\n", - " raise ValueError('amount must be positive.')\n", - "\n", - " self.balance += amount\n", - "\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_02.03selfcheck.ipynb b/examples/ch10/snippets_ipynb/10_02.03selfcheck.ipynb deleted file mode 100644 index 977a3f5..0000000 --- a/examples/ch10/snippets_ipynb/10_02.03selfcheck.ipynb +++ /dev/null @@ -1,140 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 10.2.3 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Add a `withdraw` method to class Account. If the withdrawal `amount` is greater than the `balance`, raise a `ValueError`, indicating that the withdrawal `amount` must be less than or equal to the `balance`. If the withdrawal `amount` is less than `0.00`, raise a `ValueError` indicating that the withdrawal `amount` must be positive. If the withdrawal `amount` is valid, subtract it from the `balance` attribute. Create an `Account` object then test method `withdraw` first with a valid withdrawal `amount`, then with a withdrawal `amount` greater than the `balance` and finally with a negative withdrawal `amount`. \n", - "\n", - "**Answer:** The new method in class Account is:\n", - "```python\n", - "def withdraw(self, amount):\n", - " \"\"\"Withdraw money from the account.\"\"\"\n", - "\n", - " # if amount is greater than balance, raise an exception\n", - " if amount > self.balance:\n", - " raise ValueError('amount must be <= to balance.')\n", - " elif amount < Decimal('0.00'):\n", - " raise ValueError('amount must be positive.')\n", - "\n", - " self.balance -= amount\n", - "```\n", - "Testing method withdraw:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from account import Account" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from decimal import Decimal" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "account1 = Account('John Green', Decimal('50.00'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "account1.withdraw(Decimal('20.00'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "account1.balance" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "account1.withdraw(Decimal('100.00'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "account1.withdraw(Decimal('-10.00'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_03.ipynb b/examples/ch10/snippets_ipynb/10_03.ipynb deleted file mode 100755 index 8bf8195..0000000 --- a/examples/ch10/snippets_ipynb/10_03.ipynb +++ /dev/null @@ -1,116 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 10.3 Controlling Access to Attributes " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from account import Account" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from decimal import Decimal" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "account1 = Account('John Green', Decimal('50.00'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "account1.balance" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "account1.balance = Decimal('-1000.00')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "account1.balance" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Encapsulation \n", - "### Leading Underscore (`_`) Naming Convention" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_04.01.ipynb b/examples/ch10/snippets_ipynb/10_04.01.ipynb deleted file mode 100755 index 41fd14e..0000000 --- a/examples/ch10/snippets_ipynb/10_04.01.ipynb +++ /dev/null @@ -1,186 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 10.4.1 Test-Driving Class `Time` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from timewithproperties import Time" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a `Time` Object" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wake_up = Time(hour=6, minute=30)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Displaying a `Time` Object" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wake_up" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(wake_up)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting an Attribute Via a Property " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wake_up.hour" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Setting the `Time` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wake_up.set_time(hour=7, minute=45)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wake_up" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Setting an Attribute via a Property " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wake_up.hour = 6" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wake_up" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Attempting to Set an Invalid Value " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wake_up.hour = 100" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_04.02.ipynb b/examples/ch10/snippets_ipynb/10_04.02.ipynb deleted file mode 100644 index c68417b..0000000 --- a/examples/ch10/snippets_ipynb/10_04.02.ipynb +++ /dev/null @@ -1,145 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 10.4.2 Class `Time` Definition\n", - "### Class Time: `__init__` Method with Default Parameter Values\n", - "```python\n", - "# time1.py\n", - "\"\"\"Class Time with read-write properties.\"\"\"\n", - "\n", - "class Time:\n", - " \"\"\"Class Time with read-write properties.\"\"\"\n", - "\n", - " def __init__(self, hour=0, minute=0, second=0):\n", - " \"\"\"Initialize each attribute.\"\"\"\n", - " self.hour = hour # 0-23\n", - " self.minute = minute # 0-59\n", - " self.second = second # 0-59\n", - "\n", - "\n", - "```\n", - "### Class `Time`: `hour` Read-Write Property\n", - "```python\n", - " @property\n", - " def hour(self):\n", - " \"\"\"Return the hour.\"\"\"\n", - " return self._hour\n", - "\n", - " @hour.setter\n", - " def hour(self, hour):\n", - " \"\"\"Set the hour.\"\"\"\n", - " if not (0 <= hour < 24):\n", - " raise ValueError(f'Hour ({hour}) must be 0-23')\n", - "\n", - " self._hour = hour\n", - "\n", - "\n", - "``` \n", - "### Class `Time`: `minute` and `second` Read-Write Properties\n", - "```python\n", - " @property\n", - " def minute(self):\n", - " \"\"\"Return the minute.\"\"\"\n", - " return self._minute\n", - "\n", - " @minute.setter\n", - " def minute(self, minute):\n", - " \"\"\"Set the minute.\"\"\"\n", - " if not (0 <= minute < 60):\n", - " raise ValueError(f'Minute ({minute}) must be 0-59')\n", - "\n", - " self._minute = minute\n", - "\n", - " @property\n", - " def second(self):\n", - " \"\"\"Return the second.\"\"\"\n", - " return self._second\n", - "\n", - " @second.setter\n", - " def second(self, second):\n", - " \"\"\"Set the second.\"\"\"\n", - " if not (0 <= second < 60):\n", - " raise ValueError(f'Second ({second}) must be 0-59')\n", - "\n", - " self._second = second\n", - "\n", - "\n", - "```\n", - "### Class `Time`: Method `set_time` \n", - "```python\n", - " def set_time(self, hour=0, minute=0, second=0):\n", - " \"\"\"Set values of hour, minute, and second.\"\"\"\n", - " self.hour = hour\n", - " self.minute = minute\n", - " self.second = second\n", - "\n", - "\n", - "```\n", - "### Class `Time`: Special Method `__repr__`\n", - "```python\n", - " def __repr__(self):\n", - " \"\"\"Return Time string for repr().\"\"\"\n", - " return (f'Time(hour={self.hour}, minute={self.minute}, ' + \n", - " f'second={self.second})')\n", - "\n", - "\n", - "```\n", - "### Class `Time`: Special Method `__str__` \n", - "```python\n", - " def __str__(self):\n", - " \"\"\"Print Time in 12-hour clock format.\"\"\"\n", - " return (('12' if self.hour in (0, 12) else str(self.hour % 12)) + \n", - " f':{self.minute:0>2}:{self.second:0>2}' + \n", - " (' AM' if self.hour < 12 else ' PM'))\n", - "\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_04.02selfcheck.ipynb b/examples/ch10/snippets_ipynb/10_04.02selfcheck.ipynb deleted file mode 100644 index 9e415a3..0000000 --- a/examples/ch10/snippets_ipynb/10_04.02selfcheck.ipynb +++ /dev/null @@ -1,144 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 10.4.2 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "**3. _(IPython Session)_** Add to class `Time` a read-write property `time` in which the getter returns a tuple containing the values of the `hour`, `minute` and `second` properties, and the _setter_ receives a tuple containing hour, minute and second values and uses them to set the time. Create a `Time` object and test the new property.\n", - "\n", - "**Answer:** The new read-write property definition is shown below:\n", - "```python\n", - "@property \n", - "def time(self):\n", - " \"\"\"Return hour, minute and second as a tuple.\"\"\"\n", - " return (self.hour, self.minute, self.second)\n", - "\n", - "@time.setter\n", - "def time(self, time_tuple):\n", - " \"\"\"Set time from a tuple containing hour, minute and second.\"\"\"\n", - " self.set_time(time_tuple[0], time_tuple[1], time_tuple[2])\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from timewithproperties import Time" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "t = Time()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "t" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "t.time = (12, 30, 45)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "t" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "t.time" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that the `self.set_time` call in the time property’s `setter` method may be expressed more concisely as\n", - "```python\n", - "self.set_time(*time_tuple)\n", - "```\n", - "The expression `*time_tuple` uses the unary `*` operator to _unpack_ the `time_tuple`’s values then passes them as individual arguments. In the preceding IPython session, the `setter` would receive the tuple `(12, 30, 45)`, then unpack the tuple and call `self.set_time` as follows:\n", - "```python\n", - "self.set_time(12, 30, 45)\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_04.03.ipynb b/examples/ch10/snippets_ipynb/10_04.03.ipynb deleted file mode 100644 index 2beddf7..0000000 --- a/examples/ch10/snippets_ipynb/10_04.03.ipynb +++ /dev/null @@ -1,112 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 10.4.3 Class `Time` Definition Design Notes \n", - "### Interface of a Class\n", - "### Attributes Are Always Accessible" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from timewithproperties import Time" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wake_up = Time(hour=7, minute=45, second=30)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wake_up._hour" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wake_up._hour = 100" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wake_up" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Internal Data Representation\n", - "### Evolving a Class’s Implementation Details\n", - "### Properties\n", - "### Utility Methods\n", - "### Module `datetime` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_05.ipynb b/examples/ch10/snippets_ipynb/10_05.ipynb deleted file mode 100755 index 5e2e746..0000000 --- a/examples/ch10/snippets_ipynb/10_05.ipynb +++ /dev/null @@ -1,147 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 10.5 Simulating “Private” Attributes \n", - "\n", - "**Note: This notebook contains the Self Check exercises because the Self Check IPython session continues from the section.**\n", - "\n", - "### IPython Auto-Completion Shows Only “Public” Attributes\n", - "### Demonstrating “Private” Attributes\n", - "```python\n", - "# private.py\n", - "\"\"\"Class with public and private attributes.\"\"\"\n", - "\n", - "class PrivateClass:\n", - " \"\"\"Class with public and private attributes.\"\"\"\n", - "\n", - " def __init__(self):\n", - " \"\"\"Initialize the public and private attributes.\"\"\"\n", - " self.public_data = \"public\" # public attribute\n", - " self.__private_data = \"private\" # private attribute\n", - "\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from private import PrivateClass" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "my_object = PrivateClass()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "my_object.public_data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "my_object.__private_data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 10.5 Self Check\n", - "\n", - "**3. _(IPython Session)_** Even with double-underscore (`__`) naming, we can still access and modify `__private_data`, because we know that Python renames attributes simply by prefixing their names with `'_`_ClassName_`'`. Demonstrate this for class `PrivateData`’s data attribute __`private_data`. \n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "my_object._PrivateClass__private_data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "my_object._PrivateClass__private_data = 'modified'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "my_object._PrivateClass__private_data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_06.01.ipynb b/examples/ch10/snippets_ipynb/10_06.01.ipynb deleted file mode 100755 index 6ae6e85..0000000 --- a/examples/ch10/snippets_ipynb/10_06.01.ipynb +++ /dev/null @@ -1,151 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 10.6.1 Test-Driving Classes `Card` and `DeckOfCards` \n", - "### Creating, Shuffling and Dealing the Cards " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from deck import DeckOfCards" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "deck_of_cards = DeckOfCards()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(deck_of_cards)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "deck_of_cards.shuffle()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(deck_of_cards)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Dealing Cards" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - " \n", - "deck_of_cards.deal_card()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Class Card’s Other Features" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "card = deck_of_cards.deal_card()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "str(card)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "card.image_name" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_06.02.ipynb b/examples/ch10/snippets_ipynb/10_06.02.ipynb deleted file mode 100644 index 99dee9e..0000000 --- a/examples/ch10/snippets_ipynb/10_06.02.ipynb +++ /dev/null @@ -1,114 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 10.6.2 Class `Card`—Introducing Class Attributes \n", - "### Class Attributes `FACES` and `SUITS` \n", - "```python\n", - "# card.py\n", - "\"\"\"Card class that represents a playing card and its image file name.\"\"\"\n", - "\n", - "class Card:\n", - " FACES = ['Ace', '2', '3', '4', '5', '6',\n", - " '7', '8', '9', '10', 'Jack', 'Queen', 'King']\n", - " SUITS = ['Hearts', 'Diamonds', 'Clubs', 'Spades']\n", - "\n", - "\n", - "```\n", - "### Card Method `__init__` \n", - "```python\n", - "\n", - " def __init__(self, face, suit):\n", - " \"\"\"Initialize a Card with a face and suit.\"\"\"\n", - " self._face = face\n", - " self._suit = suit\n", - "\n", - "\n", - "```\n", - "### Read-Only Properties `face`, `suit` and `image_name` \n", - "```python\n", - " @property\n", - " def face(self):\n", - " \"\"\"Return the Card's self._face value.\"\"\"\n", - " return self._face\n", - "\n", - " @property\n", - " def suit(self):\n", - " \"\"\"Return the Card's self._suit value.\"\"\"\n", - " return self._suit\n", - "\n", - " @property\n", - " def image_name(self):\n", - " \"\"\"Return the Card's image file name.\"\"\"\n", - " return str(self).replace(' ', '_') + '.png'\n", - "\n", - "\n", - "```\n", - "### Methods that Return String Representations of a Card \n", - "```python\n", - "\n", - " def __repr__(self):\n", - " \"\"\"Return string representation for repr().\"\"\"\n", - " return f\"Card(face='{self.face}', suit='{self.suit}')\" \n", - "\n", - "\n", - "\n", - " def __str__(self):\n", - " \"\"\"Return string representation for str().\"\"\"\n", - " return f'{self.face} of {self.suit}'\n", - "\n", - "\n", - "\n", - " def __format__(self, format):\n", - " \"\"\"Return formatted string representation for str().\"\"\"\n", - " return f'{str(self):{format}}'\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_06.03.ipynb b/examples/ch10/snippets_ipynb/10_06.03.ipynb deleted file mode 100644 index c31639e..0000000 --- a/examples/ch10/snippets_ipynb/10_06.03.ipynb +++ /dev/null @@ -1,113 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 10.6.3 Class `DeckOfCards` \n", - "### Method `__init__`\n", - "```python\n", - "# deck.py\n", - "\"\"\"Deck class represents a deck of Cards.\"\"\"\n", - "import random \n", - "from card import Card\n", - "\n", - "class DeckOfCards:\n", - " NUMBER_OF_CARDS = 52 # constant number of Cards\n", - "\n", - " def __init__(self):\n", - " \"\"\"Initialize the deck.\"\"\"\n", - " self._current_card = 0\n", - " self._deck = []\n", - "\n", - " for count in range(DeckOfCards.NUMBER_OF_CARDS): \n", - " self._deck.append(Card(Card.FACES[count % 13], \n", - " Card.SUITS[count // 13]))\n", - "\n", - "\n", - "```\n", - "### Method `shuffle`\n", - "```python\n", - " def shuffle(self):\n", - " \"\"\"Shuffle deck.\"\"\"\n", - " self._current_card = 0\n", - " random.shuffle(self._deck) \n", - "\n", - "\n", - "```\n", - "### Method `deal_card`\n", - "```python\n", - "\n", - " def deal_card(self):\n", - " \"\"\"Return one Card.\"\"\"\n", - " try:\n", - " card = self._deck[self._current_card]\n", - " self._current_card += 1\n", - " return card\n", - " except:\n", - " return None \n", - "\n", - "\n", - "```\n", - "### Method `__str__`\n", - "```python\n", - "\n", - " def __str__(self):\n", - " \"\"\"Return a string representation of the current _deck.\"\"\"\n", - " s = ''\n", - "\n", - " for index, card in enumerate(self._deck):\n", - " s += f'{self._deck[index]:<19}'\n", - " if (index + 1) % 4 == 0:\n", - " s += '\\n'\n", - " \n", - " return s\n", - "\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_06.04.ipynb b/examples/ch10/snippets_ipynb/10_06.04.ipynb deleted file mode 100644 index efbc105..0000000 --- a/examples/ch10/snippets_ipynb/10_06.04.ipynb +++ /dev/null @@ -1,258 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 10.6.4 Displaying Card Images with Matplotlib \n", - "\n", - "**Note: This notebook contains the Self Check exercises because the Self Check IPython session continues from the section.**\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from deck import DeckOfCards" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "deck_of_cards = DeckOfCards()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Enable Matplotlib in IPython" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Create the Base `Path` for Each Image" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pathlib import Path" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "path = Path('.').joinpath('card_images')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Import the Matplotlib Features" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.image as mpimg" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Create the `Figure` and `Axes` Objects, Configure the `Axes` Objects and Display the Images and Maximize the Image Sizes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "figure, axes_list = plt.subplots(nrows=4, ncols=13)\n", - "\n", - "# added next two statements to increase figure size in notebook\n", - "figure.set_figwidth(16)\n", - "figure.set_figheight(9)\n", - "\n", - "for axes in axes_list.ravel():\n", - " axes.get_xaxis().set_visible(False)\n", - " axes.get_yaxis().set_visible(False)\n", - " image_name = deck_of_cards.deal_card().image_name\n", - " img = mpimg.imread(str(path.joinpath(image_name).resolve()))\n", - " axes.imshow(img)\n", - "\n", - "figure.tight_layout()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Shuffle and Re-Deal the Deck" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "deck_of_cards.shuffle()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# added this statement to create a separate figure in the notebook\n", - "figure, axes_list = plt.subplots(nrows=4, ncols=13)\n", - "\n", - "# added next two statements to increase figure size in notebook\n", - "figure.set_figwidth(16)\n", - "figure.set_figheight(9)\n", - "\n", - "for axes in axes_list.ravel():\n", - " axes.get_xaxis().set_visible(False)\n", - " axes.get_yaxis().set_visible(False)\n", - " image_name = deck_of_cards.deal_card().image_name\n", - " img = mpimg.imread(str(path.joinpath(image_name).resolve()))\n", - " axes.imshow(img)\n", - " \n", - "# added this statement for execution in the notebook\n", - "figure.tight_layout()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 10.6.4 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "**4. _(IPython Session)_** Continue this section’s session by reshuffling the cards, then creating a new `Figure` containing two rows of five cards each—these might represent two five-card poker hands.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "deck_of_cards.shuffle()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "figure, axes_list = plt.subplots(nrows=2, ncols=5)\n", - "\n", - "# added next two statements to increase figure size in notebook\n", - "figure.set_figwidth(16)\n", - "figure.set_figheight(9)\n", - "\n", - "for axes in axes_list.ravel():\n", - " axes.get_xaxis().set_visible(False)\n", - " axes.get_yaxis().set_visible(False)\n", - " image_name = deck_of_cards.deal_card().image_name\n", - " img = mpimg.imread(str(path.joinpath(image_name).resolve()))\n", - " axes.imshow(img)\n", - "\n", - "figure.tight_layout()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_08.ipynb b/examples/ch10/snippets_ipynb/10_08.ipynb deleted file mode 100755 index f3032b1..0000000 --- a/examples/ch10/snippets_ipynb/10_08.ipynb +++ /dev/null @@ -1,396 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 10.8 Building an Inheritance Hierarchy; Introducing Polymorphism\n", - "\n", - "**Note: This notebook contains all of Section 10.8, including its Self Check exercises because the IPython session continues through the entire section.\n", - "\n", - "## 10.8.1 Base Class `CommissionEmployee` \n", - "```python\n", - "# commmissionemployee.py\n", - "\"\"\"CommissionEmployee base class.\"\"\"\n", - "from decimal import Decimal\n", - "\n", - "class CommissionEmployee:\n", - " \"\"\"An employee who gets paid commission based on gross sales.\"\"\"\n", - "\n", - " def __init__(self, first_name, last_name, ssn, \n", - " gross_sales, commission_rate):\n", - " \"\"\"Initialize CommissionEmployee's attributes.\"\"\"\n", - " self._first_name = first_name\n", - " self._last_name = last_name\n", - " self._ssn = ssn\n", - " self.gross_sales = gross_sales # validate via property\n", - " self.commission_rate = commission_rate # validate via property\n", - "\n", - " @property\n", - " def first_name(self):\n", - " return self._first_name\n", - "\n", - " @property\n", - " def last_name(self):\n", - " return self._last_name\n", - "\n", - " @property\n", - " def ssn(self):\n", - " return self._ssn\n", - "\n", - " @property\n", - " def gross_sales(self):\n", - " return self._gross_sales\n", - "\n", - " @gross_sales.setter\n", - " def gross_sales(self, sales):\n", - " \"\"\"Set gross sales or raise ValueError if invalid.\"\"\"\n", - " if sales < Decimal('0.00'):\n", - " raise ValueError('Gross sales must be >= to 0')\n", - " \n", - " self._gross_sales = sales\n", - " \n", - " @property\n", - " def commission_rate(self):\n", - " return self._commission_rate\n", - "\n", - " @commission_rate.setter\n", - " def commission_rate(self, rate):\n", - " \"\"\"Set commission rate or raise ValueError if invalid.\"\"\"\n", - " if not (Decimal('0.0') < rate < Decimal('1.0')):\n", - " raise ValueError(\n", - " 'Interest rate must be greater than 0 and less than 1')\n", - " \n", - " self._commission_rate = rate\n", - "\n", - " def earnings(self):\n", - " \"\"\"Calculate earnings.\"\"\" \n", - " return self.gross_sales * self.commission_rate\n", - "\n", - " def __repr__(self):\n", - " \"\"\"Return string representation for repr().\"\"\"\n", - " return ('CommissionEmployee: ' + \n", - " f'{self.first_name} {self.last_name}\\n' +\n", - " f'social security number: {self.ssn}\\n' +\n", - " f'gross sales: {self.gross_sales:.2f}\\n' +\n", - " f'commission rate: {self.commission_rate:.2f}')\n", - "\n", - "```\n", - "### All Classes Inherit Directly or Indirectly from Class `object`\n", - "### Testing Class `CommissionEmployee` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from commissionemployee import CommissionEmployee" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from decimal import Decimal" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c = CommissionEmployee('Sue', 'Jones', '333-33-3333', \n", - " Decimal('10000.00'), Decimal('0.06'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'{c.earnings():,.2f}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c.gross_sales = Decimal('20000.00')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c.commission_rate = Decimal('0.1')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'{c.earnings():,.2f}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 10.8.2 Subclass `SalariedCommissionEmployee` \n", - "### Declaring Class `SalariedCommissionEmployee` \n", - "```python\n", - "# basepluscommissionemployee.py\n", - "\"\"\"SalariedCommissionEmployee derived from CommissionEmployee.\"\"\"\n", - "from commissionemployee import CommissionEmployee\n", - "from decimal import Decimal\n", - "\n", - "class SalariedCommissionEmployee(CommissionEmployee):\n", - " \"\"\"An employee who gets paid a salary plus \n", - " commission based on gross sales.\"\"\"\n", - "\n", - " def __init__(self, first_name, last_name, ssn, \n", - " gross_sales, commission_rate, base_salary):\n", - " \"\"\"Initialize SalariedCommissionEmployee's attributes.\"\"\"\n", - " super().__init__(first_name, last_name, ssn, \n", - " gross_sales, commission_rate)\n", - " self.base_salary = base_salary # validate via property\n", - "\n", - " @property\n", - " def base_salary(self):\n", - " return self._base_salary\n", - "\n", - " @base_salary.setter\n", - " def base_salary(self, salary):\n", - " \"\"\"Set base salary or raise ValueError if invalid.\"\"\"\n", - " if salary < Decimal('0.00'):\n", - " raise ValueError('Base salary must be >= to 0')\n", - " \n", - " self._base_salary = salary\n", - "\n", - " def earnings(self):\n", - " \"\"\"Calculate earnings.\"\"\" \n", - " return super().earnings() + self.base_salary\n", - "\n", - " def __repr__(self):\n", - " \"\"\"Return string representation for repr().\"\"\"\n", - " return ('Salaried' + super().__repr__() + \n", - " f'\\nbase salary: {self.base_salary:.2f}')\n", - "\n", - "```\n", - "### Inheriting from Class `CommissionEmployee`\n", - "### Method `__init__` and Built-In Function `super` \n", - "### Overriding Method `earnings`\n", - "### Overriding Method `__repr__`\n", - "# Testing Class `SalariedCommissionEmployee` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from salariedcommissionemployee import SalariedCommissionEmployee" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "s = SalariedCommissionEmployee('Bob', 'Lewis', '444-44-4444',\n", - " Decimal('5000.00'), Decimal('0.04'), Decimal('300.00'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(s.first_name, s.last_name, s.ssn, s.gross_sales, \n", - " s.commission_rate, s.base_salary)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'{s.earnings():,.2f}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "s.gross_sales = Decimal('10000.00')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "s.commission_rate = Decimal('0.05')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "s.base_salary = Decimal('1000.00')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(s)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'{s.earnings():,.2f}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Testing the “is a” Relationship " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "issubclass(SalariedCommissionEmployee, CommissionEmployee)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "isinstance(s, CommissionEmployee)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "isinstance(s, SalariedCommissionEmployee)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 10.8.3 Processing `CommissionEmployee`s and `SalariedCommissionEmployee`s Polymorphically" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "employees = [c, s]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for employee in employees:\n", - " print(employee)\n", - " print(f'{employee.earnings():,.2f}\\n')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_09.ipynb b/examples/ch10/snippets_ipynb/10_09.ipynb deleted file mode 100755 index 0938170..0000000 --- a/examples/ch10/snippets_ipynb/10_09.ipynb +++ /dev/null @@ -1,143 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 10.9 Duck Typing and Polymorphism" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class WellPaidDuck:\n", - " def __repr__(self):\n", - " return 'I am a well-paid duck'\n", - " def earnings(self):\n", - " return Decimal('1_000_000.00')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from decimal import Decimal" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from commissionemployee import CommissionEmployee" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from salariedcommissionemployee import SalariedCommissionEmployee" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c = CommissionEmployee('Sue', 'Jones', '333-33-3333',\n", - " Decimal('10000.00'), Decimal('0.06'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "s = SalariedCommissionEmployee('Bob', 'Lewis', '444-44-4444',\n", - " Decimal('5000.00'), Decimal('0.04'), Decimal('300.00'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "d = WellPaidDuck()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "employees = [c, s, d]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for employee in employees:\n", - " print(employee)\n", - " print(f'{employee.earnings():,.2f}\\n')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_10.01.ipynb b/examples/ch10/snippets_ipynb/10_10.01.ipynb deleted file mode 100755 index af19b8b..0000000 --- a/examples/ch10/snippets_ipynb/10_10.01.ipynb +++ /dev/null @@ -1,153 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 10.10.1 Test-Driving Class Complex " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from complexnumber import Complex" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x = Complex(real=2, imaginary=4)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "y = Complex(real=5, imaginary=-1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "y" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x + y" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "y" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x += y" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "y" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_10.02.ipynb b/examples/ch10/snippets_ipynb/10_10.02.ipynb deleted file mode 100644 index f3e665b..0000000 --- a/examples/ch10/snippets_ipynb/10_10.02.ipynb +++ /dev/null @@ -1,103 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 10.10.2 Class `Complex` Definition\n", - "### Method `__init__` \n", - "```python\n", - "# complexnumber.py\n", - "\"\"\"Complex class with overloaded operators.\"\"\"\n", - "\n", - "class Complex:\n", - " \"\"\"Complex class that represents a complex number \n", - " with real and imaginary parts.\"\"\"\n", - "\n", - " def __init__(self, real, imaginary):\n", - " \"\"\"Initialize Complex class's attributes.\"\"\"\n", - " self.real = real\n", - " self.imaginary = imaginary\n", - "\n", - "\n", - "```\n", - "### Overloaded `+` Operator\n", - "```python\n", - "\n", - " def __add__(self, right):\n", - " \"\"\"Overrides the + operator.\"\"\"\n", - " return Complex(self.real + right.real, \n", - " self.imaginary + right.imaginary)\n", - "\n", - "\n", - "```\n", - "### Overloaded `+=` Augmented Assignment\n", - "```python\n", - "\n", - " def __iadd__(self, right):\n", - " \"\"\"Overrides the += operator.\"\"\"\n", - " self.real += right.real\n", - " self.imaginary += right.imaginary\n", - " return self\n", - "\n", - "\n", - "```\n", - "### Method `__repr__`\n", - "```python\n", - "\n", - " def __repr__(self):\n", - " \"\"\"Return string representation for repr().\"\"\"\n", - " return (f'({self.real} ' + \n", - " ('+' if self.imaginary >= 0 else '-') +\n", - " f' {abs(self.imaginary)}i)')\n", - "\n", - "```\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_10.02selfcheck.ipynb b/examples/ch10/snippets_ipynb/10_10.02selfcheck.ipynb deleted file mode 100755 index 373d925..0000000 --- a/examples/ch10/snippets_ipynb/10_10.02selfcheck.ipynb +++ /dev/null @@ -1,140 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 10.10.2 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "**3. _(IPython Session)_** Modify class `Complex` to support operators `-` and `-=`, then test these operators.\n", - "\n", - "**Answer:** The new method definitions are:\n", - "```python\n", - "def __sub__(self, right):\n", - " \"\"\"Overrides the - operator.\"\"\"\n", - " return Complex(self.real - right.real, \n", - " self.imaginary - right.imaginary)\n", - "\n", - "def __isub__(self, right):\n", - " \"\"\"Overrides the -= operator.\"\"\"\n", - " self.real -= right.real\n", - " self.imaginary -= right.imaginary\n", - " return self\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from complexnumber2 import Complex" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x = Complex(real=2, imaginary=4)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "y = Complex(real=5, imaginary=-1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x - y" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x -= y" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "y" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_12.ipynb b/examples/ch10/snippets_ipynb/10_12.ipynb deleted file mode 100755 index 04d775d..0000000 --- a/examples/ch10/snippets_ipynb/10_12.ipynb +++ /dev/null @@ -1,151 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 10.12 Named Tuples" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from collections import namedtuple" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Card = namedtuple('Card', ['face', 'suit'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "card = Card(face='Ace', suit='Spades')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "card.face" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "card.suit" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "card" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Other Named Tuple Features" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "values = ['Queen', 'Hearts']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "card = Card._make(values)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "card" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "card._asdict()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_12selfcheck.ipynb b/examples/ch10/snippets_ipynb/10_12selfcheck.ipynb deleted file mode 100755 index faee435..0000000 --- a/examples/ch10/snippets_ipynb/10_12selfcheck.ipynb +++ /dev/null @@ -1,111 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 10.12 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "**2. _(IPython Session)_** Create a `namedtuple` called `Time` with members named `hour`, `minute` and `second`. Then, create a `Time` object, access its members and display its string representation.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from collections import namedtuple" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Time = namedtuple('Time', ['hour', 'minute', 'second'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "t = Time(13, 30, 45)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(t.hour, t.minute, t.second)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "t" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_13.01.ipynb b/examples/ch10/snippets_ipynb/10_13.01.ipynb deleted file mode 100644 index d7b8fdb..0000000 --- a/examples/ch10/snippets_ipynb/10_13.01.ipynb +++ /dev/null @@ -1,113 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 10.13.1 Creating a `Card` Data Class \n", - "### Importing from the `dataclasses` and `typing` Modules\n", - "```python\n", - "# carddataclass.py\n", - "\"\"\"Card data class with class attributes, data attributes, \n", - "autogenerated methods and explicitly defined methods.\"\"\"\n", - "from dataclasses import dataclass\n", - "from typing import ClassVar, List\n", - "```\n", - "### Using the `@dataclass` Decorator\n", - "```python\n", - "@dataclass\n", - "class Card:\n", - "```\n", - "### Variable Annotations: Class Attributes\n", - "```python\n", - " FACES: ClassVar[List[str]] = ['Ace', '2', '3', '4', '5', '6', '7', \n", - " '8', '9', '10', 'Jack', 'Queen', 'King']\n", - " SUITS: ClassVar[List[str]] = ['Hearts', 'Diamonds', 'Clubs', 'Spades']\n", - "```\n", - "### Variable Annotations: Data Attributes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from dataclasses import dataclass\n", - "\n", - "@dataclass\n", - "class Demo:\n", - " x # attempting to create a data attribute x" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```python\n", - " face: str\n", - " suit: str\n", - "```\n", - "\n", - "### Defining a Property and Other Methods\n", - "```python\n", - " @property\n", - " def image_name(self):\n", - " \"\"\"Return the Card's image file name.\"\"\"\n", - " return str(self).replace(' ', '_') + '.png'\n", - "\n", - " def __str__(self):\n", - " \"\"\"Return string representation for str().\"\"\"\n", - " return f'{self.face} of {self.suit}'\n", - " \n", - " def __format__(self, format):\n", - " \"\"\"Return formatted string representation.\"\"\"\n", - " return f'{str(self):{format}}'\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_13.02.ipynb b/examples/ch10/snippets_ipynb/10_13.02.ipynb deleted file mode 100644 index 60896fb..0000000 --- a/examples/ch10/snippets_ipynb/10_13.02.ipynb +++ /dev/null @@ -1,207 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 10.13.2 Using the `Card` Data Class " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from carddataclass import Card" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c1 = Card(Card.FACES[0], Card.SUITS[3])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c1" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(c1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c1.face" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c1.suit" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c1.image_name" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c2 = Card(Card.FACES[0], Card.SUITS[3])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c3 = Card(Card.FACES[0], Card.SUITS[0])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c1 == c2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c1 == c3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c1 != c3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from deck2 import DeckOfCards # uses Card data class" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "deck_of_cards = DeckOfCards()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(deck_of_cards)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_13.02selfcheck.ipynb b/examples/ch10/snippets_ipynb/10_13.02selfcheck.ipynb deleted file mode 100644 index 1a7407f..0000000 --- a/examples/ch10/snippets_ipynb/10_13.02selfcheck.ipynb +++ /dev/null @@ -1,127 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 10.13.2 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Python is a dynamically typed language, so variable annotations are not enforced on objects of data classes. To prove this, create a `Card` object, then assign the integer `100` to its `face` attribute and display the `Card`. Display the `face` attribute’s type before and after the assignment\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from carddataclass import Card" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c = Card('Ace', 'Spades')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "type(c.face)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c.face = 100" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "type(c.face)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_13selfcheck.ipynb b/examples/ch10/snippets_ipynb/10_13selfcheck.ipynb deleted file mode 100644 index 6de7289..0000000 --- a/examples/ch10/snippets_ipynb/10_13selfcheck.ipynb +++ /dev/null @@ -1,70 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 10.13 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "**1. _(True/False)_** The autogenerated `__eq__` method for a data class creates tuples containing each of its operands’ data attributes then compares the tuples with `==`.\n", - "\n", - "**Answer:** True.\n", - "\n", - "**2. _(True/False)_** Data classes have auto-generated `<`, `<=`, `>` and `>=` operators, by default.\n", - "\n", - "**Answer:** False. The `==` and `!=` operators are auto-generated by default. The `<`, `<=`, `>` and `>=` operators are autogenerated only if the `@dataclass` decorator specifies the keyword argument `order=True`. \n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_14.ipynb b/examples/ch10/snippets_ipynb/10_14.ipynb deleted file mode 100644 index a85a0e3..0000000 --- a/examples/ch10/snippets_ipynb/10_14.ipynb +++ /dev/null @@ -1,117 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 10.14 Unit Testing with Docstrings and `doctest` \n", - "\n", - "**For your convenience, this notebook includes the entire contents of accountdoctest.py so you can modify it and rerun the tests. When you execute the cell containing accountdoctest.py, the doctests will execute.**\n", - "\n", - "### Module `doctest` and the `testmod` Function\n", - "### Modified `Account` Class" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# accountdoctest.py\n", - "\"\"\"Account class definition.\"\"\"\n", - "from decimal import Decimal\n", - "\n", - "class Account:\n", - " \"\"\"Account class for demonstrating doctest.\"\"\"\n", - " \n", - " def __init__(self, name, balance):\n", - " \"\"\"Initialize an Account object.\n", - " \n", - " >>> account1 = Account('John Green', Decimal('50.00'))\n", - " >>> account1.name\n", - " 'John Green'\n", - " >>> account1.balance\n", - " Decimal('50.00')\n", - "\n", - " The balance argument must be greater than or equal to 0.\n", - " >>> account2 = Account('John Green', Decimal('-50.00'))\n", - " Traceback (most recent call last):\n", - " ...\n", - " ValueError: Initial balance must be >= to 0.00.\n", - " \"\"\"\n", - "\n", - " # if balance is less than 0.00, raise an exception\n", - " if balance < Decimal('0.00'):\n", - " raise ValueError('Initial balance must be >= to 0.00.')\n", - "\n", - " self.name = name\n", - " self.balance = balance\n", - "\n", - " def deposit(self, amount):\n", - " \"\"\"Deposit money to the account.\"\"\"\n", - "\n", - " # if amount is less than 0.00, raise an exception\n", - " if amount < Decimal('0.00'):\n", - " raise ValueError('amount must be positive.')\n", - "\n", - " self.balance += amount\n", - "\n", - "if __name__ == '__main__':\n", - " import doctest\n", - " doctest.testmod(verbose=True)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Module `__main__` \n", - "### Running Tests " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness.The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_14selfcheck.ipynb b/examples/ch10/snippets_ipynb/10_14selfcheck.ipynb deleted file mode 100644 index d557c3f..0000000 --- a/examples/ch10/snippets_ipynb/10_14selfcheck.ipynb +++ /dev/null @@ -1,149 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 10.14 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** When you execute a Python source file as a script, Python creates a global attribute `__name__` and assigns it the string `________`. \n", - "\n", - "**Answer:** '\\_\\_main\\_\\_'.\n", - "\n", - "**2. _(True/False)_** When you execute the `doctest` module’s `testmod` function, it inspects your code and automatically creates tests for you.\n", - "\n", - "**Answer:** False. When you execute the `doctest` module’s `testmod` function, it inspects your code’s function, method and class docstrings looking for sample Python statements preceded by `>>>`, each followed on the next line by the given statement’s expected output (if any). \n", - "\n", - "**3. _(IPython Session)_** Add tests to the `deposit` method’s docstring, then execute the tests. Your test should create an `Account` object, deposit a valid amount into it, then attempt to deposit an invalid negative amount, which raises a `ValueError`.\n", - "\n", - "**Answer:** The updated docstring for method deposit is shown below followed by the verbose `doctest` results:\n", - "```python\n", - "\"\"\"Deposit money to the account.\n", - "\n", - ">>> account1 = Account('John Green', Decimal('50.00'))\n", - ">>> account1.deposit(Decimal('10.55'))\n", - ">>> account1.balance\n", - "Decimal('60.55')\n", - "\n", - ">>> account1.deposit(Decimal('-100.00'))\n", - "Traceback (most recent call last):\n", - " ...\n", - "ValueError: amount must be positive.\n", - "\"\"\"\n", - "```\n", - "\n", - "**For your convenience, this notebook includes the entire contents of accountdoctest2.py so you can modify it and rerun the tests. When you execute the cell containing accountdoctest2.py, the doctests will execute.**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# accountdoctest2.py\n", - "\"\"\"Account class definition.\"\"\"\n", - "from decimal import Decimal\n", - "\n", - "class Account:\n", - " \"\"\"Account class for demonstrating doctest.\"\"\"\n", - " \n", - " def __init__(self, name, balance):\n", - " \"\"\"Initialize an Account object.\n", - " \n", - " >>> account1 = Account('John Green', Decimal('50.00'))\n", - " >>> account1.name\n", - " 'John Green'\n", - " >>> account1.balance\n", - " Decimal('50.00')\n", - "\n", - " The balance argument must be greater than or equal to 0.\n", - " >>> account2 = Account('John Green', Decimal('-50.00'))\n", - " Traceback (most recent call last):\n", - " ...\n", - " ValueError: Initial balance must be >= to 0.00.\n", - " \"\"\"\n", - "\n", - " # if balance is less than 0.00, raise an exception\n", - " if balance < Decimal('0.00'):\n", - " raise ValueError('Initial balance must be >= to 0.00.')\n", - "\n", - " self.name = name\n", - " self.balance = balance\n", - "\n", - " def deposit(self, amount):\n", - " \"\"\"Deposit money to the account.\n", - " \n", - " >>> account1 = Account('John Green', Decimal('50.00'))\n", - " >>> account1.deposit(Decimal('10.55'))\n", - " >>> account1.balance\n", - " Decimal('60.55')\n", - " \n", - " >>> account1.deposit(Decimal('-100.00'))\n", - " Traceback (most recent call last):\n", - " ...\n", - " ValueError: amount must be positive.\n", - " \"\"\"\n", - "\n", - " # if amount is less than 0.00, raise an exception\n", - " if amount < Decimal('0.00'):\n", - " raise ValueError('amount must be positive.')\n", - "\n", - " self.balance += amount\n", - "\n", - "if __name__ == '__main__':\n", - " import doctest\n", - " doctest.testmod(verbose=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_15.ipynb b/examples/ch10/snippets_ipynb/10_15.ipynb deleted file mode 100644 index 340e427..0000000 --- a/examples/ch10/snippets_ipynb/10_15.ipynb +++ /dev/null @@ -1,115 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 10.15 Namespaces and Scopes\n", - "### Local Namespace\n", - "### Global Namespace\n", - "### Built-In Namespace\n", - "### Finding Identifiers in Namespaces" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "z = 'global z'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def print_variables():\n", - " y = 'local y in print_variables'\n", - " print(y)\n", - " print(z)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print_variables()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "y" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "z" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Nested Functions\n", - "### Class Namespace\n", - "### Object Namespace" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/10_16.ipynb b/examples/ch10/snippets_ipynb/10_16.ipynb deleted file mode 100644 index fd2c410..0000000 --- a/examples/ch10/snippets_ipynb/10_16.ipynb +++ /dev/null @@ -1,441 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 10.16 Intro to Data Science: Time Series and Simple Linear Regression \n", - "\n", - "**This file includes the Self Check snippets which continue from the section body.**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Time Series\n", - "### Simple Linear Regression\n", - "### Linear Relationships" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "c = lambda f: 5 / 9 * (f - 32)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "temps = [(f, c(f)) for f in range(0, 101, 10)]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "temps_df = pd.DataFrame(temps, columns=['Fahrenheit', 'Celsius'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "axes = temps_df.plot(x='Fahrenheit', y='Celsius', style='.-')\n", - "\n", - "y_label = axes.set_ylabel('Celsius')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Extra cell added to keep subsequent snippet numbers the same as the chapter.\n", - "# Had to merge the two prior cells for use in the notebook." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Components of the Simple Linear Regression Equation \n", - "### SciPy’s `stats` Module\n", - "### Pandas\n", - "### Seaborn Visualization\n", - "### Getting Weather Data from NOAA\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Loading the Average High Temperatures into a `DataFrame` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nyc = pd.read_csv('ave_hi_nyc_jan_1895-2018.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nyc.head()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nyc.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Cleaning the Data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nyc.columns = ['Date', 'Temperature', 'Anomaly']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nyc.head(3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nyc.Date.dtype" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nyc.Date = nyc.Date.floordiv(100)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nyc.head(3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Calculating Basic Descriptive Statistics for the Dataset" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.set_option('precision', 2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nyc.Temperature.describe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Forecasting Future January Average High Temperatures" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from scipy import stats" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "linear_regression = stats.linregress(x=nyc.Date,\n", - " y=nyc.Temperature)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "linear_regression.slope" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "linear_regression.intercept" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "linear_regression.slope * 2019 + linear_regression.intercept" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "linear_regression.slope * 1850 + linear_regression.intercept" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Plotting the Average High Temperatures and a Regression Line " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import seaborn as sns" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sns.set_style('whitegrid')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "axes = sns.regplot(x=nyc.Date, y=nyc.Temperature)\n", - "\n", - "axes.set_ylim(10, 70)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Extra cell added to keep subsequent snippet numbers the same as the chapter.\n", - "# Had to merge the two prior cells for use in the notebook." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting Time Series Datasets" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 10.16 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** Time series `________` looks at existing time series data for patterns, helping data analysts understand the data. Time series `________` uses data from the past to predict the future. \n", - "\n", - "**Answer:** analysis, forecasting.\n", - "\n", - "**2. _(True/False)_** In the formula, `c` `=` `5` `/` `9` `*` `(f` `-` `32)`, `f` (the Fahrenheit temperature) is the independent variable and `c` (the Celsius temperature) is the dependent variable.\n", - "\n", - "**Answer:** True. \n", - "\n", - "**3. _(IPython Session)_** Based on the slope and intercept values calculated in this section’s interactive session, in what year might the average January temperature in New York City reach 40 degrees Fahrenheit.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "year = 2019" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "slope = linear_regression.slope" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "intercept = linear_regression.intercept" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "temperature = slope * year + intercept" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "while temperature < 40.0:\n", - " year += 1\n", - " temperature = slope * year + intercept" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "year" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch10/snippets_ipynb/account.py b/examples/ch10/snippets_ipynb/account.py deleted file mode 100755 index 914f8a4..0000000 --- a/examples/ch10/snippets_ipynb/account.py +++ /dev/null @@ -1,53 +0,0 @@ -# account.py -"""Account class definition.""" -from decimal import Decimal - -class Account: - """Account class for maintaining a bank account balance.""" - - def __init__(self, name, balance): - """Initialize an Account object.""" - - # if balance is less than 0.00, raise an exception - if balance < Decimal('0.00'): - raise ValueError('Initial balance must be >= to 0.00.') - - self.name = name - self.balance = balance - - def deposit(self, amount): - """Deposit money to the account.""" - - # if amount is less than 0.00, raise an exception - if amount < Decimal('0.00'): - raise ValueError('amount must be positive.') - - self.balance += amount - - def withdraw(self, amount): - """Withdraw money from the account.""" - - # if amount is greater than balance, raise an exception - if amount > self.balance: - raise ValueError('amount must be <= to balance.') - elif amount < Decimal('0.00'): - raise ValueError('amount must be positive.') - - self.balance -= amount - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_ipynb/accountdoctest.py b/examples/ch10/snippets_ipynb/accountdoctest.py deleted file mode 100755 index 8a40428..0000000 --- a/examples/ch10/snippets_ipynb/accountdoctest.py +++ /dev/null @@ -1,57 +0,0 @@ -# accountdoctest.py -"""Account class definition.""" -from decimal import Decimal - -class Account: - """Account class for demonstrating doctest.""" - - def __init__(self, name, balance): - """Initialize an Account object. - - >>> account1 = Account('John Green', Decimal('50.00')) - >>> account1.name - 'John Green' - >>> account1.balance - Decimal('50.00') - - The balance argument must be greater than or equal to 0. - >>> account2 = Account('John Green', Decimal('-50.00')) - Traceback (most recent call last): - ... - ValueError: Initial balance must be >= to 0.00. - """ - - # if balance is less than 0.00, raise an exception - if balance < Decimal('0.00'): - raise ValueError('Initial balance must be >= to 0.00.') - - self.name = name - self.balance = balance - - def deposit(self, amount): - """Deposit money to the account.""" - - # if amount is less than 0.00, raise an exception - if amount < Decimal('0.00'): - raise ValueError('amount must be positive.') - - self.balance += amount - -if __name__ == '__main__': - import doctest - doctest.testmod(verbose=True) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_ipynb/accountdoctest2.py b/examples/ch10/snippets_ipynb/accountdoctest2.py deleted file mode 100755 index ffb2db1..0000000 --- a/examples/ch10/snippets_ipynb/accountdoctest2.py +++ /dev/null @@ -1,68 +0,0 @@ -# accountdoctest2.py -"""Account class definition.""" -from decimal import Decimal - -class Account: - """Account class for demonstrating doctest.""" - - def __init__(self, name, balance): - """Initialize an Account object. - - >>> account1 = Account('John Green', Decimal('50.00')) - >>> account1.name - 'John Green' - >>> account1.balance - Decimal('50.00') - - The balance argument must be greater than or equal to 0. - >>> account2 = Account('John Green', Decimal('-50.00')) - Traceback (most recent call last): - ... - ValueError: Initial balance must be >= to 0.00. - """ - - # if balance is less than 0.00, raise an exception - if balance < Decimal('0.00'): - raise ValueError('Initial balance must be >= to 0.00.') - - self.name = name - self.balance = balance - - def deposit(self, amount): - """Deposit money to the account. - - >>> account1 = Account('John Green', Decimal('50.00')) - >>> account1.deposit(Decimal('10.55')) - >>> account1.balance - Decimal('60.55') - - >>> account1.deposit(Decimal('-100.00')) - Traceback (most recent call last): - ... - ValueError: amount must be positive. - """ - - # if amount is less than 0.00, raise an exception - if amount < Decimal('0.00'): - raise ValueError('amount must be positive.') - - self.balance += amount - -if __name__ == '__main__': - import doctest - doctest.testmod(verbose=True) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_ipynb/ave_hi_la_jan_1895-2018.csv b/examples/ch10/snippets_ipynb/ave_hi_la_jan_1895-2018.csv deleted file mode 100755 index 485d137..0000000 --- a/examples/ch10/snippets_ipynb/ave_hi_la_jan_1895-2018.csv +++ /dev/null @@ -1,125 +0,0 @@ -Date,Value,Anomaly -189501,34.2,-3.2 -189601,34.7,-2.7 -189701,35.5,-1.9 -189801,39.6,2.2 -189901,36.4,-1.0 -190001,37.4,0.0 -190101,37.0,-0.4 -190201,35.0,-2.4 -190301,35.5,-1.9 -190401,29.8,-7.6 -190501,33.7,-3.7 -190601,42.3,4.9 -190701,40.5,3.1 -190801,38.3,0.9 -190901,39.6,2.2 -191001,36.1,-1.3 -191101,40.7,3.3 -191201,29.3,-8.1 -191301,46.9,9.5 -191401,36.9,-0.5 -191501,38.9,1.5 -191601,42.3,4.9 -191701,38.4,1.0 -191801,26.5,-10.9 -191901,40.6,3.2 -192001,29.7,-7.7 -192101,39.7,2.3 -192201,33.4,-4.0 -192301,35.2,-2.2 -192401,39.4,2.0 -192501,33.8,-3.6 -192601,37.2,-0.2 -192701,36.8,-0.6 -192801,40.0,2.6 -192901,37.8,0.4 -193001,38.5,1.1 -193101,38.2,0.8 -193201,47.6,10.2 -193301,45.6,8.2 -193401,39.8,2.4 -193501,35.0,-2.4 -193601,34.3,-3.1 -193701,45.7,8.3 -193801,37.3,-0.1 -193901,36.8,-0.6 -194001,30.0,-7.4 -194101,34.5,-2.9 -194201,36.5,-0.9 -194301,36.1,-1.3 -194401,39.0,1.6 -194501,31.5,-5.9 -194601,40.2,2.8 -194701,43.0,5.6 -194801,30.1,-7.3 -194901,43.5,6.1 -195001,47.6,10.2 -195101,42.5,5.1 -195201,42.4,5.0 -195301,42.4,5.0 -195401,37.0,-0.4 -195501,35.6,-1.8 -195601,36.2,-1.2 -195701,33.8,-3.6 -195801,36.4,-1.0 -195901,37.1,-0.3 -196001,37.8,0.4 -196101,31.9,-5.5 -196201,38.0,0.6 -196301,34.6,-2.8 -196401,40.2,2.8 -196501,34.0,-3.4 -196601,37.1,-0.3 -196701,41.6,4.2 -196801,31.7,-5.7 -196901,35.7,-1.7 -197001,29.9,-7.5 -197101,31.5,-5.9 -197201,40.5,3.1 -197301,40.6,3.2 -197401,39.7,2.3 -197501,41.7,4.3 -197601,32.6,-4.8 -197701,26.1,-11.3 -197801,32.3,-5.1 -197901,38.6,1.2 -198001,38.0,0.6 -198101,30.6,-6.8 -198201,30.9,-6.5 -198301,38.0,0.6 -198401,33.5,-3.9 -198501,33.0,-4.4 -198601,39.3,1.9 -198701,35.9,-1.5 -198801,34.2,-3.2 -198901,42.4,5.0 -199001,46.0,8.6 -199101,39.6,2.2 -199201,40.9,3.5 -199301,41.0,3.6 -199401,31.6,-5.8 -199501,42.6,5.2 -199601,37.0,-0.4 -199701,39.2,1.8 -199801,45.8,8.4 -199901,40.8,3.4 -200001,37.8,0.4 -200101,38.8,1.4 -200201,45.4,8.0 -200301,32.9,-4.5 -200401,31.0,-6.4 -200501,37.4,0.0 -200601,47.6,10.2 -200701,43.6,6.2 -200801,42.4,5.0 -200901,33.4,-4.0 -201001,38.1,0.7 -201101,34.8,-2.6 -201201,44.2,6.8 -201301,40.8,3.4 -201401,35.5,-1.9 -201501,36.1,-1.3 -201601,40.8,3.4 -201701,42.8,5.4 -201801,38.7,1.3 \ No newline at end of file diff --git a/examples/ch10/snippets_ipynb/ave_hi_nyc_jan_1895-2018.csv b/examples/ch10/snippets_ipynb/ave_hi_nyc_jan_1895-2018.csv deleted file mode 100755 index 485d137..0000000 --- a/examples/ch10/snippets_ipynb/ave_hi_nyc_jan_1895-2018.csv +++ /dev/null @@ -1,125 +0,0 @@ -Date,Value,Anomaly -189501,34.2,-3.2 -189601,34.7,-2.7 -189701,35.5,-1.9 -189801,39.6,2.2 -189901,36.4,-1.0 -190001,37.4,0.0 -190101,37.0,-0.4 -190201,35.0,-2.4 -190301,35.5,-1.9 -190401,29.8,-7.6 -190501,33.7,-3.7 -190601,42.3,4.9 -190701,40.5,3.1 -190801,38.3,0.9 -190901,39.6,2.2 -191001,36.1,-1.3 -191101,40.7,3.3 -191201,29.3,-8.1 -191301,46.9,9.5 -191401,36.9,-0.5 -191501,38.9,1.5 -191601,42.3,4.9 -191701,38.4,1.0 -191801,26.5,-10.9 -191901,40.6,3.2 -192001,29.7,-7.7 -192101,39.7,2.3 -192201,33.4,-4.0 -192301,35.2,-2.2 -192401,39.4,2.0 -192501,33.8,-3.6 -192601,37.2,-0.2 -192701,36.8,-0.6 -192801,40.0,2.6 -192901,37.8,0.4 -193001,38.5,1.1 -193101,38.2,0.8 -193201,47.6,10.2 -193301,45.6,8.2 -193401,39.8,2.4 -193501,35.0,-2.4 -193601,34.3,-3.1 -193701,45.7,8.3 -193801,37.3,-0.1 -193901,36.8,-0.6 -194001,30.0,-7.4 -194101,34.5,-2.9 -194201,36.5,-0.9 -194301,36.1,-1.3 -194401,39.0,1.6 -194501,31.5,-5.9 -194601,40.2,2.8 -194701,43.0,5.6 -194801,30.1,-7.3 -194901,43.5,6.1 -195001,47.6,10.2 -195101,42.5,5.1 -195201,42.4,5.0 -195301,42.4,5.0 -195401,37.0,-0.4 -195501,35.6,-1.8 -195601,36.2,-1.2 -195701,33.8,-3.6 -195801,36.4,-1.0 -195901,37.1,-0.3 -196001,37.8,0.4 -196101,31.9,-5.5 -196201,38.0,0.6 -196301,34.6,-2.8 -196401,40.2,2.8 -196501,34.0,-3.4 -196601,37.1,-0.3 -196701,41.6,4.2 -196801,31.7,-5.7 -196901,35.7,-1.7 -197001,29.9,-7.5 -197101,31.5,-5.9 -197201,40.5,3.1 -197301,40.6,3.2 -197401,39.7,2.3 -197501,41.7,4.3 -197601,32.6,-4.8 -197701,26.1,-11.3 -197801,32.3,-5.1 -197901,38.6,1.2 -198001,38.0,0.6 -198101,30.6,-6.8 -198201,30.9,-6.5 -198301,38.0,0.6 -198401,33.5,-3.9 -198501,33.0,-4.4 -198601,39.3,1.9 -198701,35.9,-1.5 -198801,34.2,-3.2 -198901,42.4,5.0 -199001,46.0,8.6 -199101,39.6,2.2 -199201,40.9,3.5 -199301,41.0,3.6 -199401,31.6,-5.8 -199501,42.6,5.2 -199601,37.0,-0.4 -199701,39.2,1.8 -199801,45.8,8.4 -199901,40.8,3.4 -200001,37.8,0.4 -200101,38.8,1.4 -200201,45.4,8.0 -200301,32.9,-4.5 -200401,31.0,-6.4 -200501,37.4,0.0 -200601,47.6,10.2 -200701,43.6,6.2 -200801,42.4,5.0 -200901,33.4,-4.0 -201001,38.1,0.7 -201101,34.8,-2.6 -201201,44.2,6.8 -201301,40.8,3.4 -201401,35.5,-1.9 -201501,36.1,-1.3 -201601,40.8,3.4 -201701,42.8,5.4 -201801,38.7,1.3 \ No newline at end of file diff --git a/examples/ch10/snippets_ipynb/card.py b/examples/ch10/snippets_ipynb/card.py deleted file mode 100755 index a4fcb9b..0000000 --- a/examples/ch10/snippets_ipynb/card.py +++ /dev/null @@ -1,56 +0,0 @@ -# card.py -"""Card class that represents a playing card and its image file name.""" - -class Card: - FACES = ['Ace', '2', '3', '4', '5', '6', - '7', '8', '9', '10', 'Jack', 'Queen', 'King'] - SUITS = ['Hearts', 'Diamonds', 'Clubs', 'Spades'] - - def __init__(self, face, suit): - """Initialize a Card with a face and suit.""" - self._face = face - self._suit = suit - - @property - def face(self): - """Return the Card's self._face value.""" - return self._face - - @property - def suit(self): - """Return the Card's self._suit value.""" - return self._suit - - @property - def image_name(self): - """Return the Card's image file name.""" - return str(self).replace(' ', '_') + '.png' - - def __repr__(self): - """Return string representation for repr().""" - return f"Card(face='{self.face}', suit='{self.suit}')" - - def __str__(self): - """Return string representation for str().""" - return f'{self.face} of {self.suit}' - - def __format__(self, format): - """Return formatted string representation.""" - return f'{str(self):{format}}' - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_ipynb/card_images/10_of_clubs.png b/examples/ch10/snippets_ipynb/card_images/10_of_clubs.png deleted file mode 100644 index 119466a..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/10_of_clubs.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/10_of_clubs.svg b/examples/ch10/snippets_ipynb/card_images/10_of_clubs.svg deleted file mode 100644 index f66f403..0000000 --- a/examples/ch10/snippets_ipynb/card_images/10_of_clubs.svg +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/10_of_diamonds.png b/examples/ch10/snippets_ipynb/card_images/10_of_diamonds.png deleted file mode 100644 index 1533d63..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/10_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/10_of_diamonds.svg b/examples/ch10/snippets_ipynb/card_images/10_of_diamonds.svg deleted file mode 100644 index 4df3e66..0000000 --- a/examples/ch10/snippets_ipynb/card_images/10_of_diamonds.svg +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/10_of_hearts.png b/examples/ch10/snippets_ipynb/card_images/10_of_hearts.png deleted file mode 100644 index 94fe7ba..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/10_of_hearts.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/10_of_hearts.svg b/examples/ch10/snippets_ipynb/card_images/10_of_hearts.svg deleted file mode 100644 index 314e2ec..0000000 --- a/examples/ch10/snippets_ipynb/card_images/10_of_hearts.svg +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/10_of_spades.png b/examples/ch10/snippets_ipynb/card_images/10_of_spades.png deleted file mode 100644 index 0a60e3b..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/10_of_spades.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/10_of_spades.svg b/examples/ch10/snippets_ipynb/card_images/10_of_spades.svg deleted file mode 100644 index 6547ea8..0000000 --- a/examples/ch10/snippets_ipynb/card_images/10_of_spades.svg +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/2_of_clubs.png b/examples/ch10/snippets_ipynb/card_images/2_of_clubs.png deleted file mode 100644 index 11bbf22..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/2_of_clubs.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/2_of_clubs.svg b/examples/ch10/snippets_ipynb/card_images/2_of_clubs.svg deleted file mode 100644 index 4497cca..0000000 --- a/examples/ch10/snippets_ipynb/card_images/2_of_clubs.svg +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/2_of_diamonds.png b/examples/ch10/snippets_ipynb/card_images/2_of_diamonds.png deleted file mode 100644 index fbe3194..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/2_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/2_of_diamonds.svg b/examples/ch10/snippets_ipynb/card_images/2_of_diamonds.svg deleted file mode 100644 index f821e74..0000000 --- a/examples/ch10/snippets_ipynb/card_images/2_of_diamonds.svg +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/2_of_hearts.png b/examples/ch10/snippets_ipynb/card_images/2_of_hearts.png deleted file mode 100644 index 00bcf3e..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/2_of_hearts.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/2_of_hearts.svg b/examples/ch10/snippets_ipynb/card_images/2_of_hearts.svg deleted file mode 100644 index 6ad91dc..0000000 --- a/examples/ch10/snippets_ipynb/card_images/2_of_hearts.svg +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/2_of_spades.png b/examples/ch10/snippets_ipynb/card_images/2_of_spades.png deleted file mode 100644 index 6ce5eff..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/2_of_spades.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/2_of_spades.svg b/examples/ch10/snippets_ipynb/card_images/2_of_spades.svg deleted file mode 100644 index 288b52c..0000000 --- a/examples/ch10/snippets_ipynb/card_images/2_of_spades.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/3_of_clubs.png b/examples/ch10/snippets_ipynb/card_images/3_of_clubs.png deleted file mode 100644 index 06a2cad..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/3_of_clubs.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/3_of_clubs.svg b/examples/ch10/snippets_ipynb/card_images/3_of_clubs.svg deleted file mode 100644 index 9a0f6b5..0000000 --- a/examples/ch10/snippets_ipynb/card_images/3_of_clubs.svg +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/3_of_diamonds.png b/examples/ch10/snippets_ipynb/card_images/3_of_diamonds.png deleted file mode 100644 index 00646e1..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/3_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/3_of_diamonds.svg b/examples/ch10/snippets_ipynb/card_images/3_of_diamonds.svg deleted file mode 100644 index 7aa0a23..0000000 --- a/examples/ch10/snippets_ipynb/card_images/3_of_diamonds.svg +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/3_of_hearts.png b/examples/ch10/snippets_ipynb/card_images/3_of_hearts.png deleted file mode 100644 index 182e4e3..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/3_of_hearts.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/3_of_hearts.svg b/examples/ch10/snippets_ipynb/card_images/3_of_hearts.svg deleted file mode 100644 index 5968eb8..0000000 --- a/examples/ch10/snippets_ipynb/card_images/3_of_hearts.svg +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/3_of_spades.png b/examples/ch10/snippets_ipynb/card_images/3_of_spades.png deleted file mode 100644 index 54cd1d3..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/3_of_spades.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/3_of_spades.svg b/examples/ch10/snippets_ipynb/card_images/3_of_spades.svg deleted file mode 100644 index e89085d..0000000 --- a/examples/ch10/snippets_ipynb/card_images/3_of_spades.svg +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/4_of_clubs.png b/examples/ch10/snippets_ipynb/card_images/4_of_clubs.png deleted file mode 100644 index fa0cfe3..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/4_of_clubs.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/4_of_clubs.svg b/examples/ch10/snippets_ipynb/card_images/4_of_clubs.svg deleted file mode 100644 index 51fcc13..0000000 --- a/examples/ch10/snippets_ipynb/card_images/4_of_clubs.svg +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/4_of_diamonds.png b/examples/ch10/snippets_ipynb/card_images/4_of_diamonds.png deleted file mode 100644 index fed199a..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/4_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/4_of_diamonds.svg b/examples/ch10/snippets_ipynb/card_images/4_of_diamonds.svg deleted file mode 100644 index 4c2a35f..0000000 --- a/examples/ch10/snippets_ipynb/card_images/4_of_diamonds.svg +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/4_of_hearts.png b/examples/ch10/snippets_ipynb/card_images/4_of_hearts.png deleted file mode 100644 index 723e524..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/4_of_hearts.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/4_of_hearts.svg b/examples/ch10/snippets_ipynb/card_images/4_of_hearts.svg deleted file mode 100644 index 64aa8af..0000000 --- a/examples/ch10/snippets_ipynb/card_images/4_of_hearts.svg +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/4_of_spades.png b/examples/ch10/snippets_ipynb/card_images/4_of_spades.png deleted file mode 100644 index 6ab00b7..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/4_of_spades.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/4_of_spades.svg b/examples/ch10/snippets_ipynb/card_images/4_of_spades.svg deleted file mode 100644 index c2aa0c4..0000000 --- a/examples/ch10/snippets_ipynb/card_images/4_of_spades.svg +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/5_of_clubs.png b/examples/ch10/snippets_ipynb/card_images/5_of_clubs.png deleted file mode 100644 index a764120..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/5_of_clubs.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/5_of_clubs.svg b/examples/ch10/snippets_ipynb/card_images/5_of_clubs.svg deleted file mode 100644 index 2a8933f..0000000 --- a/examples/ch10/snippets_ipynb/card_images/5_of_clubs.svg +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/5_of_diamonds.png b/examples/ch10/snippets_ipynb/card_images/5_of_diamonds.png deleted file mode 100644 index be559f6..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/5_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/5_of_diamonds.svg b/examples/ch10/snippets_ipynb/card_images/5_of_diamonds.svg deleted file mode 100644 index f541fb8..0000000 --- a/examples/ch10/snippets_ipynb/card_images/5_of_diamonds.svg +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/5_of_hearts.png b/examples/ch10/snippets_ipynb/card_images/5_of_hearts.png deleted file mode 100644 index ea7d732..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/5_of_hearts.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/5_of_hearts.svg b/examples/ch10/snippets_ipynb/card_images/5_of_hearts.svg deleted file mode 100644 index ee5f42e..0000000 --- a/examples/ch10/snippets_ipynb/card_images/5_of_hearts.svg +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/5_of_spades.png b/examples/ch10/snippets_ipynb/card_images/5_of_spades.png deleted file mode 100644 index 4cabbe2..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/5_of_spades.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/5_of_spades.svg b/examples/ch10/snippets_ipynb/card_images/5_of_spades.svg deleted file mode 100644 index f462964..0000000 --- a/examples/ch10/snippets_ipynb/card_images/5_of_spades.svg +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/6_of_clubs.png b/examples/ch10/snippets_ipynb/card_images/6_of_clubs.png deleted file mode 100644 index 5cedb6e..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/6_of_clubs.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/6_of_clubs.svg b/examples/ch10/snippets_ipynb/card_images/6_of_clubs.svg deleted file mode 100644 index ef8053f..0000000 --- a/examples/ch10/snippets_ipynb/card_images/6_of_clubs.svg +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/6_of_diamonds.png b/examples/ch10/snippets_ipynb/card_images/6_of_diamonds.png deleted file mode 100644 index 3cdc948..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/6_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/6_of_diamonds.svg b/examples/ch10/snippets_ipynb/card_images/6_of_diamonds.svg deleted file mode 100644 index 67e8901..0000000 --- a/examples/ch10/snippets_ipynb/card_images/6_of_diamonds.svg +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/6_of_hearts.png b/examples/ch10/snippets_ipynb/card_images/6_of_hearts.png deleted file mode 100644 index faa7f46..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/6_of_hearts.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/6_of_hearts.svg b/examples/ch10/snippets_ipynb/card_images/6_of_hearts.svg deleted file mode 100644 index 960b8a2..0000000 --- a/examples/ch10/snippets_ipynb/card_images/6_of_hearts.svg +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/6_of_spades.png b/examples/ch10/snippets_ipynb/card_images/6_of_spades.png deleted file mode 100644 index 7640e84..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/6_of_spades.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/6_of_spades.svg b/examples/ch10/snippets_ipynb/card_images/6_of_spades.svg deleted file mode 100644 index 775f1e0..0000000 --- a/examples/ch10/snippets_ipynb/card_images/6_of_spades.svg +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/7_of_clubs.png b/examples/ch10/snippets_ipynb/card_images/7_of_clubs.png deleted file mode 100644 index eeb118f..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/7_of_clubs.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/7_of_clubs.svg b/examples/ch10/snippets_ipynb/card_images/7_of_clubs.svg deleted file mode 100644 index 3056277..0000000 --- a/examples/ch10/snippets_ipynb/card_images/7_of_clubs.svg +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/7_of_diamonds.png b/examples/ch10/snippets_ipynb/card_images/7_of_diamonds.png deleted file mode 100644 index a6643a2..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/7_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/7_of_diamonds.svg b/examples/ch10/snippets_ipynb/card_images/7_of_diamonds.svg deleted file mode 100644 index 335ed07..0000000 --- a/examples/ch10/snippets_ipynb/card_images/7_of_diamonds.svg +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/7_of_hearts.png b/examples/ch10/snippets_ipynb/card_images/7_of_hearts.png deleted file mode 100644 index 0307d02..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/7_of_hearts.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/7_of_hearts.svg b/examples/ch10/snippets_ipynb/card_images/7_of_hearts.svg deleted file mode 100644 index ab636e7..0000000 --- a/examples/ch10/snippets_ipynb/card_images/7_of_hearts.svg +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/7_of_spades.png b/examples/ch10/snippets_ipynb/card_images/7_of_spades.png deleted file mode 100644 index c92cff2..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/7_of_spades.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/7_of_spades.svg b/examples/ch10/snippets_ipynb/card_images/7_of_spades.svg deleted file mode 100644 index 8e1e2e6..0000000 --- a/examples/ch10/snippets_ipynb/card_images/7_of_spades.svg +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/8_of_clubs.png b/examples/ch10/snippets_ipynb/card_images/8_of_clubs.png deleted file mode 100644 index 3b38254..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/8_of_clubs.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/8_of_clubs.svg b/examples/ch10/snippets_ipynb/card_images/8_of_clubs.svg deleted file mode 100644 index 144771a..0000000 --- a/examples/ch10/snippets_ipynb/card_images/8_of_clubs.svg +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/8_of_diamonds.png b/examples/ch10/snippets_ipynb/card_images/8_of_diamonds.png deleted file mode 100644 index 9935565..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/8_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/8_of_diamonds.svg b/examples/ch10/snippets_ipynb/card_images/8_of_diamonds.svg deleted file mode 100644 index d710b85..0000000 --- a/examples/ch10/snippets_ipynb/card_images/8_of_diamonds.svg +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/8_of_hearts.png b/examples/ch10/snippets_ipynb/card_images/8_of_hearts.png deleted file mode 100644 index c4f82b4..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/8_of_hearts.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/8_of_hearts.svg b/examples/ch10/snippets_ipynb/card_images/8_of_hearts.svg deleted file mode 100644 index 16b4d34..0000000 --- a/examples/ch10/snippets_ipynb/card_images/8_of_hearts.svg +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/8_of_spades.png b/examples/ch10/snippets_ipynb/card_images/8_of_spades.png deleted file mode 100644 index 17c52f8..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/8_of_spades.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/8_of_spades.svg b/examples/ch10/snippets_ipynb/card_images/8_of_spades.svg deleted file mode 100644 index 89d8401..0000000 --- a/examples/ch10/snippets_ipynb/card_images/8_of_spades.svg +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/9_of_clubs.png b/examples/ch10/snippets_ipynb/card_images/9_of_clubs.png deleted file mode 100644 index 8a703f9..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/9_of_clubs.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/9_of_clubs.svg b/examples/ch10/snippets_ipynb/card_images/9_of_clubs.svg deleted file mode 100644 index f014643..0000000 --- a/examples/ch10/snippets_ipynb/card_images/9_of_clubs.svg +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/9_of_diamonds.png b/examples/ch10/snippets_ipynb/card_images/9_of_diamonds.png deleted file mode 100644 index ee0518b..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/9_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/9_of_diamonds.svg b/examples/ch10/snippets_ipynb/card_images/9_of_diamonds.svg deleted file mode 100644 index b0d1f61..0000000 --- a/examples/ch10/snippets_ipynb/card_images/9_of_diamonds.svg +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/9_of_hearts.png b/examples/ch10/snippets_ipynb/card_images/9_of_hearts.png deleted file mode 100644 index 99a824e..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/9_of_hearts.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/9_of_hearts.svg b/examples/ch10/snippets_ipynb/card_images/9_of_hearts.svg deleted file mode 100644 index f5e8174..0000000 --- a/examples/ch10/snippets_ipynb/card_images/9_of_hearts.svg +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/9_of_spades.png b/examples/ch10/snippets_ipynb/card_images/9_of_spades.png deleted file mode 100644 index b79bf9a..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/9_of_spades.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/9_of_spades.svg b/examples/ch10/snippets_ipynb/card_images/9_of_spades.svg deleted file mode 100644 index fdbd145..0000000 --- a/examples/ch10/snippets_ipynb/card_images/9_of_spades.svg +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/ace_of_clubs.png b/examples/ch10/snippets_ipynb/card_images/ace_of_clubs.png deleted file mode 100644 index 20fecb2..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/ace_of_clubs.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/ace_of_clubs.svg b/examples/ch10/snippets_ipynb/card_images/ace_of_clubs.svg deleted file mode 100644 index 1ffe9fd..0000000 --- a/examples/ch10/snippets_ipynb/card_images/ace_of_clubs.svg +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/ace_of_diamonds.png b/examples/ch10/snippets_ipynb/card_images/ace_of_diamonds.png deleted file mode 100644 index 8408c71..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/ace_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/ace_of_diamonds.svg b/examples/ch10/snippets_ipynb/card_images/ace_of_diamonds.svg deleted file mode 100644 index 8070a3d..0000000 --- a/examples/ch10/snippets_ipynb/card_images/ace_of_diamonds.svg +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/ace_of_hearts.png b/examples/ch10/snippets_ipynb/card_images/ace_of_hearts.png deleted file mode 100644 index 5cad021..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/ace_of_hearts.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/ace_of_hearts.svg b/examples/ch10/snippets_ipynb/card_images/ace_of_hearts.svg deleted file mode 100644 index f0c3e42..0000000 --- a/examples/ch10/snippets_ipynb/card_images/ace_of_hearts.svg +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/ace_of_spades.png b/examples/ch10/snippets_ipynb/card_images/ace_of_spades.png deleted file mode 100644 index 36b386d..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/ace_of_spades.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/ace_of_spades.svg b/examples/ch10/snippets_ipynb/card_images/ace_of_spades.svg deleted file mode 100644 index 0317ae3..0000000 --- a/examples/ch10/snippets_ipynb/card_images/ace_of_spades.svg +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/jack_of_clubs.png b/examples/ch10/snippets_ipynb/card_images/jack_of_clubs.png deleted file mode 100644 index 26d9ee7..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/jack_of_clubs.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/jack_of_clubs.svg b/examples/ch10/snippets_ipynb/card_images/jack_of_clubs.svg deleted file mode 100644 index e0eab98..0000000 --- a/examples/ch10/snippets_ipynb/card_images/jack_of_clubs.svg +++ /dev/null @@ -1,1686 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/jack_of_diamonds.png b/examples/ch10/snippets_ipynb/card_images/jack_of_diamonds.png deleted file mode 100644 index 5a034e8..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/jack_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/jack_of_diamonds.svg b/examples/ch10/snippets_ipynb/card_images/jack_of_diamonds.svg deleted file mode 100644 index 1df36ed..0000000 --- a/examples/ch10/snippets_ipynb/card_images/jack_of_diamonds.svg +++ /dev/null @@ -1,1253 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/jack_of_hearts.png b/examples/ch10/snippets_ipynb/card_images/jack_of_hearts.png deleted file mode 100644 index b66ae4d..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/jack_of_hearts.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/jack_of_hearts.svg b/examples/ch10/snippets_ipynb/card_images/jack_of_hearts.svg deleted file mode 100644 index a058669..0000000 --- a/examples/ch10/snippets_ipynb/card_images/jack_of_hearts.svg +++ /dev/null @@ -1,1506 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/jack_of_spades.png b/examples/ch10/snippets_ipynb/card_images/jack_of_spades.png deleted file mode 100644 index 092ac3a..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/jack_of_spades.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/jack_of_spades.svg b/examples/ch10/snippets_ipynb/card_images/jack_of_spades.svg deleted file mode 100644 index 667e232..0000000 --- a/examples/ch10/snippets_ipynb/card_images/jack_of_spades.svg +++ /dev/null @@ -1,1692 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/king_of_clubs.png b/examples/ch10/snippets_ipynb/card_images/king_of_clubs.png deleted file mode 100644 index 260f804..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/king_of_clubs.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/king_of_clubs.svg b/examples/ch10/snippets_ipynb/card_images/king_of_clubs.svg deleted file mode 100644 index 44308a9..0000000 --- a/examples/ch10/snippets_ipynb/card_images/king_of_clubs.svg +++ /dev/null @@ -1,1673 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/king_of_diamonds.png b/examples/ch10/snippets_ipynb/card_images/king_of_diamonds.png deleted file mode 100644 index 8fdbe19..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/king_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/king_of_diamonds.svg b/examples/ch10/snippets_ipynb/card_images/king_of_diamonds.svg deleted file mode 100644 index fd6d7b8..0000000 --- a/examples/ch10/snippets_ipynb/card_images/king_of_diamonds.svg +++ /dev/null @@ -1,1306 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/king_of_hearts.png b/examples/ch10/snippets_ipynb/card_images/king_of_hearts.png deleted file mode 100644 index 0d17afb..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/king_of_hearts.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/king_of_hearts.svg b/examples/ch10/snippets_ipynb/card_images/king_of_hearts.svg deleted file mode 100644 index 8c3c345..0000000 --- a/examples/ch10/snippets_ipynb/card_images/king_of_hearts.svg +++ /dev/null @@ -1,2214 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/king_of_spades.png b/examples/ch10/snippets_ipynb/card_images/king_of_spades.png deleted file mode 100644 index 349a017..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/king_of_spades.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/king_of_spades.svg b/examples/ch10/snippets_ipynb/card_images/king_of_spades.svg deleted file mode 100644 index e598156..0000000 --- a/examples/ch10/snippets_ipynb/card_images/king_of_spades.svg +++ /dev/null @@ -1,1245 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/queen_of_clubs.png b/examples/ch10/snippets_ipynb/card_images/queen_of_clubs.png deleted file mode 100644 index 1d31903..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/queen_of_clubs.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/queen_of_clubs.svg b/examples/ch10/snippets_ipynb/card_images/queen_of_clubs.svg deleted file mode 100644 index 40f5a96..0000000 --- a/examples/ch10/snippets_ipynb/card_images/queen_of_clubs.svg +++ /dev/null @@ -1,1734 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/queen_of_diamonds.png b/examples/ch10/snippets_ipynb/card_images/queen_of_diamonds.png deleted file mode 100644 index b01c2de..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/queen_of_diamonds.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/queen_of_diamonds.svg b/examples/ch10/snippets_ipynb/card_images/queen_of_diamonds.svg deleted file mode 100644 index 1252425..0000000 --- a/examples/ch10/snippets_ipynb/card_images/queen_of_diamonds.svg +++ /dev/null @@ -1,1304 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/queen_of_hearts.png b/examples/ch10/snippets_ipynb/card_images/queen_of_hearts.png deleted file mode 100644 index e8eb29b..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/queen_of_hearts.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/queen_of_hearts.svg b/examples/ch10/snippets_ipynb/card_images/queen_of_hearts.svg deleted file mode 100644 index a370441..0000000 --- a/examples/ch10/snippets_ipynb/card_images/queen_of_hearts.svg +++ /dev/null @@ -1,1741 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/card_images/queen_of_spades.png b/examples/ch10/snippets_ipynb/card_images/queen_of_spades.png deleted file mode 100644 index a101c67..0000000 Binary files a/examples/ch10/snippets_ipynb/card_images/queen_of_spades.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/card_images/queen_of_spades.svg b/examples/ch10/snippets_ipynb/card_images/queen_of_spades.svg deleted file mode 100644 index 7dcd3ec..0000000 --- a/examples/ch10/snippets_ipynb/card_images/queen_of_spades.svg +++ /dev/null @@ -1,1562 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ch10/snippets_ipynb/carddataclass.py b/examples/ch10/snippets_ipynb/carddataclass.py deleted file mode 100644 index c088145..0000000 --- a/examples/ch10/snippets_ipynb/carddataclass.py +++ /dev/null @@ -1,46 +0,0 @@ -# carddataclass.py -"""Card data class with class attributes, data attributes, -autogenerated methods and explicitly defined methods.""" -from dataclasses import dataclass -from typing import ClassVar, List - -@dataclass -class Card: - FACES: ClassVar[List[str]] = ['Ace', '2', '3', '4', '5', '6', '7', - '8', '9', '10', 'Jack', 'Queen', 'King'] - SUITS: ClassVar[List[str]] = ['Hearts', 'Diamonds', 'Clubs', 'Spades'] - - face: str - suit: str - - @property - def image_name(self): - """Return the Card's image file name.""" - return str(self).replace(' ', '_') + '.png' - - def __str__(self): - """Return string representation for str().""" - return f'{self.face} of {self.suit}' - - def __format__(self, format): - """Return formatted string representation.""" - return f'{str(self):{format}}' - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_ipynb/commissionemployee.py b/examples/ch10/snippets_ipynb/commissionemployee.py deleted file mode 100755 index 0b00fa0..0000000 --- a/examples/ch10/snippets_ipynb/commissionemployee.py +++ /dev/null @@ -1,81 +0,0 @@ -# commmissionemployee.py -"""CommissionEmployee base class.""" -from decimal import Decimal - -class CommissionEmployee: - """An employee who gets paid commission based on gross sales.""" - - def __init__(self, first_name, last_name, ssn, - gross_sales, commission_rate): - """Initialize CommissionEmployee's attributes.""" - self._first_name = first_name - self._last_name = last_name - self._ssn = ssn - self.gross_sales = gross_sales # validate via property - self.commission_rate = commission_rate # validate via property - - @property - def first_name(self): - return self._first_name - - @property - def last_name(self): - return self._last_name - - @property - def ssn(self): - return self._ssn - - @property - def gross_sales(self): - return self._gross_sales - - @gross_sales.setter - def gross_sales(self, sales): - """Set gross sales or raise ValueError if invalid.""" - if sales < Decimal('0.00'): - raise ValueError('Gross sales must be >= to 0') - - self._gross_sales = sales - - @property - def commission_rate(self): - return self._commission_rate - - @commission_rate.setter - def commission_rate(self, rate): - """Set commission rate or raise ValueError if invalid.""" - if not (Decimal('0.0') < rate < Decimal('1.0')): - raise ValueError( - 'Interest rate must be greater than 0 and less than 1') - - self._commission_rate = rate - - def earnings(self): - """Calculate earnings.""" - return self.gross_sales * self.commission_rate - - def __repr__(self): - """Return string representation for repr().""" - return ('CommissionEmployee: ' + - f'{self.first_name} {self.last_name}\n' + - f'social security number: {self.ssn}\n' + - f'gross sales: {self.gross_sales:.2f}\n' + - f'commission rate: {self.commission_rate:.2f}') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_ipynb/complexnumber.py b/examples/ch10/snippets_ipynb/complexnumber.py deleted file mode 100755 index cab8de4..0000000 --- a/examples/ch10/snippets_ipynb/complexnumber.py +++ /dev/null @@ -1,44 +0,0 @@ -# complexnumber.py -"""Complex class with overloaded operators.""" - -class Complex: - """Complex class that represents a complex number - with real and imaginary parts.""" - - def __init__(self, real, imaginary): - """Initialize Complex class's attributes.""" - self.real = real - self.imaginary = imaginary - - def __add__(self, right): - """Overrides the + operator.""" - return Complex(self.real + right.real, - self.imaginary + right.imaginary) - - def __iadd__(self, right): - """Overrides the += operator.""" - self.real += right.real - self.imaginary += right.imaginary - return self - - def __repr__(self): - """Return string representation for repr().""" - return (f'({self.real}' + - (' + ' if self.imaginary >= 0 else ' - ') + - f'{abs(self.imaginary)}i)') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_ipynb/complexnumber2.py b/examples/ch10/snippets_ipynb/complexnumber2.py deleted file mode 100755 index b2c7652..0000000 --- a/examples/ch10/snippets_ipynb/complexnumber2.py +++ /dev/null @@ -1,55 +0,0 @@ -# complexnumber2.py -"""Complex class with overloaded operators.""" - -class Complex: - """Complex class that represents a complex number - with real and imaginary parts.""" - - def __init__(self, real, imaginary): - """Initialize Complex class's attributes.""" - self.real = real - self.imaginary = imaginary - - def __add__(self, right): - """Overrides the + operator.""" - return Complex(self.real + right.real, - self.imaginary + right.imaginary) - - def __iadd__(self, right): - """Overrides the += operator.""" - self.real += right.real - self.imaginary += right.imaginary - return self - - def __sub__(self, right): - """Overrides the - operator.""" - return Complex(self.real - right.real, - self.imaginary - right.imaginary) - - def __isub__(self, right): - """Overrides the -= operator.""" - self.real -= right.real - self.imaginary -= right.imaginary - return self - - def __repr__(self): - """Return string representation for repr().""" - return (f'({self.real}' + - (' + ' if self.imaginary >= 0 else ' - ') + - f'{abs(self.imaginary)}i)') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_ipynb/deck.py b/examples/ch10/snippets_ipynb/deck.py deleted file mode 100755 index 21e10b3..0000000 --- a/examples/ch10/snippets_ipynb/deck.py +++ /dev/null @@ -1,57 +0,0 @@ -# deck.py -"""Deck class represents a deck of Cards.""" -import random -from card import Card - -class DeckOfCards: - NUMBER_OF_CARDS = 52 # constant number of Cards - - def __init__(self): - """Initialize the deck.""" - self._current_card = 0 - self._deck = [] - - for count in range(DeckOfCards.NUMBER_OF_CARDS): - self._deck.append(Card(Card.FACES[count % 13], - Card.SUITS[count // 13])) - - def shuffle(self): - """Shuffle deck.""" - self._current_card = 0 - random.shuffle(self._deck) - - def deal_card(self): - """Return one Card.""" - try: - card = self._deck[self._current_card] - self._current_card += 1 - return card - except: - return None - - def __str__(self): - """Return a string representation of the current _deck.""" - s = '' - - for index, card in enumerate(self._deck): - s += f'{self._deck[index]:<19}' - if (index + 1) % 4 == 0: - s += '\n' - - return s - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_ipynb/deck2.py b/examples/ch10/snippets_ipynb/deck2.py deleted file mode 100755 index d33c535..0000000 --- a/examples/ch10/snippets_ipynb/deck2.py +++ /dev/null @@ -1,57 +0,0 @@ -# deck.py -"""Deck class represents a deck of Cards.""" -import random -from carddataclass import Card - -class DeckOfCards: - NUMBER_OF_CARDS = 52 # constant number of Cards - - def __init__(self): - """Initialize the deck.""" - self.current_card = 0 - self._deck = [] - - for count in range(DeckOfCards.NUMBER_OF_CARDS): - self._deck.append(Card(Card.FACES[count % 13], - Card.SUITS[count // 13])) - - def shuffle(self): - """Shuffle deck.""" - self.current_card = 0 - random.shuffle(self._deck) - - def deal_card(self): - """Return one Card.""" - try: - card = self._deck[self.current_card] - self.current_card += 1 - return card - except: - return None - - def __str__(self): - """Return a string representation of the current _deck.""" - s = '' - - for index, card in enumerate(self._deck): - s += f'{self.deal_card():<19}' - if (index + 1) % 4 == 0: - s += '\n' - - return s - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_ipynb/files/art/check.png b/examples/ch10/snippets_ipynb/files/art/check.png deleted file mode 100755 index eea18cd..0000000 Binary files a/examples/ch10/snippets_ipynb/files/art/check.png and /dev/null differ diff --git a/examples/ch10/snippets_ipynb/private.py b/examples/ch10/snippets_ipynb/private.py deleted file mode 100755 index 59d4f9e..0000000 --- a/examples/ch10/snippets_ipynb/private.py +++ /dev/null @@ -1,26 +0,0 @@ -# private.py -"""Class with public and private attributes.""" - -class PrivateClass: - """Class with public and private attributes.""" - - def __init__(self): - """Initialize the public and private attributes.""" - self.public_data = "public" # public attribute - self.__private_data = "private" # private attribute - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_ipynb/salariedcommissionemployee.py b/examples/ch10/snippets_ipynb/salariedcommissionemployee.py deleted file mode 100755 index f069b71..0000000 --- a/examples/ch10/snippets_ipynb/salariedcommissionemployee.py +++ /dev/null @@ -1,53 +0,0 @@ -# salariedcommissionemployee.py -"""SalariedCommissionEmployee derived from CommissionEmployee.""" -from commissionemployee import CommissionEmployee -from decimal import Decimal - -class SalariedCommissionEmployee(CommissionEmployee): - """An employee who gets paid a salary plus - commission based on gross sales.""" - - def __init__(self, first_name, last_name, ssn, - gross_sales, commission_rate, base_salary): - """Initialize SalariedCommissionEmployee's attributes.""" - super().__init__(first_name, last_name, ssn, - gross_sales, commission_rate) - self.base_salary = base_salary # validate via property - - @property - def base_salary(self): - return self._base_salary - - @base_salary.setter - def base_salary(self, salary): - """Set base salary or raise ValueError if invalid.""" - if salary < Decimal('0.00'): - raise ValueError('Base salary must be >= to 0') - - self._base_salary = salary - - def earnings(self): - """Calculate earnings.""" - return super().earnings() + self.base_salary - - def __repr__(self): - """Return string representation for repr().""" - return ('Salaried' + super().__repr__() + - f'\nbase salary: {self.base_salary:.2f}') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_ipynb/timewithproperties.py b/examples/ch10/snippets_ipynb/timewithproperties.py deleted file mode 100755 index 8e382ba..0000000 --- a/examples/ch10/snippets_ipynb/timewithproperties.py +++ /dev/null @@ -1,93 +0,0 @@ -# timewithproperties.py -"""Class Time with read-write properties.""" - -class Time: - """Class Time with read-write properties.""" - - def __init__(self, hour=0, minute=0, second=0): - """Initialize each attribute.""" - self.hour = hour # 0-23 - self.minute = minute # 0-59 - self.second = second # 0-59 - - @property - def hour(self): - """Return the hour.""" - return self._hour - - @hour.setter - def hour(self, hour): - """Set the hour.""" - if not (0 <= hour < 24): - raise ValueError(f'Hour ({hour}) must be 0-23') - - self._hour = hour - - @property - def minute(self): - """Return the minute.""" - return self._minute - - @minute.setter - def minute(self, minute): - """Set the minute.""" - if not (0 <= minute < 60): - raise ValueError(f'Minute ({minute}) must be 0-59') - - self._minute = minute - - @property - def second(self): - """Return the second.""" - return self._second - - @second.setter - def second(self, second): - """Set the second.""" - if not (0 <= second < 60): - raise ValueError(f'Second ({second}) must be 0-59') - - self._second = second - - def set_time(self, hour=0, minute=0, second=0): - """Set values of hour, minute, and second.""" - self.hour = hour - self.minute = minute - self.second = second - - @property - def time(self): - """Return hour, minute and second as a tuple.""" - return (self.hour, self.minute, self.second) - - @time.setter - def time(self, time_tuple): - """Set time from a tuple containing hour, minute and second.""" - self.set_time(time_tuple[0], time_tuple[1], time_tuple[2]) - - def __repr__(self): - """Return Time string for repr().""" - return (f'Time(hour={self.hour}, minute={self.minute}, ' + - f'second={self.second})') - - def __str__(self): - """Return Time string in 12-hour clock format.""" - return (('12' if self.hour in (0, 12) else str(self.hour % 12)) + - f':{self.minute:0>2}:{self.second:0>2}' + - (' AM' if self.hour < 12 else ' PM')) - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/10_02.01.py b/examples/ch10/snippets_py/10_02.01.py deleted file mode 100755 index abe7a78..0000000 --- a/examples/ch10/snippets_py/10_02.01.py +++ /dev/null @@ -1,42 +0,0 @@ -# Section 10.2.1 and 10.2.2 Snippets - -# Importing Classes Account and Decimal -from account import Account - -from decimal import Decimal - -# Create an Account Object with a Constructor Expression -account1 = Account('John Green', Decimal('50.00')) - -# Getting an Account’s Name and Balance -account1.name - -account1.balance - -# Depositing Money into an Account -account1.deposit(Decimal('25.53')) - -account1.balance - -# Account Methods Perform Validation -account1.deposit(Decimal('-123.45')) - -# Section 10.2.2 -# Defining a Class -Account? - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/10_02.03selfcheck.py b/examples/ch10/snippets_py/10_02.03selfcheck.py deleted file mode 100755 index 434e857..0000000 --- a/examples/ch10/snippets_py/10_02.03selfcheck.py +++ /dev/null @@ -1,33 +0,0 @@ -# Section 10.2.3 Self Check snippets - -# Exercise 3 -from account import Account - -from decimal import Decimal - -account1 = Account('John Green', Decimal('50.00')) - -account1.withdraw(Decimal('20.00')) - -account1.balance - -account1.withdraw(Decimal('100.00')) - -account1.withdraw(Decimal('-10.00')) - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/10_03.py b/examples/ch10/snippets_py/10_03.py deleted file mode 100755 index 9151f91..0000000 --- a/examples/ch10/snippets_py/10_03.py +++ /dev/null @@ -1,30 +0,0 @@ -# Section 10.3 snippets - -from account import Account - -from decimal import Decimal - -account1 = Account('John Green', Decimal('50.00')) - -account1.balance - -account1.balance = Decimal('-1000.00') - -account1.balance - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/10_04.01.py b/examples/ch10/snippets_py/10_04.01.py deleted file mode 100755 index 6ac514e..0000000 --- a/examples/ch10/snippets_py/10_04.01.py +++ /dev/null @@ -1,44 +0,0 @@ -# Section 10.4.1 snippets - -from timewithproperties import Time - -# Creating a `Time` Object -wake_up = Time(hour=6, minute=30) - -# Displaying a `Time` Object -wake_up - -print(wake_up) - -# Getting an Attribute Via a Property -wake_up.hour - -# Setting the `Time` -wake_up.set_time(hour=7, minute=45) - -wake_up - -# Setting an Attribute via a Property -wake_up.hour = 6 - -wake_up - -# Attempting to Set an Invalid Value -wake_up.hour = 100 - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/10_04.02selfcheck.py b/examples/ch10/snippets_py/10_04.02selfcheck.py deleted file mode 100755 index 41078de..0000000 --- a/examples/ch10/snippets_py/10_04.02selfcheck.py +++ /dev/null @@ -1,32 +0,0 @@ -# Section 10.4.2 Self Check snippets - -# Exercise 3 -from timewithproperties import Time - -t = Time() - -t - -t.time = (12, 30, 45) - -t - -t.time - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/10_04.03.py b/examples/ch10/snippets_py/10_04.03.py deleted file mode 100755 index 9b780e1..0000000 --- a/examples/ch10/snippets_py/10_04.03.py +++ /dev/null @@ -1,28 +0,0 @@ -# Section 10.4.3 snippets - -# Attributes Are Always Accessible -from timewithproperties import Time - -wake_up = Time(hour=7, minute=45, second=30) - -wake_up._hour - -wake_up._hour = 100 - -wake_up - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/10_05.py b/examples/ch10/snippets_py/10_05.py deleted file mode 100755 index dc6888f..0000000 --- a/examples/ch10/snippets_py/10_05.py +++ /dev/null @@ -1,33 +0,0 @@ -# Section 10.5 snippets - -from private import PrivateClass - -my_object = PrivateClass() - -my_object.public_data - -my_object.__private_data - -# Self Check Exercise 3 -my_object._PrivateClass__private_data - -my_object._PrivateClass__private_data = 'modified' - -my_object._PrivateClass__private_data - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/10_06.01.py b/examples/ch10/snippets_py/10_06.01.py deleted file mode 100755 index 211b659..0000000 --- a/examples/ch10/snippets_py/10_06.01.py +++ /dev/null @@ -1,39 +0,0 @@ -# Section 10.6.1 snippets - -# Creating, Shuffling and Dealing the Cards -from deck import DeckOfCards - -deck_of_cards = DeckOfCards() - -print(deck_of_cards) - -deck_of_cards.shuffle() - -print(deck_of_cards) - -# Dealing Cards -deck_of_cards.deal_card() - -# Class Card’s Other Features -card = deck_of_cards.deal_card() - -str(card) - -card.image_name - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/10_06.04.py b/examples/ch10/snippets_py/10_06.04.py deleted file mode 100755 index dd7b1db..0000000 --- a/examples/ch10/snippets_py/10_06.04.py +++ /dev/null @@ -1,59 +0,0 @@ -# Section 10.6.4 snippets - -from deck import DeckOfCards - -deck_of_cards = DeckOfCards() - -# Enable Matplotlib in IPython -%matplotlib - -# Create the Base `Path` for Each Image -from pathlib import Path - -path = Path('.').joinpath('card_images') - -# Import the Matplotlib Features -import matplotlib.pyplot as plt - -import matplotlib.image as mpimg - -# Create the `Figure` and `Axes` Objects -figure, axes_list = plt.subplots(nrows=4, ncols=13) - -# Configure the `Axes` Objects and Display the Images -for axes in axes_list.ravel(): - axes.get_xaxis().set_visible(False) - axes.get_yaxis().set_visible(False) - image_name = deck_of_cards.deal_card().image_name - img = mpimg.imread(str(path.joinpath(image_name).resolve())) - axes.imshow(img) - -# Maximize the Image Sizes -figure.tight_layout() - -### Shuffle and Re-Deal the Deck -deck_of_cards.shuffle() - -for axes in axes_list.ravel(): - axes.get_xaxis().set_visible(False) - axes.get_yaxis().set_visible(False) - image_name = deck_of_cards.deal_card().image_name - img = mpimg.imread(str(path.joinpath(image_name).resolve())) - axes.imshow(img) - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/10_06.04selfcheck.py b/examples/ch10/snippets_py/10_06.04selfcheck.py deleted file mode 100755 index bc6cda6..0000000 --- a/examples/ch10/snippets_py/10_06.04selfcheck.py +++ /dev/null @@ -1,32 +0,0 @@ -# Section 10.6.4 Self Check snippets - -# Exercise 3 -deck_of_cards.shuffle() - -figure, axes_list = plt.subplots(nrows=2, ncols=5) - -for axes in axes_list.ravel(): - axes.get_xaxis().set_visible(False) - axes.get_yaxis().set_visible(False) - image_name = deck_of_cards.deal_card().image_name - img = mpimg.imread(str(path.joinpath(image_name).resolve())) - axes.imshow(img) - -figure.tight_layout() - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/10_08.py b/examples/ch10/snippets_py/10_08.py deleted file mode 100755 index 44f4cc2..0000000 --- a/examples/ch10/snippets_py/10_08.py +++ /dev/null @@ -1,75 +0,0 @@ -# Section 10.8.1 snippets - -# 10.8.1 Base Class CommissionEmployee - -# Testing Class CommissionEmployee -from commissionemployee import CommissionEmployee - -from decimal import Decimal - -c = CommissionEmployee('Sue', 'Jones', '333-33-3333', - Decimal('10000.00'), Decimal('0.06')) - -c - -print(f'{c.earnings():,.2f}') - -c.gross_sales = Decimal('20000.00') - -c.commission_rate = Decimal('0.1') - -print(f'{c.earnings():,.2f}') - -# 10.8.2 Subclass SalariedCommissionEmployee - -# Testing Class SalariedCommissionEmployee - -from salariedcommissionemployee import SalariedCommissionEmployee - -s = SalariedCommissionEmployee('Bob', 'Lewis', '444-44-4444', - Decimal('5000.00'), Decimal('0.04'), Decimal('300.00')) - -print(s.first_name, s.last_name, s.ssn, s.gross_sales, - s.commission_rate, s.base_salary) - -print(f'{s.earnings():,.2f}') - -s.gross_sales = Decimal('10000.00') - -s.commission_rate = Decimal('0.05') - -s.base_salary = Decimal('1000.00') - -print(s) - -print(f'{s.earnings():,.2f}') - -# Testing the "is a" Relationship -issubclass(SalariedCommissionEmployee, CommissionEmployee) - -isinstance(s, CommissionEmployee) - -isinstance(s, SalariedCommissionEmployee) - -# Processing CommissionEmployees and SalariedCommissionEmployees Polymorphically -employees = [c, s] - -for employee in employees: - print(employee) - print(f'{employee.earnings():,.2f}\n') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/10_09.py b/examples/ch10/snippets_py/10_09.py deleted file mode 100755 index c286788..0000000 --- a/examples/ch10/snippets_py/10_09.py +++ /dev/null @@ -1,42 +0,0 @@ -# Section 10.9 snippets - -class WellPaidDuck: - def __repr__(self): - return 'I am a well-paid duck' - def earnings(self): - return Decimal('1_000_000.00') - -from decimal import Decimal - -from commissionemployee import CommissionEmployee - -from salariedcommissionemployee import SalariedCommissionEmployee - -c = CommissionEmployee('Sue', 'Jones', '333-33-3333', - Decimal('10000.00'), Decimal('0.06')) - -s = SalariedCommissionEmployee('Bob', 'Lewis', '444-44-4444', - Decimal('5000.00'), Decimal('0.04'), Decimal('300.00')) - -d = WellPaidDuck() - -employees = [c, s, d] - -for employee in employees: - print(employee) - print(f'{employee.earnings():,.2f}\n') - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/10_10.01.py b/examples/ch10/snippets_py/10_10.01.py deleted file mode 100755 index b760d72..0000000 --- a/examples/ch10/snippets_py/10_10.01.py +++ /dev/null @@ -1,40 +0,0 @@ -# Section 10.10.1 snippets - -from complexnumber import Complex - -x = Complex(real=2, imaginary=4) - -x - -y = Complex(real=5, imaginary=-1) - -y - -x + y - -x - -y - -x += y - -x - -y - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/10_10.02selfcheck.py b/examples/ch10/snippets_py/10_10.02selfcheck.py deleted file mode 100755 index 6c93a9e..0000000 --- a/examples/ch10/snippets_py/10_10.02selfcheck.py +++ /dev/null @@ -1,36 +0,0 @@ -# Section 10.10.2 Self Check snippets - -# Exercise 3 -from complexnumber2 import Complex - -x = Complex(real=2, imaginary=4) - -y = Complex(real=5, imaginary=-1) - -x - y - -x -= y - -x - -y - - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/10_12.py b/examples/ch10/snippets_py/10_12.py deleted file mode 100755 index 1df875c..0000000 --- a/examples/ch10/snippets_py/10_12.py +++ /dev/null @@ -1,39 +0,0 @@ -# Section 10.12 snippets - -from collections import namedtuple - -Card = namedtuple('Card', ['face', 'suit']) - -card = Card(face='Ace', suit='Spades') - -card.face - -card.suit - -card - -# Other Named Tuple Features -values = ['Queen', 'Hearts'] - -card = Card._make(values) - -card - -card._asdict() - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/10_12selfcheck.py b/examples/ch10/snippets_py/10_12selfcheck.py deleted file mode 100755 index 902e56f..0000000 --- a/examples/ch10/snippets_py/10_12selfcheck.py +++ /dev/null @@ -1,30 +0,0 @@ -# Section 10.12 Self Check snippets - -# Exercise 2 -from collections import namedtuple - -Time = namedtuple('Time', ['hour', 'minute', 'second']) - -t = Time(13, 30, 45) - -print(t.hour, t.minute, t.second) - -t - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/10_13.01.py b/examples/ch10/snippets_py/10_13.01.py deleted file mode 100644 index d1538cc..0000000 --- a/examples/ch10/snippets_py/10_13.01.py +++ /dev/null @@ -1,24 +0,0 @@ -# Section 10.13.1 snippets - -from dataclasses import dataclass - -@dataclass -class Demo: - x # attempting to create a data attribute x - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/10_13.02.py b/examples/ch10/snippets_py/10_13.02.py deleted file mode 100644 index d1fb42d..0000000 --- a/examples/ch10/snippets_py/10_13.02.py +++ /dev/null @@ -1,53 +0,0 @@ -# Section 10.13.2 snippets - -from carddataclass import Card -from carddataclass import Card - -c1 = Card(Card.FACES[0], Card.SUITS[3]) - -c1 - -print(c1) - -c1.face - -c1.suit - -c1.image_name - -c2 = Card(Card.FACES[0], Card.SUITS[3]) - -c2 - -c3 = Card(Card.FACES[0], Card.SUITS[0]) - -c3 - -c1 == c2 - -c1 == c3 - -c1 != c3 - -from deck2 import DeckOfCards # uses Card data class - -deck_of_cards = DeckOfCards() - -print(deck_of_cards) - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/10_13.02selfcheck.py b/examples/ch10/snippets_py/10_13.02selfcheck.py deleted file mode 100755 index d9c0ff2..0000000 --- a/examples/ch10/snippets_py/10_13.02selfcheck.py +++ /dev/null @@ -1,33 +0,0 @@ -# Section 10.13.2 Self Check snippets - -# Exercise 1 -from carddataclass import Card - -c = Card('Ace', 'Spades') - -c - -type(c.face) - -c.face = 100 - -c - -type(c.face) - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/10_15.py b/examples/ch10/snippets_py/10_15.py deleted file mode 100755 index 5193f88..0000000 --- a/examples/ch10/snippets_py/10_15.py +++ /dev/null @@ -1,28 +0,0 @@ -# Section 10.15 snippets -z = 'global z' - -def print_variables(): - y = 'local y in print_variables' - print(y) - print(z) - -print_variables() - -y - -z - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/10_16.py b/examples/ch10/snippets_py/10_16.py deleted file mode 100644 index dd1bca8..0000000 --- a/examples/ch10/snippets_py/10_16.py +++ /dev/null @@ -1,104 +0,0 @@ -# Section 10.16 Snippets -# This file includes the Self Check snippets which continue from the section body. - -# Time Series -# Simple Linear Regression -# Linear Relationships - -c = lambda f: 5 / 9 * (f - 32) - -temps = [(f, c(f)) for f in range(0, 101, 10)] - -import pandas as pd - -temps_df = pd.DataFrame(temps, columns=['Fahrenheit', 'Celsius']) - -axes = temps_df.plot(x='Fahrenheit', y='Celsius', style='.-') - -y_label = axes.set_ylabel('Celsius') - -# Components of the Simple Linear Regression Equation -# SciPy’s stats Module -# Pandas -# Seaborn Visualization -# Getting Weather Data from NOAA - -# Loading the Average High Temperatures into a DataFrame -nyc = pd.read_csv('ave_hi_nyc_jan_1895-2018.csv') - -nyc.head() - -nyc.tail() - -# Cleaning the Data -nyc.columns = ['Date', 'Temperature', 'Anomaly'] - -nyc.head(3) - -nyc.Date.dtype - -nyc.Date = nyc.Date.floordiv(100) - -nyc.head(3) - -# Calculating Basic Descriptive Statistics for the Dataset -pd.set_option('precision', 2) - -nyc.Temperature.describe() - -# Forecasting Future January Average High Temperatures -from scipy import stats - -linear_regression = stats.linregress(x=nyc.Date, - y=nyc.Temperature) - -linear_regression.slope - -linear_regression.intercept - -linear_regression.slope * 2019 + linear_regression.intercept - -linear_regression.slope * 1850 + linear_regression.intercept - -# Plotting the Average High Temperatures and a Regression Line -import seaborn as sns - -sns.set_style('whitegrid') - -axes = sns.regplot(x=nyc.Date, y=nyc.Temperature) - -axes.set_ylim(10, 70) - -# Getting Time Series Datasets - -# Self Check Exercises -# Exercise 3 -year = 2019 - -slope = linear_regression.slope - -intercept = linear_regression.intercept - -temperature = slope * year + intercept - -while temperature < 40.0: - year += 1 - temperature = slope * year + intercept - -year - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/account.py b/examples/ch10/snippets_py/account.py deleted file mode 100755 index 914f8a4..0000000 --- a/examples/ch10/snippets_py/account.py +++ /dev/null @@ -1,53 +0,0 @@ -# account.py -"""Account class definition.""" -from decimal import Decimal - -class Account: - """Account class for maintaining a bank account balance.""" - - def __init__(self, name, balance): - """Initialize an Account object.""" - - # if balance is less than 0.00, raise an exception - if balance < Decimal('0.00'): - raise ValueError('Initial balance must be >= to 0.00.') - - self.name = name - self.balance = balance - - def deposit(self, amount): - """Deposit money to the account.""" - - # if amount is less than 0.00, raise an exception - if amount < Decimal('0.00'): - raise ValueError('amount must be positive.') - - self.balance += amount - - def withdraw(self, amount): - """Withdraw money from the account.""" - - # if amount is greater than balance, raise an exception - if amount > self.balance: - raise ValueError('amount must be <= to balance.') - elif amount < Decimal('0.00'): - raise ValueError('amount must be positive.') - - self.balance -= amount - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/accountdoctest.py b/examples/ch10/snippets_py/accountdoctest.py deleted file mode 100755 index 8a40428..0000000 --- a/examples/ch10/snippets_py/accountdoctest.py +++ /dev/null @@ -1,57 +0,0 @@ -# accountdoctest.py -"""Account class definition.""" -from decimal import Decimal - -class Account: - """Account class for demonstrating doctest.""" - - def __init__(self, name, balance): - """Initialize an Account object. - - >>> account1 = Account('John Green', Decimal('50.00')) - >>> account1.name - 'John Green' - >>> account1.balance - Decimal('50.00') - - The balance argument must be greater than or equal to 0. - >>> account2 = Account('John Green', Decimal('-50.00')) - Traceback (most recent call last): - ... - ValueError: Initial balance must be >= to 0.00. - """ - - # if balance is less than 0.00, raise an exception - if balance < Decimal('0.00'): - raise ValueError('Initial balance must be >= to 0.00.') - - self.name = name - self.balance = balance - - def deposit(self, amount): - """Deposit money to the account.""" - - # if amount is less than 0.00, raise an exception - if amount < Decimal('0.00'): - raise ValueError('amount must be positive.') - - self.balance += amount - -if __name__ == '__main__': - import doctest - doctest.testmod(verbose=True) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/accountdoctest2.py b/examples/ch10/snippets_py/accountdoctest2.py deleted file mode 100755 index ffb2db1..0000000 --- a/examples/ch10/snippets_py/accountdoctest2.py +++ /dev/null @@ -1,68 +0,0 @@ -# accountdoctest2.py -"""Account class definition.""" -from decimal import Decimal - -class Account: - """Account class for demonstrating doctest.""" - - def __init__(self, name, balance): - """Initialize an Account object. - - >>> account1 = Account('John Green', Decimal('50.00')) - >>> account1.name - 'John Green' - >>> account1.balance - Decimal('50.00') - - The balance argument must be greater than or equal to 0. - >>> account2 = Account('John Green', Decimal('-50.00')) - Traceback (most recent call last): - ... - ValueError: Initial balance must be >= to 0.00. - """ - - # if balance is less than 0.00, raise an exception - if balance < Decimal('0.00'): - raise ValueError('Initial balance must be >= to 0.00.') - - self.name = name - self.balance = balance - - def deposit(self, amount): - """Deposit money to the account. - - >>> account1 = Account('John Green', Decimal('50.00')) - >>> account1.deposit(Decimal('10.55')) - >>> account1.balance - Decimal('60.55') - - >>> account1.deposit(Decimal('-100.00')) - Traceback (most recent call last): - ... - ValueError: amount must be positive. - """ - - # if amount is less than 0.00, raise an exception - if amount < Decimal('0.00'): - raise ValueError('amount must be positive.') - - self.balance += amount - -if __name__ == '__main__': - import doctest - doctest.testmod(verbose=True) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/ave_hi_la_jan_1895-2018.csv b/examples/ch10/snippets_py/ave_hi_la_jan_1895-2018.csv deleted file mode 100755 index 485d137..0000000 --- a/examples/ch10/snippets_py/ave_hi_la_jan_1895-2018.csv +++ /dev/null @@ -1,125 +0,0 @@ -Date,Value,Anomaly -189501,34.2,-3.2 -189601,34.7,-2.7 -189701,35.5,-1.9 -189801,39.6,2.2 -189901,36.4,-1.0 -190001,37.4,0.0 -190101,37.0,-0.4 -190201,35.0,-2.4 -190301,35.5,-1.9 -190401,29.8,-7.6 -190501,33.7,-3.7 -190601,42.3,4.9 -190701,40.5,3.1 -190801,38.3,0.9 -190901,39.6,2.2 -191001,36.1,-1.3 -191101,40.7,3.3 -191201,29.3,-8.1 -191301,46.9,9.5 -191401,36.9,-0.5 -191501,38.9,1.5 -191601,42.3,4.9 -191701,38.4,1.0 -191801,26.5,-10.9 -191901,40.6,3.2 -192001,29.7,-7.7 -192101,39.7,2.3 -192201,33.4,-4.0 -192301,35.2,-2.2 -192401,39.4,2.0 -192501,33.8,-3.6 -192601,37.2,-0.2 -192701,36.8,-0.6 -192801,40.0,2.6 -192901,37.8,0.4 -193001,38.5,1.1 -193101,38.2,0.8 -193201,47.6,10.2 -193301,45.6,8.2 -193401,39.8,2.4 -193501,35.0,-2.4 -193601,34.3,-3.1 -193701,45.7,8.3 -193801,37.3,-0.1 -193901,36.8,-0.6 -194001,30.0,-7.4 -194101,34.5,-2.9 -194201,36.5,-0.9 -194301,36.1,-1.3 -194401,39.0,1.6 -194501,31.5,-5.9 -194601,40.2,2.8 -194701,43.0,5.6 -194801,30.1,-7.3 -194901,43.5,6.1 -195001,47.6,10.2 -195101,42.5,5.1 -195201,42.4,5.0 -195301,42.4,5.0 -195401,37.0,-0.4 -195501,35.6,-1.8 -195601,36.2,-1.2 -195701,33.8,-3.6 -195801,36.4,-1.0 -195901,37.1,-0.3 -196001,37.8,0.4 -196101,31.9,-5.5 -196201,38.0,0.6 -196301,34.6,-2.8 -196401,40.2,2.8 -196501,34.0,-3.4 -196601,37.1,-0.3 -196701,41.6,4.2 -196801,31.7,-5.7 -196901,35.7,-1.7 -197001,29.9,-7.5 -197101,31.5,-5.9 -197201,40.5,3.1 -197301,40.6,3.2 -197401,39.7,2.3 -197501,41.7,4.3 -197601,32.6,-4.8 -197701,26.1,-11.3 -197801,32.3,-5.1 -197901,38.6,1.2 -198001,38.0,0.6 -198101,30.6,-6.8 -198201,30.9,-6.5 -198301,38.0,0.6 -198401,33.5,-3.9 -198501,33.0,-4.4 -198601,39.3,1.9 -198701,35.9,-1.5 -198801,34.2,-3.2 -198901,42.4,5.0 -199001,46.0,8.6 -199101,39.6,2.2 -199201,40.9,3.5 -199301,41.0,3.6 -199401,31.6,-5.8 -199501,42.6,5.2 -199601,37.0,-0.4 -199701,39.2,1.8 -199801,45.8,8.4 -199901,40.8,3.4 -200001,37.8,0.4 -200101,38.8,1.4 -200201,45.4,8.0 -200301,32.9,-4.5 -200401,31.0,-6.4 -200501,37.4,0.0 -200601,47.6,10.2 -200701,43.6,6.2 -200801,42.4,5.0 -200901,33.4,-4.0 -201001,38.1,0.7 -201101,34.8,-2.6 -201201,44.2,6.8 -201301,40.8,3.4 -201401,35.5,-1.9 -201501,36.1,-1.3 -201601,40.8,3.4 -201701,42.8,5.4 -201801,38.7,1.3 \ No newline at end of file diff --git a/examples/ch10/snippets_py/ave_hi_nyc_jan_1895-2018.csv b/examples/ch10/snippets_py/ave_hi_nyc_jan_1895-2018.csv deleted file mode 100755 index 485d137..0000000 --- a/examples/ch10/snippets_py/ave_hi_nyc_jan_1895-2018.csv +++ /dev/null @@ -1,125 +0,0 @@ -Date,Value,Anomaly -189501,34.2,-3.2 -189601,34.7,-2.7 -189701,35.5,-1.9 -189801,39.6,2.2 -189901,36.4,-1.0 -190001,37.4,0.0 -190101,37.0,-0.4 -190201,35.0,-2.4 -190301,35.5,-1.9 -190401,29.8,-7.6 -190501,33.7,-3.7 -190601,42.3,4.9 -190701,40.5,3.1 -190801,38.3,0.9 -190901,39.6,2.2 -191001,36.1,-1.3 -191101,40.7,3.3 -191201,29.3,-8.1 -191301,46.9,9.5 -191401,36.9,-0.5 -191501,38.9,1.5 -191601,42.3,4.9 -191701,38.4,1.0 -191801,26.5,-10.9 -191901,40.6,3.2 -192001,29.7,-7.7 -192101,39.7,2.3 -192201,33.4,-4.0 -192301,35.2,-2.2 -192401,39.4,2.0 -192501,33.8,-3.6 -192601,37.2,-0.2 -192701,36.8,-0.6 -192801,40.0,2.6 -192901,37.8,0.4 -193001,38.5,1.1 -193101,38.2,0.8 -193201,47.6,10.2 -193301,45.6,8.2 -193401,39.8,2.4 -193501,35.0,-2.4 -193601,34.3,-3.1 -193701,45.7,8.3 -193801,37.3,-0.1 -193901,36.8,-0.6 -194001,30.0,-7.4 -194101,34.5,-2.9 -194201,36.5,-0.9 -194301,36.1,-1.3 -194401,39.0,1.6 -194501,31.5,-5.9 -194601,40.2,2.8 -194701,43.0,5.6 -194801,30.1,-7.3 -194901,43.5,6.1 -195001,47.6,10.2 -195101,42.5,5.1 -195201,42.4,5.0 -195301,42.4,5.0 -195401,37.0,-0.4 -195501,35.6,-1.8 -195601,36.2,-1.2 -195701,33.8,-3.6 -195801,36.4,-1.0 -195901,37.1,-0.3 -196001,37.8,0.4 -196101,31.9,-5.5 -196201,38.0,0.6 -196301,34.6,-2.8 -196401,40.2,2.8 -196501,34.0,-3.4 -196601,37.1,-0.3 -196701,41.6,4.2 -196801,31.7,-5.7 -196901,35.7,-1.7 -197001,29.9,-7.5 -197101,31.5,-5.9 -197201,40.5,3.1 -197301,40.6,3.2 -197401,39.7,2.3 -197501,41.7,4.3 -197601,32.6,-4.8 -197701,26.1,-11.3 -197801,32.3,-5.1 -197901,38.6,1.2 -198001,38.0,0.6 -198101,30.6,-6.8 -198201,30.9,-6.5 -198301,38.0,0.6 -198401,33.5,-3.9 -198501,33.0,-4.4 -198601,39.3,1.9 -198701,35.9,-1.5 -198801,34.2,-3.2 -198901,42.4,5.0 -199001,46.0,8.6 -199101,39.6,2.2 -199201,40.9,3.5 -199301,41.0,3.6 -199401,31.6,-5.8 -199501,42.6,5.2 -199601,37.0,-0.4 -199701,39.2,1.8 -199801,45.8,8.4 -199901,40.8,3.4 -200001,37.8,0.4 -200101,38.8,1.4 -200201,45.4,8.0 -200301,32.9,-4.5 -200401,31.0,-6.4 -200501,37.4,0.0 -200601,47.6,10.2 -200701,43.6,6.2 -200801,42.4,5.0 -200901,33.4,-4.0 -201001,38.1,0.7 -201101,34.8,-2.6 -201201,44.2,6.8 -201301,40.8,3.4 -201401,35.5,-1.9 -201501,36.1,-1.3 -201601,40.8,3.4 -201701,42.8,5.4 -201801,38.7,1.3 \ No newline at end of file diff --git a/examples/ch10/snippets_py/card.py b/examples/ch10/snippets_py/card.py deleted file mode 100755 index a4fcb9b..0000000 --- a/examples/ch10/snippets_py/card.py +++ /dev/null @@ -1,56 +0,0 @@ -# card.py -"""Card class that represents a playing card and its image file name.""" - -class Card: - FACES = ['Ace', '2', '3', '4', '5', '6', - '7', '8', '9', '10', 'Jack', 'Queen', 'King'] - SUITS = ['Hearts', 'Diamonds', 'Clubs', 'Spades'] - - def __init__(self, face, suit): - """Initialize a Card with a face and suit.""" - self._face = face - self._suit = suit - - @property - def face(self): - """Return the Card's self._face value.""" - return self._face - - @property - def suit(self): - """Return the Card's self._suit value.""" - return self._suit - - @property - def image_name(self): - """Return the Card's image file name.""" - return str(self).replace(' ', '_') + '.png' - - def __repr__(self): - """Return string representation for repr().""" - return f"Card(face='{self.face}', suit='{self.suit}')" - - def __str__(self): - """Return string representation for str().""" - return f'{self.face} of {self.suit}' - - def __format__(self, format): - """Return formatted string representation.""" - return f'{str(self):{format}}' - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/carddataclass.py b/examples/ch10/snippets_py/carddataclass.py deleted file mode 100644 index c088145..0000000 --- a/examples/ch10/snippets_py/carddataclass.py +++ /dev/null @@ -1,46 +0,0 @@ -# carddataclass.py -"""Card data class with class attributes, data attributes, -autogenerated methods and explicitly defined methods.""" -from dataclasses import dataclass -from typing import ClassVar, List - -@dataclass -class Card: - FACES: ClassVar[List[str]] = ['Ace', '2', '3', '4', '5', '6', '7', - '8', '9', '10', 'Jack', 'Queen', 'King'] - SUITS: ClassVar[List[str]] = ['Hearts', 'Diamonds', 'Clubs', 'Spades'] - - face: str - suit: str - - @property - def image_name(self): - """Return the Card's image file name.""" - return str(self).replace(' ', '_') + '.png' - - def __str__(self): - """Return string representation for str().""" - return f'{self.face} of {self.suit}' - - def __format__(self, format): - """Return formatted string representation.""" - return f'{str(self):{format}}' - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/commissionemployee.py b/examples/ch10/snippets_py/commissionemployee.py deleted file mode 100755 index 0b00fa0..0000000 --- a/examples/ch10/snippets_py/commissionemployee.py +++ /dev/null @@ -1,81 +0,0 @@ -# commmissionemployee.py -"""CommissionEmployee base class.""" -from decimal import Decimal - -class CommissionEmployee: - """An employee who gets paid commission based on gross sales.""" - - def __init__(self, first_name, last_name, ssn, - gross_sales, commission_rate): - """Initialize CommissionEmployee's attributes.""" - self._first_name = first_name - self._last_name = last_name - self._ssn = ssn - self.gross_sales = gross_sales # validate via property - self.commission_rate = commission_rate # validate via property - - @property - def first_name(self): - return self._first_name - - @property - def last_name(self): - return self._last_name - - @property - def ssn(self): - return self._ssn - - @property - def gross_sales(self): - return self._gross_sales - - @gross_sales.setter - def gross_sales(self, sales): - """Set gross sales or raise ValueError if invalid.""" - if sales < Decimal('0.00'): - raise ValueError('Gross sales must be >= to 0') - - self._gross_sales = sales - - @property - def commission_rate(self): - return self._commission_rate - - @commission_rate.setter - def commission_rate(self, rate): - """Set commission rate or raise ValueError if invalid.""" - if not (Decimal('0.0') < rate < Decimal('1.0')): - raise ValueError( - 'Interest rate must be greater than 0 and less than 1') - - self._commission_rate = rate - - def earnings(self): - """Calculate earnings.""" - return self.gross_sales * self.commission_rate - - def __repr__(self): - """Return string representation for repr().""" - return ('CommissionEmployee: ' + - f'{self.first_name} {self.last_name}\n' + - f'social security number: {self.ssn}\n' + - f'gross sales: {self.gross_sales:.2f}\n' + - f'commission rate: {self.commission_rate:.2f}') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/complexnumber.py b/examples/ch10/snippets_py/complexnumber.py deleted file mode 100755 index cab8de4..0000000 --- a/examples/ch10/snippets_py/complexnumber.py +++ /dev/null @@ -1,44 +0,0 @@ -# complexnumber.py -"""Complex class with overloaded operators.""" - -class Complex: - """Complex class that represents a complex number - with real and imaginary parts.""" - - def __init__(self, real, imaginary): - """Initialize Complex class's attributes.""" - self.real = real - self.imaginary = imaginary - - def __add__(self, right): - """Overrides the + operator.""" - return Complex(self.real + right.real, - self.imaginary + right.imaginary) - - def __iadd__(self, right): - """Overrides the += operator.""" - self.real += right.real - self.imaginary += right.imaginary - return self - - def __repr__(self): - """Return string representation for repr().""" - return (f'({self.real}' + - (' + ' if self.imaginary >= 0 else ' - ') + - f'{abs(self.imaginary)}i)') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/complexnumber2.py b/examples/ch10/snippets_py/complexnumber2.py deleted file mode 100755 index b2c7652..0000000 --- a/examples/ch10/snippets_py/complexnumber2.py +++ /dev/null @@ -1,55 +0,0 @@ -# complexnumber2.py -"""Complex class with overloaded operators.""" - -class Complex: - """Complex class that represents a complex number - with real and imaginary parts.""" - - def __init__(self, real, imaginary): - """Initialize Complex class's attributes.""" - self.real = real - self.imaginary = imaginary - - def __add__(self, right): - """Overrides the + operator.""" - return Complex(self.real + right.real, - self.imaginary + right.imaginary) - - def __iadd__(self, right): - """Overrides the += operator.""" - self.real += right.real - self.imaginary += right.imaginary - return self - - def __sub__(self, right): - """Overrides the - operator.""" - return Complex(self.real - right.real, - self.imaginary - right.imaginary) - - def __isub__(self, right): - """Overrides the -= operator.""" - self.real -= right.real - self.imaginary -= right.imaginary - return self - - def __repr__(self): - """Return string representation for repr().""" - return (f'({self.real}' + - (' + ' if self.imaginary >= 0 else ' - ') + - f'{abs(self.imaginary)}i)') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/deck.py b/examples/ch10/snippets_py/deck.py deleted file mode 100755 index 21e10b3..0000000 --- a/examples/ch10/snippets_py/deck.py +++ /dev/null @@ -1,57 +0,0 @@ -# deck.py -"""Deck class represents a deck of Cards.""" -import random -from card import Card - -class DeckOfCards: - NUMBER_OF_CARDS = 52 # constant number of Cards - - def __init__(self): - """Initialize the deck.""" - self._current_card = 0 - self._deck = [] - - for count in range(DeckOfCards.NUMBER_OF_CARDS): - self._deck.append(Card(Card.FACES[count % 13], - Card.SUITS[count // 13])) - - def shuffle(self): - """Shuffle deck.""" - self._current_card = 0 - random.shuffle(self._deck) - - def deal_card(self): - """Return one Card.""" - try: - card = self._deck[self._current_card] - self._current_card += 1 - return card - except: - return None - - def __str__(self): - """Return a string representation of the current _deck.""" - s = '' - - for index, card in enumerate(self._deck): - s += f'{self._deck[index]:<19}' - if (index + 1) % 4 == 0: - s += '\n' - - return s - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/deck2.py b/examples/ch10/snippets_py/deck2.py deleted file mode 100755 index d33c535..0000000 --- a/examples/ch10/snippets_py/deck2.py +++ /dev/null @@ -1,57 +0,0 @@ -# deck.py -"""Deck class represents a deck of Cards.""" -import random -from carddataclass import Card - -class DeckOfCards: - NUMBER_OF_CARDS = 52 # constant number of Cards - - def __init__(self): - """Initialize the deck.""" - self.current_card = 0 - self._deck = [] - - for count in range(DeckOfCards.NUMBER_OF_CARDS): - self._deck.append(Card(Card.FACES[count % 13], - Card.SUITS[count // 13])) - - def shuffle(self): - """Shuffle deck.""" - self.current_card = 0 - random.shuffle(self._deck) - - def deal_card(self): - """Return one Card.""" - try: - card = self._deck[self.current_card] - self.current_card += 1 - return card - except: - return None - - def __str__(self): - """Return a string representation of the current _deck.""" - s = '' - - for index, card in enumerate(self._deck): - s += f'{self.deal_card():<19}' - if (index + 1) % 4 == 0: - s += '\n' - - return s - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/private.py b/examples/ch10/snippets_py/private.py deleted file mode 100755 index 59d4f9e..0000000 --- a/examples/ch10/snippets_py/private.py +++ /dev/null @@ -1,26 +0,0 @@ -# private.py -"""Class with public and private attributes.""" - -class PrivateClass: - """Class with public and private attributes.""" - - def __init__(self): - """Initialize the public and private attributes.""" - self.public_data = "public" # public attribute - self.__private_data = "private" # private attribute - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/salariedcommissionemployee.py b/examples/ch10/snippets_py/salariedcommissionemployee.py deleted file mode 100755 index 7f0ff12..0000000 --- a/examples/ch10/snippets_py/salariedcommissionemployee.py +++ /dev/null @@ -1,53 +0,0 @@ -# salariedcommissionemployee.py -"""SalariedCommissionEmployee derived from CommissionEmployee.""" -from commissionemployee import CommissionEmployee -from decimal import Decimal - -class SalariedCommissionEmployee(CommissionEmployee): - """An employee who gets paid a salary plus - commission based on gross sales.""" - - def __init__(self, first_name, last_name, ssn, - gross_sales, commission_rate, base_salary): - """Initialize SalariedCommissionEmployee's attributes.""" - super().__init__(first_name, last_name, ssn, - gross_sales, commission_rate) - self.base_salary = base_salary # validate via property - - @property - def base_salary(self): - return self._base_salary - - @base_salary.setter - def base_salary(self, salary): - """Set base salary or raise ValueError if invalid.""" - if salary < Decimal('0.00'): - raise ValueError('Base salary must be >= to 0') - - self._base_salary = salary - - def earnings(self): - """Calculate earnings.""" - return super().earnings() + self.base_salary - - def __repr__(self): - """Return string representation for repr().""" - return ('Salaried' + super().__repr__() + - f'\nbase salary: {self.base_salary:.2f}') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/snippets_py/timewithproperties.py b/examples/ch10/snippets_py/timewithproperties.py deleted file mode 100755 index 8e382ba..0000000 --- a/examples/ch10/snippets_py/timewithproperties.py +++ /dev/null @@ -1,93 +0,0 @@ -# timewithproperties.py -"""Class Time with read-write properties.""" - -class Time: - """Class Time with read-write properties.""" - - def __init__(self, hour=0, minute=0, second=0): - """Initialize each attribute.""" - self.hour = hour # 0-23 - self.minute = minute # 0-59 - self.second = second # 0-59 - - @property - def hour(self): - """Return the hour.""" - return self._hour - - @hour.setter - def hour(self, hour): - """Set the hour.""" - if not (0 <= hour < 24): - raise ValueError(f'Hour ({hour}) must be 0-23') - - self._hour = hour - - @property - def minute(self): - """Return the minute.""" - return self._minute - - @minute.setter - def minute(self, minute): - """Set the minute.""" - if not (0 <= minute < 60): - raise ValueError(f'Minute ({minute}) must be 0-59') - - self._minute = minute - - @property - def second(self): - """Return the second.""" - return self._second - - @second.setter - def second(self, second): - """Set the second.""" - if not (0 <= second < 60): - raise ValueError(f'Second ({second}) must be 0-59') - - self._second = second - - def set_time(self, hour=0, minute=0, second=0): - """Set values of hour, minute, and second.""" - self.hour = hour - self.minute = minute - self.second = second - - @property - def time(self): - """Return hour, minute and second as a tuple.""" - return (self.hour, self.minute, self.second) - - @time.setter - def time(self, time_tuple): - """Set time from a tuple containing hour, minute and second.""" - self.set_time(time_tuple[0], time_tuple[1], time_tuple[2]) - - def __repr__(self): - """Return Time string for repr().""" - return (f'Time(hour={self.hour}, minute={self.minute}, ' + - f'second={self.second})') - - def __str__(self): - """Return Time string in 12-hour clock format.""" - return (('12' if self.hour in (0, 12) else str(self.hour % 12)) + - f':{self.minute:0>2}:{self.second:0>2}' + - (' AM' if self.hour < 12 else ' PM')) - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch10/timewithproperties.py b/examples/ch10/timewithproperties.py deleted file mode 100755 index 5d57cca..0000000 --- a/examples/ch10/timewithproperties.py +++ /dev/null @@ -1,83 +0,0 @@ -# timewithproperties.py -"""Class Time with read-write properties.""" - -class Time: - """Class Time with read-write properties.""" - - def __init__(self, hour=0, minute=0, second=0): - """Initialize each attribute.""" - self.hour = hour # 0-23 - self.minute = minute # 0-59 - self.second = second # 0-59 - - @property - def hour(self): - """Return the hour.""" - return self._hour - - @hour.setter - def hour(self, hour): - """Set the hour.""" - if not (0 <= hour < 24): - raise ValueError(f'Hour ({hour}) must be 0-23') - - self._hour = hour - - @property - def minute(self): - """Return the minute.""" - return self._minute - - @minute.setter - def minute(self, minute): - """Set the minute.""" - if not (0 <= minute < 60): - raise ValueError(f'Minute ({minute}) must be 0-59') - - self._minute = minute - - @property - def second(self): - """Return the second.""" - return self._second - - @second.setter - def second(self, second): - """Set the second.""" - if not (0 <= second < 60): - raise ValueError(f'Second ({second}) must be 0-59') - - self._second = second - - def set_time(self, hour=0, minute=0, second=0): - """Set values of hour, minute, and second.""" - self.hour = hour - self.minute = minute - self.second = second - - def __repr__(self): - """Return Time string for repr().""" - return (f'Time(hour={self.hour}, minute={self.minute}, ' + - f'second={self.second})') - - def __str__(self): - """Return Time string in 12-hour clock format.""" - return (('12' if self.hour in (0, 12) else str(self.hour % 12)) + - f':{self.minute:0>2}:{self.second:0>2}' + - (' AM' if self.hour < 12 else ' PM')) - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch11/Quicksort.mp4 b/examples/ch11/Quicksort.mp4 deleted file mode 100644 index 2205cfa..0000000 Binary files a/examples/ch11/Quicksort.mp4 and /dev/null differ diff --git a/examples/ch11/binarysearch.py b/examples/ch11/binarysearch.py deleted file mode 100755 index 3a1f6cf..0000000 --- a/examples/ch11/binarysearch.py +++ /dev/null @@ -1,74 +0,0 @@ -# binarysearch.py -"""Use binary search to locate an item in an array.""" -import numpy as np - -def binary_search(data, key): - """Perform binary search of data looking for key.""" - low = 0 # low end of search area - high = len(data) - 1 # high end of search area - middle = (low + high + 1) // 2 # middle element index - location = -1 # return value -1 if not found - - # loop to search for element - while low <= high and location == -1: - # print remaining elements of array - print(remaining_elements(data, low, high)) - - print(' ' * middle, end='') # output spaces for alignment - print(' * ') # indicate current middle - - # if the element is found at the middle - if key == data[middle]: - location = middle # location is the current middle - elif key < data[middle]: # middle element is too high - high = middle - 1 # eliminate the higher half - else: # middle element is too low - low = middle + 1 # eliminate the lower half - - middle = (low + high + 1) // 2 # recalculate the middle - - return location # return location of search key - -def remaining_elements(data, low, high): - """Display remaining elements of the binary search.""" - return ' ' * low + ' '.join(str(s) for s in data[low:high + 1]) - -def main(): - # create and display array of random values - data = np.random.randint(10, 91, 15) - data.sort() - print(data, '\n') - - search_key = int(input('Enter an integer value (-1 to quit): ')) - - # repeatedly input an integer; -1 terminates the program - while search_key != -1: - location = binary_search(data, search_key) # perform search - - if location == -1: # not found - print(f'{search_key} was not found\n') - else: - print(f'{search_key} found in position {location}\n') - - search_key = int(input('Enter an integer value (-1 to quit): ')) - -# call main if this file is executed as a script -if __name__ == '__main__': - main() - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch11/ch11soundutilities.py b/examples/ch11/ch11soundutilities.py deleted file mode 100755 index 177fd23..0000000 --- a/examples/ch11/ch11soundutilities.py +++ /dev/null @@ -1,36 +0,0 @@ -# ch11soundutilities.py -"""Functions to play sounds.""" -from pysine import sine - -TWELFTH_ROOT_2 = 1.059463094359 # 12th root of 2 -A3 = 220 # hertz frequency for musical note A from third octave - -def play_sound(i, seconds=0.1): - """Play a note representing a bar's magnitude. Calculation - based on https://pages.mtu.edu/~suits/NoteFreqCalcs.html.""" - sine(frequency=(A3 * TWELFTH_ROOT_2 ** i), duration=seconds) - -def play_found_sound(seconds=0.1): - """Play sequence of notes indicating a found item.""" - sine(frequency=523.25, duration=seconds) # C5 - sine(frequency=698.46, duration=seconds) # F5 - sine(frequency=783.99, duration=seconds) # G5 - -def play_not_found_sound(seconds=0.3): - """Play a note indicating an item was not found.""" - sine(frequency=220, duration=seconds) # A3 - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch11/ch11utilities.py b/examples/ch11/ch11utilities.py deleted file mode 100755 index e20cb4f..0000000 --- a/examples/ch11/ch11utilities.py +++ /dev/null @@ -1,35 +0,0 @@ -# ch11utilities.py -"""Utility function for printing a pass of the -insertion_sort and selection_sort algorithms""" - -def print_pass(data, pass_number, index): - """Print a pass of the algorithm.""" - label = f'after pass {pass_number}: ' - print(label, end='') - - # output elements up to selected item - print(' '.join(str(d) for d in data[:index]), - end=' ' if index != 0 else '') - - print(f'{data[index]}* ', end='') # indicate swap with * - - # output rest of elements - print(' '.join(str(d) for d in data[index + 1:len(data)])) - - # underline elements that are sorted after this pass_number - print(f'{" " * len(label)}{"-- " * pass_number}') - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch11/insertionsort.py b/examples/ch11/insertionsort.py deleted file mode 100755 index 39bf85d..0000000 --- a/examples/ch11/insertionsort.py +++ /dev/null @@ -1,47 +0,0 @@ -# insertionsort.py -"""Sorting an array with insertion sort.""" -import numpy as np -from ch11utilities import print_pass - -def insertion_sort(data): - """Sort an array using insertion sort.""" - # loop over len(data) - 1 elements - for next in range(1, len(data)): - insert = data[next] # value to insert - move_item = next # location to place element - - # search for place to put current element - while move_item > 0 and data[move_item - 1] > insert: - # shift element right one slot - data[move_item] = data[move_item - 1] - move_item -= 1 - - data[move_item] = insert # place inserted element - print_pass(data, next, move_item) # output pass of algorithm - -def main(): - data = np.array([35, 73, 90, 65, 23, 86, 43, 81, 34, 58]) - print(f'Unsorted array: {data}\n') - insertion_sort(data) - print(f'\nSorted array: {data}\n') - -# call main if this file is executed as a script -if __name__ == '__main__': - main() - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch11/mergesort.py b/examples/ch11/mergesort.py deleted file mode 100755 index 8298052..0000000 --- a/examples/ch11/mergesort.py +++ /dev/null @@ -1,95 +0,0 @@ -# mergesort.py -"""Sorting an array with merge sort.""" -import numpy as np - -# calls recursive sort_array method to begin merge sorting -def merge_sort(data): - sort_array(data, 0, len(data) - 1) - -def sort_array(data, low, high): - """Split data, sort subarrays and merge them into sorted array.""" - # test base case size of array equals 1 - if (high - low) >= 1: # if not base case - middle1 = (low + high) // 2 # calculate middle of array - middle2 = middle1 + 1 # calculate next element over - - # output split step - print(f'split: {subarray_string(data, low, high)}') - print(f' {subarray_string(data, low, middle1)}') - print(f' {subarray_string(data, middle2, high)}\n') - - # split array in half then sort each half (recursive calls) - sort_array(data, low, middle1) # first half of array - sort_array(data, middle2, high) # second half of array - - # merge two sorted arrays after split calls return - merge(data, low, middle1, middle2, high) - -# merge two sorted subarrays into one sorted subarray -def merge(data, left, middle1, middle2, right): - left_index = left # index into left subarray - right_index = middle2 # index into right subarray - combined_index = left # index into temporary working array - merged = [0] * len(data) # working array - - # output two subarrays before merging - print(f'merge: {subarray_string(data, left, middle1)}') - print(f' {subarray_string(data, middle2, right)}') - - # merge arrays until reaching end of either - while left_index <= middle1 and right_index <= right: - # place smaller of two current elements into result - # and move to next space in arrays - if data[left_index] <= data[right_index]: - merged[combined_index] = data[left_index] - combined_index += 1 - left_index += 1 - else: - merged[combined_index] = data[right_index] - combined_index += 1 - right_index += 1 - - # if left array is empty - if left_index == middle2: # if True, copy in rest of right array - merged[combined_index:right + 1] = data[right_index:right + 1] - else: # right array is empty, copy in rest of left array - merged[combined_index:right + 1] = data[left_index:middle1 + 1] - - data[left:right + 1] = merged[left:right + 1] # copy back to data - - # output merged array - print(f' {subarray_string(data, left, right)}\n') - -# method to output certain values in array -def subarray_string(data, low, high): - temp = ' ' * low # spaces for alignment - temp += ' '.join(str(item) for item in data[low:high + 1]) - return temp - -def main(): - data = np.array([35, 73, 90, 65, 23, 86, 43, 81, 34, 58]) - print(f'Unsorted array: {data}\n') - merge_sort(data) - print(f'\nSorted array: {data}\n') - -# call main if this file is executed as a script -if __name__ == '__main__': - main() - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch11/selectionsort.py b/examples/ch11/selectionsort.py deleted file mode 100755 index e2816b8..0000000 --- a/examples/ch11/selectionsort.py +++ /dev/null @@ -1,45 +0,0 @@ -# selectionsort.py -"""Sorting an array with selection sort.""" -import numpy as np -from ch11utilities import print_pass - -def selection_sort(data): - """Sort array using selection sort.""" - # loop over len(data) - 1 elements - for index1 in range(len(data) - 1): - smallest = index1 # first index of remaining array - - # loop to find index of smallest element - for index2 in range(index1 + 1, len(data)): - if data[index2] < data[smallest]: - smallest = index2 - - # swap smallest element into position - data[smallest], data[index1] = data[index1], data[smallest] - print_pass(data, index1 + 1, smallest) - -def main(): - data = np.array([35, 73, 90, 65, 23, 86, 43, 81, 34, 58]) - print(f'Unsorted array: {data}\n') - selection_sort(data) - print(f'\nSorted array: {data}\n') - -# call main if this file is executed as a script -if __name__ == '__main__': - main() - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch11/selectionsortanimation.py b/examples/ch11/selectionsortanimation.py deleted file mode 100755 index 073432a..0000000 --- a/examples/ch11/selectionsortanimation.py +++ /dev/null @@ -1,124 +0,0 @@ -# selectionsortanimation.py -"""Animated selection sort visualization.""" -from matplotlib import animation -import matplotlib.pyplot as plt -import numpy as np -import seaborn as sns -import sys -from ch11soundutilities import play_sound - -def update(frame_data): - """Display bars representing the current state.""" - # unpack info for graph update - data, colors, swaps, comparisons = frame_data - plt.cla() # clear old contents of current Figure - - # create barplot and set its xlabel - bar_positions = np.arange(len(data)) - axes = sns.barplot(bar_positions, data, palette=colors) # new bars - axes.set(xlabel=f'Comparisons: {comparisons}; Swaps: {swaps}', - xticklabels=data) - -def flash_bars(index1, index2, data, colors, swaps, comparisons): - """Flash the bars about to be swapped and play their notes.""" - for x in range(0, 2): - colors[index1], colors[index2] = 'white', 'white' - yield (data, colors, swaps, comparisons) - colors[index1], colors[index2] = 'purple', 'purple' - yield (data, colors, swaps, comparisons) - play_sound(data[index1], seconds=0.05) - play_sound(data[index2], seconds=0.05) - -def selection_sort(data): - """Sort data using the selection sort algorithm and - yields values that update uses to visualize the algorithm.""" - swaps = 0 - comparisons = 0 - colors = ['lightgray'] * len(data) # list of bar colors - - # display initial bars representing shuffled values - yield (data, colors, swaps, comparisons) - - # loop over len(data) - 1 elements - for index1 in range(0, len(data) - 1): - smallest = index1 - - # loop to find index of smallest element's index - for index2 in range(index1 + 1, len(data)): - comparisons += 1 - colors[smallest] = 'purple' - colors[index2] = 'red' - yield (data, colors, swaps, comparisons) - play_sound(data[index2], seconds=0.05) - - # compare elements at positions index and smallest - if data[index2] < data[smallest]: - colors[smallest] = 'lightgray' - smallest = index2 - colors[smallest] = 'purple' - yield (data, colors, swaps, comparisons) - else: - colors[index2] = 'lightgray' - yield (data, colors, swaps, comparisons) - - # ensure that last bar is not purple - colors[-1] = 'lightgray' - - # flash the bars about to be swapped - yield from flash_bars(index1, smallest, data, colors, - swaps, comparisons) - - # swap the elements at positions index1 and smallest - swaps += 1 - data[smallest], data[index1] = data[index1], data[smallest] - - # flash the bars that were just swapped - yield from flash_bars(index1, smallest, data, colors, - swaps, comparisons) - - # indicate that bar index1 is now in its final spot - colors[index1] = 'lightgreen' - yield (data, colors, swaps, comparisons) - - # indicate that last bar is now in its final spot - colors[-1] = 'lightgreen' - yield (data, colors, swaps, comparisons) - play_sound(data[-1], seconds=0.05) - - # play each bar's note once and color it darker green - for index in range(len(data)): - colors[index] = 'green' - yield (data, colors, swaps, comparisons) - play_sound(data[index], seconds=0.05) - -def main(): - number_of_values = int(sys.argv[1]) if len(sys.argv) == 2 else 10 - - figure = plt.figure('Selection Sort') # Figure to display barplot - numbers = np.arange(1, number_of_values + 1) # create array - np.random.shuffle(numbers) # shuffle the array - - # start the animation - anim = animation.FuncAnimation(figure, update, repeat=False, - frames=selection_sort(numbers), interval=50) - - plt.show() # display the Figure - -# call main if this file is executed as a script -if __name__ == '__main__': - main() - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch11/snippets_ipynb/11_02.ipynb b/examples/ch11/snippets_ipynb/11_02.ipynb deleted file mode 100755 index a521551..0000000 --- a/examples/ch11/snippets_ipynb/11_02.ipynb +++ /dev/null @@ -1,89 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 11.2 Factorials" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Iterative Factorial Approach" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "factorial = 1" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for number in range(5, 0, -1):\n", - " factorial *= number" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "factorial" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch11/snippets_ipynb/11_03.ipynb b/examples/ch11/snippets_ipynb/11_03.ipynb deleted file mode 100755 index 5c6959a..0000000 --- a/examples/ch11/snippets_ipynb/11_03.ipynb +++ /dev/null @@ -1,183 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 11.3 Recursive Factorial Example\n", - "\n", - "**Note: This notebook contains the section's Self Check also because the IPython session continues into the exercises.**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Recursive Factorial Approach " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Visualizing Recursion " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Implementing a Recursive Factorial Function " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def factorial(number):\n", - " \"\"\"Return factorial of number.\"\"\"\n", - " if number <= 1:\n", - " return 1\n", - " return number * factorial(number - 1) # recursive call" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for i in range(11):\n", - " print(f'{i}! = {factorial(i)}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Indirect Recursion" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Stack Overflow and Infinite Recursion" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Recursion and the Function-Call Stack" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 12.3 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** A `________` case is needed to successfully terminate recursion.\n", - "\n", - "**Answer:** base." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(True/False)_** A function calling itself indirectly is not an example of recursion.\n", - "\n", - "**Answer:** False. A function calling itself in this manner is an example of indirect recursion." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(True/False)_** When a recursive function is called to solve a problem, it’s capable of solving only the simplest case(s), or base case(s).\n", - "\n", - "**Answer:** True. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**4. _(True/False)_** To make recursion feasible, the recursion step in a recursive solution must resemble the original problem, but be a slightly larger version of it.\n", - "\n", - "**Answer:** False. To make recursion feasible, the recursion step in a recursive solution must resemble the original problem, but be a slightly smaller or simpler version of it." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**5. _(IPython Session)_** Most other programming languages store integers in a fixed amount of space. So their built-in integer types can represent only a limited range of integer values. For example, Java’s `int` type can represent only values in the range –2,147,483,648 to +2,147,483,647. Python allows integers to become arbitrarily large. Continue this section’s IPython session and execute the function call `factorial(50)` to demonstrate that Python supports much larger integers.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "factorial(50)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch11/snippets_ipynb/11_04.ipynb b/examples/ch11/snippets_ipynb/11_04.ipynb deleted file mode 100755 index 1b4720c..0000000 --- a/examples/ch11/snippets_ipynb/11_04.ipynb +++ /dev/null @@ -1,212 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 11.4 Recursive Fibonacci Series Example\n", - "\n", - "**Note: This notebook contains the section's Self Check also because the IPython session continues into the exercises.**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Function `fibonacci` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def fibonacci(n):\n", - " if n in (0, 1): # base cases\n", - " return n\n", - " else:\n", - " return fibonacci(n - 1) + fibonacci(n - 2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " \n", - "\n", - "### Testing Function `fibonacci` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for n in range(41):\n", - " print(f'Fibonacci({n}) = {fibonacci(n)}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Analyzing the Calls to Function `fibonacci` " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Complexity Issues" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 15.4 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** The ratio of successive Fibonacci numbers converges on a constant value of 1.618…, a number that has been called the `________` or the `________`.\n", - "\n", - "**Answer:** golden ratio, golden mean. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(True/False)_** In the field of complexity theory, computer scientists study how hard algorithms work to complete their tasks. \n", - "\n", - "**Answer:** True." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Continuing this section’s IPython session, create a function named `iterative_fibonacci` that uses looping rather than recursion to calculate Fibonacci numbers. Use both the iterative and recursive versions to calculate the 32nd, 33rd and 34th Fibonacci numbers. Time the calls with `%timeit` to see the difference in computation time.\n", - " \n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def iterative_fibonacci(n):\n", - " result = 0\n", - " temp = 1\n", - " for j in range(0, n):\n", - " temp, result = result, result + temp\n", - " return result" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%timeit fibonacci(32)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%timeit iterative_fibonacci(32)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%timeit fibonacci(33)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%timeit iterative_fibonacci(33)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%timeit fibonacci(34)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%timeit iterative_fibonacci(34)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch11/snippets_ipynb/11_05selfcheck.ipynb b/examples/ch11/snippets_ipynb/11_05selfcheck.ipynb deleted file mode 100755 index 5cc8ff4..0000000 --- a/examples/ch11/snippets_ipynb/11_05selfcheck.ipynb +++ /dev/null @@ -1,73 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 11.5 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** Recursion terminates when `________`.\n", - " \n", - "**Answer:** a base case is reached." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(True/False)_** Iteration and recursion can occur infinitely.\n", - " \n", - "**Answer:** True. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch11/snippets_ipynb/11_07.ipynb b/examples/ch11/snippets_ipynb/11_07.ipynb deleted file mode 100755 index 9f7c086..0000000 --- a/examples/ch11/snippets_ipynb/11_07.ipynb +++ /dev/null @@ -1,188 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 11.7 Linear Search" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Linear Search Algorithm" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Linear Search Implementation" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "def linear_search(data, search_key):\n", - " for index, value in enumerate(data):\n", - " if value == search_key:\n", - " return index\n", - " return -1" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "np.random.seed(11)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "values = np.random.randint(10, 91, 10)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([35, 73, 90, 65, 23, 86, 43, 81, 34, 58])" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "values" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "4" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "linear_search(values, 23)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-1" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "linear_search(values, 61)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "8" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "linear_search(values, 34)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch11/snippets_ipynb/11_07selfcheck.ipynb b/examples/ch11/snippets_ipynb/11_07selfcheck.ipynb deleted file mode 100755 index 60f6d54..0000000 --- a/examples/ch11/snippets_ipynb/11_07selfcheck.ipynb +++ /dev/null @@ -1,73 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 11.7 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** The `________` algorithm searches each element in an array sequentially. \n", - " \n", - "**Answer:** linear search." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(True/False)_** If an array contains duplicate values, the linear search finds the last matching value. \n", - " \n", - "**Answer:** False. If there are duplicate values, linear search finds the first matching value." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch11/snippets_ipynb/11_08selfcheck.ipynb b/examples/ch11/snippets_ipynb/11_08selfcheck.ipynb deleted file mode 100755 index 9448036..0000000 --- a/examples/ch11/snippets_ipynb/11_08selfcheck.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 11.8 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** `________` notation indicates how hard an algorithm may have to work to solve a problem. \n", - " \n", - "**Answer:** Big O." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(True/False)_** An O(n) algorithm is referred to as having a quadratic run time. \n", - " \n", - "**Answer:** False. An O(n) algorithm is referred to as having a linear run time. O(n2) algorithms have quadratic run time." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(Discussion)_** When might you choose to write an O(n2) algorithm? \n", - " \n", - "**Answer:** When n is small and you do not have the time (or need) to invest in developing a better performing algorithm." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch11/snippets_ipynb/11_09.00selfcheck.ipynb b/examples/ch11/snippets_ipynb/11_09.00selfcheck.ipynb deleted file mode 100755 index 20b3e88..0000000 --- a/examples/ch11/snippets_ipynb/11_09.00selfcheck.ipynb +++ /dev/null @@ -1,73 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 11.9 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(True/False)_** The linear search and binary search algorithms require arrays to be sorted. \n", - " \n", - "**Answer:** False. Only the binary search requires a sorted array." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(Fill-In)_** With binary search, the smallest number of comparisons that would be needed to find a matching element in a 1,000,001-element array is `________`.\n", - " \n", - "**Answer:** One. This happens if on the first comparison the key matches the middle array element." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch11/snippets_ipynb/11_09.01.ipynb b/examples/ch11/snippets_ipynb/11_09.01.ipynb deleted file mode 100755 index 5e5d86b..0000000 --- a/examples/ch11/snippets_ipynb/11_09.01.ipynb +++ /dev/null @@ -1,165 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 11.9.1 Binary Search Implementation\n", - "\n", - "**Note: The last two lines of source code in this example have been modified from the print book so you can execute the example inside the notebook.**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Function `binary_search` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# binarysearch.py\n", - "\"\"\"Use binary search to locate an item in an array.\"\"\"\n", - "import numpy as np\n", - "\n", - "def binary_search(data, key):\n", - " \"\"\"Perform binary search of data looking for key.\"\"\"\n", - " low = 0 # low end of search area\n", - " high = len(data) - 1 # high end of search area\n", - " middle = (low + high + 1) // 2 # middle element index\n", - " location = -1 # return value -1 if not found\n", - " \n", - " # loop to search for element\n", - " while low <= high and location == -1:\n", - " # print remaining elements of array\n", - " print(remaining_elements(data, low, high))\n", - "\n", - " print(' ' * middle, end='') # output spaces for alignment \n", - " print(' * ') # indicate current middle\n", - "\n", - " # if the element is found at the middle \n", - " if key == data[middle]: \n", - " location = middle # location is the current middle \n", - " elif key < data[middle]: # middle element is too high\n", - " high = middle - 1 # eliminate the higher half \n", - " else: # middle element is too low \n", - " low = middle + 1 # eliminate the lower half \n", - " \n", - " middle = (low + high + 1) // 2 # recalculate the middle\n", - "\n", - " return location # return location of search key\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Function `remaining_elements` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def remaining_elements(data, low, high):\n", - " \"\"\"Display remaining elements of the binary search.\"\"\"\n", - " return ' ' * low + ' '.join(str(s) for s in data[low:high + 1])\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Function `main` \n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def main():\n", - " # create and display array of random values\n", - " data = np.random.randint(10, 91, 15)\n", - " data.sort()\n", - " print(data, '\\n')\n", - "\n", - " search_key = int(input('Enter an integer value (-1 to quit): ')) \n", - "\n", - " # repeatedly input an integer; -1 terminates the program\n", - " while search_key != -1:\n", - " location = binary_search(data, search_key) # perform search\n", - "\n", - " if location == -1: # not found\n", - " print(f'{search_key} was not found\\n') \n", - " else:\n", - " print(f'{search_key} found in position {location}\\n')\n", - "\n", - " search_key = int(input('Enter an integer value (-1 to quit): '))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# call main to execte the search \n", - "main()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch11/snippets_ipynb/11_11.01.ipynb b/examples/ch11/snippets_ipynb/11_11.01.ipynb deleted file mode 100755 index 6a62a6a..0000000 --- a/examples/ch11/snippets_ipynb/11_11.01.ipynb +++ /dev/null @@ -1,121 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 11.11.1 Selection Sort Implementation\n", - "\n", - "**Note: The last two lines of source code in this example have been modified from the print book so you can execute the example inside the notebook.**\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Function `selection_sort` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# selectionsort.py\n", - "\"\"\"Sorting an array with selection sort.\"\"\"\n", - "import numpy as np\n", - "from ch11utilities import print_pass\n", - "\n", - "def selection_sort(data):\n", - " \"\"\"Sort array using selection sort.\"\"\"\n", - " # loop over len(data) - 1 elements \n", - " for index1 in range(len(data) - 1):\n", - " smallest = index1 # first index of remaining array\n", - "\n", - " # loop to find index of smallest element \n", - " for index2 in range(index1 + 1, len(data)): \n", - " if data[index2] < data[smallest]:\n", - " smallest = index2\n", - " \n", - " # swap smallest element into position\n", - " data[smallest], data[index1] = data[index1], data[smallest] \n", - " print_pass(data, index1 + 1, smallest)\n", - " \n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Function `main` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def main(): \n", - " data = np.array([34, 56, 14, 20, 77, 51, 93, 30, 15, 52])\n", - " print(f'Unsorted array: {data}\\n')\n", - " selection_sort(data) \n", - " print(f'\\nSorted array: {data}\\n')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# call main to run the sort\n", - "main()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch11/snippets_ipynb/11_11.03selfcheck.ipynb b/examples/ch11/snippets_ipynb/11_11.03selfcheck.ipynb deleted file mode 100755 index c2bded9..0000000 --- a/examples/ch11/snippets_ipynb/11_11.03selfcheck.ipynb +++ /dev/null @@ -1,63 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 11.11.3 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_ A selection sort application would take approximately `________` times as long to run on a 128-million-element array as on a 32-million-element array.\n", - "16, because an O(n2) algorithm takes 16 times as long to sort four times as much information. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch11/snippets_ipynb/11_12.01.ipynb b/examples/ch11/snippets_ipynb/11_12.01.ipynb deleted file mode 100755 index 6cefa97..0000000 --- a/examples/ch11/snippets_ipynb/11_12.01.ipynb +++ /dev/null @@ -1,114 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 11.12.1 Insertion Sort Implementation\n", - "\n", - "**Note: The last two lines of source code in this example have been modified from the print book so you can execute the example inside the notebook.**\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Function `insertion_sort`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# insertionsort.py\n", - "\"\"\"Sorting an array with insertion sort.\"\"\"\n", - "import numpy as np\n", - "from ch11utilities import print_pass\n", - "\n", - "def insertion_sort(data):\n", - " \"\"\"Sort an array using insertion sort.\"\"\"\n", - " # loop over len(data) - 1 elements \n", - " for next in range(1, len(data)):\n", - " insert = data[next] # value to insert \n", - " move_item = next # location to place element\n", - "\n", - " # search for place to put current element \n", - " while move_item > 0 and data[move_item - 1] > insert: \n", - " # shift element right one slot\n", - " data[move_item] = data[move_item - 1] \n", - " move_item -= 1 \n", - " \n", - " data[move_item] = insert # place inserted element \n", - " print_pass(data, next, move_item) # output pass of algorithm" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def main(): \n", - " data = np.array([34, 56, 14, 20, 77, 51, 93, 30, 15, 52])\n", - " print(f'Unsorted array: {data}\\n')\n", - " insertion_sort(data) \n", - " print(f'\\nSorted array: {data}\\n')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# call mainto execute the sort\n", - "main()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch11/snippets_ipynb/11_12.02selfcheck.ipynb b/examples/ch11/snippets_ipynb/11_12.02selfcheck.ipynb deleted file mode 100755 index 4711f51..0000000 --- a/examples/ch11/snippets_ipynb/11_12.02selfcheck.ipynb +++ /dev/null @@ -1,73 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 11.12.2 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(True/False)_** Like the selection sort algorithm, the insertion sort algorithm has linear run time. \n", - " \n", - "**Answer:** False. Both algorithms have quadratic run time." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(True/False)_** Each iteration of the selection sort algorithm inserts one value into sorted order among the values that have been sorted so far.\n", - " \n", - "**Answer:** True." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch11/snippets_ipynb/11_13.01.ipynb b/examples/ch11/snippets_ipynb/11_13.01.ipynb deleted file mode 100755 index 622573d..0000000 --- a/examples/ch11/snippets_ipynb/11_13.01.ipynb +++ /dev/null @@ -1,211 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 11.13.1 Merge Sort Implementation" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Function `merge_sort` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# mergesort.py\n", - "\"\"\"Sorting an array with merge sort.\"\"\"\n", - "import numpy as np \n", - "\n", - "# calls recursive sort_array method to begin merge sorting\n", - "def merge_sort(data):\n", - " sort_array(data, 0, len(data) - 1) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Recursive Function `sort_array` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def sort_array(data, low, high):\n", - " \"\"\"Split data, sort subarrays and merge them into sorted array.\"\"\"\n", - " # test base case size of array equals 1 \n", - " if (high - low) >= 1: # if not base case\n", - " middle1 = (low + high) // 2 # calculate middle of array\n", - " middle2 = middle1 + 1 # calculate next element over \n", - "\n", - " # output split step\n", - " print(f'split: {subarray_string(data, low, high)}') \n", - " print(f' {subarray_string(data, low, middle1)}') \n", - " print(f' {subarray_string(data, middle2, high)}\\n') \n", - "\n", - " # split array in half then sort each half (recursive calls)\n", - " sort_array(data, low, middle1) # first half of array \n", - " sort_array(data, middle2, high) # second half of array \n", - "\n", - " # merge two sorted arrays after split calls return\n", - " merge(data, low, middle1, middle2, high) \n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Function `merge` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# merge two sorted subarrays into one sorted subarray \n", - "def merge(data, left, middle1, middle2, right):\n", - " left_index = left # index into left subarray \n", - " right_index = middle2 # index into right subarray \n", - " combined_index = left # index into temporary working array\n", - " merged = [0] * len(data) # working array \n", - " \n", - " # output two subarrays before merging\n", - " print(f'merge: {subarray_string(data, left, middle1)}') \n", - " print(f' {subarray_string(data, middle2, right)}') \n", - "\n", - " # merge arrays until reaching end of either \n", - " while left_index <= middle1 and right_index <= right:\n", - " # place smaller of two current elements into result \n", - " # and move to next space in arrays \n", - " if data[left_index] <= data[right_index]: \n", - " merged[combined_index] = data[left_index]\n", - " combined_index += 1\n", - " left_index += 1\n", - " else: \n", - " merged[combined_index] = data[right_index] \n", - " combined_index += 1\n", - " right_index += 1\n", - "\n", - " # if left array is empty \n", - " if left_index == middle2: # if True, copy in rest of right array\n", - " merged[combined_index:right + 1] = data[right_index:right + 1]\n", - " else: # right array is empty, copy in rest of left array\n", - " merged[combined_index:right + 1] = data[left_index:middle1 + 1]\n", - "\n", - " data[left:right + 1] = merged[left:right + 1] # copy back to data\n", - "\n", - " # output merged array\n", - " print(f' {subarray_string(data, left, right)}\\n') \n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Function `subarray_string` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# method to output certain values in array\n", - "def subarray_string(data, low, high):\n", - " temp = ' ' * low # spaces for alignment\n", - " temp += ' '.join(str(item) for item in data[low:high + 1])\n", - " return temp\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Function `main`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def main():\n", - " data = np.array([34, 56, 14, 20, 77, 51, 93, 30, 15, 52])\n", - " print(f'Unsorted array: {data}\\n')\n", - " merge_sort(data) \n", - " print(f'\\nSorted array: {data}\\n')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# call main to execute the sort (we removed the if statement from the script in the book)\n", - "main()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch11/snippets_ipynb/11_13.02selfcheck.ipynb b/examples/ch11/snippets_ipynb/11_13.02selfcheck.ipynb deleted file mode 100755 index 428915f..0000000 --- a/examples/ch11/snippets_ipynb/11_13.02selfcheck.ipynb +++ /dev/null @@ -1,64 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 11.13.2 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** The efficiency of merge sort is .\n", - " \n", - "**Answer:** O(n log n)." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch11/snippets_ipynb/11_15.ipynb b/examples/ch11/snippets_ipynb/11_15.ipynb deleted file mode 100644 index 0a79ee6..0000000 --- a/examples/ch11/snippets_ipynb/11_15.ipynb +++ /dev/null @@ -1,255 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 11.15 Visualizing Algorithms\n", - "\n", - "Before running this notebook, be sure that you have previously executed the following commands, which we specified in the Before You Begin section of the book:\n", - "\n", - "```\n", - "pip install ipympl\n", - "conda install nodejs\n", - "jupyter labextension install @jupyter-widgets/jupyterlab-manager\n", - "jupyter labextension install jupyter-matplotlib\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib widget" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# selectionsortanimation.py\n", - "\"\"\"Animated selection sort visualization.\"\"\"\n", - "from matplotlib import animation\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import seaborn as sns\n", - "import sys\n", - "from ch11soundutilities import play_sound" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### `update` Function That Displays Each Animation Frame" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def update(frame_data):\n", - " \"\"\"Display bars representing the current state.\"\"\" \n", - " # unpack info for graph update\n", - " data, colors, swaps, comparisons = frame_data\n", - " plt.cla() # clear old contents of current Figure\n", - "\n", - " # create barplot and set its xlabel\n", - " bar_positions = np.arange(len(data))\n", - " axes = sns.barplot(bar_positions, data, palette=colors) # new bars\n", - " axes.set(xlabel=f'Comparisons: {comparisons}; Swaps: {swaps}',\n", - " xticklabels=data) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### `flash_bars` Function That Flashes the Bars About to be Swapped" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def flash_bars(index1, index2, data, colors, swaps, comparisons):\n", - " \"\"\"Flash the bars about to be swapped and play their notes.\"\"\"\n", - " for x in range(0, 2):\n", - " colors[index1], colors[index2] = 'white', 'white'\n", - " yield (data, colors, swaps, comparisons) \n", - " colors[index1], colors[index2] = 'purple', 'purple'\n", - " yield (data, colors, swaps, comparisons) \n", - " play_sound(data[index1], seconds=0.05)\n", - " play_sound(data[index2], seconds=0.05)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### `selection_sort` as a Generator Function" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def selection_sort(data):\n", - " \"\"\"Sort data using the selection sort algorithm and\n", - " yields values that update uses to visualize the algorithm.\"\"\"\n", - " swaps = 0 \n", - " comparisons = 0\n", - " colors = ['lightgray'] * len(data) # list of bar colors\n", - " \n", - " # display initial bars representing shuffled values\n", - " yield (data, colors, swaps, comparisons) \n", - " \n", - " # loop over len(data) - 1 elements \n", - " for index1 in range(0, len(data) - 1):\n", - " print('outerloop')\n", - " smallest = index1\n", - " \n", - " # loop to find index of smallest element's index \n", - " for index2 in range(index1 + 1, len(data)):\n", - " print('innerloop')\n", - " comparisons += 1\n", - " colors[smallest] = 'purple'\n", - " colors[index2] = 'red' \n", - " yield (data, colors, swaps, comparisons) \n", - " play_sound(data[index2], seconds=0.05)\n", - "\n", - " # compare elements at positions index and smallest\n", - " if data[index2] < data[smallest]:\n", - " colors[smallest] = 'lightgray'\n", - " smallest = index2\n", - " colors[smallest] = 'purple'\n", - " yield (data, colors, swaps, comparisons) \n", - " else: \n", - " colors[index2] = 'lightgray'\n", - " yield (data, colors, swaps, comparisons) \n", - " \n", - " # ensure that last bar is not purple\n", - " colors[-1] = 'lightgray'\n", - " \n", - " # flash the bars about to be swapped\n", - " yield from flash_bars(index1, smallest, data, colors, \n", - " swaps, comparisons)\n", - "\n", - " # swap the elements at positions index1 and smallest\n", - " swaps += 1\n", - " data[smallest], data[index1] = data[index1], data[smallest] \n", - " \n", - " # flash the bars that were just swapped\n", - " yield from flash_bars(index1, smallest, data, colors, \n", - " swaps, comparisons)\n", - " \n", - " # indicate that bar index1 is now in its final spot\n", - " colors[index1] = 'lightgreen'\n", - " yield (data, colors, swaps, comparisons) \n", - "\n", - " # indicate that last bar is now in its final spot\n", - " colors[-1] = 'lightgreen'\n", - " yield (data, colors, swaps, comparisons) \n", - " play_sound(data[-1], seconds=0.05)\n", - "\n", - " # play each bar's note once and color it darker green\n", - " for index in range(len(data)):\n", - " colors[index] = 'green'\n", - " yield (data, colors, swaps, comparisons)\n", - " play_sound(data[index], seconds=0.05)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### `main` Function That Launches the Animation\n", - "\n", - "Note that we made some changes to execute this code in the notebook. The animation works best when run from the command line. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#def main():\n", - "number_of_values = int(sys.argv[1]) if len(sys.argv) == 2 else 10 \n", - "\n", - "figure = plt.figure('Selection Sort') # Figure to display barplot\n", - "numbers = np.arange(1, number_of_values + 1) # create array \n", - "np.random.shuffle(numbers) # shuffle the array\n", - "\n", - "# start the animation\n", - "anim = animation.FuncAnimation(figure, update, repeat=False,\n", - " frames=selection_sort(numbers), interval=50)\n", - "\n", - "plt.show() # display the Figure" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# call main to execute the animation (we removed the if statement from the script in the book)\n", - "#main()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch11/snippets_ipynb/11_Exercises.ipynb b/examples/ch11/snippets_ipynb/11_Exercises.ipynb deleted file mode 100644 index 83706c7..0000000 --- a/examples/ch11/snippets_ipynb/11_Exercises.ipynb +++ /dev/null @@ -1,147 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 11 Exercises with Code Snippets\n", - "\n", - "**11.1** What does the following code do?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def mystery(a, b):\n", - " if b == 1:\n", - " return a\n", - " else:\n", - " return a + mystery(a, b - 1)\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "mystery(2, 10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**11.2** Find the logic error(s) in the following recursive function, and explain how to correct it (them). This function should find the sum of the values from 0 to `n`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def sum(n):\n", - " if n == 0:\n", - " return 0\n", - " else: \n", - " return n + sum(n)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**11.3** What does the following code do?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def mystery(a_array, size):\n", - " if size == 1:\n", - " return a_array[0]\n", - " else: \n", - " return a_array[size - 1] + mystery(a_array, size - 1)\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "numbers = np.arange(1, 11)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "mystery(numbers, len(numbers))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch11/snippets_ipynb/ch11soundutilities.py b/examples/ch11/snippets_ipynb/ch11soundutilities.py deleted file mode 100755 index 177fd23..0000000 --- a/examples/ch11/snippets_ipynb/ch11soundutilities.py +++ /dev/null @@ -1,36 +0,0 @@ -# ch11soundutilities.py -"""Functions to play sounds.""" -from pysine import sine - -TWELFTH_ROOT_2 = 1.059463094359 # 12th root of 2 -A3 = 220 # hertz frequency for musical note A from third octave - -def play_sound(i, seconds=0.1): - """Play a note representing a bar's magnitude. Calculation - based on https://pages.mtu.edu/~suits/NoteFreqCalcs.html.""" - sine(frequency=(A3 * TWELFTH_ROOT_2 ** i), duration=seconds) - -def play_found_sound(seconds=0.1): - """Play sequence of notes indicating a found item.""" - sine(frequency=523.25, duration=seconds) # C5 - sine(frequency=698.46, duration=seconds) # F5 - sine(frequency=783.99, duration=seconds) # G5 - -def play_not_found_sound(seconds=0.3): - """Play a note indicating an item was not found.""" - sine(frequency=220, duration=seconds) # A3 - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch11/snippets_ipynb/ch11utilities.py b/examples/ch11/snippets_ipynb/ch11utilities.py deleted file mode 100755 index e20cb4f..0000000 --- a/examples/ch11/snippets_ipynb/ch11utilities.py +++ /dev/null @@ -1,35 +0,0 @@ -# ch11utilities.py -"""Utility function for printing a pass of the -insertion_sort and selection_sort algorithms""" - -def print_pass(data, pass_number, index): - """Print a pass of the algorithm.""" - label = f'after pass {pass_number}: ' - print(label, end='') - - # output elements up to selected item - print(' '.join(str(d) for d in data[:index]), - end=' ' if index != 0 else '') - - print(f'{data[index]}* ', end='') # indicate swap with * - - # output rest of elements - print(' '.join(str(d) for d in data[index + 1:len(data)])) - - # underline elements that are sorted after this pass_number - print(f'{" " * len(label)}{"-- " * pass_number}') - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch11/snippets_ipynb/files/art/check.png b/examples/ch11/snippets_ipynb/files/art/check.png deleted file mode 100755 index eea18cd..0000000 Binary files a/examples/ch11/snippets_ipynb/files/art/check.png and /dev/null differ diff --git a/examples/ch11/snippets_py/11_02.py b/examples/ch11/snippets_py/11_02.py deleted file mode 100755 index 73af305..0000000 --- a/examples/ch11/snippets_py/11_02.py +++ /dev/null @@ -1,23 +0,0 @@ -# Section 11.2 snippets -factorial = 1 - -for number in range(5, 0, -1): - factorial *= number - -factorial - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch11/snippets_py/11_03.py b/examples/ch11/snippets_py/11_03.py deleted file mode 100755 index fed4ae0..0000000 --- a/examples/ch11/snippets_py/11_03.py +++ /dev/null @@ -1,31 +0,0 @@ -# Section 11.3 snippets -# Note that the self check #5 is included here as it -# continues the section's IPython session. - -def factorial(number): - """Return factorial of number.""" - if number <= 1: - return 1 - return number * factorial(number - 1) # recursive call - -for i in range(11): - print(f'{i}! = {factorial(i)}') - -# Self Check Exercise 5 -factorial(50) - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch11/snippets_py/11_04.py b/examples/ch11/snippets_py/11_04.py deleted file mode 100755 index 69e867c..0000000 --- a/examples/ch11/snippets_py/11_04.py +++ /dev/null @@ -1,53 +0,0 @@ -# Section 11.4 snippets -# Note that the self check #3 is included here as it -# continues the section's IPython session. - -# Function fibonacci -def fibonacci(n): - if n in (0, 1): # base cases - return n - else: - return fibonacci(n - 1) + fibonacci(n - 2) - -# Testing Function fibonacci -for n in range(41): - print(f'Fibonacci({n}) = {fibonacci(n)}') - -# Self Check Exercise 3 -def iterative_fibonacci(n): - result = 0 - temp = 1 - for j in range(0, n): - temp, result = result, result + temp - return result - -%timeit fibonacci(32) - -%timeit iterative_fibonacci(32) - -%timeit fibonacci(33) - -%timeit iterative_fibonacci(33) - -%timeit fibonacci(34) - -%timeit iterative_fibonacci(34) - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch11/snippets_py/11_07.py b/examples/ch11/snippets_py/11_07.py deleted file mode 100755 index 9594843..0000000 --- a/examples/ch11/snippets_py/11_07.py +++ /dev/null @@ -1,40 +0,0 @@ -# Section 11.7 snippets - -# Linear Search Implementation -def linear_search(data, search_key): - for index, value in enumerate(data): - if value == search_key: - return index - return -1 - -import numpy as np - -np.random.seed(11) - -values = np.random.randint(10, 91, 10) - -values - -linear_search(values, 78) - -linear_search(values, 61) - -linear_search(values, 66) - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch11/snippets_py/11_exercises.py b/examples/ch11/snippets_py/11_exercises.py deleted file mode 100755 index 7c8f68b..0000000 --- a/examples/ch11/snippets_py/11_exercises.py +++ /dev/null @@ -1,49 +0,0 @@ -# 11 Exercise Snippets - -# 11.1. What does the following code do? -def mystery(a, b): - if b == 1: - return a - else: - return a + mystery(a, b - 1) - -mystery(2, 10) - - -# 11.2. Find the logic error(s) in the following recursive function, -# and explain how to correct it (them). This function should find -# the sum of the values from 0 to `n`. -def sum(n): - if n == 0: - return 0 - else: - return n + sum(n) - -# 11.3. What does the following code do? -def mystery(a_array, size): - if size == 1: - return a_array[0] - else: - return a_array[size - 1] + mystery(a_array, size - 1) - -import numpy as np - -numbers = np.arange(1, 11) - -mystery(numbers, len(numbers)) - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch12/mask_circle.png b/examples/ch12/mask_circle.png deleted file mode 100755 index 386bdd3..0000000 Binary files a/examples/ch12/mask_circle.png and /dev/null differ diff --git a/examples/ch12/mask_heart.png b/examples/ch12/mask_heart.png deleted file mode 100755 index 25b53e2..0000000 Binary files a/examples/ch12/mask_heart.png and /dev/null differ diff --git a/examples/ch12/mask_oval.png b/examples/ch12/mask_oval.png deleted file mode 100755 index 6eab85c..0000000 Binary files a/examples/ch12/mask_oval.png and /dev/null differ diff --git a/examples/ch12/mask_star.png b/examples/ch12/mask_star.png deleted file mode 100755 index eb90c0f..0000000 Binary files a/examples/ch12/mask_star.png and /dev/null differ diff --git a/examples/ch12/snippets_ipynb/12_02.01-07.ipynb b/examples/ch12/snippets_ipynb/12_02.01-07.ipynb deleted file mode 100755 index 38d5997..0000000 --- a/examples/ch12/snippets_ipynb/12_02.01-07.ipynb +++ /dev/null @@ -1,735 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**_Note: This notebook contains ALL the code for Sections 12.2.12.2.7, including the Self Check snippets because all the snippets in these sections are consecutively numbered in the text._**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 12.2.1 Create a TextBlob" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from textblob import TextBlob" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "text = 'Today is a beautiful day. Tomorrow looks like bad weather.'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob = TextBlob(text)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\"Check\n", - "\n", - "# 12.2.1 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** `________` is the fundamental class for NLP with the `textblob` module. \n", - "\n", - "**Answer:** `TextBlob`." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(True/False)_** `TextBlob`s support string methods and can be compared with strings using the comparison operators. \n", - "\n", - "**Answer:** True." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3. _(IPython Session)_** Create a `TextBlob` containing `'This is a TextBlob'`.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "exercise_blob = TextBlob('This is a TextBlob')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "exercise_blob" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 12.2.2 Tokenizing Text into Sentences and Words" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob.sentences" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob.words" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\"Check\n", - "\n", - "# 12.2.2 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Create a `TextBlob` with two sentences, then tokenize it into `Sentence`s and `Word`s, displaying all the tokens.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from textblob import TextBlob" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ex = TextBlob('My old computer is slow. My new one is fast.')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ex.sentences" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ex.words" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 12.2.3 Parts-of-Speech Tagging" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob.tags" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\"Check\n", - "\n", - "# 12.2.3 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** `________` is the process of evaluating words based on their context to determine each word’s part of speech\n", - "\n", - "**Answer:** Parts-of-speech (POS) tagging." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Display the parts-of-speech tags for the sentence, `'My dog is cute'`.\n", - "\n", - "```\n", - "TextBlob('My dog is cute').tags\n", - "```\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "TextBlob('My dog is cute').tags" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 12.2.4 Extracting Noun Phrases" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob.noun_phrases" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\"Check\n", - "\n", - "# 12.2.4 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Show the noun phrase(s) in the sentence, `'The red brick factory is for sale'`.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "TextBlob('The red brick factory is for sale').noun_phrases" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 12.2.5 Sentiment Analysis with TextBlob’s Default Sentiment Analyzer" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting the Sentiment of a TextBlob" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob.sentiment" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting the polarity and subjectivity from the Sentiment Object" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%precision 3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob.sentiment.polarity" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob.sentiment.subjectivity" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting the Sentiment of a Sentence " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for sentence in blob.sentences:\n", - " print(sentence.sentiment)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\"Check\n", - "\n", - "# 12.2.5 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Import `Sentence` from the `TextBlob` module then use `Sentence` objects to check the sentiment of the three sentences used in this section’s introduction. \n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from textblob import Sentence" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Sentence('The food is not good.').sentiment" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Sentence('The movie was not bad.').sentiment" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Sentence('The movie was excellent!').sentiment" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 12.2.6 Sentiment Analysis with the NaiveBayesAnalyzer " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from textblob.sentiments import NaiveBayesAnalyzer" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob = TextBlob(text, analyzer=NaiveBayesAnalyzer())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob.sentiment" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for sentence in blob.sentences:\n", - " print(sentence.sentiment)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\"Check\n", - "\n", - "# 12.2.6 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Check the sentiment of the three sentences in the previous Self Check this time using the `NaiveBayesAnalyzer`.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "text = ('The food is not good. The movie was not bad. ' +\n", - " 'The movie was excellent!')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "exblob = TextBlob(text, analyzer=NaiveBayesAnalyzer())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for sentence in exblob.sentences:\n", - " print(sentence.sentiment)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 12.2.7 Language Detection and Translation" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob.detect_language()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "spanish = blob.translate(to='es')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "spanish" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "spanish.detect_language()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "chinese = blob.translate(to='zh')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "chinese" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "chinese.detect_language()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "spanish.translate()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "chinese.translate() " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\"Check\n", - "\n", - "# 12.2.7 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Translate `'Today is a beautiful day.'` into French, then detect the language.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob = TextBlob('Today is a beautiful day.')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "french = blob.translate(to='fr')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "french" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "french.detect_language()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch12/snippets_ipynb/12_02.08.ipynb b/examples/ch12/snippets_ipynb/12_02.08.ipynb deleted file mode 100755 index 2df57ba..0000000 --- a/examples/ch12/snippets_ipynb/12_02.08.ipynb +++ /dev/null @@ -1,126 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 17.2.8 Inflection: Pluralization and Singularization" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from textblob import Word" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "index = Word('index')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "index.pluralize()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cacti = Word('cacti')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cacti.singularize()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from textblob import TextBlob" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "animals = TextBlob('dog cat fish bird').words" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "animals.pluralize()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch12/snippets_ipynb/12_02.08selfcheck.ipynb b/examples/ch12/snippets_ipynb/12_02.08selfcheck.ipynb deleted file mode 100755 index aaf6cf9..0000000 --- a/examples/ch12/snippets_ipynb/12_02.08selfcheck.ipynb +++ /dev/null @@ -1,91 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 17.2.8 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Singularize the word `'children'` and pluralize `'focus'`.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from textblob import Word" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Word('children').singularize()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Word('focus').pluralize()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch12/snippets_ipynb/12_02.09.ipynb b/examples/ch12/snippets_ipynb/12_02.09.ipynb deleted file mode 100755 index 33d6b19..0000000 --- a/examples/ch12/snippets_ipynb/12_02.09.ipynb +++ /dev/null @@ -1,117 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 17.2.9 Spell Checking and Correction" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from textblob import Word" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "word = Word('theyr')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "word.spellcheck()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "word.correct() # chooses word with the highest confidence value" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from textblob import TextBlob" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sentence = TextBlob('Ths sentense has missplled wrds.')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sentence.correct()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch12/snippets_ipynb/12_02.09selfcheck.ipynb b/examples/ch12/snippets_ipynb/12_02.09selfcheck.ipynb deleted file mode 100755 index 7427501..0000000 --- a/examples/ch12/snippets_ipynb/12_02.09selfcheck.ipynb +++ /dev/null @@ -1,100 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 17.2.9 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(True/False)_** You can check a `Word`’s spelling with its `correct` method, which returns a list of tuples containing possible correct spellings and a confidence value. \n", - "\n", - "**Answer:** False. You can check a `Word`’s spelling with its `spellcheck` method, which returns a list of tuples containing potential correct spellings and a confidence value. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Correct the spelling in `'I canot beleive I misspeled thees werds'`.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from textblob import TextBlob" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sentence = TextBlob('I canot beleive I misspeled thees werds')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sentence.correct()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch12/snippets_ipynb/12_02.10.ipynb b/examples/ch12/snippets_ipynb/12_02.10.ipynb deleted file mode 100755 index db354e7..0000000 --- a/examples/ch12/snippets_ipynb/12_02.10.ipynb +++ /dev/null @@ -1,90 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 17.2.10 Normalization: Stemming and Lemmatization" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from textblob import Word" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "word = Word('varieties')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "word.stem()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "word.lemmatize()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch12/snippets_ipynb/12_02.10selfcheck.ipynb b/examples/ch12/snippets_ipynb/12_02.10selfcheck.ipynb deleted file mode 100755 index e21cb60..0000000 --- a/examples/ch12/snippets_ipynb/12_02.10selfcheck.ipynb +++ /dev/null @@ -1,109 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 17.2.10 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(True/False)_** Stemming is similar to lemmatization, but factors in the word’s part of speech and meaning and results in a real word.\n", - "\n", - "**Answer:** False. Lemmatization is similar to stemming, but factors in the word’s part of speech and meaning and results in a real word." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Stem and lemmatize the word 'strawberries'.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from textblob import Word" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "word = Word('strawberries')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "word.stem()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "word.lemmatize()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch12/snippets_ipynb/12_02.11.ipynb b/examples/ch12/snippets_ipynb/12_02.11.ipynb deleted file mode 100755 index dd6653c..0000000 --- a/examples/ch12/snippets_ipynb/12_02.11.ipynb +++ /dev/null @@ -1,182 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 17.2.11 Word Frequencies\n", - "**NOTE: Before running this notebook, place a copy of your downloaded RomeoAndJuliet.txt file in the same folder with this notebook.**\n", - "\n", - "**NOTE: This section's self check is included in this file because it continues the interactive session." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pathlib import Path" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from textblob import TextBlob" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob = TextBlob(Path('RomeoAndJuliet.txt').read_text())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob.word_counts['juliet']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob.word_counts['romeo']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob.word_counts['thou']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob.words.count('joy')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob.noun_phrases.count('lady capulet')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\"Check\n", - "# 17.2.11 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(True/False)_** You can access the word frequencies through the `TextBlob`’s counts dictionary. \n", - "\n", - "**Answer:** False. You can access the word frequencies through the `word_counts` dictionary." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Using the `TextBlob` from this section’s IPython session, determine how many times the stop words “a,” “an” and “the” appear in Romeo and Juliet. \n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob.word_counts['a']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob.word_counts['an']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob.word_counts['the']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch12/snippets_ipynb/12_02.12.ipynb b/examples/ch12/snippets_ipynb/12_02.12.ipynb deleted file mode 100755 index 5216a0d..0000000 --- a/examples/ch12/snippets_ipynb/12_02.12.ipynb +++ /dev/null @@ -1,161 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 17.2.12 Getting Definitions, Synonyms and Antonyms from WordNet\n", - "### Getting Definitions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from textblob import Word" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "happy = Word('happy')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "happy.definitions" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting Synonyms" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "happy.synsets" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "synonyms = set()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for synset in happy.synsets:\n", - " for lemma in synset.lemmas():\n", - " synonyms.add(lemma.name())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "synonyms" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting Antonyms" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "lemmas = happy.synsets[0].lemmas()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "lemmas" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "lemmas[0].antonyms()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch12/snippets_ipynb/12_02.12selfcheck.ipynb b/examples/ch12/snippets_ipynb/12_02.12selfcheck.ipynb deleted file mode 100755 index 7c58601..0000000 --- a/examples/ch12/snippets_ipynb/12_02.12selfcheck.ipynb +++ /dev/null @@ -1,109 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 17.2.12 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** A `________` represents synonyms of a given word.\n", - "\n", - "**Answer:** Synset." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Display the `synsets` and `definitions` for the word “boat.” \n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from textblob import Word" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "word = Word('boat')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "word.synsets" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "word.definitions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch12/snippets_ipynb/12_02.13.ipynb b/examples/ch12/snippets_ipynb/12_02.13.ipynb deleted file mode 100755 index 4312906..0000000 --- a/examples/ch12/snippets_ipynb/12_02.13.ipynb +++ /dev/null @@ -1,117 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 17.2.13 Deleting Stop Words" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import nltk" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nltk.download('stopwords')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from nltk.corpus import stopwords" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "stops = stopwords.words('english')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from textblob import TextBlob" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob = TextBlob('Today is a beautiful day.')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "[word for word in blob.words if word not in stops]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch12/snippets_ipynb/12_02.13selfcheck.ipynb b/examples/ch12/snippets_ipynb/12_02.13selfcheck.ipynb deleted file mode 100755 index 6073b17..0000000 --- a/examples/ch12/snippets_ipynb/12_02.13selfcheck.ipynb +++ /dev/null @@ -1,118 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 17.2.13 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** `________` are common words in text that are often removed from text before analyzing it. \n", - "\n", - "**Answer:** Stop words." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Eliminate stop words from a `TextBlob` containing the sentence `'TextBlob is easy to use.'`\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from nltk.corpus import stopwords" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "stops = stopwords.words('english')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from textblob import TextBlob" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob = TextBlob('TextBlob is easy to use.')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "[word for word in blob.words if word not in stops]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch12/snippets_ipynb/12_02.14.ipynb b/examples/ch12/snippets_ipynb/12_02.14.ipynb deleted file mode 100755 index 57e8c28..0000000 --- a/examples/ch12/snippets_ipynb/12_02.14.ipynb +++ /dev/null @@ -1,99 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 17.2.14 n-grams " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from textblob import TextBlob" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "text = 'Today is a beautiful day. Tomorrow looks like bad weather.'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob = TextBlob(text)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob.ngrams()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob.ngrams(n=5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch12/snippets_ipynb/12_02.14selfcheck.ipynb b/examples/ch12/snippets_ipynb/12_02.14selfcheck.ipynb deleted file mode 100755 index ace3a8e..0000000 --- a/examples/ch12/snippets_ipynb/12_02.14selfcheck.ipynb +++ /dev/null @@ -1,100 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 17.2.14 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** N-grams are a form of `________` in which words appear near each other in a body of text. \n", - "\n", - "**Answer:** co-occurrence." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Produce n-grams consisting of three words each for `'TextBlob is easy to use.'`\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from textblob import TextBlob" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob = TextBlob('TextBlob is easy to use.')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob.ngrams()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch12/snippets_ipynb/12_03.01.ipynb b/examples/ch12/snippets_ipynb/12_03.01.ipynb deleted file mode 100755 index 05f4fa9..0000000 --- a/examples/ch12/snippets_ipynb/12_03.01.ipynb +++ /dev/null @@ -1,233 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 17.3.1 Visualizing Word Frequencies with Pandas\n", - "\n", - "**NOTE: Before running this notebook, place a copy of your downloaded RomeoAndJuliet.txt file in the same folder with this notebook.**\n", - "\n", - "### Loading the Data\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pathlib import Path" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from textblob import TextBlob" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "blob = TextBlob(Path('RomeoAndJuliet.txt').read_text())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from nltk.corpus import stopwords" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "stop_words = stopwords.words('english')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting the Word Frequencies" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "items = blob.word_counts.items()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Eliminating the Stop Words" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "items = [item for item in items if item[0] not in stop_words]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Sorting the Words by Frequency" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from operator import itemgetter" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sorted_items = sorted(items, key=itemgetter(1), reverse=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting the Top 20 Words" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "top20 = sorted_items[1:21]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Convert top20 to a DataFrame " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.DataFrame(top20, columns=['word', 'count']) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "df" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Visualizing the DataFrame \n", - "\n", - "Added `%matplotlib inline` and combined cells to enable result to be displayed in the notebook" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "axes = df.plot.bar(x='word', y='count', legend=False)\n", - "\n", - "import matplotlib.pyplot as plt\n", - "\n", - "plt.gcf().tight_layout()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch12/snippets_ipynb/12_03.02.ipynb b/examples/ch12/snippets_ipynb/12_03.02.ipynb deleted file mode 100644 index 5a704b8..0000000 --- a/examples/ch12/snippets_ipynb/12_03.02.ipynb +++ /dev/null @@ -1,287 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 17.3.2 Visualizing Word Frequencies with Word Clouds\n", - "\n", - "**NOTE: This section's self check is included in this notebook because it continues this section's interactive session.**\n", - "\n", - "**NOTE: Before running this notebook, be sure to place your copy of the play in the same folder as the notebook.**\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Installing the wordcloud Module" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Loading the Text" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pathlib import Path" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "text = Path('RomeoAndJuliet.txt').read_text()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Loading the Mask Image that Specifies the Word Cloud’s Shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import imageio" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "mask_image = imageio.imread('mask_heart.png')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Configuring the WordCloud Object" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from wordcloud import WordCloud " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wordcloud = WordCloud(width=1000, height=1000, \n", - " colormap='prism', mask=mask_image, background_color='white')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Generating the Word Cloud" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wordcloud = wordcloud.generate(text)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Saving the Word Cloud as an Image File" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wordcloud = wordcloud.to_file('RomeoAndJulietHeart.png')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Generating a Word Cloud from a Dictionary" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Displaying the Image with Matplotlib" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.imshow(wordcloud)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 17.3.2 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** A `________` is a graphic that shows more frequently occurring words in bigger fonts and less frequently occurring words in smaller fonts. \n", - "\n", - "**Answer:** word cloud." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** We provided oval, circle and star masks for you to try when creating your own word clouds. Continue this section’s IPython session and generate another Romeo and Juliet word cloud using the `mask_star.png` image.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "mask_image2 = imageio.imread('mask_star.png')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wordcloud2 = WordCloud(width=1000, height=1000,\n", - " colormap='prism', mask=mask_image2, background_color='white')\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wordcloud2 = wordcloud2.generate(text)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wordcloud2 = wordcloud2.to_file('RomeoAndJulietStar.png')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.imshow(wordcloud2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch12/snippets_ipynb/12_04.ipynb b/examples/ch12/snippets_ipynb/12_04.ipynb deleted file mode 100755 index 9185ae7..0000000 --- a/examples/ch12/snippets_ipynb/12_04.ipynb +++ /dev/null @@ -1,161 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 17.4 Readability Assessment with Textatistic\n", - "\n", - "**NOTE: Before running this notebook, be sure to place your copy of the play in the same folder as the notebook.**\n", - "\n", - "### Install Textatistic\n", - "### Calculating Statistics and Readability Scores" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pathlib import Path" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "text = Path('RomeoAndJuliet.txt').read_text()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from textatistic import Textatistic" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "readability = Textatistic(text)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%precision 3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "readability.dict()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\"Check\n", - "# 17.4 Self Check\n", - "\n", - "**1. _(Fill-In)_** `________` indicates how easy is it for readers to understand text.\n", - "\n", - "**Answer:** Readability." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Using the results in this section’s IPython session, calculate the average numbers of words per sentence, characters per word and syllables per word.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "readability.word_count / readability.sent_count # sentence length" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "readability.char_count / readability.word_count # word length" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "readability.sybl_count / readability.word_count # syllables" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch12/snippets_ipynb/12_05.ipynb b/examples/ch12/snippets_ipynb/12_05.ipynb deleted file mode 100755 index 7bb9679..0000000 --- a/examples/ch12/snippets_ipynb/12_05.ipynb +++ /dev/null @@ -1,113 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 17.5 Named Entity Recognition with spaCy\n", - "\n", - "### Install spaCy\n", - "\n", - "### Loading the Language Model" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import spacy" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nlp = spacy.load('en') " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a spaCy Doc" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "document = nlp('In 1994, Tim Berners-Lee founded the ' + \n", - " 'World Wide Web Consortium (W3C), devoted to ' +\n", - " 'developing web technologies')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " \n", - "\n", - "### Getting the Named Entities" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for entity in document.ents:\n", - " print(f'{entity.text}: {entity.label_}')\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch12/snippets_ipynb/12_05selfcheck.ipynb b/examples/ch12/snippets_ipynb/12_05selfcheck.ipynb deleted file mode 100644 index 7cf5824..0000000 --- a/examples/ch12/snippets_ipynb/12_05selfcheck.ipynb +++ /dev/null @@ -1,114 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 17.5 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(True/False)_** Named entity recognition attempts to locate only people’s names in text.\n", - "\n", - "**Answer:** False. Named entity recognition attempts to locate and categorize items like dates, times, quantities, places, people, things, organizations and more." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Display the named entities in \n", - "```\n", - "'Paul J. Deitel is CEO of Deitel & Associates, Inc.'\n", - "```\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import spacy" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nlp = spacy.load('en')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "document = nlp('Paul J. Deitel is CEO of ' +\n", - " 'Deitel & Associates, Inc.')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for entity in document.ents:\n", - " print(f'{entity.text}: {entity.label_}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch12/snippets_ipynb/12_06.ipynb b/examples/ch12/snippets_ipynb/12_06.ipynb deleted file mode 100755 index 278baad..0000000 --- a/examples/ch12/snippets_ipynb/12_06.ipynb +++ /dev/null @@ -1,131 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 12.6 Similarity Detection with spaCy\n", - "\n", - "**NOTE: Before running this notebook, be sure to place your copies of the plays in the same folder as the notebook.**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Loading the Language Model and Creating a spaCy Doc" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import spacy" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nlp = spacy.load('en') " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating the spaCy Docs" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pathlib import Path" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "document1 = nlp(Path('RomeoAndJuliet.txt').read_text())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "document2 = nlp(Path('EdwardTheSecond.txt').read_text())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Comparing the Books’ Similarity " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "document1.similarity(document2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch12/snippets_ipynb/12_06selfcheck.ipynb b/examples/ch12/snippets_ipynb/12_06selfcheck.ipynb deleted file mode 100644 index a19bc74..0000000 --- a/examples/ch12/snippets_ipynb/12_06selfcheck.ipynb +++ /dev/null @@ -1,163 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 12.6 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** `________` is the process of analyzing documents to determine how similar they are.\n", - "\n", - "**Answer:** Similarity detection." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** You’d expect that if you compare Shakespeare’s works to one another that you’d get a high similarity value, especially among plays of the same genre. Romeo and Juliet is one of Shakespeare’s tragedies. Three other Shakespearian tragedies are Hamlet, Macbeth and King Lear. Download these three plays from Project Gutenberg, then compare each one for similarity with Romeo and Juliet using the spaCy code presented in this section.\n", - "\n", - "**Answer: NOTE: Before running this code, be sure to place your copies of the plays into the same folder as this notebook.** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import spacy" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nlp = spacy.load('en') " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pathlib import Path" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "document1 = nlp(Path('RomeoAndJuliet.txt').read_text())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "document2 = nlp(Path('Hamlet.txt').read_text())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "document1.similarity(document2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "document3 = nlp(Path('Macbeth.txt').read_text())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "document1.similarity(document3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "document4 = nlp(Path('KingLear.txt').read_text())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "document1.similarity(document4)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch12/snippets_ipynb/RomeoAndJulietHeart.png b/examples/ch12/snippets_ipynb/RomeoAndJulietHeart.png deleted file mode 100644 index bebf219..0000000 Binary files a/examples/ch12/snippets_ipynb/RomeoAndJulietHeart.png and /dev/null differ diff --git a/examples/ch12/snippets_ipynb/RomeoAndJulietStar.png b/examples/ch12/snippets_ipynb/RomeoAndJulietStar.png deleted file mode 100644 index e882458..0000000 Binary files a/examples/ch12/snippets_ipynb/RomeoAndJulietStar.png and /dev/null differ diff --git a/examples/ch12/snippets_ipynb/files/art/.ipynb_checkpoints/check-checkpoint.png b/examples/ch12/snippets_ipynb/files/art/.ipynb_checkpoints/check-checkpoint.png deleted file mode 100755 index eea18cd..0000000 Binary files a/examples/ch12/snippets_ipynb/files/art/.ipynb_checkpoints/check-checkpoint.png and /dev/null differ diff --git a/examples/ch12/snippets_ipynb/files/art/check.png b/examples/ch12/snippets_ipynb/files/art/check.png deleted file mode 100755 index eea18cd..0000000 Binary files a/examples/ch12/snippets_ipynb/files/art/check.png and /dev/null differ diff --git a/examples/ch12/snippets_ipynb/mask_circle.png b/examples/ch12/snippets_ipynb/mask_circle.png deleted file mode 100755 index 386bdd3..0000000 Binary files a/examples/ch12/snippets_ipynb/mask_circle.png and /dev/null differ diff --git a/examples/ch12/snippets_ipynb/mask_heart.png b/examples/ch12/snippets_ipynb/mask_heart.png deleted file mode 100755 index 25b53e2..0000000 Binary files a/examples/ch12/snippets_ipynb/mask_heart.png and /dev/null differ diff --git a/examples/ch12/snippets_ipynb/mask_oval.png b/examples/ch12/snippets_ipynb/mask_oval.png deleted file mode 100755 index 6eab85c..0000000 Binary files a/examples/ch12/snippets_ipynb/mask_oval.png and /dev/null differ diff --git a/examples/ch12/snippets_ipynb/mask_star.png b/examples/ch12/snippets_ipynb/mask_star.png deleted file mode 100755 index eb90c0f..0000000 Binary files a/examples/ch12/snippets_ipynb/mask_star.png and /dev/null differ diff --git a/examples/ch12/snippets_py/12_02.01-07.py b/examples/ch12/snippets_py/12_02.01-07.py deleted file mode 100755 index 1beada0..0000000 --- a/examples/ch12/snippets_py/12_02.01-07.py +++ /dev/null @@ -1,165 +0,0 @@ -# Section 12.2.1 snippets -from textblob import TextBlob - -text = 'Today is a beautiful day. Tomorrow looks like bad weather.' - -blob = TextBlob(text) - -blob - - -# Section 12.2.1 Self Check snippets - -# Exercise 3 -exercise_blob = TextBlob('This is a TextBlob') - -exercise_blob - - -# Section 12.2.2 snippets -blob.sentences - -blob.words - - -# Section 12.2.2 Self Check snippets - -# Exercise 1 -from textblob import TextBlob - -ex = TextBlob('My old computer is slow. My new one is fast.') - -ex.sentences - -ex.words - - -# Section 12.2.3 snippets -blob - -blob.tags - - -# Section 12.2.3 Self Check snippets - -# Exercise 2 -TextBlob('My dog is cute').tags - - -# Section 12.2.4 snippets -blob - -blob.noun_phrases - - -# Section 12.2.4 Self Check snippets - -# Exercise 1 -TextBlob('The red brick factory is for sale').noun_phrases - - -# Section 12.2.5 snippets - -# Getting the Sentiment of a TextBlob -blob - -blob.sentiment - -# Getting the polarity and subjectivity from the Sentiment Object -%precision 3 - -blob.sentiment.polarity - -blob.sentiment.subjectivity - -# Getting the Sentiment of a Sentence -for sentence in blob.sentences: - print(sentence.sentiment) - - -# Section 12.2.5 Self Check snippets - -# Exercise 1 -from textblob import Sentence - -Sentence('The food is not good.').sentiment - -Sentence('The movie was not bad.').sentiment - -Sentence('The movie was excellent!').sentiment - - -# Section 12.2.6 snippets -from textblob.sentiments import NaiveBayesAnalyzer - -blob = TextBlob(text, analyzer=NaiveBayesAnalyzer()) - -blob - -blob.sentiment - -for sentence in blob.sentences: - print(sentence.sentiment) - - -# Section 12.2.6 Self Check snippets - -# Exercise 1 -text = ('The food is not good. The movie was not bad. ' + - 'The movie was excellent!') - -exblob = TextBlob(text, analyzer=NaiveBayesAnalyzer()) - -for sentence in exblob.sentences: - print(sentence.sentiment) - - -# Section 12.2.7 snippets -blob - -blob.detect_language() - -spanish = blob.translate(to='es') - -spanish - -spanish.detect_language() - -chinese = blob.translate(to='zh') - -chinese - -chinese.detect_language() - -spanish.translate() - -chinese.translate() - - -# Section 12.2.7 Self Check snippets - -# Exercise 1 -blob = TextBlob('Today is a beautiful day.') - -french = blob.translate(to='fr') - -french - -french.detect_language() - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch12/snippets_py/12_02.08.py b/examples/ch12/snippets_py/12_02.08.py deleted file mode 100755 index 1d00c50..0000000 --- a/examples/ch12/snippets_py/12_02.08.py +++ /dev/null @@ -1,33 +0,0 @@ -# Section 12.2.8 snippets -from textblob import Word - -index = Word('index') - -index.pluralize() - -cacti = Word('cacti') - -cacti.singularize() - -from textblob import TextBlob - -animals = TextBlob('dog cat fish bird').words - -animals.pluralize() - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch12/snippets_py/12_02.08selfcheck.py b/examples/ch12/snippets_py/12_02.08selfcheck.py deleted file mode 100755 index 32c78f1..0000000 --- a/examples/ch12/snippets_py/12_02.08selfcheck.py +++ /dev/null @@ -1,26 +0,0 @@ -# Section 12.2.8 Self Check snippets - -# Exercise 1 -from textblob import Word - -Word('children').singularize() - -Word('focus').pluralize() - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch12/snippets_py/12_02.09.py b/examples/ch12/snippets_py/12_02.09.py deleted file mode 100755 index 99c30f6..0000000 --- a/examples/ch12/snippets_py/12_02.09.py +++ /dev/null @@ -1,31 +0,0 @@ -# Section 12.2.9 snippets -from textblob import Word - -word = Word('theyr') - -word.spellcheck() - -word.correct() # chooses word with the highest confidence value - -from textblob import TextBlob - -sentence = TextBlob('Ths sentense has missplled wrds.') - -sentence.correct() - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch12/snippets_py/12_02.09selfcheck.py b/examples/ch12/snippets_py/12_02.09selfcheck.py deleted file mode 100755 index e6b3f20..0000000 --- a/examples/ch12/snippets_py/12_02.09selfcheck.py +++ /dev/null @@ -1,25 +0,0 @@ -# Section 12.2.9 Self Check snippets - -# Exercise 2 -from textblob import TextBlob - -sentence = TextBlob('I canot beleive I misspeled thees werds') - -sentence.correct() - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch12/snippets_py/12_02.10.py b/examples/ch12/snippets_py/12_02.10.py deleted file mode 100755 index 9326bb3..0000000 --- a/examples/ch12/snippets_py/12_02.10.py +++ /dev/null @@ -1,25 +0,0 @@ -# Section 12.2.10 snippets -from textblob import Word - -word = Word('varieties') - -word.stem() - -word.lemmatize() - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch12/snippets_py/12_02.10selfcheck.py b/examples/ch12/snippets_py/12_02.10selfcheck.py deleted file mode 100755 index 8021df7..0000000 --- a/examples/ch12/snippets_py/12_02.10selfcheck.py +++ /dev/null @@ -1,27 +0,0 @@ -# Section 12.2.10 Self Check snippets - -# Exercise 2 -from textblob import Word - -word = Word('strawberries') - -word.stem() - -word.lemmatize() - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch12/snippets_py/12_02.11.py b/examples/ch12/snippets_py/12_02.11.py deleted file mode 100755 index ad45df0..0000000 --- a/examples/ch12/snippets_py/12_02.11.py +++ /dev/null @@ -1,45 +0,0 @@ -# Section 12.2.11 snippets -# NOTE: This section's Self Check snippets are included in this file -# because the self check continues the interactive session. - -from pathlib import Path - -from textblob import TextBlob - -blob = TextBlob(Path('RomeoAndJuliet.txt').read_text()) - -blob.word_counts['juliet'] - -blob.word_counts['romeo'] - -blob.word_counts['thou'] - -blob.words.count('joy') - -blob.noun_phrases.count('lady capulet') - - -# Section 12.2.11 Self Check snippets - -# Exercise 2 -blob.word_counts['a'] - -blob.word_counts['an'] - -blob.word_counts['the'] - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch12/snippets_py/12_02.12.py b/examples/ch12/snippets_py/12_02.12.py deleted file mode 100755 index efec98b..0000000 --- a/examples/ch12/snippets_py/12_02.12.py +++ /dev/null @@ -1,44 +0,0 @@ -# Section 12.2.12 snippets - -# Getting Definitions -from textblob import Word - -happy = Word('happy') - -happy.definitions - -# Getting Synonyms -happy.synsets - -synonyms = set() - -for synset in happy.synsets: - for lemma in synset.lemmas(): - synonyms.add(lemma.name()) - -synonyms - -# Getting Antonyms -lemmas = happy.synsets[0].lemmas() - -lemmas - -lemmas[0].antonyms() - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch12/snippets_py/12_02.12selfcheck.py b/examples/ch12/snippets_py/12_02.12selfcheck.py deleted file mode 100755 index 38e7400..0000000 --- a/examples/ch12/snippets_py/12_02.12selfcheck.py +++ /dev/null @@ -1,26 +0,0 @@ -# Section 12.2.12 Self Check snippets - -# Exercise 2 -from textblob import Word - -word = Word('boat') - -word.synsets - -word.definitions - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch12/snippets_py/12_02.13.py b/examples/ch12/snippets_py/12_02.13.py deleted file mode 100755 index 51fadb1..0000000 --- a/examples/ch12/snippets_py/12_02.13.py +++ /dev/null @@ -1,32 +0,0 @@ -# Section 12.2.13 snippets -import nltk - -nltk.download('stopwords') - -from nltk.corpus import stopwords - -stops = stopwords.words('english') - -from textblob import TextBlob - -blob = TextBlob('Today is a beautiful day.') - -[word for word in blob.words if word not in stops] - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch12/snippets_py/12_02.13selfcheck.py b/examples/ch12/snippets_py/12_02.13selfcheck.py deleted file mode 100755 index 8ce863a..0000000 --- a/examples/ch12/snippets_py/12_02.13selfcheck.py +++ /dev/null @@ -1,29 +0,0 @@ -# Section 12.2.13 Self Check snippets - -# Exercise 2 -from nltk.corpus import stopwords - -stops = stopwords.words('english') - -from textblob import TextBlob - -blob = TextBlob('TextBlob is easy to use.') - -[word for word in blob.words if word not in stops] - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch12/snippets_py/12_02.14.py b/examples/ch12/snippets_py/12_02.14.py deleted file mode 100755 index c8d7c5f..0000000 --- a/examples/ch12/snippets_py/12_02.14.py +++ /dev/null @@ -1,27 +0,0 @@ -# Section 12.2.14 snippets -from textblob import TextBlob - -text = 'Today is a beautiful day. Tomorrow looks like bad weather.' - -blob = TextBlob(text) - -blob.ngrams() - -blob.ngrams(n=5) - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch12/snippets_py/12_02.14selfcheck14.py b/examples/ch12/snippets_py/12_02.14selfcheck14.py deleted file mode 100755 index 44e2f3c..0000000 --- a/examples/ch12/snippets_py/12_02.14selfcheck14.py +++ /dev/null @@ -1,24 +0,0 @@ -# Section 12.2.14 Self Check snippets - -# Exercise 2 -from textblob import TextBlob - -blob = TextBlob('TextBlob is easy to use.') - -blob.ngrams() - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch12/snippets_py/12_03.01.py b/examples/ch12/snippets_py/12_03.01.py deleted file mode 100755 index 7666e10..0000000 --- a/examples/ch12/snippets_py/12_03.01.py +++ /dev/null @@ -1,56 +0,0 @@ -# Section 12.3.1 snippets - -# Loading the Data -from pathlib import Path - -from textblob import TextBlob - -blob = TextBlob(Path('RomeoAndJuliet.txt').read_text()) - -from nltk.corpus import stopwords - -stop_words = stopwords.words('english') - -# Getting the Word Frequencies -items = blob.word_counts.items() - -# Eliminating the Stop Words -items = [item for item in items if item[0] not in stop_words] - -# Sorting the Words by Frequency -from operator import itemgetter - -sorted_items = sorted(items, key=itemgetter(1), reverse=True) - -# Getting the Top 20 Words -top20 = sorted_items[1:21] - -# Convert top20 to a DataFrame -import pandas as pd - -df = pd.DataFrame(top20, columns=['word', 'count']) - -df - -# Visualizing the DataFrame -axes = df.plot.bar(x='word', y='count', legend=False) - -import matplotlib.pyplot as plt - -plt.gcf().tight_layout() - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch12/snippets_py/12_03.02.py b/examples/ch12/snippets_py/12_03.02.py deleted file mode 100755 index ad90531..0000000 --- a/examples/ch12/snippets_py/12_03.02.py +++ /dev/null @@ -1,61 +0,0 @@ -# Section 12.3.2 snippets -# NOTE: This section's self check snippets are included in this file -# because the interactive session continues into the self check. - -# Loading the Text -from pathlib import Path - -text = Path('RomeoAndJuliet.txt').read_text() - -# Loading the Mask Image that Specifies the Word Cloud’s Shape -import imageio - -mask_image = imageio.imread('mask_heart.png') - -# Configuring the WordCloud Object -from wordcloud import WordCloud - -wordcloud = WordCloud(width=1000, height=1000, - colormap='prism', mask=mask_image, background_color='white') - - -# Generating the Word Cloud -wordcloud = wordcloud.generate(text) - -# Saving the Word Cloud as an Image File -wordcloud = wordcloud.to_file('RomeoAndJulietHeart.png') - -%matplotlib - -import matplotlib.pyplot as plt - -plt.imshow(wordcloud) - -# Section 12.3.2 Self Check snippets - -# Exercise 2 -mask_image2 = imageio.imread('mask_star.png') - -wordcloud2 = WordCloud(width=1000, height=1000, - colormap='prism', mask=mask_image2, background_color='white') - -wordcloud2 = wordcloud2.generate(text) - -wordcloud2 = wordcloud2.to_file('RomeoAndJulietStar.png') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch12/snippets_py/12_04.py b/examples/ch12/snippets_py/12_04.py deleted file mode 100755 index b2834ee..0000000 --- a/examples/ch12/snippets_py/12_04.py +++ /dev/null @@ -1,45 +0,0 @@ -# Section 12.4 snippets -# NOTE: This section's self check snippets are included in this file -# because the interactive session continues into the self check. - -# Calculating Statistics and Readability Scores -from pathlib import Path - -text = Path('RomeoAndJuliet.txt').read_text() - -from textatistic import Textatistic - -readability = Textatistic(text) - -%precision 3 - -readability.dict() - - -# Section 12.4 Self Check snippets - -# Exercise 2 -readability.word_count / readability.sent_count # sentence length - -readability.char_count / readability.word_count # word length - -readability.sybl_count / readability.word_count # syllables - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch12/snippets_py/12_05.py b/examples/ch12/snippets_py/12_05.py deleted file mode 100755 index de9a490..0000000 --- a/examples/ch12/snippets_py/12_05.py +++ /dev/null @@ -1,33 +0,0 @@ -# Section 12.5 snippets -# Loading the Language Model - -import spacy - -nlp = spacy.load('en') - -# Creating a spaCy Doc -document = nlp('In 1994, Tim Berners-Lee founded the ' + - 'World Wide Web Consortium (W3C), devoted to ' + - 'developing web technologies') - -# Getting the Named Entities -for entity in document.ents: - print(f'{entity.text}: {entity.label_}') - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch12/snippets_py/12_05selfcheck.py b/examples/ch12/snippets_py/12_05selfcheck.py deleted file mode 100755 index 5fd60e2..0000000 --- a/examples/ch12/snippets_py/12_05selfcheck.py +++ /dev/null @@ -1,28 +0,0 @@ -# Section 12.5 Self Check snippets - -# Exercise 2 -import spacy - -nlp = spacy.load('en') - -document = nlp('Paul J. Deitel is CEO of ' + - 'Deitel & Associates, Inc.') - -for entity in document.ents: - print(f'{entity.text}: {entity.label_}') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch12/snippets_py/12_06.py b/examples/ch12/snippets_py/12_06.py deleted file mode 100755 index e48082e..0000000 --- a/examples/ch12/snippets_py/12_06.py +++ /dev/null @@ -1,35 +0,0 @@ -# Section 12.6 snippets - -# Loading the Language Model and Creating a spaCy Doc -import spacy - -nlp = spacy.load('en') - -# Creating the spaCy Docs -from pathlib import Path - -document1 = nlp(Path('RomeoAndJuliet.txt').read_text()) - -document2 = nlp(Path('EdwardTheSecond.txt').read_text()) - -# Comparing the Books’ Similarity -document1.similarity(document2) - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch12/snippets_py/12_06selfcheck.py b/examples/ch12/snippets_py/12_06selfcheck.py deleted file mode 100755 index 1db44ca..0000000 --- a/examples/ch12/snippets_py/12_06selfcheck.py +++ /dev/null @@ -1,38 +0,0 @@ -# Section 12.6 Self Check snippets - -# Exercise 2 -import spacy - -nlp = spacy.load('en') - -from pathlib import Path - -document1 = nlp(Path('RomeoAndJuliet.txt').read_text()) - -document2 = nlp(Path('Hamlet.txt').read_text()) - -document1.similarity(document2) - -document3 = nlp(Path('Macbeth.txt').read_text()) - -document1.similarity(document3) - -document4 = nlp(Path('KingLear.txt').read_text()) - -document1.similarity(document4) - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch12/snippets_py/ex12.01.py b/examples/ch12/snippets_py/ex12.01.py deleted file mode 100755 index f74f059..0000000 --- a/examples/ch12/snippets_py/ex12.01.py +++ /dev/null @@ -1,30 +0,0 @@ -# Exercise 12.1 Snippets -import requests - -request = requests.get('https://www.python.org') - -request.content # gives back the page’s HTML - -from bs4 import BeautifulSoup - -soup = BeautifulSoup(request.content, 'html5lib') - -text = soup.get_text(strip=True) # text without tags - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV1.1/Thumbs.db b/examples/ch13_TwitterV1.1/Thumbs.db deleted file mode 100755 index 065b6b6..0000000 Binary files a/examples/ch13_TwitterV1.1/Thumbs.db and /dev/null differ diff --git a/examples/ch13_TwitterV1.1/_READ_ME_FIRST b/examples/ch13_TwitterV1.1/_READ_ME_FIRST deleted file mode 100644 index d901e2f..0000000 --- a/examples/ch13_TwitterV1.1/_READ_ME_FIRST +++ /dev/null @@ -1,16 +0,0 @@ -# Upgrading from Twitter v1.1 to Twitter v2 - -On August 18, 2022, we discovered that **new** Twitter developer accounts cannot access the Twitter version 1.1 APIs on which we based Chapter 13, Data Mining Twitter, and two case studies in Chapter 17, Big Data: Hadoop, Spark, NoSQL and IoT. - -Twitter users who already had Twitter developer accounts can still access the Twitter version 1.1 APIs, but most students and some instructors will not fall into this category. - -We’ve already rewritten Chapter 13 to the Twitter version 2 APIs and will be rewriting the two Twitter-based Chapter 17 case studies soon. - -The updated chapter is posted on the book's webpage: -https://deitel.com/intro-to-python-for-computer-science-and-data-science/ - -Once completed, we’ll post updated versions of: -* the Chapter 17 Twitter-based case studies -* the instructor materials to the Pearson Instructor Resource Center (IRC), which is accessible only to qualified instructors. - -Questions? Please email paul@deitel.com. diff --git a/examples/ch13_TwitterV1.1/keys.py b/examples/ch13_TwitterV1.1/keys.py deleted file mode 100755 index 1de727b..0000000 --- a/examples/ch13_TwitterV1.1/keys.py +++ /dev/null @@ -1,6 +0,0 @@ -consumer_key = 'YourConsumerKey' -consumer_secret = 'YourConsumerSecret' -access_token = 'YourAccessToken' -access_token_secret = 'YourAccessTokenSecret' - -mapquest_key = 'YourAPIKey' \ No newline at end of file diff --git a/examples/ch13_TwitterV1.1/locationlistener.py b/examples/ch13_TwitterV1.1/locationlistener.py deleted file mode 100755 index f053bc8..0000000 --- a/examples/ch13_TwitterV1.1/locationlistener.py +++ /dev/null @@ -1,56 +0,0 @@ -# locationlistener.py -"""Receives tweets matching a search string and stores a list of -dictionaries containing each tweet's screen_name/text/location.""" -import tweepy -from tweetutilities import get_tweet_content - -class LocationListener(tweepy.StreamListener): - """Handles incoming Tweet stream to get location data.""" - - def __init__(self, api, counts_dict, tweets_list, topic, limit=10): - """Configure the LocationListener.""" - self.tweets_list = tweets_list - self.counts_dict = counts_dict - self.topic = topic - self.TWEET_LIMIT = limit - super().__init__(api) # call superclass's init - - def on_status(self, status): - """Called when Twitter pushes a new tweet to you.""" - # get each tweet's screen_name, text and location - tweet_data = get_tweet_content(status, location=True) - - # ignore retweets and tweets that do not contain the topic - if (tweet_data['text'].startswith('RT') or - self.topic.lower() not in tweet_data['text'].lower()): - return - - self.counts_dict['total_tweets'] += 1 # original tweet - - # ignore tweets with no location - if not status.user.location: - return - - self.counts_dict['locations'] += 1 # tweet with location - self.tweets_list.append(tweet_data) # store the tweet - print(f'{status.user.screen_name}: {tweet_data["text"]}\n') - - # if TWEET_LIMIT is reached, return False to terminate streaming - return self.counts_dict['locations'] <= self.TWEET_LIMIT - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV1.1/sentimentlistener.py b/examples/ch13_TwitterV1.1/sentimentlistener.py deleted file mode 100755 index ed4a3e0..0000000 --- a/examples/ch13_TwitterV1.1/sentimentlistener.py +++ /dev/null @@ -1,106 +0,0 @@ -# sentimentlisener.py -"""Script that searches for tweets that match a search string -and tallies the number of positive, neutral and negative tweets.""" -import keys -import preprocessor as p -import sys -from textblob import TextBlob -import tweepy - -class SentimentListener(tweepy.StreamListener): - """Handles incoming Tweet stream.""" - - def __init__(self, api, sentiment_dict, topic, limit=10): - """Configure the SentimentListener.""" - self.sentiment_dict = sentiment_dict - self.tweet_count = 0 - self.topic = topic - self.TWEET_LIMIT = limit - - # set tweet-preprocessor to remove URLs/reserved words - p.set_options(p.OPT.URL, p.OPT.RESERVED) - super().__init__(api) # call superclass's init - - def on_status(self, status): - """Called when Twitter pushes a new tweet to you.""" - # get the tweet's text - try: - tweet_text = status.extended_tweet.full_text - except: - tweet_text = status.text - - # ignore retweets - if tweet_text.startswith('RT'): - return - - tweet_text = p.clean(tweet_text) # clean the tweet - - # ignore tweet if the topic is not in the tweet text - if self.topic.lower() not in tweet_text.lower(): - return - - # update self.sentiment_dict with the polarity - blob = TextBlob(tweet_text) - if blob.sentiment.polarity > 0: - sentiment = '+' - self.sentiment_dict['positive'] += 1 - elif blob.sentiment.polarity == 0: - sentiment = ' ' - self.sentiment_dict['neutral'] += 1 - else: - sentiment = '-' - self.sentiment_dict['negative'] += 1 - - # display the tweet - print(f'{sentiment} {status.user.screen_name}: {tweet_text}\n') - - self.tweet_count += 1 # track number of tweets processed - - # if TWEET_LIMIT is reached, return False to terminate streaming - return self.tweet_count <= self.TWEET_LIMIT - -def main(): - # configure the OAuthHandler - auth = tweepy.OAuthHandler(keys.consumer_key, keys.consumer_secret) - auth.set_access_token(keys.access_token, keys.access_token_secret) - - # get the API object - api = tweepy.API(auth, wait_on_rate_limit=True, - wait_on_rate_limit_notify=True) - - # create the StreamListener subclass object - search_key = sys.argv[1] - limit = int(sys.argv[2]) # number of tweets to tally - sentiment_dict = {'positive': 0, 'neutral': 0, 'negative': 0} - sentiment_listener = SentimentListener(api, - sentiment_dict, search_key, limit) - - # set up Stream - stream = tweepy.Stream(auth=api.auth, listener=sentiment_listener) - - # start filtering English tweets containing search_key - stream.filter(track=[search_key], languages=['en'], is_async=False) - - print(f'Tweet sentiment for "{search_key}"') - print('Positive:', sentiment_dict['positive']) - print(' Neutral:', sentiment_dict['neutral']) - print('Negative:', sentiment_dict['negative']) - -# call main if this file is executed as a script -if __name__ == '__main__': - main() - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV1.1/snippets_ipynb/13_07-11withSelfChecks.ipynb b/examples/ch13_TwitterV1.1/snippets_ipynb/13_07-11withSelfChecks.ipynb deleted file mode 100755 index 23c3707..0000000 --- a/examples/ch13_TwitterV1.1/snippets_ipynb/13_07-11withSelfChecks.ipynb +++ /dev/null @@ -1,968 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**_Note: This notebook contains ALL the code for Sections 13.7 through 13.11, including the Self Check snippets because all the snippets in these sections are consecutively numbered in the text._**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.7 Authenticating with Twitter Via Tweepy " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import tweepy" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import keys" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating and Configuring an `OAuthHandler` to Authenticate with Twitter" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "auth = tweepy.OAuthHandler(keys.consumer_key,\n", - " keys.consumer_secret)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "auth.set_access_token(keys.access_token,\n", - " keys.access_token_secret)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating an API Object" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "api = tweepy.API(auth, wait_on_rate_limit=True, \n", - " wait_on_rate_limit_notify=True)\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.8 Getting Information About a Twitter Account" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa = api.get_user('nasa')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting Basic Account Information" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa.id" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa.name" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa.screen_name" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa.description" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting the Most Recent Status Update" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa.status.text" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting the Number of Followers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa.followers_count" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting the Number of Friends " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa.friends_count" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting Your Own Account’s Information" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.8 Self Check\n", - "**3. _(IPython Session)_** Use the `api` object to get a `User` object for the `NASAKepler` account, then display its number of followers and most recent tweet.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa_kepler = api.get_user('NASAKepler')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa_kepler.followers_count" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa_kepler.status.text" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.9 Introduction to Tweepy `Cursor`s: Getting an Account’s Followers and Friends\n", - "# 13.9.1 Determining an Account’s Followers " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "followers = []" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a Cursor" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cursor = tweepy.Cursor(api.followers, screen_name='nasa')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting Results" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for account in cursor.items(10):\n", - " followers.append(account.screen_name)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('Followers:', \n", - " ' '.join(sorted(followers, key=lambda s: s.lower())))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Automatic Paging\n", - "### Getting Follower IDs Rather Than Followers" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.9.1 Self Check\n", - "**3. _(IPython Session)_** Use a Cursor to get and display 10 followers of the `NASAKepler` account.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "kepler_followers = []" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cursor = tweepy.Cursor(api.followers, screen_name='NASAKepler')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for account in cursor.items(10):\n", - " kepler_followers.append(account.screen_name)\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(' '.join(kepler_followers))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.9.2 Determining Whom an Account Follows " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "friends = []" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cursor = tweepy.Cursor(api.friends, screen_name='nasa')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for friend in cursor.items(10):\n", - " friends.append(friend.screen_name)\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('Friends:', \n", - " ' '.join(sorted(friends, key=lambda s: s.lower())))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.9.3 Getting a User’s Recent Tweets" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa_tweets = api.user_timeline(screen_name='nasa', count=3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for tweet in nasa_tweets:\n", - " print(f'{tweet.user.screen_name}: {tweet.text}\\n')\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Grabbing Recent Tweets from Your Own Timeline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.9.3 Self Check\n", - "**2. _(IPython Session)_** Get and display two tweets from the `NASAKepler` account.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "kepler_tweets = api.user_timeline(\n", - " screen_name='NASAKepler', count=2) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for tweet in kepler_tweets:\n", - " print(f'{tweet.user.screen_name}: {tweet.text}\\n') " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.10 Searching Recent Tweets\n", - "### Tweet Printer" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from tweetutilities import print_tweets" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Searching for Specific Words" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweets = api.search(q='Mars Opportunity Rover', count=3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print_tweets(tweets)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Searching with Twitter Search Operators" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweets = api.search(q='from:nasa since:2018-09-01', count=3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print_tweets(tweets)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Searching for a Hashtag" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweets = api.search(q='#collegefootball', count=20)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print_tweets(tweets)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.10 Self Check\n", - "**3. _(IPython Session)_** Search for one tweet from the `nasa` account containing `'astronaut'`.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweets = api.search(q='astronaut from:nasa', count=1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print_tweets(tweets)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.11 Spotting Trends with the Twitter Trends API\n", - "# 13.11.1 Places with Trending Topics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "trends_available = api.trends_available()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "len(trends_available)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "trends_available[0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "trends_available[1]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.11.2 Getting a List of Trending Topics\n", - "### Worldwide Trending Topics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "world_trends = api.trends_place(id=1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "trends_list = world_trends[0]['trends']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "trends_list[0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "trends_list = [t for t in trends_list if t['tweet_volume']]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from operator import itemgetter " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "trends_list.sort(key=itemgetter('tweet_volume'), reverse=True) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for trend in trends_list[:5]:\n", - " print(trend['name'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### New York City Trending Topics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nyc_trends = api.trends_place(id=2459115) # New York City WOEID" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nyc_list = nyc_trends[0]['trends']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nyc_list = [t for t in nyc_list if t['tweet_volume']]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nyc_list.sort(key=itemgetter('tweet_volume'), reverse=True) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for trend in nyc_list[:5]:\n", - " print(trend['name'])\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.11.2 Self Check\n", - "**3. _(IPython Session)_** Display the top 3 trending topics today in the United States.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "us_trends = api.trends_place(id='23424977')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "us_list = us_trends[0]['trends']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "us_list = [t for t in us_list if t['tweet_volume']]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "us_list.sort(key=itemgetter('tweet_volume'), reverse=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for trend in us_list[:3]:\n", - " print(trend['name'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.11.3 Create a Word Cloud from Trending Topics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "topics = {}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for trend in nyc_list:\n", - " topics[trend['name']] = trend['tweet_volume']\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from wordcloud import WordCloud" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wordcloud = WordCloud(width=1600, height=900,\n", - " prefer_horizontal=0.5, min_font_size=10, colormap='prism', \n", - " background_color='white')\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wordcloud = wordcloud.fit_words(topics)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wordcloud = wordcloud.to_file('TrendingTwitter.png')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.11.3 Self Check\n", - "\n", - "**1. _(IPython Session)_** Create a word cloud using the `us_list` list from the previous section’s Self Check.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "topics = {}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for trend in us_list:\n", - " topics[trend['name']] = trend['tweet_volume']\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wordcloud = wordcloud.fit_words(topics)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wordcloud = wordcloud.to_file('USTrendingTwitter.png')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch13_TwitterV1.1/snippets_ipynb/13_12.ipynb b/examples/ch13_TwitterV1.1/snippets_ipynb/13_12.ipynb deleted file mode 100755 index a52ed7b..0000000 --- a/examples/ch13_TwitterV1.1/snippets_ipynb/13_12.ipynb +++ /dev/null @@ -1,93 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.12 Cleaning/Preprocessing Tweets for Analysis\n", - "### tweet-preprocessor Library and TextBlob Utility Functions\n", - "### Installing tweet-preprocessor\n", - "### Cleaning a Tweet" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import preprocessor as p" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "p.set_options(p.OPT.URL, p.OPT.RESERVED)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweet_text = 'RT A sample retweet with a URL https://nasa.gov'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "p.clean(tweet_text)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch13_TwitterV1.1/snippets_ipynb/13_12selfcheck.ipynb b/examples/ch13_TwitterV1.1/snippets_ipynb/13_12selfcheck.ipynb deleted file mode 100755 index 2370b25..0000000 --- a/examples/ch13_TwitterV1.1/snippets_ipynb/13_12selfcheck.ipynb +++ /dev/null @@ -1,64 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.12 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(True/False)_** The tweet-preprocessor library can automatically remove URLs, `@`-mentions (like `@nasa`), hashtags (like `#mars`), Twitter reserved words (like, `RT` for retweet and `FAV` for favorite, which is similar to a “like” on other social networks), emojis (all or just smileys) and numbers, or any combination of these. \n", - "\n", - "**Answer:** True." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch13_TwitterV1.1/snippets_ipynb/13_13_02.ipynb b/examples/ch13_TwitterV1.1/snippets_ipynb/13_13_02.ipynb deleted file mode 100755 index 73b3afb..0000000 --- a/examples/ch13_TwitterV1.1/snippets_ipynb/13_13_02.ipynb +++ /dev/null @@ -1,178 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.13.2 Initiating Stream Processing\n", - "### Authenticating" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import tweepy" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import keys" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "auth = tweepy.OAuthHandler(keys.consumer_key, \n", - " keys.consumer_secret)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "auth.set_access_token(keys.access_token, \n", - " keys.access_token_secret)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "api = tweepy.API(auth, wait_on_rate_limit=True, \n", - " wait_on_rate_limit_notify=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a `TweetListener` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from tweetlistener import TweetListener" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweet_listener = TweetListener(api)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a `Stream` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweet_stream = tweepy.Stream(auth=api.auth, \n", - " listener=tweet_listener)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Starting the Tweet Stream\n", - "\n", - "We removed the is_async argument to ensure that the streamed tweets all appear below this cell." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweet_stream.filter(track=['Mars Rover']) #, is_async=True) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Asynchronous vs. Synchronous Streams" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Other filter Method Parameters\n", - "### Twitter Restrictions Note" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch13_TwitterV1.1/snippets_ipynb/13_13_02selfcheck.ipynb b/examples/ch13_TwitterV1.1/snippets_ipynb/13_13_02selfcheck.ipynb deleted file mode 100755 index b854f58..0000000 --- a/examples/ch13_TwitterV1.1/snippets_ipynb/13_13_02selfcheck.ipynb +++ /dev/null @@ -1,68 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.13.2 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** Rather than connecting to Twitter on each method call, a stream uses a persistent connection to `________` (that is, send) tweets to your app. \n", - "\n", - "**Answer:** push.\n", - "\n", - "**2. _(True/False)_** Twitter’s free Streaming API sends to your app randomly selected tweets dynamically as they occur—up to a maximum of ten percent of the tweets per day. \n", - "\n", - "**Answer:** False. Twitter’s Streaming API sends to your app randomly selected tweets dynamically as they occur—up to a maximum of one percent of the tweets per day. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch13_TwitterV1.1/snippets_ipynb/13_14.ipynb b/examples/ch13_TwitterV1.1/snippets_ipynb/13_14.ipynb deleted file mode 100644 index dc83ad9..0000000 --- a/examples/ch13_TwitterV1.1/snippets_ipynb/13_14.ipynb +++ /dev/null @@ -1,156 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.14 Tweet Sentiment Analysis \n", - "\n", - "**NOTE This script has been modified from what we presented in the chapter to accomodate executing it in a notebook** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# sentimentlisener.py\n", - "\"\"\"Script that searches for tweets that match a search string\n", - "and tallies the number of positive, neutral and negative tweets.\"\"\"\n", - "import keys\n", - "import preprocessor as p \n", - "import sys\n", - "from textblob import TextBlob\n", - "import tweepy\n", - "\n", - "class SentimentListener(tweepy.StreamListener):\n", - " \"\"\"Handles incoming Tweet stream.\"\"\"\n", - "\n", - " def __init__(self, api, sentiment_dict, topic, limit=10):\n", - " \"\"\"Configure the SentimentListener.\"\"\"\n", - " self.sentiment_dict = sentiment_dict\n", - " self.tweet_count = 0\n", - " self.topic = topic\n", - " self.TWEET_LIMIT = limit\n", - "\n", - " # set tweet-preprocessor to remove URLs/reserved words\n", - " p.set_options(p.OPT.URL, p.OPT.RESERVED) \n", - " super().__init__(api) # call superclass's init\n", - "\n", - " def on_status(self, status):\n", - " \"\"\"Called when Twitter pushes a new tweet to you.\"\"\"\n", - " # get the tweet's text\n", - " try: \n", - " tweet_text = status.extended_tweet.full_text\n", - " except: \n", - " tweet_text = status.text\n", - "\n", - " # ignore retweets \n", - " if tweet_text.startswith('RT'):\n", - " return\n", - "\n", - " tweet_text = p.clean(tweet_text) # clean the tweet\n", - " \n", - " # ignore tweet if the topic is not in the tweet text\n", - " if self.topic.lower() not in tweet_text.lower():\n", - " return\n", - "\n", - " # update self.sentiment_dict with the polarity\n", - " blob = TextBlob(tweet_text)\n", - " if blob.sentiment.polarity > 0:\n", - " sentiment = '+'\n", - " self.sentiment_dict['positive'] += 1 \n", - " elif blob.sentiment.polarity == 0:\n", - " sentiment = ' '\n", - " self.sentiment_dict['neutral'] += 1 \n", - " else:\n", - " sentiment = '-'\n", - " self.sentiment_dict['negative'] += 1 \n", - " \n", - " # display the tweet\n", - " print(f'{sentiment} {status.user.screen_name}: {tweet_text}\\n')\n", - " \n", - " self.tweet_count += 1 # track number of tweets processed\n", - "\n", - " # if TWEET_LIMIT is reached, return False to terminate streaming\n", - " return self.tweet_count != self.TWEET_LIMIT" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#def main():\n", - "# configure the OAuthHandler\n", - "auth = tweepy.OAuthHandler(keys.consumer_key, keys.consumer_secret)\n", - "auth.set_access_token(keys.access_token, keys.access_token_secret)\n", - "\n", - "# get the API object\n", - "api = tweepy.API(auth, wait_on_rate_limit=True, \n", - " wait_on_rate_limit_notify=True)\n", - " \n", - "# create the StreamListener subclass object\n", - "search_key = 'football' #sys.argv[1]\n", - "limit = 10 #int(sys.argv[2]) # number of tweets to tally\n", - "sentiment_dict = {'positive': 0, 'neutral': 0, 'negative': 0}\n", - "sentiment_listener = SentimentListener(api, \n", - " sentiment_dict, search_key, limit)\n", - "\n", - "# set up Stream \n", - "stream = tweepy.Stream(auth=api.auth, listener=sentiment_listener)\n", - "\n", - "# start filtering English tweets containing search_key\n", - "stream.filter(track=[search_key], languages=['en'], is_async=False) \n", - "\n", - "print(f'Tweet sentiment for \"{search_key}\"')\n", - "print('Positive:', sentiment_dict['positive'])\n", - "print(' Neutral:', sentiment_dict['neutral'])\n", - "print('Negative:', sentiment_dict['negative'])\n", - "\n", - "# call main if this file is executed as a script\n", - "#if __name__ == '__main__':\n", - "# main()\n", - "\n", - "\n", - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch13_TwitterV1.1/snippets_ipynb/13_15.ipynb b/examples/ch13_TwitterV1.1/snippets_ipynb/13_15.ipynb deleted file mode 100755 index 6783325..0000000 --- a/examples/ch13_TwitterV1.1/snippets_ipynb/13_15.ipynb +++ /dev/null @@ -1,363 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.15.1 Getting and Mapping the Tweets\n", - "### Get the `API` Object" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from tweetutilities import get_API" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "api = get_API()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Collections Required By `LocationListener`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweets = [] " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "counts = {'total_tweets': 0, 'locations': 0}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating the `LocationListener` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from locationlistener import LocationListener" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "location_listener = LocationListener(api, counts_dict=counts, \n", - " tweets_list=tweets, topic='football', limit=50)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Configure and Start the Stream of Tweets" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import tweepy" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "stream = tweepy.Stream(auth=api.auth, listener=location_listener)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you're not receiving any tweets, you might want to cancel the following operation and try a different search term. To terminate in a notebook, select **Kernel > Restart Kernel and Clear All Outputs...**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "stream.filter(track=['football'], languages=['en'], is_async=False) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Displaying the Location Statistics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "counts['total_tweets']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "counts['locations']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'{counts[\"locations\"] / counts[\"total_tweets\"]:.1%}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Geocoding the Locations" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from tweetutilities import get_geocodes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "bad_locations = get_geocodes(tweets)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Displaying the Bad Location Statistics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "bad_locations" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'{bad_locations / counts[\"locations\"]:.1%}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Cleaning the Data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.DataFrame(tweets)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "df = df.dropna()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a Map with Folium" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import folium" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "usmap = folium.Map(location=[39.8283, -98.5795], \n", - " zoom_start=5, detect_retina=True)\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating Popup Markers for the Tweet Locations" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for t in df.itertuples():\n", - " text = ': '.join([t.screen_name, t.text])\n", - " popup = folium.Popup(text, parse_html=True)\n", - " marker = folium.Marker((t.latitude, t.longitude), \n", - " popup=popup)\n", - " marker.add_to(usmap)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Saving the Map" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "usmap.save('tweet_map.html')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We added this cell to display the map in the notebook." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "usmap" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch13_TwitterV1.1/snippets_ipynb/13_15_01selfcheck.ipynb b/examples/ch13_TwitterV1.1/snippets_ipynb/13_15_01selfcheck.ipynb deleted file mode 100644 index 8dd6a1b..0000000 --- a/examples/ch13_TwitterV1.1/snippets_ipynb/13_15_01selfcheck.ipynb +++ /dev/null @@ -1,66 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.15.1 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** The folium classes `________` and `________` enable you to mark locations on a map and add text that displays when the user clicks a marked location.\n", - "**Answer:** `Marker`, `Popup`.\n", - "\n", - "**2. _(Fill-In)_** Pandas DataFrame method `________` creates an iterator for accessing the rows of a DataFrame as tuples.\n", - "**Answer:** `itertuples`.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch13_TwitterV1.1/snippets_ipynb/13_15_02selfcheck.ipynb b/examples/ch13_TwitterV1.1/snippets_ipynb/13_15_02selfcheck.ipynb deleted file mode 100755 index af9949e..0000000 --- a/examples/ch13_TwitterV1.1/snippets_ipynb/13_15_02selfcheck.ipynb +++ /dev/null @@ -1,100 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.15.2 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Use an OpenMapQuest geocoding object to get the latitude and Longitude for Chicago, IL.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import keys" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from geopy import OpenMapQuest" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "geo = OpenMapQuest(api_key=keys.mapquest_key)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "geo.geocode('Chicago, IL')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch13_TwitterV1.1/snippets_ipynb/13_15selfcheck.ipynb b/examples/ch13_TwitterV1.1/snippets_ipynb/13_15selfcheck.ipynb deleted file mode 100755 index b16b845..0000000 --- a/examples/ch13_TwitterV1.1/snippets_ipynb/13_15selfcheck.ipynb +++ /dev/null @@ -1,68 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.15 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** The geopy library enables you to translate locations into latitude and longitude coordinates, known as `________`, so you can plot locations on a map. \n", - "\n", - "**Answer:** geocoding\n", - "\n", - "**2. _(Fill-In)_** The OpenMapQuest Geocoding API converts locations, like Boston, MA into their `________` and `________` for plotting on maps.\n", - "\n", - "**Answer:** latitudes, longitudes." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch13_TwitterV1.1/snippets_ipynb/README.txt b/examples/ch13_TwitterV1.1/snippets_ipynb/README.txt deleted file mode 100755 index ebb0a59..0000000 --- a/examples/ch13_TwitterV1.1/snippets_ipynb/README.txt +++ /dev/null @@ -1,2 +0,0 @@ -Sections 18.7-11 use one continuous IPython session for the examples -and Self Check exercises, so all of these are in one notebook. diff --git a/examples/ch13_TwitterV1.1/snippets_ipynb/files/art/.ipynb_checkpoints/check-checkpoint.png b/examples/ch13_TwitterV1.1/snippets_ipynb/files/art/.ipynb_checkpoints/check-checkpoint.png deleted file mode 100755 index eea18cd..0000000 Binary files a/examples/ch13_TwitterV1.1/snippets_ipynb/files/art/.ipynb_checkpoints/check-checkpoint.png and /dev/null differ diff --git a/examples/ch13_TwitterV1.1/snippets_ipynb/files/art/check.png b/examples/ch13_TwitterV1.1/snippets_ipynb/files/art/check.png deleted file mode 100755 index eea18cd..0000000 Binary files a/examples/ch13_TwitterV1.1/snippets_ipynb/files/art/check.png and /dev/null differ diff --git a/examples/ch13_TwitterV1.1/snippets_ipynb/keys.py b/examples/ch13_TwitterV1.1/snippets_ipynb/keys.py deleted file mode 100755 index 4f26031..0000000 --- a/examples/ch13_TwitterV1.1/snippets_ipynb/keys.py +++ /dev/null @@ -1,6 +0,0 @@ -consumer_key = 'YourConsumerKey' -consumer_secret = 'YourConsumerSecret' -access_token = 'YourAccessToken' -access_token_secret = 'YourAccessTokenSecret' - -mapquest_key = 'YourAPIKey' \ No newline at end of file diff --git a/examples/ch13_TwitterV1.1/snippets_ipynb/locationlistener.py b/examples/ch13_TwitterV1.1/snippets_ipynb/locationlistener.py deleted file mode 100755 index b029377..0000000 --- a/examples/ch13_TwitterV1.1/snippets_ipynb/locationlistener.py +++ /dev/null @@ -1,56 +0,0 @@ -# locationlistener.py -"""Receives tweets matching a search string and stores a list of -dictionaries containing each tweet's screen_name/text/location.""" -import tweepy -from tweetutilities import get_tweet_content - -class LocationListener(tweepy.StreamListener): - """Handles incoming Tweet stream to get location data.""" - - def __init__(self, api, counts_dict, tweets_list, topic, limit=10): - """Configure the LocationListener.""" - self.tweets_list = tweets_list - self.counts_dict = counts_dict - self.topic = topic - self.TWEET_LIMIT = limit - super().__init__(api) # call superclass's init - - def on_status(self, status): - """Called when Twitter pushes a new tweet to you.""" - # get each tweet's screen_name, text and location - tweet_data = get_tweet_content(status, location=True) - - # ignore retweets and tweets that do not contain the topic - if (tweet_data['text'].startswith('RT') or - self.topic.lower() not in tweet_data['text'].lower()): - return - - self.counts_dict['total_tweets'] += 1 # original tweet - - # ignore tweets with no location and non-English tweets - if not status.user.location: - return - - self.counts_dict['locations'] += 1 # tweet with location - self.tweets_list.append(tweet_data) # store the tweet - print(f'{status.user.screen_name}: {tweet_data["text"]}\n') - - # if TWEET_LIMIT is reached, return False to terminate streaming - return self.counts_dict['locations'] <= self.TWEET_LIMIT - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV1.1/snippets_ipynb/sentimentlistener.py b/examples/ch13_TwitterV1.1/snippets_ipynb/sentimentlistener.py deleted file mode 100755 index e5ef419..0000000 --- a/examples/ch13_TwitterV1.1/snippets_ipynb/sentimentlistener.py +++ /dev/null @@ -1,108 +0,0 @@ -# sentimentlisener.py -"""Script that searches for tweets that match a search string -and tallies the number of positive, neutral and negative tweets.""" -import keys -import preprocessor as p -import sys -from textblob import TextBlob -import tweepy - -class SentimentListener(tweepy.StreamListener): - """Handles incoming Tweet stream.""" - - def __init__(self, api, sentiment_dict, topic, limit=10): - """Configure the SentimentListener.""" - self.sentiment_dict = sentiment_dict - self.tweet_count = 0 - self.topic = topic - self.TWEET_LIMIT = limit - # set tweet-preprocessor to remove URLs/reserved words - p.set_options(p.OPT.URL, p.OPT.RESERVED) - super().__init__(api) # call superclass's init - - def on_error(self, status_code): - print(status_code) - - def on_status(self, status): - """Called when Twitter pushes a new tweet to you.""" - # get the tweet's text - try: - tweet_text = status.extended_tweet.full_text - except: - tweet_text = status.text - - # ignore retweets - if tweet_text.startswith('RT'): - return - - tweet_text = p.clean(tweet_text) # clean the tweet - - # ignore tweet if the topic is not in the tweet text - if self.topic.lower() not in tweet_text.lower(): - return - - # update self.sentiment_dict with the polarity - blob = TextBlob(tweet_text) - if blob.sentiment.polarity > 0: - sentiment = '+' - self.sentiment_dict['positive'] += 1 - elif blob.sentiment.polarity == 0: - sentiment = ' ' - self.sentiment_dict['neutral'] += 1 - else: - sentiment = '-' - self.sentiment_dict['negative'] += 1 - - # display the tweet - print(f'{sentiment} {status.user.screen_name}: {tweet_text}\n') - - self.tweet_count += 1 # track number of tweets processed - - # if TWEET_LIMIT is reached, return False to terminate streaming - return self.tweet_count <= self.TWEET_LIMIT - -def main(): - # configure the OAuthHandler - auth = tweepy.OAuthHandler(keys.consumer_key, keys.consumer_secret) - auth.set_access_token(keys.access_token, keys.access_token_secret) - - # get the API object - api = tweepy.API(auth, wait_on_rate_limit=True, - wait_on_rate_limit_notify=True) - - # create the StreamListener subclass object - search_key = sys.argv[1] - limit = int(sys.argv[2]) # number of tweets to tally - sentiment_dict = {'positive': 0, 'neutral': 0, 'negative': 0} - sentiment_listener = SentimentListener(api, - sentiment_dict, search_key, limit) - - # set up Stream - stream = tweepy.Stream(auth=api.auth, listener=sentiment_listener) - - # start filtering English tweets containing search_key - stream.filter(track=[search_key], languages=['en'], is_async=False) - - print(f'Tweet sentiment for "{search_key}"') - print('Positive:', sentiment_dict['positive']) - print(' Neutral:', sentiment_dict['neutral']) - print('Negative:', sentiment_dict['negative']) - -# call main if this file is executed as a script -if __name__ == '__main__': - main() - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV1.1/snippets_ipynb/tweetlistener.py b/examples/ch13_TwitterV1.1/snippets_ipynb/tweetlistener.py deleted file mode 100755 index f34a51e..0000000 --- a/examples/ch13_TwitterV1.1/snippets_ipynb/tweetlistener.py +++ /dev/null @@ -1,54 +0,0 @@ -# tweetlistener.py -"""tweepy.StreamListener subclass that processes tweets as they arrive.""" -import tweepy -from textblob import TextBlob - -class TweetListener(tweepy.StreamListener): - """Handles incoming Tweet stream.""" - - def __init__(self, api, limit=10): - """Create instance variables for tracking number of tweets.""" - self.tweet_count = 0 - self.TWEET_LIMIT = limit - super().__init__(api) # call superclass's init - - def on_connect(self): - """Called when your connection attempt is successful, enabling - you to perform appropriate application tasks at that point.""" - print('Connection successful\n') - - def on_status(self, status): - """Called when Twitter pushes a new tweet to you.""" - # get the tweet text - try: - tweet_text = status.extended_tweet.full_text - except: - tweet_text = status.text - - print(f'Screen name: {status.user.screen_name}:') - print(f' Language: {status.lang}') - print(f' Status: {tweet_text}') - - if status.lang != 'en': - print(f' Translated: {TextBlob(tweet_text).translate()}') - - print() - self.tweet_count += 1 # track number of tweets processed - - # if TWEET_LIMIT is reached, return False to terminate streaming - return self.tweet_count <= self.TWEET_LIMIT - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV1.1/snippets_ipynb/tweetutilities.py b/examples/ch13_TwitterV1.1/snippets_ipynb/tweetutilities.py deleted file mode 100755 index 25456b9..0000000 --- a/examples/ch13_TwitterV1.1/snippets_ipynb/tweetutilities.py +++ /dev/null @@ -1,90 +0,0 @@ -# tweetutilities.py -"""Utility functions for interacting with Tweepy objects.""" -from geopy import OpenMapQuest -import keys -from textblob import TextBlob -import time -import tweepy - -def get_API(wait=True, notify=True): - """Authenticate with Twitter and return API object.""" - # configure the OAuthHandler - auth = tweepy.OAuthHandler(keys.consumer_key, keys.consumer_secret) - auth.set_access_token(keys.access_token, keys.access_token_secret) - - # get the API object - return tweepy.API(auth, wait_on_rate_limit=wait, - wait_on_rate_limit_notify=notify) - -def print_tweets(tweets): - """For each Tweepy Status object in tweets, display the - user's screen_name and tweet text. If the language is not - English, translate the text with TextBlob.""" - for tweet in tweets: - print(f'{tweet.user.screen_name}:', end=' ') - - if 'en' in tweet.lang: - print(f'{tweet.text}\n') - elif 'und' not in tweet.lang: # translate to English first - print(f'\n ORIGINAL: {tweet.text}') - print(f'TRANSLATED: {TextBlob(tweet.text).translate()}\n') - -def get_tweet_content(tweet, location=False): - """Return dictionary with data from tweet (a Status object).""" - fields = {} - fields['screen_name'] = tweet.user.screen_name - - # get the tweet's text - try: - fields['text'] = tweet.extended_tweet.full_text - except: - fields['text'] = tweet.text - - if location: - fields['location'] = tweet.user.location - - return fields - -def get_geocodes(tweet_list): - """Get the latitude and longitude for each tweet's location. - Returns the number of tweets with invalid location data.""" - print('Getting coordinates for tweet locations...') - geo = OpenMapQuest(api_key=keys.mapquest_key) # geocoder - bad_locations = 0 - - for tweet in tweet_list: - processed = False - delay = .1 # used if OpenMapQuest times out to delay next call - while not processed: - try: # get coordinates for tweet['location'] - geo_location = geo.geocode(tweet['location']) - processed = True - except: # timed out, so wait before trying again - print('OpenMapQuest service timed out. Waiting.') - time.sleep(delay) - delay += .1 - - if geo_location: - tweet['latitude'] = geo_location.latitude - tweet['longitude'] = geo_location.longitude - else: - bad_locations += 1 # tweet['location'] was invalid - - print('Done geocoding') - return bad_locations - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV1.1/snippets_py/13_07-11withSelfChecks.py b/examples/ch13_TwitterV1.1/snippets_py/13_07-11withSelfChecks.py deleted file mode 100755 index 2671363..0000000 --- a/examples/ch13_TwitterV1.1/snippets_py/13_07-11withSelfChecks.py +++ /dev/null @@ -1,221 +0,0 @@ -# Section 13.7-13.11 snippets with Self Checks -# because those sections are one running IPython session - -# 13.7 Authenticating with Twitter Via Tweepy -import tweepy - -import keys - -# Creating and Configuring an OAuthHandler to Authenticate with Twitter -auth = tweepy.OAuthHandler(keys.consumer_key, - keys.consumer_secret) - -auth.set_access_token(keys.access_token, - keys.access_token_secret) - -# Creating an API Object -api = tweepy.API(auth, wait_on_rate_limit=True, - wait_on_rate_limit_notify=True) - -# 13.8 Getting Information About a Twitter Account -nasa = api.get_user('nasa') - -# Getting Basic Account Information -nasa.id - -nasa.name - -nasa.screen_name - -nasa.description - -# Getting the Most Recent Status Update -nasa.status.text - -# Getting the Number of Followers -nasa.followers_count - -# Getting the Number of Friends -nasa.friends_count - -# Getting Your Own Account’s Information - -# Self Check Exercise 3 -nasa_kepler = api.get_user('NASAKepler') - -nasa_kepler.followers_count - -nasa_kepler.status.text - -# 13.9 Introduction to Tweepy Cursors: Getting an Account’s Followers and Friends -# 13.9.1 Determining an Account’s Followers -followers = [] - -# Creating a Cursor -cursor = tweepy.Cursor(api.followers, screen_name='nasa') - -# Getting Results -for account in cursor.items(10): - followers.append(account.screen_name) - -print('Followers:', - ' '.join(sorted(followers, key=lambda s: s.lower()))) - -# Automatic Paging - -# Getting Follower IDs Rather Than Followers - -# Self Check Exercise 3 -kepler_followers = [] - -cursor = tweepy.Cursor(api.followers, screen_name='NASAKepler') - -for account in cursor.items(10): - kepler_followers.append(account.screen_name) - -print(' '.join(kepler_followers)) - -# 13.9.2 Determining Whom an Account Follows -friends = [] - -cursor = tweepy.Cursor(api.friends, screen_name='nasa') - -for friend in cursor.items(10): - friends.append(friend.screen_name) - -print('Friends:', - ' '.join(sorted(friends, key=lambda s: s.lower()))) - -# 13.9.3 Getting a User’s Recent Tweets -nasa_tweets = api.user_timeline(screen_name='nasa', count=3) - -for tweet in nasa_tweets: - print(f'{tweet.user.screen_name}: {tweet.text}\n') - -# Grabbing Recent Tweets from Your Own Timeline - -# Self Check 2 -kepler_tweets = api.user_timeline( - screen_name='NASAKepler', count=2) - -for tweet in kepler_tweets: - print(f'{tweet.user.screen_name}: {tweet.text}\n') - -# 13.10 Searching Recent Tweets -# Tweet Printer -from tweetutilities import print_tweets - -# Searching for Specific Words -tweets = api.search(q='Mars Opportunity Rover', count=3) - -print_tweets(tweets) - -# Searching with Twitter Search Operators -tweets = api.search(q='from:nasa since:2018-09-01', count=3) - -print_tweets(tweets) - -# Searching for a Hashtag -tweets = api.search(q='#collegefootball', count=20) - -print_tweets(tweets) - -# Self Check 3 -tweets = api.search(q='astronaut from:nasa', count=1) - -print_tweets(tweets) - -# 13.11 Spotting Trends with the Twitter Trends API -# 13.11.1 Places with Trending Topics -trends_available = api.trends_available() - -len(trends_available) - -trends_available[0] - -trends_available[1] - -# 13.11.2 Getting a List of Trending Topics -# Worldwide Trending Topics -world_trends = api.trends_place(id=1) - -trends_list = world_trends[0]['trends'] - -trends_list[0] - -trends_list = [t for t in trends_list if t['tweet_volume']] - -from operator import itemgetter - -trends_list.sort(key=itemgetter('tweet_volume'), reverse=True) - -for trend in trends_list[:5]: - print(trend['name']) - -# New York City Trending Topics -nyc_trends = api.trends_place(id=2459115) # New York City WOEID - -nyc_list = nyc_trends[0]['trends'] - -nyc_list = [t for t in nyc_list if t['tweet_volume']] - -nyc_list.sort(key=itemgetter('tweet_volume'), reverse=True) - -for trend in nyc_list[:5]: - print(trend['name']) - -# Self Check 3 -us_trends = api.trends_place(id='23424977') - -us_list = us_trends[0]['trends'] - -us_list = [t for t in us_list if t['tweet_volume']] - -us_list.sort(key=itemgetter('tweet_volume'), reverse=True) - -for trend in us_list[:3]: - print(trend['name']) - -# 13.11.3 Create a Word Cloud from Trending Topics -topics = {} - -for trend in nyc_list: - topics[trend['name']] = trend['tweet_volume'] - -from wordcloud import WordCloud - -wordcloud = WordCloud(width=1600, height=900, - prefer_horizontal=0.5, min_font_size=10, colormap='prism', - background_color='white') - -wordcloud = wordcloud.fit_words(topics) - -wordcloud = wordcloud.to_file('TrendingTwitter.png') - -# Self Check 1 -topics = {} - -for trend in us_list: - topics[trend['name']] = trend['tweet_volume'] - -wordcloud = wordcloud.fit_words(topics) - -wordcloud = wordcloud.to_file('USTrendingTwitter.png') - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV1.1/snippets_py/13_12.py b/examples/ch13_TwitterV1.1/snippets_py/13_12.py deleted file mode 100755 index 1178cdc..0000000 --- a/examples/ch13_TwitterV1.1/snippets_py/13_12.py +++ /dev/null @@ -1,28 +0,0 @@ -# Section 13.12 snippets - -import preprocessor as p - -p.set_options(p.OPT.URL, p.OPT.RESERVED) - -tweet_text = 'RT A sample retweet with a URL https://nasa.gov' - -p.clean(tweet_text) - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV1.1/snippets_py/13_13_02.py b/examples/ch13_TwitterV1.1/snippets_py/13_13_02.py deleted file mode 100755 index 4014ce9..0000000 --- a/examples/ch13_TwitterV1.1/snippets_py/13_13_02.py +++ /dev/null @@ -1,47 +0,0 @@ -########################################################################## Section 13.13.2 snippets -# Authenticating -import tweepy - -import keys - -auth = tweepy.OAuthHandler(keys.consumer_key, - keys.consumer_secret) - -auth.set_access_token(keys.access_token, - keys.access_token_secret) - -api = tweepy.API(auth, wait_on_rate_limit=True, - wait_on_rate_limit_notify=True) - -# Creating a TweetListener -from tweetlistener import TweetListener - -tweet_listener = TweetListener(api) - -# Creating a Stream -tweet_stream = tweepy.Stream(auth=api.auth, - listener=tweet_listener) - -# Starting the TweetListeneret Stream -tweet_stream.filter(track=['Mars Rover'], is_async=True) - -# Asynchronous vs. Synchronous Streams - -# Other filter Method Parameters - -# Twitter Restrictions Note - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV1.1/snippets_py/13_15_01.py b/examples/ch13_TwitterV1.1/snippets_py/13_15_01.py deleted file mode 100755 index 585b1e2..0000000 --- a/examples/ch13_TwitterV1.1/snippets_py/13_15_01.py +++ /dev/null @@ -1,83 +0,0 @@ -# Section 13.15.1 snippets - -# Get the API Object -from tweetutilities import get_API - -api = get_API() - -# Collections Required By LocationListener -tweets = [] - -counts = {'total_tweets': 0, 'locations': 0} - -# Creating the LocationListener -from locationlistener import LocationListener - -location_listener = LocationListener(api, counts_dict=counts, - tweets_list=tweets, topic='football', limit=50) - -# Configure and Start the Stream of Tweets -import tweepy - -stream = tweepy.Stream(auth=api.auth, listener=location_listener) - -stream.filter(track=['football'], languages=['en'], is_async=False) - -# Displaying the Location Statistics -counts['total_tweets'] - -counts['locations'] - -print(f'{counts["locations"] / counts["total_tweets"]:.1%}') - -# Geocoding the Locations -from tweetutilities import get_geocodes - -bad_locations = get_geocodes(tweets) - -# Displaying the Bad Location Statistics -bad_locations - -print(f'{bad_locations / counts["locations"]:.1%}') - -# Cleaning the Data -import pandas as pd - -df = pd.DataFrame(tweets) - -df = df.dropna() - -# Creating a Map with Folium -import folium - -usmap = folium.Map(location=[39.8283, -98.5795], tiles='Stamen Terrain', - zoom_start=5, detect_retina=True) - -# Creating Popup Markers for the Tweet Locations -for t in df.itertuples(): - text = ': '.join([t.screen_name, t.text]) - popup = folium.Popup(text, parse_html=True) - marker = folium.Marker((t.latitude, t.longitude), - popup=popup) - marker.add_to(usmap) - -# Saving the Map -usmap.save('tweet_map.html') - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV1.1/snippets_py/13_15_02selfcheck.py b/examples/ch13_TwitterV1.1/snippets_py/13_15_02selfcheck.py deleted file mode 100755 index a6adaaf..0000000 --- a/examples/ch13_TwitterV1.1/snippets_py/13_15_02selfcheck.py +++ /dev/null @@ -1,26 +0,0 @@ -# Section 15.2 Self Check snippets - -# Exercise 1 -import keys - -from geopy import OpenMapQuest - -geo = OpenMapQuest(api_key=keys.mapquest_key) - -geo.geocode('Chicago, IL') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV1.1/snippets_py/README.txt b/examples/ch13_TwitterV1.1/snippets_py/README.txt deleted file mode 100755 index 3aee310..0000000 --- a/examples/ch13_TwitterV1.1/snippets_py/README.txt +++ /dev/null @@ -1,3 +0,0 @@ -Sections 14.7-11 use one continuous IPython session for the -examples and Self Check exercises, so all of these are in one -snippet file. diff --git a/examples/ch13_TwitterV1.1/snippets_py/keys.py b/examples/ch13_TwitterV1.1/snippets_py/keys.py deleted file mode 100755 index 4f26031..0000000 --- a/examples/ch13_TwitterV1.1/snippets_py/keys.py +++ /dev/null @@ -1,6 +0,0 @@ -consumer_key = 'YourConsumerKey' -consumer_secret = 'YourConsumerSecret' -access_token = 'YourAccessToken' -access_token_secret = 'YourAccessTokenSecret' - -mapquest_key = 'YourAPIKey' \ No newline at end of file diff --git a/examples/ch13_TwitterV1.1/snippets_py/locationlistener.py b/examples/ch13_TwitterV1.1/snippets_py/locationlistener.py deleted file mode 100755 index b029377..0000000 --- a/examples/ch13_TwitterV1.1/snippets_py/locationlistener.py +++ /dev/null @@ -1,56 +0,0 @@ -# locationlistener.py -"""Receives tweets matching a search string and stores a list of -dictionaries containing each tweet's screen_name/text/location.""" -import tweepy -from tweetutilities import get_tweet_content - -class LocationListener(tweepy.StreamListener): - """Handles incoming Tweet stream to get location data.""" - - def __init__(self, api, counts_dict, tweets_list, topic, limit=10): - """Configure the LocationListener.""" - self.tweets_list = tweets_list - self.counts_dict = counts_dict - self.topic = topic - self.TWEET_LIMIT = limit - super().__init__(api) # call superclass's init - - def on_status(self, status): - """Called when Twitter pushes a new tweet to you.""" - # get each tweet's screen_name, text and location - tweet_data = get_tweet_content(status, location=True) - - # ignore retweets and tweets that do not contain the topic - if (tweet_data['text'].startswith('RT') or - self.topic.lower() not in tweet_data['text'].lower()): - return - - self.counts_dict['total_tweets'] += 1 # original tweet - - # ignore tweets with no location and non-English tweets - if not status.user.location: - return - - self.counts_dict['locations'] += 1 # tweet with location - self.tweets_list.append(tweet_data) # store the tweet - print(f'{status.user.screen_name}: {tweet_data["text"]}\n') - - # if TWEET_LIMIT is reached, return False to terminate streaming - return self.counts_dict['locations'] <= self.TWEET_LIMIT - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV1.1/snippets_py/sentimentlistener.py b/examples/ch13_TwitterV1.1/snippets_py/sentimentlistener.py deleted file mode 100755 index ed4a3e0..0000000 --- a/examples/ch13_TwitterV1.1/snippets_py/sentimentlistener.py +++ /dev/null @@ -1,106 +0,0 @@ -# sentimentlisener.py -"""Script that searches for tweets that match a search string -and tallies the number of positive, neutral and negative tweets.""" -import keys -import preprocessor as p -import sys -from textblob import TextBlob -import tweepy - -class SentimentListener(tweepy.StreamListener): - """Handles incoming Tweet stream.""" - - def __init__(self, api, sentiment_dict, topic, limit=10): - """Configure the SentimentListener.""" - self.sentiment_dict = sentiment_dict - self.tweet_count = 0 - self.topic = topic - self.TWEET_LIMIT = limit - - # set tweet-preprocessor to remove URLs/reserved words - p.set_options(p.OPT.URL, p.OPT.RESERVED) - super().__init__(api) # call superclass's init - - def on_status(self, status): - """Called when Twitter pushes a new tweet to you.""" - # get the tweet's text - try: - tweet_text = status.extended_tweet.full_text - except: - tweet_text = status.text - - # ignore retweets - if tweet_text.startswith('RT'): - return - - tweet_text = p.clean(tweet_text) # clean the tweet - - # ignore tweet if the topic is not in the tweet text - if self.topic.lower() not in tweet_text.lower(): - return - - # update self.sentiment_dict with the polarity - blob = TextBlob(tweet_text) - if blob.sentiment.polarity > 0: - sentiment = '+' - self.sentiment_dict['positive'] += 1 - elif blob.sentiment.polarity == 0: - sentiment = ' ' - self.sentiment_dict['neutral'] += 1 - else: - sentiment = '-' - self.sentiment_dict['negative'] += 1 - - # display the tweet - print(f'{sentiment} {status.user.screen_name}: {tweet_text}\n') - - self.tweet_count += 1 # track number of tweets processed - - # if TWEET_LIMIT is reached, return False to terminate streaming - return self.tweet_count <= self.TWEET_LIMIT - -def main(): - # configure the OAuthHandler - auth = tweepy.OAuthHandler(keys.consumer_key, keys.consumer_secret) - auth.set_access_token(keys.access_token, keys.access_token_secret) - - # get the API object - api = tweepy.API(auth, wait_on_rate_limit=True, - wait_on_rate_limit_notify=True) - - # create the StreamListener subclass object - search_key = sys.argv[1] - limit = int(sys.argv[2]) # number of tweets to tally - sentiment_dict = {'positive': 0, 'neutral': 0, 'negative': 0} - sentiment_listener = SentimentListener(api, - sentiment_dict, search_key, limit) - - # set up Stream - stream = tweepy.Stream(auth=api.auth, listener=sentiment_listener) - - # start filtering English tweets containing search_key - stream.filter(track=[search_key], languages=['en'], is_async=False) - - print(f'Tweet sentiment for "{search_key}"') - print('Positive:', sentiment_dict['positive']) - print(' Neutral:', sentiment_dict['neutral']) - print('Negative:', sentiment_dict['negative']) - -# call main if this file is executed as a script -if __name__ == '__main__': - main() - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV1.1/snippets_py/tweet_map.html b/examples/ch13_TwitterV1.1/snippets_py/tweet_map.html deleted file mode 100644 index e2c9e29..0000000 --- a/examples/ch13_TwitterV1.1/snippets_py/tweet_map.html +++ /dev/null @@ -1,1100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - -
- - \ No newline at end of file diff --git a/examples/ch13_TwitterV1.1/snippets_py/tweetlistener.py b/examples/ch13_TwitterV1.1/snippets_py/tweetlistener.py deleted file mode 100755 index f34a51e..0000000 --- a/examples/ch13_TwitterV1.1/snippets_py/tweetlistener.py +++ /dev/null @@ -1,54 +0,0 @@ -# tweetlistener.py -"""tweepy.StreamListener subclass that processes tweets as they arrive.""" -import tweepy -from textblob import TextBlob - -class TweetListener(tweepy.StreamListener): - """Handles incoming Tweet stream.""" - - def __init__(self, api, limit=10): - """Create instance variables for tracking number of tweets.""" - self.tweet_count = 0 - self.TWEET_LIMIT = limit - super().__init__(api) # call superclass's init - - def on_connect(self): - """Called when your connection attempt is successful, enabling - you to perform appropriate application tasks at that point.""" - print('Connection successful\n') - - def on_status(self, status): - """Called when Twitter pushes a new tweet to you.""" - # get the tweet text - try: - tweet_text = status.extended_tweet.full_text - except: - tweet_text = status.text - - print(f'Screen name: {status.user.screen_name}:') - print(f' Language: {status.lang}') - print(f' Status: {tweet_text}') - - if status.lang != 'en': - print(f' Translated: {TextBlob(tweet_text).translate()}') - - print() - self.tweet_count += 1 # track number of tweets processed - - # if TWEET_LIMIT is reached, return False to terminate streaming - return self.tweet_count <= self.TWEET_LIMIT - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV1.1/snippets_py/tweetutilities.py b/examples/ch13_TwitterV1.1/snippets_py/tweetutilities.py deleted file mode 100755 index eb84c33..0000000 --- a/examples/ch13_TwitterV1.1/snippets_py/tweetutilities.py +++ /dev/null @@ -1,90 +0,0 @@ -# tweetutilities.py -"""Utility functions for interacting with Tweepy objects.""" -from geopy import OpenMapQuest -import keys -from textblob import TextBlob -import time -import tweepy - -def get_API(wait=True, notify=True): - """Authenticate with Twitter and return API object.""" - # configure the OAuthHandler - auth = tweepy.OAuthHandler(keys.consumer_key, keys.consumer_secret) - auth.set_access_token(keys.access_token, keys.access_token_secret) - - # get the API object - return tweepy.API(auth, wait_on_rate_limit=wait, - wait_on_rate_limit_notify=notify) - -def print_tweets(tweets): - """For each Tweepy Status object in tweets, display the - user's screen_name and tweet text. If the language is not - English, translate the text with TextBlob.""" - for tweet in tweets: - print(f'{tweet.user.screen_name}:', end=' ') - - if 'en' in tweet.lang: - print(f'{tweet.text}\n') - elif 'und' not in tweet.lang: # translate to English first - print(f'\n ORIGINAL: {tweet.text}') - print(f'TRANSLATED: {TextBlob(tweet.text).translate()}\n') - -def get_tweet_content(tweet, location=False): - """Return dictionary with data from tweet (a Status object).""" - fields = {} - fields['screen_name'] = tweet.user.screen_name - - # get the tweet's text - try: - fields['text'] = tweet.extended_tweet.full_text - except: - fields['text'] = tweet.text - - if location: - fields['location'] = tweet.user.location - - return fields - -def get_geocodes(tweet_list): - """Get the latitude and longitude for each tweet's location. - Returns the number of tweets with invalid location data.""" - print('Getting coordinates for tweet locations...') - geo = OpenMapQuest(api_key=keys.mapquest_key) # geocoder - bad_locations = 0 - - for tweet in tweet_list: - processed = False - delay = .1 # used if OpenMapQuest times out to delay next call - while not processed: - try: # get coordinates for tweet['location'] - geo_location = geo.geocode(tweet['location']) - processed = True - except: # timed out, so wait before trying again - print('OpenMapQuest service timed out. Waiting.') - time.sleep(delay) - delay += .1 - - if geo_location: - tweet['latitude'] = geo_location.latitude - tweet['longitude'] = geo_location.longitude - else: - bad_locations += 1 # tweet['location'] was invalid - - print('Done geocoding') - return bad_locations - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV1.1/tweetlistener.py b/examples/ch13_TwitterV1.1/tweetlistener.py deleted file mode 100755 index f34a51e..0000000 --- a/examples/ch13_TwitterV1.1/tweetlistener.py +++ /dev/null @@ -1,54 +0,0 @@ -# tweetlistener.py -"""tweepy.StreamListener subclass that processes tweets as they arrive.""" -import tweepy -from textblob import TextBlob - -class TweetListener(tweepy.StreamListener): - """Handles incoming Tweet stream.""" - - def __init__(self, api, limit=10): - """Create instance variables for tracking number of tweets.""" - self.tweet_count = 0 - self.TWEET_LIMIT = limit - super().__init__(api) # call superclass's init - - def on_connect(self): - """Called when your connection attempt is successful, enabling - you to perform appropriate application tasks at that point.""" - print('Connection successful\n') - - def on_status(self, status): - """Called when Twitter pushes a new tweet to you.""" - # get the tweet text - try: - tweet_text = status.extended_tweet.full_text - except: - tweet_text = status.text - - print(f'Screen name: {status.user.screen_name}:') - print(f' Language: {status.lang}') - print(f' Status: {tweet_text}') - - if status.lang != 'en': - print(f' Translated: {TextBlob(tweet_text).translate()}') - - print() - self.tweet_count += 1 # track number of tweets processed - - # if TWEET_LIMIT is reached, return False to terminate streaming - return self.tweet_count <= self.TWEET_LIMIT - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV1.1/tweetutilities.py b/examples/ch13_TwitterV1.1/tweetutilities.py deleted file mode 100755 index eb84c33..0000000 --- a/examples/ch13_TwitterV1.1/tweetutilities.py +++ /dev/null @@ -1,90 +0,0 @@ -# tweetutilities.py -"""Utility functions for interacting with Tweepy objects.""" -from geopy import OpenMapQuest -import keys -from textblob import TextBlob -import time -import tweepy - -def get_API(wait=True, notify=True): - """Authenticate with Twitter and return API object.""" - # configure the OAuthHandler - auth = tweepy.OAuthHandler(keys.consumer_key, keys.consumer_secret) - auth.set_access_token(keys.access_token, keys.access_token_secret) - - # get the API object - return tweepy.API(auth, wait_on_rate_limit=wait, - wait_on_rate_limit_notify=notify) - -def print_tweets(tweets): - """For each Tweepy Status object in tweets, display the - user's screen_name and tweet text. If the language is not - English, translate the text with TextBlob.""" - for tweet in tweets: - print(f'{tweet.user.screen_name}:', end=' ') - - if 'en' in tweet.lang: - print(f'{tweet.text}\n') - elif 'und' not in tweet.lang: # translate to English first - print(f'\n ORIGINAL: {tweet.text}') - print(f'TRANSLATED: {TextBlob(tweet.text).translate()}\n') - -def get_tweet_content(tweet, location=False): - """Return dictionary with data from tweet (a Status object).""" - fields = {} - fields['screen_name'] = tweet.user.screen_name - - # get the tweet's text - try: - fields['text'] = tweet.extended_tweet.full_text - except: - fields['text'] = tweet.text - - if location: - fields['location'] = tweet.user.location - - return fields - -def get_geocodes(tweet_list): - """Get the latitude and longitude for each tweet's location. - Returns the number of tweets with invalid location data.""" - print('Getting coordinates for tweet locations...') - geo = OpenMapQuest(api_key=keys.mapquest_key) # geocoder - bad_locations = 0 - - for tweet in tweet_list: - processed = False - delay = .1 # used if OpenMapQuest times out to delay next call - while not processed: - try: # get coordinates for tweet['location'] - geo_location = geo.geocode(tweet['location']) - processed = True - except: # timed out, so wait before trying again - print('OpenMapQuest service timed out. Waiting.') - time.sleep(delay) - delay += .1 - - if geo_location: - tweet['latitude'] = geo_location.latitude - tweet['longitude'] = geo_location.longitude - else: - bad_locations += 1 # tweet['location'] was invalid - - print('Done geocoding') - return bad_locations - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/.ipynb_checkpoints/_READ_ME_FIRST-checkpoint b/examples/ch13_TwitterV2/.ipynb_checkpoints/_READ_ME_FIRST-checkpoint deleted file mode 100644 index eb2b19f..0000000 --- a/examples/ch13_TwitterV2/.ipynb_checkpoints/_READ_ME_FIRST-checkpoint +++ /dev/null @@ -1,20 +0,0 @@ -Upgrading from Twitter v1.1 to Twitter v2 -On August 18, 2022, we discovered that new Twitter developer accounts cannot access the Twitter version 1.1 APIs on which we based Chapter 13, Data Mining Twitter, and two case studies in Chapter 17, Big Data: Hadoop, Spark, NoSQL and IoT. - -Twitter users who already had Twitter developer accounts can still access the Twitter version 1.1 APIs, but most students and some instructors will not fall into this category. - -We’re updating Chapter 13 and the two case studies in Chapter 17 to the Twitter version 2 APIs. We anticipate this could take two to four weeks as we: -1. master the new Twitter v2 APIs, -2. update our Chapter 13 and 17 code examples, -3. rewrite the code explanations in Chapters 13 and 17 to match the new code, -4. update the exercise descriptions, -5. update the instructor resources: instructor’s manual solutions, test-item file, and Jupyter Notebooks slides (we use these in lieu of PowerPoint slides for our Python book), and -6. update the student resources: source-code files and Jupyter Notebooks. - -Once completed, we’ll: -• post an updated version of Chapter 13 and the relevant sections of Chapter 17 to the book’s companion website on https://pearson.com/deitel, -• post an updated version of Chapter 13 and the relevant sections of Chapter 17 to the book’s webpage on https://deitel.com, -• post updated instructor materials to the Pearson Instructor Resource Center (IRC), which is accessible only to qualified instructors, and -• post updated student files to the book’s GitHub repository. - -If you have any questions, please email paul@deitel.com. diff --git a/examples/ch13_TwitterV2/_READ_ME_FIRST b/examples/ch13_TwitterV2/_READ_ME_FIRST deleted file mode 100644 index d901e2f..0000000 --- a/examples/ch13_TwitterV2/_READ_ME_FIRST +++ /dev/null @@ -1,16 +0,0 @@ -# Upgrading from Twitter v1.1 to Twitter v2 - -On August 18, 2022, we discovered that **new** Twitter developer accounts cannot access the Twitter version 1.1 APIs on which we based Chapter 13, Data Mining Twitter, and two case studies in Chapter 17, Big Data: Hadoop, Spark, NoSQL and IoT. - -Twitter users who already had Twitter developer accounts can still access the Twitter version 1.1 APIs, but most students and some instructors will not fall into this category. - -We’ve already rewritten Chapter 13 to the Twitter version 2 APIs and will be rewriting the two Twitter-based Chapter 17 case studies soon. - -The updated chapter is posted on the book's webpage: -https://deitel.com/intro-to-python-for-computer-science-and-data-science/ - -Once completed, we’ll post updated versions of: -* the Chapter 17 Twitter-based case studies -* the instructor materials to the Pearson Instructor Resource Center (IRC), which is accessible only to qualified instructors. - -Questions? Please email paul@deitel.com. diff --git a/examples/ch13_TwitterV2/keys.py b/examples/ch13_TwitterV2/keys.py deleted file mode 100755 index bf7c356..0000000 --- a/examples/ch13_TwitterV2/keys.py +++ /dev/null @@ -1,2 +0,0 @@ -bearer_token = 'YourBearerToken' -mapquest_key = 'YourAPIKey' \ No newline at end of file diff --git a/examples/ch13_TwitterV2/locationlistener.py b/examples/ch13_TwitterV2/locationlistener.py deleted file mode 100755 index f154d61..0000000 --- a/examples/ch13_TwitterV2/locationlistener.py +++ /dev/null @@ -1,59 +0,0 @@ -# locationlistener.py -"""Receives tweets matching a search string and stores a list of -dictionaries containing each tweet's username/text/location.""" -import tweepy -from tweetutilities import get_tweet_content - -class LocationListener(tweepy.StreamingClient): - """Handles incoming Tweet stream to get location data.""" - - def __init__(self, bearer_token, counts_dict, - tweets_list, topic, limit=10): - """Configure the LocationListener.""" - self.tweets_list = tweets_list - self.counts_dict = counts_dict - self.topic = topic - self.TWEET_LIMIT = limit - super().__init__(bearer_token, wait_on_rate_limit=True) - - def on_response(self, response): - """Called when Twitter pushes a new tweet to you.""" - - # get tweet's username, text and location - tweet_data = get_tweet_content(response) - - # ignore retweets and tweets that do not contain the topic - if (tweet_data['text'].startswith('RT') or - self.topic.lower() not in tweet_data['text'].lower()): - return - - self.counts_dict['total_tweets'] += 1 # it's an original tweet - - # ignore tweets with no location - if not tweet_data.get('location'): - return - - self.counts_dict['locations'] += 1 # user account has location - self.tweets_list.append(tweet_data) # store the tweet - print(f"{tweet_data['username']}: {tweet_data['text']}\n") - - # if TWEET_LIMIT is reached, terminate streaming - if self.counts_dict['locations'] == self.TWEET_LIMIT: - self.disconnect() - - - -########################################################################## -# (C) Copyright 2022 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/sentimentlistener.py b/examples/ch13_TwitterV2/sentimentlistener.py deleted file mode 100755 index 2cc45ec..0000000 --- a/examples/ch13_TwitterV2/sentimentlistener.py +++ /dev/null @@ -1,106 +0,0 @@ -# sentimentlisener.py -"""Searches for tweets that match a search string and tallies -the number of positive, neutral and negative tweets.""" -import keys -import preprocessor as p -import sys -from textblob import TextBlob -import tweepy - -class SentimentListener(tweepy.StreamingClient): - """Handles incoming Tweet stream.""" - - def __init__(self, bearer_token, sentiment_dict, topic, limit=10): - """Configure the SentimentListener.""" - self.sentiment_dict = sentiment_dict - self.tweet_count = 0 - self.topic = topic - self.TWEET_LIMIT = limit - - # set tweet-preprocessor to remove URLs/reserved words - p.set_options(p.OPT.URL, p.OPT.RESERVED) - super().__init__(bearer_token, wait_on_rate_limit=True) - - def on_response(self, response): - """Called when Twitter pushes a new tweet to you.""" - - # if the tweet is not a retweet - if not response.data.text.startswith('RT'): - text = p.clean(response.data.text) # clean the tweet - - # ignore tweet if the topic is not in the tweet text - if self.topic.lower() not in text.lower(): - return - - # update self.sentiment_dict with the polarity - blob = TextBlob(text) - if blob.sentiment.polarity > 0: - sentiment = '+' - self.sentiment_dict['positive'] += 1 - elif blob.sentiment.polarity == 0: - sentiment = ' ' - self.sentiment_dict['neutral'] += 1 - else: - sentiment = '-' - self.sentiment_dict['negative'] += 1 - - # display the tweet - username = response.includes['users'][0].username - print(f'{sentiment} {username}: {text}\n') - - self.tweet_count += 1 # track number of tweets processed - - # if TWEET_LIMIT is reached, terminate streaming - if self.tweet_count == self.TWEET_LIMIT: - self.disconnect() - -def main(): - # get search term and number of tweets - search_key = sys.argv[1] - limit = int(sys.argv[2]) # number of tweets to tally - - # set up the sentiment dictionary - sentiment_dict = {'positive': 0, 'neutral': 0, 'negative': 0} - - # create the StreamingClient subclass object - sentiment_listener = SentimentListener(keys.bearer_token, - sentiment_dict, search_key, limit) - - # redirect sys.stderr to sys.stdout - sys.stderr = sys.stdout - - # delete existing stream rules - rules = sentiment_listener.get_rules().data - rule_ids = [rule.id for rule in rules] - sentiment_listener.delete_rules(rule_ids) - - # create stream rule - sentiment_listener.add_rules( - tweepy.StreamRule(f'{search_key} lang:en')) - - # start filtering English tweets containing search_key - sentiment_listener.filter(expansions=['author_id']) - - print(f'Tweet sentiment for "{search_key}"') - print('Positive:', sentiment_dict['positive']) - print(' Neutral:', sentiment_dict['neutral']) - print('Negative:', sentiment_dict['negative']) - -# call main if this file is executed as a script -if __name__ == '__main__': - main() - -########################################################################## -# (C) Copyright 2022 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_07-11withSelfChecks-checkpoint.ipynb b/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_07-11withSelfChecks-checkpoint.ipynb deleted file mode 100755 index 8fcf2b7..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_07-11withSelfChecks-checkpoint.ipynb +++ /dev/null @@ -1,1537 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**_Note: This notebook contains ALL the code for Sections 13.7 through 13.11, including the Self Check snippets because all the snippets in these sections are consecutively numbered in the text._**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.7 Authenticating with Twitter Via Tweepy to Access Twitter v2 APIs" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import tweepy" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import keys" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a Client Object" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "client = tweepy.Client(bearer_token=keys.bearer_token,\n", - " wait_on_rate_limit=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.8 Getting Information About a Twitter Account" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "nasa = client.get_user(username='NASA', \n", - " user_fields=['description', 'public_metrics'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### tweepy.Response Object" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting a User’s Basic Account Information" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "11348282" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nasa.data.id" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'NASA'" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nasa.data.name" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'NASA'" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nasa.data.username" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "\"There's space for everybody. ✨\"" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nasa.data.description" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "### Getting the Number of Accounts That Follow This Account and the Number of Accounts This Account Follows" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "61468657" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nasa.data.public_metrics['followers_count']" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "181" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nasa.data.public_metrics['following_count']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting Your Own Account’s Information" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.8 Self Check\n", - "**2. _(IPython Session)_** Use the `client` object to get information about the `NASAMars` account, then display its ID, name, username, description and number of followers.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "nasa_mars = client.get_user(username='NASAMars', \n", - " user_fields=['description', 'public_metrics'])" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "15165502" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nasa_mars.data.id" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'NASA Mars'" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nasa_mars.data.name" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'NASAMars'" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nasa_mars.data.username" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'NASA’s official Twitter account for all things Mars. Join us as we explore the Red Planet!'" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nasa_mars.data.description" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1228089" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nasa_mars.data.public_metrics['followers_count']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.9 Intro to Tweepy `Paginator`s: Getting More than One Page of Results" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "# 13.9.1 Determining an Account’s Followers " - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "followers = []" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a `Paginator`" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "paginator = tweepy.Paginator(\n", - " client.get_users_followers, nasa.data.id, max_results=5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting Results" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "for follower in paginator.flatten(limit=10):\n", - " followers.append(follower.username)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Followers: ANNUBABY4 Ashutos34571752 BlustiTv EichhorstVarda mariam45839172 MeternikBarman4 MeternikBarman4 OlarulD PakpimolChanta1 sujitha_josh\n" - ] - } - ], - "source": [ - "print('Followers:', \n", - " ' '.join(sorted(followers, key=lambda s: s.lower())))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.9.1 Self Check\n", - "**3. _(IPython Session)_** Use a Cursor to get and display 10 followers of the `NASAKepler` account.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "nasa_mars_followers = []" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "nasa_mars_followers_paginator = tweepy.Paginator(\n", - " client.get_users_followers, nasa_mars.data.id, max_results=5)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "for follower in nasa_mars_followers_paginator.flatten(limit=10):\n", - " nasa_mars_followers.append(follower.username)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Donononon Dheeraj13540205 YJingxian DNice_86 TiannDavis MnFuzail 2f4hkkmprhB N47iD DCCashout1 marker1220\n" - ] - } - ], - "source": [ - "print(' '.join(nasa_mars_followers))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.9.2 Determining Whom an Account Follows " - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "following = []" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "paginator = tweepy.Paginator(\n", - " client.get_users_following, nasa.data.id, max_results=5)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "for user_followed in paginator.flatten(limit=10):\n", - " following.append(user_followed.username)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Following: Astro_Ayers astro_berrios astro_deniz astro_matthias astro_watkins JimFree NASA_Gateway NASASpaceSci NASASpaceSci v_wyche\n" - ] - } - ], - "source": [ - "print('Following:', \n", - " ' '.join(sorted(following, key=lambda s: s.lower())))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.9.3 Getting a User’s Recent Tweets" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "nasa_tweets = client.get_users_tweets(\n", - " id=nasa.data.id, max_results=5)" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NASA: @Lee44356382 @Dailymotion #Artemis I will launch from @NASAKennedy to the northeast over the Atlantic Ocean. This graphic has more details. Click through for a larger version. https://t.co/qIdNR2CB5I\n", - "\n", - "NASA: @nfloyd58 The launch window opens at 8:33 a.m. EDT, which is 1133 GMT. All of the links to the #Artemis launch events should automatically display the broadcast time in the user's local time zone.\n", - "\n", - "NASA: @plungerman We feel you. Orbital dynamics don't care about human sleep schedules. You can watch on-demand recordings later in the day, and we'll keep the short recaps coming.\n", - "\n", - "NASA: And of course, you can always find us on NASA TV. We love sharing space with you! https://t.co/z1RgZwyJyi\n", - "\n", - "NASA: ¡Vamos a la Luna con #Artemis I y @NASA_es!\n", - "\n", - "Nuestra transmisión en vivo del lanzamiento en español incluirá entrevistas con miembros hispanos de la misión y comentario en directo durante el despegue.\n", - "https://t.co/fgKZg1tQ1I\n", - "\n" - ] - } - ], - "source": [ - "for tweet in nasa_tweets.data:\n", - " print(f\"NASA: {tweet.data['text']}\\n\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "jp-MarkdownHeadingCollapsed": true, - "tags": [] - }, - "source": [ - "### Grabbing Recent Tweets from Your Own Timeline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.9.3 Self Check\n", - "**2. _(IPython Session)_** Get and display two tweets from the `NASAMars` account.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "nasa_mars_tweets = client.get_users_tweets(\n", - " id=nasa_mars.data.id, max_results=5)" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NASAMars: RT @NASA: It's #InternationalDogDay! While there aren't any dogs on other planets (that we know of), we do have a couple of adorable rovers…\n", - "\n", - "NASAMars: Rocks of ages: surprising findings help scientists better understand the timeline of an ancient Martian lake. Next up, exploring layers of sedimentary rocks that should reveal more of the story...\n", - "\n", - "Follow along at https://t.co/POzRmYauHo https://t.co/XFzqJtoL7S\n", - "\n", - "NASAMars: How to drive a Mars rover: On the latest episode of the \"On a Mission\" podcast, buckle up for a Mars tour with rover driver Vandi Verma.\n", - "▶️ https://t.co/CCWmVPwRez https://t.co/zHnDYFWMyw\n", - "\n", - "NASAMars: RT @NASAInSight: Thanks again for all the kind thoughts you’ve been sending. There’s still time to write me a note for the mission team to…\n", - "\n", - "NASAMars: We see Martian dust devils (whirlwinds) from the ground, as in this shot from the Opportunity rover in 2016, left. From space, we can see the tracks they leave behind, as in this view of dunes from Mars Reconnaissance Orbiter in 2009, right. More: https://t.co/kd1BNEDBUD https://t.co/RxeKTI5Fv5\n", - "\n" - ] - } - ], - "source": [ - "for tweet in nasa_mars_tweets.data:\n", - " print(f\"NASAMars: {tweet.data['text']}\\n\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.10 Searching Recent Tweets; Intro to Twitter v2 API Search Operators" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Utility Function `print_tweets` from `tweetutilities.py`" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "from tweetutilities import print_tweets" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```python\n", - "def print_tweets(tweets):\n", - " # translator to autodetect source language and return English\n", - " translator = GoogleTranslator(source='auto', target='en')\n", - "\n", - " \"\"\"For each tweet in tweets, display the username of the sender\n", - " and tweet text. If the language is not English, translate the text \n", - " with the deep-translator library's GoogleTranslator.\"\"\"\n", - " for tweet, user in zip(tweets.data, tweets.includes['users']):\n", - " print(f'{user.username}:', end=' ')\n", - "\n", - " if 'en' in tweet.lang:\n", - " print(f'{tweet.text}\\n')\n", - " elif 'und' not in tweet.lang: # translate to English first\n", - " print(f'\\n ORIGINAL: {tweet.text}')\n", - " print(f'TRANSLATED: {translator.translate(tweet.text)}\\n')\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Searching for Specific Words" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "tweets = client.search_recent_tweets(\n", - " query='Webb Space Telescope', \n", - " expansions=['author_id'], tweet_fields=['lang'])" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "esotericfaerie: RT @northstardoll: jupiter shown by the james webb space telescope https://t.co/LpfbQEs0ho\n", - "\n", - "fIamboyants: RT @northstardoll: jupiter shown by the james webb space telescope https://t.co/LpfbQEs0ho\n", - "\n", - "Linsey_Li: RT @latestinspace: BREAKING 🚨: James Webb Space Telescope has detected carbon dioxide (CO2) in the atmosphere of a planet outside our solar…\n", - "\n", - "onlinehellcat: RT @northstardoll: jupiter shown by the james webb space telescope https://t.co/LpfbQEs0ho\n", - "\n", - "shayarrowood: RT @latestinspace: BREAKING 🚨: James Webb Space Telescope has detected carbon dioxide (CO2) in the atmosphere of a planet outside our solar…\n", - "\n", - "sirfapcelot: RT @latestinspace: BREAKING 🚨: James Webb Space Telescope has detected carbon dioxide (CO2) in the atmosphere of a planet outside our solar…\n", - "\n", - "yilmazcihan: RT @latestinspace: BREAKING 🚨: James Webb Space Telescope has detected carbon dioxide (CO2) in the atmosphere of a planet outside our solar…\n", - "\n", - "AaronLoganMusic: RT @latestinspace: BREAKING 🚨: James Webb Space Telescope has detected carbon dioxide (CO2) in the atmosphere of a planet outside our solar…\n", - "\n", - "najiwakim1: RT @latestinspace: BREAKING 🚨: James Webb Space Telescope has detected carbon dioxide (CO2) in the atmosphere of a planet outside our solar…\n", - "\n", - "SenseiQuan: RT @latestinspace: BREAKING 🚨: James Webb Space Telescope has detected carbon dioxide (CO2) in the atmosphere of a planet outside our solar…\n", - "\n" - ] - } - ], - "source": [ - "print_tweets(tweets)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Searching with Twitter v2 API Search Operators" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Searching with Twitter v2 API Search Operators" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Operator Documentation and Tutorial" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Searching for Tweets From NASA Containing Links" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "tweets = client.search_recent_tweets(\n", - " query='from:NASA has:links', \n", - " expansions=['author_id'], tweet_fields=['lang'])" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NASA: @Lee44356382 @Dailymotion #Artemis I will launch from @NASAKennedy to the northeast over the Atlantic Ocean. This graphic has more details. Click through for a larger version. https://t.co/qIdNR2CB5I\n", - "\n" - ] - } - ], - "source": [ - "print_tweets(tweets)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Searching for a Hashtag" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [], - "source": [ - "tweets = client.search_recent_tweets(query='#metaverse', \n", - " expansions=['author_id'], tweet_fields=['lang'])" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ultracig: @Ralvero I’m richer than ever \n", - "\n", - "AS SEEN ON TV & IN SPACE\n", - "400,000 #vikings\n", - "- Ecosystem with #DeFi, #NFT #Metaverse, #crypto #education\n", - "#floki #flokidao #doge #shib #F1 #huobi #valhalla #eSports @RealflokiInu #FlokiFi #projectL #GME #AMC #BBBY https://t.co/wG7NZobeoY\n", - "\n", - "ArnobRo20029983: RT @BlockChain_CK: #marsmine is running a massive 7,500TRX #airdrop campaign in tokens!\n", - "\n", - "Join our gleam competition:\n", - "🔗https://t.co/mHBJoUj…\n", - "\n", - "Alimeralfinans: \n", - " ORIGINAL: #BRN #Metaverse Bitmart listelemesi dün gerçekleşti.\n", - "3 Gün sonra Büyük Bir haber geleceğini ve büyük borsa listelemeler için Ekip Çalışmalarına Devam Ettiğini Duyurdu. \n", - "https://t.co/YqJTkQVcM8\n", - "TRANSLATED: The #BRN #Metaverse Bitmart listing took place yesterday.\n", - "Announced that big news will come 3 days later and that it continues its teamwork for major stock market listings.\n", - "https://t.co/YqJTkQVcM8\n", - "\n", - "Bristi22599251: RT @UncleCCNFT: 2027 : Crime is happening across the #Metaverse … \n", - "Uncle Chop Chop rules the metastreets , walk without fear , protect what…\n", - "\n", - "Diness70996570: RT @BlockChain_CK: #marsmine is running a massive 7,500TRX #airdrop campaign in tokens!\n", - "\n", - "Join our gleam competition:\n", - "🔗https://t.co/mHBJoUj…\n", - "\n", - "BongoBob17: RT @CrebbsMaynard: When FBI=KGB, know that we are in a Bolshevik Revolution\n", - "https://t.co/eKC7qbs4KT\n", - "#BTC #God #USA #news #bb24 #ETH #art #C…\n", - "\n", - "konzeth: I just participated in the Xandar Xclusive Airdrop Campaign.\n", - "\n", - "What are you waiting for? Become a Xandarian now!!\n", - "\n", - "#Play2Earn #MMORPG #AAA #NFTs #Airdrop #giveaway #P2P #Metaverse #Xandar #Multiverse #Octa-Attributes\n", - " – https://t.co/lbF5jvlZnS\n", - "\n", - "PINGULUX: \n", - " ORIGINAL: @NikolaBench @BlueSparrowETH @VitaInuCoin @BabyDogeCoin @yooshi_official #VINU #VinuSquad #NFTs #Metaverse #vitainucoin #DAO #cryptocurrency\n", - "TRANSLATED: @NikolaBench @BlueSparrowETH @VitaInuCoin @BabyDogeCoin @yooshi_official #VINU #VinuSquad #NFTs #Metaverse #vitainucoin #DAO #cryptocurrency\n", - "\n", - "harisweetraskal: RT @ketsshoe: 📣Massive #Airdrops🔥\n", - "\n", - "😱 Reward Pool-\n", - "🎁 🏆 BiG Prize $50,000 KETS TOKEN & 👟 3000 Kets Shoebox NFT 👟\n", - "\n", - "To Enter:\n", - "✅Follow @ketsshoe…\n", - "\n", - "mohus_sam: \n", - " ORIGINAL: @_NFTsPromoter @cybotz_nft @Lifestory_App #NFTCommunity #NFTProjects #BlueChipNFT #Lifestory #NFTUtilities #MetaverseNFT #NFTmint #nftutility $LIFC #NFTMetaverse #Metaverse #lifestory_app\n", - "\n", - "OS: https://t.co/tQ0qlHZKty\n", - "📸:https://t.co/QbzA6JE2Ci\n", - "🌐:https://t.co/DoeFdhhCRU\n", - "Discord: https://t.co/ZRdYTDFElv\n", - "@Lifestory_App\n", - "TRANSLATED: @_NFTsPromoter @cybotz_nft @Lifestory_App #NFTCommunity #NFTProjects #BlueChipNFT #Lifestory #NFTUtilities #MetaverseNFT #NFTmint #nftutility $LIFC #NFTMetaverse #Metaverse #lifestory_app\n", - "\n", - "OS: https://t.co/tQ0qlHZKty\n", - "📸:https://t.co/QbzA6JE2Ci\n", - "🌐:https://t.co/DoeFdhhCRU\n", - "Discord: https://t.co/ZRdYTDFElv\n", - "@Lifestory_App\n", - "\n" - ] - } - ], - "source": [ - "print_tweets(tweets)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.10 Self Check\n", - "**3. _(IPython Session)_** Search for one tweet from the `NASA` account containing `'astronaut'`.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [], - "source": [ - "tweets = client.search_recent_tweets(query='from:nasa astronaut', \n", - " expansions=['author_id'], tweet_fields=['lang'])" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NASA: LIVE: Astronaut Frank Rubio discusses his upcoming mission to the @Space_Station, scheduled to launch Sept. 21 from Kazakhstan. https://t.co/xr1tWHMjmQ\n", - "\n" - ] - } - ], - "source": [ - "print_tweets(tweets)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.11 Spotting Trending Topics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "auth = tweepy.OAuth2BearerHandler(keys.bearer_token)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "api = tweepy.API(auth=auth, wait_on_rate_limit=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.11.1 Places with Trending Topics\n", - "**Note: This part of the Twitter APIs has not been migrated from v1.1 to v2 yet and is accessible only to \"Elevated\" and \"Academic Research\" access.**" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [], - "source": [ - "available_trends = api.available_trends()" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "467" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(available_trends)" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'name': 'Worldwide',\n", - " 'placeType': {'code': 19, 'name': 'Supername'},\n", - " 'url': 'http://where.yahooapis.com/v1/place/1',\n", - " 'parentid': 0,\n", - " 'country': '',\n", - " 'woeid': 1,\n", - " 'countryCode': None}" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "available_trends[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'name': 'Winnipeg',\n", - " 'placeType': {'code': 7, 'name': 'Town'},\n", - " 'url': 'http://where.yahooapis.com/v1/place/2972',\n", - " 'parentid': 23424775,\n", - " 'country': 'Canada',\n", - " 'woeid': 2972,\n", - " 'countryCode': 'CA'}" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "available_trends[1]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.11.2 Getting a List of Trending Topics\n", - "### Worldwide Trending Topics" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [], - "source": [ - "world_trends = api.get_place_trends(id=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [], - "source": [ - "trends_list = world_trends[0]['trends']" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'name': '#SOUMUN',\n", - " 'url': 'http://twitter.com/search?q=%23SOUMUN',\n", - " 'promoted_content': None,\n", - " 'query': '%23SOUMUN',\n", - " 'tweet_volume': 121659}" - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trends_list[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [], - "source": [ - "trends_list = [t for t in trends_list if t['tweet_volume']]" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [], - "source": [ - "from operator import itemgetter " - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [], - "source": [ - "trends_list.sort(key=itemgetter('tweet_volume'), reverse=True) " - ] - }, - { - "cell_type": "code", - "execution_count": 78, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "DONBELLE PHIHNOMENALConcert\n", - "Southampton\n", - "#SOUMUN\n", - "花火大会\n", - "アニサマ\n", - "KANAWUT\n", - "#LetsGULFtoJAPAN\n", - "StylipS\n", - "#Venue101\n", - "nectar\n", - "Crystal Palace\n", - "アオペラ\n", - "Elanga\n", - "#LIVBOU\n", - "#アモアスマリカ杯\n", - "DJ JOHNNY\n", - "VadLip\n", - "アドニス\n", - "McTominay\n", - "Tell Your World\n", - "キブレハン\n", - "Beit\n", - "Gallagher\n", - "Dalot\n", - "Bruno Fernandes\n", - "Eriksen\n", - "アフリカ支援\n", - "Firmino\n", - "リンレン\n", - "ヒッパレ\n" - ] - } - ], - "source": [ - "for trend in trends_list:\n", - " print(trend['name'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### New York City Trending Topics" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "nyc_trends = api.get_place_trends(id=2459115) " - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [], - "source": [ - "nyc_list = nyc_trends[0]['trends']" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [], - "source": [ - "nyc_list = [t for t in nyc_list if t['tweet_volume']]" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [], - "source": [ - "nyc_list.sort(key=itemgetter('tweet_volume'), reverse=True) " - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "#MUFC\n", - "Chelsea\n", - "Ronaldo\n", - "Nigeria\n", - "Southampton\n" - ] - } - ], - "source": [ - "for trend in nyc_list[:5]:\n", - " print(trend['name'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.11.2 Self Check\n", - "**3. _(IPython Session)_** Display the top 3 trending topics today in the United States.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": {}, - "outputs": [], - "source": [ - "us_trends = api.get_place_trends(id='23424977')" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [], - "source": [ - "us_list = us_trends[0]['trends']" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [], - "source": [ - "us_list = [t for t in us_list if t['tweet_volume']]" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [], - "source": [ - "us_list.sort(key=itemgetter('tweet_volume'), reverse=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Ronaldo\n", - "Southampton\n", - "#SOUMUN\n" - ] - } - ], - "source": [ - "for trend in us_list[:3]:\n", - " print(trend['name'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.11.3 Create a Word Cloud from Trending Topics" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "topics = {}" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "for trend in nyc_list:\n", - " topics[trend['name']] = trend['tweet_volume']" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [], - "source": [ - "from wordcloud import WordCloud" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "metadata": {}, - "outputs": [], - "source": [ - "wordcloud = WordCloud(width=1600, height=900,\n", - " prefer_horizontal=0.5, min_font_size=10, colormap='prism', \n", - " background_color='white') " - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "metadata": {}, - "outputs": [], - "source": [ - "wordcloud = wordcloud.fit_words(topics)" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "metadata": {}, - "outputs": [], - "source": [ - "wordcloud = wordcloud.to_file('TrendingTwitter.png')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**NOTE: The following code displays the image in a Jupyter Notebook**" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 71, - "metadata": { - "image/png": { - "width": 400 - } - }, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image\n", - "Image(filename='TrendingTwitter.png', width=400)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.11.3 Self Check\n", - "\n", - "**1. _(IPython Session)_** Create a word cloud using the `us_list` list from the previous section’s Self Check.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "metadata": {}, - "outputs": [], - "source": [ - "topics = {}" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "metadata": {}, - "outputs": [], - "source": [ - "for trend in us_list:\n", - " topics[trend['name']] = trend['tweet_volume']" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [], - "source": [ - "wordcloud = wordcloud.fit_words(topics)" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "metadata": {}, - "outputs": [], - "source": [ - "wordcloud = wordcloud.to_file('USTrendingTwitter.png')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**NOTE: The following code displays the image in a Jupyter Notebook**" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 76, - "metadata": { - "image/png": { - "width": 400 - } - }, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import Image\n", - "Image(filename='USTrendingTwitter.png', width=400)" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2022 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_12-checkpoint.ipynb b/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_12-checkpoint.ipynb deleted file mode 100755 index fbce1b0..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_12-checkpoint.ipynb +++ /dev/null @@ -1,104 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.12 Cleaning/Preprocessing Tweets for Analysis\n", - "### tweet-preprocessor Library and TextBlob Utility Functions\n", - "### Installing tweet-preprocessor\n", - "### Cleaning a Tweet" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import preprocessor as p" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "p.set_options(p.OPT.URL, p.OPT.RESERVED)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "tweet_text = 'RT A sample retweet with a URL https://nasa.gov'" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'A sample retweet with a URL'" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p.clean(tweet_text)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2022 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_12selfcheck-checkpoint.ipynb b/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_12selfcheck-checkpoint.ipynb deleted file mode 100755 index 4344c2f..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_12selfcheck-checkpoint.ipynb +++ /dev/null @@ -1,64 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.12 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(True/False)_** The tweet-preprocessor library can automatically remove URLs, `@`-mentions (like `@nasa`), hashtags (like `#mars`), Twitter reserved words (like, `RT` for retweet and `FAV` for favorite, which is similar to a “like” on other social networks), emojis (all or just smileys) and numbers, or any combination of these. \n", - "\n", - "**Answer:** True." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2022 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_13_02-checkpoint.ipynb b/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_13_02-checkpoint.ipynb deleted file mode 100755 index b635410..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_13_02-checkpoint.ipynb +++ /dev/null @@ -1,264 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.13.2 Initiating Stream Processing" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Authenticating\n", - "**Don't need to authenticate in advance for streaming. Just pass bearer-token as you create the StreamingClient subclass object.**" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import tweepy" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import keys" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a `TweetListener` " - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "from tweetlistener import TweetListener" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "tweet_listener = TweetListener(\n", - " bearer_token=keys.bearer_token, limit=3)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "### Redirecting Standard Error Stream to Standard Output Stream" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "import sys" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "sys.stderr = sys.stdout" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "### Deleting Existing Stream Rules" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "rules = tweet_listener.get_rules().data" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "rule_ids = [rule.id for rule in rules]" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Response(data=None, includes={}, errors=[], meta={'sent': '2022-08-24T14:37:25.398Z', 'summary': {'deleted': 1, 'not_deleted': 0}})" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tweet_listener.delete_rules(rule_ids) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating and Adding a Stream Rule" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "filter_rule = tweepy.StreamRule('football')" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Response(data=[StreamRule(value='football', tag=None, id='1562449001378619392')], includes={}, errors=[], meta={'sent': '2022-08-24T14:37:26.600Z', 'summary': {'created': 1, 'not_created': 0, 'valid': 1, 'invalid': 0}})" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tweet_listener.add_rules(filter_rule)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Starting the Tweet Stream" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Connection successful\n", - "\n", - "Screen name: JamieAmis\n", - " Language: en\n", - " Tweet text: I’ve said it before…I am loving the hunger that JDT is putting into these youngsters. Hats off to TM and Venkys as well for investing the time and trust into the academy too! https://t.co/P2N3X0kwgX\n", - "\n", - "Screen name: BeachPetey\n", - " Language: en\n", - " Tweet text: @miles_commodore We used a Len Dawson football, back in the day.\n", - "\n", - "Screen name: KingDrewbs69\n", - " Language: en\n", - " Tweet text: @SeekNDestroy21 Dusty baller mate 😂 nothing more\n", - "\n", - "Stream connection closed by Twitter\n" - ] - } - ], - "source": [ - "tweet_listener.filter(\n", - " expansions=['author_id'], tweet_fields=['lang'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Asynchronous vs. Synchronous Streams" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2022 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_15_01-checkpoint.ipynb b/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_15_01-checkpoint.ipynb deleted file mode 100755 index 49d8650..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_15_01-checkpoint.ipynb +++ /dev/null @@ -1,1541 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.15.1 Getting and Mapping the Tweets" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Collections Required By `LocationListener`" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "tweets = [] " - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "counts = {'total_tweets': 0, 'locations': 0}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating the `LocationListener` " - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import keys" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "import tweepy" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "from locationlistener import LocationListener" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "location_listener = LocationListener(\n", - " keys.bearer_token, counts_dict=counts, tweets_list=tweets,\n", - " topic='football', limit=50)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Redirect sys.stderr to sys.stdout" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "import sys" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "sys.stderr = sys.stdout" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Delete Existing `StreamRule`s" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "rules = location_listener.get_rules().data" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "rule_ids = [rule.id for rule in rules]" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Response(data=None, includes={}, errors=[], meta={'sent': '2022-08-24T15:35:39.587Z', 'summary': {'deleted': 1, 'not_deleted': 0}})" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "location_listener.delete_rules(rule_ids) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Create a `StreamRule`" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Response(data=[StreamRule(value='football lang:en', tag=None, id='1562463657035972608')], includes={}, errors=[], meta={'sent': '2022-08-24T15:35:41.024Z', 'summary': {'created': 1, 'not_created': 0, 'valid': 1, 'invalid': 0}})" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "location_listener.add_rules(\n", - " tweepy.StreamRule('football lang:en'))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "### Configure and Start the Stream of Tweets" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "valerieinhoops: Rebel football Saturday- 12:30 pm kick off! 🏈✅🥤\n", - "\n", - "Breakfast tailgate, drinking Mimosas & Bloody Mary’s before noon AND Rebel football @AllegiantStadm?!! \n", - "\n", - "Hell yes! Let’s goooooo! @unlvfootball @joearrigofsm @TheFranchiseLV @UNLVRebellion @UNLVRAF @UNLVathletics @UNLVgirl https://t.co/6IdAqVdL17\n", - "\n", - "b_lanaux: When people try to say LSU isn’t the greatest atmosphere in college football I just show them this video. https://t.co/A5zAfPyrSF\n", - "\n", - "cbaginski15: @JoshReynolds24 @Utah_Football Thanks for chance buddy!!\n", - "\n", - "1Alexthetrainer: Thankyou for the opportunity go @AztecFB @Shawcroft_M @keithismael @jmatthews8321 @Daygofootball @KUSIPPR @KUSINews @BStoneKUSI @Tpstreets @CoachPatArinze @tariq__thompson @calmunson @alexbarrett @DavidWells14 @MP2TheGreat https://t.co/aqsimzgX3a\n", - "\n", - "orionkwa: @Lk47041027 one football\n", - "\n", - "franciscotrigo5: @cxrd52 Bro I actually think at the top of elite football hardest most deificou position is the GK \n", - "Imagine you need to be more than a shot stopper and if you make a mistake it’s your fault and no one can back you \n", - "A 6 has Cb to back you box to box it’s only difficult coz energy\n", - "\n", - "ILoveCoreyB: I’m so excited for fantasy football\n", - "\n", - "pcsd: The @PCSD_PHS Red Raiders football squad shut out Notre Dame 14-0 to start the season on the W side of the ledger. Check out the game action and more at: https://t.co/BIbp6M7o0R. #RaiderStrong @PulaskiRedSea https://t.co/TrlEtOHmye\n", - "\n", - "KingBanter_T: @elonmusk buy Manchester United football club...\n", - "\n", - "ItsUTOrange75: @smyrnafootball Absolutely amazing game. Great pictures\n", - "\n", - "Shiv_rants: @Football__Tweet @nasdaily is that you ?!\n", - "\n", - "CANAMPREP: It's a pretty SAD situation when \n", - "SO CALLED FOOTBALL EXPERTS like yourselves\n", - "\n", - "have to dwell on the topic of LOW ATTENDANCE\n", - "just to uphold CFL\n", - "INTEGRITY:\n", - "\n", - "But as I've said all along:\n", - "\n", - "THE TRUTH HURTS\n", - "TIME TO CHANGE CULTURE OF 🇨🇦🏈\n", - "\n", - "Start with \n", - "\n", - "ELIMINATING THE ROSTER RATIO https://t.co/Qhn4ohDNJY\n", - "\n", - "ReporterChrisW: So you want to turn your football stadium into a pre-game basketball show? Will someone in the press box be announcing the starting lineup? https://t.co/vtYZmgwHZu\n", - "\n", - "mikeb26and352: @Rajulesrirama Good for you listening to your body! Good work today, Raju!\n", - "\n", - "So where do we sign up for the runner fantasy football league? 🤷‍♂️\n", - "\n", - "BrandtAWitt: @peterkrupa In France too. People like the image of what American college represents! Same with sports teams. Sometimes Americans wear Euro football team shirts, don’t see a big difference. No one cares about Euro colleges (Oxford/Cambridge Anglo not Euro lol)\n", - "Also saw multiple churros /\n", - "\n", - "Black_Mormon: @CFBHome Most exciting college football player: CJ Spiller\n", - "\n", - "QB: Tommie Frazier\n", - "\n", - "RB: Barry Sanders \n", - "\n", - "WR: Randy Moss\n", - "\n", - "coach: Tom Osbourne\n", - "\n", - "Best stadium: Clemson\n", - "\n", - "Funnest game you’ve ever watched: JMU v App St 2008\n", - "\n", - "Best National Championship team: Nebraska 1995\n", - "\n", - "psainz: Have you checked out the NEW Staley strong Football website!?!? The home page has us READY for 7pm kickoff Friday night! Let’s go !!!! @StaleyFootball @SHSFalconClub @N2SportsStaley @TheNestSHS #staleystrong https://t.co/0Xj099ZHCW https://t.co/vNBL36yUNR\n", - "\n", - "Ourand_SBJ: Burke Magnus on the importance of college football to ESPN.\n", - "\n", - "Listen here:\n", - "Apple: https://t.co/cCtJ151IJM\n", - "Spotify: https://t.co/G7BNgGCwDm\n", - "Google: https://t.co/an10IdStCs https://t.co/YxfzZwsdJr\n", - "\n", - "leed2019: @Football__Tweet Gary Lineker\n", - "\n", - "dwjones91: The O Dub Football Team is putting in that work for another Championship year with dedication from the players and the coaches\n", - "\n", - "basicfreshness: Damn ion think nobody from my class going to that brooks reunion 🤣 but they having a football game and I deserve to see that\n", - "\n", - "Hombrevender: @IDP_Baumer Yeah that's what I'm saying he has RB1 in college football. He'll do plenty of running.\n", - "\n", - "erniesuggs: On Tuesday, @Morehouse dedicated the newly renovated Edwin C. Moses Track & B.T. Harvey Stadium Football Field, allowing the #HBCU to host track meets for the 1st time in a decade. In today's @ajc PLS RT\n", - "@usatf @edwinmoses @ImGailDevers \n", - "https://t.co/aZSTw3jAfJ\n", - "\n", - "be_that_guy11: @CalistudJohn @slmandel a guy who lives in reno should not be talking college football.\n", - "\n", - "djmeiho63: @miles_commodore Not only a good football player but also a good commentator, which I remember him more as a commentator. R I P, Len.\n", - "\n", - "CarlonCarpenter: To use an example:\n", - "\n", - "The Where Goals Come From project was born out of me trying to answer a basic question: \"What are the best types of passes to score goals in college football?\"\n", - "\n", - "It morphed into something much greater/profound (with a lot of help) but the start was rudimentary.\n", - "\n", - "Volquest_Rivals: Tim Banks: \"We have some veterans who have played a lot of football. They will be the first one to tell you, these guys are interchangeable.\"\n", - "\n", - "ProstatsC: Welcome to the top Ante Milanovic-Litre!\n", - "\n", - "He was our most productive rusher for #CFL week 11. \n", - "\n", - "#ProStatsCanada #Football #Canada #CanadianFootball #AmericanFootball #NFL #Elks #ElksCharge #Edmonton #GoElks @GoElks @CFL https://t.co/E6uIP6OB5y\n", - "\n", - "MarkARoper1: Jill picked Isobel out @a football camp of 100s girls a few years ago & spotted her for her talent & said if she worked hard she would go far. She remembers that always. \n", - "She then gave her, her signed winning shirt ofthe continental cup.\n", - "Isobel has it pride of place on her wall.\n", - "\n", - "stef_oppong: @libz_67 @Benzema is going down in the history books as one of the greatest immortals of Football after winning the ballon d'or and there's no banter that's stopping that😂😂\n", - "\n", - "Cyluho: It's quite possible I spent the entire day illustrating a completely unasked-for cover for an essay for uni about football and religion. Shit happens. https://t.co/5P7T3jrNEY\n", - "\n", - "6thymes: @SimonRi96255549 @OwenFaragher Football existed before your oil money ye little nonce\n", - "\n", - "AuburnLiveOn3: Asked and Answered: Auburn football questions as fall camp ends, game preparation begins https://t.co/HzCCy8TKlX via @on3sports\n", - "\n", - "lusa1209: @lucaskagiso @football_papi I was about to say until real Madrid shows up\n", - "\n", - "BigBlueDart: Two of the three $1k bets on USU to win the national championship were the result of tequila shots at a wedding with former Michigan football players in attendance.\n", - "\n", - "The story behind the wildest college football bet of the offseason https://t.co/JHAttbizCi\n", - "\n", - "noahrohlfing: back from northern Michigan and back at work, but here’s a story that dropped on my wedding day and I’m proud of. \n", - "\n", - "50 Years of the Marshalltown Football League https://t.co/S5hfZNNUNh\n", - "\n", - "planwithchapman: Fantasy Football Twitter is insufferable this year.\n", - "\n", - "I follow less than ten accounts and I’ve been made to understand that there are 427 different players who are guaranteed to win me my league this year.\n", - "\n", - "Seems a tad high.\n", - "\n", - "JoeDaSamurai: @babygirl_riss Football Season baby 💪🏼🤘🏼\n", - "\n", - "MaseDenver: There are many directions in which Amazon could have gone for its “Thursday Night Football” theme music, but I would have chosen this one: https://t.co/h7wHK1Xg82\n", - "\n", - "andylev15: Man u appoint former club legend as their new director of football ;\n", - "Webb to become Chief Refereeing Officer at PGMOL #lfc \n", - "https://t.co/X6ljZQWcuL\n", - "\n", - "MichaelDanger19: @hendocfc I understand the \"modern football crest is bad!\" sentiment but I do think this is a massive upgrade\n", - "\n", - "now to figure out what letters are on the crest\n", - "\n", - "bigfoots0169: @MPFrazer @steelpanthers72 I don’t give a rat’s ass if he checks down or not Lol, he moves the football, the offense scores TDs isn’t that the goal LOL\n", - "\n", - "MickGProduction: The Fact I get to see my first College Football game in Ireland with the GF is next level 😎 Bring on Saturday 😍 #GBR https://t.co/GFLQLSEoox\n", - "\n", - "mcwilsonky: 6 High School Football Players Combine Their Strength to Rescue Injured Woman Trapped in a Wrecked Car \n", - "@goodnewsnetwork \n", - "https://t.co/Qyinr6FzhJ\n", - "\n", - "ronpila: @LFCryan__ @LFCLaurie Meanwhile we may not achieve top 4… do you remember what happened after 09/10 season? And football has changed a lot since then, if you can’t win titles and constantly have UCL football you are embedded in a vicious cicle of shit.\n", - "\n", - "melvinator76: Coming off a nice week 0 win over SE Warren, @WacoWarriors prep for week 1 vs. @OrioleUpdate. While us fans have the luxury of looking ahead, I can assure you @cmedeker and his team are NOT! #iahsfb #FridayNightLights\n", - "#football\n", - "\n", - "https://t.co/ZYbbvJvWka\n", - "\n", - "BOS_Sportskeeda: The key findings from this year’s #football #MONEY League report by @Deloitte are:\n", - "\n", - "Matchday revenue: It was the lowest ever in Money League history.\n", - "Broadcast revenue: A €1.4bn increase from 2019/20\n", - "Commercial revenue decreased by 6% (€222m)\n", - "#Data #DataAnalytics #footballbiz https://t.co/eLM3EU10iA\n", - "\n", - "slideme: The NFL season is about to kick off, and you’re still not in any fantasy football leagues yet. Time’s running out, but you’ve still got a couple weeks to get in on the action before week 1, and we’ve got you covered with the best fantasy football apps for https://t.co/6y8tkXiv4N\n", - "\n", - "mobiquotes: What happens is once you start to understand football, you realise that it's not just about the physical side of the game and chasing after a ball. It's a strategic sport which requires a lot of intelligence. It's a very mental game.\n", - "\n", - "EricNMoody: Check out the Wednesday edition of the Fantasy Football Daily Notes:\n", - "https://t.co/v5ohTxYUGV\n", - "\n", - "Stream connection closed by Twitter\n" - ] - } - ], - "source": [ - "location_listener.filter(expansions=['author_id'], \n", - " user_fields=['location'], tweet_fields=['lang'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Displaying the Location Statistics" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "83" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "counts['total_tweets']" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "50" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "counts['locations']" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "60.2%\n" - ] - } - ], - "source": [ - "print(f'{counts[\"locations\"] / counts[\"total_tweets\"]:.1%}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Geocoding the Locations" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "from tweetutilities import get_geocodes" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Getting coordinates for tweet locations...\n", - "Done geocoding\n" - ] - } - ], - "source": [ - "bad_locations = get_geocodes(tweets)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Displaying the Bad Location Statistics" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "9" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bad_locations" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "18.0%\n" - ] - } - ], - "source": [ - "print(f'{bad_locations / counts[\"locations\"]:.1%}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Cleaning the Data" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.DataFrame(tweets)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "df = df.dropna()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a Map with Folium" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "import folium" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "usmap = folium.Map(location=[39.8283, -98.5795], \n", - " tiles='Stamen Terrain', zoom_start=5, detect_retina=True) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating Popup Markers for the Tweet Locations" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "for t in df.itertuples():\n", - " text = ': '.join([t.username, t.text])\n", - " popup = folium.Popup(text, parse_html=True)\n", - " marker = folium.Marker((t.latitude, t.longitude), \n", - " popup=popup)\n", - " marker.add_to(usmap)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Saving the Map" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "usmap.save('tweet_map.html')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**NOTE: We added the following cell to display the map in the Jupyter Notebook.**" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/html": [ - "
Make this Notebook Trusted to load map: File -> Trust Notebook
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "usmap" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2022 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_15_01selfcheck-checkpoint.ipynb b/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_15_01selfcheck-checkpoint.ipynb deleted file mode 100644 index 78f2990..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_15_01selfcheck-checkpoint.ipynb +++ /dev/null @@ -1,66 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.15.1 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** The folium classes `________` and `________` enable you to mark locations on a map and add text that displays when the user clicks a marked location.\n", - "**Answer:** `Marker`, `Popup`.\n", - "\n", - "**2. _(Fill-In)_** Pandas DataFrame method `________` creates an iterator for accessing the rows of a DataFrame as tuples.\n", - "**Answer:** `itertuples`.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2022 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_15_02selfcheck-checkpoint.ipynb b/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_15_02selfcheck-checkpoint.ipynb deleted file mode 100755 index 8a78832..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_15_02selfcheck-checkpoint.ipynb +++ /dev/null @@ -1,100 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.15.2 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Use an OpenMapQuest geocoding object to get the latitude and Longitude for Chicago, IL.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import keys" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from geopy import OpenMapQuest" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "geo = OpenMapQuest(api_key=keys.mapquest_key)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "geo.geocode('Chicago, IL')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2022 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_15selfcheck-checkpoint.ipynb b/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_15selfcheck-checkpoint.ipynb deleted file mode 100755 index 7705012..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/13_15selfcheck-checkpoint.ipynb +++ /dev/null @@ -1,68 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.15 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** The geopy library enables you to translate locations into latitude and longitude coordinates, known as `________`, so you can plot locations on a map. \n", - "\n", - "**Answer:** geocoding\n", - "\n", - "**2. _(Fill-In)_** The OpenMapQuest Geocoding API converts locations, like Boston, MA into their `________` and `________` for plotting on maps.\n", - "\n", - "**Answer:** latitudes, longitudes." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2022 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/README-checkpoint.txt b/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/README-checkpoint.txt deleted file mode 100755 index ac3297c..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/.ipynb_checkpoints/README-checkpoint.txt +++ /dev/null @@ -1,2 +0,0 @@ -Sections 13.7-11 use one continuous IPython session for the examples -and Self Check exercises, so all of these are in one notebook. diff --git a/examples/ch13_TwitterV2/snippets_ipynb/13_07-11withSelfChecks.ipynb b/examples/ch13_TwitterV2/snippets_ipynb/13_07-11withSelfChecks.ipynb deleted file mode 100755 index 8149194..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/13_07-11withSelfChecks.ipynb +++ /dev/null @@ -1,1082 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**_Note: This notebook contains ALL the code for Sections 13.7 through 13.11, including the Self Check snippets because all the snippets in these sections are consecutively numbered in the text._**" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.7 Authenticating with Twitter Via Tweepy to Access Twitter v2 APIs" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import tweepy" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import keys" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a Client Object" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "client = tweepy.Client(bearer_token=keys.bearer_token,\n", - " wait_on_rate_limit=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.8 Getting Information About a Twitter Account" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "nasa = client.get_user(username='NASA', \n", - " user_fields=['description', 'public_metrics'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### tweepy.Response Object" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting a User’s Basic Account Information" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa.data.id" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa.data.name" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa.data.username" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "nasa.data.description" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "### Getting the Number of Accounts That Follow This Account and the Number of Accounts This Account Follows" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa.data.public_metrics['followers_count']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa.data.public_metrics['following_count']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting Your Own Account’s Information" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.8 Self Check\n", - "**2. _(IPython Session)_** Use the `client` object to get information about the `NASAMars` account, then display its ID, name, username, description and number of followers.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "nasa_mars = client.get_user(username='NASAMars', \n", - " user_fields=['description', 'public_metrics'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa_mars.data.id" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa_mars.data.name" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa_mars.data.username" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa_mars.data.description" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa_mars.data.public_metrics['followers_count']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.9 Intro to Tweepy `Paginator`s: Getting More than One Page of Results" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "# 13.9.1 Determining an Account’s Followers " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "followers = []" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a `Paginator`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "paginator = tweepy.Paginator(\n", - " client.get_users_followers, nasa.data.id, max_results=5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting Results" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for follower in paginator.flatten(limit=10):\n", - " followers.append(follower.username)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('Followers:', \n", - " ' '.join(sorted(followers, key=lambda s: s.lower())))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.9.1 Self Check\n", - "**3. _(IPython Session)_** Use a Cursor to get and display 10 followers of the `NASAKepler` account.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa_mars_followers = []" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa_mars_followers_paginator = tweepy.Paginator(\n", - " client.get_users_followers, nasa_mars.data.id, max_results=5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for follower in nasa_mars_followers_paginator.flatten(limit=10):\n", - " nasa_mars_followers.append(follower.username)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(' '.join(nasa_mars_followers))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.9.2 Determining Whom an Account Follows " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "following = []" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "paginator = tweepy.Paginator(\n", - " client.get_users_following, nasa.data.id, max_results=5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for user_followed in paginator.flatten(limit=10):\n", - " following.append(user_followed.username)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print('Following:', \n", - " ' '.join(sorted(following, key=lambda s: s.lower())))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.9.3 Getting a User’s Recent Tweets" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa_tweets = client.get_users_tweets(\n", - " id=nasa.data.id, max_results=5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for tweet in nasa_tweets.data:\n", - " print(f\"NASA: {tweet.data['text']}\\n\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "jp-MarkdownHeadingCollapsed": true, - "tags": [] - }, - "source": [ - "### Grabbing Recent Tweets from Your Own Timeline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.9.3 Self Check\n", - "**2. _(IPython Session)_** Get and display two tweets from the `NASAMars` account.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nasa_mars_tweets = client.get_users_tweets(\n", - " id=nasa_mars.data.id, max_results=5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for tweet in nasa_mars_tweets.data:\n", - " print(f\"NASAMars: {tweet.data['text']}\\n\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.10 Searching Recent Tweets; Intro to Twitter v2 API Search Operators" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Utility Function `print_tweets` from `tweetutilities.py`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from tweetutilities import print_tweets" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```python\n", - "def print_tweets(tweets):\n", - " # translator to autodetect source language and return English\n", - " translator = GoogleTranslator(source='auto', target='en')\n", - "\n", - " \"\"\"For each tweet in tweets, display the username of the sender\n", - " and tweet text. If the language is not English, translate the text \n", - " with the deep-translator library's GoogleTranslator.\"\"\"\n", - " for tweet, user in zip(tweets.data, tweets.includes['users']):\n", - " print(f'{user.username}:', end=' ')\n", - "\n", - " if 'en' in tweet.lang:\n", - " print(f'{tweet.text}\\n')\n", - " elif 'und' not in tweet.lang: # translate to English first\n", - " print(f'\\n ORIGINAL: {tweet.text}')\n", - " print(f'TRANSLATED: {translator.translate(tweet.text)}\\n')\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Searching for Specific Words" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweets = client.search_recent_tweets(\n", - " query='Webb Space Telescope', \n", - " expansions=['author_id'], tweet_fields=['lang'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print_tweets(tweets)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Searching with Twitter v2 API Search Operators" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Searching with Twitter v2 API Search Operators" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Operator Documentation and Tutorial" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Searching for Tweets From NASA Containing Links" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweets = client.search_recent_tweets(\n", - " query='from:NASA has:links', \n", - " expansions=['author_id'], tweet_fields=['lang'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print_tweets(tweets)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Searching for a Hashtag" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweets = client.search_recent_tweets(query='#metaverse', \n", - " expansions=['author_id'], tweet_fields=['lang'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print_tweets(tweets)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.10 Self Check\n", - "**3. _(IPython Session)_** Search for one tweet from the `NASA` account containing `'astronaut'`.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweets = client.search_recent_tweets(query='from:nasa astronaut', \n", - " expansions=['author_id'], tweet_fields=['lang'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print_tweets(tweets)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.11 Spotting Trending Topics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "auth = tweepy.OAuth2BearerHandler(keys.bearer_token)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "api = tweepy.API(auth=auth, wait_on_rate_limit=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.11.1 Places with Trending Topics\n", - "**Note: This part of the Twitter APIs has not been migrated from v1.1 to v2 yet and is accessible only to \"Elevated\" and \"Academic Research\" access.**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "available_trends = api.available_trends()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "len(available_trends)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "available_trends[0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "available_trends[1]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.11.2 Getting a List of Trending Topics\n", - "### Worldwide Trending Topics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "world_trends = api.get_place_trends(id=1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "trends_list = world_trends[0]['trends']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "trends_list[0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "trends_list = [t for t in trends_list if t['tweet_volume']]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from operator import itemgetter " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "trends_list.sort(key=itemgetter('tweet_volume'), reverse=True) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for trend in trends_list:\n", - " print(trend['name'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### New York City Trending Topics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "nyc_trends = api.get_place_trends(id=2459115) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nyc_list = nyc_trends[0]['trends']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nyc_list = [t for t in nyc_list if t['tweet_volume']]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nyc_list.sort(key=itemgetter('tweet_volume'), reverse=True) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for trend in nyc_list[:5]:\n", - " print(trend['name'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.11.2 Self Check\n", - "**3. _(IPython Session)_** Display the top 3 trending topics today in the United States.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "us_trends = api.get_place_trends(id='23424977')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "us_list = us_trends[0]['trends']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "us_list = [t for t in us_list if t['tweet_volume']]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "us_list.sort(key=itemgetter('tweet_volume'), reverse=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for trend in us_list[:3]:\n", - " print(trend['name'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.11.3 Create a Word Cloud from Trending Topics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "topics = {}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "for trend in nyc_list:\n", - " topics[trend['name']] = trend['tweet_volume']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from wordcloud import WordCloud" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wordcloud = WordCloud(width=1600, height=900,\n", - " prefer_horizontal=0.5, min_font_size=10, colormap='prism', \n", - " background_color='white') " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wordcloud = wordcloud.fit_words(topics)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wordcloud = wordcloud.to_file('TrendingTwitter.png')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**NOTE: The following code displays the image in a Jupyter Notebook**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from IPython.display import Image\n", - "Image(filename='TrendingTwitter.png', width=400)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.11.3 Self Check\n", - "\n", - "**1. _(IPython Session)_** Create a word cloud using the `us_list` list from the previous section’s Self Check.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "topics = {}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for trend in us_list:\n", - " topics[trend['name']] = trend['tweet_volume']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wordcloud = wordcloud.fit_words(topics)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wordcloud = wordcloud.to_file('USTrendingTwitter.png')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**NOTE: The following code displays the image in a Jupyter Notebook**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from IPython.display import Image\n", - "Image(filename='USTrendingTwitter.png', width=400)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2022 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/ch13_TwitterV2/snippets_ipynb/13_12.ipynb b/examples/ch13_TwitterV2/snippets_ipynb/13_12.ipynb deleted file mode 100755 index 3842953..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/13_12.ipynb +++ /dev/null @@ -1,93 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.12 Cleaning/Preprocessing Tweets for Analysis\n", - "### tweet-preprocessor Library and TextBlob Utility Functions\n", - "### Installing tweet-preprocessor\n", - "### Cleaning a Tweet" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import preprocessor as p" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "p.set_options(p.OPT.URL, p.OPT.RESERVED)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweet_text = 'RT A sample retweet with a URL https://nasa.gov'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "p.clean(tweet_text)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2022 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/ch13_TwitterV2/snippets_ipynb/13_12selfcheck.ipynb b/examples/ch13_TwitterV2/snippets_ipynb/13_12selfcheck.ipynb deleted file mode 100755 index 4344c2f..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/13_12selfcheck.ipynb +++ /dev/null @@ -1,64 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.12 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(True/False)_** The tweet-preprocessor library can automatically remove URLs, `@`-mentions (like `@nasa`), hashtags (like `#mars`), Twitter reserved words (like, `RT` for retweet and `FAV` for favorite, which is similar to a “like” on other social networks), emojis (all or just smileys) and numbers, or any combination of these. \n", - "\n", - "**Answer:** True." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2022 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/ch13_TwitterV2/snippets_ipynb/13_13_02.ipynb b/examples/ch13_TwitterV2/snippets_ipynb/13_13_02.ipynb deleted file mode 100755 index e6424d7..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/13_13_02.ipynb +++ /dev/null @@ -1,220 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.13.2 Initiating Stream Processing" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Authenticating\n", - "**Don't need to authenticate in advance for streaming. Just pass bearer-token as you create the StreamingClient subclass object.**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import tweepy" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import keys" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a `TweetListener` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from tweetlistener import TweetListener" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweet_listener = TweetListener(\n", - " bearer_token=keys.bearer_token, limit=3)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "### Redirecting Standard Error Stream to Standard Output Stream" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import sys" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sys.stderr = sys.stdout" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "### Deleting Existing Stream Rules" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rules = tweet_listener.get_rules().data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rule_ids = [rule.id for rule in rules]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweet_listener.delete_rules(rule_ids) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating and Adding a Stream Rule" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "filter_rule = tweepy.StreamRule('football')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "tweet_listener.add_rules(filter_rule)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Starting the Tweet Stream" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweet_listener.filter(\n", - " expansions=['author_id'], tweet_fields=['lang'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Asynchronous vs. Synchronous Streams" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2022 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/ch13_TwitterV2/snippets_ipynb/13_13_02selfcheck.ipynb b/examples/ch13_TwitterV2/snippets_ipynb/13_13_02selfcheck.ipynb deleted file mode 100755 index 1d0fefa..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/13_13_02selfcheck.ipynb +++ /dev/null @@ -1,68 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.13.2 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** Rather than connecting to Twitter on each method call, a stream uses a persistent connection to `________` (that is, send) tweets to your app. \n", - "\n", - "**Answer:** push.\n", - "\n", - "**2. _(True/False)_** Twitter’s free Streaming API sends to your app randomly selected tweets dynamically as they occur—up to a maximum of ten percent of the tweets per day. \n", - "\n", - "**Answer:** False. Twitter’s Streaming API sends to your app randomly selected tweets dynamically as they occur—up to a maximum of one percent of the tweets per day. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2022 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/ch13_TwitterV2/snippets_ipynb/13_14.ipynb b/examples/ch13_TwitterV2/snippets_ipynb/13_14.ipynb deleted file mode 100644 index 946714f..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/13_14.ipynb +++ /dev/null @@ -1,155 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.14 Tweet Sentiment Analysis \n", - "\n", - "**NOTE This script has been modified from what we presented in the chapter to accomodate executing it in a notebook** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# sentimentlisener.py\n", - "\"\"\"Searches for tweets that match a search string and tallies \n", - "the number of positive, neutral and negative tweets.\"\"\"\n", - "import keys\n", - "import preprocessor as p \n", - "import sys\n", - "from textblob import TextBlob\n", - "import tweepy\n", - "\n", - "class SentimentListener(tweepy.StreamingClient):\n", - " \"\"\"Handles incoming Tweet stream.\"\"\"\n", - "\n", - " def __init__(self, bearer_token, sentiment_dict, topic, limit=10):\n", - " \"\"\"Configure the SentimentListener.\"\"\"\n", - " self.sentiment_dict = sentiment_dict\n", - " self.tweet_count = 0\n", - " self.topic = topic\n", - " self.TWEET_LIMIT = limit\n", - " \n", - " # set tweet-preprocessor to remove URLs/reserved words\n", - " p.set_options(p.OPT.URL, p.OPT.RESERVED) \n", - " super().__init__(bearer_token, wait_on_rate_limit=True)\n", - "\n", - " def on_response(self, response):\n", - " \"\"\"Called when Twitter pushes a new tweet to you.\"\"\"\n", - " \n", - " # if the tweet is not a retweet\n", - " if not response.data.text.startswith('RT'):\n", - " text = p.clean(response.data.text) # clean the tweet\n", - "\n", - " # ignore tweet if the topic is not in the tweet text\n", - " if self.topic.lower() not in text.lower():\n", - " return\n", - "\n", - " # update self.sentiment_dict with the polarity\n", - " blob = TextBlob(text)\n", - " if blob.sentiment.polarity > 0:\n", - " sentiment = '+'\n", - " self.sentiment_dict['positive'] += 1 \n", - " elif blob.sentiment.polarity == 0:\n", - " sentiment = ' '\n", - " self.sentiment_dict['neutral'] += 1 \n", - " else:\n", - " sentiment = '-'\n", - " self.sentiment_dict['negative'] += 1 \n", - "\n", - " # display the tweet\n", - " username = response.includes['users'][0].username\n", - " print(f'{sentiment} {username}: {text}\\n')\n", - "\n", - " self.tweet_count += 1 # track number of tweets processed\n", - "\n", - " # if TWEET_LIMIT is reached, terminate streaming\n", - " if self.tweet_count == self.TWEET_LIMIT:\n", - " self.disconnect()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#def main():\n", - "# get search term and number of tweets\n", - "search_key = 'football' #sys.argv[1]\n", - "limit = 10 #int(sys.argv[2]) # number of tweets to tally\n", - "\n", - "# set up the sentiment dictionary\n", - "sentiment_dict = {'positive': 0, 'neutral': 0, 'negative': 0}\n", - "\n", - "# create the StreamingClient subclass object\n", - "sentiment_listener = SentimentListener(keys.bearer_token, \n", - " sentiment_dict, search_key, limit)\n", - "\n", - "# redirect sys.stderr to sys.stdout\n", - "sys.stderr = sys.stdout\n", - "\n", - "# delete existing stream rules\n", - "rules = sentiment_listener.get_rules().data\n", - "rule_ids = [rule.id for rule in rules]\n", - "sentiment_listener.delete_rules(rule_ids) \n", - "\n", - "# create stream rule\n", - "sentiment_listener.add_rules(\n", - " tweepy.StreamRule(f'{search_key} lang:en'))\n", - "\n", - "# start filtering English tweets containing search_key\n", - "sentiment_listener.filter(expansions=['author_id'])\n", - "\n", - "print(f'Tweet sentiment for \"{search_key}\"')\n", - "print('Positive:', sentiment_dict['positive'])\n", - "print(' Neutral:', sentiment_dict['neutral'])\n", - "print('Negative:', sentiment_dict['negative'])\n", - "\n", - "# call main if this file is executed as a script\n", - "#if __name__ == '__main__':\n", - "# main()\n", - "\n", - "##########################################################################\n", - "# (C) Copyright 2022 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/ch13_TwitterV2/snippets_ipynb/13_15_01.ipynb b/examples/ch13_TwitterV2/snippets_ipynb/13_15_01.ipynb deleted file mode 100755 index ceeaa02..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/13_15_01.ipynb +++ /dev/null @@ -1,420 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 13.15.1 Getting and Mapping the Tweets" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Collections Required By `LocationListener`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweets = [] " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "counts = {'total_tweets': 0, 'locations': 0}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating the `LocationListener` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import keys" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import tweepy" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from locationlistener import LocationListener" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "location_listener = LocationListener(\n", - " keys.bearer_token, counts_dict=counts, tweets_list=tweets,\n", - " topic='football', limit=50)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Redirect sys.stderr to sys.stdout" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import sys" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sys.stderr = sys.stdout" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Delete Existing `StreamRule`s" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rules = location_listener.get_rules().data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rule_ids = [rule.id for rule in rules]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "location_listener.delete_rules(rule_ids) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Create a `StreamRule`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "location_listener.add_rules(\n", - " tweepy.StreamRule('football lang:en'))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "### Configure and Start the Stream of Tweets" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "location_listener.filter(expansions=['author_id'], \n", - " user_fields=['location'], tweet_fields=['lang'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Displaying the Location Statistics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "counts['total_tweets']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "counts['locations']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'{counts[\"locations\"] / counts[\"total_tweets\"]:.1%}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Geocoding the Locations" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from tweetutilities import get_geocodes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "bad_locations = get_geocodes(tweets)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Displaying the Bad Location Statistics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "bad_locations" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'{bad_locations / counts[\"locations\"]:.1%}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Cleaning the Data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.DataFrame(tweets)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "df = df.dropna()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a Map with Folium" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import folium" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "usmap = folium.Map(location=[39.8283, -98.5795], \n", - " tiles='Stamen Terrain', zoom_start=5, detect_retina=True) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating Popup Markers for the Tweet Locations" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for t in df.itertuples():\n", - " text = ': '.join([t.username, t.text])\n", - " popup = folium.Popup(text, parse_html=True)\n", - " marker = folium.Marker((t.latitude, t.longitude), \n", - " popup=popup)\n", - " marker.add_to(usmap)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Saving the Map" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "usmap.save('tweet_map.html')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**NOTE: We added the following cell to display the map in the Jupyter Notebook.**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "usmap" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2022 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/ch13_TwitterV2/snippets_ipynb/13_15_01selfcheck.ipynb b/examples/ch13_TwitterV2/snippets_ipynb/13_15_01selfcheck.ipynb deleted file mode 100644 index 78f2990..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/13_15_01selfcheck.ipynb +++ /dev/null @@ -1,66 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.15.1 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** The folium classes `________` and `________` enable you to mark locations on a map and add text that displays when the user clicks a marked location.\n", - "**Answer:** `Marker`, `Popup`.\n", - "\n", - "**2. _(Fill-In)_** Pandas DataFrame method `________` creates an iterator for accessing the rows of a DataFrame as tuples.\n", - "**Answer:** `itertuples`.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2022 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/ch13_TwitterV2/snippets_ipynb/13_15_02selfcheck.ipynb b/examples/ch13_TwitterV2/snippets_ipynb/13_15_02selfcheck.ipynb deleted file mode 100755 index 8a78832..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/13_15_02selfcheck.ipynb +++ /dev/null @@ -1,100 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.15.2 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(IPython Session)_** Use an OpenMapQuest geocoding object to get the latitude and Longitude for Chicago, IL.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import keys" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from geopy import OpenMapQuest" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "geo = OpenMapQuest(api_key=keys.mapquest_key)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "geo.geocode('Chicago, IL')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2022 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/ch13_TwitterV2/snippets_ipynb/13_15selfcheck.ipynb b/examples/ch13_TwitterV2/snippets_ipynb/13_15selfcheck.ipynb deleted file mode 100755 index 7705012..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/13_15selfcheck.ipynb +++ /dev/null @@ -1,68 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# 13.15 Self Check" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**1. _(Fill-In)_** The geopy library enables you to translate locations into latitude and longitude coordinates, known as `________`, so you can plot locations on a map. \n", - "\n", - "**Answer:** geocoding\n", - "\n", - "**2. _(Fill-In)_** The OpenMapQuest Geocoding API converts locations, like Boston, MA into their `________` and `________` for plotting on maps.\n", - "\n", - "**Answer:** latitudes, longitudes." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2022 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/ch13_TwitterV2/snippets_ipynb/README.txt b/examples/ch13_TwitterV2/snippets_ipynb/README.txt deleted file mode 100755 index ac3297c..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/README.txt +++ /dev/null @@ -1,2 +0,0 @@ -Sections 13.7-11 use one continuous IPython session for the examples -and Self Check exercises, so all of these are in one notebook. diff --git a/examples/ch13_TwitterV2/snippets_ipynb/files/art/.ipynb_checkpoints/check-checkpoint.png b/examples/ch13_TwitterV2/snippets_ipynb/files/art/.ipynb_checkpoints/check-checkpoint.png deleted file mode 100755 index eea18cd..0000000 Binary files a/examples/ch13_TwitterV2/snippets_ipynb/files/art/.ipynb_checkpoints/check-checkpoint.png and /dev/null differ diff --git a/examples/ch13_TwitterV2/snippets_ipynb/files/art/check.png b/examples/ch13_TwitterV2/snippets_ipynb/files/art/check.png deleted file mode 100755 index eea18cd..0000000 Binary files a/examples/ch13_TwitterV2/snippets_ipynb/files/art/check.png and /dev/null differ diff --git a/examples/ch13_TwitterV2/snippets_ipynb/keys.py b/examples/ch13_TwitterV2/snippets_ipynb/keys.py deleted file mode 100644 index 9fcffad..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/keys.py +++ /dev/null @@ -1,8 +0,0 @@ -#consumer_key = 'NVqJ06iaqBbyIQDuxUUCiM5gd' -#consumer_secret = 'fyVLUOxYMH6GSy8x7aA1OKLfhqUeRst4bnRMTImN1ASym0cgI9' -#access_token = '24867870-4rhn9y3OzIK9OBu57QMBVHQWKZfMxWRxPZTJIIsKX' -#access_token_secret = '3lv07LC30CKyzOjIEJiK1P5pdk94KIRTduFPqnIBU8LXb' - -mapquest_key = 'L0xOBy7HqIWsNgBvZvgVZx9HX1GSYzri' -#deep_translator_key = 'de06403b5fda5f896b9b7c23df3e7c0a' -bearer_token = 'AAAAAAAAAAAAAAAAAAAAAKKybwEAAAAAzvQFdKaTNAYKLzB1RX7Pmz25yJg%3DgNB7yVp00rLtwsmETSvoePoc2ymdOYfZb54Mw8A4LqwpYlTC2X' \ No newline at end of file diff --git a/examples/ch13_TwitterV2/snippets_ipynb/keys_empty.py b/examples/ch13_TwitterV2/snippets_ipynb/keys_empty.py deleted file mode 100755 index bf7c356..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/keys_empty.py +++ /dev/null @@ -1,2 +0,0 @@ -bearer_token = 'YourBearerToken' -mapquest_key = 'YourAPIKey' \ No newline at end of file diff --git a/examples/ch13_TwitterV2/snippets_ipynb/locationlistener.py b/examples/ch13_TwitterV2/snippets_ipynb/locationlistener.py deleted file mode 100755 index f154d61..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/locationlistener.py +++ /dev/null @@ -1,59 +0,0 @@ -# locationlistener.py -"""Receives tweets matching a search string and stores a list of -dictionaries containing each tweet's username/text/location.""" -import tweepy -from tweetutilities import get_tweet_content - -class LocationListener(tweepy.StreamingClient): - """Handles incoming Tweet stream to get location data.""" - - def __init__(self, bearer_token, counts_dict, - tweets_list, topic, limit=10): - """Configure the LocationListener.""" - self.tweets_list = tweets_list - self.counts_dict = counts_dict - self.topic = topic - self.TWEET_LIMIT = limit - super().__init__(bearer_token, wait_on_rate_limit=True) - - def on_response(self, response): - """Called when Twitter pushes a new tweet to you.""" - - # get tweet's username, text and location - tweet_data = get_tweet_content(response) - - # ignore retweets and tweets that do not contain the topic - if (tweet_data['text'].startswith('RT') or - self.topic.lower() not in tweet_data['text'].lower()): - return - - self.counts_dict['total_tweets'] += 1 # it's an original tweet - - # ignore tweets with no location - if not tweet_data.get('location'): - return - - self.counts_dict['locations'] += 1 # user account has location - self.tweets_list.append(tweet_data) # store the tweet - print(f"{tweet_data['username']}: {tweet_data['text']}\n") - - # if TWEET_LIMIT is reached, terminate streaming - if self.counts_dict['locations'] == self.TWEET_LIMIT: - self.disconnect() - - - -########################################################################## -# (C) Copyright 2022 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/snippets_ipynb/sentimentlistener.py b/examples/ch13_TwitterV2/snippets_ipynb/sentimentlistener.py deleted file mode 100755 index 2cc45ec..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/sentimentlistener.py +++ /dev/null @@ -1,106 +0,0 @@ -# sentimentlisener.py -"""Searches for tweets that match a search string and tallies -the number of positive, neutral and negative tweets.""" -import keys -import preprocessor as p -import sys -from textblob import TextBlob -import tweepy - -class SentimentListener(tweepy.StreamingClient): - """Handles incoming Tweet stream.""" - - def __init__(self, bearer_token, sentiment_dict, topic, limit=10): - """Configure the SentimentListener.""" - self.sentiment_dict = sentiment_dict - self.tweet_count = 0 - self.topic = topic - self.TWEET_LIMIT = limit - - # set tweet-preprocessor to remove URLs/reserved words - p.set_options(p.OPT.URL, p.OPT.RESERVED) - super().__init__(bearer_token, wait_on_rate_limit=True) - - def on_response(self, response): - """Called when Twitter pushes a new tweet to you.""" - - # if the tweet is not a retweet - if not response.data.text.startswith('RT'): - text = p.clean(response.data.text) # clean the tweet - - # ignore tweet if the topic is not in the tweet text - if self.topic.lower() not in text.lower(): - return - - # update self.sentiment_dict with the polarity - blob = TextBlob(text) - if blob.sentiment.polarity > 0: - sentiment = '+' - self.sentiment_dict['positive'] += 1 - elif blob.sentiment.polarity == 0: - sentiment = ' ' - self.sentiment_dict['neutral'] += 1 - else: - sentiment = '-' - self.sentiment_dict['negative'] += 1 - - # display the tweet - username = response.includes['users'][0].username - print(f'{sentiment} {username}: {text}\n') - - self.tweet_count += 1 # track number of tweets processed - - # if TWEET_LIMIT is reached, terminate streaming - if self.tweet_count == self.TWEET_LIMIT: - self.disconnect() - -def main(): - # get search term and number of tweets - search_key = sys.argv[1] - limit = int(sys.argv[2]) # number of tweets to tally - - # set up the sentiment dictionary - sentiment_dict = {'positive': 0, 'neutral': 0, 'negative': 0} - - # create the StreamingClient subclass object - sentiment_listener = SentimentListener(keys.bearer_token, - sentiment_dict, search_key, limit) - - # redirect sys.stderr to sys.stdout - sys.stderr = sys.stdout - - # delete existing stream rules - rules = sentiment_listener.get_rules().data - rule_ids = [rule.id for rule in rules] - sentiment_listener.delete_rules(rule_ids) - - # create stream rule - sentiment_listener.add_rules( - tweepy.StreamRule(f'{search_key} lang:en')) - - # start filtering English tweets containing search_key - sentiment_listener.filter(expansions=['author_id']) - - print(f'Tweet sentiment for "{search_key}"') - print('Positive:', sentiment_dict['positive']) - print(' Neutral:', sentiment_dict['neutral']) - print('Negative:', sentiment_dict['negative']) - -# call main if this file is executed as a script -if __name__ == '__main__': - main() - -########################################################################## -# (C) Copyright 2022 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/snippets_ipynb/tweetlistener.py b/examples/ch13_TwitterV2/snippets_ipynb/tweetlistener.py deleted file mode 100755 index b01654d..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/tweetlistener.py +++ /dev/null @@ -1,61 +0,0 @@ -# tweetlistener.py -"""StreamListener subclass that processes tweets as they arrive.""" -from deep_translator import GoogleTranslator -import tweepy - -class TweetListener(tweepy.StreamingClient): - """Handles incoming Tweet stream.""" - - def __init__(self, bearer_token, limit=10): - """Create instance variables for tracking number of tweets.""" - self.tweet_count = 0 - self.TWEET_LIMIT = limit - - # GoogleTranslator object for translating tweets to English - self.translator = GoogleTranslator(source='auto', target='en') - - super().__init__(bearer_token, wait_on_rate_limit=True) - - def on_connect(self): - """Called when your connection attempt is successful, enabling - you to perform appropriate application tasks at that point.""" - print('Connection successful\n') - - def on_response(self, response): - """Called when Twitter pushes a new tweet to you.""" - - try: - # get username of user who sent the tweet - username = response.includes['users'][0].username - print(f'Screen name: {username}') - print(f' Language: {response.data.lang}') - print(f' Tweet text: {response.data.text}') - - if response.data.lang != 'en' and response.data.lang != 'und': - english = self.translator.translate(response.data.text) - print(f' Translated: {english}') - - print() - self.tweet_count += 1 - except Exception as e: - print(f'Exception occured: {e}') - self.disconnect() - - # if TWEET_LIMIT is reached, terminate streaming - if self.tweet_count == self.TWEET_LIMIT: - self.disconnect() - -########################################################################## -# (C) Copyright 2022 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/snippets_ipynb/tweetutilities.py b/examples/ch13_TwitterV2/snippets_ipynb/tweetutilities.py deleted file mode 100755 index f5a12ab..0000000 --- a/examples/ch13_TwitterV2/snippets_ipynb/tweetutilities.py +++ /dev/null @@ -1,76 +0,0 @@ -# tweetutilities.py -"""Utility functions for interacting with Tweepy objects.""" -from deep_translator import GoogleTranslator -from geopy import OpenMapQuest -import keys -import time -import tweepy - -def print_tweets(tweets): - # translator to autodetect source language and return English - translator = GoogleTranslator(source='auto', target='en') - - """For each tweet in tweets, display the username of the sender - and tweet text. If the language is not English, translate the text - with Deep Translator.""" - for tweet, user in zip(tweets.data, tweets.includes['users']): - print(f'{user.username}:', end=' ') - - if 'en' in tweet.lang: - print(f'{tweet.text}\n') - elif 'und' not in tweet.lang: # translate to English first - print(f'\n ORIGINAL: {tweet.text}') - print(f'TRANSLATED: {translator.translate(tweet.text)}\n') - -def get_tweet_content(response): - """Return dictionary with data from tweet.""" - fields = {} - fields['username'] = response.includes['users'][0].username - fields['text'] = response.data.text - fields['location'] = response.includes['users'][0].location - - return fields - -def get_geocodes(tweet_list): - """Get the latitude and longitude for each tweet's location. - Returns the number of tweets with invalid location data.""" - print('Getting coordinates for tweet locations...') - geo = OpenMapQuest(api_key=keys.mapquest_key) # geocoder - bad_locations = 0 - - for tweet in tweet_list: - processed = False - delay = .1 # used if OpenMapQuest times out to delay next call - while not processed: - try: # get coordinates for tweet['location'] - geo_location = geo.geocode(tweet['location']) - processed = True - except: # timed out, so wait before trying again - print('OpenMapQuest service timed out. Waiting.') - time.sleep(delay) - delay += .1 - - if geo_location: - tweet['latitude'] = geo_location.latitude - tweet['longitude'] = geo_location.longitude - else: - bad_locations += 1 # tweet['location'] was invalid - - print('Done geocoding') - return bad_locations - - -########################################################################## -# (C) Copyright 2022 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/13_07-11withSelfChecks-checkpoint.py b/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/13_07-11withSelfChecks-checkpoint.py deleted file mode 100755 index 81ee54d..0000000 --- a/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/13_07-11withSelfChecks-checkpoint.py +++ /dev/null @@ -1,246 +0,0 @@ -# Section 13.7-13.11 snippets with Self Checks -# because those sections are one running IPython session - -# 13.7 Authenticating with Twitter Via Tweepy to Access Twitter v2 APIs -import tweepy -import keys - -# Creating a Client Object -client = tweepy.Client(bearer_token=keys.bearer_token, - wait_on_rate_limit=True) - -#13.8 Getting Information About a Twitter Account -nasa = client.get_user(username='NASA', - user_fields=['description', 'public_metrics']) - -# tweepy.Response Object -# Getting a User’s Basic Account Information -nasa.data.id - -nasa.data.name - -nasa.data.username - -nasa.data.description - -# Getting the Number of Accounts That Follow This Account and the Number of Accounts This Account Follows -nasa.data.public_metrics['followers_count'] - -nasa.data.public_metrics['following_count'] - -# Getting Your Own Account’s Information - -# 13.8 Self Check -# Exercise 2 -nasa_mars = client.get_user(username='NASAMars', - user_fields=['description', 'public_metrics']) - -nasa_mars.data.id - -nasa_mars.data.name - -nasa_mars.data.username - -nasa_mars.data.description - -nasa_mars.data.public_metrics['followers_count'] - -# 13.9 Intro to Tweepy Paginators: Getting More than One Page of Results -# 13.9.1 Determining an Account’s Followers -followers = [] - -# Creating a Paginator -paginator = tweepy.Paginator( - client.get_users_followers, nasa.data.id, max_results=5) - -# Getting Results -for follower in paginator.flatten(limit=10): - followers.append(follower.username) - -print('Followers:', - ' '.join(sorted(followers, key=lambda s: s.lower()))) - -# 13.9.1 Self Check -# Exercise 3. -nasa_mars_followers = [] - -nasa_mars_followers_paginator = tweepy.Paginator( - client.get_users_followers, nasa_mars.data.id, max_results=5) - -for follower in nasa_mars_followers_paginator.flatten(limit=10): - nasa_mars_followers.append(follower.username) - -print(' '.join(nasa_mars_followers)) - -# 13.9.2 Determining Whom an Account Follows -following = [] - -paginator = tweepy.Paginator( - client.get_users_following, nasa.data.id, max_results=5) - -for user_followed in paginator.flatten(limit=10): - following.append(user_followed.username) - -print('Following:', - ' '.join(sorted(following, key=lambda s: s.lower()))) - - -# 13.9.3 Getting a User’s Recent Tweets -nasa_tweets = client.get_users_tweets( - id=nasa.data.id, max_results=5) - -for tweet in nasa_tweets.data: - print(f"NASA: {tweet.data['text']}\n") - -# Grabbing Recent Tweets from Your Own Timeline -# 13.9.3 Self Check -# Exercise 2 -nasa_mars_tweets = client.get_users_tweets( - id=nasa_mars.data.id, max_results=5) - -for tweet in nasa_mars_tweets.data: - print(f"NASAMars: {tweet.data['text']}\n") - -# 13.10 Searching Recent Tweets; Intro to Twitter v2 API Search Operators -# Utility Function print_tweets from tweetutilities.py -from tweetutilities import print_tweets - -# Searching for Specific Words -tweets = client.search_recent_tweets( - query='Webb Space Telescope', - expansions=['author_id'], tweet_fields=['lang']) - -print_tweets(tweets) - -# Searching with Twitter v2 API Search Operators - -# Operator Documentation and Tutorial - -# Searching for Tweets From NASA Containing Links -tweets = client.search_recent_tweets( - query='from:NASA has:links', - expansions=['author_id'], tweet_fields=['lang']) - -print_tweets(tweets) - -# Searching for a Hashtag -tweets = client.search_recent_tweets(query='#metaverse', - expansions=['author_id'], tweet_fields=['lang']) - -print_tweets(tweets) - -# 13.10 Self Check -# Exercise -tweets = client.search_recent_tweets(query='from:nasa astronaut', - expansions=['author_id'], tweet_fields=['lang']) - -print_tweets(tweets) - -# 13.11 Spotting Trending Topics -auth = tweepy.OAuth2BearerHandler(keys.bearer_token) - -api = tweepy.API(auth=auth, wait_on_rate_limit=True) - -# 13.11.1 Places with Trending Topics -# Note: This part of the Twitter APIs has not been migrated from v1.1 to v2 -# yet and is accessible only to "Elevated" and "Academic Research" access. -available_trends = api.available_trends() - -len(available_trends) - -available_trends[0] - -available_trends[1] - -# 13.11.2 Getting a List of Trending Topics -# Worldwide Trending Topics -world_trends = api.get_place_trends(id=1) - -trends_list = world_trends[0]['trends'] - -trends_list[0] - -trends_list = [t for t in trends_list if t['tweet_volume']] - -from operator import itemgetter -trends_list.sort(key=itemgetter('tweet_volume'), reverse=True) - -for trend in trends_list: - print(trend['name']) - -# New York City Trending Topics -nyc_trends = api.get_place_trends(id=2459115) - -nyc_list = nyc_trends[0]['trends'] - -nyc_list = [t for t in nyc_list if t['tweet_volume']] - -nyc_list.sort(key=itemgetter('tweet_volume'), reverse=True) - -for trend in nyc_list[:5]: - print(trend['name']) - -# 13.11.2 Self Check -Exercise 3 -us_trends = api.get_place_trends(id='23424977') - -us_list = us_trends[0]['trends'] - -us_list = [t for t in us_list if t['tweet_volume']] - -us_list.sort(key=itemgetter('tweet_volume'), reverse=True) - -for trend in us_list[:3]: - print(trend['name']) - -# 13.11.3 Create a Word Cloud from Trending Topics -topics = {} - -for trend in nyc_list: - topics[trend['name']] = trend['tweet_volume'] - -from wordcloud import WordCloud - -wordcloud = WordCloud(width=1600, height=900, - prefer_horizontal=0.5, min_font_size=10, colormap='prism', - background_color='white') - -wordcloud = wordcloud.fit_words(topics) - -wordcloud = wordcloud.to_file('TrendingTwitter.png') - - -# 13.11.3 Self Check -# Exercise 1 -topics = {} - -for trend in us_list: - topics[trend['name']] = trend['tweet_volume'] - -wordcloud = wordcloud.fit_words(topics) - -wordcloud = wordcloud.to_file('USTrendingTwitter.png') - - - - - - -NOTE: The following code displays the image in a Jupyter Notebook - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/13_12-checkpoint.py b/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/13_12-checkpoint.py deleted file mode 100755 index 1178cdc..0000000 --- a/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/13_12-checkpoint.py +++ /dev/null @@ -1,28 +0,0 @@ -# Section 13.12 snippets - -import preprocessor as p - -p.set_options(p.OPT.URL, p.OPT.RESERVED) - -tweet_text = 'RT A sample retweet with a URL https://nasa.gov' - -p.clean(tweet_text) - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/13_13_02-checkpoint.py b/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/13_13_02-checkpoint.py deleted file mode 100755 index 4845a69..0000000 --- a/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/13_13_02-checkpoint.py +++ /dev/null @@ -1,52 +0,0 @@ -# 13.13.2 Initiating Stream Processing - -# Authenticating -import tweepy - -import keys - -# Creating a TweetListener -from tweetlistener import TweetListener - -tweet_listener = TweetListener( - bearer_token=keys.bearer_token, limit=3) - -# Redirecting Standard Error Stream to Standard Output Stream -import sys - -sys.stderr = sys.stdout - -# Deleting Existing Stream Rules -rules = tweet_listener.get_rules().data - -rule_ids = [rule.id for rule in rules] - -tweet_listener.delete_rules(rule_ids) - -# Creating and Adding a Stream Rule -filter_rule = tweepy.StreamRule('football') - -tweet_listener.add_rules(filter_rule) - -# Starting the Tweet Stream -tweet_listener.filter( - expansions=['author_id'], tweet_fields=['lang']) - -# Stream connection closed by Twitter - -# Asynchronous vs. Synchronous Streams - -########################################################################## -# (C) Copyright 2022 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/13_15_01-checkpoint.py b/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/13_15_01-checkpoint.py deleted file mode 100755 index b192797..0000000 --- a/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/13_15_01-checkpoint.py +++ /dev/null @@ -1,103 +0,0 @@ -# 13.15.1 Getting and Mapping the Tweets¶ - -# Collections Required By LocationListener -tweets = [] - -counts = {'total_tweets': 0, 'locations': 0} - -# Creating the LocationListener -import keys - -import tweepy - -from locationlistener import LocationListener - -location_listener = LocationListener( - keys.bearer_token, counts_dict=counts, tweets_list=tweets, - topic='football', limit=50) - -# Redirect sys.stderr to sys.stdout -import sys - -sys.stderr = sys.stdout - -# Delete Existing StreamRules -rules = location_listener.get_rules().data - -rule_ids = [rule.id for rule in rules] - -location_listener.delete_rules(rule_ids) - -# Create a StreamRule -location_listener.add_rules( - tweepy.StreamRule('football lang:en')) - -# Configure and Start the Stream of Tweets -location_listener.filter(expansions=['author_id'], - user_fields=['location'], tweet_fields=['lang']) - -# Displaying the Location Statistics -counts['total_tweets'] - -counts['locations'] - -print(f'{counts["locations"] / counts["total_tweets"]:.1%}') - -# Geocoding the Locations -from tweetutilities import get_geocodes - -bad_locations = get_geocodes(tweets) - -# Displaying the Bad Location Statistics -bad_locations - -print(f'{bad_locations / counts["locations"]:.1%}') - -# Cleaning the Data -import pandas as pd - -df = pd.DataFrame(tweets) - -df = df.dropna() - -# Creating a Map with Folium -import folium - -usmap = folium.Map(location=[39.8283, -98.5795], - tiles='Stamen Terrain', zoom_start=5, detect_retina=True) - -# Creating Popup Markers for the Tweet Locations -for t in df.itertuples(): - text = ': '.join([t.username, t.text]) - popup = folium.Popup(text, parse_html=True) - marker = folium.Marker((t.latitude, t.longitude), - popup=popup) - marker.add_to(usmap) - -# Saving the Map -usmap.save('tweet_map.html') - - - - - - - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/13_15_02selfcheck-checkpoint.py b/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/13_15_02selfcheck-checkpoint.py deleted file mode 100755 index a6adaaf..0000000 --- a/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/13_15_02selfcheck-checkpoint.py +++ /dev/null @@ -1,26 +0,0 @@ -# Section 15.2 Self Check snippets - -# Exercise 1 -import keys - -from geopy import OpenMapQuest - -geo = OpenMapQuest(api_key=keys.mapquest_key) - -geo.geocode('Chicago, IL') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/README-checkpoint.txt b/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/README-checkpoint.txt deleted file mode 100755 index 3fe48c8..0000000 --- a/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/README-checkpoint.txt +++ /dev/null @@ -1,3 +0,0 @@ -Sections 13.7-11 use one continuous IPython session for the -examples and Self Check exercises, so all of these are in one -snippet file. diff --git a/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/keys-checkpoint.py b/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/keys-checkpoint.py deleted file mode 100755 index 4f26031..0000000 --- a/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/keys-checkpoint.py +++ /dev/null @@ -1,6 +0,0 @@ -consumer_key = 'YourConsumerKey' -consumer_secret = 'YourConsumerSecret' -access_token = 'YourAccessToken' -access_token_secret = 'YourAccessTokenSecret' - -mapquest_key = 'YourAPIKey' \ No newline at end of file diff --git a/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/tweetlistener-checkpoint.py b/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/tweetlistener-checkpoint.py deleted file mode 100755 index b01654d..0000000 --- a/examples/ch13_TwitterV2/snippets_py/.ipynb_checkpoints/tweetlistener-checkpoint.py +++ /dev/null @@ -1,61 +0,0 @@ -# tweetlistener.py -"""StreamListener subclass that processes tweets as they arrive.""" -from deep_translator import GoogleTranslator -import tweepy - -class TweetListener(tweepy.StreamingClient): - """Handles incoming Tweet stream.""" - - def __init__(self, bearer_token, limit=10): - """Create instance variables for tracking number of tweets.""" - self.tweet_count = 0 - self.TWEET_LIMIT = limit - - # GoogleTranslator object for translating tweets to English - self.translator = GoogleTranslator(source='auto', target='en') - - super().__init__(bearer_token, wait_on_rate_limit=True) - - def on_connect(self): - """Called when your connection attempt is successful, enabling - you to perform appropriate application tasks at that point.""" - print('Connection successful\n') - - def on_response(self, response): - """Called when Twitter pushes a new tweet to you.""" - - try: - # get username of user who sent the tweet - username = response.includes['users'][0].username - print(f'Screen name: {username}') - print(f' Language: {response.data.lang}') - print(f' Tweet text: {response.data.text}') - - if response.data.lang != 'en' and response.data.lang != 'und': - english = self.translator.translate(response.data.text) - print(f' Translated: {english}') - - print() - self.tweet_count += 1 - except Exception as e: - print(f'Exception occured: {e}') - self.disconnect() - - # if TWEET_LIMIT is reached, terminate streaming - if self.tweet_count == self.TWEET_LIMIT: - self.disconnect() - -########################################################################## -# (C) Copyright 2022 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/snippets_py/13_07-11withSelfChecks.py b/examples/ch13_TwitterV2/snippets_py/13_07-11withSelfChecks.py deleted file mode 100755 index 81ee54d..0000000 --- a/examples/ch13_TwitterV2/snippets_py/13_07-11withSelfChecks.py +++ /dev/null @@ -1,246 +0,0 @@ -# Section 13.7-13.11 snippets with Self Checks -# because those sections are one running IPython session - -# 13.7 Authenticating with Twitter Via Tweepy to Access Twitter v2 APIs -import tweepy -import keys - -# Creating a Client Object -client = tweepy.Client(bearer_token=keys.bearer_token, - wait_on_rate_limit=True) - -#13.8 Getting Information About a Twitter Account -nasa = client.get_user(username='NASA', - user_fields=['description', 'public_metrics']) - -# tweepy.Response Object -# Getting a User’s Basic Account Information -nasa.data.id - -nasa.data.name - -nasa.data.username - -nasa.data.description - -# Getting the Number of Accounts That Follow This Account and the Number of Accounts This Account Follows -nasa.data.public_metrics['followers_count'] - -nasa.data.public_metrics['following_count'] - -# Getting Your Own Account’s Information - -# 13.8 Self Check -# Exercise 2 -nasa_mars = client.get_user(username='NASAMars', - user_fields=['description', 'public_metrics']) - -nasa_mars.data.id - -nasa_mars.data.name - -nasa_mars.data.username - -nasa_mars.data.description - -nasa_mars.data.public_metrics['followers_count'] - -# 13.9 Intro to Tweepy Paginators: Getting More than One Page of Results -# 13.9.1 Determining an Account’s Followers -followers = [] - -# Creating a Paginator -paginator = tweepy.Paginator( - client.get_users_followers, nasa.data.id, max_results=5) - -# Getting Results -for follower in paginator.flatten(limit=10): - followers.append(follower.username) - -print('Followers:', - ' '.join(sorted(followers, key=lambda s: s.lower()))) - -# 13.9.1 Self Check -# Exercise 3. -nasa_mars_followers = [] - -nasa_mars_followers_paginator = tweepy.Paginator( - client.get_users_followers, nasa_mars.data.id, max_results=5) - -for follower in nasa_mars_followers_paginator.flatten(limit=10): - nasa_mars_followers.append(follower.username) - -print(' '.join(nasa_mars_followers)) - -# 13.9.2 Determining Whom an Account Follows -following = [] - -paginator = tweepy.Paginator( - client.get_users_following, nasa.data.id, max_results=5) - -for user_followed in paginator.flatten(limit=10): - following.append(user_followed.username) - -print('Following:', - ' '.join(sorted(following, key=lambda s: s.lower()))) - - -# 13.9.3 Getting a User’s Recent Tweets -nasa_tweets = client.get_users_tweets( - id=nasa.data.id, max_results=5) - -for tweet in nasa_tweets.data: - print(f"NASA: {tweet.data['text']}\n") - -# Grabbing Recent Tweets from Your Own Timeline -# 13.9.3 Self Check -# Exercise 2 -nasa_mars_tweets = client.get_users_tweets( - id=nasa_mars.data.id, max_results=5) - -for tweet in nasa_mars_tweets.data: - print(f"NASAMars: {tweet.data['text']}\n") - -# 13.10 Searching Recent Tweets; Intro to Twitter v2 API Search Operators -# Utility Function print_tweets from tweetutilities.py -from tweetutilities import print_tweets - -# Searching for Specific Words -tweets = client.search_recent_tweets( - query='Webb Space Telescope', - expansions=['author_id'], tweet_fields=['lang']) - -print_tweets(tweets) - -# Searching with Twitter v2 API Search Operators - -# Operator Documentation and Tutorial - -# Searching for Tweets From NASA Containing Links -tweets = client.search_recent_tweets( - query='from:NASA has:links', - expansions=['author_id'], tweet_fields=['lang']) - -print_tweets(tweets) - -# Searching for a Hashtag -tweets = client.search_recent_tweets(query='#metaverse', - expansions=['author_id'], tweet_fields=['lang']) - -print_tweets(tweets) - -# 13.10 Self Check -# Exercise -tweets = client.search_recent_tweets(query='from:nasa astronaut', - expansions=['author_id'], tweet_fields=['lang']) - -print_tweets(tweets) - -# 13.11 Spotting Trending Topics -auth = tweepy.OAuth2BearerHandler(keys.bearer_token) - -api = tweepy.API(auth=auth, wait_on_rate_limit=True) - -# 13.11.1 Places with Trending Topics -# Note: This part of the Twitter APIs has not been migrated from v1.1 to v2 -# yet and is accessible only to "Elevated" and "Academic Research" access. -available_trends = api.available_trends() - -len(available_trends) - -available_trends[0] - -available_trends[1] - -# 13.11.2 Getting a List of Trending Topics -# Worldwide Trending Topics -world_trends = api.get_place_trends(id=1) - -trends_list = world_trends[0]['trends'] - -trends_list[0] - -trends_list = [t for t in trends_list if t['tweet_volume']] - -from operator import itemgetter -trends_list.sort(key=itemgetter('tweet_volume'), reverse=True) - -for trend in trends_list: - print(trend['name']) - -# New York City Trending Topics -nyc_trends = api.get_place_trends(id=2459115) - -nyc_list = nyc_trends[0]['trends'] - -nyc_list = [t for t in nyc_list if t['tweet_volume']] - -nyc_list.sort(key=itemgetter('tweet_volume'), reverse=True) - -for trend in nyc_list[:5]: - print(trend['name']) - -# 13.11.2 Self Check -Exercise 3 -us_trends = api.get_place_trends(id='23424977') - -us_list = us_trends[0]['trends'] - -us_list = [t for t in us_list if t['tweet_volume']] - -us_list.sort(key=itemgetter('tweet_volume'), reverse=True) - -for trend in us_list[:3]: - print(trend['name']) - -# 13.11.3 Create a Word Cloud from Trending Topics -topics = {} - -for trend in nyc_list: - topics[trend['name']] = trend['tweet_volume'] - -from wordcloud import WordCloud - -wordcloud = WordCloud(width=1600, height=900, - prefer_horizontal=0.5, min_font_size=10, colormap='prism', - background_color='white') - -wordcloud = wordcloud.fit_words(topics) - -wordcloud = wordcloud.to_file('TrendingTwitter.png') - - -# 13.11.3 Self Check -# Exercise 1 -topics = {} - -for trend in us_list: - topics[trend['name']] = trend['tweet_volume'] - -wordcloud = wordcloud.fit_words(topics) - -wordcloud = wordcloud.to_file('USTrendingTwitter.png') - - - - - - -NOTE: The following code displays the image in a Jupyter Notebook - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/snippets_py/13_12.py b/examples/ch13_TwitterV2/snippets_py/13_12.py deleted file mode 100755 index 1178cdc..0000000 --- a/examples/ch13_TwitterV2/snippets_py/13_12.py +++ /dev/null @@ -1,28 +0,0 @@ -# Section 13.12 snippets - -import preprocessor as p - -p.set_options(p.OPT.URL, p.OPT.RESERVED) - -tweet_text = 'RT A sample retweet with a URL https://nasa.gov' - -p.clean(tweet_text) - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/snippets_py/13_13_02.py b/examples/ch13_TwitterV2/snippets_py/13_13_02.py deleted file mode 100755 index 4845a69..0000000 --- a/examples/ch13_TwitterV2/snippets_py/13_13_02.py +++ /dev/null @@ -1,52 +0,0 @@ -# 13.13.2 Initiating Stream Processing - -# Authenticating -import tweepy - -import keys - -# Creating a TweetListener -from tweetlistener import TweetListener - -tweet_listener = TweetListener( - bearer_token=keys.bearer_token, limit=3) - -# Redirecting Standard Error Stream to Standard Output Stream -import sys - -sys.stderr = sys.stdout - -# Deleting Existing Stream Rules -rules = tweet_listener.get_rules().data - -rule_ids = [rule.id for rule in rules] - -tweet_listener.delete_rules(rule_ids) - -# Creating and Adding a Stream Rule -filter_rule = tweepy.StreamRule('football') - -tweet_listener.add_rules(filter_rule) - -# Starting the Tweet Stream -tweet_listener.filter( - expansions=['author_id'], tweet_fields=['lang']) - -# Stream connection closed by Twitter - -# Asynchronous vs. Synchronous Streams - -########################################################################## -# (C) Copyright 2022 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/snippets_py/13_15_01.py b/examples/ch13_TwitterV2/snippets_py/13_15_01.py deleted file mode 100755 index b192797..0000000 --- a/examples/ch13_TwitterV2/snippets_py/13_15_01.py +++ /dev/null @@ -1,103 +0,0 @@ -# 13.15.1 Getting and Mapping the Tweets¶ - -# Collections Required By LocationListener -tweets = [] - -counts = {'total_tweets': 0, 'locations': 0} - -# Creating the LocationListener -import keys - -import tweepy - -from locationlistener import LocationListener - -location_listener = LocationListener( - keys.bearer_token, counts_dict=counts, tweets_list=tweets, - topic='football', limit=50) - -# Redirect sys.stderr to sys.stdout -import sys - -sys.stderr = sys.stdout - -# Delete Existing StreamRules -rules = location_listener.get_rules().data - -rule_ids = [rule.id for rule in rules] - -location_listener.delete_rules(rule_ids) - -# Create a StreamRule -location_listener.add_rules( - tweepy.StreamRule('football lang:en')) - -# Configure and Start the Stream of Tweets -location_listener.filter(expansions=['author_id'], - user_fields=['location'], tweet_fields=['lang']) - -# Displaying the Location Statistics -counts['total_tweets'] - -counts['locations'] - -print(f'{counts["locations"] / counts["total_tweets"]:.1%}') - -# Geocoding the Locations -from tweetutilities import get_geocodes - -bad_locations = get_geocodes(tweets) - -# Displaying the Bad Location Statistics -bad_locations - -print(f'{bad_locations / counts["locations"]:.1%}') - -# Cleaning the Data -import pandas as pd - -df = pd.DataFrame(tweets) - -df = df.dropna() - -# Creating a Map with Folium -import folium - -usmap = folium.Map(location=[39.8283, -98.5795], - tiles='Stamen Terrain', zoom_start=5, detect_retina=True) - -# Creating Popup Markers for the Tweet Locations -for t in df.itertuples(): - text = ': '.join([t.username, t.text]) - popup = folium.Popup(text, parse_html=True) - marker = folium.Marker((t.latitude, t.longitude), - popup=popup) - marker.add_to(usmap) - -# Saving the Map -usmap.save('tweet_map.html') - - - - - - - - - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/snippets_py/13_15_02selfcheck.py b/examples/ch13_TwitterV2/snippets_py/13_15_02selfcheck.py deleted file mode 100755 index a6adaaf..0000000 --- a/examples/ch13_TwitterV2/snippets_py/13_15_02selfcheck.py +++ /dev/null @@ -1,26 +0,0 @@ -# Section 15.2 Self Check snippets - -# Exercise 1 -import keys - -from geopy import OpenMapQuest - -geo = OpenMapQuest(api_key=keys.mapquest_key) - -geo.geocode('Chicago, IL') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/snippets_py/README.txt b/examples/ch13_TwitterV2/snippets_py/README.txt deleted file mode 100755 index 3fe48c8..0000000 --- a/examples/ch13_TwitterV2/snippets_py/README.txt +++ /dev/null @@ -1,3 +0,0 @@ -Sections 13.7-11 use one continuous IPython session for the -examples and Self Check exercises, so all of these are in one -snippet file. diff --git a/examples/ch13_TwitterV2/snippets_py/keys.py b/examples/ch13_TwitterV2/snippets_py/keys.py deleted file mode 100755 index bf7c356..0000000 --- a/examples/ch13_TwitterV2/snippets_py/keys.py +++ /dev/null @@ -1,2 +0,0 @@ -bearer_token = 'YourBearerToken' -mapquest_key = 'YourAPIKey' \ No newline at end of file diff --git a/examples/ch13_TwitterV2/snippets_py/locationlistener.py b/examples/ch13_TwitterV2/snippets_py/locationlistener.py deleted file mode 100755 index f154d61..0000000 --- a/examples/ch13_TwitterV2/snippets_py/locationlistener.py +++ /dev/null @@ -1,59 +0,0 @@ -# locationlistener.py -"""Receives tweets matching a search string and stores a list of -dictionaries containing each tweet's username/text/location.""" -import tweepy -from tweetutilities import get_tweet_content - -class LocationListener(tweepy.StreamingClient): - """Handles incoming Tweet stream to get location data.""" - - def __init__(self, bearer_token, counts_dict, - tweets_list, topic, limit=10): - """Configure the LocationListener.""" - self.tweets_list = tweets_list - self.counts_dict = counts_dict - self.topic = topic - self.TWEET_LIMIT = limit - super().__init__(bearer_token, wait_on_rate_limit=True) - - def on_response(self, response): - """Called when Twitter pushes a new tweet to you.""" - - # get tweet's username, text and location - tweet_data = get_tweet_content(response) - - # ignore retweets and tweets that do not contain the topic - if (tweet_data['text'].startswith('RT') or - self.topic.lower() not in tweet_data['text'].lower()): - return - - self.counts_dict['total_tweets'] += 1 # it's an original tweet - - # ignore tweets with no location - if not tweet_data.get('location'): - return - - self.counts_dict['locations'] += 1 # user account has location - self.tweets_list.append(tweet_data) # store the tweet - print(f"{tweet_data['username']}: {tweet_data['text']}\n") - - # if TWEET_LIMIT is reached, terminate streaming - if self.counts_dict['locations'] == self.TWEET_LIMIT: - self.disconnect() - - - -########################################################################## -# (C) Copyright 2022 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/snippets_py/sentimentlistener.py b/examples/ch13_TwitterV2/snippets_py/sentimentlistener.py deleted file mode 100755 index 2cc45ec..0000000 --- a/examples/ch13_TwitterV2/snippets_py/sentimentlistener.py +++ /dev/null @@ -1,106 +0,0 @@ -# sentimentlisener.py -"""Searches for tweets that match a search string and tallies -the number of positive, neutral and negative tweets.""" -import keys -import preprocessor as p -import sys -from textblob import TextBlob -import tweepy - -class SentimentListener(tweepy.StreamingClient): - """Handles incoming Tweet stream.""" - - def __init__(self, bearer_token, sentiment_dict, topic, limit=10): - """Configure the SentimentListener.""" - self.sentiment_dict = sentiment_dict - self.tweet_count = 0 - self.topic = topic - self.TWEET_LIMIT = limit - - # set tweet-preprocessor to remove URLs/reserved words - p.set_options(p.OPT.URL, p.OPT.RESERVED) - super().__init__(bearer_token, wait_on_rate_limit=True) - - def on_response(self, response): - """Called when Twitter pushes a new tweet to you.""" - - # if the tweet is not a retweet - if not response.data.text.startswith('RT'): - text = p.clean(response.data.text) # clean the tweet - - # ignore tweet if the topic is not in the tweet text - if self.topic.lower() not in text.lower(): - return - - # update self.sentiment_dict with the polarity - blob = TextBlob(text) - if blob.sentiment.polarity > 0: - sentiment = '+' - self.sentiment_dict['positive'] += 1 - elif blob.sentiment.polarity == 0: - sentiment = ' ' - self.sentiment_dict['neutral'] += 1 - else: - sentiment = '-' - self.sentiment_dict['negative'] += 1 - - # display the tweet - username = response.includes['users'][0].username - print(f'{sentiment} {username}: {text}\n') - - self.tweet_count += 1 # track number of tweets processed - - # if TWEET_LIMIT is reached, terminate streaming - if self.tweet_count == self.TWEET_LIMIT: - self.disconnect() - -def main(): - # get search term and number of tweets - search_key = sys.argv[1] - limit = int(sys.argv[2]) # number of tweets to tally - - # set up the sentiment dictionary - sentiment_dict = {'positive': 0, 'neutral': 0, 'negative': 0} - - # create the StreamingClient subclass object - sentiment_listener = SentimentListener(keys.bearer_token, - sentiment_dict, search_key, limit) - - # redirect sys.stderr to sys.stdout - sys.stderr = sys.stdout - - # delete existing stream rules - rules = sentiment_listener.get_rules().data - rule_ids = [rule.id for rule in rules] - sentiment_listener.delete_rules(rule_ids) - - # create stream rule - sentiment_listener.add_rules( - tweepy.StreamRule(f'{search_key} lang:en')) - - # start filtering English tweets containing search_key - sentiment_listener.filter(expansions=['author_id']) - - print(f'Tweet sentiment for "{search_key}"') - print('Positive:', sentiment_dict['positive']) - print(' Neutral:', sentiment_dict['neutral']) - print('Negative:', sentiment_dict['negative']) - -# call main if this file is executed as a script -if __name__ == '__main__': - main() - -########################################################################## -# (C) Copyright 2022 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/snippets_py/tweetlistener.py b/examples/ch13_TwitterV2/snippets_py/tweetlistener.py deleted file mode 100755 index b01654d..0000000 --- a/examples/ch13_TwitterV2/snippets_py/tweetlistener.py +++ /dev/null @@ -1,61 +0,0 @@ -# tweetlistener.py -"""StreamListener subclass that processes tweets as they arrive.""" -from deep_translator import GoogleTranslator -import tweepy - -class TweetListener(tweepy.StreamingClient): - """Handles incoming Tweet stream.""" - - def __init__(self, bearer_token, limit=10): - """Create instance variables for tracking number of tweets.""" - self.tweet_count = 0 - self.TWEET_LIMIT = limit - - # GoogleTranslator object for translating tweets to English - self.translator = GoogleTranslator(source='auto', target='en') - - super().__init__(bearer_token, wait_on_rate_limit=True) - - def on_connect(self): - """Called when your connection attempt is successful, enabling - you to perform appropriate application tasks at that point.""" - print('Connection successful\n') - - def on_response(self, response): - """Called when Twitter pushes a new tweet to you.""" - - try: - # get username of user who sent the tweet - username = response.includes['users'][0].username - print(f'Screen name: {username}') - print(f' Language: {response.data.lang}') - print(f' Tweet text: {response.data.text}') - - if response.data.lang != 'en' and response.data.lang != 'und': - english = self.translator.translate(response.data.text) - print(f' Translated: {english}') - - print() - self.tweet_count += 1 - except Exception as e: - print(f'Exception occured: {e}') - self.disconnect() - - # if TWEET_LIMIT is reached, terminate streaming - if self.tweet_count == self.TWEET_LIMIT: - self.disconnect() - -########################################################################## -# (C) Copyright 2022 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/snippets_py/tweetutilities.py b/examples/ch13_TwitterV2/snippets_py/tweetutilities.py deleted file mode 100755 index f5a12ab..0000000 --- a/examples/ch13_TwitterV2/snippets_py/tweetutilities.py +++ /dev/null @@ -1,76 +0,0 @@ -# tweetutilities.py -"""Utility functions for interacting with Tweepy objects.""" -from deep_translator import GoogleTranslator -from geopy import OpenMapQuest -import keys -import time -import tweepy - -def print_tweets(tweets): - # translator to autodetect source language and return English - translator = GoogleTranslator(source='auto', target='en') - - """For each tweet in tweets, display the username of the sender - and tweet text. If the language is not English, translate the text - with Deep Translator.""" - for tweet, user in zip(tweets.data, tweets.includes['users']): - print(f'{user.username}:', end=' ') - - if 'en' in tweet.lang: - print(f'{tweet.text}\n') - elif 'und' not in tweet.lang: # translate to English first - print(f'\n ORIGINAL: {tweet.text}') - print(f'TRANSLATED: {translator.translate(tweet.text)}\n') - -def get_tweet_content(response): - """Return dictionary with data from tweet.""" - fields = {} - fields['username'] = response.includes['users'][0].username - fields['text'] = response.data.text - fields['location'] = response.includes['users'][0].location - - return fields - -def get_geocodes(tweet_list): - """Get the latitude and longitude for each tweet's location. - Returns the number of tweets with invalid location data.""" - print('Getting coordinates for tweet locations...') - geo = OpenMapQuest(api_key=keys.mapquest_key) # geocoder - bad_locations = 0 - - for tweet in tweet_list: - processed = False - delay = .1 # used if OpenMapQuest times out to delay next call - while not processed: - try: # get coordinates for tweet['location'] - geo_location = geo.geocode(tweet['location']) - processed = True - except: # timed out, so wait before trying again - print('OpenMapQuest service timed out. Waiting.') - time.sleep(delay) - delay += .1 - - if geo_location: - tweet['latitude'] = geo_location.latitude - tweet['longitude'] = geo_location.longitude - else: - bad_locations += 1 # tweet['location'] was invalid - - print('Done geocoding') - return bad_locations - - -########################################################################## -# (C) Copyright 2022 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/tweetlistener.py b/examples/ch13_TwitterV2/tweetlistener.py deleted file mode 100755 index b01654d..0000000 --- a/examples/ch13_TwitterV2/tweetlistener.py +++ /dev/null @@ -1,61 +0,0 @@ -# tweetlistener.py -"""StreamListener subclass that processes tweets as they arrive.""" -from deep_translator import GoogleTranslator -import tweepy - -class TweetListener(tweepy.StreamingClient): - """Handles incoming Tweet stream.""" - - def __init__(self, bearer_token, limit=10): - """Create instance variables for tracking number of tweets.""" - self.tweet_count = 0 - self.TWEET_LIMIT = limit - - # GoogleTranslator object for translating tweets to English - self.translator = GoogleTranslator(source='auto', target='en') - - super().__init__(bearer_token, wait_on_rate_limit=True) - - def on_connect(self): - """Called when your connection attempt is successful, enabling - you to perform appropriate application tasks at that point.""" - print('Connection successful\n') - - def on_response(self, response): - """Called when Twitter pushes a new tweet to you.""" - - try: - # get username of user who sent the tweet - username = response.includes['users'][0].username - print(f'Screen name: {username}') - print(f' Language: {response.data.lang}') - print(f' Tweet text: {response.data.text}') - - if response.data.lang != 'en' and response.data.lang != 'und': - english = self.translator.translate(response.data.text) - print(f' Translated: {english}') - - print() - self.tweet_count += 1 - except Exception as e: - print(f'Exception occured: {e}') - self.disconnect() - - # if TWEET_LIMIT is reached, terminate streaming - if self.tweet_count == self.TWEET_LIMIT: - self.disconnect() - -########################################################################## -# (C) Copyright 2022 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch13_TwitterV2/tweetutilities.py b/examples/ch13_TwitterV2/tweetutilities.py deleted file mode 100755 index f5a12ab..0000000 --- a/examples/ch13_TwitterV2/tweetutilities.py +++ /dev/null @@ -1,76 +0,0 @@ -# tweetutilities.py -"""Utility functions for interacting with Tweepy objects.""" -from deep_translator import GoogleTranslator -from geopy import OpenMapQuest -import keys -import time -import tweepy - -def print_tweets(tweets): - # translator to autodetect source language and return English - translator = GoogleTranslator(source='auto', target='en') - - """For each tweet in tweets, display the username of the sender - and tweet text. If the language is not English, translate the text - with Deep Translator.""" - for tweet, user in zip(tweets.data, tweets.includes['users']): - print(f'{user.username}:', end=' ') - - if 'en' in tweet.lang: - print(f'{tweet.text}\n') - elif 'und' not in tweet.lang: # translate to English first - print(f'\n ORIGINAL: {tweet.text}') - print(f'TRANSLATED: {translator.translate(tweet.text)}\n') - -def get_tweet_content(response): - """Return dictionary with data from tweet.""" - fields = {} - fields['username'] = response.includes['users'][0].username - fields['text'] = response.data.text - fields['location'] = response.includes['users'][0].location - - return fields - -def get_geocodes(tweet_list): - """Get the latitude and longitude for each tweet's location. - Returns the number of tweets with invalid location data.""" - print('Getting coordinates for tweet locations...') - geo = OpenMapQuest(api_key=keys.mapquest_key) # geocoder - bad_locations = 0 - - for tweet in tweet_list: - processed = False - delay = .1 # used if OpenMapQuest times out to delay next call - while not processed: - try: # get coordinates for tweet['location'] - geo_location = geo.geocode(tweet['location']) - processed = True - except: # timed out, so wait before trying again - print('OpenMapQuest service timed out. Waiting.') - time.sleep(delay) - delay += .1 - - if geo_location: - tweet['latitude'] = geo_location.latitude - tweet['longitude'] = geo_location.longitude - else: - bad_locations += 1 # tweet['location'] was invalid - - print('Done geocoding') - return bad_locations - - -########################################################################## -# (C) Copyright 2022 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch14/SimpleLanguageTranslator.ipynb b/examples/ch14/SimpleLanguageTranslator.ipynb deleted file mode 100644 index 2746b8e..0000000 --- a/examples/ch14/SimpleLanguageTranslator.ipynb +++ /dev/null @@ -1,228 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For your convenience we've embedded the `SpokenResponse.wav` audio file at the bottom of this notebook so you can play a pre-recorded Spanish response to the English question \"Where is the closest bathroom?\" When the app asks for the Spanish response, press _Enter_ then click the audio's play button immediately." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# SimpleLanguageTranslator.py\n", - "\"\"\"Use IBM Watson Speech to Text, Language Translator and Text to Speech \n", - " APIs to enable English and Spanish speakers to communicate.\"\"\"\n", - "from watson_developer_cloud import SpeechToTextV1\n", - "from watson_developer_cloud import LanguageTranslatorV3\n", - "from watson_developer_cloud import TextToSpeechV1\n", - "import keys # contains your API keys for accessing Watson services\n", - "import pyaudio # used to record from mic\n", - "import pydub # used to load a WAV file\n", - "import pydub.playback # used to play a WAV file\n", - "import wave # used to save a WAV file\n", - "\n", - "def run_translator():\n", - " \"\"\"Calls the functions that interact with Watson services.\"\"\"\n", - " # Step 1: Prompt for then record English speech into an audio file\n", - " input('Press Enter then ask your question in English')\n", - " record_audio('english.wav')\n", - "\n", - " # Step 2: Transcribe the English speech to English text\n", - " english = speech_to_text(\n", - " file_name='english.wav', model_id='en-US_BroadbandModel')\n", - " print('English:', english)\n", - "\n", - " # Step 3: Translate the English text into Spanish text\n", - " spanish = translate(text_to_translate=english, model='en-es')\n", - " print('Spanish:', spanish)\n", - "\n", - " # Step 4: Synthesize the Spanish text into Spanish speech\n", - " text_to_speech(text_to_speak=spanish, \n", - " voice_to_use='es-US_SofiaVoice', file_name='spanish.wav')\n", - "\n", - " # Step 5: Play the Spanish audio file\n", - " play_audio(file_name='spanish.wav')\n", - "\n", - " # Step 6: Prompt for then record Spanish speech into an audio file\n", - " input('Press Enter then speak the Spanish answer')\n", - " record_audio('spanishresponse.wav')\n", - "\n", - " # Step 7: Transcribe the Spanish speech to Spanish text\n", - " spanish = speech_to_text(\n", - " file_name='spanishresponse.wav', model_id='es-ES_BroadbandModel')\n", - " print('Spanish response:', spanish)\n", - "\n", - " # Step 8: Translate the Spanish text into English text\n", - " english = translate(text_to_translate=spanish, model='es-en')\n", - " print('English response:', english)\n", - "\n", - " # Step 9: Synthesize the English text into English speech\n", - " text_to_speech(text_to_speak=english,\n", - " voice_to_use='en-US_AllisonVoice',\n", - " file_name='englishresponse.wav')\n", - "\n", - " # Step 10: Play the English audio\n", - " play_audio(file_name='englishresponse.wav')\n", - "\n", - "def speech_to_text(file_name, model_id):\n", - " \"\"\"Use Watson Speech to Text to convert audio file to text.\"\"\"\n", - " # create Watson Speech to Text client \n", - " stt = SpeechToTextV1(iam_apikey=keys.speech_to_text_key)\n", - "\n", - " # open the audio file \n", - " with open(file_name, 'rb') as audio_file:\n", - " # pass the file to Watson for transcription\n", - " result = stt.recognize(audio=audio_file,\n", - " content_type='audio/wav', model=model_id).get_result()\n", - " \n", - " # Get the 'results' list. This may contain intermediate and final\n", - " # results, depending on method recognize's arguments. We asked \n", - " # for only final results, so this list contains one element.\n", - " results_list = result['results'] \n", - "\n", - " # Get the final speech recognition result--the list's only element.\n", - " speech_recognition_result = results_list[0]\n", - "\n", - " # Get the 'alternatives' list. This may contain multiple alternative\n", - " # transcriptions, depending on method recognize's arguments. We did\n", - " # not ask for alternatives, so this list contains one element.\n", - " alternatives_list = speech_recognition_result['alternatives']\n", - "\n", - " # Get the only alternative transcription from alternatives_list.\n", - " first_alternative = alternatives_list[0]\n", - "\n", - " # Get the 'transcript' key's value, which contains the audio's \n", - " # text transcription.\n", - " transcript = first_alternative['transcript']\n", - "\n", - " return transcript # return the audio's text transcription\n", - "\n", - "def translate(text_to_translate, model):\n", - " \"\"\"Use Watson Language Translator to translate English to Spanish \n", - " (en-es) or Spanish to English (es-en) as specified by model.\"\"\"\n", - " # create Watson Translator client\n", - " language_translator = LanguageTranslatorV3(version='2018-05-31',\n", - " iam_apikey=keys.translate_key)\n", - "\n", - " # perform the translation\n", - " translated_text = language_translator.translate(\n", - " text=text_to_translate, model_id=model).get_result()\n", - "\n", - " # Get 'translations' list. If method translate's text argument has \n", - " # multiple strings, the list will have multiple entries. We passed\n", - " # one string, so the list contains only one element.\n", - " translations_list = translated_text['translations']\n", - " \n", - " # get translations_list's only element\n", - " first_translation = translations_list[0]\n", - "\n", - " # get 'translation' key's value, witch is the translated text\n", - " translation = first_translation['translation']\n", - "\n", - " return translation # return the translated string\n", - "\n", - "def text_to_speech(text_to_speak, voice_to_use, file_name):\n", - " \"\"\"Use Watson Text to Speech to convert text to specified voice\n", - " and save to a WAV file.\"\"\"\n", - " # create Text to Speech client\n", - " tts = TextToSpeechV1(iam_apikey=keys.text_to_speech_key)\n", - "\n", - " # open file and write the synthesized audio content into the file\n", - " with open(file_name, 'wb') as audio_file:\n", - " audio_file.write(tts.synthesize(text_to_speak, \n", - " accept='audio/wav', voice=voice_to_use).get_result().content)\n", - "\n", - "def record_audio(file_name):\n", - " \"\"\"Use pyaudio to record 5 seconds of audio to a WAV file.\"\"\"\n", - " FRAME_RATE = 44100 # number of frames per second\n", - " CHUNK = 1024 # number of frames read at a time\n", - " FORMAT = pyaudio.paInt16 # each frame is a 16-bit (2-byte) integer\n", - " CHANNELS = 2 # 2 samples per frame\n", - " SECONDS = 5 # total recording time\n", - " \n", - " recorder = pyaudio.PyAudio() # opens/closes audio streams\n", - "\n", - " # configure and open audio stream for recording (input=True)\n", - " audio_stream = recorder.open(format=FORMAT, channels=CHANNELS, \n", - " rate=FRAME_RATE, input=True, frames_per_buffer=CHUNK)\n", - " audio_frames = [] # stores raw bytes of mic input\n", - " print('Recording 5 seconds of audio')\n", - "\n", - " # read 5 seconds of audio in CHUNK-sized pieces\n", - " for i in range(0, int(FRAME_RATE * SECONDS / CHUNK)):\n", - " audio_frames.append(audio_stream.read(CHUNK))\n", - "\n", - " print('Recording complete')\n", - " audio_stream.stop_stream() # stop recording\n", - " audio_stream.close() \n", - " recorder.terminate() # release underlying resources used by PyAudio\n", - "\n", - " # save audio_frames to a WAV file\n", - " with wave.open(file_name, 'wb') as output_file:\n", - " output_file.setnchannels(CHANNELS)\n", - " output_file.setsampwidth(recorder.get_sample_size(FORMAT))\n", - " output_file.setframerate(FRAME_RATE)\n", - " output_file.writeframes(b''.join(audio_frames))\n", - "\n", - "def play_audio(file_name):\n", - " \"\"\"Use the pydub module (pip install pydub) to play a WAV file.\"\"\"\n", - " sound = pydub.AudioSegment.from_wav(file_name)\n", - " pydub.playback.play(sound)\n", - "\n", - "#if __name__ == '__main__': # this is not needed in a notebook\n", - "run_translator()\n", - "\n", - "\n", - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from IPython.display import Audio\n", - "Audio('SpokenResponse.wav')" - ] - } - ], - "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.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch14/SimpleLanguageTranslator.py b/examples/ch14/SimpleLanguageTranslator.py deleted file mode 100755 index 097f2ad..0000000 --- a/examples/ch14/SimpleLanguageTranslator.py +++ /dev/null @@ -1,178 +0,0 @@ -# SimpleLanguageTranslator.py -"""Use IBM Watson Speech to Text, Language Translator and Text to Speech - APIs to enable English and Spanish speakers to communicate.""" -from watson_developer_cloud import SpeechToTextV1 -from watson_developer_cloud import LanguageTranslatorV3 -from watson_developer_cloud import TextToSpeechV1 -import keys # contains your API keys for accessing Watson services -import pyaudio # used to record from mic -import pydub # used to load a WAV file -import pydub.playback # used to play a WAV file -import wave # used to save a WAV file - -def run_translator(): - """Calls the functions that interact with Watson services.""" - # Step 1: Prompt for then record English speech into an audio file - input('Press Enter then ask your question in English') - record_audio('english.wav') - - # Step 2: Transcribe the English speech to English text - english = speech_to_text( - file_name='english.wav', model_id='en-US_BroadbandModel') - print('English:', english) - - # Step 3: Translate the English text into Spanish text - spanish = translate(text_to_translate=english, model='en-es') - print('Spanish:', spanish) - - # Step 4: Synthesize the Spanish text into Spanish speech - text_to_speech(text_to_speak=spanish, voice_to_use='es-US_SofiaVoice', - file_name='spanish.wav') - - # Step 5: Play the Spanish audio file - play_audio(file_name='spanish.wav') - - # Step 6: Prompt for then record Spanish speech into an audio file - input('Press Enter then speak the Spanish answer') - record_audio('spanishresponse.wav') - - # Step 7: Transcribe the Spanish speech to Spanish text - spanish = speech_to_text( - file_name='spanishresponse.wav', model_id='es-ES_BroadbandModel') - print('Spanish response:', spanish) - - # Step 8: Translate the Spanish text into English text - english = translate(text_to_translate=spanish, model='es-en') - print('English response:', english) - - # Step 9: Synthesize the English text into English speech - text_to_speech(text_to_speak=english, - voice_to_use='en-US_AllisonVoice', - file_name='englishresponse.wav') - - # Step 10: Play the English audio - play_audio(file_name='englishresponse.wav') - -def speech_to_text(file_name, model_id): - """Use Watson Speech to Text to convert audio file to text.""" - # create Watson Speech to Text client - stt = SpeechToTextV1(iam_apikey=keys.speech_to_text_key) - - # open the audio file - with open(file_name, 'rb') as audio_file: - # pass the file to Watson for transcription - result = stt.recognize(audio=audio_file, - content_type='audio/wav', model=model_id).get_result() - - # Get the 'results' list. This may contain intermediate and final - # results, depending on method recognize's arguments. We asked - # for only final results, so this list contains one element. - results_list = result['results'] - - # Get the final speech recognition result--the list's only element. - speech_recognition_result = results_list[0] - - # Get the 'alternatives' list. This may contain multiple alternative - # transcriptions, depending on method recognize's arguments. We did - # not ask for alternatives, so this list contains one element. - alternatives_list = speech_recognition_result['alternatives'] - - # Get the only alternative transcription from alternatives_list. - first_alternative = alternatives_list[0] - - # Get the 'transcript' key's value, which contains the audio's - # text transcription. - transcript = first_alternative['transcript'] - - return transcript # return the audio's text transcription - -def translate(text_to_translate, model): - """Use Watson Language Translator to translate English to Spanish - (en-es) or Spanish to English (es-en) as specified by model.""" - # create Watson Translator client - language_translator = LanguageTranslatorV3(version='2018-05-31', - iam_apikey=keys.translate_key) - - # perform the translation - translated_text = language_translator.translate( - text=text_to_translate, model_id=model).get_result() - - # Get 'translations' list. If method translate's text argument has - # multiple strings, the list will have multiple entries. We passed - # one string, so the list contains only one element. - translations_list = translated_text['translations'] - - # get translations_list's only element - first_translation = translations_list[0] - - # get 'translation' key's value, which is the translated text - translation = first_translation['translation'] - - return translation # return the translated string - -def text_to_speech(text_to_speak, voice_to_use, file_name): - """Use Watson Text to Speech to convert text to specified voice - and save to a WAV file.""" - # create Text to Speech client - tts = TextToSpeechV1(iam_apikey=keys.text_to_speech_key) - - # open file and write the synthesized audio content into the file - with open(file_name, 'wb') as audio_file: - audio_file.write(tts.synthesize(text_to_speak, - accept='audio/wav', voice=voice_to_use).get_result().content) - -def record_audio(file_name): - """Use pyaudio to record 5 seconds of audio to a WAV file.""" - FRAME_RATE = 44100 # number of frames per second - CHUNK = 1024 # number of frames read at a time - FORMAT = pyaudio.paInt16 # each frame is a 16-bit (2-byte) integer - CHANNELS = 2 # 2 samples per frame - SECONDS = 5 # total recording time - - recorder = pyaudio.PyAudio() # opens/closes audio streams - - # configure and open audio stream for recording (input=True) - audio_stream = recorder.open(format=FORMAT, channels=CHANNELS, - rate=FRAME_RATE, input=True, frames_per_buffer=CHUNK) - audio_frames = [] # stores raw bytes of mic input - print('Recording 5 seconds of audio') - - # read 5 seconds of audio in CHUNK-sized pieces - for i in range(0, int(FRAME_RATE * SECONDS / CHUNK)): - audio_frames.append(audio_stream.read(CHUNK)) - - print('Recording complete') - audio_stream.stop_stream() # stop recording - audio_stream.close() - recorder.terminate() # release underlying resources used by PyAudio - - # save audio_frames to a WAV file - with wave.open(file_name, 'wb') as output_file: - output_file.setnchannels(CHANNELS) - output_file.setsampwidth(recorder.get_sample_size(FORMAT)) - output_file.setframerate(FRAME_RATE) - output_file.writeframes(b''.join(audio_frames)) - -def play_audio(file_name): - """Use the pydub module (pip install pydub) to play a WAV file.""" - sound = pydub.AudioSegment.from_wav(file_name) - pydub.playback.play(sound) - -if __name__ == '__main__': - run_translator() - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch14/SpokenResponse.wav b/examples/ch14/SpokenResponse.wav deleted file mode 100644 index 1cf313a..0000000 Binary files a/examples/ch14/SpokenResponse.wav and /dev/null differ diff --git a/examples/ch14/english.wav b/examples/ch14/english.wav deleted file mode 100644 index f3efd84..0000000 Binary files a/examples/ch14/english.wav and /dev/null differ diff --git a/examples/ch14/englishresponse.wav b/examples/ch14/englishresponse.wav deleted file mode 100644 index 96f2b9b..0000000 Binary files a/examples/ch14/englishresponse.wav and /dev/null differ diff --git a/examples/ch14/keys.py b/examples/ch14/keys.py deleted file mode 100755 index 262c50f..0000000 --- a/examples/ch14/keys.py +++ /dev/null @@ -1,3 +0,0 @@ -speech_to_text_key = '' -text_to_speech_key = '' -translate_key = '' \ No newline at end of file diff --git a/examples/ch14/spanish.wav b/examples/ch14/spanish.wav deleted file mode 100644 index 91c6bb0..0000000 Binary files a/examples/ch14/spanish.wav and /dev/null differ diff --git a/examples/ch14/spanishresponse.wav b/examples/ch14/spanishresponse.wav deleted file mode 100644 index e4efdfc..0000000 Binary files a/examples/ch14/spanishresponse.wav and /dev/null differ diff --git a/examples/ch15/ave_hi_nyc_jan_1895-2018.csv b/examples/ch15/ave_hi_nyc_jan_1895-2018.csv deleted file mode 100755 index 485d137..0000000 --- a/examples/ch15/ave_hi_nyc_jan_1895-2018.csv +++ /dev/null @@ -1,125 +0,0 @@ -Date,Value,Anomaly -189501,34.2,-3.2 -189601,34.7,-2.7 -189701,35.5,-1.9 -189801,39.6,2.2 -189901,36.4,-1.0 -190001,37.4,0.0 -190101,37.0,-0.4 -190201,35.0,-2.4 -190301,35.5,-1.9 -190401,29.8,-7.6 -190501,33.7,-3.7 -190601,42.3,4.9 -190701,40.5,3.1 -190801,38.3,0.9 -190901,39.6,2.2 -191001,36.1,-1.3 -191101,40.7,3.3 -191201,29.3,-8.1 -191301,46.9,9.5 -191401,36.9,-0.5 -191501,38.9,1.5 -191601,42.3,4.9 -191701,38.4,1.0 -191801,26.5,-10.9 -191901,40.6,3.2 -192001,29.7,-7.7 -192101,39.7,2.3 -192201,33.4,-4.0 -192301,35.2,-2.2 -192401,39.4,2.0 -192501,33.8,-3.6 -192601,37.2,-0.2 -192701,36.8,-0.6 -192801,40.0,2.6 -192901,37.8,0.4 -193001,38.5,1.1 -193101,38.2,0.8 -193201,47.6,10.2 -193301,45.6,8.2 -193401,39.8,2.4 -193501,35.0,-2.4 -193601,34.3,-3.1 -193701,45.7,8.3 -193801,37.3,-0.1 -193901,36.8,-0.6 -194001,30.0,-7.4 -194101,34.5,-2.9 -194201,36.5,-0.9 -194301,36.1,-1.3 -194401,39.0,1.6 -194501,31.5,-5.9 -194601,40.2,2.8 -194701,43.0,5.6 -194801,30.1,-7.3 -194901,43.5,6.1 -195001,47.6,10.2 -195101,42.5,5.1 -195201,42.4,5.0 -195301,42.4,5.0 -195401,37.0,-0.4 -195501,35.6,-1.8 -195601,36.2,-1.2 -195701,33.8,-3.6 -195801,36.4,-1.0 -195901,37.1,-0.3 -196001,37.8,0.4 -196101,31.9,-5.5 -196201,38.0,0.6 -196301,34.6,-2.8 -196401,40.2,2.8 -196501,34.0,-3.4 -196601,37.1,-0.3 -196701,41.6,4.2 -196801,31.7,-5.7 -196901,35.7,-1.7 -197001,29.9,-7.5 -197101,31.5,-5.9 -197201,40.5,3.1 -197301,40.6,3.2 -197401,39.7,2.3 -197501,41.7,4.3 -197601,32.6,-4.8 -197701,26.1,-11.3 -197801,32.3,-5.1 -197901,38.6,1.2 -198001,38.0,0.6 -198101,30.6,-6.8 -198201,30.9,-6.5 -198301,38.0,0.6 -198401,33.5,-3.9 -198501,33.0,-4.4 -198601,39.3,1.9 -198701,35.9,-1.5 -198801,34.2,-3.2 -198901,42.4,5.0 -199001,46.0,8.6 -199101,39.6,2.2 -199201,40.9,3.5 -199301,41.0,3.6 -199401,31.6,-5.8 -199501,42.6,5.2 -199601,37.0,-0.4 -199701,39.2,1.8 -199801,45.8,8.4 -199901,40.8,3.4 -200001,37.8,0.4 -200101,38.8,1.4 -200201,45.4,8.0 -200301,32.9,-4.5 -200401,31.0,-6.4 -200501,37.4,0.0 -200601,47.6,10.2 -200701,43.6,6.2 -200801,42.4,5.0 -200901,33.4,-4.0 -201001,38.1,0.7 -201101,34.8,-2.6 -201201,44.2,6.8 -201301,40.8,3.4 -201401,35.5,-1.9 -201501,36.1,-1.3 -201601,40.8,3.4 -201701,42.8,5.4 -201801,38.7,1.3 \ No newline at end of file diff --git a/examples/ch15/ave_yearly_temp_nyc_1895-2017.csv b/examples/ch15/ave_yearly_temp_nyc_1895-2017.csv deleted file mode 100644 index 321a2ba..0000000 --- a/examples/ch15/ave_yearly_temp_nyc_1895-2017.csv +++ /dev/null @@ -1,124 +0,0 @@ -Date,Value,Anomaly -189512,52.1,-1.8 -189612,52.3,-1.6 -189712,52.3,-1.6 -189812,53.8,-0.1 -189912,52.7,-1.2 -190012,52.9,-1.0 -190112,51.2,-2.7 -190212,51.7,-2.2 -190312,51.7,-2.2 -190412,49.2,-4.7 -190512,51.5,-2.4 -190612,53.1,-0.8 -190712,51.0,-2.9 -190812,53.1,-0.8 -190912,51.8,-2.1 -191012,51.6,-2.3 -191112,52.8,-1.1 -191212,52.1,-1.8 -191312,54.3,0.4 -191412,51.4,-2.5 -191512,52.8,-1.1 -191612,51.6,-2.3 -191712,50.1,-3.8 -191812,52.6,-1.3 -191912,53.2,-0.7 -192012,52.0,-1.9 -192112,54.6,0.7 -192212,53.2,-0.7 -192312,52.4,-1.5 -192412,51.4,-2.5 -192512,53.0,-0.9 -192612,50.7,-3.2 -192712,52.9,-1.0 -192812,53.0,-0.9 -192912,53.3,-0.6 -193012,53.7,-0.2 -193112,55.0,1.1 -193212,54.3,0.4 -193312,53.6,-0.3 -193412,52.4,-1.5 -193512,52.5,-1.4 -193612,52.8,-1.1 -193712,53.9,0.0 -193812,54.6,0.7 -193912,54.1,0.2 -194012,51.3,-2.6 -194112,54.3,0.4 -194212,53.5,-0.4 -194312,53.2,-0.7 -194412,54.1,0.2 -194512,53.5,-0.4 -194612,54.8,0.9 -194712,53.2,-0.7 -194812,53.5,-0.4 -194912,56.3,2.4 -195012,53.0,-0.9 -195112,54.4,0.5 -195212,55.2,1.3 -195312,56.5,2.6 -195412,54.3,0.4 -195512,54.1,0.2 -195612,52.9,-1.0 -195712,54.9,1.0 -195812,52.0,-1.9 -195912,54.8,0.9 -196012,53.4,-0.5 -196112,54.5,0.6 -196212,52.8,-1.1 -196312,53.0,-0.9 -196412,54.0,0.1 -196512,53.6,-0.3 -196612,54.5,0.6 -196712,52.4,-1.5 -196812,53.5,-0.4 -196912,54.2,0.3 -197012,53.7,-0.2 -197112,54.6,0.7 -197212,53.3,-0.6 -197312,55.5,1.6 -197412,54.1,0.2 -197512,54.4,0.5 -197612,52.9,-1.0 -197712,53.5,-0.4 -197812,52.2,-1.7 -197912,54.3,0.4 -198012,53.8,-0.1 -198112,54.0,0.1 -198212,53.6,-0.3 -198312,54.8,0.9 -198412,54.2,0.3 -198512,54.6,0.7 -198612,54.5,0.6 -198712,54.7,0.8 -198812,54.3,0.4 -198912,53.5,-0.4 -199012,56.7,2.8 -199112,56.7,2.8 -199212,53.5,-0.4 -199312,55.0,1.1 -199412,54.8,0.9 -199512,55.0,1.1 -199612,54.1,0.2 -199712,54.7,0.8 -199812,57.5,3.6 -199912,56.9,3.0 -200012,54.2,0.3 -200112,56.6,2.7 -200212,56.8,2.9 -200312,53.8,-0.1 -200412,54.9,1.0 -200512,56.1,2.2 -200612,57.2,3.3 -200712,55.4,1.5 -200812,55.7,1.8 -200912,54.4,0.5 -201012,57.1,3.2 -201112,56.8,2.9 -201212,57.7,3.8 -201312,55.6,1.7 -201412,54.4,0.5 -201512,56.7,2.8 -201612,57.2,3.3 -201712,56.4,2.5 diff --git a/examples/ch15/snippets_ipynb/15_02-03.ipynb b/examples/ch15/snippets_ipynb/15_02-03.ipynb deleted file mode 100644 index c99efeb..0000000 --- a/examples/ch15/snippets_ipynb/15_02-03.ipynb +++ /dev/null @@ -1,946 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 15.2 Case Study: Classification with k-Nearest Neighbors and the Digits Dataset, Part 1\n", - "\n", - "**This file contains Sections 15.2 and 15.3 and all of their subsections and Self Check exercises**\n", - "\n", - "### Classification Problems\n", - "### Our Approach" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "## 15.2 Self Check\n", - "\n", - "**1. _(Fill-In)_** `________` classification divides samples into two distinct classes, and `________`-classification divides samples into many distinct classes.\n", - "\n", - "**Answer:** binary, multi. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.2.1 k-Nearest Neighbors Algorithm\n", - "### Hyperparameters and Hyperparameter Tuning" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "## 15.2.1 Self Check\n", - "**1. _(True/False)_** In machine learning, a model implements a machine-learning algorithm. In scikit-learn, models are called estimators.\n", - "\n", - "**Answer:** True.\n", - "\n", - "**2. _(Fill-In)_** The process of choosing the best value of *k* for the k-nearest neighbors algorithm is called `________`\n", - "\n", - "**Answer:** hyperparameter tuning." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.2.2 Loading the Dataset\n", - "\n", - "**We added `%matplotlib inline` to enable Matplotlib in this notebook.**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "from sklearn.datasets import load_digits" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "digits = load_digits()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Displaying the Description" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(digits.DESCR)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Checking the Sample and Target Sizes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "digits.target[::100]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "digits.data.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "digits.target.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### A Sample Digit Image" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "digits.images[13]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Preparing the Data for Use with Scikit-Learn" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "digits.data[13]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "## 15.2.2 Self Check\n", - "\n", - "**1. _(Fill-In)_** A `Bunch` object’s `________` and `________` attributes are NumPy arrays containing the dataset’s samples and labels, respectively.\n", - "\n", - "**Answer:** `data`, `target`.\n", - "\n", - "**2. _(True/False)_** A scikit-learn `Bunch` object contains only a dataset’s data.\n", - "\n", - "**Answer:** False. A scikit-learn `Bunch` object contains a dataset’s data and information about the dataset (called metadata), available through the `DESCR` attribute.\n", - "\n", - "**3. _(IPython Session)_** For sample number `22` in the Digits dataset, display the 8-by-8 image data and numeric value of the digit the image represents.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "digits.images[22]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "digits.target[22]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.2.3 Visualizing the Data\n", - "### Creating the Diagram " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "figure, axes = plt.subplots(nrows=4, ncols=6, figsize=(6, 4))\n", - "\n", - "### Displaying Each Image and Removing the Axes Labels \n", - "\n", - "for item in zip(axes.ravel(), digits.images, digits.target):\n", - " axes, image, target = item\n", - " axes.imshow(image, cmap=plt.cm.gray_r)\n", - " axes.set_xticks([]) # remove x-axis tick marks\n", - " axes.set_yticks([]) # remove y-axis tick marks\n", - " axes.set_title(target)\n", - "plt.tight_layout() " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# This placeholder cell was added because we had to combine \n", - "# the sections snippets 12-13 for the visualization to work in Jupyter\n", - "# and want the subsequent snippet numbers to match the book" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "## 15.2.3 Self Check\n", - "**1. _(Fill-In)_** The process of familiarizing yourself with your data is called `________`.\n", - "\n", - "**Answer:** data exploration.\n", - "\n", - "**2. _(IPython Session)_** Display the image for sample number `22` of the Digits dataset. \n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "axes = plt.subplot()\n", - "\n", - "image = plt.imshow(digits.images[22], cmap=plt.cm.gray_r)\n", - "\n", - "xticks = axes.set_xticks([])\n", - "\n", - "yticks = axes.set_yticks([])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# placeholder due to merge of prior cells" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# placeholder due to merge of prior cells" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# placeholder due to merge of prior cells" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.2.4 Splitting the Data for Training and Testing " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.model_selection import train_test_split" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_train, X_test, y_train, y_test = train_test_split(\n", - " digits.data, digits.target, random_state=11)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Training and Testing Set Sizes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_train.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_test.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "## 15.2.4 Self Check\n", - "**1. _(True/False)_** You should typically use all of a dataset’s data to train a model.\n", - "\n", - "**Answer:** False. It’s important to set aside a portion of your data for testing, so you can evaluate a model’s performance using data that the model has not yet seen. \n", - "\n", - "**2. _(Discussion)_** For the Digits dataset, what numbers of samples would the following statement reserve for training and testing purposes? \n", - "\n", - "```python\n", - "X_train, X_test, y_train, y_test = train_test_split(\n", - " digits.data, digits.target, test_size=0.40)\n", - "```\n", - "**Answer:** 1078 and 719." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.2.5 Creating the Model " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.neighbors import KNeighborsClassifier" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "knn = KNeighborsClassifier()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.2.6 Training the Model " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "knn.fit(X=X_train, y=y_train)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "## 15.2.6 Self Check\n", - "**1. _(Fill-In)_** The `KNeighborsClassifier` is said to be `________` because its work is performed only when you use it to make predictions.\n", - "\n", - "**Answer:** lazy.\n", - "\n", - "**2. _(True/False)_** Each scikit-learn estimator’s `fit` method simply loads a dataset.\n", - "\n", - "**Answer:** False. For most, scikit-learn estimators, the `fit` method loads the data into the estimator then uses that data to perform complex calculations behind the scenes that learn from the data and train the model. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.2.7 Predicting Digit Classes " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "predicted = knn.predict(X=X_test)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "expected = y_test" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "predicted[:20]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "expected[:20]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wrong = [(p, e) for (p, e) in zip(predicted, expected) if p != e]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wrong" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "## 15.2.7 Self Check\n", - "**1. _(IPython Session)_** Using the `predicted` and `expected` arrays, calculate and display the prediction accuracy percentage.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'{(len(expected) - len(wrong)) / len(expected):.2%}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**2. _(IPython Session)_** Rewrite the list comprehension in snippet `[29]` using a for loop. Which coding style do you prefer?\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wrong = []" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for p, e in zip(predicted, expected):\n", - " if p != e:\n", - " wrong.append((p, e))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wrong" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 15.3 Case Study: Classification with k-Nearest Neighbors and the Digits Dataset, Part 2\n", - "## 15.3.1 Metrics for Model Accuracy \n", - "### Estimator Method `score`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'{knn.score(X_test, y_test):.2%}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Confusion Matrix" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.metrics import confusion_matrix" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "confusion = confusion_matrix(y_true=expected, y_pred=predicted)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "confusion" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Classification Report" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.metrics import classification_report" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "names = [str(digit) for digit in digits.target_names]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(classification_report(expected, predicted, \n", - " target_names=names))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Visualizing the Confusion Matrix" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "confusion_df = pd.DataFrame(confusion, index=range(10),\n", - " columns=range(10))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import seaborn as sns" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "axes = sns.heatmap(confusion_df, annot=True, \n", - " cmap='nipy_spectral_r')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "## 15.3.1 Self Check\n", - "**1. _(Fill-In)_** A Seaborn `________` displays values as colors, often with values of higher magnitude displayed as more intense colors.\n", - "\n", - "**Answer:** heat map.\n", - "\n", - "**2. _(True/False)_** In a classification report, the precision specifies the total number of correct predictions for a class divided by the total number of samples for that class. \n", - "\n", - "**Answer:** True.\n", - "\n", - "**3. _(Discussion)_** Explain row 3 of the confusion matrix presented in this section:\n", - "\n", - "```\n", - "[ 0, 0, 0, 42, 0, 1, 0, 1, 0, 0]\n", - "```\n", - "**Answer:** The number `42` in column index 3 indicates that 42 `3`s were correctly predicted as 3s. The number `1` at column indices 5 and 7 indicates that one `3` was incorrectly classified as a `5` and one was incorrectly classified as a `7`. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.3.2 K-Fold Cross-Validation\n", - "### KFold Class" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.model_selection import KFold" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "kfold = KFold(n_splits=10, random_state=11, shuffle=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using the `KFold` Object with Function `cross_val_score` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.model_selection import cross_val_score" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "scores = cross_val_score(estimator=knn, X=digits.data, \n", - " y=digits.target, cv=kfold)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "scores" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'Mean accuracy: {scores.mean():.2%}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(f'Accuracy standard deviation: {scores.std():.2%}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "## 15.3.2 Self Check\n", - "**1. _(True/False)_** Randomizing the data by shuffling it before splitting it into folds is particularly important if the samples might be ordered or grouped. \n", - "\n", - "**Answer:** True.\n", - "\n", - "**2. _(True/False)_** When you call `cross_val_score` to peform k-fold cross-validation, the function returns the best score produced while testing the model with each fold.\n", - "\n", - "**Answer:** False. The function returns an array containing the scores for each fold. The mean of those scores is the estimator’s overall score. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.3.3 Running Multiple Models to Find the Best One " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.svm import SVC" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.naive_bayes import GaussianNB" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "estimators = {\n", - " 'KNeighborsClassifier': knn, \n", - " 'SVC': SVC(gamma='scale'),\n", - " 'GaussianNB': GaussianNB()}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for estimator_name, estimator_object in estimators.items():\n", - " kfold = KFold(n_splits=10, random_state=11, shuffle=True)\n", - " scores = cross_val_score(estimator=estimator_object, \n", - " X=digits.data, y=digits.target, cv=kfold)\n", - " print(f'{estimator_name:>20}: ' + \n", - " f'mean accuracy={scores.mean():.2%}; ' +\n", - " f'standard deviation={scores.std():.2%}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Scikit-Learn Estimator Diagram" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "## 15.3.3 Self Check\n", - "**1. _(True/False)_** You should choose the best estimator before performing your machine learning study.\n", - "\n", - "**Answer:** False. It’s difficult to know in advance which machine learning model(s) will perform best for a given dataset, especially when they hide the details of how they operate from their users. For this reason, you should run multiple models to determine which is the best for your study. \n", - "\n", - "**2. _(Discussion)_** How would you modify the code in this section to so that it would also test a `LinearSVC` estimator?\n", - "\n", - "**Answer:** You’d import the `LinearSVC` class, add a key–value pair to the `estimators` dictionary (`'LinearSVC': LinearSVC()`), then execute the `for` loop, which tests every estimator in the dictionary." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.3.4 Hyperparameter Tuning " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for k in range(1, 20, 2):\n", - " kfold = KFold(n_splits=10, random_state=11, shuffle=True)\n", - " knn = KNeighborsClassifier(n_neighbors=k)\n", - " scores = cross_val_score(estimator=knn, \n", - " X=digits.data, y=digits.target, cv=kfold)\n", - " print(f'k={k:<2}; mean accuracy={scores.mean():.2%}; ' +\n", - " f'standard deviation={scores.std():.2%}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "## 15.3.4 Self Check\n", - "**1. _(True/False)_** When you create an estimator object, the default hyperparameter values that scikit-learn uses are generally the best ones for every machine learning study. \n", - "\n", - "**Answer:** False. The default hyperparameter values make it easy for you to test estimators quickly. In real-world machine learning studies, you’ll want to use hyperparameter tuning to choose hyperparameter values that produce the best possible predictions." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch15/snippets_ipynb/15_04.ipynb b/examples/ch15/snippets_ipynb/15_04.ipynb deleted file mode 100755 index 4451dda..0000000 --- a/examples/ch15/snippets_ipynb/15_04.ipynb +++ /dev/null @@ -1,408 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 15.4 Case Study: Time Series and Simple Linear Regression \n", - "### Loading the Average High Temperatures into a `DataFrame` \n", - "\n", - "**We added `%matplotlib inline` to enable Matplotlib in this notebook.**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nyc = pd.read_csv('ave_hi_nyc_jan_1895-2018.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nyc.columns = ['Date', 'Temperature', 'Anomaly']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nyc.Date = nyc.Date.floordiv(100)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nyc.head(3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Splitting the Data for Training and Testing" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.model_selection import train_test_split" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_train, X_test, y_train, y_test = train_test_split(\n", - " nyc.Date.values.reshape(-1, 1), nyc.Temperature.values, \n", - " random_state=11)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_train.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_test.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Training the Model" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.linear_model import LinearRegression" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "linear_regression = LinearRegression()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "linear_regression.fit(X=X_train, y=y_train)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "linear_regression.coef_" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "linear_regression.intercept_" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Testing the Model" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "predicted = linear_regression.predict(X_test)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "expected = y_test" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for p, e in zip(predicted[::5], expected[::5]):\n", - " print(f'predicted: {p:.2f}, expected: {e:.2f}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Predicting Future Temperatures and Estimating Past Temperatures " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "predict = (lambda x: linear_regression.coef_ * x + \n", - " linear_regression.intercept_)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "predict(2019)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "predict(1890)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Visualizing the Dataset with the Regression Line" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import seaborn as sns" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "axes = sns.scatterplot(data=nyc, x='Date', y='Temperature',\n", - " hue='Temperature', palette='winter', legend=False)\n", - "\n", - "axes.set_ylim(10, 70)\n", - "\n", - "import numpy as np\n", - "\n", - "x = np.array([min(nyc.Date.values), max(nyc.Date.values)])\n", - "\n", - "y = predict(x)\n", - "\n", - "import matplotlib.pyplot as plt \n", - "\n", - "line = plt.plot(x, y)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# This placeholder cell was added because we had to combine \n", - "# the sections snippets 22-28 for the visualization to work in Jupyter\n", - "# and want the subsequent snippet numbers to match the book" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Placeholder cell " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Placeholder cell " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Placeholder cell " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Placeholder cell " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Placeholder cell " - ] - }, - { - "cell_type": "raw", - "metadata": {}, - "source": [ - "Overfitting/Underfitting" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "## 15.4 Self Check\n", - "**1. _(Fill-In)_** A `LinearRegression` object’s `________` and `________` attributes can be used as _m_ and _b_, respectively, in the equation _y = mx + b_ to make predictions. \n", - "\n", - "**Answer:** `coeff_`, `intercept_`.\n", - "\n", - "**2. _(True/False)_** By default, the `LinearRegression` estimator performs simple linear regression.\n", - "\n", - "**Answer:** False. By default, the `LinearRegression` estimator uses all the numeric features in a dataset, performing a multiple linear regression.\n", - "\n", - "**3. _(IPython Session)_** Use the predict lambda to estimate what the average January high temperature was in `1889` and to predict what it will be in `2020`.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "predict(1889)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "predict(2020)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch15/snippets_ipynb/15_05.ipynb b/examples/ch15/snippets_ipynb/15_05.ipynb deleted file mode 100755 index 6d3d550..0000000 --- a/examples/ch15/snippets_ipynb/15_05.ipynb +++ /dev/null @@ -1,659 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 15.5 Case Study: Multiple Linear Regression with the California Housing Dataset\n", - "## 15.5.1 Loading the Dataset\n", - "### Loading the Data\n", - "**We added `%matplotlib inline` to enable Matplotlib in this notebook.**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "from sklearn.datasets import fetch_california_housing" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "california = fetch_california_housing()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Displaying the Dataset’s Description" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(california.DESCR)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "california.data.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "california.target.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "california.feature_names" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.5.2 Exploring the Data with Pandas" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.set_option('precision', 4)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.set_option('max_columns', 9)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.set_option('display.width', None)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "california_df = pd.DataFrame(california.data, \n", - " columns=california.feature_names)\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "california_df['MedHouseValue'] = pd.Series(california.target)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "california_df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "california_df.describe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "## 15.5.2 Self Check\n", - "**1. _(Discussion)_** Based on the `DataFrame`’s summary statistics, what was the average median household income across all block groups for California in 1990?\n", - "\n", - "**Answer:** $38,707 (`3.8707 * 10000`—recall that the datasets median income is expressed in tens of thousands)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.5.3 Visualizing the Features " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sample_df = california_df.sample(frac=0.1, random_state=17)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import seaborn as sns" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sns.set(font_scale=2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sns.set_style('whitegrid') " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for feature in california.feature_names:\n", - " plt.figure(figsize=(16, 9))\n", - " sns.scatterplot(data=sample_df, x=feature, \n", - " y='MedHouseValue', hue='MedHouseValue', \n", - " palette='cool', legend=False)\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "## 15.5.3 Self Check\n", - "**1. _(Fill-In)_** `DataFrame` method `________` returns a randomly selected subset of the `DataFrame`’s rows.\n", - "\n", - "**Answer:** `sample`.\n", - "\n", - "**2. _(Discussion)_** Why would it be useful in a scatter plot to plot a randomly selected subset of a dataset’s samples?\n", - "\n", - "**Answer:** When you are getting to know your data for a large dataset, there could be too many samples to get a sense of how they are truly distributed" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.5.4 Splitting the Data for Training and Testing " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.model_selection import train_test_split" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_train, X_test, y_train, y_test = train_test_split(\n", - " california.data, california.target, random_state=11)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_train.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_test.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.5.5 Training the Model " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.linear_model import LinearRegression" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "linear_regression = LinearRegression()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "linear_regression.fit(X=X_train, y=y_train)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for i, name in enumerate(california.feature_names):\n", - " print(f'{name:>10}: {linear_regression.coef_[i]}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "linear_regression.intercept_" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "## 15.5.5 Self Check\n", - "**1. _(True/False)_** By default, a `LinearRegression` estimator uses all the features in the dataset to perform a multiple linear regression. \n", - "\n", - "**Answer:** False. By default, a `LinearRegression` estimator uses all the numeric features in the dataset to perform a multiple linear regression. An error occurs if any of the features are categorical rather than numeric. Categorical features must be preprocessed into numerical ones or must be excluded from the training process." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.5.6 Testing the Model " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "predicted = linear_regression.predict(X_test)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "expected = y_test" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "predicted[:5]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "expected[:5]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.5.7 Visualizing the Expected vs. Predicted Prices " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.DataFrame()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "df['Expected'] = pd.Series(expected)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "df['Predicted'] = pd.Series(predicted)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "figure = plt.figure(figsize=(9, 9))\n", - "\n", - "axes = sns.scatterplot(data=df, x='Expected', y='Predicted', \n", - " hue='Predicted', palette='cool', legend=False)\n", - "\n", - "start = min(expected.min(), predicted.min())\n", - "\n", - "end = max(expected.max(), predicted.max())\n", - "\n", - "axes.set_xlim(start, end)\n", - "\n", - "axes.set_ylim(start, end)\n", - "\n", - "line = plt.plot([start, end], [start, end], 'k--')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# This placeholder cell was added because we had to combine \n", - "# the sections snippets 37-43 for the visualization to work in Jupyter\n", - "# and want the subsequent snippet numbers to match the book" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Placeholder cell " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Placeholder cell " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Placeholder cell " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Placeholder cell " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Placeholder cell " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.5.8 Regression Model Metrics \n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn import metrics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "metrics.r2_score(expected, predicted)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "metrics.mean_squared_error(expected, predicted)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "## 15.5.8 Self Check\n", - "**1. _(Fill-In)_** An R2 score of `________` indicates that an estimator perfectly predicts the dependent variable’s value, given the independent variable(s) value(s). \n", - "\n", - "**Answer:** 1.0.\n", - "\n", - "**2. _(True/False)_** When comparing estimators, the one with the mean squared error value closest to 0 is the estimator that best fits your data. \n", - "\n", - "**Answer:** True. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.5.9 Choosing the Best Model" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.linear_model import ElasticNet, Lasso, Ridge" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "estimators = {\n", - " 'LinearRegression': linear_regression,\n", - " 'ElasticNet': ElasticNet(),\n", - " 'Lasso': Lasso(),\n", - " 'Ridge': Ridge()\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.model_selection import KFold, cross_val_score" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for estimator_name, estimator_object in estimators.items():\n", - " kfold = KFold(n_splits=10, random_state=11, shuffle=True)\n", - " scores = cross_val_score(estimator=estimator_object, \n", - " X=california.data, y=california.target, cv=kfold,\n", - " scoring='r2')\n", - " print(f'{estimator_name:>16}: ' + \n", - " f'mean of r2 scores={scores.mean():.3f}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch15/snippets_ipynb/15_06.ipynb b/examples/ch15/snippets_ipynb/15_06.ipynb deleted file mode 100755 index 47e9ad9..0000000 --- a/examples/ch15/snippets_ipynb/15_06.ipynb +++ /dev/null @@ -1,197 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 15.6 Case Study: Unsupervised Machine Learning, Part 1—Dimensionality Reduction \n", - "### Loading the Digits Dataset\n", - "\n", - "**We added `%matplotlib inline` to enable Matplotlib in this notebook.**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "from sklearn.datasets import load_digits" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "digits = load_digits()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a `TSNE` Estimator for Dimensionality Reduction" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.manifold import TSNE" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tsne = TSNE(n_components=2, random_state=11)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Transforming the Digits Dataset’s Features into Two Dimensions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "reduced_data = tsne.fit_transform(digits.data)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "reduced_data.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Visualizing the Reduced Data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dots = plt.scatter(reduced_data[:, 0], reduced_data[:, 1],\n", - " c='black')\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Visualizing the Reduced Data with Different Colors for Each Digit" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dots = plt.scatter(reduced_data[:, 0], reduced_data[:, 1],\n", - " c=digits.target, cmap=plt.cm.get_cmap('nipy_spectral_r', 10))\n", - "\n", - "colorbar = plt.colorbar(dots)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# This placeholder cell was added because we had to combine \n", - "# the sections snippets 9-10 for the visualization to work in Jupyter" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "## 15.6 Self Check\n", - "**1. _(Fill-In)_** With dimensionality reduction training the estimator, then using the estimator to transform the data into the specified number of dimensions can be performed separately with the TSNE methods `________` and `________`, or in one statement using the `fit_transform` method.\n", - "\n", - "**Answer:** `fit`, `transform`.\n", - "\n", - "**2. _(True/False)_** Unsupervised machine learning and visualization can help you get to know your data by finding patterns and relationships among unlabeled samples. \n", - "\n", - "**Answer:** True." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch15/snippets_ipynb/15_07.ipynb b/examples/ch15/snippets_ipynb/15_07.ipynb deleted file mode 100755 index 246028c..0000000 --- a/examples/ch15/snippets_ipynb/15_07.ipynb +++ /dev/null @@ -1,639 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 15.7 Case Study: Unsupervised Machine Learning, Part 2—k-Means Clustering\n", - "### Iris Dataset\n", - "![Self Check Exercises check mark image](files/art/check.png)\n", - "## 15.7 Self Check\n", - "**1. _(Fill-In)_** Each cluster of samples is grouped around a `________`—the cluster’s center point. \n", - "\n", - "**Answer:** centroid.\n", - "\n", - "**2. _(True/False)_** The k-means clustering algorithm studies the dataset then automatically determines the appropriate number of clusters. \n", - "\n", - "**Answer:** False. The algorithm organizes samples into the number of clusters you specify in advance." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.7.1 Loading the Iris Dataset\n", - "**We added `%matplotlib inline` to enable Matplotlib in this notebook.**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "from sklearn.datasets import load_iris" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "iris = load_iris()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(iris.DESCR)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Checking the Numbers of Samples, Features and Targets" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "iris.data.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "iris.target.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "iris.target_names" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "iris.feature_names" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.7.2 Exploring the Iris Dataset: Descriptive Statistics with Pandas" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.set_option('max_columns', 5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.set_option('display.width', None)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "iris_df['species'] = [iris.target_names[i] for i in iris.target]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "iris_df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.set_option('precision', 2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "iris_df.describe()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "iris_df['species'].describe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.7.3 Visualizing the Dataset with a Seaborn `pairplot` " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import seaborn as sns" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sns.set(font_scale=1.1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sns.set_style('whitegrid')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grid = sns.pairplot(data=iris_df, vars=iris_df.columns[0:4],\n", - " hue='species')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Displaying the pairplot in One Color" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "grid = sns.pairplot(data=iris_df, vars=iris_df.columns[0:4])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "## 15.7.3 Self Check\n", - "**1. _(Fill-In)_** Seaborn’s `________` function creates a grid of scatter plots showing features against one another.\n", - "\n", - "**Answer:** `pairplot`.\n", - "\n", - "**2. _(True/False)_** A plot of a feature’s distribution shows the feature’s range of values (left-to-right) and the number of samples with those values (top-to-bottom). \n", - "\n", - "**Answer:** True." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.7.4 Using a `KMeans` Estimator\n", - "### Creating the Estimator" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.cluster import KMeans" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "kmeans = KMeans(n_clusters=3, random_state=11)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Fitting the Model" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "kmeans.fit(iris.data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Comparing the Computer Cluster Labels to the Iris Dataset’s Target Values" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(kmeans.labels_[0:50])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(kmeans.labels_[50:100])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(kmeans.labels_[100:150])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "## 15.7.4 Self Check\n", - "**1. _(IPython Session)_** Try k-means clustering on the Iris dataset with two clusters, then display the first 50 and the last 100 elements of the estimator’s `labels_` array.\n", - "\n", - "**Answer:** " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "kmeans2 = KMeans(n_clusters=2, random_state=11)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "kmeans2.fit(iris.data)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(kmeans2.labels_[0:50])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(kmeans2.labels_[50:150])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.7.5 Dimensionality Reduction with Principal Component Analysis\n", - "### Creating the PCA Object" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.decomposition import PCA" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pca = PCA(n_components=2, random_state=11)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Transforming the Iris Dataset’s Features into Two Dimensions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pca.fit(iris.data)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "iris_pca = pca.transform(iris.data)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "iris_pca.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Visualizing the Reduced Data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "iris_pca_df = pd.DataFrame(iris_pca, \n", - " columns=['Component1', 'Component2'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "iris_pca_df['species'] = iris_df.species" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "axes = sns.scatterplot(data=iris_pca_df, x='Component1', \n", - " y='Component2', hue='species', legend='brief') \n", - "\n", - "iris_centers = pca.transform(kmeans.cluster_centers_)\n", - "\n", - "import matplotlib.pyplot as plt\n", - "\n", - "dots = plt.scatter(iris_centers[:,0], iris_centers[:,1], \n", - " s=100, c='k')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# This placeholder cell was added because we had to combine \n", - "# the sections snippets 39-42 for the visualization to work in Jupyter\n", - "# and we wanted the subsequent snippet numbers to match the book" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# placeholder cell " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# placeholder cell " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "## 15.7.6 Self Check\n", - "**1. _(True/False)_** Each centroid in a `KMeans` object’s `cluster_centers_` array has the same number of features as the original dataset.\n", - "\n", - "**Answer:** True.\n", - "\n", - "**2. _(Discussion)_** What is the purpose of the following statement?\n", - "```python\n", - "iris_centers = pca.transform(kmeans.cluster_centers_)\n", - "```\n", - "\n", - "**Answer:** This statement reduces the centroids to the number of dimensions specified when the pca object was created. In the Iris case study, we were able to plot the reduced centroids in two dimensions at the centers of their corresponding clusters." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 15.7.6 Choosing the Best Clustering Estimator" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.cluster import DBSCAN, MeanShift,\\\n", - " SpectralClustering, AgglomerativeClustering" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "estimators = {\n", - " 'KMeans': kmeans,\n", - " 'DBSCAN': DBSCAN(),\n", - " 'MeanShift': MeanShift(),\n", - " 'SpectralClustering': SpectralClustering(n_clusters=3),\n", - " 'AgglomerativeClustering': \n", - " AgglomerativeClustering(n_clusters=3)\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for name, estimator in estimators.items():\n", - " estimator.fit(iris.data)\n", - " print(f'\\n{name}:')\n", - " for i in range(0, 101, 50):\n", - " labels, counts = np.unique(\n", - " estimator.labels_[i:i+50], return_counts=True)\n", - " print(f'{i}-{i+50}:')\n", - " for label, count in zip(labels, counts):\n", - " print(f' label={label}, count={count}')\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################\n" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch15/snippets_ipynb/ave_hi_nyc_jan_1895-2018.csv b/examples/ch15/snippets_ipynb/ave_hi_nyc_jan_1895-2018.csv deleted file mode 100755 index 485d137..0000000 --- a/examples/ch15/snippets_ipynb/ave_hi_nyc_jan_1895-2018.csv +++ /dev/null @@ -1,125 +0,0 @@ -Date,Value,Anomaly -189501,34.2,-3.2 -189601,34.7,-2.7 -189701,35.5,-1.9 -189801,39.6,2.2 -189901,36.4,-1.0 -190001,37.4,0.0 -190101,37.0,-0.4 -190201,35.0,-2.4 -190301,35.5,-1.9 -190401,29.8,-7.6 -190501,33.7,-3.7 -190601,42.3,4.9 -190701,40.5,3.1 -190801,38.3,0.9 -190901,39.6,2.2 -191001,36.1,-1.3 -191101,40.7,3.3 -191201,29.3,-8.1 -191301,46.9,9.5 -191401,36.9,-0.5 -191501,38.9,1.5 -191601,42.3,4.9 -191701,38.4,1.0 -191801,26.5,-10.9 -191901,40.6,3.2 -192001,29.7,-7.7 -192101,39.7,2.3 -192201,33.4,-4.0 -192301,35.2,-2.2 -192401,39.4,2.0 -192501,33.8,-3.6 -192601,37.2,-0.2 -192701,36.8,-0.6 -192801,40.0,2.6 -192901,37.8,0.4 -193001,38.5,1.1 -193101,38.2,0.8 -193201,47.6,10.2 -193301,45.6,8.2 -193401,39.8,2.4 -193501,35.0,-2.4 -193601,34.3,-3.1 -193701,45.7,8.3 -193801,37.3,-0.1 -193901,36.8,-0.6 -194001,30.0,-7.4 -194101,34.5,-2.9 -194201,36.5,-0.9 -194301,36.1,-1.3 -194401,39.0,1.6 -194501,31.5,-5.9 -194601,40.2,2.8 -194701,43.0,5.6 -194801,30.1,-7.3 -194901,43.5,6.1 -195001,47.6,10.2 -195101,42.5,5.1 -195201,42.4,5.0 -195301,42.4,5.0 -195401,37.0,-0.4 -195501,35.6,-1.8 -195601,36.2,-1.2 -195701,33.8,-3.6 -195801,36.4,-1.0 -195901,37.1,-0.3 -196001,37.8,0.4 -196101,31.9,-5.5 -196201,38.0,0.6 -196301,34.6,-2.8 -196401,40.2,2.8 -196501,34.0,-3.4 -196601,37.1,-0.3 -196701,41.6,4.2 -196801,31.7,-5.7 -196901,35.7,-1.7 -197001,29.9,-7.5 -197101,31.5,-5.9 -197201,40.5,3.1 -197301,40.6,3.2 -197401,39.7,2.3 -197501,41.7,4.3 -197601,32.6,-4.8 -197701,26.1,-11.3 -197801,32.3,-5.1 -197901,38.6,1.2 -198001,38.0,0.6 -198101,30.6,-6.8 -198201,30.9,-6.5 -198301,38.0,0.6 -198401,33.5,-3.9 -198501,33.0,-4.4 -198601,39.3,1.9 -198701,35.9,-1.5 -198801,34.2,-3.2 -198901,42.4,5.0 -199001,46.0,8.6 -199101,39.6,2.2 -199201,40.9,3.5 -199301,41.0,3.6 -199401,31.6,-5.8 -199501,42.6,5.2 -199601,37.0,-0.4 -199701,39.2,1.8 -199801,45.8,8.4 -199901,40.8,3.4 -200001,37.8,0.4 -200101,38.8,1.4 -200201,45.4,8.0 -200301,32.9,-4.5 -200401,31.0,-6.4 -200501,37.4,0.0 -200601,47.6,10.2 -200701,43.6,6.2 -200801,42.4,5.0 -200901,33.4,-4.0 -201001,38.1,0.7 -201101,34.8,-2.6 -201201,44.2,6.8 -201301,40.8,3.4 -201401,35.5,-1.9 -201501,36.1,-1.3 -201601,40.8,3.4 -201701,42.8,5.4 -201801,38.7,1.3 \ No newline at end of file diff --git a/examples/ch15/snippets_ipynb/ave_yearly_temp_nyc_1895-2017.csv b/examples/ch15/snippets_ipynb/ave_yearly_temp_nyc_1895-2017.csv deleted file mode 100644 index 321a2ba..0000000 --- a/examples/ch15/snippets_ipynb/ave_yearly_temp_nyc_1895-2017.csv +++ /dev/null @@ -1,124 +0,0 @@ -Date,Value,Anomaly -189512,52.1,-1.8 -189612,52.3,-1.6 -189712,52.3,-1.6 -189812,53.8,-0.1 -189912,52.7,-1.2 -190012,52.9,-1.0 -190112,51.2,-2.7 -190212,51.7,-2.2 -190312,51.7,-2.2 -190412,49.2,-4.7 -190512,51.5,-2.4 -190612,53.1,-0.8 -190712,51.0,-2.9 -190812,53.1,-0.8 -190912,51.8,-2.1 -191012,51.6,-2.3 -191112,52.8,-1.1 -191212,52.1,-1.8 -191312,54.3,0.4 -191412,51.4,-2.5 -191512,52.8,-1.1 -191612,51.6,-2.3 -191712,50.1,-3.8 -191812,52.6,-1.3 -191912,53.2,-0.7 -192012,52.0,-1.9 -192112,54.6,0.7 -192212,53.2,-0.7 -192312,52.4,-1.5 -192412,51.4,-2.5 -192512,53.0,-0.9 -192612,50.7,-3.2 -192712,52.9,-1.0 -192812,53.0,-0.9 -192912,53.3,-0.6 -193012,53.7,-0.2 -193112,55.0,1.1 -193212,54.3,0.4 -193312,53.6,-0.3 -193412,52.4,-1.5 -193512,52.5,-1.4 -193612,52.8,-1.1 -193712,53.9,0.0 -193812,54.6,0.7 -193912,54.1,0.2 -194012,51.3,-2.6 -194112,54.3,0.4 -194212,53.5,-0.4 -194312,53.2,-0.7 -194412,54.1,0.2 -194512,53.5,-0.4 -194612,54.8,0.9 -194712,53.2,-0.7 -194812,53.5,-0.4 -194912,56.3,2.4 -195012,53.0,-0.9 -195112,54.4,0.5 -195212,55.2,1.3 -195312,56.5,2.6 -195412,54.3,0.4 -195512,54.1,0.2 -195612,52.9,-1.0 -195712,54.9,1.0 -195812,52.0,-1.9 -195912,54.8,0.9 -196012,53.4,-0.5 -196112,54.5,0.6 -196212,52.8,-1.1 -196312,53.0,-0.9 -196412,54.0,0.1 -196512,53.6,-0.3 -196612,54.5,0.6 -196712,52.4,-1.5 -196812,53.5,-0.4 -196912,54.2,0.3 -197012,53.7,-0.2 -197112,54.6,0.7 -197212,53.3,-0.6 -197312,55.5,1.6 -197412,54.1,0.2 -197512,54.4,0.5 -197612,52.9,-1.0 -197712,53.5,-0.4 -197812,52.2,-1.7 -197912,54.3,0.4 -198012,53.8,-0.1 -198112,54.0,0.1 -198212,53.6,-0.3 -198312,54.8,0.9 -198412,54.2,0.3 -198512,54.6,0.7 -198612,54.5,0.6 -198712,54.7,0.8 -198812,54.3,0.4 -198912,53.5,-0.4 -199012,56.7,2.8 -199112,56.7,2.8 -199212,53.5,-0.4 -199312,55.0,1.1 -199412,54.8,0.9 -199512,55.0,1.1 -199612,54.1,0.2 -199712,54.7,0.8 -199812,57.5,3.6 -199912,56.9,3.0 -200012,54.2,0.3 -200112,56.6,2.7 -200212,56.8,2.9 -200312,53.8,-0.1 -200412,54.9,1.0 -200512,56.1,2.2 -200612,57.2,3.3 -200712,55.4,1.5 -200812,55.7,1.8 -200912,54.4,0.5 -201012,57.1,3.2 -201112,56.8,2.9 -201212,57.7,3.8 -201312,55.6,1.7 -201412,54.4,0.5 -201512,56.7,2.8 -201612,57.2,3.3 -201712,56.4,2.5 diff --git a/examples/ch15/snippets_ipynb/files/art/check.png b/examples/ch15/snippets_ipynb/files/art/check.png deleted file mode 100755 index eea18cd..0000000 Binary files a/examples/ch15/snippets_ipynb/files/art/check.png and /dev/null differ diff --git a/examples/ch15/snippets_py/15_02-03.py b/examples/ch15/snippets_py/15_02-03.py deleted file mode 100755 index 31f58b3..0000000 --- a/examples/ch15/snippets_py/15_02-03.py +++ /dev/null @@ -1,197 +0,0 @@ -# This file contains Sections 15.2 and 15.3 and all of their subsections and Self Check exercises - -# 15.2 Case Study: Classification with k-Nearest Neighbors and the Digits Dataset, Part 1 - -# 15.2.2 Loading the Dataset -from sklearn.datasets import load_digits - -digits = load_digits() - -# Displaying the Description -print(digits.DESCR) - -# Checking the Sample and Target Sizes -digits.target[::100] - -digits.data.shape - -digits.target.shape - -# A Sample Digit Image -digits.images[13] - -# Preparing the Data for Use with Scikit-Learn -digits.data[13] - -# 15.2.2 Self Check -# Exercise 3 -digits.images[22] - -digits.target[22] - -# 15.2.3 Visualizing the Data - -# Creating the Diagram -import matplotlib.pyplot as plt - -figure, axes = plt.subplots(nrows=4, ncols=6, figsize=(6, 4)) - -# Displaying Each Image and Removing the Axes Labels - -for item in zip(axes.ravel(), digits.images, digits.target): - axes, image, target = item - axes.imshow(image, cmap=plt.cm.gray_r) - axes.set_xticks([]) # remove x-axis tick marks - axes.set_yticks([]) # remove y-axis tick marks - axes.set_title(target) -plt.tight_layout() - -# 15.2.3 Self Check -# Exercise 2 -axes = plt.subplot() - -image = plt.imshow(digits.images[22], cmap=plt.cm.gray_r) - -xticks = axes.set_xticks([]) - -yticks = axes.set_yticks([]) - -# 15.2.4 Splitting the Data for Training and Testing -from sklearn.model_selection import train_test_split - -X_train, X_test, y_train, y_test = train_test_split( - digits.data, digits.target, random_state=11) - -# Training and Testing Set Sizes -X_train.shape - -X_test.shape - -# 15.2.5 Creating the Model -from sklearn.neighbors import KNeighborsClassifier - -knn = KNeighborsClassifier() - -# 15.2.6 Training the Model -knn.fit(X=X_train, y=y_train) - -# 15.2.7 Predicting Digit Classes -predicted = knn.predict(X=X_test) - -expected = y_test - -predicted[:20] - -expected[:20] - -wrong = [(p, e) for (p, e) in zip(predicted, expected) if p != e] - -wrong - -# 15.2.7 Self Check -# Exercise 1 -print(f'{(len(expected) - len(wrong)) / len(expected):.2%}') - -# Exercise 2 -wrong = [] - -for p, e in zip(predicted, expected): - if p != e: - wrong.append((p, e)) - -wrong - -# 15.3 Case Study: Classification with k-Nearest Neighbors and the Digits Dataset, Part 2 - -# 15.3.1 Metrics for Model Accuracy - -# Estimator Method score -print(f'{knn.score(X_test, y_test):.2%}') - -# Confusion Matrix -from sklearn.metrics import confusion_matrix - -confusion = confusion_matrix(y_true=expected, y_pred=predicted) - -confusion - -# Classification Report -from sklearn.metrics import classification_report - -names = [str(digit) for digit in digits.target_names] - -print(classification_report(expected, predicted, - target_names=names)) - -# Visualizing the Confusion Matrix -import pandas as pd - -confusion_df = pd.DataFrame(confusion, index=range(10), - columns=range(10)) - -import seaborn as sns - -axes = sns.heatmap(confusion_df, annot=True, - cmap='nipy_spectral_r') - -# 15.3.2 K-Fold Cross-Validation - -# KFold Class -from sklearn.model_selection import KFold - -kfold = KFold(n_splits=10, random_state=11, shuffle=True) - -# Using the KFold Object with Function cross_val_score -from sklearn.model_selection import cross_val_score - -scores = cross_val_score(estimator=knn, X=digits.data, - y=digits.target, cv=kfold) - -scores - -print(f'Mean accuracy: {scores.mean():.2%}') - -print(f'Accuracy standard deviation: {scores.std():.2%}') - -# 15.3.3 Running Multiple Models to Find the Best One -from sklearn.svm import SVC - -from sklearn.naive_bayes import GaussianNB - -estimators = { - 'KNeighborsClassifier': knn, - 'SVC': SVC(gamma='scale'), - 'GaussianNB': GaussianNB()} - -for estimator_name, estimator_object in estimators.items(): - kfold = KFold(n_splits=10, random_state=11, shuffle=True) - scores = cross_val_score(estimator=estimator_object, - X=digits.data, y=digits.target, cv=kfold) - print(f'{estimator_name:>20}: ' + - f'mean accuracy={scores.mean():.2%}; ' + - f'standard deviation={scores.std():.2%}') - -# 15.3.4 Hyperparameter Tuning -for k in range(1, 20, 2): - kfold = KFold(n_splits=10, random_state=11, shuffle=True) - knn = KNeighborsClassifier(n_neighbors=k) - scores = cross_val_score(estimator=knn, - X=digits.data, y=digits.target, cv=kfold) - print(f'k={k:<2}; mean accuracy={scores.mean():.2%}; ' + - f'standard deviation={scores.std():.2%}') - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch15/snippets_py/15_04.py b/examples/ch15/snippets_py/15_04.py deleted file mode 100755 index 426987c..0000000 --- a/examples/ch15/snippets_py/15_04.py +++ /dev/null @@ -1,92 +0,0 @@ -# 15.4 Case Study: Time Series and Simple Linear Regression - -# Loading the Average High Temperatures into a DataFrame -import pandas as pd - -nyc = pd.read_csv('ave_hi_nyc_jan_1895-2018.csv') - -nyc.columns = ['Date', 'Temperature', 'Anomaly'] - -nyc.Date = nyc.Date.floordiv(100) - -nyc.head(3) - -# Splitting the Data for Training and Testing -from sklearn.model_selection import train_test_split - -X_train, X_test, y_train, y_test = train_test_split( - nyc.Date.values.reshape(-1, 1), nyc.Temperature.values, - random_state=11) - -X_train.shape - -X_test.shape - -# Training the Model -from sklearn.linear_model import LinearRegression - -linear_regression = LinearRegression() - -linear_regression.fit(X=X_train, y=y_train) - -linear_regression.coef_ - -linear_regression.intercept_ - -# Testing the Model -predicted = linear_regression.predict(X_test) - -expected = y_test - -for p, e in zip(predicted[::5], expected[::5]): - print(f'predicted: {p:.2f}, expected: {e:.2f}') - -# Predicting Future Temperatures and Estimating Past Temperatures - -predict = (lambda x: linear_regression.coef_ * x + - linear_regression.intercept_) - -predict(2019) - -predict(1890) - -# Visualizing the Dataset with the Regression Line -import seaborn as sns - -axes = sns.scatterplot(data=nyc, x='Date', y='Temperature', - hue='Temperature', palette='winter', legend=False) - -axes.set_ylim(10, 70) - -import numpy as np - -x = np.array([min(nyc.Date.values), max(nyc.Date.values)]) - -y = predict(x) - -import matplotlib.pyplot as plt - -line = plt.plot(x, y) - -# 15.4 Self Check -# Exercise 3 -predict(1889) - -predict(2020) - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch15/snippets_py/15_05.py b/examples/ch15/snippets_py/15_05.py deleted file mode 100755 index 9d4e945..0000000 --- a/examples/ch15/snippets_py/15_05.py +++ /dev/null @@ -1,146 +0,0 @@ -# 15.5 Case Study: Multiple Linear Regression with the California Housing Dataset - -# 15.5.1 Loading the Dataset -# Loading the Data -from sklearn.datasets import fetch_california_housing - -california = fetch_california_housing() - -# Displaying the Dataset’s Description -print(california.DESCR) - -california.data.shape - -california.target.shape - -california.feature_names - -# 15.5.2 Exploring the Data with Pandas -import pandas as pd - -pd.set_option('precision', 4) - -pd.set_option('max_columns', 9) - -pd.set_option('display.width', None) - -california_df = pd.DataFrame(california.data, - columns=california.feature_names) - -california_df['MedHouseValue'] = pd.Series(california.target) - -california_df.head() - -california_df.describe() - -# 15.5.3 Visualizing the Features -sample_df = california_df.sample(frac=0.1, random_state=17) - -import matplotlib.pyplot as plt - -import seaborn as sns - -sns.set(font_scale=2) - -sns.set_style('whitegrid') - -for feature in california.feature_names: - plt.figure(figsize=(16, 9)) - sns.scatterplot(data=sample_df, x=feature, - y='MedHouseValue', hue='MedHouseValue', - palette='cool', legend=False) - -# 15.5.4 Splitting the Data for Training and Testing -from sklearn.model_selection import train_test_split - -X_train, X_test, y_train, y_test = train_test_split( - california.data, california.target, random_state=11) - -X_train.shape - -X_test.shape - -# 15.5.5 Training the Model -from sklearn.linear_model import LinearRegression - -linear_regression = LinearRegression() - -linear_regression.fit(X=X_train, y=y_train) - -for i, name in enumerate(california.feature_names): - print(f'{name:>10}: {linear_regression.coef_[i]}') - -linear_regression.intercept_ - -# 15.5.6 Testing the Model -predicted = linear_regression.predict(X_test) - -expected = y_test - -predicted[:5] - -expected[:5] - -# 15.5.7 Visualizing the Expected vs. Predicted Prices -df = pd.DataFrame() - -df['Expected'] = pd.Series(expected) - -df['Predicted'] = pd.Series(predicted) - -figure = plt.figure(figsize=(9, 9)) - -axes = sns.scatterplot(data=df, x='Expected', y='Predicted', - hue='Predicted', palette='cool', legend=False) - -start = min(expected.min(), predicted.min()) - -end = max(expected.max(), predicted.max()) - -axes.set_xlim(start, end) - -axes.set_ylim(start, end) - -line = plt.plot([start, end], [start, end], 'k--') - -# 15.5.8 Regression Model Metrics -from sklearn import metrics - -metrics.r2_score(expected, predicted) - -metrics.mean_squared_error(expected, predicted) - -# 15.5.9 Choosing the Best Model -from sklearn.linear_model import ElasticNet, Lasso, Ridge - -estimators = { - 'LinearRegression': linear_regression, - 'ElasticNet': ElasticNet(), - 'Lasso': Lasso(), - 'Ridge': Ridge() -} - -from sklearn.model_selection import KFold, cross_val_score - -for estimator_name, estimator_object in estimators.items(): - kfold = KFold(n_splits=10, random_state=11, shuffle=True) - scores = cross_val_score(estimator=estimator_object, - X=california.data, y=california.target, cv=kfold, - scoring='r2') - print(f'{estimator_name:>16}: ' + - f'mean of r2 scores={scores.mean():.3f}') - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch15/snippets_py/15_06.py b/examples/ch15/snippets_py/15_06.py deleted file mode 100755 index 0e1d212..0000000 --- a/examples/ch15/snippets_py/15_06.py +++ /dev/null @@ -1,43 +0,0 @@ -# 15.6 Case Study: Unsupervised Machine Learning, Part 1—Dimensionality Reduction - -# Loading the Digits Dataset -from sklearn.datasets import load_digits - -digits = load_digits() - -# Creating a TSNE Estimator for Dimensionality Reduction -from sklearn.manifold import TSNE - -tsne = TSNE(n_components=2, random_state=11) - -# Transforming the Digits Dataset’s Features into Two Dimensions -reduced_data = tsne.fit_transform(digits.data) - -reduced_data.shape - -# Visualizing the Reduced Data -import matplotlib.pyplot as plt - -dots = plt.scatter(reduced_data[:, 0], reduced_data[:, 1], - c='black') - -# Visualizing the Reduced Data with Different Colors for Each Digit -dots = plt.scatter(reduced_data[:, 0], reduced_data[:, 1], - c=digits.target, cmap=plt.cm.get_cmap('nipy_spectral_r', 10)) - -colorbar = plt.colorbar(dots) - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch15/snippets_py/15_07.py b/examples/ch15/snippets_py/15_07.py deleted file mode 100755 index d5c52b6..0000000 --- a/examples/ch15/snippets_py/15_07.py +++ /dev/null @@ -1,132 +0,0 @@ -# 15.7 Case Study: Unsupervised Machine Learning, Part 2—k-Means Clustering -# Iris Dataset - -# 15.7.1 Loading the Iris Dataset -from sklearn.datasets import load_iris - -iris = load_iris() - -print(iris.DESCR) - -# Checking the Numbers of Samples, Features and Targets -iris.data.shape - -iris.target.shape - -iris.target_names - -iris.feature_names - -# 15.7.2 Exploring the Iris Dataset: Descriptive Statistics with Pandas -import pandas as pd - -pd.set_option('max_columns', 5) - -pd.set_option('display.width', None) - -iris_df = pd.DataFrame(iris.data, columns=iris.feature_names) - -iris_df['species'] = [iris.target_names[i] for i in iris.target] - -iris_df.head() - -pd.set_option('precision', 2) - -iris_df.describe() - -iris_df['species'].describe() - -# 15.7.3 Visualizing the Dataset with a Seaborn pairplot -import seaborn as sns - -sns.set(font_scale=1.1) - -sns.set_style('whitegrid') - -grid = sns.pairplot(data=iris_df, vars=iris_df.columns[0:4], - hue='species') - -# Displaying the pairplot in One Color -grid = sns.pairplot(data=iris_df, vars=iris_df.columns[0:4]) - -# 15.7.4 Using a KMeans Estimator - -# Creating the Estimator -from sklearn.cluster import KMeans - -kmeans = KMeans(n_clusters=3, random_state=11) - -# Fitting the Model -kmeans.fit(iris.data) - -# Comparing the Computer Cluster Labels to the Iris Dataset’s Target Values -print(kmeans.labels_[0:50]) - -print(kmeans.labels_[50:100]) - -print(kmeans.labels_[100:150]) - -# 15.7.4 Self Check -kmeans2 = KMeans(n_clusters=2) - -kmeans2.fit(iris.data) - -print(kmeans2.labels_[0:50]) - -print(kmeans2.labels_[50:150]) - -# 15.7.5 Dimensionality Reduction with Principal Component Analysis -# Creating the PCA Object -from sklearn.decomposition import PCA - -pca = PCA(n_components=2, random_state=11) - -# Transforming the Iris Dataset’s Features into Two Dimensions -pca.fit(iris.data) - -iris_pca = pca.transform(iris.data) - -iris_pca.shape - -# Visualizing the Reduced Data -iris_pca_df = pd.DataFrame(iris_pca, - columns=['Component1', 'Component2']) - -iris_pca_df['species'] = iris_df.species - -axes = sns.scatterplot(data=iris_pca_df, x='Component1', - y='Component2', hue='species', legend='brief', - palette='cool') - -iris_centers = pca.transform(kmeans.cluster_centers_) - -import matplotlib.pyplot as plt - -dots = plt.scatter(iris_centers[:,0], iris_centers[:,1], - s=100, c='k') - -# 15.7.6 Choosing the Best Clustering Estimator -from sklearn.cluster import DBSCAN, MeanShift,\ - SpectralClustering, AgglomerativeClustering - -estimators = { - 'KMeans': kmeans, - 'DBSCAN': DBSCAN(), - 'MeanShift': MeanShift(), - 'SpectralClustering': SpectralClustering(n_clusters=3), - 'AgglomerativeClustering': - AgglomerativeClustering(n_clusters=3) -} - -import numpy as np - -for name, estimator in estimators.items(): - estimator.fit(iris.data) - print(f'\n{name}:') - for i in range(0, 101, 50): - labels, counts = np.unique( - estimator.labels_[i:i+50], return_counts=True) - print(f'{i}-{i+50}:') - for label, count in zip(labels, counts): - print(f' label={label}, count={count}') - \ No newline at end of file diff --git a/examples/ch15/snippets_py/ave_hi_nyc_jan_1895-2018.csv b/examples/ch15/snippets_py/ave_hi_nyc_jan_1895-2018.csv deleted file mode 100755 index 485d137..0000000 --- a/examples/ch15/snippets_py/ave_hi_nyc_jan_1895-2018.csv +++ /dev/null @@ -1,125 +0,0 @@ -Date,Value,Anomaly -189501,34.2,-3.2 -189601,34.7,-2.7 -189701,35.5,-1.9 -189801,39.6,2.2 -189901,36.4,-1.0 -190001,37.4,0.0 -190101,37.0,-0.4 -190201,35.0,-2.4 -190301,35.5,-1.9 -190401,29.8,-7.6 -190501,33.7,-3.7 -190601,42.3,4.9 -190701,40.5,3.1 -190801,38.3,0.9 -190901,39.6,2.2 -191001,36.1,-1.3 -191101,40.7,3.3 -191201,29.3,-8.1 -191301,46.9,9.5 -191401,36.9,-0.5 -191501,38.9,1.5 -191601,42.3,4.9 -191701,38.4,1.0 -191801,26.5,-10.9 -191901,40.6,3.2 -192001,29.7,-7.7 -192101,39.7,2.3 -192201,33.4,-4.0 -192301,35.2,-2.2 -192401,39.4,2.0 -192501,33.8,-3.6 -192601,37.2,-0.2 -192701,36.8,-0.6 -192801,40.0,2.6 -192901,37.8,0.4 -193001,38.5,1.1 -193101,38.2,0.8 -193201,47.6,10.2 -193301,45.6,8.2 -193401,39.8,2.4 -193501,35.0,-2.4 -193601,34.3,-3.1 -193701,45.7,8.3 -193801,37.3,-0.1 -193901,36.8,-0.6 -194001,30.0,-7.4 -194101,34.5,-2.9 -194201,36.5,-0.9 -194301,36.1,-1.3 -194401,39.0,1.6 -194501,31.5,-5.9 -194601,40.2,2.8 -194701,43.0,5.6 -194801,30.1,-7.3 -194901,43.5,6.1 -195001,47.6,10.2 -195101,42.5,5.1 -195201,42.4,5.0 -195301,42.4,5.0 -195401,37.0,-0.4 -195501,35.6,-1.8 -195601,36.2,-1.2 -195701,33.8,-3.6 -195801,36.4,-1.0 -195901,37.1,-0.3 -196001,37.8,0.4 -196101,31.9,-5.5 -196201,38.0,0.6 -196301,34.6,-2.8 -196401,40.2,2.8 -196501,34.0,-3.4 -196601,37.1,-0.3 -196701,41.6,4.2 -196801,31.7,-5.7 -196901,35.7,-1.7 -197001,29.9,-7.5 -197101,31.5,-5.9 -197201,40.5,3.1 -197301,40.6,3.2 -197401,39.7,2.3 -197501,41.7,4.3 -197601,32.6,-4.8 -197701,26.1,-11.3 -197801,32.3,-5.1 -197901,38.6,1.2 -198001,38.0,0.6 -198101,30.6,-6.8 -198201,30.9,-6.5 -198301,38.0,0.6 -198401,33.5,-3.9 -198501,33.0,-4.4 -198601,39.3,1.9 -198701,35.9,-1.5 -198801,34.2,-3.2 -198901,42.4,5.0 -199001,46.0,8.6 -199101,39.6,2.2 -199201,40.9,3.5 -199301,41.0,3.6 -199401,31.6,-5.8 -199501,42.6,5.2 -199601,37.0,-0.4 -199701,39.2,1.8 -199801,45.8,8.4 -199901,40.8,3.4 -200001,37.8,0.4 -200101,38.8,1.4 -200201,45.4,8.0 -200301,32.9,-4.5 -200401,31.0,-6.4 -200501,37.4,0.0 -200601,47.6,10.2 -200701,43.6,6.2 -200801,42.4,5.0 -200901,33.4,-4.0 -201001,38.1,0.7 -201101,34.8,-2.6 -201201,44.2,6.8 -201301,40.8,3.4 -201401,35.5,-1.9 -201501,36.1,-1.3 -201601,40.8,3.4 -201701,42.8,5.4 -201801,38.7,1.3 \ No newline at end of file diff --git a/examples/ch15/snippets_py/ave_yearly_temp_nyc_1895-2017.csv b/examples/ch15/snippets_py/ave_yearly_temp_nyc_1895-2017.csv deleted file mode 100644 index 321a2ba..0000000 --- a/examples/ch15/snippets_py/ave_yearly_temp_nyc_1895-2017.csv +++ /dev/null @@ -1,124 +0,0 @@ -Date,Value,Anomaly -189512,52.1,-1.8 -189612,52.3,-1.6 -189712,52.3,-1.6 -189812,53.8,-0.1 -189912,52.7,-1.2 -190012,52.9,-1.0 -190112,51.2,-2.7 -190212,51.7,-2.2 -190312,51.7,-2.2 -190412,49.2,-4.7 -190512,51.5,-2.4 -190612,53.1,-0.8 -190712,51.0,-2.9 -190812,53.1,-0.8 -190912,51.8,-2.1 -191012,51.6,-2.3 -191112,52.8,-1.1 -191212,52.1,-1.8 -191312,54.3,0.4 -191412,51.4,-2.5 -191512,52.8,-1.1 -191612,51.6,-2.3 -191712,50.1,-3.8 -191812,52.6,-1.3 -191912,53.2,-0.7 -192012,52.0,-1.9 -192112,54.6,0.7 -192212,53.2,-0.7 -192312,52.4,-1.5 -192412,51.4,-2.5 -192512,53.0,-0.9 -192612,50.7,-3.2 -192712,52.9,-1.0 -192812,53.0,-0.9 -192912,53.3,-0.6 -193012,53.7,-0.2 -193112,55.0,1.1 -193212,54.3,0.4 -193312,53.6,-0.3 -193412,52.4,-1.5 -193512,52.5,-1.4 -193612,52.8,-1.1 -193712,53.9,0.0 -193812,54.6,0.7 -193912,54.1,0.2 -194012,51.3,-2.6 -194112,54.3,0.4 -194212,53.5,-0.4 -194312,53.2,-0.7 -194412,54.1,0.2 -194512,53.5,-0.4 -194612,54.8,0.9 -194712,53.2,-0.7 -194812,53.5,-0.4 -194912,56.3,2.4 -195012,53.0,-0.9 -195112,54.4,0.5 -195212,55.2,1.3 -195312,56.5,2.6 -195412,54.3,0.4 -195512,54.1,0.2 -195612,52.9,-1.0 -195712,54.9,1.0 -195812,52.0,-1.9 -195912,54.8,0.9 -196012,53.4,-0.5 -196112,54.5,0.6 -196212,52.8,-1.1 -196312,53.0,-0.9 -196412,54.0,0.1 -196512,53.6,-0.3 -196612,54.5,0.6 -196712,52.4,-1.5 -196812,53.5,-0.4 -196912,54.2,0.3 -197012,53.7,-0.2 -197112,54.6,0.7 -197212,53.3,-0.6 -197312,55.5,1.6 -197412,54.1,0.2 -197512,54.4,0.5 -197612,52.9,-1.0 -197712,53.5,-0.4 -197812,52.2,-1.7 -197912,54.3,0.4 -198012,53.8,-0.1 -198112,54.0,0.1 -198212,53.6,-0.3 -198312,54.8,0.9 -198412,54.2,0.3 -198512,54.6,0.7 -198612,54.5,0.6 -198712,54.7,0.8 -198812,54.3,0.4 -198912,53.5,-0.4 -199012,56.7,2.8 -199112,56.7,2.8 -199212,53.5,-0.4 -199312,55.0,1.1 -199412,54.8,0.9 -199512,55.0,1.1 -199612,54.1,0.2 -199712,54.7,0.8 -199812,57.5,3.6 -199912,56.9,3.0 -200012,54.2,0.3 -200112,56.6,2.7 -200212,56.8,2.9 -200312,53.8,-0.1 -200412,54.9,1.0 -200512,56.1,2.2 -200612,57.2,3.3 -200712,55.4,1.5 -200812,55.7,1.8 -200912,54.4,0.5 -201012,57.1,3.2 -201112,56.8,2.9 -201212,57.7,3.8 -201312,55.6,1.7 -201412,54.4,0.5 -201512,56.7,2.8 -201612,57.2,3.3 -201712,56.4,2.5 diff --git a/examples/ch16/IMDB_RNN.ipynb b/examples/ch16/IMDB_RNN.ipynb deleted file mode 100644 index 9dab9b0..0000000 --- a/examples/ch16/IMDB_RNN.ipynb +++ /dev/null @@ -1,384 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Section 16.10" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.datasets import imdb" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "number_of_words = 10000" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=number_of_words)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_train.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "y_train.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_test.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "y_test.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%pprint" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_train[123]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "word_to_index = imdb.get_word_index()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "word_to_index['great']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "index_to_word = \\\n", - " {index: word for (word, index) in word_to_index.items()}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "[index_to_word[i] for i in range(1, 51)]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "' '.join([index_to_word.get(i - 3, '?') for i in X_train[123]])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "y_train[123]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "words_per_review = 200 " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.preprocessing.sequence import pad_sequences" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_train = pad_sequences(X_train, maxlen=words_per_review)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_train.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_test = pad_sequences(X_test, maxlen=words_per_review)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_test.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.model_selection import train_test_split\n", - "X_test, X_val, y_test, y_val = train_test_split(\n", - " X_test, y_test, random_state=11, test_size=0.20) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_test.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_val.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.models import Sequential" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rnn = Sequential()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.layers import Dense, LSTM" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.layers import Embedding" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rnn.add(Embedding(input_dim=number_of_words, output_dim=128,\n", - " input_length=words_per_review))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rnn.add(LSTM(units=128, dropout=0.2, recurrent_dropout=0.2))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rnn.add(Dense(units=1, activation='sigmoid'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rnn.compile(optimizer='adam',\n", - " loss='binary_crossentropy', \n", - " metrics=['accuracy'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rnn.summary()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rnn.fit(X_train, y_train, epochs=5, batch_size=32, validation_data=(X_val, y_val))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "results = rnn.evaluate(X_test, y_test)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "results" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################" - ] - } - ], - "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.6.7" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch16/MNIST_CNN.ipynb b/examples/ch16/MNIST_CNN.ipynb deleted file mode 100644 index 92f57b5..0000000 --- a/examples/ch16/MNIST_CNN.ipynb +++ /dev/null @@ -1,548 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Section 16.7" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.datasets import mnist" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "(X_train, y_train), (X_test, y_test) = mnist.load_data()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_train.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "y_train.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_test.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "y_test.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import seaborn as sns" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sns.set(font_scale=2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "index = np.random.choice(np.arange(len(X_train)), 24, replace=False)\n", - "figure, axes = plt.subplots(nrows=4, ncols=6, figsize=(16, 9))\n", - "\n", - "for item in zip(axes.ravel(), X_train, y_train):\n", - " axes, image, target = item\n", - " axes.imshow(image, cmap=plt.cm.gray_r)\n", - " axes.set_xticks([]) # remove x-axis tick marks\n", - " axes.set_yticks([]) # remove y-axis tick marks\n", - " axes.set_title(target)\n", - "plt.tight_layout()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_train = X_train.reshape((60000, 28, 28, 1)) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_train.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_train = X_train.astype('float32') / 255" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_test = X_test.reshape((10000, 28, 28, 1))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_test.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "X_test = X_test.astype('float32') / 255" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.utils import to_categorical" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "y_train = to_categorical(y_train)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "y_train.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "y_train[0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "y_test = to_categorical(y_test)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "y_test.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.models import Sequential" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cnn = Sequential()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.layers import Conv2D, Dense, Flatten, MaxPooling2D" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cnn.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu', \n", - " input_shape=(28, 28, 1)))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cnn.add(MaxPooling2D(pool_size=(2, 2)))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cnn.add(Conv2D(filters=128, kernel_size=(3, 3), activation='relu'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cnn.add(MaxPooling2D(pool_size=(2, 2)))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cnn.add(Flatten())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cnn.add(Dense(units=128, activation='relu'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cnn.add(Dense(units=10, activation='softmax'))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cnn.summary()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.utils import plot_model\n", - "from IPython.display import Image\n", - "plot_model(cnn, to_file='convnet.png', show_shapes=True, \n", - " show_layer_names=True)\n", - "Image(filename='convnet.png') " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cnn.compile(optimizer='adam',\n", - " loss='categorical_crossentropy',\n", - " metrics=['accuracy'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cnn.fit(X_train, y_train, epochs=5, batch_size=64, validation_split=0.1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "loss, accuracy = cnn.evaluate(X_test, y_test)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "loss" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "accuracy" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "predictions = cnn.predict(X_test)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "y_test[0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for index, probability in enumerate(predictions[0]):\n", - " print(f'{index}: {probability:.10%}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "images = X_test.reshape((10000, 28, 28))\n", - "incorrect_predictions = []\n", - "\n", - "for i, (p, e) in enumerate(zip(predictions, y_test)):\n", - " predicted, expected = np.argmax(p), np.argmax(e)\n", - " \n", - " if predicted != expected:\n", - " incorrect_predictions.append((i, images[i], predicted, expected))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "len(incorrect_predictions)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "figure, axes = plt.subplots(nrows=4, ncols=6, figsize=(16, 12))\n", - "\n", - "for axes, item in zip(axes.ravel(), incorrect_predictions):\n", - " index, image, predicted, expected = item\n", - " axes.imshow(image, cmap=plt.cm.gray_r)\n", - " axes.set_xticks([]) # remove x-axis tick marks\n", - " axes.set_yticks([]) # remove y-axis tick marks\n", - " axes.set_title(f'index: {index}\\np: {predicted}; e: {expected}')\n", - "plt.tight_layout()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def display_probabilities(prediction):\n", - " for index, probability in enumerate(prediction):\n", - " print(f'{index}: {probability:.10%}')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "display_probabilities(predictions[495])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "display_probabilities(predictions[583])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "display_probabilities(predictions[625])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cnn.save('mnist_cnn.h5')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################" - ] - } - ], - "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.6.7" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch17/HadoopMapReduce/length_mapper.py b/examples/ch17/HadoopMapReduce/length_mapper.py deleted file mode 100755 index c10ad34..0000000 --- a/examples/ch17/HadoopMapReduce/length_mapper.py +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env python3 -# length_mapper.py -"""Maps lines of text to key-value pairs of word lengths and 1.""" -import sys - -def tokenize_input(): - """Split each line of standard input into a list of strings.""" - for line in sys.stdin: - yield line.split() - -# read each line in the the standard input and for every word -# produce a key-value pair containing the word, a tab and 1 -for line in tokenize_input(): - for word in line: - print(str(len(word)) + '\t1') - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch17/HadoopMapReduce/length_reducer.py b/examples/ch17/HadoopMapReduce/length_reducer.py deleted file mode 100755 index 75c934a..0000000 --- a/examples/ch17/HadoopMapReduce/length_reducer.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python3 -# length_reducer.py -"""Counts the number of words with each length.""" -import sys -from itertools import groupby -from operator import itemgetter - -def tokenize_input(): - """Split each line of standard input into a key and a value.""" - for line in sys.stdin: - yield line.strip().split('\t') - -# produce key-value pairs of word lengths and counts separated by tabs -for word_length, group in groupby(tokenize_input(), itemgetter(0)): - try: - total = sum(int(count) for word_length, count in group) - print(word_length + '\t' + str(total)) - except ValueError: - pass # ignore word if its count was not an integer - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch17/HadoopMapReduce/yarn.txt b/examples/ch17/HadoopMapReduce/yarn.txt deleted file mode 100755 index 1610444..0000000 --- a/examples/ch17/HadoopMapReduce/yarn.txt +++ /dev/null @@ -1 +0,0 @@ -yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-streaming.jar -D mapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator -D mapred.text.key.comparator.options=-n -files length_mapper.py,length_reducer.py -mapper length_mapper.py -reducer length_reducer.py -input /example/data/RomeoAndJuliet.txt -output /example/wordlengthsoutput \ No newline at end of file diff --git a/examples/ch17/README.txt b/examples/ch17/README.txt deleted file mode 100755 index bf10801..0000000 --- a/examples/ch17/README.txt +++ /dev/null @@ -1,5 +0,0 @@ -Unlike the prior chapters, any snippet files and notebook files -are located in the example folders mentioned in each section. - -Some examples were implemented only in notebooks because they -execute in cloud-based cluster environments. diff --git a/examples/ch17/SparkHashtagSummarizer/hashtagsummarizer.ipynb b/examples/ch17/SparkHashtagSummarizer/hashtagsummarizer.ipynb deleted file mode 100644 index 8dab19e..0000000 --- a/examples/ch17/SparkHashtagSummarizer/hashtagsummarizer.ipynb +++ /dev/null @@ -1,266 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Import this app's dependencies." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pyspark import SparkContext\n", - "from pyspark.streaming import StreamingContext\n", - "from pyspark.sql import Row, SparkSession\n", - "from IPython import display\n", - "import matplotlib.pyplot as plt\n", - "import seaborn as sns\n", - "%matplotlib inline " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "From the PySpark Streaming Programming Guide at https://spark.apache.org/docs/latest/streaming-programming-guide.html#dataframe-and-sql-operations. This is the recommended way for each cluster node to get the SparkSession." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def getSparkSessionInstance(sparkConf):\n", - " \"\"\"Spark Streaming Programming Guide's recommended method \n", - " for getting an existing SparkSession or creating a new one.\"\"\"\n", - " if (\"sparkSessionSingletonInstance\" not in globals()):\n", - " globals()[\"sparkSessionSingletonInstance\"] = SparkSession \\\n", - " .builder \\\n", - " .config(conf=sparkConf) \\\n", - " .getOrCreate()\n", - " return globals()[\"sparkSessionSingletonInstance\"]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Function to display a Seaborn barplot based on the Spark DataFrame it receives. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def display_barplot(spark_df, x, y, time, scale=2.0, size=(16, 9)):\n", - " \"\"\"Displays a Spark DataFrame's contents as a bar plot.\"\"\"\n", - " df = spark_df.toPandas()\n", - " \n", - " # remove prior graph when new one is ready to display\n", - " display.clear_output(wait=True) \n", - " print(f'TIME: {time}')\n", - " \n", - " # create and configure a Figure containing a Seaborn barplot \n", - " plt.figure(figsize=size)\n", - " sns.set(font_scale=scale)\n", - " barplot = sns.barplot(data=df, x=x, y=y, \n", - " palette=sns.color_palette('cool', 20))\n", - " \n", - " # rotate the x-axis labels 90 degrees for readability\n", - " for item in barplot.get_xticklabels():\n", - " item.set_rotation(90)\n", - " \n", - " plt.tight_layout()\n", - " plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Function count_tags is called for every RDD to summarize the hashtag counts in that RDD, add them to the existing totals, then display an updated top-20 barplot." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def count_tags(time, rdd):\n", - " \"\"\"Count hashtags and display top-20 in descending order.\"\"\"\n", - " try:\n", - " # get SparkSession\n", - " spark = getSparkSessionInstance(rdd.context.getConf()) \n", - " \n", - " # map hashtag string-count tuples to Rows \n", - " rows = rdd.map(\n", - " lambda tag: Row(hashtag=tag[0], total=tag[1])) \n", - " \n", - " # create a DataFrame from the Row objects\n", - " hashtags_df = spark.createDataFrame(rows)\n", - "\n", - " # create a temporary table view for use with Spark SQL\n", - " hashtags_df.createOrReplaceTempView('hashtags')\n", - " \n", - " # use Spark SQL to get the top 20 hashtags in descending order\n", - " top20_df = spark.sql(\n", - " \"\"\"select hashtag, total \n", - " from hashtags \n", - " order by total desc, hashtag asc \n", - " limit 20\"\"\")\n", - " display_barplot(top20_df, x='hashtag', y='total', time=time)\n", - " except Exception as e:\n", - " print(f'Exception: {e}')\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Main applications code sets up Spark streaming to read text from the `starttweetstream.py` script on localhost port 9876 and specifies how to process the tweets." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sc = SparkContext()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ssc = StreamingContext(sc, 10)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ssc.checkpoint('hashtagsummarizer_checkpoint') " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "stream = ssc.socketTextStream('localhost', 9876)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tokenized = stream.flatMap(lambda line: line.split())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "mapped = tokenized.map(lambda hashtag: (hashtag, 1))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "hashtag_counts = mapped.updateStateByKey(\n", - " lambda counts, prior_total: sum(counts) + (prior_total or 0)) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "hashtag_counts.foreachRDD(count_tags)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ssc.start() # start the Spark streaming" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#ssc.awaitTermination() # wait for the streaming to finish" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################" - ] - } - ], - "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.6.7" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch17/SparkHashtagSummarizer/keys.py b/examples/ch17/SparkHashtagSummarizer/keys.py deleted file mode 100755 index 4f26031..0000000 --- a/examples/ch17/SparkHashtagSummarizer/keys.py +++ /dev/null @@ -1,6 +0,0 @@ -consumer_key = 'YourConsumerKey' -consumer_secret = 'YourConsumerSecret' -access_token = 'YourAccessToken' -access_token_secret = 'YourAccessTokenSecret' - -mapquest_key = 'YourAPIKey' \ No newline at end of file diff --git a/examples/ch17/SparkHashtagSummarizer/starttweetstream.py b/examples/ch17/SparkHashtagSummarizer/starttweetstream.py deleted file mode 100644 index 2458f34..0000000 --- a/examples/ch17/SparkHashtagSummarizer/starttweetstream.py +++ /dev/null @@ -1,95 +0,0 @@ -# starttweetstream.py -"""Script to get tweets on topic(s) specified as script argument(s) - and send tweet text to a socket for processing by Spark.""" -import keys -import socket -import sys -import tweepy - -class TweetListener(tweepy.StreamListener): - """Handles incoming Tweet stream.""" - - def __init__(self, api, connection, limit=10000): - """Create instance variables for tracking number of tweets.""" - self.connection = connection - self.tweet_count = 0 - self.TWEET_LIMIT = limit # 10,000 by default - super().__init__(api) # call superclass's init - - def on_connect(self): - """Called when your connection attempt is successful, enabling - you to perform appropriate application tasks at that point.""" - print('Successfully connected to Twitter\n') - - def on_status(self, status): - """Called when Twitter pushes a new tweet to you.""" - # get the hashtags - hashtags = [] - - for hashtag_dict in status.entities['hashtags']: - hashtags.append(hashtag_dict['text'].lower()) - - hashtags_string = ' '.join(hashtags) + '\n' - print(f'Screen name: {status.user.screen_name}:') - print(f' Hashtags: {hashtags_string}') - self.tweet_count += 1 # track number of tweets processed - - try: - # send requires bytes, so encode the string in utf-8 format - self.connection.send(hashtags_string.encode('utf-8')) - except Exception as e: - print(f'Error: {e}') - - # if TWEET_LIMIT is reached, return False to terminate streaming - return self.tweet_count != self.TWEET_LIMIT - - def on_error(self, status): - print(status) - return True - -if __name__ == '__main__': - tweet_limit = int(sys.argv[1]) # get maximum number of tweets - client_socket = socket.socket() # create a socket - - # app will use localhost (this computer) port 9876 - client_socket.bind(('localhost', 9876)) - - print('Waiting for connection') - client_socket.listen() # wait for client to connect - - # when connection received, get connection/client address - connection, address = client_socket.accept() - print(f'Connection received from {address}') - - # configure Twitter access - auth = tweepy.OAuthHandler(keys.consumer_key, keys.consumer_secret) - auth.set_access_token(keys.access_token, keys.access_token_secret) - - # configure Tweepy to wait if Twitter rate limits are reached - api = tweepy.API(auth, wait_on_rate_limit=True, - wait_on_rate_limit_notify=True) - - # create the Stream - twitter_stream = tweepy.Stream(api.auth, - TweetListener(api, connection, tweet_limit)) - - # sys.argv[2] is the first search term - twitter_stream.filter(track=sys.argv[2:]) - - connection.close() - client_socket.close() - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch17/SparkWordCount/RomeoAndJuliet.txt b/examples/ch17/SparkWordCount/RomeoAndJuliet.txt deleted file mode 100755 index d769a53..0000000 --- a/examples/ch17/SparkWordCount/RomeoAndJuliet.txt +++ /dev/null @@ -1,5260 +0,0 @@ -THE TRAGEDY OF ROMEO AND JULIET - - - -by William Shakespeare - - - - - - -Contents - -THE PROLOGUE. - -ACT I -Scene I. A public place. -Scene II. A Street. -Scene III. Room in Capulet’s House. -Scene IV. A Street. -Scene V. A Hall in Capulet’s House. - - -ACT II -CHORUS. -Scene I. An open place adjoining Capulet’s Garden. -Scene II. Capulet’s Garden. -Scene III. Friar Lawrence’s Cell. -Scene IV. A Street. -Scene V. Capulet’s Garden. -Scene VI. Friar Lawrence’s Cell. - - -ACT III -Scene I. A public Place. -Scene II. A Room in Capulet’s House. -Scene III. Friar Lawrence’s cell. -Scene IV. A Room in Capulet’s House. -Scene V. An open Gallery to Juliet’s Chamber, overlooking the Garden. - - -ACT IV -Scene I. Friar Lawrence’s Cell. -Scene II. Hall in Capulet’s House. -Scene III. Juliet’s Chamber. -Scene IV. Hall in Capulet’s House. -Scene V. Juliet’s Chamber; Juliet on the bed. - - -ACT V -Scene I. Mantua. A Street. -Scene II. Friar Lawrence’s Cell. -Scene III. A churchyard; in it a Monument belonging to the Capulets. - - - - - Dramatis Personæ - -ESCALUS, Prince of Verona. -MERCUTIO, kinsman to the Prince, and friend to Romeo. -PARIS, a young Nobleman, kinsman to the Prince. -Page to Paris. - -MONTAGUE, head of a Veronese family at feud with the Capulets. -LADY MONTAGUE, wife to Montague. -ROMEO, son to Montague. -BENVOLIO, nephew to Montague, and friend to Romeo. -ABRAM, servant to Montague. -BALTHASAR, servant to Romeo. - -CAPULET, head of a Veronese family at feud with the Montagues. -LADY CAPULET, wife to Capulet. -JULIET, daughter to Capulet. -TYBALT, nephew to Lady Capulet. -CAPULET’S COUSIN, an old man. -NURSE to Juliet. -PETER, servant to Juliet’s Nurse. -SAMPSON, servant to Capulet. -GREGORY, servant to Capulet. -Servants. - -FRIAR LAWRENCE, a Franciscan. -FRIAR JOHN, of the same Order. -An Apothecary. -CHORUS. -Three Musicians. -An Officer. -Citizens of Verona; several Men and Women, relations to both houses; -Maskers, Guards, Watchmen and Attendants. - -SCENE. During the greater part of the Play in Verona; once, in the -Fifth Act, at Mantua. - - -THE PROLOGUE - - Enter Chorus. - -CHORUS. -Two households, both alike in dignity, -In fair Verona, where we lay our scene, -From ancient grudge break to new mutiny, -Where civil blood makes civil hands unclean. -From forth the fatal loins of these two foes -A pair of star-cross’d lovers take their life; -Whose misadventur’d piteous overthrows -Doth with their death bury their parents’ strife. -The fearful passage of their death-mark’d love, -And the continuance of their parents’ rage, -Which, but their children’s end, nought could remove, -Is now the two hours’ traffic of our stage; -The which, if you with patient ears attend, -What here shall miss, our toil shall strive to mend. - - [_Exit._] - - - -ACT I - -SCENE I. A public place. - - Enter Sampson and Gregory armed with swords and bucklers. - -SAMPSON. -Gregory, on my word, we’ll not carry coals. - -GREGORY. -No, for then we should be colliers. - -SAMPSON. -I mean, if we be in choler, we’ll draw. - -GREGORY. -Ay, while you live, draw your neck out o’ the collar. - -SAMPSON. -I strike quickly, being moved. - -GREGORY. -But thou art not quickly moved to strike. - -SAMPSON. -A dog of the house of Montague moves me. - -GREGORY. -To move is to stir; and to be valiant is to stand: therefore, if thou -art moved, thou runn’st away. - -SAMPSON. -A dog of that house shall move me to stand. -I will take the wall of any man or maid of Montague’s. - -GREGORY. -That shows thee a weak slave, for the weakest goes to the wall. - -SAMPSON. -True, and therefore women, being the weaker vessels, are ever thrust to -the wall: therefore I will push Montague’s men from the wall, and -thrust his maids to the wall. - -GREGORY. -The quarrel is between our masters and us their men. - -SAMPSON. -’Tis all one, I will show myself a tyrant: when I have fought with the -men I will be civil with the maids, I will cut off their heads. - -GREGORY. -The heads of the maids? - -SAMPSON. -Ay, the heads of the maids, or their maidenheads; take it in what sense -thou wilt. - -GREGORY. -They must take it in sense that feel it. - -SAMPSON. -Me they shall feel while I am able to stand: and ’tis known I am a -pretty piece of flesh. - -GREGORY. -’Tis well thou art not fish; if thou hadst, thou hadst been poor John. -Draw thy tool; here comes of the house of Montagues. - - Enter Abram and Balthasar. - -SAMPSON. -My naked weapon is out: quarrel, I will back thee. - -GREGORY. -How? Turn thy back and run? - -SAMPSON. -Fear me not. - -GREGORY. -No, marry; I fear thee! - -SAMPSON. -Let us take the law of our sides; let them begin. - -GREGORY. -I will frown as I pass by, and let them take it as they list. - -SAMPSON. -Nay, as they dare. I will bite my thumb at them, which is disgrace to -them if they bear it. - -ABRAM. -Do you bite your thumb at us, sir? - -SAMPSON. -I do bite my thumb, sir. - -ABRAM. -Do you bite your thumb at us, sir? - -SAMPSON. -Is the law of our side if I say ay? - -GREGORY. -No. - -SAMPSON. -No sir, I do not bite my thumb at you, sir; but I bite my thumb, sir. - -GREGORY. -Do you quarrel, sir? - -ABRAM. -Quarrel, sir? No, sir. - -SAMPSON. -But if you do, sir, am for you. I serve as good a man as you. - -ABRAM. -No better. - -SAMPSON. -Well, sir. - - Enter Benvolio. - -GREGORY. -Say better; here comes one of my master’s kinsmen. - -SAMPSON. -Yes, better, sir. - -ABRAM. -You lie. - -SAMPSON. -Draw, if you be men. Gregory, remember thy washing blow. - - [_They fight._] - -BENVOLIO. -Part, fools! put up your swords, you know not what you do. - - [_Beats down their swords._] - - Enter Tybalt. - -TYBALT. -What, art thou drawn among these heartless hinds? -Turn thee Benvolio, look upon thy death. - -BENVOLIO. -I do but keep the peace, put up thy sword, -Or manage it to part these men with me. - -TYBALT. -What, drawn, and talk of peace? I hate the word -As I hate hell, all Montagues, and thee: -Have at thee, coward. - - [_They fight._] - - Enter three or four Citizens with clubs. - -FIRST CITIZEN. -Clubs, bills and partisans! Strike! Beat them down! -Down with the Capulets! Down with the Montagues! - - Enter Capulet in his gown, and Lady Capulet. - -CAPULET. -What noise is this? Give me my long sword, ho! - -LADY CAPULET. -A crutch, a crutch! Why call you for a sword? - -CAPULET. -My sword, I say! Old Montague is come, -And flourishes his blade in spite of me. - - Enter Montague and his Lady Montague. - -MONTAGUE. -Thou villain Capulet! Hold me not, let me go. - -LADY MONTAGUE. -Thou shalt not stir one foot to seek a foe. - - Enter Prince Escalus, with Attendants. - -PRINCE. -Rebellious subjects, enemies to peace, -Profaners of this neighbour-stained steel,— -Will they not hear? What, ho! You men, you beasts, -That quench the fire of your pernicious rage -With purple fountains issuing from your veins, -On pain of torture, from those bloody hands -Throw your mistemper’d weapons to the ground -And hear the sentence of your moved prince. -Three civil brawls, bred of an airy word, -By thee, old Capulet, and Montague, -Have thrice disturb’d the quiet of our streets, -And made Verona’s ancient citizens -Cast by their grave beseeming ornaments, -To wield old partisans, in hands as old, -Canker’d with peace, to part your canker’d hate. -If ever you disturb our streets again, -Your lives shall pay the forfeit of the peace. -For this time all the rest depart away: -You, Capulet, shall go along with me, -And Montague, come you this afternoon, -To know our farther pleasure in this case, -To old Free-town, our common judgement-place. -Once more, on pain of death, all men depart. - - [_Exeunt Prince and Attendants; Capulet, Lady Capulet, Tybalt, - Citizens and Servants._] - -MONTAGUE. -Who set this ancient quarrel new abroach? -Speak, nephew, were you by when it began? - -BENVOLIO. -Here were the servants of your adversary -And yours, close fighting ere I did approach. -I drew to part them, in the instant came -The fiery Tybalt, with his sword prepar’d, -Which, as he breath’d defiance to my ears, -He swung about his head, and cut the winds, -Who nothing hurt withal, hiss’d him in scorn. -While we were interchanging thrusts and blows -Came more and more, and fought on part and part, -Till the Prince came, who parted either part. - -LADY MONTAGUE. -O where is Romeo, saw you him today? -Right glad I am he was not at this fray. - -BENVOLIO. -Madam, an hour before the worshipp’d sun -Peer’d forth the golden window of the east, -A troubled mind drave me to walk abroad, -Where underneath the grove of sycamore -That westward rooteth from this city side, -So early walking did I see your son. -Towards him I made, but he was ware of me, -And stole into the covert of the wood. -I, measuring his affections by my own, -Which then most sought where most might not be found, -Being one too many by my weary self, -Pursu’d my humour, not pursuing his, -And gladly shunn’d who gladly fled from me. - -MONTAGUE. -Many a morning hath he there been seen, -With tears augmenting the fresh morning’s dew, -Adding to clouds more clouds with his deep sighs; -But all so soon as the all-cheering sun -Should in the farthest east begin to draw -The shady curtains from Aurora’s bed, -Away from light steals home my heavy son, -And private in his chamber pens himself, -Shuts up his windows, locks fair daylight out -And makes himself an artificial night. -Black and portentous must this humour prove, -Unless good counsel may the cause remove. - -BENVOLIO. -My noble uncle, do you know the cause? - -MONTAGUE. -I neither know it nor can learn of him. - -BENVOLIO. -Have you importun’d him by any means? - -MONTAGUE. -Both by myself and many other friends; -But he, his own affections’ counsellor, -Is to himself—I will not say how true— -But to himself so secret and so close, -So far from sounding and discovery, -As is the bud bit with an envious worm -Ere he can spread his sweet leaves to the air, -Or dedicate his beauty to the sun. -Could we but learn from whence his sorrows grow, -We would as willingly give cure as know. - - Enter Romeo. - -BENVOLIO. -See, where he comes. So please you step aside; -I’ll know his grievance or be much denied. - -MONTAGUE. -I would thou wert so happy by thy stay -To hear true shrift. Come, madam, let’s away, - - [_Exeunt Montague and Lady Montague._] - -BENVOLIO. -Good morrow, cousin. - -ROMEO. -Is the day so young? - -BENVOLIO. -But new struck nine. - -ROMEO. -Ay me, sad hours seem long. -Was that my father that went hence so fast? - -BENVOLIO. -It was. What sadness lengthens Romeo’s hours? - -ROMEO. -Not having that which, having, makes them short. - -BENVOLIO. -In love? - -ROMEO. -Out. - -BENVOLIO. -Of love? - -ROMEO. -Out of her favour where I am in love. - -BENVOLIO. -Alas that love so gentle in his view, -Should be so tyrannous and rough in proof. - -ROMEO. -Alas that love, whose view is muffled still, -Should, without eyes, see pathways to his will! -Where shall we dine? O me! What fray was here? -Yet tell me not, for I have heard it all. -Here’s much to do with hate, but more with love: -Why, then, O brawling love! O loving hate! -O anything, of nothing first create! -O heavy lightness! serious vanity! -Misshapen chaos of well-seeming forms! -Feather of lead, bright smoke, cold fire, sick health! -Still-waking sleep, that is not what it is! -This love feel I, that feel no love in this. -Dost thou not laugh? - -BENVOLIO. -No coz, I rather weep. - -ROMEO. -Good heart, at what? - -BENVOLIO. -At thy good heart’s oppression. - -ROMEO. -Why such is love’s transgression. -Griefs of mine own lie heavy in my breast, -Which thou wilt propagate to have it prest -With more of thine. This love that thou hast shown -Doth add more grief to too much of mine own. -Love is a smoke made with the fume of sighs; -Being purg’d, a fire sparkling in lovers’ eyes; -Being vex’d, a sea nourish’d with lovers’ tears: -What is it else? A madness most discreet, -A choking gall, and a preserving sweet. -Farewell, my coz. - - [_Going._] - -BENVOLIO. -Soft! I will go along: -And if you leave me so, you do me wrong. - -ROMEO. -Tut! I have lost myself; I am not here. -This is not Romeo, he’s some other where. - -BENVOLIO. -Tell me in sadness who is that you love? - -ROMEO. -What, shall I groan and tell thee? - -BENVOLIO. -Groan! Why, no; but sadly tell me who. - -ROMEO. -Bid a sick man in sadness make his will, -A word ill urg’d to one that is so ill. -In sadness, cousin, I do love a woman. - -BENVOLIO. -I aim’d so near when I suppos’d you lov’d. - -ROMEO. -A right good markman, and she’s fair I love. - -BENVOLIO. -A right fair mark, fair coz, is soonest hit. - -ROMEO. -Well, in that hit you miss: she’ll not be hit -With Cupid’s arrow, she hath Dian’s wit; -And in strong proof of chastity well arm’d, -From love’s weak childish bow she lives uncharm’d. -She will not stay the siege of loving terms -Nor bide th’encounter of assailing eyes, -Nor ope her lap to saint-seducing gold: -O she’s rich in beauty, only poor -That when she dies, with beauty dies her store. - -BENVOLIO. -Then she hath sworn that she will still live chaste? - -ROMEO. -She hath, and in that sparing makes huge waste; -For beauty starv’d with her severity, -Cuts beauty off from all posterity. -She is too fair, too wise; wisely too fair, -To merit bliss by making me despair. -She hath forsworn to love, and in that vow -Do I live dead, that live to tell it now. - -BENVOLIO. -Be rul’d by me, forget to think of her. - -ROMEO. -O teach me how I should forget to think. - -BENVOLIO. -By giving liberty unto thine eyes; -Examine other beauties. - -ROMEO. -’Tis the way -To call hers, exquisite, in question more. -These happy masks that kiss fair ladies’ brows, -Being black, puts us in mind they hide the fair; -He that is strucken blind cannot forget -The precious treasure of his eyesight lost. -Show me a mistress that is passing fair, -What doth her beauty serve but as a note -Where I may read who pass’d that passing fair? -Farewell, thou canst not teach me to forget. - -BENVOLIO. -I’ll pay that doctrine, or else die in debt. - - [_Exeunt._] - -SCENE II. A Street. - - Enter Capulet, Paris and Servant. - -CAPULET. -But Montague is bound as well as I, -In penalty alike; and ’tis not hard, I think, -For men so old as we to keep the peace. - -PARIS. -Of honourable reckoning are you both, -And pity ’tis you liv’d at odds so long. -But now my lord, what say you to my suit? - -CAPULET. -But saying o’er what I have said before. -My child is yet a stranger in the world, -She hath not seen the change of fourteen years; -Let two more summers wither in their pride -Ere we may think her ripe to be a bride. - -PARIS. -Younger than she are happy mothers made. - -CAPULET. -And too soon marr’d are those so early made. -The earth hath swallowed all my hopes but she, -She is the hopeful lady of my earth: -But woo her, gentle Paris, get her heart, -My will to her consent is but a part; -And she agree, within her scope of choice -Lies my consent and fair according voice. -This night I hold an old accustom’d feast, -Whereto I have invited many a guest, -Such as I love, and you among the store, -One more, most welcome, makes my number more. -At my poor house look to behold this night -Earth-treading stars that make dark heaven light: -Such comfort as do lusty young men feel -When well apparell’d April on the heel -Of limping winter treads, even such delight -Among fresh female buds shall you this night -Inherit at my house. Hear all, all see, -And like her most whose merit most shall be: -Which, on more view of many, mine, being one, -May stand in number, though in reckoning none. -Come, go with me. Go, sirrah, trudge about -Through fair Verona; find those persons out -Whose names are written there, [_gives a paper_] and to them say, -My house and welcome on their pleasure stay. - - [_Exeunt Capulet and Paris._] - -SERVANT. -Find them out whose names are written here! It is written that the -shoemaker should meddle with his yard and the tailor with his last, the -fisher with his pencil, and the painter with his nets; but I am sent to -find those persons whose names are here writ, and can never find what -names the writing person hath here writ. I must to the learned. In good -time! - - Enter Benvolio and Romeo. - -BENVOLIO. -Tut, man, one fire burns out another’s burning, -One pain is lessen’d by another’s anguish; -Turn giddy, and be holp by backward turning; -One desperate grief cures with another’s languish: -Take thou some new infection to thy eye, -And the rank poison of the old will die. - -ROMEO. -Your plantain leaf is excellent for that. - -BENVOLIO. -For what, I pray thee? - -ROMEO. -For your broken shin. - -BENVOLIO. -Why, Romeo, art thou mad? - -ROMEO. -Not mad, but bound more than a madman is: -Shut up in prison, kept without my food, -Whipp’d and tormented and—God-den, good fellow. - -SERVANT. -God gi’ go-den. I pray, sir, can you read? - -ROMEO. -Ay, mine own fortune in my misery. - -SERVANT. -Perhaps you have learned it without book. -But I pray, can you read anything you see? - -ROMEO. -Ay, If I know the letters and the language. - -SERVANT. -Ye say honestly, rest you merry! - -ROMEO. -Stay, fellow; I can read. - - [_He reads the letter._] - -_Signior Martino and his wife and daughters; -County Anselmo and his beauteous sisters; -The lady widow of Utruvio; -Signior Placentio and his lovely nieces; -Mercutio and his brother Valentine; -Mine uncle Capulet, his wife, and daughters; -My fair niece Rosaline and Livia; -Signior Valentio and his cousin Tybalt; -Lucio and the lively Helena. _ - - -A fair assembly. [_Gives back the paper_] Whither should they come? - -SERVANT. -Up. - -ROMEO. -Whither to supper? - -SERVANT. -To our house. - -ROMEO. -Whose house? - -SERVANT. -My master’s. - -ROMEO. -Indeed I should have ask’d you that before. - -SERVANT. -Now I’ll tell you without asking. My master is the great rich Capulet, -and if you be not of the house of Montagues, I pray come and crush a -cup of wine. Rest you merry. - - [_Exit._] - -BENVOLIO. -At this same ancient feast of Capulet’s -Sups the fair Rosaline whom thou so lov’st; -With all the admired beauties of Verona. -Go thither and with unattainted eye, -Compare her face with some that I shall show, -And I will make thee think thy swan a crow. - -ROMEO. -When the devout religion of mine eye -Maintains such falsehood, then turn tears to fire; -And these who, often drown’d, could never die, -Transparent heretics, be burnt for liars. -One fairer than my love? The all-seeing sun -Ne’er saw her match since first the world begun. - -BENVOLIO. -Tut, you saw her fair, none else being by, -Herself pois’d with herself in either eye: -But in that crystal scales let there be weigh’d -Your lady’s love against some other maid -That I will show you shining at this feast, -And she shall scant show well that now shows best. - -ROMEO. -I’ll go along, no such sight to be shown, -But to rejoice in splendour of my own. - - [_Exeunt._] - -SCENE III. Room in Capulet’s House. - - Enter Lady Capulet and Nurse. - -LADY CAPULET. -Nurse, where’s my daughter? Call her forth to me. - -NURSE. -Now, by my maidenhead, at twelve year old, -I bade her come. What, lamb! What ladybird! -God forbid! Where’s this girl? What, Juliet! - - Enter Juliet. - -JULIET. -How now, who calls? - -NURSE. -Your mother. - -JULIET. -Madam, I am here. What is your will? - -LADY CAPULET. -This is the matter. Nurse, give leave awhile, -We must talk in secret. Nurse, come back again, -I have remember’d me, thou’s hear our counsel. -Thou knowest my daughter’s of a pretty age. - -NURSE. -Faith, I can tell her age unto an hour. - -LADY CAPULET. -She’s not fourteen. - -NURSE. -I’ll lay fourteen of my teeth, -And yet, to my teen be it spoken, I have but four, -She is not fourteen. How long is it now -To Lammas-tide? - -LADY CAPULET. -A fortnight and odd days. - -NURSE. -Even or odd, of all days in the year, -Come Lammas Eve at night shall she be fourteen. -Susan and she,—God rest all Christian souls!— -Were of an age. Well, Susan is with God; -She was too good for me. But as I said, -On Lammas Eve at night shall she be fourteen; -That shall she, marry; I remember it well. -’Tis since the earthquake now eleven years; -And she was wean’d,—I never shall forget it—, -Of all the days of the year, upon that day: -For I had then laid wormwood to my dug, -Sitting in the sun under the dovehouse wall; -My lord and you were then at Mantua: -Nay, I do bear a brain. But as I said, -When it did taste the wormwood on the nipple -Of my dug and felt it bitter, pretty fool, -To see it tetchy, and fall out with the dug! -Shake, quoth the dovehouse: ’twas no need, I trow, -To bid me trudge. -And since that time it is eleven years; -For then she could stand alone; nay, by th’rood -She could have run and waddled all about; -For even the day before she broke her brow, -And then my husband,—God be with his soul! -A was a merry man,—took up the child: -‘Yea,’ quoth he, ‘dost thou fall upon thy face? -Thou wilt fall backward when thou hast more wit; -Wilt thou not, Jule?’ and, by my holidame, -The pretty wretch left crying, and said ‘Ay’. -To see now how a jest shall come about. -I warrant, and I should live a thousand years, -I never should forget it. ‘Wilt thou not, Jule?’ quoth he; -And, pretty fool, it stinted, and said ‘Ay.’ - -LADY CAPULET. -Enough of this; I pray thee hold thy peace. - -NURSE. -Yes, madam, yet I cannot choose but laugh, -To think it should leave crying, and say ‘Ay’; -And yet I warrant it had upon it brow -A bump as big as a young cockerel’s stone; -A perilous knock, and it cried bitterly. -‘Yea,’ quoth my husband, ‘fall’st upon thy face? -Thou wilt fall backward when thou comest to age; -Wilt thou not, Jule?’ it stinted, and said ‘Ay’. - -JULIET. -And stint thou too, I pray thee, Nurse, say I. - -NURSE. -Peace, I have done. God mark thee to his grace -Thou wast the prettiest babe that e’er I nurs’d: -And I might live to see thee married once, I have my wish. - -LADY CAPULET. -Marry, that marry is the very theme -I came to talk of. Tell me, daughter Juliet, -How stands your disposition to be married? - -JULIET. -It is an honour that I dream not of. - -NURSE. -An honour! Were not I thine only nurse, -I would say thou hadst suck’d wisdom from thy teat. - -LADY CAPULET. -Well, think of marriage now: younger than you, -Here in Verona, ladies of esteem, -Are made already mothers. By my count -I was your mother much upon these years -That you are now a maid. Thus, then, in brief; -The valiant Paris seeks you for his love. - -NURSE. -A man, young lady! Lady, such a man -As all the world—why he’s a man of wax. - -LADY CAPULET. -Verona’s summer hath not such a flower. - -NURSE. -Nay, he’s a flower, in faith a very flower. - -LADY CAPULET. -What say you, can you love the gentleman? -This night you shall behold him at our feast; -Read o’er the volume of young Paris’ face, -And find delight writ there with beauty’s pen. -Examine every married lineament, -And see how one another lends content; -And what obscur’d in this fair volume lies, -Find written in the margent of his eyes. -This precious book of love, this unbound lover, -To beautify him, only lacks a cover: -The fish lives in the sea; and ’tis much pride -For fair without the fair within to hide. -That book in many’s eyes doth share the glory, -That in gold clasps locks in the golden story; -So shall you share all that he doth possess, -By having him, making yourself no less. - -NURSE. -No less, nay bigger. Women grow by men. - -LADY CAPULET. -Speak briefly, can you like of Paris’ love? - -JULIET. -I’ll look to like, if looking liking move: -But no more deep will I endart mine eye -Than your consent gives strength to make it fly. - - Enter a Servant. - -SERVANT. -Madam, the guests are come, supper served up, you called, my young lady -asked for, the Nurse cursed in the pantry, and everything in extremity. -I must hence to wait, I beseech you follow straight. - -LADY CAPULET. -We follow thee. - - [_Exit Servant._] - -Juliet, the County stays. - -NURSE. -Go, girl, seek happy nights to happy days. - - [_Exeunt._] - -SCENE IV. A Street. - - Enter Romeo, Mercutio, Benvolio, with five or six Maskers; - Torch-bearers and others. - -ROMEO. -What, shall this speech be spoke for our excuse? -Or shall we on without apology? - -BENVOLIO. -The date is out of such prolixity: -We’ll have no Cupid hoodwink’d with a scarf, -Bearing a Tartar’s painted bow of lath, -Scaring the ladies like a crow-keeper; -Nor no without-book prologue, faintly spoke -After the prompter, for our entrance: -But let them measure us by what they will, -We’ll measure them a measure, and be gone. - -ROMEO. -Give me a torch, I am not for this ambling; -Being but heavy I will bear the light. - -MERCUTIO. -Nay, gentle Romeo, we must have you dance. - -ROMEO. -Not I, believe me, you have dancing shoes, -With nimble soles, I have a soul of lead -So stakes me to the ground I cannot move. - -MERCUTIO. -You are a lover, borrow Cupid’s wings, -And soar with them above a common bound. - -ROMEO. -I am too sore enpierced with his shaft -To soar with his light feathers, and so bound, -I cannot bound a pitch above dull woe. -Under love’s heavy burden do I sink. - -MERCUTIO. -And, to sink in it, should you burden love; -Too great oppression for a tender thing. - -ROMEO. -Is love a tender thing? It is too rough, -Too rude, too boisterous; and it pricks like thorn. - -MERCUTIO. -If love be rough with you, be rough with love; -Prick love for pricking, and you beat love down. -Give me a case to put my visage in: [_Putting on a mask._] -A visor for a visor. What care I -What curious eye doth quote deformities? -Here are the beetle-brows shall blush for me. - -BENVOLIO. -Come, knock and enter; and no sooner in -But every man betake him to his legs. - -ROMEO. -A torch for me: let wantons, light of heart, -Tickle the senseless rushes with their heels; -For I am proverb’d with a grandsire phrase, -I’ll be a candle-holder and look on, -The game was ne’er so fair, and I am done. - -MERCUTIO. -Tut, dun’s the mouse, the constable’s own word: -If thou art dun, we’ll draw thee from the mire -Or save your reverence love, wherein thou stickest -Up to the ears. Come, we burn daylight, ho. - -ROMEO. -Nay, that’s not so. - -MERCUTIO. -I mean sir, in delay -We waste our lights in vain, light lights by day. -Take our good meaning, for our judgment sits -Five times in that ere once in our five wits. - -ROMEO. -And we mean well in going to this mask; -But ’tis no wit to go. - -MERCUTIO. -Why, may one ask? - -ROMEO. -I dreamt a dream tonight. - -MERCUTIO. -And so did I. - -ROMEO. -Well what was yours? - -MERCUTIO. -That dreamers often lie. - -ROMEO. -In bed asleep, while they do dream things true. - -MERCUTIO. -O, then, I see Queen Mab hath been with you. -She is the fairies’ midwife, and she comes -In shape no bigger than an agate-stone -On the fore-finger of an alderman, -Drawn with a team of little atomies -Over men’s noses as they lie asleep: -Her waggon-spokes made of long spinners’ legs; -The cover, of the wings of grasshoppers; -Her traces, of the smallest spider’s web; -The collars, of the moonshine’s watery beams; -Her whip of cricket’s bone; the lash, of film; -Her waggoner, a small grey-coated gnat, -Not half so big as a round little worm -Prick’d from the lazy finger of a maid: -Her chariot is an empty hazelnut, -Made by the joiner squirrel or old grub, -Time out o’ mind the fairies’ coachmakers. -And in this state she gallops night by night -Through lovers’ brains, and then they dream of love; -O’er courtiers’ knees, that dream on curtsies straight; -O’er lawyers’ fingers, who straight dream on fees; -O’er ladies’ lips, who straight on kisses dream, -Which oft the angry Mab with blisters plagues, -Because their breaths with sweetmeats tainted are: -Sometime she gallops o’er a courtier’s nose, -And then dreams he of smelling out a suit; -And sometime comes she with a tithe-pig’s tail, -Tickling a parson’s nose as a lies asleep, -Then dreams he of another benefice: -Sometime she driveth o’er a soldier’s neck, -And then dreams he of cutting foreign throats, -Of breaches, ambuscados, Spanish blades, -Of healths five fathom deep; and then anon -Drums in his ear, at which he starts and wakes; -And, being thus frighted, swears a prayer or two, -And sleeps again. This is that very Mab -That plats the manes of horses in the night; -And bakes the elf-locks in foul sluttish hairs, -Which, once untangled, much misfortune bodes: -This is the hag, when maids lie on their backs, -That presses them, and learns them first to bear, -Making them women of good carriage: -This is she,— - -ROMEO. -Peace, peace, Mercutio, peace, -Thou talk’st of nothing. - -MERCUTIO. -True, I talk of dreams, -Which are the children of an idle brain, -Begot of nothing but vain fantasy, -Which is as thin of substance as the air, -And more inconstant than the wind, who wooes -Even now the frozen bosom of the north, -And, being anger’d, puffs away from thence, -Turning his side to the dew-dropping south. - -BENVOLIO. -This wind you talk of blows us from ourselves: -Supper is done, and we shall come too late. - -ROMEO. -I fear too early: for my mind misgives -Some consequence yet hanging in the stars, -Shall bitterly begin his fearful date -With this night’s revels; and expire the term -Of a despised life, clos’d in my breast -By some vile forfeit of untimely death. -But he that hath the steerage of my course -Direct my suit. On, lusty gentlemen! - -BENVOLIO. -Strike, drum. - - [_Exeunt._] - -SCENE V. A Hall in Capulet’s House. - - Musicians waiting. Enter Servants. - -FIRST SERVANT. -Where’s Potpan, that he helps not to take away? -He shift a trencher! He scrape a trencher! - -SECOND SERVANT. -When good manners shall lie all in one or two men’s hands, and they -unwash’d too, ’tis a foul thing. - -FIRST SERVANT. -Away with the join-stools, remove the court-cupboard, look to the -plate. Good thou, save me a piece of marchpane; and as thou loves me, -let the porter let in Susan Grindstone and Nell. Antony and Potpan! - -SECOND SERVANT. -Ay, boy, ready. - -FIRST SERVANT. -You are looked for and called for, asked for and sought for, in the -great chamber. - -SECOND SERVANT. -We cannot be here and there too. Cheerly, boys. Be brisk awhile, and -the longer liver take all. - - [_Exeunt._] - - Enter Capulet, &c. with the Guests and Gentlewomen to the Maskers. - -CAPULET. -Welcome, gentlemen, ladies that have their toes -Unplagu’d with corns will have a bout with you. -Ah my mistresses, which of you all -Will now deny to dance? She that makes dainty, -She I’ll swear hath corns. Am I come near ye now? -Welcome, gentlemen! I have seen the day -That I have worn a visor, and could tell -A whispering tale in a fair lady’s ear, -Such as would please; ’tis gone, ’tis gone, ’tis gone, -You are welcome, gentlemen! Come, musicians, play. -A hall, a hall, give room! And foot it, girls. - - [_Music plays, and they dance._] - -More light, you knaves; and turn the tables up, -And quench the fire, the room is grown too hot. -Ah sirrah, this unlook’d-for sport comes well. -Nay sit, nay sit, good cousin Capulet, -For you and I are past our dancing days; -How long is’t now since last yourself and I -Were in a mask? - -CAPULET’S COUSIN. -By’r Lady, thirty years. - -CAPULET. -What, man, ’tis not so much, ’tis not so much: -’Tis since the nuptial of Lucentio, -Come Pentecost as quickly as it will, -Some five and twenty years; and then we mask’d. - -CAPULET’S COUSIN. -’Tis more, ’tis more, his son is elder, sir; -His son is thirty. - -CAPULET. -Will you tell me that? -His son was but a ward two years ago. - -ROMEO. -What lady is that, which doth enrich the hand -Of yonder knight? - -SERVANT. -I know not, sir. - -ROMEO. -O, she doth teach the torches to burn bright! -It seems she hangs upon the cheek of night -As a rich jewel in an Ethiop’s ear; -Beauty too rich for use, for earth too dear! -So shows a snowy dove trooping with crows -As yonder lady o’er her fellows shows. -The measure done, I’ll watch her place of stand, -And touching hers, make blessed my rude hand. -Did my heart love till now? Forswear it, sight! -For I ne’er saw true beauty till this night. - -TYBALT. -This by his voice, should be a Montague. -Fetch me my rapier, boy. What, dares the slave -Come hither, cover’d with an antic face, -To fleer and scorn at our solemnity? -Now by the stock and honour of my kin, -To strike him dead I hold it not a sin. - -CAPULET. -Why how now, kinsman! -Wherefore storm you so? - -TYBALT. -Uncle, this is a Montague, our foe; -A villain that is hither come in spite, -To scorn at our solemnity this night. - -CAPULET. -Young Romeo, is it? - -TYBALT. -’Tis he, that villain Romeo. - -CAPULET. -Content thee, gentle coz, let him alone, -A bears him like a portly gentleman; -And, to say truth, Verona brags of him -To be a virtuous and well-govern’d youth. -I would not for the wealth of all the town -Here in my house do him disparagement. -Therefore be patient, take no note of him, -It is my will; the which if thou respect, -Show a fair presence and put off these frowns, -An ill-beseeming semblance for a feast. - -TYBALT. -It fits when such a villain is a guest: -I’ll not endure him. - -CAPULET. -He shall be endur’d. -What, goodman boy! I say he shall, go to; -Am I the master here, or you? Go to. -You’ll not endure him! God shall mend my soul, -You’ll make a mutiny among my guests! -You will set cock-a-hoop, you’ll be the man! - -TYBALT. -Why, uncle, ’tis a shame. - -CAPULET. -Go to, go to! -You are a saucy boy. Is’t so, indeed? -This trick may chance to scathe you, I know what. -You must contrary me! Marry, ’tis time. -Well said, my hearts!—You are a princox; go: -Be quiet, or—More light, more light!—For shame! -I’ll make you quiet. What, cheerly, my hearts. - -TYBALT. -Patience perforce with wilful choler meeting -Makes my flesh tremble in their different greeting. -I will withdraw: but this intrusion shall, -Now seeming sweet, convert to bitter gall. - - [_Exit._] - -ROMEO. -[_To Juliet._] If I profane with my unworthiest hand -This holy shrine, the gentle sin is this, -My lips, two blushing pilgrims, ready stand -To smooth that rough touch with a tender kiss. - -JULIET. -Good pilgrim, you do wrong your hand too much, -Which mannerly devotion shows in this; -For saints have hands that pilgrims’ hands do touch, -And palm to palm is holy palmers’ kiss. - -ROMEO. -Have not saints lips, and holy palmers too? - -JULIET. -Ay, pilgrim, lips that they must use in prayer. - -ROMEO. -O, then, dear saint, let lips do what hands do: -They pray, grant thou, lest faith turn to despair. - -JULIET. -Saints do not move, though grant for prayers’ sake. - -ROMEO. -Then move not while my prayer’s effect I take. -Thus from my lips, by thine my sin is purg’d. -[_Kissing her._] - -JULIET. -Then have my lips the sin that they have took. - -ROMEO. -Sin from my lips? O trespass sweetly urg’d! -Give me my sin again. - -JULIET. -You kiss by the book. - -NURSE. -Madam, your mother craves a word with you. - -ROMEO. -What is her mother? - -NURSE. -Marry, bachelor, -Her mother is the lady of the house, -And a good lady, and a wise and virtuous. -I nurs’d her daughter that you talk’d withal. -I tell you, he that can lay hold of her -Shall have the chinks. - -ROMEO. -Is she a Capulet? -O dear account! My life is my foe’s debt. - -BENVOLIO. -Away, be gone; the sport is at the best. - -ROMEO. -Ay, so I fear; the more is my unrest. - -CAPULET. -Nay, gentlemen, prepare not to be gone, -We have a trifling foolish banquet towards. -Is it e’en so? Why then, I thank you all; -I thank you, honest gentlemen; good night. -More torches here! Come on then, let’s to bed. -Ah, sirrah, by my fay, it waxes late, -I’ll to my rest. - - [_Exeunt all but Juliet and Nurse._] - -JULIET. -Come hither, Nurse. What is yond gentleman? - -NURSE. -The son and heir of old Tiberio. - -JULIET. -What’s he that now is going out of door? - -NURSE. -Marry, that I think be young Petruchio. - -JULIET. -What’s he that follows here, that would not dance? - -NURSE. -I know not. - -JULIET. -Go ask his name. If he be married, -My grave is like to be my wedding bed. - -NURSE. -His name is Romeo, and a Montague, -The only son of your great enemy. - -JULIET. -My only love sprung from my only hate! -Too early seen unknown, and known too late! -Prodigious birth of love it is to me, -That I must love a loathed enemy. - -NURSE. -What’s this? What’s this? - -JULIET. -A rhyme I learn’d even now -Of one I danc’d withal. - - [_One calls within, ‘Juliet’._] - -NURSE. -Anon, anon! -Come let’s away, the strangers all are gone. - - [_Exeunt._] - - - -ACT II - - Enter Chorus. - -CHORUS. -Now old desire doth in his deathbed lie, -And young affection gapes to be his heir; -That fair for which love groan’d for and would die, -With tender Juliet match’d, is now not fair. -Now Romeo is belov’d, and loves again, -Alike bewitched by the charm of looks; -But to his foe suppos’d he must complain, -And she steal love’s sweet bait from fearful hooks: -Being held a foe, he may not have access -To breathe such vows as lovers use to swear; -And she as much in love, her means much less -To meet her new beloved anywhere. -But passion lends them power, time means, to meet, -Tempering extremities with extreme sweet. - - [_Exit._] - -SCENE I. An open place adjoining Capulet’s Garden. - - Enter Romeo. - -ROMEO. -Can I go forward when my heart is here? -Turn back, dull earth, and find thy centre out. - - [_He climbs the wall and leaps down within it._] - - Enter Benvolio and Mercutio. - -BENVOLIO. -Romeo! My cousin Romeo! Romeo! - -MERCUTIO. -He is wise, -And on my life hath stol’n him home to bed. - -BENVOLIO. -He ran this way, and leap’d this orchard wall: -Call, good Mercutio. - -MERCUTIO. -Nay, I’ll conjure too. -Romeo! Humours! Madman! Passion! Lover! -Appear thou in the likeness of a sigh, -Speak but one rhyme, and I am satisfied; -Cry but ‘Ah me!’ Pronounce but Love and dove; -Speak to my gossip Venus one fair word, -One nickname for her purblind son and heir, -Young Abraham Cupid, he that shot so trim -When King Cophetua lov’d the beggar-maid. -He heareth not, he stirreth not, he moveth not; -The ape is dead, and I must conjure him. -I conjure thee by Rosaline’s bright eyes, -By her high forehead and her scarlet lip, -By her fine foot, straight leg, and quivering thigh, -And the demesnes that there adjacent lie, -That in thy likeness thou appear to us. - -BENVOLIO. -An if he hear thee, thou wilt anger him. - -MERCUTIO. -This cannot anger him. ’Twould anger him -To raise a spirit in his mistress’ circle, -Of some strange nature, letting it there stand -Till she had laid it, and conjur’d it down; -That were some spite. My invocation -Is fair and honest, and, in his mistress’ name, -I conjure only but to raise up him. - -BENVOLIO. -Come, he hath hid himself among these trees -To be consorted with the humorous night. -Blind is his love, and best befits the dark. - -MERCUTIO. -If love be blind, love cannot hit the mark. -Now will he sit under a medlar tree, -And wish his mistress were that kind of fruit -As maids call medlars when they laugh alone. -O Romeo, that she were, O that she were -An open-arse and thou a poperin pear! -Romeo, good night. I’ll to my truckle-bed. -This field-bed is too cold for me to sleep. -Come, shall we go? - -BENVOLIO. -Go then; for ’tis in vain -To seek him here that means not to be found. - - [_Exeunt._] - -SCENE II. Capulet’s Garden. - - Enter Romeo. - -ROMEO. -He jests at scars that never felt a wound. - - Juliet appears above at a window. - -But soft, what light through yonder window breaks? -It is the east, and Juliet is the sun! -Arise fair sun and kill the envious moon, -Who is already sick and pale with grief, -That thou her maid art far more fair than she. -Be not her maid since she is envious; -Her vestal livery is but sick and green, -And none but fools do wear it; cast it off. -It is my lady, O it is my love! -O, that she knew she were! -She speaks, yet she says nothing. What of that? -Her eye discourses, I will answer it. -I am too bold, ’tis not to me she speaks. -Two of the fairest stars in all the heaven, -Having some business, do entreat her eyes -To twinkle in their spheres till they return. -What if her eyes were there, they in her head? -The brightness of her cheek would shame those stars, -As daylight doth a lamp; her eyes in heaven -Would through the airy region stream so bright -That birds would sing and think it were not night. -See how she leans her cheek upon her hand. -O that I were a glove upon that hand, -That I might touch that cheek. - -JULIET. -Ay me. - -ROMEO. -She speaks. -O speak again bright angel, for thou art -As glorious to this night, being o’er my head, -As is a winged messenger of heaven -Unto the white-upturned wondering eyes -Of mortals that fall back to gaze on him -When he bestrides the lazy-puffing clouds -And sails upon the bosom of the air. - -JULIET. -O Romeo, Romeo, wherefore art thou Romeo? -Deny thy father and refuse thy name. -Or if thou wilt not, be but sworn my love, -And I’ll no longer be a Capulet. - -ROMEO. -[_Aside._] Shall I hear more, or shall I speak at this? - -JULIET. -’Tis but thy name that is my enemy; -Thou art thyself, though not a Montague. -What’s Montague? It is nor hand nor foot, -Nor arm, nor face, nor any other part -Belonging to a man. O be some other name. -What’s in a name? That which we call a rose -By any other name would smell as sweet; -So Romeo would, were he not Romeo call’d, -Retain that dear perfection which he owes -Without that title. Romeo, doff thy name, -And for thy name, which is no part of thee, -Take all myself. - -ROMEO. -I take thee at thy word. -Call me but love, and I’ll be new baptis’d; -Henceforth I never will be Romeo. - -JULIET. -What man art thou that, thus bescreen’d in night -So stumblest on my counsel? - -ROMEO. -By a name -I know not how to tell thee who I am: -My name, dear saint, is hateful to myself, -Because it is an enemy to thee. -Had I it written, I would tear the word. - -JULIET. -My ears have yet not drunk a hundred words -Of thy tongue’s utterance, yet I know the sound. -Art thou not Romeo, and a Montague? - -ROMEO. -Neither, fair maid, if either thee dislike. - -JULIET. -How cam’st thou hither, tell me, and wherefore? -The orchard walls are high and hard to climb, -And the place death, considering who thou art, -If any of my kinsmen find thee here. - -ROMEO. -With love’s light wings did I o’erperch these walls, -For stony limits cannot hold love out, -And what love can do, that dares love attempt: -Therefore thy kinsmen are no stop to me. - -JULIET. -If they do see thee, they will murder thee. - -ROMEO. -Alack, there lies more peril in thine eye -Than twenty of their swords. Look thou but sweet, -And I am proof against their enmity. - -JULIET. -I would not for the world they saw thee here. - -ROMEO. -I have night’s cloak to hide me from their eyes, -And but thou love me, let them find me here. -My life were better ended by their hate -Than death prorogued, wanting of thy love. - -JULIET. -By whose direction found’st thou out this place? - -ROMEO. -By love, that first did prompt me to enquire; -He lent me counsel, and I lent him eyes. -I am no pilot; yet wert thou as far -As that vast shore wash’d with the farthest sea, -I should adventure for such merchandise. - -JULIET. -Thou knowest the mask of night is on my face, -Else would a maiden blush bepaint my cheek -For that which thou hast heard me speak tonight. -Fain would I dwell on form, fain, fain deny -What I have spoke; but farewell compliment. -Dost thou love me? I know thou wilt say Ay, -And I will take thy word. Yet, if thou swear’st, -Thou mayst prove false. At lovers’ perjuries, -They say Jove laughs. O gentle Romeo, -If thou dost love, pronounce it faithfully. -Or if thou thinkest I am too quickly won, -I’ll frown and be perverse, and say thee nay, -So thou wilt woo. But else, not for the world. -In truth, fair Montague, I am too fond; -And therefore thou mayst think my ’haviour light: -But trust me, gentleman, I’ll prove more true -Than those that have more cunning to be strange. -I should have been more strange, I must confess, -But that thou overheard’st, ere I was ’ware, -My true-love passion; therefore pardon me, -And not impute this yielding to light love, -Which the dark night hath so discovered. - -ROMEO. -Lady, by yonder blessed moon I vow, -That tips with silver all these fruit-tree tops,— - -JULIET. -O swear not by the moon, th’inconstant moon, -That monthly changes in her circled orb, -Lest that thy love prove likewise variable. - -ROMEO. -What shall I swear by? - -JULIET. -Do not swear at all. -Or if thou wilt, swear by thy gracious self, -Which is the god of my idolatry, -And I’ll believe thee. - -ROMEO. -If my heart’s dear love,— - -JULIET. -Well, do not swear. Although I joy in thee, -I have no joy of this contract tonight; -It is too rash, too unadvis’d, too sudden, -Too like the lightning, which doth cease to be -Ere one can say It lightens. Sweet, good night. -This bud of love, by summer’s ripening breath, -May prove a beauteous flower when next we meet. -Good night, good night. As sweet repose and rest -Come to thy heart as that within my breast. - -ROMEO. -O wilt thou leave me so unsatisfied? - -JULIET. -What satisfaction canst thou have tonight? - -ROMEO. -Th’exchange of thy love’s faithful vow for mine. - -JULIET. -I gave thee mine before thou didst request it; -And yet I would it were to give again. - -ROMEO. -Would’st thou withdraw it? For what purpose, love? - -JULIET. -But to be frank and give it thee again. -And yet I wish but for the thing I have; -My bounty is as boundless as the sea, -My love as deep; the more I give to thee, -The more I have, for both are infinite. -I hear some noise within. Dear love, adieu. -[_Nurse calls within._] -Anon, good Nurse!—Sweet Montague be true. -Stay but a little, I will come again. - - [_Exit._] - -ROMEO. -O blessed, blessed night. I am afeard, -Being in night, all this is but a dream, -Too flattering sweet to be substantial. - - Enter Juliet above. - -JULIET. -Three words, dear Romeo, and good night indeed. -If that thy bent of love be honourable, -Thy purpose marriage, send me word tomorrow, -By one that I’ll procure to come to thee, -Where and what time thou wilt perform the rite, -And all my fortunes at thy foot I’ll lay -And follow thee my lord throughout the world. - -NURSE. -[_Within._] Madam. - -JULIET. -I come, anon.— But if thou meanest not well, -I do beseech thee,— - -NURSE. -[_Within._] Madam. - -JULIET. -By and by I come— -To cease thy strife and leave me to my grief. -Tomorrow will I send. - -ROMEO. -So thrive my soul,— - -JULIET. -A thousand times good night. - - [_Exit._] - -ROMEO. -A thousand times the worse, to want thy light. -Love goes toward love as schoolboys from their books, -But love from love, towards school with heavy looks. - - [_Retiring slowly._] - - Re-enter Juliet, above. - -JULIET. -Hist! Romeo, hist! O for a falconer’s voice -To lure this tassel-gentle back again. -Bondage is hoarse and may not speak aloud, -Else would I tear the cave where Echo lies, -And make her airy tongue more hoarse than mine -With repetition of my Romeo’s name. - -ROMEO. -It is my soul that calls upon my name. -How silver-sweet sound lovers’ tongues by night, -Like softest music to attending ears. - -JULIET. -Romeo. - -ROMEO. -My nyas? - -JULIET. -What o’clock tomorrow -Shall I send to thee? - -ROMEO. -By the hour of nine. - -JULIET. -I will not fail. ’Tis twenty years till then. -I have forgot why I did call thee back. - -ROMEO. -Let me stand here till thou remember it. - -JULIET. -I shall forget, to have thee still stand there, -Remembering how I love thy company. - -ROMEO. -And I’ll still stay, to have thee still forget, -Forgetting any other home but this. - -JULIET. -’Tis almost morning; I would have thee gone, -And yet no farther than a wanton’s bird, -That lets it hop a little from her hand, -Like a poor prisoner in his twisted gyves, -And with a silk thread plucks it back again, -So loving-jealous of his liberty. - -ROMEO. -I would I were thy bird. - -JULIET. -Sweet, so would I: -Yet I should kill thee with much cherishing. -Good night, good night. Parting is such sweet sorrow -That I shall say good night till it be morrow. - - [_Exit._] - -ROMEO. -Sleep dwell upon thine eyes, peace in thy breast. -Would I were sleep and peace, so sweet to rest. -The grey-ey’d morn smiles on the frowning night, -Chequering the eastern clouds with streaks of light; -And darkness fleckled like a drunkard reels -From forth day’s pathway, made by Titan’s wheels -Hence will I to my ghostly Sire’s cell, -His help to crave and my dear hap to tell. - - [_Exit._] - -SCENE III. Friar Lawrence’s Cell. - - Enter Friar Lawrence with a basket. - -FRIAR LAWRENCE. -Now, ere the sun advance his burning eye, -The day to cheer, and night’s dank dew to dry, -I must upfill this osier cage of ours -With baleful weeds and precious-juiced flowers. -The earth that’s nature’s mother, is her tomb; -What is her burying grave, that is her womb: -And from her womb children of divers kind -We sucking on her natural bosom find. -Many for many virtues excellent, -None but for some, and yet all different. -O, mickle is the powerful grace that lies -In plants, herbs, stones, and their true qualities. -For naught so vile that on the earth doth live -But to the earth some special good doth give; -Nor aught so good but, strain’d from that fair use, -Revolts from true birth, stumbling on abuse. -Virtue itself turns vice being misapplied, -And vice sometime’s by action dignified. - - Enter Romeo. - -Within the infant rind of this weak flower -Poison hath residence, and medicine power: -For this, being smelt, with that part cheers each part; -Being tasted, slays all senses with the heart. -Two such opposed kings encamp them still -In man as well as herbs,—grace and rude will; -And where the worser is predominant, -Full soon the canker death eats up that plant. - -ROMEO. -Good morrow, father. - -FRIAR LAWRENCE. -Benedicite! -What early tongue so sweet saluteth me? -Young son, it argues a distemper’d head -So soon to bid good morrow to thy bed. -Care keeps his watch in every old man’s eye, -And where care lodges sleep will never lie; -But where unbruised youth with unstuff’d brain -Doth couch his limbs, there golden sleep doth reign. -Therefore thy earliness doth me assure -Thou art uprous’d with some distemperature; -Or if not so, then here I hit it right, -Our Romeo hath not been in bed tonight. - -ROMEO. -That last is true; the sweeter rest was mine. - -FRIAR LAWRENCE. -God pardon sin. Wast thou with Rosaline? - -ROMEO. -With Rosaline, my ghostly father? No. -I have forgot that name, and that name’s woe. - -FRIAR LAWRENCE. -That’s my good son. But where hast thou been then? - -ROMEO. -I’ll tell thee ere thou ask it me again. -I have been feasting with mine enemy, -Where on a sudden one hath wounded me -That’s by me wounded. Both our remedies -Within thy help and holy physic lies. -I bear no hatred, blessed man; for lo, -My intercession likewise steads my foe. - -FRIAR LAWRENCE. -Be plain, good son, and homely in thy drift; -Riddling confession finds but riddling shrift. - -ROMEO. -Then plainly know my heart’s dear love is set -On the fair daughter of rich Capulet. -As mine on hers, so hers is set on mine; -And all combin’d, save what thou must combine -By holy marriage. When, and where, and how -We met, we woo’d, and made exchange of vow, -I’ll tell thee as we pass; but this I pray, -That thou consent to marry us today. - -FRIAR LAWRENCE. -Holy Saint Francis! What a change is here! -Is Rosaline, that thou didst love so dear, -So soon forsaken? Young men’s love then lies -Not truly in their hearts, but in their eyes. -Jesu Maria, what a deal of brine -Hath wash’d thy sallow cheeks for Rosaline! -How much salt water thrown away in waste, -To season love, that of it doth not taste. -The sun not yet thy sighs from heaven clears, -Thy old groans yet ring in mine ancient ears. -Lo here upon thy cheek the stain doth sit -Of an old tear that is not wash’d off yet. -If ere thou wast thyself, and these woes thine, -Thou and these woes were all for Rosaline, -And art thou chang’d? Pronounce this sentence then, -Women may fall, when there’s no strength in men. - -ROMEO. -Thou chidd’st me oft for loving Rosaline. - -FRIAR LAWRENCE. -For doting, not for loving, pupil mine. - -ROMEO. -And bad’st me bury love. - -FRIAR LAWRENCE. -Not in a grave -To lay one in, another out to have. - -ROMEO. -I pray thee chide me not, her I love now -Doth grace for grace and love for love allow. -The other did not so. - -FRIAR LAWRENCE. -O, she knew well -Thy love did read by rote, that could not spell. -But come young waverer, come go with me, -In one respect I’ll thy assistant be; -For this alliance may so happy prove, -To turn your households’ rancour to pure love. - -ROMEO. -O let us hence; I stand on sudden haste. - -FRIAR LAWRENCE. -Wisely and slow; they stumble that run fast. - - [_Exeunt._] - -SCENE IV. A Street. - - Enter Benvolio and Mercutio. - -MERCUTIO. -Where the devil should this Romeo be? Came he not home tonight? - -BENVOLIO. -Not to his father’s; I spoke with his man. - -MERCUTIO. -Why, that same pale hard-hearted wench, that Rosaline, torments him so -that he will sure run mad. - -BENVOLIO. -Tybalt, the kinsman to old Capulet, hath sent a letter to his father’s -house. - -MERCUTIO. -A challenge, on my life. - -BENVOLIO. -Romeo will answer it. - -MERCUTIO. -Any man that can write may answer a letter. - -BENVOLIO. -Nay, he will answer the letter’s master, how he dares, being dared. - -MERCUTIO. -Alas poor Romeo, he is already dead, stabbed with a white wench’s black -eye; run through the ear with a love song, the very pin of his heart -cleft with the blind bow-boy’s butt-shaft. And is he a man to encounter -Tybalt? - -BENVOLIO. -Why, what is Tybalt? - -MERCUTIO. -More than Prince of cats. O, he’s the courageous captain of -compliments. He fights as you sing prick-song, keeps time, distance, -and proportion. He rests his minim rest, one, two, and the third in -your bosom: the very butcher of a silk button, a duellist, a duellist; -a gentleman of the very first house, of the first and second cause. Ah, -the immortal passado, the punto reverso, the hay. - -BENVOLIO. -The what? - -MERCUTIO. -The pox of such antic lisping, affecting phantasies; these new tuners -of accent. By Jesu, a very good blade, a very tall man, a very good -whore. Why, is not this a lamentable thing, grandsire, that we should -be thus afflicted with these strange flies, these fashion-mongers, -these pardon-me’s, who stand so much on the new form that they cannot -sit at ease on the old bench? O their bones, their bones! - - Enter Romeo. - -BENVOLIO. -Here comes Romeo, here comes Romeo! - -MERCUTIO. -Without his roe, like a dried herring. O flesh, flesh, how art thou -fishified! Now is he for the numbers that Petrarch flowed in. Laura, to -his lady, was but a kitchen wench,—marry, she had a better love to -berhyme her: Dido a dowdy; Cleopatra a gypsy; Helen and Hero hildings -and harlots; Thisbe a grey eye or so, but not to the purpose. Signior -Romeo, bonjour! There’s a French salutation to your French slop. You -gave us the counterfeit fairly last night. - -ROMEO. -Good morrow to you both. What counterfeit did I give you? - -MERCUTIO. -The slip sir, the slip; can you not conceive? - -ROMEO. -Pardon, good Mercutio, my business was great, and in such a case as -mine a man may strain courtesy. - -MERCUTIO. -That’s as much as to say, such a case as yours constrains a man to bow -in the hams. - -ROMEO. -Meaning, to curtsy. - -MERCUTIO. -Thou hast most kindly hit it. - -ROMEO. -A most courteous exposition. - -MERCUTIO. -Nay, I am the very pink of courtesy. - -ROMEO. -Pink for flower. - -MERCUTIO. -Right. - -ROMEO. -Why, then is my pump well flowered. - -MERCUTIO. -Sure wit, follow me this jest now, till thou hast worn out thy pump, -that when the single sole of it is worn, the jest may remain after the -wearing, solely singular. - -ROMEO. -O single-soled jest, solely singular for the singleness! - -MERCUTIO. -Come between us, good Benvolio; my wits faint. - -ROMEO. -Swits and spurs, swits and spurs; or I’ll cry a match. - -MERCUTIO. -Nay, if thy wits run the wild-goose chase, I am done. For thou hast -more of the wild-goose in one of thy wits, than I am sure, I have in my -whole five. Was I with you there for the goose? - -ROMEO. -Thou wast never with me for anything, when thou wast not there for the -goose. - -MERCUTIO. -I will bite thee by the ear for that jest. - -ROMEO. -Nay, good goose, bite not. - -MERCUTIO. -Thy wit is a very bitter sweeting, it is a most sharp sauce. - -ROMEO. -And is it not then well served in to a sweet goose? - -MERCUTIO. -O here’s a wit of cheveril, that stretches from an inch narrow to an -ell broad. - -ROMEO. -I stretch it out for that word broad, which added to the goose, proves -thee far and wide a broad goose. - -MERCUTIO. -Why, is not this better now than groaning for love? Now art thou -sociable, now art thou Romeo; not art thou what thou art, by art as -well as by nature. For this drivelling love is like a great natural, -that runs lolling up and down to hide his bauble in a hole. - -BENVOLIO. -Stop there, stop there. - -MERCUTIO. -Thou desirest me to stop in my tale against the hair. - -BENVOLIO. -Thou wouldst else have made thy tale large. - -MERCUTIO. -O, thou art deceived; I would have made it short, for I was come to the -whole depth of my tale, and meant indeed to occupy the argument no -longer. - - Enter Nurse and Peter. - -ROMEO. -Here’s goodly gear! -A sail, a sail! - -MERCUTIO. -Two, two; a shirt and a smock. - -NURSE. -Peter! - -PETER. -Anon. - -NURSE. -My fan, Peter. - -MERCUTIO. -Good Peter, to hide her face; for her fan’s the fairer face. - -NURSE. -God ye good morrow, gentlemen. - -MERCUTIO. -God ye good-den, fair gentlewoman. - -NURSE. -Is it good-den? - -MERCUTIO. -’Tis no less, I tell ye; for the bawdy hand of the dial is now upon the -prick of noon. - -NURSE. -Out upon you! What a man are you? - -ROMEO. -One, gentlewoman, that God hath made for himself to mar. - -NURSE. -By my troth, it is well said; for himself to mar, quoth a? Gentlemen, -can any of you tell me where I may find the young Romeo? - -ROMEO. -I can tell you: but young Romeo will be older when you have found him -than he was when you sought him. I am the youngest of that name, for -fault of a worse. - -NURSE. -You say well. - -MERCUTIO. -Yea, is the worst well? Very well took, i’faith; wisely, wisely. - -NURSE. -If you be he, sir, I desire some confidence with you. - -BENVOLIO. -She will endite him to some supper. - -MERCUTIO. -A bawd, a bawd, a bawd! So ho! - -ROMEO. -What hast thou found? - -MERCUTIO. -No hare, sir; unless a hare, sir, in a lenten pie, that is something -stale and hoar ere it be spent. -[_Sings._] - An old hare hoar, - And an old hare hoar, - Is very good meat in Lent; - But a hare that is hoar - Is too much for a score - When it hoars ere it be spent. -Romeo, will you come to your father’s? We’ll to dinner thither. - -ROMEO. -I will follow you. - -MERCUTIO. -Farewell, ancient lady; farewell, lady, lady, lady. - - [_Exeunt Mercutio and Benvolio._] - -NURSE. -I pray you, sir, what saucy merchant was this that was so full of his -ropery? - -ROMEO. -A gentleman, Nurse, that loves to hear himself talk, and will speak -more in a minute than he will stand to in a month. - -NURSE. -And a speak anything against me, I’ll take him down, and a were lustier -than he is, and twenty such Jacks. And if I cannot, I’ll find those -that shall. Scurvy knave! I am none of his flirt-gills; I am none of -his skains-mates.—And thou must stand by too and suffer every knave to -use me at his pleasure! - -PETER. -I saw no man use you at his pleasure; if I had, my weapon should -quickly have been out. I warrant you, I dare draw as soon as another -man, if I see occasion in a good quarrel, and the law on my side. - -NURSE. -Now, afore God, I am so vexed that every part about me quivers. Scurvy -knave. Pray you, sir, a word: and as I told you, my young lady bid me -enquire you out; what she bade me say, I will keep to myself. But first -let me tell ye, if ye should lead her in a fool’s paradise, as they -say, it were a very gross kind of behaviour, as they say; for the -gentlewoman is young. And therefore, if you should deal double with -her, truly it were an ill thing to be offered to any gentlewoman, and -very weak dealing. - -ROMEO. Nurse, commend me to thy lady and mistress. I protest unto -thee,— - -NURSE. -Good heart, and i’faith I will tell her as much. Lord, Lord, she will -be a joyful woman. - -ROMEO. -What wilt thou tell her, Nurse? Thou dost not mark me. - -NURSE. -I will tell her, sir, that you do protest, which, as I take it, is a -gentlemanlike offer. - -ROMEO. -Bid her devise -Some means to come to shrift this afternoon, -And there she shall at Friar Lawrence’ cell -Be shriv’d and married. Here is for thy pains. - -NURSE. -No truly, sir; not a penny. - -ROMEO. -Go to; I say you shall. - -NURSE. -This afternoon, sir? Well, she shall be there. - -ROMEO. -And stay, good Nurse, behind the abbey wall. -Within this hour my man shall be with thee, -And bring thee cords made like a tackled stair, -Which to the high topgallant of my joy -Must be my convoy in the secret night. -Farewell, be trusty, and I’ll quit thy pains; -Farewell; commend me to thy mistress. - -NURSE. -Now God in heaven bless thee. Hark you, sir. - -ROMEO. -What say’st thou, my dear Nurse? - -NURSE. -Is your man secret? Did you ne’er hear say, -Two may keep counsel, putting one away? - -ROMEO. -I warrant thee my man’s as true as steel. - -NURSE. -Well, sir, my mistress is the sweetest lady. Lord, Lord! When ’twas a -little prating thing,—O, there is a nobleman in town, one Paris, that -would fain lay knife aboard; but she, good soul, had as lief see a -toad, a very toad, as see him. I anger her sometimes, and tell her that -Paris is the properer man, but I’ll warrant you, when I say so, she -looks as pale as any clout in the versal world. Doth not rosemary and -Romeo begin both with a letter? - -ROMEO. -Ay, Nurse; what of that? Both with an R. - -NURSE. -Ah, mocker! That’s the dog’s name. R is for the—no, I know it begins -with some other letter, and she hath the prettiest sententious of it, -of you and rosemary, that it would do you good to hear it. - -ROMEO. -Commend me to thy lady. - -NURSE. -Ay, a thousand times. Peter! - - [_Exit Romeo._] - -PETER. -Anon. - -NURSE. -Before and apace. - - [_Exeunt._] - -SCENE V. Capulet’s Garden. - - Enter Juliet. - -JULIET. -The clock struck nine when I did send the Nurse, -In half an hour she promised to return. -Perchance she cannot meet him. That’s not so. -O, she is lame. Love’s heralds should be thoughts, -Which ten times faster glides than the sun’s beams, -Driving back shadows over lowering hills: -Therefore do nimble-pinion’d doves draw love, -And therefore hath the wind-swift Cupid wings. -Now is the sun upon the highmost hill -Of this day’s journey, and from nine till twelve -Is three long hours, yet she is not come. -Had she affections and warm youthful blood, -She’d be as swift in motion as a ball; -My words would bandy her to my sweet love, -And his to me. -But old folks, many feign as they were dead; -Unwieldy, slow, heavy and pale as lead. - - Enter Nurse and Peter. - -O God, she comes. O honey Nurse, what news? -Hast thou met with him? Send thy man away. - -NURSE. -Peter, stay at the gate. - - [_Exit Peter._] - -JULIET. -Now, good sweet Nurse,—O Lord, why look’st thou sad? -Though news be sad, yet tell them merrily; -If good, thou sham’st the music of sweet news -By playing it to me with so sour a face. - -NURSE. -I am aweary, give me leave awhile; -Fie, how my bones ache! What a jaunt have I had! - -JULIET. -I would thou hadst my bones, and I thy news: -Nay come, I pray thee speak; good, good Nurse, speak. - -NURSE. -Jesu, what haste? Can you not stay a while? Do you not see that I am -out of breath? - -JULIET. -How art thou out of breath, when thou hast breath -To say to me that thou art out of breath? -The excuse that thou dost make in this delay -Is longer than the tale thou dost excuse. -Is thy news good or bad? Answer to that; -Say either, and I’ll stay the circumstance. -Let me be satisfied, is’t good or bad? - -NURSE. -Well, you have made a simple choice; you know not how to choose a man. -Romeo? No, not he. Though his face be better than any man’s, yet his -leg excels all men’s, and for a hand and a foot, and a body, though -they be not to be talked on, yet they are past compare. He is not the -flower of courtesy, but I’ll warrant him as gentle as a lamb. Go thy -ways, wench, serve God. What, have you dined at home? - -JULIET. -No, no. But all this did I know before. -What says he of our marriage? What of that? - -NURSE. -Lord, how my head aches! What a head have I! -It beats as it would fall in twenty pieces. -My back o’ t’other side,—O my back, my back! -Beshrew your heart for sending me about -To catch my death with jauncing up and down. - -JULIET. -I’faith, I am sorry that thou art not well. -Sweet, sweet, sweet Nurse, tell me, what says my love? - -NURSE. -Your love says like an honest gentleman, -And a courteous, and a kind, and a handsome, -And I warrant a virtuous,—Where is your mother? - -JULIET. -Where is my mother? Why, she is within. -Where should she be? How oddly thou repliest. -‘Your love says, like an honest gentleman, -‘Where is your mother?’ - -NURSE. -O God’s lady dear, -Are you so hot? Marry, come up, I trow. -Is this the poultice for my aching bones? -Henceforward do your messages yourself. - -JULIET. -Here’s such a coil. Come, what says Romeo? - -NURSE. -Have you got leave to go to shrift today? - -JULIET. -I have. - -NURSE. -Then hie you hence to Friar Lawrence’ cell; -There stays a husband to make you a wife. -Now comes the wanton blood up in your cheeks, -They’ll be in scarlet straight at any news. -Hie you to church. I must another way, -To fetch a ladder by the which your love -Must climb a bird’s nest soon when it is dark. -I am the drudge, and toil in your delight; -But you shall bear the burden soon at night. -Go. I’ll to dinner; hie you to the cell. - -JULIET. -Hie to high fortune! Honest Nurse, farewell. - - [_Exeunt._] - -SCENE VI. Friar Lawrence’s Cell. - - Enter Friar Lawrence and Romeo. - -FRIAR LAWRENCE. -So smile the heavens upon this holy act -That after-hours with sorrow chide us not. - -ROMEO. -Amen, amen, but come what sorrow can, -It cannot countervail the exchange of joy -That one short minute gives me in her sight. -Do thou but close our hands with holy words, -Then love-devouring death do what he dare, -It is enough I may but call her mine. - -FRIAR LAWRENCE. -These violent delights have violent ends, -And in their triumph die; like fire and powder, -Which as they kiss consume. The sweetest honey -Is loathsome in his own deliciousness, -And in the taste confounds the appetite. -Therefore love moderately: long love doth so; -Too swift arrives as tardy as too slow. - - Enter Juliet. - -Here comes the lady. O, so light a foot -Will ne’er wear out the everlasting flint. -A lover may bestride the gossamers -That idles in the wanton summer air -And yet not fall; so light is vanity. - -JULIET. -Good even to my ghostly confessor. - -FRIAR LAWRENCE. -Romeo shall thank thee, daughter, for us both. - -JULIET. -As much to him, else is his thanks too much. - -ROMEO. -Ah, Juliet, if the measure of thy joy -Be heap’d like mine, and that thy skill be more -To blazon it, then sweeten with thy breath -This neighbour air, and let rich music’s tongue -Unfold the imagin’d happiness that both -Receive in either by this dear encounter. - -JULIET. -Conceit more rich in matter than in words, -Brags of his substance, not of ornament. -They are but beggars that can count their worth; -But my true love is grown to such excess, -I cannot sum up sum of half my wealth. - -FRIAR LAWRENCE. -Come, come with me, and we will make short work, -For, by your leaves, you shall not stay alone -Till holy church incorporate two in one. - - [_Exeunt._] - - - -ACT III - -SCENE I. A public Place. - - Enter Mercutio, Benvolio, Page and Servants. - -BENVOLIO. -I pray thee, good Mercutio, let’s retire: -The day is hot, the Capulets abroad, -And if we meet, we shall not scape a brawl, -For now these hot days, is the mad blood stirring. - -MERCUTIO. -Thou art like one of these fellows that, when he enters the confines of -a tavern, claps me his sword upon the table, and says ‘God send me no -need of thee!’ and by the operation of the second cup draws him on the -drawer, when indeed there is no need. - -BENVOLIO. -Am I like such a fellow? - -MERCUTIO. -Come, come, thou art as hot a Jack in thy mood as any in Italy; and as -soon moved to be moody, and as soon moody to be moved. - -BENVOLIO. -And what to? - -MERCUTIO. -Nay, an there were two such, we should have none shortly, for one would -kill the other. Thou? Why, thou wilt quarrel with a man that hath a -hair more or a hair less in his beard than thou hast. Thou wilt quarrel -with a man for cracking nuts, having no other reason but because thou -hast hazel eyes. What eye but such an eye would spy out such a quarrel? -Thy head is as full of quarrels as an egg is full of meat, and yet thy -head hath been beaten as addle as an egg for quarrelling. Thou hast -quarrelled with a man for coughing in the street, because he hath -wakened thy dog that hath lain asleep in the sun. Didst thou not fall -out with a tailor for wearing his new doublet before Easter? with -another for tying his new shoes with an old riband? And yet thou wilt -tutor me from quarrelling! - -BENVOLIO. -And I were so apt to quarrel as thou art, any man should buy the fee -simple of my life for an hour and a quarter. - -MERCUTIO. -The fee simple! O simple! - - Enter Tybalt and others. - -BENVOLIO. -By my head, here comes the Capulets. - -MERCUTIO. -By my heel, I care not. - -TYBALT. -Follow me close, for I will speak to them. -Gentlemen, good-den: a word with one of you. - -MERCUTIO. -And but one word with one of us? Couple it with something; make it a -word and a blow. - -TYBALT. -You shall find me apt enough to that, sir, and you will give me -occasion. - -MERCUTIO. -Could you not take some occasion without giving? - -TYBALT. -Mercutio, thou consortest with Romeo. - -MERCUTIO. -Consort? What, dost thou make us minstrels? And thou make minstrels of -us, look to hear nothing but discords. Here’s my fiddlestick, here’s -that shall make you dance. Zounds, consort! - -BENVOLIO. -We talk here in the public haunt of men. -Either withdraw unto some private place, -And reason coldly of your grievances, -Or else depart; here all eyes gaze on us. - -MERCUTIO. -Men’s eyes were made to look, and let them gaze. -I will not budge for no man’s pleasure, I. - - Enter Romeo. - -TYBALT. -Well, peace be with you, sir, here comes my man. - -MERCUTIO. -But I’ll be hanged, sir, if he wear your livery. -Marry, go before to field, he’ll be your follower; -Your worship in that sense may call him man. - -TYBALT. -Romeo, the love I bear thee can afford -No better term than this: Thou art a villain. - -ROMEO. -Tybalt, the reason that I have to love thee -Doth much excuse the appertaining rage -To such a greeting. Villain am I none; -Therefore farewell; I see thou know’st me not. - -TYBALT. -Boy, this shall not excuse the injuries -That thou hast done me, therefore turn and draw. - -ROMEO. -I do protest I never injur’d thee, -But love thee better than thou canst devise -Till thou shalt know the reason of my love. -And so good Capulet, which name I tender -As dearly as mine own, be satisfied. - -MERCUTIO. -O calm, dishonourable, vile submission! -[_Draws._] Alla stoccata carries it away. -Tybalt, you rat-catcher, will you walk? - -TYBALT. -What wouldst thou have with me? - -MERCUTIO. -Good King of Cats, nothing but one of your nine lives; that I mean to -make bold withal, and, as you shall use me hereafter, dry-beat the rest -of the eight. Will you pluck your sword out of his pilcher by the ears? -Make haste, lest mine be about your ears ere it be out. - -TYBALT. -[_Drawing._] I am for you. - -ROMEO. -Gentle Mercutio, put thy rapier up. - -MERCUTIO. -Come, sir, your passado. - - [_They fight._] - -ROMEO. -Draw, Benvolio; beat down their weapons. -Gentlemen, for shame, forbear this outrage, -Tybalt, Mercutio, the Prince expressly hath -Forbid this bandying in Verona streets. -Hold, Tybalt! Good Mercutio! - - [_Exeunt Tybalt with his Partizans._] - -MERCUTIO. -I am hurt. -A plague o’ both your houses. I am sped. -Is he gone, and hath nothing? - -BENVOLIO. -What, art thou hurt? - -MERCUTIO. -Ay, ay, a scratch, a scratch. Marry, ’tis enough. -Where is my page? Go villain, fetch a surgeon. - - [_Exit Page._] - -ROMEO. -Courage, man; the hurt cannot be much. - -MERCUTIO. -No, ’tis not so deep as a well, nor so wide as a church door, but ’tis -enough, ’twill serve. Ask for me tomorrow, and you shall find me a -grave man. I am peppered, I warrant, for this world. A plague o’ both -your houses. Zounds, a dog, a rat, a mouse, a cat, to scratch a man to -death. A braggart, a rogue, a villain, that fights by the book of -arithmetic!—Why the devil came you between us? I was hurt under your -arm. - -ROMEO. -I thought all for the best. - -MERCUTIO. -Help me into some house, Benvolio, -Or I shall faint. A plague o’ both your houses. -They have made worms’ meat of me. -I have it, and soundly too. Your houses! - - [_Exeunt Mercutio and Benvolio._] - -ROMEO. -This gentleman, the Prince’s near ally, -My very friend, hath got his mortal hurt -In my behalf; my reputation stain’d -With Tybalt’s slander,—Tybalt, that an hour -Hath been my cousin. O sweet Juliet, -Thy beauty hath made me effeminate -And in my temper soften’d valour’s steel. - - Re-enter Benvolio. - -BENVOLIO. -O Romeo, Romeo, brave Mercutio’s dead, -That gallant spirit hath aspir’d the clouds, -Which too untimely here did scorn the earth. - -ROMEO. -This day’s black fate on mo days doth depend; -This but begins the woe others must end. - - Re-enter Tybalt. - -BENVOLIO. -Here comes the furious Tybalt back again. - -ROMEO. -Again in triumph, and Mercutio slain? -Away to heaven respective lenity, -And fire-ey’d fury be my conduct now! -Now, Tybalt, take the ‘villain’ back again -That late thou gav’st me, for Mercutio’s soul -Is but a little way above our heads, -Staying for thine to keep him company. -Either thou or I, or both, must go with him. - -TYBALT. -Thou wretched boy, that didst consort him here, -Shalt with him hence. - -ROMEO. -This shall determine that. - - [_They fight; Tybalt falls._] - -BENVOLIO. -Romeo, away, be gone! -The citizens are up, and Tybalt slain. -Stand not amaz’d. The Prince will doom thee death -If thou art taken. Hence, be gone, away! - -ROMEO. -O, I am fortune’s fool! - -BENVOLIO. -Why dost thou stay? - - [_Exit Romeo._] - - Enter Citizens. - -FIRST CITIZEN. -Which way ran he that kill’d Mercutio? -Tybalt, that murderer, which way ran he? - -BENVOLIO. -There lies that Tybalt. - -FIRST CITIZEN. -Up, sir, go with me. -I charge thee in the Prince’s name obey. - - Enter Prince, attended; Montague, Capulet, their Wives and others. - -PRINCE. -Where are the vile beginners of this fray? - -BENVOLIO. -O noble Prince, I can discover all -The unlucky manage of this fatal brawl. -There lies the man, slain by young Romeo, -That slew thy kinsman, brave Mercutio. - -LADY CAPULET. -Tybalt, my cousin! O my brother’s child! -O Prince! O husband! O, the blood is spill’d -Of my dear kinsman! Prince, as thou art true, -For blood of ours shed blood of Montague. -O cousin, cousin. - -PRINCE. -Benvolio, who began this bloody fray? - -BENVOLIO. -Tybalt, here slain, whom Romeo’s hand did slay; -Romeo, that spoke him fair, bid him bethink -How nice the quarrel was, and urg’d withal -Your high displeasure. All this uttered -With gentle breath, calm look, knees humbly bow’d -Could not take truce with the unruly spleen -Of Tybalt, deaf to peace, but that he tilts -With piercing steel at bold Mercutio’s breast, -Who, all as hot, turns deadly point to point, -And, with a martial scorn, with one hand beats -Cold death aside, and with the other sends -It back to Tybalt, whose dexterity -Retorts it. Romeo he cries aloud, -‘Hold, friends! Friends, part!’ and swifter than his tongue, -His agile arm beats down their fatal points, -And ’twixt them rushes; underneath whose arm -An envious thrust from Tybalt hit the life -Of stout Mercutio, and then Tybalt fled. -But by and by comes back to Romeo, -Who had but newly entertain’d revenge, -And to’t they go like lightning; for, ere I -Could draw to part them was stout Tybalt slain; -And as he fell did Romeo turn and fly. -This is the truth, or let Benvolio die. - -LADY CAPULET. -He is a kinsman to the Montague. -Affection makes him false, he speaks not true. -Some twenty of them fought in this black strife, -And all those twenty could but kill one life. -I beg for justice, which thou, Prince, must give; -Romeo slew Tybalt, Romeo must not live. - -PRINCE. -Romeo slew him, he slew Mercutio. -Who now the price of his dear blood doth owe? - -MONTAGUE. -Not Romeo, Prince, he was Mercutio’s friend; -His fault concludes but what the law should end, -The life of Tybalt. - -PRINCE. -And for that offence -Immediately we do exile him hence. -I have an interest in your hate’s proceeding, -My blood for your rude brawls doth lie a-bleeding. -But I’ll amerce you with so strong a fine -That you shall all repent the loss of mine. -I will be deaf to pleading and excuses; -Nor tears nor prayers shall purchase out abuses. -Therefore use none. Let Romeo hence in haste, -Else, when he is found, that hour is his last. -Bear hence this body, and attend our will. -Mercy but murders, pardoning those that kill. - - [_Exeunt._] - -SCENE II. A Room in Capulet’s House. - - Enter Juliet. - -JULIET. -Gallop apace, you fiery-footed steeds, -Towards Phoebus’ lodging. Such a waggoner -As Phaeton would whip you to the west -And bring in cloudy night immediately. -Spread thy close curtain, love-performing night, -That runaway’s eyes may wink, and Romeo -Leap to these arms, untalk’d of and unseen. -Lovers can see to do their amorous rites -By their own beauties: or, if love be blind, -It best agrees with night. Come, civil night, -Thou sober-suited matron, all in black, -And learn me how to lose a winning match, -Play’d for a pair of stainless maidenhoods. -Hood my unmann’d blood, bating in my cheeks, -With thy black mantle, till strange love, grow bold, -Think true love acted simple modesty. -Come, night, come Romeo; come, thou day in night; -For thou wilt lie upon the wings of night -Whiter than new snow upon a raven’s back. -Come gentle night, come loving black-brow’d night, -Give me my Romeo, and when I shall die, -Take him and cut him out in little stars, -And he will make the face of heaven so fine -That all the world will be in love with night, -And pay no worship to the garish sun. -O, I have bought the mansion of a love, -But not possess’d it; and though I am sold, -Not yet enjoy’d. So tedious is this day -As is the night before some festival -To an impatient child that hath new robes -And may not wear them. O, here comes my Nurse, -And she brings news, and every tongue that speaks -But Romeo’s name speaks heavenly eloquence. - - Enter Nurse, with cords. - -Now, Nurse, what news? What hast thou there? -The cords that Romeo bid thee fetch? - -NURSE. -Ay, ay, the cords. - - [_Throws them down._] - -JULIET. -Ay me, what news? Why dost thou wring thy hands? - -NURSE. -Ah, well-a-day, he’s dead, he’s dead, he’s dead! -We are undone, lady, we are undone. -Alack the day, he’s gone, he’s kill’d, he’s dead. - -JULIET. -Can heaven be so envious? - -NURSE. -Romeo can, -Though heaven cannot. O Romeo, Romeo. -Who ever would have thought it? Romeo! - -JULIET. -What devil art thou, that dost torment me thus? -This torture should be roar’d in dismal hell. -Hath Romeo slain himself? Say thou but Ay, -And that bare vowel I shall poison more -Than the death-darting eye of cockatrice. -I am not I if there be such an I; -Or those eyes shut that make thee answer Ay. -If he be slain, say Ay; or if not, No. -Brief sounds determine of my weal or woe. - -NURSE. -I saw the wound, I saw it with mine eyes, -God save the mark!—here on his manly breast. -A piteous corse, a bloody piteous corse; -Pale, pale as ashes, all bedaub’d in blood, -All in gore-blood. I swounded at the sight. - -JULIET. -O, break, my heart. Poor bankrout, break at once. -To prison, eyes; ne’er look on liberty. -Vile earth to earth resign; end motion here, -And thou and Romeo press one heavy bier. - -NURSE. -O Tybalt, Tybalt, the best friend I had. -O courteous Tybalt, honest gentleman! -That ever I should live to see thee dead. - -JULIET. -What storm is this that blows so contrary? -Is Romeo slaughter’d and is Tybalt dead? -My dearest cousin, and my dearer lord? -Then dreadful trumpet sound the general doom, -For who is living, if those two are gone? - -NURSE. -Tybalt is gone, and Romeo banished, -Romeo that kill’d him, he is banished. - -JULIET. -O God! Did Romeo’s hand shed Tybalt’s blood? - -NURSE. -It did, it did; alas the day, it did. - -JULIET. -O serpent heart, hid with a flowering face! -Did ever dragon keep so fair a cave? -Beautiful tyrant, fiend angelical, -Dove-feather’d raven, wolvish-ravening lamb! -Despised substance of divinest show! -Just opposite to what thou justly seem’st, -A damned saint, an honourable villain! -O nature, what hadst thou to do in hell -When thou didst bower the spirit of a fiend -In mortal paradise of such sweet flesh? -Was ever book containing such vile matter -So fairly bound? O, that deceit should dwell -In such a gorgeous palace. - -NURSE. -There’s no trust, -No faith, no honesty in men. All perjur’d, -All forsworn, all naught, all dissemblers. -Ah, where’s my man? Give me some aqua vitae. -These griefs, these woes, these sorrows make me old. -Shame come to Romeo. - -JULIET. -Blister’d be thy tongue -For such a wish! He was not born to shame. -Upon his brow shame is asham’d to sit; -For ’tis a throne where honour may be crown’d -Sole monarch of the universal earth. -O, what a beast was I to chide at him! - -NURSE. -Will you speak well of him that kill’d your cousin? - -JULIET. -Shall I speak ill of him that is my husband? -Ah, poor my lord, what tongue shall smooth thy name, -When I thy three-hours’ wife have mangled it? -But wherefore, villain, didst thou kill my cousin? -That villain cousin would have kill’d my husband. -Back, foolish tears, back to your native spring, -Your tributary drops belong to woe, -Which you mistaking offer up to joy. -My husband lives, that Tybalt would have slain, -And Tybalt’s dead, that would have slain my husband. -All this is comfort; wherefore weep I then? -Some word there was, worser than Tybalt’s death, -That murder’d me. I would forget it fain, -But O, it presses to my memory -Like damned guilty deeds to sinners’ minds. -Tybalt is dead, and Romeo banished. -That ‘banished,’ that one word ‘banished,’ -Hath slain ten thousand Tybalts. Tybalt’s death -Was woe enough, if it had ended there. -Or if sour woe delights in fellowship, -And needly will be rank’d with other griefs, -Why follow’d not, when she said Tybalt’s dead, -Thy father or thy mother, nay or both, -Which modern lamentation might have mov’d? -But with a rear-ward following Tybalt’s death, -‘Romeo is banished’—to speak that word -Is father, mother, Tybalt, Romeo, Juliet, -All slain, all dead. Romeo is banished, -There is no end, no limit, measure, bound, -In that word’s death, no words can that woe sound. -Where is my father and my mother, Nurse? - -NURSE. -Weeping and wailing over Tybalt’s corse. -Will you go to them? I will bring you thither. - -JULIET. -Wash they his wounds with tears. Mine shall be spent, -When theirs are dry, for Romeo’s banishment. -Take up those cords. Poor ropes, you are beguil’d, -Both you and I; for Romeo is exil’d. -He made you for a highway to my bed, -But I, a maid, die maiden-widowed. -Come cords, come Nurse, I’ll to my wedding bed, -And death, not Romeo, take my maidenhead. - -NURSE. -Hie to your chamber. I’ll find Romeo -To comfort you. I wot well where he is. -Hark ye, your Romeo will be here at night. -I’ll to him, he is hid at Lawrence’ cell. - -JULIET. -O find him, give this ring to my true knight, -And bid him come to take his last farewell. - - [_Exeunt._] - -SCENE III. Friar Lawrence’s cell. - - Enter Friar Lawrence. - -FRIAR LAWRENCE. -Romeo, come forth; come forth, thou fearful man. -Affliction is enanmour’d of thy parts -And thou art wedded to calamity. - - Enter Romeo. - -ROMEO. -Father, what news? What is the Prince’s doom? -What sorrow craves acquaintance at my hand, -That I yet know not? - -FRIAR LAWRENCE. -Too familiar -Is my dear son with such sour company. -I bring thee tidings of the Prince’s doom. - -ROMEO. -What less than doomsday is the Prince’s doom? - -FRIAR LAWRENCE. -A gentler judgment vanish’d from his lips, -Not body’s death, but body’s banishment. - -ROMEO. -Ha, banishment? Be merciful, say death; -For exile hath more terror in his look, -Much more than death. Do not say banishment. - -FRIAR LAWRENCE. -Hence from Verona art thou banished. -Be patient, for the world is broad and wide. - -ROMEO. -There is no world without Verona walls, -But purgatory, torture, hell itself. -Hence banished is banish’d from the world, -And world’s exile is death. Then banished -Is death misterm’d. Calling death banished, -Thou cutt’st my head off with a golden axe, -And smilest upon the stroke that murders me. - -FRIAR LAWRENCE. -O deadly sin, O rude unthankfulness! -Thy fault our law calls death, but the kind Prince, -Taking thy part, hath brush’d aside the law, -And turn’d that black word death to banishment. -This is dear mercy, and thou see’st it not. - -ROMEO. -’Tis torture, and not mercy. Heaven is here -Where Juliet lives, and every cat and dog, -And little mouse, every unworthy thing, -Live here in heaven and may look on her, -But Romeo may not. More validity, -More honourable state, more courtship lives -In carrion flies than Romeo. They may seize -On the white wonder of dear Juliet’s hand, -And steal immortal blessing from her lips, -Who, even in pure and vestal modesty -Still blush, as thinking their own kisses sin. -But Romeo may not, he is banished. -This may flies do, when I from this must fly. -They are free men but I am banished. -And say’st thou yet that exile is not death? -Hadst thou no poison mix’d, no sharp-ground knife, -No sudden mean of death, though ne’er so mean, -But banished to kill me? Banished? -O Friar, the damned use that word in hell. -Howlings attends it. How hast thou the heart, -Being a divine, a ghostly confessor, -A sin-absolver, and my friend profess’d, -To mangle me with that word banished? - -FRIAR LAWRENCE. -Thou fond mad man, hear me speak a little, - -ROMEO. -O, thou wilt speak again of banishment. - -FRIAR LAWRENCE. -I’ll give thee armour to keep off that word, -Adversity’s sweet milk, philosophy, -To comfort thee, though thou art banished. - -ROMEO. -Yet banished? Hang up philosophy. -Unless philosophy can make a Juliet, -Displant a town, reverse a Prince’s doom, -It helps not, it prevails not, talk no more. - -FRIAR LAWRENCE. -O, then I see that mad men have no ears. - -ROMEO. -How should they, when that wise men have no eyes? - -FRIAR LAWRENCE. -Let me dispute with thee of thy estate. - -ROMEO. -Thou canst not speak of that thou dost not feel. -Wert thou as young as I, Juliet thy love, -An hour but married, Tybalt murdered, -Doting like me, and like me banished, -Then mightst thou speak, then mightst thou tear thy hair, -And fall upon the ground as I do now, -Taking the measure of an unmade grave. - - [_Knocking within._] - -FRIAR LAWRENCE. -Arise; one knocks. Good Romeo, hide thyself. - -ROMEO. -Not I, unless the breath of heartsick groans -Mist-like infold me from the search of eyes. - - [_Knocking._] - -FRIAR LAWRENCE. -Hark, how they knock!—Who’s there?—Romeo, arise, -Thou wilt be taken.—Stay awhile.—Stand up. - - [_Knocking._] - -Run to my study.—By-and-by.—God’s will, -What simpleness is this.—I come, I come. - - [_Knocking._] - -Who knocks so hard? Whence come you, what’s your will? - -NURSE. -[_Within._] Let me come in, and you shall know my errand. -I come from Lady Juliet. - -FRIAR LAWRENCE. -Welcome then. - - Enter Nurse. - -NURSE. -O holy Friar, O, tell me, holy Friar, -Where is my lady’s lord, where’s Romeo? - -FRIAR LAWRENCE. -There on the ground, with his own tears made drunk. - -NURSE. -O, he is even in my mistress’ case. -Just in her case! O woeful sympathy! -Piteous predicament. Even so lies she, -Blubbering and weeping, weeping and blubbering. -Stand up, stand up; stand, and you be a man. -For Juliet’s sake, for her sake, rise and stand. -Why should you fall into so deep an O? - -ROMEO. -Nurse. - -NURSE. -Ah sir, ah sir, death’s the end of all. - -ROMEO. -Spakest thou of Juliet? How is it with her? -Doth not she think me an old murderer, -Now I have stain’d the childhood of our joy -With blood remov’d but little from her own? -Where is she? And how doth she? And what says -My conceal’d lady to our cancell’d love? - -NURSE. -O, she says nothing, sir, but weeps and weeps; -And now falls on her bed, and then starts up, -And Tybalt calls, and then on Romeo cries, -And then down falls again. - -ROMEO. -As if that name, -Shot from the deadly level of a gun, -Did murder her, as that name’s cursed hand -Murder’d her kinsman. O, tell me, Friar, tell me, -In what vile part of this anatomy -Doth my name lodge? Tell me, that I may sack -The hateful mansion. - - [_Drawing his sword._] - -FRIAR LAWRENCE. -Hold thy desperate hand. -Art thou a man? Thy form cries out thou art. -Thy tears are womanish, thy wild acts denote -The unreasonable fury of a beast. -Unseemly woman in a seeming man, -And ill-beseeming beast in seeming both! -Thou hast amaz’d me. By my holy order, -I thought thy disposition better temper’d. -Hast thou slain Tybalt? Wilt thou slay thyself? -And slay thy lady, that in thy life lives, -By doing damned hate upon thyself? -Why rail’st thou on thy birth, the heaven and earth? -Since birth, and heaven and earth, all three do meet -In thee at once; which thou at once wouldst lose. -Fie, fie, thou sham’st thy shape, thy love, thy wit, -Which, like a usurer, abound’st in all, -And usest none in that true use indeed -Which should bedeck thy shape, thy love, thy wit. -Thy noble shape is but a form of wax, -Digressing from the valour of a man; -Thy dear love sworn but hollow perjury, -Killing that love which thou hast vow’d to cherish; -Thy wit, that ornament to shape and love, -Misshapen in the conduct of them both, -Like powder in a skilless soldier’s flask, -Is set afire by thine own ignorance, -And thou dismember’d with thine own defence. -What, rouse thee, man. Thy Juliet is alive, -For whose dear sake thou wast but lately dead. -There art thou happy. Tybalt would kill thee, -But thou slew’st Tybalt; there art thou happy. -The law that threaten’d death becomes thy friend, -And turns it to exile; there art thou happy. -A pack of blessings light upon thy back; -Happiness courts thee in her best array; -But like a misshaped and sullen wench, -Thou putt’st up thy Fortune and thy love. -Take heed, take heed, for such die miserable. -Go, get thee to thy love as was decreed, -Ascend her chamber, hence and comfort her. -But look thou stay not till the watch be set, -For then thou canst not pass to Mantua; -Where thou shalt live till we can find a time -To blaze your marriage, reconcile your friends, -Beg pardon of the Prince, and call thee back -With twenty hundred thousand times more joy -Than thou went’st forth in lamentation. -Go before, Nurse. Commend me to thy lady, -And bid her hasten all the house to bed, -Which heavy sorrow makes them apt unto. -Romeo is coming. - -NURSE. -O Lord, I could have stay’d here all the night -To hear good counsel. O, what learning is! -My lord, I’ll tell my lady you will come. - -ROMEO. -Do so, and bid my sweet prepare to chide. - -NURSE. -Here sir, a ring she bid me give you, sir. -Hie you, make haste, for it grows very late. - - [_Exit._] - -ROMEO. -How well my comfort is reviv’d by this. - -FRIAR LAWRENCE. -Go hence, good night, and here stands all your state: -Either be gone before the watch be set, -Or by the break of day disguis’d from hence. -Sojourn in Mantua. I’ll find out your man, -And he shall signify from time to time -Every good hap to you that chances here. -Give me thy hand; ’tis late; farewell; good night. - -ROMEO. -But that a joy past joy calls out on me, -It were a grief so brief to part with thee. -Farewell. - - [_Exeunt._] - -SCENE IV. A Room in Capulet’s House. - - Enter Capulet, Lady Capulet and Paris. - -CAPULET. -Things have fallen out, sir, so unluckily -That we have had no time to move our daughter. -Look you, she lov’d her kinsman Tybalt dearly, -And so did I. Well, we were born to die. -’Tis very late; she’ll not come down tonight. -I promise you, but for your company, -I would have been abed an hour ago. - -PARIS. -These times of woe afford no tune to woo. -Madam, good night. Commend me to your daughter. - -LADY CAPULET. -I will, and know her mind early tomorrow; -Tonight she’s mew’d up to her heaviness. - -CAPULET. -Sir Paris, I will make a desperate tender -Of my child’s love. I think she will be rul’d -In all respects by me; nay more, I doubt it not. -Wife, go you to her ere you go to bed, -Acquaint her here of my son Paris’ love, -And bid her, mark you me, on Wednesday next, -But, soft, what day is this? - -PARIS. -Monday, my lord. - -CAPULET. -Monday! Ha, ha! Well, Wednesday is too soon, -A Thursday let it be; a Thursday, tell her, -She shall be married to this noble earl. -Will you be ready? Do you like this haste? -We’ll keep no great ado,—a friend or two, -For, hark you, Tybalt being slain so late, -It may be thought we held him carelessly, -Being our kinsman, if we revel much. -Therefore we’ll have some half a dozen friends, -And there an end. But what say you to Thursday? - -PARIS. -My lord, I would that Thursday were tomorrow. - -CAPULET. -Well, get you gone. A Thursday be it then. -Go you to Juliet ere you go to bed, -Prepare her, wife, against this wedding day. -Farewell, my lord.—Light to my chamber, ho! -Afore me, it is so very very late that we -May call it early by and by. Good night. - - [_Exeunt._] - -SCENE V. An open Gallery to Juliet’s Chamber, overlooking the Garden. - - Enter Romeo and Juliet. - -JULIET. -Wilt thou be gone? It is not yet near day. -It was the nightingale, and not the lark, -That pierc’d the fearful hollow of thine ear; -Nightly she sings on yond pomegranate tree. -Believe me, love, it was the nightingale. - -ROMEO. -It was the lark, the herald of the morn, -No nightingale. Look, love, what envious streaks -Do lace the severing clouds in yonder east. -Night’s candles are burnt out, and jocund day -Stands tiptoe on the misty mountain tops. -I must be gone and live, or stay and die. - -JULIET. -Yond light is not daylight, I know it, I. -It is some meteor that the sun exhales -To be to thee this night a torchbearer -And light thee on thy way to Mantua. -Therefore stay yet, thou need’st not to be gone. - -ROMEO. -Let me be ta’en, let me be put to death, -I am content, so thou wilt have it so. -I’ll say yon grey is not the morning’s eye, -’Tis but the pale reflex of Cynthia’s brow. -Nor that is not the lark whose notes do beat -The vaulty heaven so high above our heads. -I have more care to stay than will to go. -Come, death, and welcome. Juliet wills it so. -How is’t, my soul? Let’s talk. It is not day. - -JULIET. -It is, it is! Hie hence, be gone, away. -It is the lark that sings so out of tune, -Straining harsh discords and unpleasing sharps. -Some say the lark makes sweet division; -This doth not so, for she divideth us. -Some say the lark and loathed toad change eyes. -O, now I would they had chang’d voices too, -Since arm from arm that voice doth us affray, -Hunting thee hence with hunt’s-up to the day. -O now be gone, more light and light it grows. - -ROMEO. -More light and light, more dark and dark our woes. - - Enter Nurse. - -NURSE. -Madam. - -JULIET. -Nurse? - -NURSE. -Your lady mother is coming to your chamber. -The day is broke, be wary, look about. - - [_Exit._] - -JULIET. -Then, window, let day in, and let life out. - -ROMEO. -Farewell, farewell, one kiss, and I’ll descend. - - [_Descends._] - -JULIET. -Art thou gone so? Love, lord, ay husband, friend, -I must hear from thee every day in the hour, -For in a minute there are many days. -O, by this count I shall be much in years -Ere I again behold my Romeo. - -ROMEO. -Farewell! -I will omit no opportunity -That may convey my greetings, love, to thee. - -JULIET. -O thinkest thou we shall ever meet again? - -ROMEO. -I doubt it not, and all these woes shall serve -For sweet discourses in our time to come. - -JULIET. -O God! I have an ill-divining soul! -Methinks I see thee, now thou art so low, -As one dead in the bottom of a tomb. -Either my eyesight fails, or thou look’st pale. - -ROMEO. -And trust me, love, in my eye so do you. -Dry sorrow drinks our blood. Adieu, adieu. - - [_Exit below._] - -JULIET. -O Fortune, Fortune! All men call thee fickle, -If thou art fickle, what dost thou with him -That is renown’d for faith? Be fickle, Fortune; -For then, I hope thou wilt not keep him long -But send him back. - -LADY CAPULET. -[_Within._] Ho, daughter, are you up? - -JULIET. -Who is’t that calls? Is it my lady mother? -Is she not down so late, or up so early? -What unaccustom’d cause procures her hither? - - Enter Lady Capulet. - -LADY CAPULET. -Why, how now, Juliet? - -JULIET. -Madam, I am not well. - -LADY CAPULET. -Evermore weeping for your cousin’s death? -What, wilt thou wash him from his grave with tears? -And if thou couldst, thou couldst not make him live. -Therefore have done: some grief shows much of love, -But much of grief shows still some want of wit. - -JULIET. -Yet let me weep for such a feeling loss. - -LADY CAPULET. -So shall you feel the loss, but not the friend -Which you weep for. - -JULIET. -Feeling so the loss, -I cannot choose but ever weep the friend. - -LADY CAPULET. -Well, girl, thou weep’st not so much for his death -As that the villain lives which slaughter’d him. - -JULIET. -What villain, madam? - -LADY CAPULET. -That same villain Romeo. - -JULIET. -Villain and he be many miles asunder. -God pardon him. I do, with all my heart. -And yet no man like he doth grieve my heart. - -LADY CAPULET. -That is because the traitor murderer lives. - -JULIET. -Ay madam, from the reach of these my hands. -Would none but I might venge my cousin’s death. - -LADY CAPULET. -We will have vengeance for it, fear thou not. -Then weep no more. I’ll send to one in Mantua, -Where that same banish’d runagate doth live, -Shall give him such an unaccustom’d dram -That he shall soon keep Tybalt company: -And then I hope thou wilt be satisfied. - -JULIET. -Indeed I never shall be satisfied -With Romeo till I behold him—dead— -Is my poor heart so for a kinsman vex’d. -Madam, if you could find out but a man -To bear a poison, I would temper it, -That Romeo should upon receipt thereof, -Soon sleep in quiet. O, how my heart abhors -To hear him nam’d, and cannot come to him, -To wreak the love I bore my cousin -Upon his body that hath slaughter’d him. - -LADY CAPULET. -Find thou the means, and I’ll find such a man. -But now I’ll tell thee joyful tidings, girl. - -JULIET. -And joy comes well in such a needy time. -What are they, I beseech your ladyship? - -LADY CAPULET. -Well, well, thou hast a careful father, child; -One who to put thee from thy heaviness, -Hath sorted out a sudden day of joy, -That thou expects not, nor I look’d not for. - -JULIET. -Madam, in happy time, what day is that? - -LADY CAPULET. -Marry, my child, early next Thursday morn -The gallant, young, and noble gentleman, -The County Paris, at Saint Peter’s Church, -Shall happily make thee there a joyful bride. - -JULIET. -Now by Saint Peter’s Church, and Peter too, -He shall not make me there a joyful bride. -I wonder at this haste, that I must wed -Ere he that should be husband comes to woo. -I pray you tell my lord and father, madam, -I will not marry yet; and when I do, I swear -It shall be Romeo, whom you know I hate, -Rather than Paris. These are news indeed. - -LADY CAPULET. -Here comes your father, tell him so yourself, -And see how he will take it at your hands. - - Enter Capulet and Nurse. - -CAPULET. -When the sun sets, the air doth drizzle dew; -But for the sunset of my brother’s son -It rains downright. -How now? A conduit, girl? What, still in tears? -Evermore showering? In one little body -Thou counterfeits a bark, a sea, a wind. -For still thy eyes, which I may call the sea, -Do ebb and flow with tears; the bark thy body is, -Sailing in this salt flood, the winds, thy sighs, -Who raging with thy tears and they with them, -Without a sudden calm will overset -Thy tempest-tossed body. How now, wife? -Have you deliver’d to her our decree? - -LADY CAPULET. -Ay, sir; but she will none, she gives you thanks. -I would the fool were married to her grave. - -CAPULET. -Soft. Take me with you, take me with you, wife. -How, will she none? Doth she not give us thanks? -Is she not proud? Doth she not count her blest, -Unworthy as she is, that we have wrought -So worthy a gentleman to be her bridegroom? - -JULIET. -Not proud you have, but thankful that you have. -Proud can I never be of what I hate; -But thankful even for hate that is meant love. - -CAPULET. -How now, how now, chopp’d logic? What is this? -Proud, and, I thank you, and I thank you not; -And yet not proud. Mistress minion you, -Thank me no thankings, nor proud me no prouds, -But fettle your fine joints ’gainst Thursday next -To go with Paris to Saint Peter’s Church, -Or I will drag thee on a hurdle thither. -Out, you green-sickness carrion! Out, you baggage! -You tallow-face! - -LADY CAPULET. -Fie, fie! What, are you mad? - -JULIET. -Good father, I beseech you on my knees, -Hear me with patience but to speak a word. - -CAPULET. -Hang thee young baggage, disobedient wretch! -I tell thee what,—get thee to church a Thursday, -Or never after look me in the face. -Speak not, reply not, do not answer me. -My fingers itch. Wife, we scarce thought us blest -That God had lent us but this only child; -But now I see this one is one too much, -And that we have a curse in having her. -Out on her, hilding. - -NURSE. -God in heaven bless her. -You are to blame, my lord, to rate her so. - -CAPULET. -And why, my lady wisdom? Hold your tongue, -Good prudence; smatter with your gossips, go. - -NURSE. -I speak no treason. - -CAPULET. -O God ye good-en! - -NURSE. -May not one speak? - -CAPULET. -Peace, you mumbling fool! -Utter your gravity o’er a gossip’s bowl, -For here we need it not. - -LADY CAPULET. -You are too hot. - -CAPULET. -God’s bread, it makes me mad! -Day, night, hour, ride, time, work, play, -Alone, in company, still my care hath been -To have her match’d, and having now provided -A gentleman of noble parentage, -Of fair demesnes, youthful, and nobly allied, -Stuff’d, as they say, with honourable parts, -Proportion’d as one’s thought would wish a man, -And then to have a wretched puling fool, -A whining mammet, in her fortune’s tender, -To answer, ‘I’ll not wed, I cannot love, -I am too young, I pray you pardon me.’ -But, and you will not wed, I’ll pardon you. -Graze where you will, you shall not house with me. -Look to’t, think on’t, I do not use to jest. -Thursday is near; lay hand on heart, advise. -And you be mine, I’ll give you to my friend; -And you be not, hang, beg, starve, die in the streets, -For by my soul, I’ll ne’er acknowledge thee, -Nor what is mine shall never do thee good. -Trust to’t, bethink you, I’ll not be forsworn. - - [_Exit._] - -JULIET. -Is there no pity sitting in the clouds, -That sees into the bottom of my grief? -O sweet my mother, cast me not away, -Delay this marriage for a month, a week, -Or, if you do not, make the bridal bed -In that dim monument where Tybalt lies. - -LADY CAPULET. -Talk not to me, for I’ll not speak a word. -Do as thou wilt, for I have done with thee. - - [_Exit._] - -JULIET. -O God! O Nurse, how shall this be prevented? -My husband is on earth, my faith in heaven. -How shall that faith return again to earth, -Unless that husband send it me from heaven -By leaving earth? Comfort me, counsel me. -Alack, alack, that heaven should practise stratagems -Upon so soft a subject as myself. -What say’st thou? Hast thou not a word of joy? -Some comfort, Nurse. - -NURSE. -Faith, here it is. -Romeo is banished; and all the world to nothing -That he dares ne’er come back to challenge you. -Or if he do, it needs must be by stealth. -Then, since the case so stands as now it doth, -I think it best you married with the County. -O, he’s a lovely gentleman. -Romeo’s a dishclout to him. An eagle, madam, -Hath not so green, so quick, so fair an eye -As Paris hath. Beshrew my very heart, -I think you are happy in this second match, -For it excels your first: or if it did not, -Your first is dead, or ’twere as good he were, -As living here and you no use of him. - -JULIET. -Speakest thou from thy heart? - -NURSE. -And from my soul too, -Or else beshrew them both. - -JULIET. -Amen. - -NURSE. -What? - -JULIET. -Well, thou hast comforted me marvellous much. -Go in, and tell my lady I am gone, -Having displeas’d my father, to Lawrence’ cell, -To make confession and to be absolv’d. - -NURSE. -Marry, I will; and this is wisely done. - - [_Exit._] - -JULIET. -Ancient damnation! O most wicked fiend! -Is it more sin to wish me thus forsworn, -Or to dispraise my lord with that same tongue -Which she hath prais’d him with above compare -So many thousand times? Go, counsellor. -Thou and my bosom henceforth shall be twain. -I’ll to the Friar to know his remedy. -If all else fail, myself have power to die. - - [_Exit._] - - - -ACT IV - -SCENE I. Friar Lawrence’s Cell. - - Enter Friar Lawrence and Paris. - -FRIAR LAWRENCE. -On Thursday, sir? The time is very short. - -PARIS. -My father Capulet will have it so; -And I am nothing slow to slack his haste. - -FRIAR LAWRENCE. -You say you do not know the lady’s mind. -Uneven is the course; I like it not. - -PARIS. -Immoderately she weeps for Tybalt’s death, -And therefore have I little talk’d of love; -For Venus smiles not in a house of tears. -Now, sir, her father counts it dangerous -That she do give her sorrow so much sway; -And in his wisdom, hastes our marriage, -To stop the inundation of her tears, -Which, too much minded by herself alone, -May be put from her by society. -Now do you know the reason of this haste. - -FRIAR LAWRENCE. -[_Aside._] I would I knew not why it should be slow’d.— -Look, sir, here comes the lady toward my cell. - - Enter Juliet. - -PARIS. -Happily met, my lady and my wife! - -JULIET. -That may be, sir, when I may be a wife. - -PARIS. -That may be, must be, love, on Thursday next. - -JULIET. -What must be shall be. - -FRIAR LAWRENCE. -That’s a certain text. - -PARIS. -Come you to make confession to this father? - -JULIET. -To answer that, I should confess to you. - -PARIS. -Do not deny to him that you love me. - -JULIET. -I will confess to you that I love him. - -PARIS. -So will ye, I am sure, that you love me. - -JULIET. -If I do so, it will be of more price, -Being spoke behind your back than to your face. - -PARIS. -Poor soul, thy face is much abus’d with tears. - -JULIET. -The tears have got small victory by that; -For it was bad enough before their spite. - -PARIS. -Thou wrong’st it more than tears with that report. - -JULIET. -That is no slander, sir, which is a truth, -And what I spake, I spake it to my face. - -PARIS. -Thy face is mine, and thou hast slander’d it. - -JULIET. -It may be so, for it is not mine own. -Are you at leisure, holy father, now, -Or shall I come to you at evening mass? - -FRIAR LAWRENCE. -My leisure serves me, pensive daughter, now.— -My lord, we must entreat the time alone. - -PARIS. -God shield I should disturb devotion!— -Juliet, on Thursday early will I rouse ye, -Till then, adieu; and keep this holy kiss. - - [_Exit._] - -JULIET. -O shut the door, and when thou hast done so, -Come weep with me, past hope, past cure, past help! - -FRIAR LAWRENCE. -O Juliet, I already know thy grief; -It strains me past the compass of my wits. -I hear thou must, and nothing may prorogue it, -On Thursday next be married to this County. - -JULIET. -Tell me not, Friar, that thou hear’st of this, -Unless thou tell me how I may prevent it. -If in thy wisdom, thou canst give no help, -Do thou but call my resolution wise, -And with this knife I’ll help it presently. -God join’d my heart and Romeo’s, thou our hands; -And ere this hand, by thee to Romeo’s seal’d, -Shall be the label to another deed, -Or my true heart with treacherous revolt -Turn to another, this shall slay them both. -Therefore, out of thy long-experienc’d time, -Give me some present counsel, or behold -’Twixt my extremes and me this bloody knife -Shall play the empire, arbitrating that -Which the commission of thy years and art -Could to no issue of true honour bring. -Be not so long to speak. I long to die, -If what thou speak’st speak not of remedy. - -FRIAR LAWRENCE. -Hold, daughter. I do spy a kind of hope, -Which craves as desperate an execution -As that is desperate which we would prevent. -If, rather than to marry County Paris -Thou hast the strength of will to slay thyself, -Then is it likely thou wilt undertake -A thing like death to chide away this shame, -That cop’st with death himself to scape from it. -And if thou dar’st, I’ll give thee remedy. - -JULIET. -O, bid me leap, rather than marry Paris, -From off the battlements of yonder tower, -Or walk in thievish ways, or bid me lurk -Where serpents are. Chain me with roaring bears; -Or hide me nightly in a charnel-house, -O’er-cover’d quite with dead men’s rattling bones, -With reeky shanks and yellow chapless skulls. -Or bid me go into a new-made grave, -And hide me with a dead man in his shroud; -Things that, to hear them told, have made me tremble, -And I will do it without fear or doubt, -To live an unstain’d wife to my sweet love. - -FRIAR LAWRENCE. -Hold then. Go home, be merry, give consent -To marry Paris. Wednesday is tomorrow; -Tomorrow night look that thou lie alone, -Let not thy Nurse lie with thee in thy chamber. -Take thou this vial, being then in bed, -And this distilled liquor drink thou off, -When presently through all thy veins shall run -A cold and drowsy humour; for no pulse -Shall keep his native progress, but surcease. -No warmth, no breath shall testify thou livest, -The roses in thy lips and cheeks shall fade -To paly ashes; thy eyes’ windows fall, -Like death when he shuts up the day of life. -Each part depriv’d of supple government, -Shall stiff and stark and cold appear like death. -And in this borrow’d likeness of shrunk death -Thou shalt continue two and forty hours, -And then awake as from a pleasant sleep. -Now when the bridegroom in the morning comes -To rouse thee from thy bed, there art thou dead. -Then as the manner of our country is, -In thy best robes, uncover’d, on the bier, -Thou shalt be borne to that same ancient vault -Where all the kindred of the Capulets lie. -In the meantime, against thou shalt awake, -Shall Romeo by my letters know our drift, -And hither shall he come, and he and I -Will watch thy waking, and that very night -Shall Romeo bear thee hence to Mantua. -And this shall free thee from this present shame, -If no inconstant toy nor womanish fear -Abate thy valour in the acting it. - -JULIET. -Give me, give me! O tell not me of fear! - -FRIAR LAWRENCE. -Hold; get you gone, be strong and prosperous -In this resolve. I’ll send a friar with speed -To Mantua, with my letters to thy lord. - -JULIET. -Love give me strength, and strength shall help afford. -Farewell, dear father. - - [_Exeunt._] - -SCENE II. Hall in Capulet’s House. - - Enter Capulet, Lady Capulet, Nurse and Servants. - -CAPULET. -So many guests invite as here are writ. - - [_Exit first Servant._] - -Sirrah, go hire me twenty cunning cooks. - -SECOND SERVANT. -You shall have none ill, sir; for I’ll try if they can lick their -fingers. - -CAPULET. -How canst thou try them so? - -SECOND SERVANT. -Marry, sir, ’tis an ill cook that cannot lick his own fingers; -therefore he that cannot lick his fingers goes not with me. - -CAPULET. -Go, begone. - - [_Exit second Servant._] - -We shall be much unfurnish’d for this time. -What, is my daughter gone to Friar Lawrence? - -NURSE. -Ay, forsooth. - -CAPULET. -Well, he may chance to do some good on her. -A peevish self-will’d harlotry it is. - - Enter Juliet. - -NURSE. -See where she comes from shrift with merry look. - -CAPULET. -How now, my headstrong. Where have you been gadding? - -JULIET. -Where I have learnt me to repent the sin -Of disobedient opposition -To you and your behests; and am enjoin’d -By holy Lawrence to fall prostrate here, -To beg your pardon. Pardon, I beseech you. -Henceforward I am ever rul’d by you. - -CAPULET. -Send for the County, go tell him of this. -I’ll have this knot knit up tomorrow morning. - -JULIET. -I met the youthful lord at Lawrence’ cell, -And gave him what becomed love I might, -Not stepping o’er the bounds of modesty. - -CAPULET. -Why, I am glad on’t. This is well. Stand up. -This is as’t should be. Let me see the County. -Ay, marry. Go, I say, and fetch him hither. -Now afore God, this reverend holy Friar, -All our whole city is much bound to him. - -JULIET. -Nurse, will you go with me into my closet, -To help me sort such needful ornaments -As you think fit to furnish me tomorrow? - -LADY CAPULET. -No, not till Thursday. There is time enough. - -CAPULET. -Go, Nurse, go with her. We’ll to church tomorrow. - - [_Exeunt Juliet and Nurse._] - -LADY CAPULET. -We shall be short in our provision, -’Tis now near night. - -CAPULET. -Tush, I will stir about, -And all things shall be well, I warrant thee, wife. -Go thou to Juliet, help to deck up her. -I’ll not to bed tonight, let me alone. -I’ll play the housewife for this once.—What, ho!— -They are all forth: well, I will walk myself -To County Paris, to prepare him up -Against tomorrow. My heart is wondrous light -Since this same wayward girl is so reclaim’d. - - [_Exeunt._] - -SCENE III. Juliet’s Chamber. - - Enter Juliet and Nurse. - -JULIET. -Ay, those attires are best. But, gentle Nurse, -I pray thee leave me to myself tonight; -For I have need of many orisons -To move the heavens to smile upon my state, -Which, well thou know’st, is cross and full of sin. - - Enter Lady Capulet. - -LADY CAPULET. -What, are you busy, ho? Need you my help? - -JULIET. -No, madam; we have cull’d such necessaries -As are behoveful for our state tomorrow. -So please you, let me now be left alone, -And let the nurse this night sit up with you, -For I am sure you have your hands full all -In this so sudden business. - -LADY CAPULET. -Good night. -Get thee to bed and rest, for thou hast need. - - [_Exeunt Lady Capulet and Nurse._] - -JULIET. -Farewell. God knows when we shall meet again. -I have a faint cold fear thrills through my veins -That almost freezes up the heat of life. -I’ll call them back again to comfort me. -Nurse!—What should she do here? -My dismal scene I needs must act alone. -Come, vial. -What if this mixture do not work at all? -Shall I be married then tomorrow morning? -No, No! This shall forbid it. Lie thou there. - - [_Laying down her dagger._] - -What if it be a poison, which the Friar -Subtly hath minister’d to have me dead, -Lest in this marriage he should be dishonour’d, -Because he married me before to Romeo? -I fear it is. And yet methinks it should not, -For he hath still been tried a holy man. -How if, when I am laid into the tomb, -I wake before the time that Romeo -Come to redeem me? There’s a fearful point! -Shall I not then be stifled in the vault, -To whose foul mouth no healthsome air breathes in, -And there die strangled ere my Romeo comes? -Or, if I live, is it not very like, -The horrible conceit of death and night, -Together with the terror of the place, -As in a vault, an ancient receptacle, -Where for this many hundred years the bones -Of all my buried ancestors are pack’d, -Where bloody Tybalt, yet but green in earth, -Lies festering in his shroud; where, as they say, -At some hours in the night spirits resort— -Alack, alack, is it not like that I, -So early waking, what with loathsome smells, -And shrieks like mandrakes torn out of the earth, -That living mortals, hearing them, run mad. -O, if I wake, shall I not be distraught, -Environed with all these hideous fears, -And madly play with my forefathers’ joints? -And pluck the mangled Tybalt from his shroud? -And, in this rage, with some great kinsman’s bone, -As with a club, dash out my desperate brains? -O look, methinks I see my cousin’s ghost -Seeking out Romeo that did spit his body -Upon a rapier’s point. Stay, Tybalt, stay! -Romeo, Romeo, Romeo, here’s drink! I drink to thee. - - [_Throws herself on the bed._] - -SCENE IV. Hall in Capulet’s House. - - Enter Lady Capulet and Nurse. - -LADY CAPULET. -Hold, take these keys and fetch more spices, Nurse. - -NURSE. -They call for dates and quinces in the pastry. - - Enter Capulet. - -CAPULET. -Come, stir, stir, stir! The second cock hath crow’d, -The curfew bell hath rung, ’tis three o’clock. -Look to the bak’d meats, good Angelica; -Spare not for cost. - -NURSE. -Go, you cot-quean, go, -Get you to bed; faith, you’ll be sick tomorrow -For this night’s watching. - -CAPULET. -No, not a whit. What! I have watch’d ere now -All night for lesser cause, and ne’er been sick. - -LADY CAPULET. -Ay, you have been a mouse-hunt in your time; -But I will watch you from such watching now. - - [_Exeunt Lady Capulet and Nurse._] - -CAPULET. -A jealous-hood, a jealous-hood! - - Enter Servants, with spits, logs and baskets. - -Now, fellow, what’s there? - -FIRST SERVANT. -Things for the cook, sir; but I know not what. - -CAPULET. -Make haste, make haste. - - [_Exit First Servant._] - -—Sirrah, fetch drier logs. -Call Peter, he will show thee where they are. - -SECOND SERVANT. -I have a head, sir, that will find out logs -And never trouble Peter for the matter. - - [_Exit._] - -CAPULET. -Mass and well said; a merry whoreson, ha. -Thou shalt be loggerhead.—Good faith, ’tis day. -The County will be here with music straight, -For so he said he would. I hear him near. - - [_Play music._] - -Nurse! Wife! What, ho! What, Nurse, I say! - - Re-enter Nurse. - -Go waken Juliet, go and trim her up. -I’ll go and chat with Paris. Hie, make haste, -Make haste; the bridegroom he is come already. -Make haste I say. - - [_Exeunt._] - -SCENE V. Juliet’s Chamber; Juliet on the bed. - - Enter Nurse. - -NURSE. -Mistress! What, mistress! Juliet! Fast, I warrant her, she. -Why, lamb, why, lady, fie, you slug-abed! -Why, love, I say! Madam! Sweetheart! Why, bride! -What, not a word? You take your pennyworths now. -Sleep for a week; for the next night, I warrant, -The County Paris hath set up his rest -That you shall rest but little. God forgive me! -Marry and amen. How sound is she asleep! -I needs must wake her. Madam, madam, madam! -Ay, let the County take you in your bed, -He’ll fright you up, i’faith. Will it not be? -What, dress’d, and in your clothes, and down again? -I must needs wake you. Lady! Lady! Lady! -Alas, alas! Help, help! My lady’s dead! -O, well-a-day that ever I was born. -Some aqua vitae, ho! My lord! My lady! - - Enter Lady Capulet. - -LADY CAPULET. -What noise is here? - -NURSE. -O lamentable day! - -LADY CAPULET. -What is the matter? - -NURSE. -Look, look! O heavy day! - -LADY CAPULET. -O me, O me! My child, my only life. -Revive, look up, or I will die with thee. -Help, help! Call help. - - Enter Capulet. - -CAPULET. -For shame, bring Juliet forth, her lord is come. - -NURSE. -She’s dead, deceas’d, she’s dead; alack the day! - -LADY CAPULET. -Alack the day, she’s dead, she’s dead, she’s dead! - -CAPULET. -Ha! Let me see her. Out alas! She’s cold, -Her blood is settled and her joints are stiff. -Life and these lips have long been separated. -Death lies on her like an untimely frost -Upon the sweetest flower of all the field. - -NURSE. -O lamentable day! - -LADY CAPULET. -O woful time! - -CAPULET. -Death, that hath ta’en her hence to make me wail, -Ties up my tongue and will not let me speak. - - Enter Friar Lawrence and Paris with Musicians. - -FRIAR LAWRENCE. -Come, is the bride ready to go to church? - -CAPULET. -Ready to go, but never to return. -O son, the night before thy wedding day -Hath death lain with thy bride. There she lies, -Flower as she was, deflowered by him. -Death is my son-in-law, death is my heir; -My daughter he hath wedded. I will die. -And leave him all; life, living, all is death’s. - -PARIS. -Have I thought long to see this morning’s face, -And doth it give me such a sight as this? - -LADY CAPULET. -Accurs’d, unhappy, wretched, hateful day. -Most miserable hour that e’er time saw -In lasting labour of his pilgrimage. -But one, poor one, one poor and loving child, -But one thing to rejoice and solace in, -And cruel death hath catch’d it from my sight. - -NURSE. -O woe! O woeful, woeful, woeful day. -Most lamentable day, most woeful day -That ever, ever, I did yet behold! -O day, O day, O day, O hateful day. -Never was seen so black a day as this. -O woeful day, O woeful day. - -PARIS. -Beguil’d, divorced, wronged, spited, slain. -Most detestable death, by thee beguil’d, -By cruel, cruel thee quite overthrown. -O love! O life! Not life, but love in death! - -CAPULET. -Despis’d, distressed, hated, martyr’d, kill’d. -Uncomfortable time, why cam’st thou now -To murder, murder our solemnity? -O child! O child! My soul, and not my child, -Dead art thou. Alack, my child is dead, -And with my child my joys are buried. - -FRIAR LAWRENCE. -Peace, ho, for shame. Confusion’s cure lives not -In these confusions. Heaven and yourself -Had part in this fair maid, now heaven hath all, -And all the better is it for the maid. -Your part in her you could not keep from death, -But heaven keeps his part in eternal life. -The most you sought was her promotion, -For ’twas your heaven she should be advanc’d, -And weep ye now, seeing she is advanc’d -Above the clouds, as high as heaven itself? -O, in this love, you love your child so ill -That you run mad, seeing that she is well. -She’s not well married that lives married long, -But she’s best married that dies married young. -Dry up your tears, and stick your rosemary -On this fair corse, and, as the custom is, -And in her best array bear her to church; -For though fond nature bids us all lament, -Yet nature’s tears are reason’s merriment. - -CAPULET. -All things that we ordained festival -Turn from their office to black funeral: -Our instruments to melancholy bells, -Our wedding cheer to a sad burial feast; -Our solemn hymns to sullen dirges change; -Our bridal flowers serve for a buried corse, -And all things change them to the contrary. - -FRIAR LAWRENCE. -Sir, go you in, and, madam, go with him, -And go, Sir Paris, everyone prepare -To follow this fair corse unto her grave. -The heavens do lower upon you for some ill; -Move them no more by crossing their high will. - - [_Exeunt Capulet, Lady Capulet, Paris and Friar._] - -FIRST MUSICIAN. -Faith, we may put up our pipes and be gone. - -NURSE. -Honest good fellows, ah, put up, put up, -For well you know this is a pitiful case. - -FIRST MUSICIAN. -Ay, by my troth, the case may be amended. - - [_Exit Nurse._] - - Enter Peter. - -PETER. -Musicians, O, musicians, ‘Heart’s ease,’ ‘Heart’s ease’, O, and you -will have me live, play ‘Heart’s ease.’ - -FIRST MUSICIAN. -Why ‘Heart’s ease’? - -PETER. -O musicians, because my heart itself plays ‘My heart is full’. O play -me some merry dump to comfort me. - -FIRST MUSICIAN. -Not a dump we, ’tis no time to play now. - -PETER. -You will not then? - -FIRST MUSICIAN. -No. - -PETER. -I will then give it you soundly. - -FIRST MUSICIAN. -What will you give us? - -PETER. -No money, on my faith, but the gleek! I will give you the minstrel. - -FIRST MUSICIAN. -Then will I give you the serving-creature. - -PETER. -Then will I lay the serving-creature’s dagger on your pate. I will -carry no crotchets. I’ll re you, I’ll fa you. Do you note me? - -FIRST MUSICIAN. -And you re us and fa us, you note us. - -SECOND MUSICIAN. -Pray you put up your dagger, and put out your wit. - -PETER. -Then have at you with my wit. I will dry-beat you with an iron wit, and -put up my iron dagger. Answer me like men. - ‘When griping griefs the heart doth wound, - And doleful dumps the mind oppress, - Then music with her silver sound’— -Why ‘silver sound’? Why ‘music with her silver sound’? What say you, -Simon Catling? - -FIRST MUSICIAN. -Marry, sir, because silver hath a sweet sound. - -PETER. -Prates. What say you, Hugh Rebeck? - -SECOND MUSICIAN. -I say ‘silver sound’ because musicians sound for silver. - -PETER. -Prates too! What say you, James Soundpost? - -THIRD MUSICIAN. -Faith, I know not what to say. - -PETER. -O, I cry you mercy, you are the singer. I will say for you. It is -‘music with her silver sound’ because musicians have no gold for -sounding. - ‘Then music with her silver sound - With speedy help doth lend redress.’ - - [_Exit._] - -FIRST MUSICIAN. -What a pestilent knave is this same! - -SECOND MUSICIAN. -Hang him, Jack. Come, we’ll in here, tarry for the mourners, and stay -dinner. - - [_Exeunt._] - - - -ACT V - -SCENE I. Mantua. A Street. - - Enter Romeo. - -ROMEO. -If I may trust the flattering eye of sleep, -My dreams presage some joyful news at hand. -My bosom’s lord sits lightly in his throne; -And all this day an unaccustom’d spirit -Lifts me above the ground with cheerful thoughts. -I dreamt my lady came and found me dead,— -Strange dream, that gives a dead man leave to think!— -And breath’d such life with kisses in my lips, -That I reviv’d, and was an emperor. -Ah me, how sweet is love itself possess’d, -When but love’s shadows are so rich in joy. - - Enter Balthasar. - -News from Verona! How now, Balthasar? -Dost thou not bring me letters from the Friar? -How doth my lady? Is my father well? -How fares my Juliet? That I ask again; -For nothing can be ill if she be well. - -BALTHASAR. -Then she is well, and nothing can be ill. -Her body sleeps in Capel’s monument, -And her immortal part with angels lives. -I saw her laid low in her kindred’s vault, -And presently took post to tell it you. -O pardon me for bringing these ill news, -Since you did leave it for my office, sir. - -ROMEO. -Is it even so? Then I defy you, stars! -Thou know’st my lodging. Get me ink and paper, -And hire post-horses. I will hence tonight. - -BALTHASAR. -I do beseech you sir, have patience. -Your looks are pale and wild, and do import -Some misadventure. - -ROMEO. -Tush, thou art deceiv’d. -Leave me, and do the thing I bid thee do. -Hast thou no letters to me from the Friar? - -BALTHASAR. -No, my good lord. - -ROMEO. -No matter. Get thee gone, -And hire those horses. I’ll be with thee straight. - - [_Exit Balthasar._] - -Well, Juliet, I will lie with thee tonight. -Let’s see for means. O mischief thou art swift -To enter in the thoughts of desperate men. -I do remember an apothecary,— -And hereabouts he dwells,—which late I noted -In tatter’d weeds, with overwhelming brows, -Culling of simples, meagre were his looks, -Sharp misery had worn him to the bones; -And in his needy shop a tortoise hung, -An alligator stuff’d, and other skins -Of ill-shaped fishes; and about his shelves -A beggarly account of empty boxes, -Green earthen pots, bladders, and musty seeds, -Remnants of packthread, and old cakes of roses -Were thinly scatter’d, to make up a show. -Noting this penury, to myself I said, -And if a man did need a poison now, -Whose sale is present death in Mantua, -Here lives a caitiff wretch would sell it him. -O, this same thought did but forerun my need, -And this same needy man must sell it me. -As I remember, this should be the house. -Being holiday, the beggar’s shop is shut. -What, ho! Apothecary! - - Enter Apothecary. - -APOTHECARY. -Who calls so loud? - -ROMEO. -Come hither, man. I see that thou art poor. -Hold, there is forty ducats. Let me have -A dram of poison, such soon-speeding gear -As will disperse itself through all the veins, -That the life-weary taker may fall dead, -And that the trunk may be discharg’d of breath -As violently as hasty powder fir’d -Doth hurry from the fatal cannon’s womb. - -APOTHECARY. -Such mortal drugs I have, but Mantua’s law -Is death to any he that utters them. - -ROMEO. -Art thou so bare and full of wretchedness, -And fear’st to die? Famine is in thy cheeks, -Need and oppression starveth in thine eyes, -Contempt and beggary hangs upon thy back. -The world is not thy friend, nor the world’s law; -The world affords no law to make thee rich; -Then be not poor, but break it and take this. - -APOTHECARY. -My poverty, but not my will consents. - -ROMEO. -I pay thy poverty, and not thy will. - -APOTHECARY. -Put this in any liquid thing you will -And drink it off; and, if you had the strength -Of twenty men, it would despatch you straight. - -ROMEO. -There is thy gold, worse poison to men’s souls, -Doing more murder in this loathsome world -Than these poor compounds that thou mayst not sell. -I sell thee poison, thou hast sold me none. -Farewell, buy food, and get thyself in flesh. -Come, cordial and not poison, go with me -To Juliet’s grave, for there must I use thee. - - [_Exeunt._] - -SCENE II. Friar Lawrence’s Cell. - - Enter Friar John. - -FRIAR JOHN. -Holy Franciscan Friar! Brother, ho! - - Enter Friar Lawrence. - -FRIAR LAWRENCE. -This same should be the voice of Friar John. -Welcome from Mantua. What says Romeo? -Or, if his mind be writ, give me his letter. - -FRIAR JOHN. -Going to find a barefoot brother out, -One of our order, to associate me, -Here in this city visiting the sick, -And finding him, the searchers of the town, -Suspecting that we both were in a house -Where the infectious pestilence did reign, -Seal’d up the doors, and would not let us forth, -So that my speed to Mantua there was stay’d. - -FRIAR LAWRENCE. -Who bare my letter then to Romeo? - -FRIAR JOHN. -I could not send it,—here it is again,— -Nor get a messenger to bring it thee, -So fearful were they of infection. - -FRIAR LAWRENCE. -Unhappy fortune! By my brotherhood, -The letter was not nice, but full of charge, -Of dear import, and the neglecting it -May do much danger. Friar John, go hence, -Get me an iron crow and bring it straight -Unto my cell. - -FRIAR JOHN. -Brother, I’ll go and bring it thee. - - [_Exit._] - -FRIAR LAWRENCE. -Now must I to the monument alone. -Within this three hours will fair Juliet wake. -She will beshrew me much that Romeo -Hath had no notice of these accidents; -But I will write again to Mantua, -And keep her at my cell till Romeo come. -Poor living corse, clos’d in a dead man’s tomb. - - [_Exit._] - -SCENE III. A churchyard; in it a Monument belonging to the Capulets. - - Enter Paris, and his Page bearing flowers and a torch. - -PARIS. -Give me thy torch, boy. Hence and stand aloof. -Yet put it out, for I would not be seen. -Under yond yew tree lay thee all along, -Holding thy ear close to the hollow ground; -So shall no foot upon the churchyard tread, -Being loose, unfirm, with digging up of graves, -But thou shalt hear it. Whistle then to me, -As signal that thou hear’st something approach. -Give me those flowers. Do as I bid thee, go. - -PAGE. -[_Aside._] I am almost afraid to stand alone -Here in the churchyard; yet I will adventure. - - [_Retires._] - -PARIS. -Sweet flower, with flowers thy bridal bed I strew. -O woe, thy canopy is dust and stones, -Which with sweet water nightly I will dew, -Or wanting that, with tears distill’d by moans. -The obsequies that I for thee will keep, -Nightly shall be to strew thy grave and weep. - - [_The Page whistles._] - -The boy gives warning something doth approach. -What cursed foot wanders this way tonight, -To cross my obsequies and true love’s rite? -What, with a torch! Muffle me, night, awhile. - - [_Retires._] - - Enter Romeo and Balthasar with a torch, mattock, &c. - -ROMEO. -Give me that mattock and the wrenching iron. -Hold, take this letter; early in the morning -See thou deliver it to my lord and father. -Give me the light; upon thy life I charge thee, -Whate’er thou hear’st or seest, stand all aloof -And do not interrupt me in my course. -Why I descend into this bed of death -Is partly to behold my lady’s face, -But chiefly to take thence from her dead finger -A precious ring, a ring that I must use -In dear employment. Therefore hence, be gone. -But if thou jealous dost return to pry -In what I further shall intend to do, -By heaven I will tear thee joint by joint, -And strew this hungry churchyard with thy limbs. -The time and my intents are savage-wild; -More fierce and more inexorable far -Than empty tigers or the roaring sea. - -BALTHASAR. -I will be gone, sir, and not trouble you. - -ROMEO. -So shalt thou show me friendship. Take thou that. -Live, and be prosperous, and farewell, good fellow. - -BALTHASAR. -For all this same, I’ll hide me hereabout. -His looks I fear, and his intents I doubt. - - [_Retires_] - -ROMEO. -Thou detestable maw, thou womb of death, -Gorg’d with the dearest morsel of the earth, -Thus I enforce thy rotten jaws to open, - - [_Breaking open the door of the monument._] - -And in despite, I’ll cram thee with more food. - -PARIS. -This is that banish’d haughty Montague -That murder’d my love’s cousin,—with which grief, -It is supposed, the fair creature died,— -And here is come to do some villanous shame -To the dead bodies. I will apprehend him. - - [_Advances._] - -Stop thy unhallow’d toil, vile Montague. -Can vengeance be pursu’d further than death? -Condemned villain, I do apprehend thee. -Obey, and go with me, for thou must die. - -ROMEO. -I must indeed; and therefore came I hither. -Good gentle youth, tempt not a desperate man. -Fly hence and leave me. Think upon these gone; -Let them affright thee. I beseech thee, youth, -Put not another sin upon my head -By urging me to fury. O be gone. -By heaven I love thee better than myself; -For I come hither arm’d against myself. -Stay not, be gone, live, and hereafter say, -A madman’s mercy bid thee run away. - -PARIS. -I do defy thy conjuration, -And apprehend thee for a felon here. - -ROMEO. -Wilt thou provoke me? Then have at thee, boy! - - [_They fight._] - -PAGE. -O lord, they fight! I will go call the watch. - - [_Exit._] - -PARIS. -O, I am slain! [_Falls._] If thou be merciful, -Open the tomb, lay me with Juliet. - - [_Dies._] - -ROMEO. -In faith, I will. Let me peruse this face. -Mercutio’s kinsman, noble County Paris! -What said my man, when my betossed soul -Did not attend him as we rode? I think -He told me Paris should have married Juliet. -Said he not so? Or did I dream it so? -Or am I mad, hearing him talk of Juliet, -To think it was so? O, give me thy hand, -One writ with me in sour misfortune’s book. -I’ll bury thee in a triumphant grave. -A grave? O no, a lantern, slaught’red youth, -For here lies Juliet, and her beauty makes -This vault a feasting presence full of light. -Death, lie thou there, by a dead man interr’d. - - [_Laying Paris in the monument._] - -How oft when men are at the point of death -Have they been merry! Which their keepers call -A lightning before death. O, how may I -Call this a lightning? O my love, my wife, -Death that hath suck’d the honey of thy breath, -Hath had no power yet upon thy beauty. -Thou art not conquer’d. Beauty’s ensign yet -Is crimson in thy lips and in thy cheeks, -And death’s pale flag is not advanced there. -Tybalt, liest thou there in thy bloody sheet? -O, what more favour can I do to thee -Than with that hand that cut thy youth in twain -To sunder his that was thine enemy? -Forgive me, cousin. Ah, dear Juliet, -Why art thou yet so fair? Shall I believe -That unsubstantial death is amorous; -And that the lean abhorred monster keeps -Thee here in dark to be his paramour? -For fear of that I still will stay with thee, -And never from this palace of dim night -Depart again. Here, here will I remain -With worms that are thy chambermaids. O, here -Will I set up my everlasting rest; -And shake the yoke of inauspicious stars -From this world-wearied flesh. Eyes, look your last. -Arms, take your last embrace! And, lips, O you -The doors of breath, seal with a righteous kiss -A dateless bargain to engrossing death. -Come, bitter conduct, come, unsavoury guide. -Thou desperate pilot, now at once run on -The dashing rocks thy sea-sick weary bark. -Here’s to my love! [_Drinks._] O true apothecary! -Thy drugs are quick. Thus with a kiss I die. - - [_Dies._] - - Enter, at the other end of the Churchyard, Friar Lawrence, with a - lantern, crow, and spade. - -FRIAR LAWRENCE. -Saint Francis be my speed. How oft tonight -Have my old feet stumbled at graves? Who’s there? -Who is it that consorts, so late, the dead? - -BALTHASAR. -Here’s one, a friend, and one that knows you well. - -FRIAR LAWRENCE. -Bliss be upon you. Tell me, good my friend, -What torch is yond that vainly lends his light -To grubs and eyeless skulls? As I discern, -It burneth in the Capels’ monument. - -BALTHASAR. -It doth so, holy sir, and there’s my master, -One that you love. - -FRIAR LAWRENCE. -Who is it? - -BALTHASAR. -Romeo. - -FRIAR LAWRENCE. -How long hath he been there? - -BALTHASAR. -Full half an hour. - -FRIAR LAWRENCE. -Go with me to the vault. - -BALTHASAR. -I dare not, sir; -My master knows not but I am gone hence, -And fearfully did menace me with death -If I did stay to look on his intents. - -FRIAR LAWRENCE. -Stay then, I’ll go alone. Fear comes upon me. -O, much I fear some ill unlucky thing. - -BALTHASAR. -As I did sleep under this yew tree here, -I dreamt my master and another fought, -And that my master slew him. - -FRIAR LAWRENCE. -Romeo! [_Advances._] -Alack, alack, what blood is this which stains -The stony entrance of this sepulchre? -What mean these masterless and gory swords -To lie discolour’d by this place of peace? - - [_Enters the monument._] - -Romeo! O, pale! Who else? What, Paris too? -And steep’d in blood? Ah what an unkind hour -Is guilty of this lamentable chance? -The lady stirs. - - [_Juliet wakes and stirs._] - -JULIET. -O comfortable Friar, where is my lord? -I do remember well where I should be, -And there I am. Where is my Romeo? - - [_Noise within._] - -FRIAR LAWRENCE. -I hear some noise. Lady, come from that nest -Of death, contagion, and unnatural sleep. -A greater power than we can contradict -Hath thwarted our intents. Come, come away. -Thy husband in thy bosom there lies dead; -And Paris too. Come, I’ll dispose of thee -Among a sisterhood of holy nuns. -Stay not to question, for the watch is coming. -Come, go, good Juliet. I dare no longer stay. - -JULIET. -Go, get thee hence, for I will not away. - - [_Exit Friar Lawrence._] - -What’s here? A cup clos’d in my true love’s hand? -Poison, I see, hath been his timeless end. -O churl. Drink all, and left no friendly drop -To help me after? I will kiss thy lips. -Haply some poison yet doth hang on them, -To make me die with a restorative. - - [_Kisses him._] - -Thy lips are warm! - -FIRST WATCH. -[_Within._] Lead, boy. Which way? - -JULIET. -Yea, noise? Then I’ll be brief. O happy dagger. - - [_Snatching Romeo’s dagger._] - -This is thy sheath. [_stabs herself_] There rest, and let me die. - - [_Falls on Romeo’s body and dies._] - - Enter Watch with the Page of Paris. - -PAGE. -This is the place. There, where the torch doth burn. - -FIRST WATCH. -The ground is bloody. Search about the churchyard. -Go, some of you, whoe’er you find attach. - - [_Exeunt some of the Watch._] - -Pitiful sight! Here lies the County slain, -And Juliet bleeding, warm, and newly dead, -Who here hath lain this two days buried. -Go tell the Prince; run to the Capulets. -Raise up the Montagues, some others search. - - [_Exeunt others of the Watch._] - -We see the ground whereon these woes do lie, -But the true ground of all these piteous woes -We cannot without circumstance descry. - - Re-enter some of the Watch with Balthasar. - -SECOND WATCH. -Here’s Romeo’s man. We found him in the churchyard. - -FIRST WATCH. -Hold him in safety till the Prince come hither. - - Re-enter others of the Watch with Friar Lawrence. - -THIRD WATCH. Here is a Friar that trembles, sighs, and weeps. -We took this mattock and this spade from him -As he was coming from this churchyard side. - -FIRST WATCH. -A great suspicion. Stay the Friar too. - - Enter the Prince and Attendants. - -PRINCE. -What misadventure is so early up, -That calls our person from our morning’s rest? - - Enter Capulet, Lady Capulet and others. - -CAPULET. -What should it be that they so shriek abroad? - -LADY CAPULET. -O the people in the street cry Romeo, -Some Juliet, and some Paris, and all run -With open outcry toward our monument. - -PRINCE. -What fear is this which startles in our ears? - -FIRST WATCH. -Sovereign, here lies the County Paris slain, -And Romeo dead, and Juliet, dead before, -Warm and new kill’d. - -PRINCE. -Search, seek, and know how this foul murder comes. - -FIRST WATCH. -Here is a Friar, and slaughter’d Romeo’s man, -With instruments upon them fit to open -These dead men’s tombs. - -CAPULET. -O heaven! O wife, look how our daughter bleeds! -This dagger hath mista’en, for lo, his house -Is empty on the back of Montague, -And it mis-sheathed in my daughter’s bosom. - -LADY CAPULET. -O me! This sight of death is as a bell -That warns my old age to a sepulchre. - - Enter Montague and others. - -PRINCE. -Come, Montague, for thou art early up, -To see thy son and heir more early down. - -MONTAGUE. -Alas, my liege, my wife is dead tonight. -Grief of my son’s exile hath stopp’d her breath. -What further woe conspires against mine age? - -PRINCE. -Look, and thou shalt see. - -MONTAGUE. -O thou untaught! What manners is in this, -To press before thy father to a grave? - -PRINCE. -Seal up the mouth of outrage for a while, -Till we can clear these ambiguities, -And know their spring, their head, their true descent, -And then will I be general of your woes, -And lead you even to death. Meantime forbear, -And let mischance be slave to patience. -Bring forth the parties of suspicion. - -FRIAR LAWRENCE. -I am the greatest, able to do least, -Yet most suspected, as the time and place -Doth make against me, of this direful murder. -And here I stand, both to impeach and purge -Myself condemned and myself excus’d. - -PRINCE. -Then say at once what thou dost know in this. - -FRIAR LAWRENCE. -I will be brief, for my short date of breath -Is not so long as is a tedious tale. -Romeo, there dead, was husband to that Juliet, -And she, there dead, that Romeo’s faithful wife. -I married them; and their stol’n marriage day -Was Tybalt’s doomsday, whose untimely death -Banish’d the new-made bridegroom from this city; -For whom, and not for Tybalt, Juliet pin’d. -You, to remove that siege of grief from her, -Betroth’d, and would have married her perforce -To County Paris. Then comes she to me, -And with wild looks, bid me devise some means -To rid her from this second marriage, -Or in my cell there would she kill herself. -Then gave I her, so tutored by my art, -A sleeping potion, which so took effect -As I intended, for it wrought on her -The form of death. Meantime I writ to Romeo -That he should hither come as this dire night -To help to take her from her borrow’d grave, -Being the time the potion’s force should cease. -But he which bore my letter, Friar John, -Was stay’d by accident; and yesternight -Return’d my letter back. Then all alone -At the prefixed hour of her waking -Came I to take her from her kindred’s vault, -Meaning to keep her closely at my cell -Till I conveniently could send to Romeo. -But when I came, some minute ere the time -Of her awaking, here untimely lay -The noble Paris and true Romeo dead. -She wakes; and I entreated her come forth -And bear this work of heaven with patience. -But then a noise did scare me from the tomb; -And she, too desperate, would not go with me, -But, as it seems, did violence on herself. -All this I know; and to the marriage -Her Nurse is privy. And if ought in this -Miscarried by my fault, let my old life -Be sacrific’d, some hour before his time, -Unto the rigour of severest law. - -PRINCE. -We still have known thee for a holy man. -Where’s Romeo’s man? What can he say to this? - -BALTHASAR. -I brought my master news of Juliet’s death, -And then in post he came from Mantua -To this same place, to this same monument. -This letter he early bid me give his father, -And threaten’d me with death, going in the vault, -If I departed not, and left him there. - -PRINCE. -Give me the letter, I will look on it. -Where is the County’s Page that rais’d the watch? -Sirrah, what made your master in this place? - -PAGE. -He came with flowers to strew his lady’s grave, -And bid me stand aloof, and so I did. -Anon comes one with light to ope the tomb, -And by and by my master drew on him, -And then I ran away to call the watch. - -PRINCE. -This letter doth make good the Friar’s words, -Their course of love, the tidings of her death. -And here he writes that he did buy a poison -Of a poor ’pothecary, and therewithal -Came to this vault to die, and lie with Juliet. -Where be these enemies? Capulet, Montague, -See what a scourge is laid upon your hate, -That heaven finds means to kill your joys with love! -And I, for winking at your discords too, -Have lost a brace of kinsmen. All are punish’d. - -CAPULET. -O brother Montague, give me thy hand. -This is my daughter’s jointure, for no more -Can I demand. - -MONTAGUE. -But I can give thee more, -For I will raise her statue in pure gold, -That whiles Verona by that name is known, -There shall no figure at such rate be set -As that of true and faithful Juliet. - -CAPULET. -As rich shall Romeo’s by his lady’s lie, -Poor sacrifices of our enmity. - -PRINCE. -A glooming peace this morning with it brings; -The sun for sorrow will not show his head. -Go hence, to have more talk of these sad things. -Some shall be pardon’d, and some punished, -For never was a story of more woe -Than this of Juliet and her Romeo. - - [_Exeunt._] diff --git a/examples/ch17/SparkWordCount/RomeoAndJulietCounter.ipynb b/examples/ch17/SparkWordCount/RomeoAndJulietCounter.ipynb deleted file mode 100644 index d5d75ba..0000000 --- a/examples/ch17/SparkWordCount/RomeoAndJulietCounter.ipynb +++ /dev/null @@ -1,128 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import nltk\n", - "nltk.download('stopwords')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from nltk.corpus import stopwords\n", - "stop_words = stopwords.words('english')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pyspark import SparkConf\n", - "configuration = SparkConf().setAppName('RomeoAndJulietCounter')\\\n", - " .setMaster('local[*]')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pyspark import SparkContext\n", - "sc = SparkContext(conf=configuration)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from textblob.utils import strip_punc\n", - "tokenized = sc.textFile('RomeoAndJuliet.txt')\\\n", - " .map(lambda line: strip_punc(line, all=True).lower())\\\n", - " .flatMap(lambda line: line.split())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "filtered = tokenized.filter(lambda word: word not in stop_words)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from operator import add\n", - "word_counts = filtered.map(lambda word: (word, 1)).reduceByKey(add)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "filtered_counts = word_counts.filter(lambda item: item[1] >= 60)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from operator import itemgetter\n", - "sorted_items = sorted(filtered_counts.collect(),\n", - " key=itemgetter(1), reverse=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "max_len = max([len(word) for word, count in sorted_items])\n", - "for word, count in sorted_items:\n", - " print(f'{word:>{max_len}}: {count}')" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch17/SparkWordCountAzureVersion/RomeoAndJulietCounter.ipynb b/examples/ch17/SparkWordCountAzureVersion/RomeoAndJulietCounter.ipynb deleted file mode 100755 index bf2a1c9..0000000 --- a/examples/ch17/SparkWordCountAzureVersion/RomeoAndJulietCounter.ipynb +++ /dev/null @@ -1,125 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false, - "scrolled": true - }, - "outputs": [], - "source": [ - "import nltk\n", - "nltk.download('stopwords', download_dir='.')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from nltk.corpus import stopwords\n", - "nltk.data.path.append('.')\n", - "stop_words = stopwords.words('english')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from textblob.utils import strip_punc\n", - "tokenized = sc.textFile('wasb:///example/data/RomeoAndJuliet.txt')\\\n", - " .map(lambda line: strip_punc(line, all=True).lower())\\\n", - " .flatMap(lambda line: line.split())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "filtered = tokenized.filter(lambda word: word not in stop_words)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "from operator import add\n", - "word_counts = filtered.map(lambda word: (word, 1)).reduceByKey(add)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "filtered_counts = word_counts.filter(lambda item: item[1] >= 60)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "from operator import itemgetter\n", - "sorted_items = sorted(filtered_counts.collect(), \n", - " key=itemgetter(1), reverse=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "max_len = max([len(word) for word, count in sorted_items])\n", - "for word, count in sorted_items:\n", - " print('{:>{width}}: {}'.format(word, count, width=max_len))" - ] - } - ], - "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.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch17/TwitterMongoDB/18_05.ipynb b/examples/ch17/TwitterMongoDB/18_05.ipynb deleted file mode 100644 index 0ae7442..0000000 --- a/examples/ch17/TwitterMongoDB/18_05.ipynb +++ /dev/null @@ -1,591 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 18.5 Case Study: A MongoDB JSON Document Database\n", - "### Installing the Python Libraries Required for Interacting with MongoDB\n", - "### keys.py \n", - "## 18.5.1 Creating the MongoDB Atlas Cluster\n", - "### Creating Your First Database User\n", - "### Whitelist Your IP Address\n", - "### Connect to Your Cluster\n", - "## 18.5.2 Streaming Tweets into MongoDB\n", - "### Use Tweepy to Authenticate with Twitter" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import tweepy, keys" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "auth = tweepy.OAuthHandler(\n", - " keys.consumer_key, keys.consumer_secret)\n", - "auth.set_access_token(keys.access_token, \n", - " keys.access_token_secret)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "api = tweepy.API(auth, wait_on_rate_limit=True, \n", - " wait_on_rate_limit_notify=True) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Loading the Senators’ Data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "senators_df = pd.read_csv('senators.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "senators_df['TwitterID'] = senators_df['TwitterID'].astype(str)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.options.display.max_columns = 6" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "senators_df.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Configuring the MongoClient " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pymongo import MongoClient" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "atlas_client = MongoClient(keys.mongo_connection_string)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "db = atlas_client.senators " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Setting up Tweet Stream" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from tweetlistener import TweetListener" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweet_limit = 10000" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "twitter_stream = tweepy.Stream(api.auth, \n", - " TweetListener(api, db, tweet_limit))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Starting the Tweet Stream" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "twitter_stream.filter(track=senators_df.TwitterHandle.tolist(),\n", - " follow=senators_df.TwitterID.tolist())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Class TweetListener" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```python\n", - "# tweetlistener.py\n", - "\"\"\"TweetListener downloads tweets and stores them in MongoDB.\"\"\"\n", - "import json\n", - "import tweepy\n", - "\n", - "class TweetListener(tweepy.StreamListener):\n", - " \"\"\"Handles incoming Tweet stream.\"\"\"\n", - "\n", - " def __init__(self, api, database, limit=10000):\n", - " \"\"\"Create instance variables for tracking number of tweets.\"\"\"\n", - " self.db = database\n", - " self.tweet_count = 0\n", - " self.TWEET_LIMIT = limit # 10,000 by default\n", - " super().__init__(api) # call superclass's init\n", - "\n", - " def on_connect(self):\n", - " \"\"\"Called when your connection attempt is successful, enabling \n", - " you to perform appropriate application tasks at that point.\"\"\"\n", - " print('Successfully connected to Twitter\\n')\n", - "\n", - " def on_data(self, data):\n", - " \"\"\"Called when Twitter pushes a new tweet to you.\"\"\"\n", - " self.tweet_count += 1 # track number of tweets processed\n", - " json_data = json.loads(data) # convert string to JSON\n", - " self.db.tweets.insert_one(json_data) # store in tweets collection\n", - " print(f' Screen name: {json_data[\"user\"][\"name\"]}') \n", - " print(f' Created at: {json_data[\"created_at\"]}') \n", - " print(f'Tweets received: {self.tweet_count}') \n", - "\n", - " # if TWEET_LIMIT is reached, return False to terminate streaming\n", - " return self.tweet_count != self.TWEET_LIMIT\n", - " \n", - " def on_error(self, status):\n", - " print(status)\n", - " return True\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Counting Tweets for Each Senator" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "db.tweets.create_index([('$**', 'text')])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweet_counts = []" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for senator in senators_df.TwitterHandle:\n", - " tweet_counts.append(db.tweets.count_documents(\n", - " {\"$text\": {\"$search\": senator}}))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Show Tweet Counts for Each Senator " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweet_counts_df = senators_df.assign(Tweets=tweet_counts)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweet_counts_df.sort_values(by='Tweets', \n", - " ascending=False).head(10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Get the State Locations for Plotting Markers " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from geopy import OpenMapQuest" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import time" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from state_codes import state_codes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "geo = OpenMapQuest(api_key=keys.mapquest_key) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "states = tweet_counts_df.State.unique()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "states.sort()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "locations = []" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for state in states:\n", - " processed = False\n", - " delay = .1 \n", - " while not processed:\n", - " try:\n", - " locations.append(\n", - " geo.geocode(state_codes[state] + ', USA'))\n", - " print(locations[-1]) \n", - " processed = True\n", - " except: # timed out, so wait before trying again\n", - " print('OpenMapQuest service timed out. Waiting.')\n", - " time.sleep(delay)\n", - " delay += .1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Grouping the Tweet Counts by State " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweets_counts_by_state = tweet_counts_df.groupby(\n", - " 'State', as_index=False).sum()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tweets_counts_by_state.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating the Map " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import folium" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "usmap = folium.Map(location=[39.8283, -98.5795], \n", - " zoom_start=4, detect_retina=True,\n", - " tiles='Stamen Toner')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a Choropleth to Color the Map " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - " choropleth = folium.Choropleth(\n", - " geo_data='us-states.json',\n", - " name='choropleth',\n", - " data=tweets_counts_by_state,\n", - " columns=['State', 'Tweets'],\n", - " key_on='feature.id',\n", - " fill_color='YlOrRd',\n", - " fill_opacity=0.7,\n", - " line_opacity=0.2,\n", - " legend_name='Tweets by State'\n", - ").add_to(usmap)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "layer = folium.LayerControl().add_to(usmap)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating the Map Markers for Each State " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sorted_df = tweet_counts_df.sort_values(\n", - " by='Tweets', ascending=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for index, (name, group) in enumerate(sorted_df.groupby('State')):\n", - " strings = [state_codes[name]] # used to assemble popup text\n", - "\n", - " for s in group.itertuples():\n", - " strings.append(\n", - " f'{s.Name} ({s.Party}); Tweets: {s.Tweets}')\n", - " \n", - " text = '
'.join(strings) \n", - " marker = folium.Marker(\n", - " (locations[index].latitude, locations[index].longitude), \n", - " popup=text)\n", - " marker.add_to(usmap) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Displaying the Map " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "usmap # in a notebook, this will display the map without the need to save it to a file " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If the preceding snippet does not display the map for you, uncomment the following snippet and execute it to save the HTML file to disk as we do in the chapter. You can then open that HTML file in your browser." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# usmap.save('SenatorsTweets.html')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################" - ] - } - ], - "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.6.7" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch17/TwitterMongoDB/18_05.py b/examples/ch17/TwitterMongoDB/18_05.py deleted file mode 100755 index 4c3bb56..0000000 --- a/examples/ch17/TwitterMongoDB/18_05.py +++ /dev/null @@ -1,167 +0,0 @@ -# Section 18.5 snippets - -# Installing the Python Libraries Required for Interacting with MongoDB - -# keys.py - -# 18.5.1 Creating the MongoDB Atlas Cluster - -# Creating Your First Database User - -# Whitelist Your IP Address - -# Connect to Your Cluster - -# 18.5.2 Streaming Tweets into MongoDB - -# Use Tweepy to Authenticate with Twitter -import tweepy, keys - -auth = tweepy.OAuthHandler( - keys.consumer_key, keys.consumer_secret) -auth.set_access_token(keys.access_token, - keys.access_token_secret) - -api = tweepy.API(auth, wait_on_rate_limit=True, - wait_on_rate_limit_notify=True) - -# Loading the Senators’ Data -import pandas as pd - -senators_df = pd.read_csv('senators.csv') - -senators_df['TwitterID'] = senators_df['TwitterID'].astype(str) - -pd.options.display.max_columns = 6 - -senators_df.head() - -# Configuring the MongoClient -from pymongo import MongoClient - -atlas_client = MongoClient(keys.mongo_connection_string) - -db = atlas_client.senators - -# Setting up Tweet Stream -from tweetlistener import TweetListener - -tweet_limit = 10000 - -twitter_stream = tweepy.Stream(api.auth, - TweetListener(api, db, tweet_limit)) - -# Starting the Tweet Stream -twitter_stream.filter(track=senators_df.TwitterHandle.tolist(), - follow=senators_df.TwitterID.tolist()) - -# Class TweetListener - -# Counting Tweets for Each Senator -db.tweets.create_index([('$**', 'text')]) - -tweet_counts = [] - -for senator in senators_df.TwitterHandle: - tweet_counts.append(db.tweets.count_documents( - {"$text": {"$search": senator}})) - -# Show Tweet Counts for Each Senator -tweet_counts_df = senators_df.assign(Tweets=tweet_counts) - -tweet_counts_df.sort_values(by='Tweets', - ascending=False).head(10) - -# Get the State Locations for Plotting Markers -from geopy import OpenMapQuest - -import time - -from state_codes import state_codes - -geo = OpenMapQuest(api_key=keys.mapquest_key) - -states = tweet_counts_df.State.unique() - -states.sort() - -locations = [] - -for state in states: - processed = False - delay = .1 - while not processed: - try: - locations.append( - geo.geocode(state_codes[state] + ', USA')) - print(locations[-1]) - processed = True - except: # timed out, so wait before trying again - print('OpenMapQuest service timed out. Waiting.') - time.sleep(delay) - delay += .1 - -# Grouping the Tweet Counts by State -tweets_counts_by_state = tweet_counts_df.groupby( - 'State', as_index=False).sum() - -tweets_counts_by_state.head() - -# Creating the Map -import folium - -usmap = folium.Map(location=[39.8283, -98.5795], - zoom_start=4, detect_retina=True, - tiles='Stamen Toner') - -# Creating a Choropleth to Color the Map -choropleth = folium.Choropleth( - geo_data='us-states.json', - name='choropleth', - data=tweets_counts_by_state, - columns=['State', 'Tweets'], - key_on='feature.id', - fill_color='YlOrRd', - fill_opacity=0.7, - line_opacity=0.2, - legend_name='Tweets by State' -).add_to(usmap) - -layer = folium.LayerControl().add_to(usmap) - -# Creating the Map Markers for Each State -sorted_df = tweet_counts_df.sort_values( - by='Tweets', ascending=False) - -for index, (name, group) in enumerate(sorted_df.groupby('State')): - strings = [state_codes[name]] # used to assemble popup text - - for s in group.itertuples(): - strings.append( - f'{s.Name} ({s.Party}); Tweets: {s.Tweets}') - - text = '
'.join(strings) - marker = folium.Marker( - (locations[index].latitude, locations[index].longitude), - popup=text) - marker.add_to(usmap) - -# Displaying the Map -usmap.save('SenatorsTweets.html') - - - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch17/TwitterMongoDB/files/art/check.png b/examples/ch17/TwitterMongoDB/files/art/check.png deleted file mode 100755 index eea18cd..0000000 Binary files a/examples/ch17/TwitterMongoDB/files/art/check.png and /dev/null differ diff --git a/examples/ch17/TwitterMongoDB/keys.py b/examples/ch17/TwitterMongoDB/keys.py deleted file mode 100755 index 524dcc6..0000000 --- a/examples/ch17/TwitterMongoDB/keys.py +++ /dev/null @@ -1,8 +0,0 @@ -consumer_key = 'YourConsumerKey' -consumer_secret = 'YourConsumerSecret' -access_token = 'YourAccessToken' -access_token_secret = 'YourAccessTokenSecret' - -mapquest_key = 'YourAPIKey' - -mongo_connection_string = 'YourMongoConnectionString' diff --git a/examples/ch17/TwitterMongoDB/senators.csv b/examples/ch17/TwitterMongoDB/senators.csv deleted file mode 100644 index 76c89fa..0000000 --- a/examples/ch17/TwitterMongoDB/senators.csv +++ /dev/null @@ -1,101 +0,0 @@ -State,Name,Party,TwitterHandle,TwitterID -AL,Richard Shelby,R,SenShelby,21111098 -AL,Doug Jomes,D,SenDougJones,941080085121175552 -AK,Lisa Murkowski,R,lisamurkowski,18061669 -AK,Dan Sullivan,R,SenDanSullivan,2891210047 -AZ,Jon Kyl,R,SenJonKyl,24905240 -AZ,Jeff Flake,R,JeffFlake,16056306 -AR,Tom Cotton,R,SenTomCotton,968650362 -AR,John Boozman,R,JohnBoozman,5558312 -CA,Dianne Feinstein,D,SenFeinstein,476256944 -CA,Kamala Harris,D,SenKamalaHarris,803694179079458816 -CO,Michael Bennet,D,SenBennetCO,224285242 -CO,Cory Gardner,R,SenCoryGardner,235217558 -CT,Christopher Murphy,D,ChrisMurphyCT,150078976 -CT,Richard Blumenthal,D,SenBlumenthal,278124059 -DE,Tom Carper,D,SenatorCarper,249787913 -DE,Chris Coons,D,ChrisCoons,15324851 -FL,Bill Nelson,D,SenBillNelson,20597460 -FL,Marco Rubio,R,marcorubio,15745368 -GA,David Perdue,R,SenDavidPerdue,2863210809 -GA,Johnny Isakson,R,SenatorIsakson,78403308 -HI,Brian Schatz,D,brianschatz,47747074 -HI,Mazie Hirono,D,maziehirono,92186819 -ID,Mike Crapo,R,MikeCrapo,600463589 -ID,Jim Risch,R,SenatorRisch,1096059529 -IL,Tammy Duckworth,D,SenDuckworth,1058520120 -IL,Dick Durbin,D,SenatorDurbin,247334603 -IN,Joe Donnelly,D,SenDonnelly,216503958 -IN,Todd Young,R,SenToddYoung,234128524 -IA,Chuck Grassley,R,ChuckGrassley,10615232 -IA,Joni Ernst,R,joniernst,1383059977 -KS,Pat Roberts,R,SenPatRoberts,75364211 -KS,Jerry Moran,R,JerryMoran,18632666 -KY,Mitch McConnell,R,SenateMajLdr,1249982359 -KY,Rand Paul,R,RandPaul,216881337 -LA,Bill Cassidy,R,BillCassidy,55677432 -LA,John Kennedy,R,SenJohnKennedy,816683274076614656 -ME,Angus King,I,SenAngusKing,1068481578 -ME,Susan Collins,R,SenatorCollins,19726613 -MD,Chris VanHollen,D,ChrisVanHollen,18137749 -MD,Ben Cardin,D,SenatorCardin,109071031 -MA,Ed Markey,D,senmarkey,21406834 -MA,Elizabeth Warren,D,SenWarren,970207298 -MI,Gary Peters,D,SenGaryPeters,236511574 -MI,Debbie Stabenow,D,SenStabenow,76456274 -MN,Amy Klobuchar,D,amyklobuchar,33537967 -MN,Tina Smith,D,SenTinaSmith,941000686275387392 -MS,Cindy Hyde-Smith,R,SenHydeSmith,983348251972816896 -MS,Roger Wicker,R,SenatorWicker,264219447 -MO,Claire McCaskill,D,clairecmc,16160352 -MO,Roy Blunt,R,RoyBlunt,21269970 -MT,Steve Daines,R,SteveDaines,11651202 -MT,Jon Tester,D,SenatorTester,515822213 -NE,Deb Fischer,R,SenatorFischer,1071402577 -NE,Ben Sasse,R,BenSasse,1480852568 -NV,Catherine Cortez Masto,D,SenCortezMasto,811313565760163844 -NV,Dean Heller,R,SenDeanHeller,266133081 -NH,Jeanne Shaheen,D,SenatorShaheen,109287731 -NH,Maggie Hassan,D,SenatorHassan,946549322 -NJ,Cory Booker,D,CoryBooker,15808765 -NJ,Bob Menendez,D,SenatorMenendez,18695134 -NM,Martin Heinrich,D,MartinHeinrich,1099199839 -NM,Tom Udall,D,SenatorTomUdall,60828944 -NY,Chuck Schumer,D,SenSchumer,17494010 -NY,Kirsten Gillibrand,D,SenGillibrand,72198806 -NC,Richard Burr,R,SenatorBurr,21157904 -NC,Thom Tillis,R,SenThomTillis,2964174789 -ND,Heidi Heitkamp,D,SenatorHeitkamp,1061029050 -ND,John Hoeven,R,SenJohnHoeven,382791093 -OH,Sherrod Brown,D,SenSherrodBrown,43910797 -OH,Rob Portman,R,SenRobPortman,18915145 -OK,Jim Inhofe,R,jiminhofe,7270292 -OK,James Lankford,R,SenatorLankford,225921757 -OR,Ron Wyden,D,RonWyden,250188760 -OR,Jeff Merkley,D,SenJeffMerkley,29201047 -PA,Bob Casey,D,SenBobCasey,171598736 -PA,Pat Toomey,R,SenToomey,221162525 -RI,Jack Reed,D,SenJackReed,486694111 -RI,Sheldon Whitehouse,D,SenWhitehouse,242555999 -SC,Lindsey Graham,R,LindseyGrahamSC,432895323 -SC,Tim Scott,R,SenatorTimScott,217543151 -SD,Mike Rounds,R,SenatorRounds,2955485182 -SD,John Thune,R,SenJohnThune,296361085 -TN,Lamar Alexander,R,SenAlexander,76649729 -TN,Bob Corker,R,BobCorker,283130017 -TX,John Cornyn,R,JohnCornyn,13218102 -TX,Ted Cruz,R,SenTedCruz,1074480192 -UT,Orrin Hatch,R,SenOrrinHatch,262756641 -UT,Mike Lee,R,SenMikeLee,88784440 -VT,Patrick Leahy,D,SenatorLeahy,242836537 -VT,Bernie Sanders,I,SenatorSanders,946946130 -VA,Tim Kaine,D,timkaine,172858784 -VA,Mark Warner,D,MarkWarner,7429102 -WA,Patty Murray,D,PattyMurray,293131808 -WA,Maria Cantwell,D,SenatorCantwell,117501995 -WV,Shelley Moore Capito,R,SenCapito,193794406 -WV,Joe Manchin,D,Sen_JoeManchin,234374703 -WI,Tammy Baldwin,D,SenatorBaldwin,1074518754 -WI,Ron Johnson,R,SenRonJohnson,233737858 -WY,Mike Enzi,R,SenatorEnzi,291756142 -WY,John Barrasso,R,SenJohnBarrasso,202206694 diff --git a/examples/ch17/TwitterMongoDB/state_codes.py b/examples/ch17/TwitterMongoDB/state_codes.py deleted file mode 100644 index 50ab1bd..0000000 --- a/examples/ch17/TwitterMongoDB/state_codes.py +++ /dev/null @@ -1,52 +0,0 @@ -state_codes = { - 'AL': 'Alabama', - 'AK': 'Alaska', - 'AZ': 'Arizona', - 'AR': 'Arkansas', - 'CA': 'California', - 'CO': 'Colorado', - 'CT': 'Connecticut', - 'DE': 'Delaware', - 'FL': 'Florida', - 'GA': 'Georgia', - 'HI': 'Hawaii', - 'ID': 'Idaho', - 'IL': 'Illinois', - 'IN': 'Indiana', - 'IA': 'Iowa', - 'KS': 'Kansas', - 'KY': 'Kentucky', - 'LA': 'Louisiana', - 'ME': 'Maine', - 'MD': 'Maryland', - 'MA': 'Massachusetts', - 'MI': 'Michigan', - 'MN': 'Minnesota', - 'MS': 'Mississippi', - 'MO': 'Missouri', - 'MT': 'Montana', - 'NE': 'Nebraska', - 'NV': 'Nevada', - 'NH': 'New Hampshire', - 'NJ': 'New Jersey', - 'NM': 'New Mexico', - 'NY': 'New York', - 'NC': 'North Carolina', - 'ND': 'North Dakota', - 'OH': 'Ohio', - 'OK': 'Oklahoma', - 'OR': 'Oregon', - 'PA': 'Pennsylvania', - 'RI': 'Rhode Island', - 'SC': 'South Carolina', - 'SD': 'South Dakota', - 'TN': 'Tennessee', - 'TX': 'Texas', - 'UT': 'Utah', - 'VT': 'Vermont', - 'VA': 'Virginia', - 'WA': 'Washington State', - 'WV': 'West Virginia', - 'WI': 'Wisconsin', - 'WY': 'Wyoming' -} \ No newline at end of file diff --git a/examples/ch17/TwitterMongoDB/tweetlistener.py b/examples/ch17/TwitterMongoDB/tweetlistener.py deleted file mode 100755 index 8e11b25..0000000 --- a/examples/ch17/TwitterMongoDB/tweetlistener.py +++ /dev/null @@ -1,50 +0,0 @@ -# tweetlistener.py -"""TweetListener downloads tweets and stores them in MongoDB.""" -import json -import tweepy - -class TweetListener(tweepy.StreamListener): - """Handles incoming Tweet stream.""" - - def __init__(self, api, database, limit=10000): - """Create instance variables for tracking number of tweets.""" - self.db = database - self.tweet_count = 0 - self.TWEET_LIMIT = limit # 10,000 by default - super().__init__(api) # call superclass's init - - def on_connect(self): - """Called when your connection attempt is successful, enabling - you to perform appropriate application tasks at that point.""" - print('Successfully connected to Twitter\n') - - def on_data(self, data): - """Called when Twitter pushes a new tweet to you.""" - self.tweet_count += 1 # track number of tweets processed - json_data = json.loads(data) # convert string to JSON - self.db.tweets.insert_one(json_data) # store in tweets collection - print(f' Screen name: {json_data["user"]["name"]}') - print(f' Created at: {json_data["created_at"]}') - print(f'Tweets received: {self.tweet_count}') - - # if TWEET_LIMIT is reached, return False to terminate streaming - return self.tweet_count != self.TWEET_LIMIT - - def on_error(self, status): - print(f'Error: {status}') - return True - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch17/TwitterMongoDB/tweets.html b/examples/ch17/TwitterMongoDB/tweets.html deleted file mode 100644 index 8f9bb7f..0000000 --- a/examples/ch17/TwitterMongoDB/tweets.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - -
- - \ No newline at end of file diff --git a/examples/ch17/TwitterMongoDB/us-states.json b/examples/ch17/TwitterMongoDB/us-states.json deleted file mode 100644 index 3036216..0000000 --- a/examples/ch17/TwitterMongoDB/us-states.json +++ /dev/null @@ -1,52 +0,0 @@ -{"type":"FeatureCollection","features":[ -{"type":"Feature","id":"AL","properties":{"name":"Alabama"},"geometry":{"type":"Polygon","coordinates":[[[-87.359296,35.00118],[-85.606675,34.984749],[-85.431413,34.124869],[-85.184951,32.859696],[-85.069935,32.580372],[-84.960397,32.421541],[-85.004212,32.322956],[-84.889196,32.262709],[-85.058981,32.13674],[-85.053504,32.01077],[-85.141136,31.840985],[-85.042551,31.539753],[-85.113751,31.27686],[-85.004212,31.003013],[-85.497137,30.997536],[-87.600282,30.997536],[-87.633143,30.86609],[-87.408589,30.674397],[-87.446927,30.510088],[-87.37025,30.427934],[-87.518128,30.280057],[-87.655051,30.247195],[-87.90699,30.411504],[-87.934375,30.657966],[-88.011052,30.685351],[-88.10416,30.499135],[-88.137022,30.318396],[-88.394438,30.367688],[-88.471115,31.895754],[-88.241084,33.796253],[-88.098683,34.891641],[-88.202745,34.995703],[-87.359296,35.00118]]]}}, -{"type":"Feature","id":"AK","properties":{"name":"Alaska"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-131.602021,55.117982],[-131.569159,55.28229],[-131.355558,55.183705],[-131.38842,55.01392],[-131.645836,55.035827],[-131.602021,55.117982]]],[[[-131.832052,55.42469],[-131.645836,55.304197],[-131.749898,55.128935],[-131.832052,55.189182],[-131.832052,55.42469]]],[[[-132.976733,56.437924],[-132.735747,56.459832],[-132.631685,56.421493],[-132.664547,56.273616],[-132.878148,56.240754],[-133.069841,56.333862],[-132.976733,56.437924]]],[[[-133.595627,56.350293],[-133.162949,56.317431],[-133.05341,56.125739],[-132.620732,55.912138],[-132.472854,55.780691],[-132.4619,55.671152],[-132.357838,55.649245],[-132.341408,55.506844],[-132.166146,55.364444],[-132.144238,55.238474],[-132.029222,55.276813],[-131.97993,55.178228],[-131.958022,54.789365],[-132.029222,54.701734],[-132.308546,54.718165],[-132.385223,54.915335],[-132.483808,54.898904],[-132.686455,55.046781],[-132.746701,54.997489],[-132.916486,55.046781],[-132.889102,54.898904],[-132.73027,54.937242],[-132.626209,54.882473],[-132.675501,54.679826],[-132.867194,54.701734],[-133.157472,54.95915],[-133.239626,55.090597],[-133.223195,55.22752],[-133.453227,55.216566],[-133.453227,55.320628],[-133.277964,55.331582],[-133.102702,55.42469],[-133.17938,55.588998],[-133.387503,55.62186],[-133.420365,55.884753],[-133.497042,56.0162],[-133.639442,55.923092],[-133.694212,56.070969],[-133.546335,56.142169],[-133.666827,56.311955],[-133.595627,56.350293]]],[[[-133.738027,55.556137],[-133.546335,55.490413],[-133.414888,55.572568],[-133.283441,55.534229],[-133.420365,55.386352],[-133.633966,55.430167],[-133.738027,55.556137]]],[[[-133.907813,56.930849],[-134.050213,57.029434],[-133.885905,57.095157],[-133.343688,57.002049],[-133.102702,57.007526],[-132.932917,56.82131],[-132.620732,56.667956],[-132.653593,56.55294],[-132.817901,56.492694],[-133.042456,56.520078],[-133.201287,56.448878],[-133.420365,56.492694],[-133.66135,56.448878],[-133.710643,56.684386],[-133.688735,56.837741],[-133.869474,56.843218],[-133.907813,56.930849]]],[[[-134.115936,56.48174],[-134.25286,56.558417],[-134.400737,56.722725],[-134.417168,56.848695],[-134.296675,56.908941],[-134.170706,56.848695],[-134.143321,56.952757],[-133.748981,56.772017],[-133.710643,56.596755],[-133.847566,56.574848],[-133.935197,56.377678],[-133.836612,56.322908],[-133.957105,56.092877],[-134.110459,56.142169],[-134.132367,55.999769],[-134.230952,56.070969],[-134.291198,56.350293],[-134.115936,56.48174]]],[[[-134.636246,56.28457],[-134.669107,56.169554],[-134.806031,56.235277],[-135.178463,56.67891],[-135.413971,56.810356],[-135.331817,56.914418],[-135.424925,57.166357],[-135.687818,57.369004],[-135.419448,57.566174],[-135.298955,57.48402],[-135.063447,57.418296],[-134.849846,57.407343],[-134.844369,57.248511],[-134.636246,56.728202],[-134.636246,56.28457]]],[[[-134.712923,58.223407],[-134.373353,58.14673],[-134.176183,58.157683],[-134.187137,58.081006],[-133.902336,57.807159],[-134.099505,57.850975],[-134.148798,57.757867],[-133.935197,57.615466],[-133.869474,57.363527],[-134.083075,57.297804],[-134.154275,57.210173],[-134.499322,57.029434],[-134.603384,57.034911],[-134.6472,57.226604],[-134.575999,57.341619],[-134.608861,57.511404],[-134.729354,57.719528],[-134.707446,57.829067],[-134.784123,58.097437],[-134.91557,58.212453],[-134.953908,58.409623],[-134.712923,58.223407]]],[[[-135.857603,57.330665],[-135.715203,57.330665],[-135.567326,57.149926],[-135.633049,57.023957],[-135.857603,56.996572],[-135.824742,57.193742],[-135.857603,57.330665]]],[[[-136.279328,58.206976],[-135.978096,58.201499],[-135.780926,58.28913],[-135.496125,58.168637],[-135.64948,58.037191],[-135.59471,57.987898],[-135.45231,58.135776],[-135.107263,58.086483],[-134.91557,57.976944],[-135.025108,57.779775],[-134.937477,57.763344],[-134.822462,57.500451],[-135.085355,57.462112],[-135.572802,57.675713],[-135.556372,57.456635],[-135.709726,57.369004],[-135.890465,57.407343],[-136.000004,57.544266],[-136.208128,57.637374],[-136.366959,57.829067],[-136.569606,57.916698],[-136.558652,58.075529],[-136.421728,58.130299],[-136.377913,58.267222],[-136.279328,58.206976]]],[[[-147.079854,60.200582],[-147.501579,59.948643],[-147.53444,59.850058],[-147.874011,59.784335],[-147.80281,59.937689],[-147.435855,60.09652],[-147.205824,60.271782],[-147.079854,60.200582]]],[[[-147.561825,60.578491],[-147.616594,60.370367],[-147.758995,60.156767],[-147.956165,60.227967],[-147.791856,60.474429],[-147.561825,60.578491]]],[[[-147.786379,70.245291],[-147.682318,70.201475],[-147.162008,70.15766],[-146.888161,70.185044],[-146.510252,70.185044],[-146.099482,70.146706],[-145.858496,70.168614],[-145.622988,70.08646],[-145.195787,69.993352],[-144.620708,69.971444],[-144.461877,70.026213],[-144.078491,70.059075],[-143.914183,70.130275],[-143.497935,70.141229],[-143.503412,70.091936],[-143.25695,70.119321],[-142.747594,70.042644],[-142.402547,69.916674],[-142.079408,69.856428],[-142.008207,69.801659],[-141.712453,69.790705],[-141.433129,69.697597],[-141.378359,69.63735],[-141.208574,69.686643],[-141.00045,69.648304],[-141.00045,60.304644],[-140.53491,60.22249],[-140.474664,60.310121],[-139.987216,60.184151],[-139.696939,60.342983],[-139.088998,60.359413],[-139.198537,60.091043],[-139.045183,59.997935],[-138.700135,59.910304],[-138.623458,59.767904],[-137.604747,59.242118],[-137.445916,58.908024],[-137.265177,59.001132],[-136.827022,59.159963],[-136.580559,59.16544],[-136.465544,59.285933],[-136.476498,59.466672],[-136.301236,59.466672],[-136.25742,59.625503],[-135.945234,59.663842],[-135.479694,59.800766],[-135.025108,59.565257],[-135.068924,59.422857],[-134.959385,59.280456],[-134.701969,59.247595],[-134.378829,59.033994],[-134.400737,58.973748],[-134.25286,58.858732],[-133.842089,58.727285],[-133.173903,58.152206],[-133.075318,57.998852],[-132.867194,57.845498],[-132.560485,57.505928],[-132.253777,57.21565],[-132.368792,57.095157],[-132.05113,57.051341],[-132.127807,56.876079],[-131.870391,56.804879],[-131.837529,56.602232],[-131.580113,56.613186],[-131.087188,56.405062],[-130.78048,56.366724],[-130.621648,56.268139],[-130.468294,56.240754],[-130.424478,56.142169],[-130.101339,56.114785],[-130.002754,55.994292],[-130.150631,55.769737],[-130.128724,55.583521],[-129.986323,55.276813],[-130.095862,55.200136],[-130.336847,54.920812],[-130.687372,54.718165],[-130.785957,54.822227],[-130.917403,54.789365],[-131.010511,54.997489],[-130.983126,55.08512],[-131.092665,55.189182],[-130.862634,55.298721],[-130.928357,55.337059],[-131.158389,55.200136],[-131.284358,55.287767],[-131.426759,55.238474],[-131.843006,55.457552],[-131.700606,55.698537],[-131.963499,55.616383],[-131.974453,55.49589],[-132.182576,55.588998],[-132.226392,55.704014],[-132.083991,55.829984],[-132.127807,55.955953],[-132.324977,55.851892],[-132.522147,56.076446],[-132.642639,56.032631],[-132.719317,56.218847],[-132.527624,56.339339],[-132.341408,56.339339],[-132.396177,56.487217],[-132.297592,56.67891],[-132.450946,56.673433],[-132.768609,56.837741],[-132.993164,57.034911],[-133.51895,57.177311],[-133.507996,57.577128],[-133.677781,57.62642],[-133.639442,57.790728],[-133.814705,57.834544],[-134.072121,58.053622],[-134.143321,58.168637],[-134.586953,58.206976],[-135.074401,58.502731],[-135.282525,59.192825],[-135.38111,59.033994],[-135.337294,58.891593],[-135.140124,58.617746],[-135.189417,58.573931],[-135.05797,58.349376],[-135.085355,58.201499],[-135.277048,58.234361],[-135.430402,58.398669],[-135.633049,58.426053],[-135.91785,58.382238],[-135.912373,58.617746],[-136.087635,58.814916],[-136.246466,58.75467],[-136.876314,58.962794],[-136.931084,58.902547],[-136.586036,58.836824],[-136.317666,58.672516],[-136.213604,58.667039],[-136.180743,58.535592],[-136.043819,58.382238],[-136.388867,58.294607],[-136.591513,58.349376],[-136.59699,58.212453],[-136.859883,58.316515],[-136.947514,58.393192],[-137.111823,58.393192],[-137.566409,58.590362],[-137.900502,58.765624],[-137.933364,58.869686],[-138.11958,59.02304],[-138.634412,59.132579],[-138.919213,59.247595],[-139.417615,59.379041],[-139.746231,59.505011],[-139.718846,59.641934],[-139.625738,59.598119],[-139.5162,59.68575],[-139.625738,59.88292],[-139.488815,59.992458],[-139.554538,60.041751],[-139.801,59.833627],[-140.315833,59.696704],[-140.92925,59.745996],[-141.444083,59.871966],[-141.46599,59.970551],[-141.706976,59.948643],[-141.964392,60.019843],[-142.539471,60.085566],[-142.873564,60.091043],[-143.623905,60.036274],[-143.892275,59.997935],[-144.231845,60.140336],[-144.65357,60.206059],[-144.785016,60.29369],[-144.834309,60.441568],[-145.124586,60.430614],[-145.223171,60.299167],[-145.738004,60.474429],[-145.820158,60.551106],[-146.351421,60.408706],[-146.608837,60.238921],[-146.718376,60.397752],[-146.608837,60.485383],[-146.455483,60.463475],[-145.951604,60.578491],[-146.017328,60.666122],[-146.252836,60.622307],[-146.345944,60.737322],[-146.565022,60.753753],[-146.784099,61.044031],[-146.866253,60.972831],[-147.172962,60.934492],[-147.271547,60.972831],[-147.375609,60.879723],[-147.758995,60.912584],[-147.775426,60.808523],[-148.032842,60.781138],[-148.153334,60.819476],[-148.065703,61.005692],[-148.175242,61.000215],[-148.350504,60.803046],[-148.109519,60.737322],[-148.087611,60.594922],[-147.939734,60.441568],[-148.027365,60.277259],[-148.219058,60.332029],[-148.273827,60.249875],[-148.087611,60.217013],[-147.983549,59.997935],[-148.251919,59.95412],[-148.399797,59.997935],[-148.635305,59.937689],[-148.755798,59.986981],[-149.067984,59.981505],[-149.05703,60.063659],[-149.204907,60.008889],[-149.287061,59.904827],[-149.418508,59.997935],[-149.582816,59.866489],[-149.511616,59.806242],[-149.741647,59.729565],[-149.949771,59.718611],[-150.031925,59.61455],[-150.25648,59.521442],[-150.409834,59.554303],[-150.579619,59.444764],[-150.716543,59.450241],[-151.001343,59.225687],[-151.308052,59.209256],[-151.406637,59.280456],[-151.592853,59.159963],[-151.976239,59.253071],[-151.888608,59.422857],[-151.636669,59.483103],[-151.47236,59.472149],[-151.423068,59.537872],[-151.127313,59.669319],[-151.116359,59.778858],[-151.505222,59.63098],[-151.828361,59.718611],[-151.8667,59.778858],[-151.702392,60.030797],[-151.423068,60.211536],[-151.379252,60.359413],[-151.297098,60.386798],[-151.264237,60.545629],[-151.406637,60.720892],[-151.06159,60.786615],[-150.404357,61.038554],[-150.245526,60.939969],[-150.042879,60.912584],[-149.741647,61.016646],[-150.075741,61.15357],[-150.207187,61.257632],[-150.47008,61.246678],[-150.656296,61.29597],[-150.711066,61.252155],[-151.023251,61.180954],[-151.165652,61.044031],[-151.477837,61.011169],[-151.800977,60.852338],[-151.833838,60.748276],[-152.080301,60.693507],[-152.13507,60.578491],[-152.310332,60.507291],[-152.392486,60.304644],[-152.732057,60.173197],[-152.567748,60.069136],[-152.704672,59.915781],[-153.022334,59.888397],[-153.049719,59.691227],[-153.345474,59.620026],[-153.438582,59.702181],[-153.586459,59.548826],[-153.761721,59.543349],[-153.72886,59.433811],[-154.117723,59.368087],[-154.1944,59.066856],[-153.750768,59.050425],[-153.400243,58.968271],[-153.301658,58.869686],[-153.444059,58.710854],[-153.679567,58.612269],[-153.898645,58.606793],[-153.920553,58.519161],[-154.062953,58.4863],[-153.99723,58.376761],[-154.145107,58.212453],[-154.46277,58.059098],[-154.643509,58.059098],[-154.818771,58.004329],[-154.988556,58.015283],[-155.120003,57.955037],[-155.081664,57.872883],[-155.328126,57.829067],[-155.377419,57.708574],[-155.547204,57.785251],[-155.73342,57.549743],[-156.045606,57.566174],[-156.023698,57.440204],[-156.209914,57.473066],[-156.34136,57.418296],[-156.34136,57.248511],[-156.549484,56.985618],[-156.883577,56.952757],[-157.157424,56.832264],[-157.20124,56.766541],[-157.376502,56.859649],[-157.672257,56.607709],[-157.754411,56.67891],[-157.918719,56.657002],[-157.957058,56.514601],[-158.126843,56.459832],[-158.32949,56.48174],[-158.488321,56.339339],[-158.208997,56.295524],[-158.510229,55.977861],[-159.375585,55.873799],[-159.616571,55.594475],[-159.676817,55.654722],[-159.643955,55.829984],[-159.813741,55.857368],[-160.027341,55.791645],[-160.060203,55.720445],[-160.394296,55.605429],[-160.536697,55.473983],[-160.580512,55.567091],[-160.668143,55.457552],[-160.865313,55.528752],[-161.232268,55.358967],[-161.506115,55.364444],[-161.467776,55.49589],[-161.588269,55.62186],[-161.697808,55.517798],[-161.686854,55.408259],[-162.053809,55.074166],[-162.179779,55.15632],[-162.218117,55.03035],[-162.470057,55.052258],[-162.508395,55.249428],[-162.661749,55.293244],[-162.716519,55.222043],[-162.579595,55.134412],[-162.645319,54.997489],[-162.847965,54.926289],[-163.00132,55.079643],[-163.187536,55.090597],[-163.220397,55.03035],[-163.034181,54.942719],[-163.373752,54.800319],[-163.14372,54.76198],[-163.138243,54.696257],[-163.329936,54.74555],[-163.587352,54.614103],[-164.085754,54.61958],[-164.332216,54.531949],[-164.354124,54.466226],[-164.638925,54.389548],[-164.847049,54.416933],[-164.918249,54.603149],[-164.710125,54.663395],[-164.551294,54.88795],[-164.34317,54.893427],[-163.894061,55.041304],[-163.532583,55.046781],[-163.39566,54.904381],[-163.291598,55.008443],[-163.313505,55.128935],[-163.105382,55.183705],[-162.880827,55.183705],[-162.579595,55.446598],[-162.245502,55.682106],[-161.807347,55.89023],[-161.292514,55.983338],[-161.078914,55.939523],[-160.87079,55.999769],[-160.816021,55.912138],[-160.931036,55.813553],[-160.805067,55.736876],[-160.766728,55.857368],[-160.509312,55.868322],[-160.438112,55.791645],[-160.27928,55.76426],[-160.273803,55.857368],[-160.536697,55.939523],[-160.558604,55.994292],[-160.383342,56.251708],[-160.147834,56.399586],[-159.830171,56.541986],[-159.326293,56.667956],[-158.959338,56.848695],[-158.784076,56.782971],[-158.641675,56.810356],[-158.701922,56.925372],[-158.658106,57.034911],[-158.378782,57.264942],[-157.995396,57.41282],[-157.688688,57.609989],[-157.705118,57.719528],[-157.458656,58.497254],[-157.07527,58.705377],[-157.119086,58.869686],[-158.039212,58.634177],[-158.32949,58.661562],[-158.40069,58.760147],[-158.564998,58.803962],[-158.619768,58.913501],[-158.767645,58.864209],[-158.860753,58.694424],[-158.701922,58.480823],[-158.893615,58.387715],[-159.0634,58.420577],[-159.392016,58.760147],[-159.616571,58.929932],[-159.731586,58.929932],[-159.808264,58.803962],[-159.906848,58.782055],[-160.054726,58.886116],[-160.235465,58.902547],[-160.317619,59.072332],[-160.854359,58.88064],[-161.33633,58.743716],[-161.374669,58.667039],[-161.752577,58.552023],[-161.938793,58.656085],[-161.769008,58.776578],[-161.829255,59.061379],[-161.955224,59.36261],[-161.703285,59.48858],[-161.911409,59.740519],[-162.092148,59.88292],[-162.234548,60.091043],[-162.448149,60.178674],[-162.502918,59.997935],[-162.760334,59.959597],[-163.171105,59.844581],[-163.66403,59.795289],[-163.9324,59.806242],[-164.162431,59.866489],[-164.189816,60.02532],[-164.386986,60.074613],[-164.699171,60.29369],[-164.962064,60.337506],[-165.268773,60.578491],[-165.060649,60.68803],[-165.016834,60.890677],[-165.175665,60.846861],[-165.197573,60.972831],[-165.120896,61.076893],[-165.323543,61.170001],[-165.34545,61.071416],[-165.591913,61.109754],[-165.624774,61.279539],[-165.816467,61.301447],[-165.920529,61.416463],[-165.915052,61.558863],[-166.106745,61.49314],[-166.139607,61.630064],[-165.904098,61.662925],[-166.095791,61.81628],[-165.756221,61.827233],[-165.756221,62.013449],[-165.674067,62.139419],[-165.044219,62.539236],[-164.912772,62.659728],[-164.819664,62.637821],[-164.874433,62.807606],[-164.633448,63.097884],[-164.425324,63.212899],[-164.036462,63.262192],[-163.73523,63.212899],[-163.313505,63.037637],[-163.039658,63.059545],[-162.661749,63.22933],[-162.272887,63.486746],[-162.075717,63.514131],[-162.026424,63.448408],[-161.555408,63.448408],[-161.13916,63.503177],[-160.766728,63.771547],[-160.766728,63.837271],[-160.952944,64.08921],[-160.974852,64.237087],[-161.26513,64.395918],[-161.374669,64.532842],[-161.078914,64.494503],[-160.79959,64.609519],[-160.783159,64.719058],[-161.144637,64.921705],[-161.413007,64.762873],[-161.664946,64.790258],[-161.900455,64.702627],[-162.168825,64.680719],[-162.234548,64.620473],[-162.541257,64.532842],[-162.634365,64.384965],[-162.787719,64.324718],[-162.858919,64.49998],[-163.045135,64.538319],[-163.176582,64.401395],[-163.253259,64.467119],[-163.598306,64.565704],[-164.304832,64.560227],[-164.80871,64.450688],[-165.000403,64.434257],[-165.411174,64.49998],[-166.188899,64.576658],[-166.391546,64.636904],[-166.484654,64.735489],[-166.413454,64.872412],[-166.692778,64.987428],[-166.638008,65.113398],[-166.462746,65.179121],[-166.517516,65.337952],[-166.796839,65.337952],[-167.026871,65.381768],[-167.47598,65.414629],[-167.711489,65.496784],[-168.072967,65.578938],[-168.105828,65.682999],[-167.541703,65.819923],[-166.829701,66.049954],[-166.3313,66.186878],[-166.046499,66.110201],[-165.756221,66.09377],[-165.690498,66.203309],[-165.86576,66.21974],[-165.88219,66.312848],[-165.186619,66.466202],[-164.403417,66.581218],[-163.981692,66.592172],[-163.751661,66.553833],[-163.872153,66.389525],[-163.828338,66.274509],[-163.915969,66.192355],[-163.768091,66.060908],[-163.494244,66.082816],[-163.149197,66.060908],[-162.749381,66.088293],[-162.634365,66.039001],[-162.371472,66.028047],[-162.14144,66.077339],[-161.840208,66.02257],[-161.549931,66.241647],[-161.341807,66.252601],[-161.199406,66.208786],[-161.128206,66.334755],[-161.528023,66.395002],[-161.911409,66.345709],[-161.87307,66.510017],[-162.174302,66.68528],[-162.502918,66.740049],[-162.601503,66.89888],[-162.344087,66.937219],[-162.015471,66.778388],[-162.075717,66.652418],[-161.916886,66.553833],[-161.571838,66.438817],[-161.489684,66.55931],[-161.884024,66.718141],[-161.714239,67.002942],[-161.851162,67.052235],[-162.240025,66.991988],[-162.639842,67.008419],[-162.700088,67.057712],[-162.902735,67.008419],[-163.740707,67.128912],[-163.757138,67.254881],[-164.009077,67.534205],[-164.211724,67.638267],[-164.534863,67.725898],[-165.192096,67.966884],[-165.493328,68.059992],[-165.794559,68.081899],[-166.243668,68.246208],[-166.681824,68.339316],[-166.703731,68.372177],[-166.375115,68.42147],[-166.227238,68.574824],[-166.216284,68.881533],[-165.329019,68.859625],[-164.255539,68.930825],[-163.976215,68.985595],[-163.532583,69.138949],[-163.110859,69.374457],[-163.023228,69.609966],[-162.842489,69.812613],[-162.470057,69.982398],[-162.311225,70.108367],[-161.851162,70.311014],[-161.779962,70.256245],[-161.396576,70.239814],[-160.837928,70.343876],[-160.487404,70.453415],[-159.649432,70.792985],[-159.33177,70.809416],[-159.298908,70.760123],[-158.975769,70.798462],[-158.658106,70.787508],[-158.033735,70.831323],[-157.420318,70.979201],[-156.812377,71.285909],[-156.565915,71.351633],[-156.522099,71.296863],[-155.585543,71.170894],[-155.508865,71.083263],[-155.832005,70.968247],[-155.979882,70.96277],[-155.974405,70.809416],[-155.503388,70.858708],[-155.476004,70.940862],[-155.262403,71.017539],[-155.191203,70.973724],[-155.032372,71.148986],[-154.566832,70.990155],[-154.643509,70.869662],[-154.353231,70.8368],[-154.183446,70.7656],[-153.931507,70.880616],[-153.487874,70.886093],[-153.235935,70.924431],[-152.589656,70.886093],[-152.26104,70.842277],[-152.419871,70.606769],[-151.817408,70.546523],[-151.773592,70.486276],[-151.187559,70.382214],[-151.182082,70.431507],[-150.760358,70.49723],[-150.355064,70.491753],[-150.349588,70.436984],[-150.114079,70.431507],[-149.867617,70.508184],[-149.462323,70.519138],[-149.177522,70.486276],[-148.78866,70.404122],[-148.607921,70.420553],[-148.350504,70.305537],[-148.202627,70.349353],[-147.961642,70.316491],[-147.786379,70.245291]]],[[[-152.94018,58.026237],[-152.945657,57.982421],[-153.290705,58.048145],[-153.044242,58.305561],[-152.819688,58.327469],[-152.666333,58.562977],[-152.496548,58.354853],[-152.354148,58.426053],[-152.080301,58.311038],[-152.080301,58.152206],[-152.480117,58.130299],[-152.655379,58.059098],[-152.94018,58.026237]]],[[[-153.958891,57.538789],[-153.67409,57.670236],[-153.931507,57.69762],[-153.936983,57.812636],[-153.723383,57.889313],[-153.570028,57.834544],[-153.548121,57.719528],[-153.46049,57.796205],[-153.455013,57.96599],[-153.268797,57.889313],[-153.235935,57.998852],[-153.071627,57.933129],[-152.874457,57.933129],[-152.721103,57.993375],[-152.469163,57.889313],[-152.469163,57.599035],[-152.151501,57.620943],[-152.359625,57.42925],[-152.74301,57.505928],[-152.60061,57.379958],[-152.710149,57.275896],[-152.907319,57.325188],[-152.912796,57.128019],[-153.214027,57.073249],[-153.312612,56.991095],[-153.498828,57.067772],[-153.695998,56.859649],[-153.849352,56.837741],[-154.013661,56.744633],[-154.073907,56.969187],[-154.303938,56.848695],[-154.314892,56.919895],[-154.523016,56.991095],[-154.539447,57.193742],[-154.742094,57.275896],[-154.627078,57.511404],[-154.227261,57.659282],[-153.980799,57.648328],[-153.958891,57.538789]]],[[[-154.53397,56.602232],[-154.742094,56.399586],[-154.807817,56.432447],[-154.53397,56.602232]]],[[[-155.634835,55.923092],[-155.476004,55.912138],[-155.530773,55.704014],[-155.793666,55.731399],[-155.837482,55.802599],[-155.634835,55.923092]]],[[[-159.890418,55.28229],[-159.950664,55.068689],[-160.257373,54.893427],[-160.109495,55.161797],[-160.005433,55.134412],[-159.890418,55.28229]]],[[[-160.520266,55.358967],[-160.33405,55.358967],[-160.339527,55.249428],[-160.525743,55.128935],[-160.690051,55.211089],[-160.794113,55.134412],[-160.854359,55.320628],[-160.79959,55.380875],[-160.520266,55.358967]]],[[[-162.256456,54.981058],[-162.234548,54.893427],[-162.349564,54.838658],[-162.437195,54.931766],[-162.256456,54.981058]]],[[[-162.415287,63.634624],[-162.563165,63.536039],[-162.612457,63.62367],[-162.415287,63.634624]]],[[[-162.80415,54.488133],[-162.590549,54.449795],[-162.612457,54.367641],[-162.782242,54.373118],[-162.80415,54.488133]]],[[[-165.548097,54.29644],[-165.476897,54.181425],[-165.630251,54.132132],[-165.685021,54.252625],[-165.548097,54.29644]]],[[[-165.73979,54.15404],[-166.046499,54.044501],[-166.112222,54.121178],[-165.980775,54.219763],[-165.73979,54.15404]]],[[[-166.364161,60.359413],[-166.13413,60.397752],[-166.084837,60.326552],[-165.88219,60.342983],[-165.685021,60.277259],[-165.646682,59.992458],[-165.750744,59.89935],[-166.00816,59.844581],[-166.062929,59.745996],[-166.440838,59.855535],[-166.6161,59.850058],[-166.994009,59.992458],[-167.125456,59.992458],[-167.344534,60.074613],[-167.421211,60.206059],[-167.311672,60.238921],[-166.93924,60.206059],[-166.763978,60.310121],[-166.577762,60.321075],[-166.495608,60.392275],[-166.364161,60.359413]]],[[[-166.375115,54.01164],[-166.210807,53.934962],[-166.5449,53.748746],[-166.539423,53.715885],[-166.117699,53.852808],[-166.112222,53.776131],[-166.282007,53.683023],[-166.555854,53.622777],[-166.583239,53.529669],[-166.878994,53.431084],[-167.13641,53.425607],[-167.306195,53.332499],[-167.623857,53.250345],[-167.793643,53.337976],[-167.459549,53.442038],[-167.355487,53.425607],[-167.103548,53.513238],[-167.163794,53.611823],[-167.021394,53.715885],[-166.807793,53.666592],[-166.785886,53.732316],[-167.015917,53.754223],[-167.141887,53.825424],[-167.032348,53.945916],[-166.643485,54.017116],[-166.561331,53.880193],[-166.375115,54.01164]]],[[[-168.790446,53.157237],[-168.40706,53.34893],[-168.385152,53.431084],[-168.237275,53.524192],[-168.007243,53.568007],[-167.886751,53.518715],[-167.842935,53.387268],[-168.270136,53.244868],[-168.500168,53.036744],[-168.686384,52.965544],[-168.790446,53.157237]]],[[[-169.74891,52.894344],[-169.705095,52.795759],[-169.962511,52.790282],[-169.989896,52.856005],[-169.74891,52.894344]]],[[[-170.148727,57.221127],[-170.28565,57.128019],[-170.313035,57.221127],[-170.148727,57.221127]]],[[[-170.669036,52.697174],[-170.603313,52.604066],[-170.789529,52.538343],[-170.816914,52.636928],[-170.669036,52.697174]]],[[[-171.742517,63.716778],[-170.94836,63.5689],[-170.488297,63.69487],[-170.280174,63.683916],[-170.093958,63.612716],[-170.044665,63.492223],[-169.644848,63.4265],[-169.518879,63.366254],[-168.99857,63.338869],[-168.686384,63.295053],[-168.856169,63.147176],[-169.108108,63.180038],[-169.376478,63.152653],[-169.513402,63.08693],[-169.639372,62.939052],[-169.831064,63.075976],[-170.055619,63.169084],[-170.263743,63.180038],[-170.362328,63.2841],[-170.866206,63.415546],[-171.101715,63.421023],[-171.463193,63.306007],[-171.73704,63.366254],[-171.852055,63.486746],[-171.742517,63.716778]]],[[[-172.432611,52.390465],[-172.41618,52.275449],[-172.607873,52.253542],[-172.569535,52.352127],[-172.432611,52.390465]]],[[[-173.626584,52.14948],[-173.495138,52.105664],[-173.122706,52.111141],[-173.106275,52.07828],[-173.549907,52.028987],[-173.626584,52.14948]]],[[[-174.322156,52.280926],[-174.327632,52.379511],[-174.185232,52.41785],[-173.982585,52.319265],[-174.059262,52.226157],[-174.179755,52.231634],[-174.141417,52.127572],[-174.333109,52.116618],[-174.738403,52.007079],[-174.968435,52.039941],[-174.902711,52.116618],[-174.656249,52.105664],[-174.322156,52.280926]]],[[[-176.469116,51.853725],[-176.288377,51.870156],[-176.288377,51.744186],[-176.518409,51.760617],[-176.80321,51.61274],[-176.912748,51.80991],[-176.792256,51.815386],[-176.775825,51.963264],[-176.627947,51.968741],[-176.627947,51.859202],[-176.469116,51.853725]]],[[[-177.153734,51.946833],[-177.044195,51.897541],[-177.120872,51.727755],[-177.274226,51.678463],[-177.279703,51.782525],[-177.153734,51.946833]]],[[[-178.123152,51.919448],[-177.953367,51.913971],[-177.800013,51.793479],[-177.964321,51.651078],[-178.123152,51.919448]]],[[[173.107557,52.992929],[173.293773,52.927205],[173.304726,52.823143],[172.90491,52.762897],[172.642017,52.927205],[172.642017,53.003883],[173.107557,52.992929]]]]}}, -{"type":"Feature","id":"AZ","properties":{"name":"Arizona"},"geometry":{"type":"Polygon","coordinates":[[[-109.042503,37.000263],[-109.04798,31.331629],[-111.074448,31.331629],[-112.246513,31.704061],[-114.815198,32.492741],[-114.72209,32.717295],[-114.524921,32.755634],[-114.470151,32.843265],[-114.524921,33.029481],[-114.661844,33.034958],[-114.727567,33.40739],[-114.524921,33.54979],[-114.497536,33.697668],[-114.535874,33.933176],[-114.415382,34.108438],[-114.256551,34.174162],[-114.136058,34.305608],[-114.333228,34.448009],[-114.470151,34.710902],[-114.634459,34.87521],[-114.634459,35.00118],[-114.574213,35.138103],[-114.596121,35.324319],[-114.678275,35.516012],[-114.738521,36.102045],[-114.371566,36.140383],[-114.251074,36.01989],[-114.152489,36.025367],[-114.048427,36.195153],[-114.048427,37.000263],[-110.499369,37.00574],[-109.042503,37.000263]]]}}, -{"type":"Feature","id":"AR","properties":{"name":"Arkansas"},"geometry":{"type":"Polygon","coordinates":[[[-94.473842,36.501861],[-90.152536,36.496384],[-90.064905,36.304691],[-90.218259,36.184199],[-90.377091,35.997983],[-89.730812,35.997983],[-89.763673,35.811767],[-89.911551,35.756997],[-89.944412,35.603643],[-90.130628,35.439335],[-90.114197,35.198349],[-90.212782,35.023087],[-90.311367,34.995703],[-90.251121,34.908072],[-90.409952,34.831394],[-90.481152,34.661609],[-90.585214,34.617794],[-90.568783,34.420624],[-90.749522,34.365854],[-90.744046,34.300131],[-90.952169,34.135823],[-90.891923,34.026284],[-91.072662,33.867453],[-91.231493,33.560744],[-91.056231,33.429298],[-91.143862,33.347144],[-91.089093,33.13902],[-91.16577,33.002096],[-93.608485,33.018527],[-94.041164,33.018527],[-94.041164,33.54979],[-94.183564,33.593606],[-94.380734,33.544313],[-94.484796,33.637421],[-94.430026,35.395519],[-94.616242,36.501861],[-94.473842,36.501861]]]}}, -{"type":"Feature","id":"CA","properties":{"name":"California"},"geometry":{"type":"Polygon","coordinates":[[[-123.233256,42.006186],[-122.378853,42.011663],[-121.037003,41.995232],[-120.001861,41.995232],[-119.996384,40.264519],[-120.001861,38.999346],[-118.71478,38.101128],[-117.498899,37.21934],[-116.540435,36.501861],[-115.85034,35.970598],[-114.634459,35.00118],[-114.634459,34.87521],[-114.470151,34.710902],[-114.333228,34.448009],[-114.136058,34.305608],[-114.256551,34.174162],[-114.415382,34.108438],[-114.535874,33.933176],[-114.497536,33.697668],[-114.524921,33.54979],[-114.727567,33.40739],[-114.661844,33.034958],[-114.524921,33.029481],[-114.470151,32.843265],[-114.524921,32.755634],[-114.72209,32.717295],[-116.04751,32.624187],[-117.126467,32.536556],[-117.24696,32.668003],[-117.252437,32.876127],[-117.329114,33.122589],[-117.471515,33.297851],[-117.7837,33.538836],[-118.183517,33.763391],[-118.260194,33.703145],[-118.413548,33.741483],[-118.391641,33.840068],[-118.566903,34.042715],[-118.802411,33.998899],[-119.218659,34.146777],[-119.278905,34.26727],[-119.558229,34.415147],[-119.875891,34.40967],[-120.138784,34.475393],[-120.472878,34.448009],[-120.64814,34.579455],[-120.609801,34.858779],[-120.670048,34.902595],[-120.631709,35.099764],[-120.894602,35.247642],[-120.905556,35.450289],[-121.004141,35.461243],[-121.168449,35.636505],[-121.283465,35.674843],[-121.332757,35.784382],[-121.716143,36.195153],[-121.896882,36.315645],[-121.935221,36.638785],[-121.858544,36.6114],[-121.787344,36.803093],[-121.929744,36.978355],[-122.105006,36.956447],[-122.335038,37.115279],[-122.417192,37.241248],[-122.400761,37.361741],[-122.515777,37.520572],[-122.515777,37.783465],[-122.329561,37.783465],[-122.406238,38.15042],[-122.488392,38.112082],[-122.504823,37.931343],[-122.701993,37.893004],[-122.937501,38.029928],[-122.97584,38.265436],[-123.129194,38.451652],[-123.331841,38.566668],[-123.44138,38.698114],[-123.737134,38.95553],[-123.687842,39.032208],[-123.824765,39.366301],[-123.764519,39.552517],[-123.85215,39.831841],[-124.109566,40.105688],[-124.361506,40.259042],[-124.410798,40.439781],[-124.158859,40.877937],[-124.109566,41.025814],[-124.158859,41.14083],[-124.065751,41.442061],[-124.147905,41.715908],[-124.257444,41.781632],[-124.213628,42.000709],[-123.233256,42.006186]]]}}, -{"type":"Feature","id":"CO","properties":{"name":"Colorado"},"geometry":{"type":"Polygon","coordinates":[[[-107.919731,41.003906],[-105.728954,40.998429],[-104.053011,41.003906],[-102.053927,41.003906],[-102.053927,40.001626],[-102.042974,36.994786],[-103.001438,37.000263],[-104.337812,36.994786],[-106.868158,36.994786],[-107.421329,37.000263],[-109.042503,37.000263],[-109.042503,38.166851],[-109.058934,38.27639],[-109.053457,39.125316],[-109.04798,40.998429],[-107.919731,41.003906]]]}}, -{"type":"Feature","id":"CT","properties":{"name":"Connecticut"},"geometry":{"type":"Polygon","coordinates":[[[-73.053528,42.039048],[-71.799309,42.022617],[-71.799309,42.006186],[-71.799309,41.414677],[-71.859555,41.321569],[-71.947186,41.338],[-72.385341,41.261322],[-72.905651,41.28323],[-73.130205,41.146307],[-73.371191,41.102491],[-73.655992,40.987475],[-73.727192,41.102491],[-73.48073,41.21203],[-73.55193,41.294184],[-73.486206,42.050002],[-73.053528,42.039048]]]}}, -{"type":"Feature","id":"DE","properties":{"name":"Delaware"},"geometry":{"type":"Polygon","coordinates":[[[-75.414089,39.804456],[-75.507197,39.683964],[-75.611259,39.61824],[-75.589352,39.459409],[-75.441474,39.311532],[-75.403136,39.065069],[-75.189535,38.807653],[-75.09095,38.796699],[-75.047134,38.451652],[-75.693413,38.462606],[-75.786521,39.722302],[-75.616736,39.831841],[-75.414089,39.804456]]]}}, -{"type":"Feature","id":"FL","properties":{"name":"Florida"},"geometry":{"type":"Polygon","coordinates":[[[-85.497137,30.997536],[-85.004212,31.003013],[-84.867289,30.712735],[-83.498053,30.647012],[-82.216449,30.570335],[-82.167157,30.356734],[-82.046664,30.362211],[-82.002849,30.564858],[-82.041187,30.751074],[-81.948079,30.827751],[-81.718048,30.745597],[-81.444201,30.707258],[-81.383954,30.27458],[-81.257985,29.787132],[-80.967707,29.14633],[-80.524075,28.461713],[-80.589798,28.41242],[-80.56789,28.094758],[-80.381674,27.738757],[-80.091397,27.021277],[-80.03115,26.796723],[-80.036627,26.566691],[-80.146166,25.739673],[-80.239274,25.723243],[-80.337859,25.465826],[-80.304997,25.383672],[-80.49669,25.197456],[-80.573367,25.241272],[-80.759583,25.164595],[-81.077246,25.120779],[-81.170354,25.224841],[-81.126538,25.378195],[-81.351093,25.821827],[-81.526355,25.903982],[-81.679709,25.843735],[-81.800202,26.090198],[-81.833064,26.292844],[-82.041187,26.517399],[-82.09048,26.665276],[-82.057618,26.878877],[-82.172634,26.917216],[-82.145249,26.791246],[-82.249311,26.758384],[-82.566974,27.300601],[-82.692943,27.437525],[-82.391711,27.837342],[-82.588881,27.815434],[-82.720328,27.689464],[-82.851774,27.886634],[-82.676512,28.434328],[-82.643651,28.888914],[-82.764143,28.998453],[-82.802482,29.14633],[-82.994175,29.179192],[-83.218729,29.420177],[-83.399469,29.518762],[-83.410422,29.66664],[-83.536392,29.721409],[-83.640454,29.885717],[-84.02384,30.104795],[-84.357933,30.055502],[-84.341502,29.902148],[-84.451041,29.929533],[-84.867289,29.743317],[-85.310921,29.699501],[-85.299967,29.80904],[-85.404029,29.940487],[-85.924338,30.236241],[-86.29677,30.362211],[-86.630863,30.395073],[-86.910187,30.373165],[-87.518128,30.280057],[-87.37025,30.427934],[-87.446927,30.510088],[-87.408589,30.674397],[-87.633143,30.86609],[-87.600282,30.997536],[-85.497137,30.997536]]]}}, -{"type":"Feature","id":"GA","properties":{"name":"Georgia"},"geometry":{"type":"Polygon","coordinates":[[[-83.109191,35.00118],[-83.322791,34.787579],[-83.339222,34.683517],[-83.005129,34.469916],[-82.901067,34.486347],[-82.747713,34.26727],[-82.714851,34.152254],[-82.55602,33.94413],[-82.325988,33.81816],[-82.194542,33.631944],[-81.926172,33.462159],[-81.937125,33.347144],[-81.761863,33.160928],[-81.493493,33.007573],[-81.42777,32.843265],[-81.416816,32.629664],[-81.279893,32.558464],[-81.121061,32.290094],[-81.115584,32.120309],[-80.885553,32.032678],[-81.132015,31.693108],[-81.175831,31.517845],[-81.279893,31.364491],[-81.290846,31.20566],[-81.400385,31.13446],[-81.444201,30.707258],[-81.718048,30.745597],[-81.948079,30.827751],[-82.041187,30.751074],[-82.002849,30.564858],[-82.046664,30.362211],[-82.167157,30.356734],[-82.216449,30.570335],[-83.498053,30.647012],[-84.867289,30.712735],[-85.004212,31.003013],[-85.113751,31.27686],[-85.042551,31.539753],[-85.141136,31.840985],[-85.053504,32.01077],[-85.058981,32.13674],[-84.889196,32.262709],[-85.004212,32.322956],[-84.960397,32.421541],[-85.069935,32.580372],[-85.184951,32.859696],[-85.431413,34.124869],[-85.606675,34.984749],[-84.319594,34.990226],[-83.618546,34.984749],[-83.109191,35.00118]]]}}, -{"type":"Feature","id":"HI","properties":{"name":"Hawaii"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-155.634835,18.948267],[-155.881297,19.035898],[-155.919636,19.123529],[-155.886774,19.348084],[-156.062036,19.73147],[-155.925113,19.857439],[-155.826528,20.032702],[-155.897728,20.147717],[-155.87582,20.26821],[-155.596496,20.12581],[-155.284311,20.021748],[-155.092618,19.868393],[-155.092618,19.736947],[-154.807817,19.523346],[-154.983079,19.348084],[-155.295265,19.26593],[-155.514342,19.134483],[-155.634835,18.948267]]],[[[-156.587823,21.029505],[-156.472807,20.892581],[-156.324929,20.952827],[-156.00179,20.793996],[-156.051082,20.651596],[-156.379699,20.580396],[-156.445422,20.60778],[-156.461853,20.783042],[-156.631638,20.821381],[-156.697361,20.919966],[-156.587823,21.029505]]],[[[-156.982162,21.210244],[-157.080747,21.106182],[-157.310779,21.106182],[-157.239579,21.221198],[-156.982162,21.210244]]],[[[-157.951581,21.697691],[-157.842042,21.462183],[-157.896811,21.325259],[-158.110412,21.303352],[-158.252813,21.582676],[-158.126843,21.588153],[-157.951581,21.697691]]],[[[-159.468693,22.228955],[-159.353678,22.218001],[-159.298908,22.113939],[-159.33177,21.966061],[-159.446786,21.872953],[-159.764448,21.987969],[-159.726109,22.152277],[-159.468693,22.228955]]]]}}, -{"type":"Feature","id":"ID","properties":{"name":"Idaho"},"geometry":{"type":"Polygon","coordinates":[[[-116.04751,49.000239],[-116.04751,47.976051],[-115.724371,47.696727],[-115.718894,47.42288],[-115.527201,47.302388],[-115.324554,47.258572],[-115.302646,47.187372],[-114.930214,46.919002],[-114.886399,46.809463],[-114.623506,46.705401],[-114.612552,46.639678],[-114.322274,46.645155],[-114.464674,46.272723],[-114.492059,46.037214],[-114.387997,45.88386],[-114.568736,45.774321],[-114.497536,45.670259],[-114.546828,45.560721],[-114.333228,45.456659],[-114.086765,45.593582],[-113.98818,45.703121],[-113.807441,45.604536],[-113.834826,45.522382],[-113.736241,45.330689],[-113.571933,45.128042],[-113.45144,45.056842],[-113.456917,44.865149],[-113.341901,44.782995],[-113.133778,44.772041],[-113.002331,44.448902],[-112.887315,44.394132],[-112.783254,44.48724],[-112.471068,44.481763],[-112.241036,44.569394],[-112.104113,44.520102],[-111.868605,44.563917],[-111.819312,44.509148],[-111.616665,44.547487],[-111.386634,44.75561],[-111.227803,44.580348],[-111.047063,44.476286],[-111.047063,42.000709],[-112.164359,41.995232],[-114.04295,41.995232],[-117.027882,42.000709],[-117.027882,43.830007],[-116.896436,44.158624],[-116.97859,44.240778],[-117.170283,44.257209],[-117.241483,44.394132],[-117.038836,44.750133],[-116.934774,44.782995],[-116.830713,44.930872],[-116.847143,45.02398],[-116.732128,45.144473],[-116.671881,45.319735],[-116.463758,45.61549],[-116.545912,45.752413],[-116.78142,45.823614],[-116.918344,45.993399],[-116.92382,46.168661],[-117.055267,46.343923],[-117.038836,46.426077],[-117.044313,47.762451],[-117.033359,49.000239],[-116.04751,49.000239]]]}}, -{"type":"Feature","id":"IL","properties":{"name":"Illinois"},"geometry":{"type":"Polygon","coordinates":[[[-90.639984,42.510065],[-88.788778,42.493634],[-87.802929,42.493634],[-87.83579,42.301941],[-87.682436,42.077386],[-87.523605,41.710431],[-87.529082,39.34987],[-87.63862,39.169131],[-87.512651,38.95553],[-87.49622,38.780268],[-87.62219,38.637868],[-87.655051,38.506421],[-87.83579,38.292821],[-87.950806,38.27639],[-87.923421,38.15042],[-88.000098,38.101128],[-88.060345,37.865619],[-88.027483,37.799896],[-88.15893,37.657496],[-88.065822,37.482234],[-88.476592,37.389126],[-88.514931,37.285064],[-88.421823,37.153617],[-88.547792,37.071463],[-88.914747,37.224817],[-89.029763,37.213863],[-89.183118,37.038601],[-89.133825,36.983832],[-89.292656,36.994786],[-89.517211,37.279587],[-89.435057,37.34531],[-89.517211,37.537003],[-89.517211,37.690357],[-89.84035,37.903958],[-89.949889,37.88205],[-90.059428,38.013497],[-90.355183,38.216144],[-90.349706,38.374975],[-90.179921,38.632391],[-90.207305,38.725499],[-90.10872,38.845992],[-90.251121,38.917192],[-90.470199,38.961007],[-90.585214,38.867899],[-90.661891,38.928146],[-90.727615,39.256762],[-91.061708,39.470363],[-91.368417,39.727779],[-91.494386,40.034488],[-91.50534,40.237135],[-91.417709,40.379535],[-91.401278,40.560274],[-91.121954,40.669813],[-91.09457,40.823167],[-90.963123,40.921752],[-90.946692,41.097014],[-91.111001,41.239415],[-91.045277,41.414677],[-90.656414,41.463969],[-90.344229,41.589939],[-90.311367,41.743293],[-90.179921,41.809016],[-90.141582,42.000709],[-90.168967,42.126679],[-90.393521,42.225264],[-90.420906,42.329326],[-90.639984,42.510065]]]}}, -{"type":"Feature","id":"IN","properties":{"name":"Indiana"},"geometry":{"type":"Polygon","coordinates":[[[-85.990061,41.759724],[-84.807042,41.759724],[-84.807042,41.694001],[-84.801565,40.500028],[-84.817996,39.103408],[-84.894673,39.059592],[-84.812519,38.785745],[-84.987781,38.780268],[-85.173997,38.68716],[-85.431413,38.730976],[-85.42046,38.533806],[-85.590245,38.451652],[-85.655968,38.325682],[-85.83123,38.27639],[-85.924338,38.024451],[-86.039354,37.958727],[-86.263908,38.051835],[-86.302247,38.166851],[-86.521325,38.040881],[-86.504894,37.931343],[-86.729448,37.893004],[-86.795172,37.991589],[-87.047111,37.893004],[-87.129265,37.788942],[-87.381204,37.93682],[-87.512651,37.903958],[-87.600282,37.975158],[-87.682436,37.903958],[-87.934375,37.893004],[-88.027483,37.799896],[-88.060345,37.865619],[-88.000098,38.101128],[-87.923421,38.15042],[-87.950806,38.27639],[-87.83579,38.292821],[-87.655051,38.506421],[-87.62219,38.637868],[-87.49622,38.780268],[-87.512651,38.95553],[-87.63862,39.169131],[-87.529082,39.34987],[-87.523605,41.710431],[-87.42502,41.644708],[-87.118311,41.644708],[-86.822556,41.759724],[-85.990061,41.759724]]]}}, -{"type":"Feature","id":"IA","properties":{"name":"Iowa"},"geometry":{"type":"Polygon","coordinates":[[[-91.368417,43.501391],[-91.215062,43.501391],[-91.204109,43.353514],[-91.056231,43.254929],[-91.176724,43.134436],[-91.143862,42.909881],[-91.067185,42.75105],[-90.711184,42.636034],[-90.639984,42.510065],[-90.420906,42.329326],[-90.393521,42.225264],[-90.168967,42.126679],[-90.141582,42.000709],[-90.179921,41.809016],[-90.311367,41.743293],[-90.344229,41.589939],[-90.656414,41.463969],[-91.045277,41.414677],[-91.111001,41.239415],[-90.946692,41.097014],[-90.963123,40.921752],[-91.09457,40.823167],[-91.121954,40.669813],[-91.401278,40.560274],[-91.417709,40.379535],[-91.527248,40.412397],[-91.729895,40.615043],[-91.833957,40.609566],[-93.257961,40.582182],[-94.632673,40.571228],[-95.7664,40.587659],[-95.881416,40.719105],[-95.826646,40.976521],[-95.925231,41.201076],[-95.919754,41.453015],[-96.095016,41.540646],[-96.122401,41.67757],[-96.062155,41.798063],[-96.127878,41.973325],[-96.264801,42.039048],[-96.44554,42.488157],[-96.631756,42.707235],[-96.544125,42.855112],[-96.511264,43.052282],[-96.434587,43.123482],[-96.560556,43.222067],[-96.527695,43.397329],[-96.582464,43.479483],[-96.451017,43.501391],[-91.368417,43.501391]]]}}, -{"type":"Feature","id":"KS","properties":{"name":"Kansas"},"geometry":{"type":"Polygon","coordinates":[[[-101.90605,40.001626],[-95.306337,40.001626],[-95.207752,39.908518],[-94.884612,39.831841],[-95.109167,39.541563],[-94.983197,39.442978],[-94.824366,39.20747],[-94.610765,39.158177],[-94.616242,37.000263],[-100.087706,37.000263],[-102.042974,36.994786],[-102.053927,40.001626],[-101.90605,40.001626]]]}}, -{"type":"Feature","id":"KY","properties":{"name":"Kentucky"},"geometry":{"type":"Polygon","coordinates":[[[-83.903347,38.769315],[-83.678792,38.632391],[-83.519961,38.703591],[-83.142052,38.626914],[-83.032514,38.725499],[-82.890113,38.758361],[-82.846298,38.588575],[-82.731282,38.561191],[-82.594358,38.424267],[-82.621743,38.123036],[-82.50125,37.931343],[-82.342419,37.783465],[-82.293127,37.668449],[-82.101434,37.553434],[-81.969987,37.537003],[-82.353373,37.268633],[-82.720328,37.120755],[-82.720328,37.044078],[-82.868205,36.978355],[-82.879159,36.890724],[-83.070852,36.852385],[-83.136575,36.742847],[-83.673316,36.600446],[-83.689746,36.584015],[-84.544149,36.594969],[-85.289013,36.627831],[-85.486183,36.616877],[-86.592525,36.655216],[-87.852221,36.633308],[-88.071299,36.677123],[-88.054868,36.496384],[-89.298133,36.507338],[-89.418626,36.496384],[-89.363857,36.622354],[-89.215979,36.578538],[-89.133825,36.983832],[-89.183118,37.038601],[-89.029763,37.213863],[-88.914747,37.224817],[-88.547792,37.071463],[-88.421823,37.153617],[-88.514931,37.285064],[-88.476592,37.389126],[-88.065822,37.482234],[-88.15893,37.657496],[-88.027483,37.799896],[-87.934375,37.893004],[-87.682436,37.903958],[-87.600282,37.975158],[-87.512651,37.903958],[-87.381204,37.93682],[-87.129265,37.788942],[-87.047111,37.893004],[-86.795172,37.991589],[-86.729448,37.893004],[-86.504894,37.931343],[-86.521325,38.040881],[-86.302247,38.166851],[-86.263908,38.051835],[-86.039354,37.958727],[-85.924338,38.024451],[-85.83123,38.27639],[-85.655968,38.325682],[-85.590245,38.451652],[-85.42046,38.533806],[-85.431413,38.730976],[-85.173997,38.68716],[-84.987781,38.780268],[-84.812519,38.785745],[-84.894673,39.059592],[-84.817996,39.103408],[-84.43461,39.103408],[-84.231963,38.895284],[-84.215533,38.807653],[-83.903347,38.769315]]]}}, -{"type":"Feature","id":"LA","properties":{"name":"Louisiana"},"geometry":{"type":"Polygon","coordinates":[[[-93.608485,33.018527],[-91.16577,33.002096],[-91.072662,32.887081],[-91.143862,32.843265],[-91.154816,32.640618],[-91.006939,32.514649],[-90.985031,32.218894],[-91.105524,31.988862],[-91.341032,31.846462],[-91.401278,31.621907],[-91.499863,31.643815],[-91.516294,31.27686],[-91.636787,31.265906],[-91.565587,31.068736],[-91.636787,30.997536],[-89.747242,30.997536],[-89.845827,30.66892],[-89.681519,30.449842],[-89.643181,30.285534],[-89.522688,30.181472],[-89.818443,30.044549],[-89.84035,29.945964],[-89.599365,29.88024],[-89.495303,30.039072],[-89.287179,29.88024],[-89.30361,29.754271],[-89.424103,29.699501],[-89.648657,29.748794],[-89.621273,29.655686],[-89.69795,29.513285],[-89.506257,29.387316],[-89.199548,29.348977],[-89.09001,29.2011],[-89.002379,29.179192],[-89.16121,29.009407],[-89.336472,29.042268],[-89.484349,29.217531],[-89.851304,29.310638],[-89.851304,29.480424],[-90.032043,29.425654],[-90.021089,29.283254],[-90.103244,29.151807],[-90.23469,29.129899],[-90.333275,29.277777],[-90.563307,29.283254],[-90.645461,29.129899],[-90.798815,29.086084],[-90.963123,29.179192],[-91.09457,29.190146],[-91.220539,29.436608],[-91.445094,29.546147],[-91.532725,29.529716],[-91.620356,29.73784],[-91.883249,29.710455],[-91.888726,29.836425],[-92.146142,29.715932],[-92.113281,29.622824],[-92.31045,29.535193],[-92.617159,29.579009],[-92.97316,29.715932],[-93.2251,29.776178],[-93.767317,29.726886],[-93.838517,29.688547],[-93.926148,29.787132],[-93.690639,30.143133],[-93.767317,30.334826],[-93.696116,30.438888],[-93.728978,30.575812],[-93.630393,30.679874],[-93.526331,30.93729],[-93.542762,31.15089],[-93.816609,31.556184],[-93.822086,31.775262],[-94.041164,31.994339],[-94.041164,33.018527],[-93.608485,33.018527]]]}}, -{"type":"Feature","id":"ME","properties":{"name":"Maine"},"geometry":{"type":"Polygon","coordinates":[[[-70.703921,43.057759],[-70.824413,43.128959],[-70.807983,43.227544],[-70.966814,43.34256],[-71.032537,44.657025],[-71.08183,45.303304],[-70.649151,45.440228],[-70.720352,45.511428],[-70.556043,45.664782],[-70.386258,45.735983],[-70.41912,45.796229],[-70.260289,45.889337],[-70.309581,46.064599],[-70.210996,46.327492],[-70.057642,46.415123],[-69.997395,46.694447],[-69.225147,47.461219],[-69.044408,47.428357],[-69.033454,47.242141],[-68.902007,47.176418],[-68.578868,47.285957],[-68.376221,47.285957],[-68.233821,47.357157],[-67.954497,47.198326],[-67.790188,47.066879],[-67.779235,45.944106],[-67.801142,45.675736],[-67.456095,45.604536],[-67.505388,45.48952],[-67.417757,45.379982],[-67.488957,45.281397],[-67.346556,45.128042],[-67.16034,45.160904],[-66.979601,44.804903],[-67.187725,44.646072],[-67.308218,44.706318],[-67.406803,44.596779],[-67.549203,44.624164],[-67.565634,44.531056],[-67.75185,44.54201],[-68.047605,44.328409],[-68.118805,44.476286],[-68.222867,44.48724],[-68.173574,44.328409],[-68.403606,44.251732],[-68.458375,44.377701],[-68.567914,44.311978],[-68.82533,44.311978],[-68.830807,44.459856],[-68.984161,44.426994],[-68.956777,44.322932],[-69.099177,44.103854],[-69.071793,44.043608],[-69.258008,43.923115],[-69.444224,43.966931],[-69.553763,43.840961],[-69.707118,43.82453],[-69.833087,43.720469],[-69.986442,43.742376],[-70.030257,43.851915],[-70.254812,43.676653],[-70.194565,43.567114],[-70.358873,43.528776],[-70.369827,43.435668],[-70.556043,43.320652],[-70.703921,43.057759]]]}}, -{"type":"Feature","id":"MD","properties":{"name":"Maryland"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-75.994645,37.95325],[-76.016553,37.95325],[-76.043938,37.95325],[-75.994645,37.95325]]],[[[-79.477979,39.722302],[-75.786521,39.722302],[-75.693413,38.462606],[-75.047134,38.451652],[-75.244304,38.029928],[-75.397659,38.013497],[-75.671506,37.95325],[-75.885106,37.909435],[-75.879629,38.073743],[-75.961783,38.139466],[-75.846768,38.210667],[-76.000122,38.374975],[-76.049415,38.303775],[-76.257538,38.320205],[-76.328738,38.500944],[-76.263015,38.500944],[-76.257538,38.736453],[-76.191815,38.829561],[-76.279446,39.147223],[-76.169907,39.333439],[-76.000122,39.366301],[-75.972737,39.557994],[-76.098707,39.536086],[-76.104184,39.437501],[-76.367077,39.311532],[-76.443754,39.196516],[-76.460185,38.906238],[-76.55877,38.769315],[-76.514954,38.539283],[-76.383508,38.380452],[-76.399939,38.259959],[-76.317785,38.139466],[-76.3616,38.057312],[-76.591632,38.216144],[-76.920248,38.292821],[-77.018833,38.446175],[-77.205049,38.358544],[-77.276249,38.479037],[-77.128372,38.632391],[-77.040741,38.791222],[-76.909294,38.895284],[-77.035264,38.993869],[-77.117418,38.933623],[-77.248864,39.026731],[-77.456988,39.076023],[-77.456988,39.223901],[-77.566527,39.306055],[-77.719881,39.322485],[-77.834897,39.601809],[-78.004682,39.601809],[-78.174467,39.694917],[-78.267575,39.61824],[-78.431884,39.623717],[-78.470222,39.514178],[-78.765977,39.585379],[-78.963147,39.437501],[-79.094593,39.470363],[-79.291763,39.300578],[-79.488933,39.20747],[-79.477979,39.722302]]]]}}, -{"type":"Feature","id":"MA","properties":{"name":"Massachusetts"},"geometry":{"type":"Polygon","coordinates":[[[-70.917521,42.887974],[-70.818936,42.871543],[-70.780598,42.696281],[-70.824413,42.55388],[-70.983245,42.422434],[-70.988722,42.269079],[-70.769644,42.247172],[-70.638197,42.08834],[-70.660105,41.962371],[-70.550566,41.929509],[-70.539613,41.814493],[-70.260289,41.715908],[-69.937149,41.809016],[-70.008349,41.672093],[-70.484843,41.5516],[-70.660105,41.546123],[-70.764167,41.639231],[-70.928475,41.611847],[-70.933952,41.540646],[-71.120168,41.496831],[-71.196845,41.67757],[-71.22423,41.710431],[-71.328292,41.781632],[-71.383061,42.01714],[-71.530939,42.01714],[-71.799309,42.006186],[-71.799309,42.022617],[-73.053528,42.039048],[-73.486206,42.050002],[-73.508114,42.08834],[-73.267129,42.745573],[-72.456542,42.729142],[-71.29543,42.696281],[-71.185891,42.789389],[-70.917521,42.887974]]]}}, -{"type":"Feature","id":"MI","properties":{"name":"Michigan"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-83.454238,41.732339],[-84.807042,41.694001],[-84.807042,41.759724],[-85.990061,41.759724],[-86.822556,41.759724],[-86.619909,41.891171],[-86.482986,42.115725],[-86.357016,42.252649],[-86.263908,42.444341],[-86.209139,42.718189],[-86.231047,43.013943],[-86.526801,43.594499],[-86.433693,43.813577],[-86.499417,44.07647],[-86.269385,44.34484],[-86.220093,44.569394],[-86.252954,44.689887],[-86.088646,44.73918],[-86.066738,44.903488],[-85.809322,44.947303],[-85.612152,45.128042],[-85.628583,44.766564],[-85.524521,44.750133],[-85.393075,44.930872],[-85.387598,45.237581],[-85.305444,45.314258],[-85.031597,45.363551],[-85.119228,45.577151],[-84.938489,45.75789],[-84.713934,45.768844],[-84.461995,45.653829],[-84.215533,45.637398],[-84.09504,45.494997],[-83.908824,45.484043],[-83.596638,45.352597],[-83.4871,45.358074],[-83.317314,45.144473],[-83.454238,45.029457],[-83.322791,44.88158],[-83.273499,44.711795],[-83.333745,44.339363],[-83.536392,44.246255],[-83.585684,44.054562],[-83.82667,43.988839],[-83.958116,43.758807],[-83.908824,43.671176],[-83.667839,43.589022],[-83.481623,43.714992],[-83.262545,43.972408],[-82.917498,44.070993],[-82.747713,43.994316],[-82.643651,43.851915],[-82.539589,43.435668],[-82.523158,43.227544],[-82.413619,42.975605],[-82.517681,42.614127],[-82.681989,42.559357],[-82.687466,42.690804],[-82.797005,42.652465],[-82.922975,42.351234],[-83.125621,42.236218],[-83.185868,42.006186],[-83.437807,41.814493],[-83.454238,41.732339]]],[[[-85.508091,45.730506],[-85.49166,45.610013],[-85.623106,45.588105],[-85.568337,45.75789],[-85.508091,45.730506]]],[[[-87.589328,45.095181],[-87.742682,45.199243],[-87.649574,45.341643],[-87.885083,45.363551],[-87.791975,45.500474],[-87.781021,45.675736],[-87.989145,45.796229],[-88.10416,45.922199],[-88.531362,46.020784],[-88.662808,45.987922],[-89.09001,46.135799],[-90.119674,46.338446],[-90.229213,46.508231],[-90.415429,46.568478],[-90.026566,46.672539],[-89.851304,46.793032],[-89.413149,46.842325],[-89.128348,46.990202],[-88.996902,46.995679],[-88.887363,47.099741],[-88.575177,47.247618],[-88.416346,47.373588],[-88.180837,47.455742],[-87.956283,47.384542],[-88.350623,47.077833],[-88.443731,46.973771],[-88.438254,46.787555],[-88.246561,46.929956],[-87.901513,46.908048],[-87.633143,46.809463],[-87.392158,46.535616],[-87.260711,46.486323],[-87.008772,46.530139],[-86.948526,46.469893],[-86.696587,46.437031],[-86.159846,46.667063],[-85.880522,46.68897],[-85.508091,46.678016],[-85.256151,46.754694],[-85.064458,46.760171],[-85.02612,46.480847],[-84.82895,46.442508],[-84.63178,46.486323],[-84.549626,46.4206],[-84.418179,46.502754],[-84.127902,46.530139],[-84.122425,46.179615],[-83.990978,46.031737],[-83.793808,45.993399],[-83.7719,46.091984],[-83.580208,46.091984],[-83.476146,45.987922],[-83.563777,45.911245],[-84.111471,45.976968],[-84.374364,45.933153],[-84.659165,46.053645],[-84.741319,45.944106],[-84.70298,45.850998],[-84.82895,45.872906],[-85.015166,46.00983],[-85.338305,46.091984],[-85.502614,46.097461],[-85.661445,45.966014],[-85.924338,45.933153],[-86.209139,45.960537],[-86.324155,45.905768],[-86.351539,45.796229],[-86.663725,45.703121],[-86.647294,45.834568],[-86.784218,45.861952],[-86.838987,45.725029],[-87.069019,45.719552],[-87.17308,45.659305],[-87.326435,45.423797],[-87.611236,45.122565],[-87.589328,45.095181]]],[[[-88.805209,47.976051],[-89.057148,47.850082],[-89.188594,47.833651],[-89.177641,47.937713],[-88.547792,48.173221],[-88.668285,48.008913],[-88.805209,47.976051]]]]}}, -{"type":"Feature","id":"MN","properties":{"name":"Minnesota"},"geometry":{"type":"Polygon","coordinates":[[[-92.014696,46.705401],[-92.091373,46.749217],[-92.29402,46.667063],[-92.29402,46.075553],[-92.354266,46.015307],[-92.639067,45.933153],[-92.869098,45.719552],[-92.885529,45.577151],[-92.770513,45.566198],[-92.644544,45.440228],[-92.75956,45.286874],[-92.737652,45.117088],[-92.808852,44.750133],[-92.545959,44.569394],[-92.337835,44.552964],[-92.233773,44.443425],[-91.927065,44.333886],[-91.877772,44.202439],[-91.592971,44.032654],[-91.43414,43.994316],[-91.242447,43.775238],[-91.269832,43.616407],[-91.215062,43.501391],[-91.368417,43.501391],[-96.451017,43.501391],[-96.451017,45.297827],[-96.681049,45.412843],[-96.856311,45.604536],[-96.582464,45.818137],[-96.560556,45.933153],[-96.598895,46.332969],[-96.719387,46.437031],[-96.801542,46.656109],[-96.785111,46.924479],[-96.823449,46.968294],[-96.856311,47.609096],[-97.053481,47.948667],[-97.130158,48.140359],[-97.16302,48.545653],[-97.097296,48.682577],[-97.228743,49.000239],[-95.152983,49.000239],[-95.152983,49.383625],[-94.955813,49.372671],[-94.824366,49.295994],[-94.69292,48.775685],[-94.588858,48.715438],[-94.260241,48.699007],[-94.221903,48.649715],[-93.838517,48.627807],[-93.794701,48.518268],[-93.466085,48.545653],[-93.466085,48.589469],[-93.208669,48.644238],[-92.984114,48.62233],[-92.726698,48.540176],[-92.655498,48.436114],[-92.50762,48.447068],[-92.370697,48.222514],[-92.304974,48.315622],[-92.053034,48.359437],[-92.009219,48.266329],[-91.713464,48.200606],[-91.713464,48.112975],[-91.565587,48.041775],[-91.264355,48.080113],[-91.083616,48.178698],[-90.837154,48.238944],[-90.749522,48.091067],[-90.579737,48.123929],[-90.377091,48.091067],[-90.141582,48.112975],[-89.873212,47.987005],[-89.615796,48.008913],[-89.637704,47.954144],[-89.971797,47.828174],[-90.437337,47.729589],[-90.738569,47.625527],[-91.171247,47.368111],[-91.357463,47.20928],[-91.642264,47.028541],[-92.091373,46.787555],[-92.014696,46.705401]]]}}, -{"type":"Feature","id":"MS","properties":{"name":"Mississippi"},"geometry":{"type":"Polygon","coordinates":[[[-88.471115,34.995703],[-88.202745,34.995703],[-88.098683,34.891641],[-88.241084,33.796253],[-88.471115,31.895754],[-88.394438,30.367688],[-88.503977,30.323872],[-88.744962,30.34578],[-88.843547,30.411504],[-89.084533,30.367688],[-89.418626,30.252672],[-89.522688,30.181472],[-89.643181,30.285534],[-89.681519,30.449842],[-89.845827,30.66892],[-89.747242,30.997536],[-91.636787,30.997536],[-91.565587,31.068736],[-91.636787,31.265906],[-91.516294,31.27686],[-91.499863,31.643815],[-91.401278,31.621907],[-91.341032,31.846462],[-91.105524,31.988862],[-90.985031,32.218894],[-91.006939,32.514649],[-91.154816,32.640618],[-91.143862,32.843265],[-91.072662,32.887081],[-91.16577,33.002096],[-91.089093,33.13902],[-91.143862,33.347144],[-91.056231,33.429298],[-91.231493,33.560744],[-91.072662,33.867453],[-90.891923,34.026284],[-90.952169,34.135823],[-90.744046,34.300131],[-90.749522,34.365854],[-90.568783,34.420624],[-90.585214,34.617794],[-90.481152,34.661609],[-90.409952,34.831394],[-90.251121,34.908072],[-90.311367,34.995703],[-88.471115,34.995703]]]}}, -{"type":"Feature","id":"MO","properties":{"name":"Missouri"},"geometry":{"type":"Polygon","coordinates":[[[-91.833957,40.609566],[-91.729895,40.615043],[-91.527248,40.412397],[-91.417709,40.379535],[-91.50534,40.237135],[-91.494386,40.034488],[-91.368417,39.727779],[-91.061708,39.470363],[-90.727615,39.256762],[-90.661891,38.928146],[-90.585214,38.867899],[-90.470199,38.961007],[-90.251121,38.917192],[-90.10872,38.845992],[-90.207305,38.725499],[-90.179921,38.632391],[-90.349706,38.374975],[-90.355183,38.216144],[-90.059428,38.013497],[-89.949889,37.88205],[-89.84035,37.903958],[-89.517211,37.690357],[-89.517211,37.537003],[-89.435057,37.34531],[-89.517211,37.279587],[-89.292656,36.994786],[-89.133825,36.983832],[-89.215979,36.578538],[-89.363857,36.622354],[-89.418626,36.496384],[-89.484349,36.496384],[-89.539119,36.496384],[-89.533642,36.249922],[-89.730812,35.997983],[-90.377091,35.997983],[-90.218259,36.184199],[-90.064905,36.304691],[-90.152536,36.496384],[-94.473842,36.501861],[-94.616242,36.501861],[-94.616242,37.000263],[-94.610765,39.158177],[-94.824366,39.20747],[-94.983197,39.442978],[-95.109167,39.541563],[-94.884612,39.831841],[-95.207752,39.908518],[-95.306337,40.001626],[-95.552799,40.264519],[-95.7664,40.587659],[-94.632673,40.571228],[-93.257961,40.582182],[-91.833957,40.609566]]]}}, -{"type":"Feature","id":"MT","properties":{"name":"Montana"},"geometry":{"type":"Polygon","coordinates":[[[-104.047534,49.000239],[-104.042057,47.861036],[-104.047534,45.944106],[-104.042057,44.996596],[-104.058488,44.996596],[-105.91517,45.002073],[-109.080842,45.002073],[-111.05254,45.002073],[-111.047063,44.476286],[-111.227803,44.580348],[-111.386634,44.75561],[-111.616665,44.547487],[-111.819312,44.509148],[-111.868605,44.563917],[-112.104113,44.520102],[-112.241036,44.569394],[-112.471068,44.481763],[-112.783254,44.48724],[-112.887315,44.394132],[-113.002331,44.448902],[-113.133778,44.772041],[-113.341901,44.782995],[-113.456917,44.865149],[-113.45144,45.056842],[-113.571933,45.128042],[-113.736241,45.330689],[-113.834826,45.522382],[-113.807441,45.604536],[-113.98818,45.703121],[-114.086765,45.593582],[-114.333228,45.456659],[-114.546828,45.560721],[-114.497536,45.670259],[-114.568736,45.774321],[-114.387997,45.88386],[-114.492059,46.037214],[-114.464674,46.272723],[-114.322274,46.645155],[-114.612552,46.639678],[-114.623506,46.705401],[-114.886399,46.809463],[-114.930214,46.919002],[-115.302646,47.187372],[-115.324554,47.258572],[-115.527201,47.302388],[-115.718894,47.42288],[-115.724371,47.696727],[-116.04751,47.976051],[-116.04751,49.000239],[-111.50165,48.994762],[-109.453274,49.000239],[-104.047534,49.000239]]]}}, -{"type":"Feature","id":"NE","properties":{"name":"Nebraska"},"geometry":{"type":"Polygon","coordinates":[[[-103.324578,43.002989],[-101.626726,42.997512],[-98.499393,42.997512],[-98.466531,42.94822],[-97.951699,42.767481],[-97.831206,42.866066],[-97.688806,42.844158],[-97.217789,42.844158],[-96.692003,42.657942],[-96.626279,42.515542],[-96.44554,42.488157],[-96.264801,42.039048],[-96.127878,41.973325],[-96.062155,41.798063],[-96.122401,41.67757],[-96.095016,41.540646],[-95.919754,41.453015],[-95.925231,41.201076],[-95.826646,40.976521],[-95.881416,40.719105],[-95.7664,40.587659],[-95.552799,40.264519],[-95.306337,40.001626],[-101.90605,40.001626],[-102.053927,40.001626],[-102.053927,41.003906],[-104.053011,41.003906],[-104.053011,43.002989],[-103.324578,43.002989]]]}}, -{"type":"Feature","id":"NV","properties":{"name":"Nevada"},"geometry":{"type":"Polygon","coordinates":[[[-117.027882,42.000709],[-114.04295,41.995232],[-114.048427,37.000263],[-114.048427,36.195153],[-114.152489,36.025367],[-114.251074,36.01989],[-114.371566,36.140383],[-114.738521,36.102045],[-114.678275,35.516012],[-114.596121,35.324319],[-114.574213,35.138103],[-114.634459,35.00118],[-115.85034,35.970598],[-116.540435,36.501861],[-117.498899,37.21934],[-118.71478,38.101128],[-120.001861,38.999346],[-119.996384,40.264519],[-120.001861,41.995232],[-118.698349,41.989755],[-117.027882,42.000709]]]}}, -{"type":"Feature","id":"NH","properties":{"name":"New Hampshire"},"geometry":{"type":"Polygon","coordinates":[[[-71.08183,45.303304],[-71.032537,44.657025],[-70.966814,43.34256],[-70.807983,43.227544],[-70.824413,43.128959],[-70.703921,43.057759],[-70.818936,42.871543],[-70.917521,42.887974],[-71.185891,42.789389],[-71.29543,42.696281],[-72.456542,42.729142],[-72.544173,42.80582],[-72.533219,42.953697],[-72.445588,43.008466],[-72.456542,43.150867],[-72.379864,43.572591],[-72.204602,43.769761],[-72.116971,43.994316],[-72.02934,44.07647],[-72.034817,44.322932],[-71.700724,44.41604],[-71.536416,44.585825],[-71.629524,44.750133],[-71.4926,44.914442],[-71.503554,45.013027],[-71.361154,45.270443],[-71.131122,45.243058],[-71.08183,45.303304]]]}}, -{"type":"Feature","id":"NJ","properties":{"name":"New Jersey"},"geometry":{"type":"Polygon","coordinates":[[[-74.236547,41.14083],[-73.902454,40.998429],[-74.022947,40.708151],[-74.187255,40.642428],[-74.274886,40.489074],[-74.001039,40.412397],[-73.979131,40.297381],[-74.099624,39.760641],[-74.411809,39.360824],[-74.614456,39.245808],[-74.795195,38.993869],[-74.888303,39.158177],[-75.178581,39.240331],[-75.534582,39.459409],[-75.55649,39.607286],[-75.561967,39.629194],[-75.507197,39.683964],[-75.414089,39.804456],[-75.145719,39.88661],[-75.129289,39.963288],[-74.82258,40.127596],[-74.773287,40.215227],[-75.058088,40.417874],[-75.069042,40.543843],[-75.195012,40.576705],[-75.205966,40.691721],[-75.052611,40.866983],[-75.134765,40.971045],[-74.882826,41.179168],[-74.828057,41.288707],[-74.69661,41.359907],[-74.236547,41.14083]]]}}, -{"type":"Feature","id":"NM","properties":{"name":"New Mexico"},"geometry":{"type":"Polygon","coordinates":[[[-107.421329,37.000263],[-106.868158,36.994786],[-104.337812,36.994786],[-103.001438,37.000263],[-103.001438,36.501861],[-103.039777,36.501861],[-103.045254,34.01533],[-103.067161,33.002096],[-103.067161,31.999816],[-106.616219,31.999816],[-106.643603,31.901231],[-106.528588,31.786216],[-108.210008,31.786216],[-108.210008,31.331629],[-109.04798,31.331629],[-109.042503,37.000263],[-107.421329,37.000263]]]}}, -{"type":"Feature","id":"NY","properties":{"name":"New York"},"geometry":{"type":"Polygon","coordinates":[[[-73.343806,45.013027],[-73.332852,44.804903],[-73.387622,44.618687],[-73.294514,44.437948],[-73.321898,44.246255],[-73.436914,44.043608],[-73.349283,43.769761],[-73.404052,43.687607],[-73.245221,43.523299],[-73.278083,42.833204],[-73.267129,42.745573],[-73.508114,42.08834],[-73.486206,42.050002],[-73.55193,41.294184],[-73.48073,41.21203],[-73.727192,41.102491],[-73.655992,40.987475],[-73.22879,40.905321],[-73.141159,40.965568],[-72.774204,40.965568],[-72.587988,40.998429],[-72.28128,41.157261],[-72.259372,41.042245],[-72.100541,40.992952],[-72.467496,40.845075],[-73.239744,40.625997],[-73.562884,40.582182],[-73.776484,40.593136],[-73.935316,40.543843],[-74.022947,40.708151],[-73.902454,40.998429],[-74.236547,41.14083],[-74.69661,41.359907],[-74.740426,41.431108],[-74.89378,41.436584],[-75.074519,41.60637],[-75.052611,41.754247],[-75.173104,41.869263],[-75.249781,41.863786],[-75.35932,42.000709],[-79.76278,42.000709],[-79.76278,42.252649],[-79.76278,42.269079],[-79.149363,42.55388],[-79.050778,42.690804],[-78.853608,42.783912],[-78.930285,42.953697],[-79.012439,42.986559],[-79.072686,43.260406],[-78.486653,43.375421],[-77.966344,43.369944],[-77.75822,43.34256],[-77.533665,43.233021],[-77.391265,43.276836],[-76.958587,43.271359],[-76.695693,43.34256],[-76.41637,43.523299],[-76.235631,43.528776],[-76.230154,43.802623],[-76.137046,43.961454],[-76.3616,44.070993],[-76.312308,44.196962],[-75.912491,44.366748],[-75.764614,44.514625],[-75.282643,44.848718],[-74.828057,45.018503],[-74.148916,44.991119],[-73.343806,45.013027]]]}}, -{"type":"Feature","id":"NC","properties":{"name":"North Carolina"},"geometry":{"type":"Polygon","coordinates":[[[-80.978661,36.562108],[-80.294043,36.545677],[-79.510841,36.5402],[-75.868676,36.551154],[-75.75366,36.151337],[-76.032984,36.189676],[-76.071322,36.140383],[-76.410893,36.080137],[-76.460185,36.025367],[-76.68474,36.008937],[-76.673786,35.937736],[-76.399939,35.987029],[-76.3616,35.943213],[-76.060368,35.992506],[-75.961783,35.899398],[-75.781044,35.937736],[-75.715321,35.696751],[-75.775568,35.581735],[-75.89606,35.570781],[-76.147999,35.324319],[-76.482093,35.313365],[-76.536862,35.14358],[-76.394462,34.973795],[-76.279446,34.940933],[-76.493047,34.661609],[-76.673786,34.694471],[-76.991448,34.667086],[-77.210526,34.60684],[-77.555573,34.415147],[-77.82942,34.163208],[-77.971821,33.845545],[-78.179944,33.916745],[-78.541422,33.851022],[-79.675149,34.80401],[-80.797922,34.820441],[-80.781491,34.935456],[-80.934845,35.105241],[-81.038907,35.044995],[-81.044384,35.149057],[-82.276696,35.198349],[-82.550543,35.160011],[-82.764143,35.066903],[-83.109191,35.00118],[-83.618546,34.984749],[-84.319594,34.990226],[-84.29221,35.225734],[-84.09504,35.247642],[-84.018363,35.41195],[-83.7719,35.559827],[-83.498053,35.565304],[-83.251591,35.718659],[-82.994175,35.773428],[-82.775097,35.997983],[-82.638174,36.063706],[-82.610789,35.965121],[-82.216449,36.156814],[-82.03571,36.118475],[-81.909741,36.304691],[-81.723525,36.353984],[-81.679709,36.589492],[-80.978661,36.562108]]]}}, -{"type":"Feature","id":"ND","properties":{"name":"North Dakota"},"geometry":{"type":"Polygon","coordinates":[[[-97.228743,49.000239],[-97.097296,48.682577],[-97.16302,48.545653],[-97.130158,48.140359],[-97.053481,47.948667],[-96.856311,47.609096],[-96.823449,46.968294],[-96.785111,46.924479],[-96.801542,46.656109],[-96.719387,46.437031],[-96.598895,46.332969],[-96.560556,45.933153],[-104.047534,45.944106],[-104.042057,47.861036],[-104.047534,49.000239],[-97.228743,49.000239]]]}}, -{"type":"Feature","id":"OH","properties":{"name":"Ohio"},"geometry":{"type":"Polygon","coordinates":[[[-80.518598,41.978802],[-80.518598,40.636951],[-80.666475,40.582182],[-80.595275,40.472643],[-80.600752,40.319289],[-80.737675,40.078303],[-80.830783,39.711348],[-81.219646,39.388209],[-81.345616,39.344393],[-81.455155,39.410117],[-81.57017,39.267716],[-81.685186,39.273193],[-81.811156,39.0815],[-81.783771,38.966484],[-81.887833,38.873376],[-82.03571,39.026731],[-82.221926,38.785745],[-82.172634,38.632391],[-82.293127,38.577622],[-82.331465,38.446175],[-82.594358,38.424267],[-82.731282,38.561191],[-82.846298,38.588575],[-82.890113,38.758361],[-83.032514,38.725499],[-83.142052,38.626914],[-83.519961,38.703591],[-83.678792,38.632391],[-83.903347,38.769315],[-84.215533,38.807653],[-84.231963,38.895284],[-84.43461,39.103408],[-84.817996,39.103408],[-84.801565,40.500028],[-84.807042,41.694001],[-83.454238,41.732339],[-83.065375,41.595416],[-82.933929,41.513262],[-82.835344,41.589939],[-82.616266,41.431108],[-82.479343,41.381815],[-82.013803,41.513262],[-81.739956,41.485877],[-81.444201,41.672093],[-81.011523,41.852832],[-80.518598,41.978802],[-80.518598,41.978802]]]}}, -{"type":"Feature","id":"OK","properties":{"name":"Oklahoma"},"geometry":{"type":"Polygon","coordinates":[[[-100.087706,37.000263],[-94.616242,37.000263],[-94.616242,36.501861],[-94.430026,35.395519],[-94.484796,33.637421],[-94.868182,33.74696],[-94.966767,33.861976],[-95.224183,33.960561],[-95.289906,33.87293],[-95.547322,33.878407],[-95.602092,33.933176],[-95.8376,33.834591],[-95.936185,33.889361],[-96.149786,33.840068],[-96.346956,33.686714],[-96.423633,33.774345],[-96.631756,33.845545],[-96.850834,33.845545],[-96.922034,33.960561],[-97.173974,33.736006],[-97.256128,33.861976],[-97.371143,33.823637],[-97.458774,33.905791],[-97.694283,33.982469],[-97.869545,33.851022],[-97.946222,33.987946],[-98.088623,34.004376],[-98.170777,34.113915],[-98.36247,34.157731],[-98.488439,34.064623],[-98.570593,34.146777],[-98.767763,34.135823],[-98.986841,34.223454],[-99.189488,34.2125],[-99.260688,34.404193],[-99.57835,34.415147],[-99.698843,34.382285],[-99.923398,34.573978],[-100.000075,34.563024],[-100.000075,36.501861],[-101.812942,36.501861],[-103.001438,36.501861],[-103.001438,37.000263],[-102.042974,36.994786],[-100.087706,37.000263]]]}}, -{"type":"Feature","id":"OR","properties":{"name":"Oregon"},"geometry":{"type":"Polygon","coordinates":[[[-123.211348,46.174138],[-123.11824,46.185092],[-122.904639,46.08103],[-122.811531,45.960537],[-122.762239,45.659305],[-122.247407,45.549767],[-121.809251,45.708598],[-121.535404,45.725029],[-121.217742,45.670259],[-121.18488,45.604536],[-120.637186,45.746937],[-120.505739,45.697644],[-120.209985,45.725029],[-119.963522,45.823614],[-119.525367,45.911245],[-119.125551,45.933153],[-118.988627,45.998876],[-116.918344,45.993399],[-116.78142,45.823614],[-116.545912,45.752413],[-116.463758,45.61549],[-116.671881,45.319735],[-116.732128,45.144473],[-116.847143,45.02398],[-116.830713,44.930872],[-116.934774,44.782995],[-117.038836,44.750133],[-117.241483,44.394132],[-117.170283,44.257209],[-116.97859,44.240778],[-116.896436,44.158624],[-117.027882,43.830007],[-117.027882,42.000709],[-118.698349,41.989755],[-120.001861,41.995232],[-121.037003,41.995232],[-122.378853,42.011663],[-123.233256,42.006186],[-124.213628,42.000709],[-124.356029,42.115725],[-124.432706,42.438865],[-124.416275,42.663419],[-124.553198,42.838681],[-124.454613,43.002989],[-124.383413,43.271359],[-124.235536,43.55616],[-124.169813,43.8081],[-124.060274,44.657025],[-124.076705,44.772041],[-123.97812,45.144473],[-123.939781,45.659305],[-123.994551,45.944106],[-123.945258,46.113892],[-123.545441,46.261769],[-123.370179,46.146753],[-123.211348,46.174138]]]}}, -{"type":"Feature","id":"PA","properties":{"name":"Pennsylvania"},"geometry":{"type":"Polygon","coordinates":[[[-79.76278,42.252649],[-79.76278,42.000709],[-75.35932,42.000709],[-75.249781,41.863786],[-75.173104,41.869263],[-75.052611,41.754247],[-75.074519,41.60637],[-74.89378,41.436584],[-74.740426,41.431108],[-74.69661,41.359907],[-74.828057,41.288707],[-74.882826,41.179168],[-75.134765,40.971045],[-75.052611,40.866983],[-75.205966,40.691721],[-75.195012,40.576705],[-75.069042,40.543843],[-75.058088,40.417874],[-74.773287,40.215227],[-74.82258,40.127596],[-75.129289,39.963288],[-75.145719,39.88661],[-75.414089,39.804456],[-75.616736,39.831841],[-75.786521,39.722302],[-79.477979,39.722302],[-80.518598,39.722302],[-80.518598,40.636951],[-80.518598,41.978802],[-80.518598,41.978802],[-80.332382,42.033571],[-79.76278,42.269079],[-79.76278,42.252649]]]}}, -{"type":"Feature","id":"RI","properties":{"name":"Rhode Island"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-71.196845,41.67757],[-71.120168,41.496831],[-71.317338,41.474923],[-71.196845,41.67757]]],[[[-71.530939,42.01714],[-71.383061,42.01714],[-71.328292,41.781632],[-71.22423,41.710431],[-71.344723,41.726862],[-71.448785,41.578985],[-71.481646,41.370861],[-71.859555,41.321569],[-71.799309,41.414677],[-71.799309,42.006186],[-71.530939,42.01714]]]]}}, -{"type":"Feature","id":"SC","properties":{"name":"South Carolina"},"geometry":{"type":"Polygon","coordinates":[[[-82.764143,35.066903],[-82.550543,35.160011],[-82.276696,35.198349],[-81.044384,35.149057],[-81.038907,35.044995],[-80.934845,35.105241],[-80.781491,34.935456],[-80.797922,34.820441],[-79.675149,34.80401],[-78.541422,33.851022],[-78.716684,33.80173],[-78.935762,33.637421],[-79.149363,33.380005],[-79.187701,33.171881],[-79.357487,33.007573],[-79.582041,33.007573],[-79.631334,32.887081],[-79.866842,32.755634],[-79.998289,32.613234],[-80.206412,32.552987],[-80.430967,32.399633],[-80.452875,32.328433],[-80.660998,32.246279],[-80.885553,32.032678],[-81.115584,32.120309],[-81.121061,32.290094],[-81.279893,32.558464],[-81.416816,32.629664],[-81.42777,32.843265],[-81.493493,33.007573],[-81.761863,33.160928],[-81.937125,33.347144],[-81.926172,33.462159],[-82.194542,33.631944],[-82.325988,33.81816],[-82.55602,33.94413],[-82.714851,34.152254],[-82.747713,34.26727],[-82.901067,34.486347],[-83.005129,34.469916],[-83.339222,34.683517],[-83.322791,34.787579],[-83.109191,35.00118],[-82.764143,35.066903]]]}}, -{"type":"Feature","id":"SD","properties":{"name":"South Dakota"},"geometry":{"type":"Polygon","coordinates":[[[-104.047534,45.944106],[-96.560556,45.933153],[-96.582464,45.818137],[-96.856311,45.604536],[-96.681049,45.412843],[-96.451017,45.297827],[-96.451017,43.501391],[-96.582464,43.479483],[-96.527695,43.397329],[-96.560556,43.222067],[-96.434587,43.123482],[-96.511264,43.052282],[-96.544125,42.855112],[-96.631756,42.707235],[-96.44554,42.488157],[-96.626279,42.515542],[-96.692003,42.657942],[-97.217789,42.844158],[-97.688806,42.844158],[-97.831206,42.866066],[-97.951699,42.767481],[-98.466531,42.94822],[-98.499393,42.997512],[-101.626726,42.997512],[-103.324578,43.002989],[-104.053011,43.002989],[-104.058488,44.996596],[-104.042057,44.996596],[-104.047534,45.944106]]]}}, -{"type":"Feature","id":"TN","properties":{"name":"Tennessee"},"geometry":{"type":"Polygon","coordinates":[[[-88.054868,36.496384],[-88.071299,36.677123],[-87.852221,36.633308],[-86.592525,36.655216],[-85.486183,36.616877],[-85.289013,36.627831],[-84.544149,36.594969],[-83.689746,36.584015],[-83.673316,36.600446],[-81.679709,36.589492],[-81.723525,36.353984],[-81.909741,36.304691],[-82.03571,36.118475],[-82.216449,36.156814],[-82.610789,35.965121],[-82.638174,36.063706],[-82.775097,35.997983],[-82.994175,35.773428],[-83.251591,35.718659],[-83.498053,35.565304],[-83.7719,35.559827],[-84.018363,35.41195],[-84.09504,35.247642],[-84.29221,35.225734],[-84.319594,34.990226],[-85.606675,34.984749],[-87.359296,35.00118],[-88.202745,34.995703],[-88.471115,34.995703],[-90.311367,34.995703],[-90.212782,35.023087],[-90.114197,35.198349],[-90.130628,35.439335],[-89.944412,35.603643],[-89.911551,35.756997],[-89.763673,35.811767],[-89.730812,35.997983],[-89.533642,36.249922],[-89.539119,36.496384],[-89.484349,36.496384],[-89.418626,36.496384],[-89.298133,36.507338],[-88.054868,36.496384]]]}}, -{"type":"Feature","id":"TX","properties":{"name":"Texas"},"geometry":{"type":"Polygon","coordinates":[[[-101.812942,36.501861],[-100.000075,36.501861],[-100.000075,34.563024],[-99.923398,34.573978],[-99.698843,34.382285],[-99.57835,34.415147],[-99.260688,34.404193],[-99.189488,34.2125],[-98.986841,34.223454],[-98.767763,34.135823],[-98.570593,34.146777],[-98.488439,34.064623],[-98.36247,34.157731],[-98.170777,34.113915],[-98.088623,34.004376],[-97.946222,33.987946],[-97.869545,33.851022],[-97.694283,33.982469],[-97.458774,33.905791],[-97.371143,33.823637],[-97.256128,33.861976],[-97.173974,33.736006],[-96.922034,33.960561],[-96.850834,33.845545],[-96.631756,33.845545],[-96.423633,33.774345],[-96.346956,33.686714],[-96.149786,33.840068],[-95.936185,33.889361],[-95.8376,33.834591],[-95.602092,33.933176],[-95.547322,33.878407],[-95.289906,33.87293],[-95.224183,33.960561],[-94.966767,33.861976],[-94.868182,33.74696],[-94.484796,33.637421],[-94.380734,33.544313],[-94.183564,33.593606],[-94.041164,33.54979],[-94.041164,33.018527],[-94.041164,31.994339],[-93.822086,31.775262],[-93.816609,31.556184],[-93.542762,31.15089],[-93.526331,30.93729],[-93.630393,30.679874],[-93.728978,30.575812],[-93.696116,30.438888],[-93.767317,30.334826],[-93.690639,30.143133],[-93.926148,29.787132],[-93.838517,29.688547],[-94.002825,29.68307],[-94.523134,29.546147],[-94.70935,29.622824],[-94.742212,29.787132],[-94.873659,29.672117],[-94.966767,29.699501],[-95.016059,29.557101],[-94.911997,29.496854],[-94.895566,29.310638],[-95.081782,29.113469],[-95.383014,28.867006],[-95.985477,28.604113],[-96.045724,28.647929],[-96.226463,28.582205],[-96.23194,28.642452],[-96.478402,28.598636],[-96.593418,28.724606],[-96.664618,28.697221],[-96.401725,28.439805],[-96.593418,28.357651],[-96.774157,28.406943],[-96.801542,28.226204],[-97.026096,28.039988],[-97.256128,27.694941],[-97.404005,27.333463],[-97.513544,27.360848],[-97.540929,27.229401],[-97.425913,27.262263],[-97.480682,26.99937],[-97.557359,26.988416],[-97.562836,26.840538],[-97.469728,26.758384],[-97.442344,26.457153],[-97.332805,26.353091],[-97.30542,26.161398],[-97.217789,25.991613],[-97.524498,25.887551],[-97.650467,26.018997],[-97.885976,26.06829],[-98.198161,26.057336],[-98.466531,26.221644],[-98.669178,26.238075],[-98.822533,26.369522],[-99.030656,26.413337],[-99.173057,26.539307],[-99.266165,26.840538],[-99.446904,27.021277],[-99.424996,27.174632],[-99.50715,27.33894],[-99.479765,27.48134],[-99.605735,27.640172],[-99.709797,27.656603],[-99.879582,27.799003],[-99.934351,27.979742],[-100.082229,28.14405],[-100.29583,28.280974],[-100.399891,28.582205],[-100.498476,28.66436],[-100.629923,28.905345],[-100.673738,29.102515],[-100.799708,29.244915],[-101.013309,29.370885],[-101.062601,29.458516],[-101.259771,29.535193],[-101.413125,29.754271],[-101.851281,29.803563],[-102.114174,29.792609],[-102.338728,29.869286],[-102.388021,29.765225],[-102.629006,29.732363],[-102.809745,29.524239],[-102.919284,29.190146],[-102.97953,29.184669],[-103.116454,28.987499],[-103.280762,28.982022],[-103.527224,29.135376],[-104.146119,29.381839],[-104.266611,29.513285],[-104.507597,29.639255],[-104.677382,29.924056],[-104.688336,30.181472],[-104.858121,30.389596],[-104.896459,30.570335],[-105.005998,30.685351],[-105.394861,30.855136],[-105.602985,31.085167],[-105.77277,31.167321],[-105.953509,31.364491],[-106.205448,31.468553],[-106.38071,31.731446],[-106.528588,31.786216],[-106.643603,31.901231],[-106.616219,31.999816],[-103.067161,31.999816],[-103.067161,33.002096],[-103.045254,34.01533],[-103.039777,36.501861],[-103.001438,36.501861],[-101.812942,36.501861]]]}}, -{"type":"Feature","id":"UT","properties":{"name":"Utah"},"geometry":{"type":"Polygon","coordinates":[[[-112.164359,41.995232],[-111.047063,42.000709],[-111.047063,40.998429],[-109.04798,40.998429],[-109.053457,39.125316],[-109.058934,38.27639],[-109.042503,38.166851],[-109.042503,37.000263],[-110.499369,37.00574],[-114.048427,37.000263],[-114.04295,41.995232],[-112.164359,41.995232]]]}}, -{"type":"Feature","id":"VT","properties":{"name":"Vermont"},"geometry":{"type":"Polygon","coordinates":[[[-71.503554,45.013027],[-71.4926,44.914442],[-71.629524,44.750133],[-71.536416,44.585825],[-71.700724,44.41604],[-72.034817,44.322932],[-72.02934,44.07647],[-72.116971,43.994316],[-72.204602,43.769761],[-72.379864,43.572591],[-72.456542,43.150867],[-72.445588,43.008466],[-72.533219,42.953697],[-72.544173,42.80582],[-72.456542,42.729142],[-73.267129,42.745573],[-73.278083,42.833204],[-73.245221,43.523299],[-73.404052,43.687607],[-73.349283,43.769761],[-73.436914,44.043608],[-73.321898,44.246255],[-73.294514,44.437948],[-73.387622,44.618687],[-73.332852,44.804903],[-73.343806,45.013027],[-72.308664,45.002073],[-71.503554,45.013027]]]}}, -{"type":"Feature","id":"VA","properties":{"name":"Virginia"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-75.397659,38.013497],[-75.244304,38.029928],[-75.375751,37.860142],[-75.512674,37.799896],[-75.594828,37.569865],[-75.802952,37.197433],[-75.972737,37.120755],[-76.027507,37.257679],[-75.939876,37.564388],[-75.671506,37.95325],[-75.397659,38.013497]]],[[[-76.016553,37.95325],[-75.994645,37.95325],[-76.043938,37.95325],[-76.016553,37.95325]]],[[[-78.349729,39.464886],[-77.82942,39.130793],[-77.719881,39.322485],[-77.566527,39.306055],[-77.456988,39.223901],[-77.456988,39.076023],[-77.248864,39.026731],[-77.117418,38.933623],[-77.040741,38.791222],[-77.128372,38.632391],[-77.248864,38.588575],[-77.325542,38.446175],[-77.281726,38.342113],[-77.013356,38.374975],[-76.964064,38.216144],[-76.613539,38.15042],[-76.514954,38.024451],[-76.235631,37.887527],[-76.3616,37.608203],[-76.246584,37.389126],[-76.383508,37.285064],[-76.399939,37.159094],[-76.273969,37.082417],[-76.410893,36.961924],[-76.619016,37.120755],[-76.668309,37.065986],[-76.48757,36.95097],[-75.994645,36.923586],[-75.868676,36.551154],[-79.510841,36.5402],[-80.294043,36.545677],[-80.978661,36.562108],[-81.679709,36.589492],[-83.673316,36.600446],[-83.136575,36.742847],[-83.070852,36.852385],[-82.879159,36.890724],[-82.868205,36.978355],[-82.720328,37.044078],[-82.720328,37.120755],[-82.353373,37.268633],[-81.969987,37.537003],[-81.986418,37.454849],[-81.849494,37.285064],[-81.679709,37.20291],[-81.55374,37.208387],[-81.362047,37.339833],[-81.225123,37.235771],[-80.967707,37.290541],[-80.513121,37.482234],[-80.474782,37.421987],[-80.29952,37.509618],[-80.294043,37.690357],[-80.184505,37.849189],[-79.998289,37.997066],[-79.921611,38.177805],[-79.724442,38.364021],[-79.647764,38.594052],[-79.477979,38.457129],[-79.313671,38.413313],[-79.209609,38.495467],[-78.996008,38.851469],[-78.870039,38.763838],[-78.404499,39.169131],[-78.349729,39.464886]]]]}}, -{"type":"Feature","id":"WA","properties":{"name":"Washington"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-117.033359,49.000239],[-117.044313,47.762451],[-117.038836,46.426077],[-117.055267,46.343923],[-116.92382,46.168661],[-116.918344,45.993399],[-118.988627,45.998876],[-119.125551,45.933153],[-119.525367,45.911245],[-119.963522,45.823614],[-120.209985,45.725029],[-120.505739,45.697644],[-120.637186,45.746937],[-121.18488,45.604536],[-121.217742,45.670259],[-121.535404,45.725029],[-121.809251,45.708598],[-122.247407,45.549767],[-122.762239,45.659305],[-122.811531,45.960537],[-122.904639,46.08103],[-123.11824,46.185092],[-123.211348,46.174138],[-123.370179,46.146753],[-123.545441,46.261769],[-123.72618,46.300108],[-123.874058,46.239861],[-124.065751,46.327492],[-124.027412,46.464416],[-123.895966,46.535616],[-124.098612,46.74374],[-124.235536,47.285957],[-124.31769,47.357157],[-124.427229,47.740543],[-124.624399,47.88842],[-124.706553,48.184175],[-124.597014,48.381345],[-124.394367,48.288237],[-123.983597,48.162267],[-123.704273,48.167744],[-123.424949,48.118452],[-123.162056,48.167744],[-123.036086,48.080113],[-122.800578,48.08559],[-122.636269,47.866512],[-122.515777,47.882943],[-122.493869,47.587189],[-122.422669,47.318818],[-122.324084,47.346203],[-122.422669,47.576235],[-122.395284,47.800789],[-122.230976,48.030821],[-122.362422,48.123929],[-122.373376,48.288237],[-122.471961,48.468976],[-122.422669,48.600422],[-122.488392,48.753777],[-122.647223,48.775685],[-122.795101,48.8907],[-122.756762,49.000239],[-117.033359,49.000239]]],[[[-122.718423,48.310145],[-122.586977,48.35396],[-122.608885,48.151313],[-122.767716,48.227991],[-122.718423,48.310145]]],[[[-123.025132,48.583992],[-122.915593,48.715438],[-122.767716,48.556607],[-122.811531,48.419683],[-123.041563,48.458022],[-123.025132,48.583992]]]]}}, -{"type":"Feature","id":"WV","properties":{"name":"West Virginia"},"geometry":{"type":"Polygon","coordinates":[[[-80.518598,40.636951],[-80.518598,39.722302],[-79.477979,39.722302],[-79.488933,39.20747],[-79.291763,39.300578],[-79.094593,39.470363],[-78.963147,39.437501],[-78.765977,39.585379],[-78.470222,39.514178],[-78.431884,39.623717],[-78.267575,39.61824],[-78.174467,39.694917],[-78.004682,39.601809],[-77.834897,39.601809],[-77.719881,39.322485],[-77.82942,39.130793],[-78.349729,39.464886],[-78.404499,39.169131],[-78.870039,38.763838],[-78.996008,38.851469],[-79.209609,38.495467],[-79.313671,38.413313],[-79.477979,38.457129],[-79.647764,38.594052],[-79.724442,38.364021],[-79.921611,38.177805],[-79.998289,37.997066],[-80.184505,37.849189],[-80.294043,37.690357],[-80.29952,37.509618],[-80.474782,37.421987],[-80.513121,37.482234],[-80.967707,37.290541],[-81.225123,37.235771],[-81.362047,37.339833],[-81.55374,37.208387],[-81.679709,37.20291],[-81.849494,37.285064],[-81.986418,37.454849],[-81.969987,37.537003],[-82.101434,37.553434],[-82.293127,37.668449],[-82.342419,37.783465],[-82.50125,37.931343],[-82.621743,38.123036],[-82.594358,38.424267],[-82.331465,38.446175],[-82.293127,38.577622],[-82.172634,38.632391],[-82.221926,38.785745],[-82.03571,39.026731],[-81.887833,38.873376],[-81.783771,38.966484],[-81.811156,39.0815],[-81.685186,39.273193],[-81.57017,39.267716],[-81.455155,39.410117],[-81.345616,39.344393],[-81.219646,39.388209],[-80.830783,39.711348],[-80.737675,40.078303],[-80.600752,40.319289],[-80.595275,40.472643],[-80.666475,40.582182],[-80.518598,40.636951]]]}}, -{"type":"Feature","id":"WI","properties":{"name":"Wisconsin"},"geometry":{"type":"Polygon","coordinates":[[[-90.415429,46.568478],[-90.229213,46.508231],[-90.119674,46.338446],[-89.09001,46.135799],[-88.662808,45.987922],[-88.531362,46.020784],[-88.10416,45.922199],[-87.989145,45.796229],[-87.781021,45.675736],[-87.791975,45.500474],[-87.885083,45.363551],[-87.649574,45.341643],[-87.742682,45.199243],[-87.589328,45.095181],[-87.627666,44.974688],[-87.819359,44.95278],[-87.983668,44.722749],[-88.043914,44.563917],[-87.928898,44.536533],[-87.775544,44.640595],[-87.611236,44.837764],[-87.403112,44.914442],[-87.238804,45.166381],[-87.03068,45.22115],[-87.047111,45.089704],[-87.189511,44.969211],[-87.468835,44.552964],[-87.545512,44.322932],[-87.540035,44.158624],[-87.644097,44.103854],[-87.737205,43.8793],[-87.704344,43.687607],[-87.791975,43.561637],[-87.912467,43.249452],[-87.885083,43.002989],[-87.76459,42.783912],[-87.802929,42.493634],[-88.788778,42.493634],[-90.639984,42.510065],[-90.711184,42.636034],[-91.067185,42.75105],[-91.143862,42.909881],[-91.176724,43.134436],[-91.056231,43.254929],[-91.204109,43.353514],[-91.215062,43.501391],[-91.269832,43.616407],[-91.242447,43.775238],[-91.43414,43.994316],[-91.592971,44.032654],[-91.877772,44.202439],[-91.927065,44.333886],[-92.233773,44.443425],[-92.337835,44.552964],[-92.545959,44.569394],[-92.808852,44.750133],[-92.737652,45.117088],[-92.75956,45.286874],[-92.644544,45.440228],[-92.770513,45.566198],[-92.885529,45.577151],[-92.869098,45.719552],[-92.639067,45.933153],[-92.354266,46.015307],[-92.29402,46.075553],[-92.29402,46.667063],[-92.091373,46.749217],[-92.014696,46.705401],[-91.790141,46.694447],[-91.09457,46.864232],[-90.837154,46.95734],[-90.749522,46.88614],[-90.886446,46.754694],[-90.55783,46.584908],[-90.415429,46.568478]]]}}, -{"type":"Feature","id":"WY","properties":{"name":"Wyoming"},"geometry":{"type":"Polygon","coordinates":[[[-109.080842,45.002073],[-105.91517,45.002073],[-104.058488,44.996596],[-104.053011,43.002989],[-104.053011,41.003906],[-105.728954,40.998429],[-107.919731,41.003906],[-109.04798,40.998429],[-111.047063,40.998429],[-111.047063,42.000709],[-111.047063,44.476286],[-111.05254,45.002073],[-109.080842,45.002073]]]}} -]} \ No newline at end of file diff --git a/examples/ch17/iot/simulator.py b/examples/ch17/iot/simulator.py deleted file mode 100644 index a179a39..0000000 --- a/examples/ch17/iot/simulator.py +++ /dev/null @@ -1,55 +0,0 @@ -# simulator.py -"""A connected thermostat simulator that publishes JSON -messages to dweet.io""" -import dweepy -import sys -import time -import random - -MIN_CELSIUS_TEMP = -25 -MAX_CELSIUS_TEMP = 45 -MAX_TEMP_CHANGE = 2 - -# get the number of messages to simulate and delay between them -NUMBER_OF_MESSAGES = int(sys.argv[1]) -MESSAGE_DELAY = int(sys.argv[2]) - -dweeter = 'temperature-simulator-deitel-python' # provide a unique name -thermostat = {'Location': 'Boston, MA, USA', - 'Temperature': 20, - 'LowTempWarning': False, - 'HighTempWarning': False} - -print('Temperature simulator starting') - -for message in range(NUMBER_OF_MESSAGES): - # generate a random number in the range -MAX_TEMP_CHANGE - # through MAX_TEMP_CHANGE and add it to the current temperature - thermostat['Temperature'] += random.randrange( - -MAX_TEMP_CHANGE, MAX_TEMP_CHANGE + 1) - - # ensure that the temperature stays within range - if thermostat['Temperature'] < MIN_CELSIUS_TEMP: - thermostat['Temperature'] = MIN_CELSIUS_TEMP - - if thermostat['Temperature'] > MAX_CELSIUS_TEMP: - thermostat['Temperature'] = MAX_CELSIUS_TEMP - - # check for low temperature warning - if thermostat['Temperature'] < 3: - thermostat['LowTempWarning'] = True - else: - thermostat['LowTempWarning'] = False - - # check for high temperature warning - if thermostat['Temperature'] > 35: - thermostat['HighTempWarning'] = True - else: - thermostat['HighTempWarning'] = False - - # send the dweet to dweet.io via dweepy - print(f'Messages sent: {message + 1}\r', end='') - dweepy.dweet_for(dweeter, thermostat) - time.sleep(MESSAGE_DELAY) - -print('Temperature simulator finished') diff --git a/examples/ch17/pubnub/stocklistener.py b/examples/ch17/pubnub/stocklistener.py deleted file mode 100644 index d1447a6..0000000 --- a/examples/ch17/pubnub/stocklistener.py +++ /dev/null @@ -1,95 +0,0 @@ - # stocklistener.py -"""Visualizing a PubNub live stream.""" -from matplotlib import animation -import matplotlib.pyplot as plt -import pandas as pd -import random -import seaborn as sns -import sys - -from pubnub.callbacks import SubscribeCallback -from pubnub.enums import PNStatusCategory -from pubnub.pnconfiguration import PNConfiguration -from pubnub.pubnub import PubNub - -companies = ['Apple', 'Bespin Gas', 'Elerium', 'Google', 'Linen Cloth'] - -# DataFrame to store last stock prices -companies_df = pd.DataFrame( - {'company': companies, 'price' : [0, 0, 0, 0, 0]}) - -class SensorSubscriberCallback(SubscribeCallback): - """SensorSubscriberCallback receives messages from PubNub.""" - def __init__(self, df, limit=1000): - """Create instance variables for tracking number of tweets.""" - self.df = df # DataFrame to store last stock prices - self.order_count = 0 - self.MAX_ORDERS = limit # 1000 by default - super().__init__() # call superclass's init - - def status(self, pubnub, status): - if status.category == PNStatusCategory.PNConnectedCategory: - print('Subscribed') - elif status.category == PNStatusCategory.PNAcknowledgmentCategory: - print('Unsubscribed') - - def message(self, pubnub, message): - symbol = message.message['symbol'] - bid_price = message.message['bid_price'] - print(symbol, bid_price) - self.df.at[companies.index(symbol), 'price'] = bid_price - self.order_count += 1 - - # if MAX_ORDERS is reached, unsubscribe from PubNub channel - if self.order_count == self.MAX_ORDERS: - pubnub.unsubscribe_all() - -def update(frame_number): - """Configures bar plot contents for each animation frame.""" - plt.cla() # clear old barplot - axes = sns.barplot( - data=companies_df, x='company', y='price', palette='cool') - axes.set(xlabel='Company', ylabel='Price') - plt.tight_layout() - -if __name__ == '__main__': - sns.set_style('whitegrid') # white background with gray grid lines - figure = plt.figure('Stock Prices') # Figure for animation - - # configure and start animation that calls function update - stock_animation = animation.FuncAnimation( - figure, update, repeat=False, interval=33) - plt.show(block=False) # display window - - # set up pubnub-market-orders sensor stream key - config = PNConfiguration() - config.subscribe_key = 'sub-c-4377ab04-f100-11e3-bffd-02ee2ddab7fe' - - # create PubNub client and register a SubscribeCallback - pubnub = PubNub(config) - pubnub.add_listener( - SensorSubscriberCallback(df=companies_df, - limit=int(sys.argv[1] if len(sys.argv) > 1 else 1000)) - - # subscribe to pubnub-sensor-network channel and begin streaming - pubnub.subscribe().channels('pubnub-market-orders').execute() - - plt.show() # keeps graph on screen until you dismiss its window - -#************************************************************************** -#* (C) Copyright 1992-2018 by Deitel & Associates, Inc. and * -#* Pearson Education, Inc. All Rights Reserved. * -#* * -#* DISCLAIMER: The authors and publisher of this book have used their * -#* best efforts in preparing the book. These efforts include the * -#* development, research, and testing of the theories and programs * -#* to determine their effectiveness. The authors and publisher make * -#* no warranty of any kind, expressed or implied, with regard to these * -#* programs or to the documentation contained in these books. The authors * -#* and publisher shall not be liable in any event for incidental or * -#* consequential damages in connection with, or arising out of, the * -#* furnishing, performance, or use of these programs. * -#************************************************************************** - - - diff --git a/examples/ch17/pubnub/subscriber_callback.py b/examples/ch17/pubnub/subscriber_callback.py deleted file mode 100644 index 8b63553..0000000 --- a/examples/ch17/pubnub/subscriber_callback.py +++ /dev/null @@ -1,51 +0,0 @@ -# subscriber_callback.py -"""PubNub SubscribeCallback subclass that processes stock orders - and places the new prices in a pandas DataFrame.""" -from pubnub.callbacks import SubscribeCallback -from pubnub.enums import PNStatusCategory - -class SensorSubscriberCallback(SubscribeCallback): - """SensorSubscriberCallback receives messages from PubNub.""" - def __init__(self, df, companies, anim, limit=1000): - """Create instance variables for tracking number of tweets.""" - self.df = df # DataFrame in which to store prices - self.symbols = companies # for updating correct DataFrame row - self.anim = anim # animation to stop when limit is reached - self.order_count = 0 - self.MAX_ORDERS = limit # 1000 by default - super().__init__() # call superclass's init - - def status(self, pubnub, status): - print('status:', status) - if status.category == PNStatusCategory.PNConnectedCategory: - print('Connected to PubNub') - elif status.category == PNStatusCategory.PNDisconnectedCategory: - print('Disconnected from PubNub') - - def message(self, pubnub, message): - symbol = message.message['symbol'] # extract company name - bid_price = message.message['bid_price'] # extract prices - self.df.at[self.symbols.index(symbol), 'price'] = bid_price - self.order_count += 1 - - # if MAX_ORDERS is reached, unsubscribe from PubNub channel - if self.order_count == self.MAX_ORDERS: - print('Max orders processed. Unsibscribing.') - pubnub.unsubscribe_all() - self.anim.event_source().stop() - - -#************************************************************************** -#* (C) Copyright 1992-2018 by Deitel & Associates, Inc. and * -#* Pearson Education, Inc. All Rights Reserved. * -#* * -#* DISCLAIMER: The authors and publisher of this book have used their * -#* best efforts in preparing the book. These efforts include the * -#* development, research, and testing of the theories and programs * -#* to determine their effectiveness. The authors and publisher make * -#* no warranty of any kind, expressed or implied, with regard to these * -#* programs or to the documentation contained in these books. The authors * -#* and publisher shall not be liable in any event for incidental or * -#* consequential damages in connection with, or arising out of, the * -#* furnishing, performance, or use of these programs. * -#************************************************************************** \ No newline at end of file diff --git a/examples/ch17/sql/18_03.ipynb b/examples/ch17/sql/18_03.ipynb deleted file mode 100644 index b7a1c86..0000000 --- a/examples/ch17/sql/18_03.ipynb +++ /dev/null @@ -1,510 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 18.3 Relational Databases and Structured Query Language (SQL)\n", - "### Tables, Rows and Columns\n", - "### Selecting Data Subsets\n", - "### SQLite\n", - "## 18.3.1 A `books` Database\n", - "### Creating the `books` Database\n", - "### Connecting to the Database in Python" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import sqlite3" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "connection = sqlite3.connect('books.db')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### `authors` Table\n", - "### Viewing the `authors` Table’s Contents" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.options.display.max_columns = 10" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.read_sql('SELECT * FROM authors', connection,\n", - " index_col=['id'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### `titles` Table" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.read_sql('SELECT * FROM titles', connection)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### `author_ISBN` Table" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.read_sql('SELECT * FROM author_ISBN', connection)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "df.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Entity-Relationship (ER) Diagram\n", - "### SQL Keywords\n", - "## 18.3.2 `SELECT` Queries" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.read_sql('SELECT first, last FROM authors', connection)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 18.3.3 `WHERE` Clause" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.read_sql(\"\"\"SELECT title, edition, copyright \n", - " FROM titles \n", - " WHERE copyright > '2016'\"\"\", connection)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Pattern Matching: Zero or More Characters " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.read_sql(\"\"\"SELECT id, first, last \n", - " FROM authors \n", - " WHERE last LIKE 'D%'\"\"\", \n", - " connection, index_col=['id'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " \n", - "\n", - "### Pattern Matching: Any Character" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.read_sql(\"\"\"SELECT id, first, last \n", - " FROM authors \n", - " WHERE first LIKE '_b%'\"\"\", \n", - " connection, index_col=['id'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " \n", - "\n", - "## 18.3.4 `ORDER BY` Clause" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.read_sql('SELECT title FROM titles ORDER BY title ASC',\n", - " connection)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Sorting By Multiple Columns" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.read_sql(\"\"\"SELECT id, first, last \n", - " FROM authors \n", - " ORDER BY last, first\"\"\", \n", - " connection, index_col=['id'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.read_sql(\"\"\"SELECT id, first, last \n", - " FROM authors \n", - " ORDER BY last DESC, first ASC\"\"\", \n", - " connection, index_col=['id'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " \n", - "\n", - "### Combining the `WHERE` and `ORDER BY` Clauses" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.read_sql(\"\"\"SELECT isbn, title, edition, copyright\n", - " FROM titles\n", - " WHERE title LIKE '%How to Program'\n", - " ORDER BY title\"\"\", connection)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 18.3.5 Merging Data from Multiple Tables: `INNER JOIN`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.read_sql(\"\"\"SELECT first, last, isbn\n", - " FROM authors\n", - " INNER JOIN author_ISBN\n", - " ON authors.id = author_ISBN.id\n", - " ORDER BY last, first\"\"\", connection).head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 18.3.6 `INSERT INTO` Statement" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cursor = connection.cursor()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cursor = cursor.execute(\"\"\"INSERT INTO authors (first, last)\n", - " VALUES ('Sue', 'Red')\"\"\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.read_sql('SELECT id, first, last FROM authors', \n", - " connection, index_col=['id'])\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Note Regarding Strings That Contain Single Quotes\n", - "# 18.3.7 `UPDATE` Statement" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cursor = cursor.execute(\"\"\"UPDATE authors SET last='Black'\n", - " WHERE last='Red' AND first='Sue'\"\"\") " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cursor.rowcount" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.read_sql('SELECT id, first, last FROM authors', \n", - " connection, index_col=['id'])\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 18.3.8 `DELETE FROM` Statement" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cursor = cursor.execute('DELETE FROM authors WHERE id=6') " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cursor.rowcount" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.read_sql('SELECT id, first, last FROM authors', \n", - " connection, index_col=['id'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Closing the Database" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```\n", - "connection.close()\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### SQL in Big Data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![Self Check Exercises check mark image](files/art/check.png)\n", - "# Self Check for Section 17.3\n", - "1. **_(IPython Session)_** Select from the `titles` table all the titles and their edition numbers in descending order by edition number. Show only the first three results." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.read_sql(\"\"\"SELECT title, edition FROM titles\n", - " ORDER BY edition DESC\"\"\", connection).head(3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "2. **_(IPython Session)_** Select from the `authors` table all authors whose first names start with `'A'`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.read_sql(\"\"\"SELECT * FROM authors\n", - " WHERE first LIKE 'A%'\"\"\", connection)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "3. **_(IPython Session)_** SQL’s `NOT` keyword reverses the value of a `WHERE` clause’s condition. Select from the `titles` table all titles that do not end with `'How to Program'`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pd.read_sql(\"\"\"SELECT isbn, title, edition, copyright\n", - " FROM titles\n", - " WHERE title NOT LIKE '%How to Program'\n", - " ORDER BY title\"\"\", connection)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##########################################################################\n", - "# (C) Copyright 2019 by Deitel & Associates, Inc. and #\n", - "# Pearson Education, Inc. All Rights Reserved. #\n", - "# #\n", - "# DISCLAIMER: The authors and publisher of this book have used their #\n", - "# best efforts in preparing the book. These efforts include the #\n", - "# development, research, and testing of the theories and programs #\n", - "# to determine their effectiveness. The authors and publisher make #\n", - "# no warranty of any kind, expressed or implied, with regard to these #\n", - "# programs or to the documentation contained in these books. The authors #\n", - "# and publisher shall not be liable in any event for incidental or #\n", - "# consequential damages in connection with, or arising out of, the #\n", - "# furnishing, performance, or use of these programs. #\n", - "##########################################################################" - ] - } - ], - "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.6.7" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/ch17/sql/18_03.py b/examples/ch17/sql/18_03.py deleted file mode 100755 index bfbbd2b..0000000 --- a/examples/ch17/sql/18_03.py +++ /dev/null @@ -1,134 +0,0 @@ -# Section 18.3 snippets - -# Tables, Rows and Columns - -# Selecting Data Subsets - -# SQLite - -# 18.3.1 A books Database - -# Creating the books Database - -# Connecting to the Database in Python -import sqlite3 - -connection = sqlite3.connect('books.db') - -# authors Table - -# Viewing the authors Table’s Contents -import pandas as pd - -pd.options.display.max_columns = 10 - -pd.read_sql('SELECT * FROM authors', connection, - index_col=['id']) - -# titles Table -pd.read_sql('SELECT * FROM titles', connection) - -# author_ISBN Table -df = pd.read_sql('SELECT * FROM author_ISBN', connection) - -df.head() - -# Entity-Relationship (ER) Diagram - -# SQL Keywords - -# 18.3.2 SELECT Queries -pd.read_sql('SELECT first, last FROM authors', connection) - -# 18.3.3 WHERE Clause -pd.read_sql("""SELECT title, edition, copyright - FROM titles - WHERE copyright > '2016'""", connection) - -# Pattern Matching: Zero or More Characters -pd.read_sql("""SELECT id, first, last - FROM authors - WHERE last LIKE 'D%'""", - connection, index_col=['id']) - -# Pattern Matching: Any Character -pd.read_sql("""SELECT id, first, last - FROM authors - WHERE first LIKE '_b%'""", - connection, index_col=['id']) - -# 18.3.4 ORDER BY Clause -pd.read_sql('SELECT title FROM titles ORDER BY title ASC', - connection) - -# Sorting By Multiple Columns -pd.read_sql("""SELECT id, first, last - FROM authors - ORDER BY last, first""", - connection, index_col=['id']) - -pd.read_sql("""SELECT id, first, last - FROM authors - ORDER BY last DESC, first ASC""", - connection, index_col=['id']) - -# Combining the WHERE and ORDER BY Clauses -pd.read_sql("""SELECT isbn, title, edition, copyright - FROM titles - WHERE title LIKE '%How to Program' - ORDER BY title""", connection) - -# 18.3.5 Merging Data from Multiple Tables: INNER JOIN -pd.read_sql("""SELECT first, last, isbn - FROM authors - INNER JOIN author_ISBN - ON authors.id = author_ISBN.id - ORDER BY last, first""", connection).head() - -# 18.3.6 INSERT INTO Statement -cursor = connection.cursor() - -cursor = cursor.execute("""INSERT INTO authors (first, last) - VALUES ('Sue', 'Red')""") - -pd.read_sql('SELECT id, first, last FROM authors', - connection, index_col=['id']) - -# Note Regarding Strings That Contain Single Quotes - -# 18.3.7 UPDATE Statement -cursor = cursor.execute("""UPDATE authors SET last='Black' - WHERE last='Red' AND first='Sue'""") - -cursor.rowcount - -pd.read_sql('SELECT id, first, last FROM authors', - connection, index_col=['id']) - -# 18.3.8 DELETE FROM Statement -cursor = cursor.execute('DELETE FROM authors where id=6') - -cursor.rowcount - -pd.read_sql('SELECT id, first, last FROM authors', - connection, index_col=['id']) - -# Closing the Database -connection.close() - -# SQL in Big Data - -########################################################################## -# (C) Copyright 2019 by Deitel & Associates, Inc. and # -# Pearson Education, Inc. All Rights Reserved. # -# # -# DISCLAIMER: The authors and publisher of this book have used their # -# best efforts in preparing the book. These efforts include the # -# development, research, and testing of the theories and programs # -# to determine their effectiveness. The authors and publisher make # -# no warranty of any kind, expressed or implied, with regard to these # -# programs or to the documentation contained in these books. The authors # -# and publisher shall not be liable in any event for incidental or # -# consequential damages in connection with, or arising out of, the # -# furnishing, performance, or use of these programs. # -########################################################################## diff --git a/examples/ch17/sql/books.db b/examples/ch17/sql/books.db deleted file mode 100644 index 978cc98..0000000 Binary files a/examples/ch17/sql/books.db and /dev/null differ diff --git a/examples/ch17/sql/books.sql b/examples/ch17/sql/books.sql deleted file mode 100755 index 6e5a668..0000000 --- a/examples/ch17/sql/books.sql +++ /dev/null @@ -1,75 +0,0 @@ -DROP TABLE IF EXISTS author_ISBN; -DROP TABLE IF EXISTS titles; -DROP TABLE IF EXISTS authors; - -CREATE TABLE authors ( - id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - first TEXT NOT NULL, - last TEXT NOT NULL -); - -CREATE TABLE titles ( - isbn TEXT NOT NULL, - title TEXT NOT NULL, - edition INTEGER NOT NULL, - copyright TEXT NOT NULL, - PRIMARY KEY (isbn) -); - -CREATE TABLE author_ISBN ( - id INTEGER NOT NULL, - isbn TEXT NOT NULL, - PRIMARY KEY (id, isbn), - FOREIGN KEY (id) REFERENCES authors(id) ON DELETE CASCADE, - FOREIGN KEY (isbn) REFERENCES titles (isbn) ON DELETE CASCADE -); - -PRAGMA foreign_keys = ON; - -INSERT INTO authors (first, last) -VALUES - ('Paul','Deitel'), - ('Harvey','Deitel'), - ('Abbey','Deitel'), - ('Dan','Quirk'), - ('Alexander', 'Wald'); - -INSERT INTO titles (isbn,title,edition,copyright) -VALUES - ('0135404673','Intro to Python for CS and DS',1,'2020'), - ('0132151006','Internet & WWW How to Program',5,'2012'), - ('0134743350','Java How to Program',11,'2018'), - ('0133976890','C How to Program',8,'2016'), - ('0133406954','Visual Basic 2012 How to Program',6,'2014'), - ('0134601548','Visual C# How to Program',6,'2017'), - ('0136151574','Visual C++ How to Program',2,'2008'), - ('0134448235','C++ How to Program',10,'2017'), - ('0134444302','Android How to Program',3,'2017'), - ('0134289366','Android 6 for Programmers',3,'2016'); - -INSERT INTO author_ISBN (id,isbn) -VALUES - (1,'0134289366'), - (2,'0134289366'), - (5,'0134289366'), - (1,'0135404673'), - (2,'0135404673'), - (1,'0132151006'), - (2,'0132151006'), - (3,'0132151006'), - (1,'0134743350'), - (2,'0134743350'), - (1,'0133976890'), - (2,'0133976890'), - (1,'0133406954'), - (2,'0133406954'), - (3,'0133406954'), - (1,'0134601548'), - (2,'0134601548'), - (1,'0136151574'), - (2,'0136151574'), - (4,'0136151574'), - (1,'0134448235'), - (2,'0134448235'), - (1,'0134444302'), - (2,'0134444302'); diff --git a/IntroToPythonCover.png b/images/IntroToPythonCover.png old mode 100755 new mode 100644 similarity index 100% rename from IntroToPythonCover.png rename to images/IntroToPythonCover.png diff --git a/images/install.gif b/images/install.gif new file mode 100644 index 0000000..ea1209d Binary files /dev/null and b/images/install.gif differ diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..de1a835 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,51 @@ +# ============================================================ +# pyproject.toml (Project Configuration for Python) +# ============================================================ + +# REQ.PYTHON: Python projects MUST include pyproject.toml as the single source of truth. +# WHY: Centralizes project configuration. + +[project] +name = "introtopython" # CUSTOM: Package distribution name (use lowercase and dashes). +version="0.9.0" # WHY: start with initial version. +description = "Environment + tooling for running IntroToPython textbook examples (examples are not redistributed)." +readme = "README.md" +requires-python = ">=3.14" + +dependencies = [ + "beautifulsoup4", + "dweepy", + "geopy", + "imageio", + "ipykernel", + "jupyterlab", + "matplotlib", + "nltk", + "numpy", + "pandas", + "prospector", + "pydub", + "scikit-learn", + "scipy", + "seaborn", + "spacy", + "textatistic", + "textblob", + "watson_developer_cloud" +] + +[project.optional-dependencies] +dev = [ + # REQ.DEV.DEPS: External packages used for linting, testing, type checking, etc. + "packaging>=25.0", + "pre-commit>=4", + "validate-pyproject>=0.11.0", +] +docs = [] +audio = [ + "pyaudio==0.2.14", + "pysine==0.9.2", +] + +[project.urls] +Repository = "https://github.com/denisecase/IntroToPython" diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..fd306ee --- /dev/null +++ b/uv.lock @@ -0,0 +1,2927 @@ +version = 1 +revision = 3 +requires-python = ">=3.14" + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anyio" +version = "4.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, +] + +[[package]] +name = "appdirs" +version = "1.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470, upload-time = "2020-05-11T07:59:51.037Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566, upload-time = "2020-05-11T07:59:49.499Z" }, +] + +[[package]] +name = "appnope" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload-time = "2024-02-06T09:43:11.258Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" }, +] + +[[package]] +name = "argon2-cffi" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argon2-cffi-bindings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/89/ce5af8a7d472a67cc819d5d998aa8c82c5d860608c4db9f46f1162d7dab9/argon2_cffi-25.1.0.tar.gz", hash = "sha256:694ae5cc8a42f4c4e2bf2ca0e64e51e23a040c6a517a85074683d3959e1346c1", size = 45706, upload-time = "2025-06-03T06:55:32.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl", hash = "sha256:fdc8b074db390fccb6eb4a3604ae7231f219aa669a2652e0f20e16ba513d5741", size = 14657, upload-time = "2025-06-03T06:55:30.804Z" }, +] + +[[package]] +name = "argon2-cffi-bindings" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/2d/db8af0df73c1cf454f71b2bbe5e356b8c1f8041c979f505b3d3186e520a9/argon2_cffi_bindings-25.1.0.tar.gz", hash = "sha256:b957f3e6ea4d55d820e40ff76f450952807013d361a65d7f28acc0acbf29229d", size = 1783441, upload-time = "2025-07-30T10:02:05.147Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/3c0a35f46e52108d4707c44b95cfe2afcafc50800b5450c197454569b776/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:3d3f05610594151994ca9ccb3c771115bdb4daef161976a266f0dd8aa9996b8f", size = 54393, upload-time = "2025-07-30T10:01:40.97Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f4/98bbd6ee89febd4f212696f13c03ca302b8552e7dbf9c8efa11ea4a388c3/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8b8efee945193e667a396cbc7b4fb7d357297d6234d30a489905d96caabde56b", size = 29328, upload-time = "2025-07-30T10:01:41.916Z" }, + { url = "https://files.pythonhosted.org/packages/43/24/90a01c0ef12ac91a6be05969f29944643bc1e5e461155ae6559befa8f00b/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3c6702abc36bf3ccba3f802b799505def420a1b7039862014a65db3205967f5a", size = 31269, upload-time = "2025-07-30T10:01:42.716Z" }, + { url = "https://files.pythonhosted.org/packages/d4/d3/942aa10782b2697eee7af5e12eeff5ebb325ccfb86dd8abda54174e377e4/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1c70058c6ab1e352304ac7e3b52554daadacd8d453c1752e547c76e9c99ac44", size = 86558, upload-time = "2025-07-30T10:01:43.943Z" }, + { url = "https://files.pythonhosted.org/packages/0d/82/b484f702fec5536e71836fc2dbc8c5267b3f6e78d2d539b4eaa6f0db8bf8/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2fd3bfbff3c5d74fef31a722f729bf93500910db650c925c2d6ef879a7e51cb", size = 92364, upload-time = "2025-07-30T10:01:44.887Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c1/a606ff83b3f1735f3759ad0f2cd9e038a0ad11a3de3b6c673aa41c24bb7b/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4f9665de60b1b0e99bcd6be4f17d90339698ce954cfd8d9cf4f91c995165a92", size = 85637, upload-time = "2025-07-30T10:01:46.225Z" }, + { url = "https://files.pythonhosted.org/packages/44/b4/678503f12aceb0262f84fa201f6027ed77d71c5019ae03b399b97caa2f19/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ba92837e4a9aa6a508c8d2d7883ed5a8f6c308c89a4790e1e447a220deb79a85", size = 91934, upload-time = "2025-07-30T10:01:47.203Z" }, + { url = "https://files.pythonhosted.org/packages/f0/c7/f36bd08ef9bd9f0a9cff9428406651f5937ce27b6c5b07b92d41f91ae541/argon2_cffi_bindings-25.1.0-cp314-cp314t-win32.whl", hash = "sha256:84a461d4d84ae1295871329b346a97f68eade8c53b6ed9a7ca2d7467f3c8ff6f", size = 28158, upload-time = "2025-07-30T10:01:48.341Z" }, + { url = "https://files.pythonhosted.org/packages/b3/80/0106a7448abb24a2c467bf7d527fe5413b7fdfa4ad6d6a96a43a62ef3988/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b55aec3565b65f56455eebc9b9f34130440404f27fe21c3b375bf1ea4d8fbae6", size = 32597, upload-time = "2025-07-30T10:01:49.112Z" }, + { url = "https://files.pythonhosted.org/packages/05/b8/d663c9caea07e9180b2cb662772865230715cbd573ba3b5e81793d580316/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:87c33a52407e4c41f3b70a9c2d3f6056d88b10dad7695be708c5021673f55623", size = 28231, upload-time = "2025-07-30T10:01:49.92Z" }, + { url = "https://files.pythonhosted.org/packages/1d/57/96b8b9f93166147826da5f90376e784a10582dd39a393c99bb62cfcf52f0/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aecba1723ae35330a008418a91ea6cfcedf6d31e5fbaa056a166462ff066d500", size = 54121, upload-time = "2025-07-30T10:01:50.815Z" }, + { url = "https://files.pythonhosted.org/packages/0a/08/a9bebdb2e0e602dde230bdde8021b29f71f7841bd54801bcfd514acb5dcf/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2630b6240b495dfab90aebe159ff784d08ea999aa4b0d17efa734055a07d2f44", size = 29177, upload-time = "2025-07-30T10:01:51.681Z" }, + { url = "https://files.pythonhosted.org/packages/b6/02/d297943bcacf05e4f2a94ab6f462831dc20158614e5d067c35d4e63b9acb/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:7aef0c91e2c0fbca6fc68e7555aa60ef7008a739cbe045541e438373bc54d2b0", size = 31090, upload-time = "2025-07-30T10:01:53.184Z" }, + { url = "https://files.pythonhosted.org/packages/c1/93/44365f3d75053e53893ec6d733e4a5e3147502663554b4d864587c7828a7/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e021e87faa76ae0d413b619fe2b65ab9a037f24c60a1e6cc43457ae20de6dc6", size = 81246, upload-time = "2025-07-30T10:01:54.145Z" }, + { url = "https://files.pythonhosted.org/packages/09/52/94108adfdd6e2ddf58be64f959a0b9c7d4ef2fa71086c38356d22dc501ea/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e924cfc503018a714f94a49a149fdc0b644eaead5d1f089330399134fa028a", size = 87126, upload-time = "2025-07-30T10:01:55.074Z" }, + { url = "https://files.pythonhosted.org/packages/72/70/7a2993a12b0ffa2a9271259b79cc616e2389ed1a4d93842fac5a1f923ffd/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87b72589133f0346a1cb8d5ecca4b933e3c9b64656c9d175270a000e73b288d", size = 80343, upload-time = "2025-07-30T10:01:56.007Z" }, + { url = "https://files.pythonhosted.org/packages/78/9a/4e5157d893ffc712b74dbd868c7f62365618266982b64accab26bab01edc/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1db89609c06afa1a214a69a462ea741cf735b29a57530478c06eb81dd403de99", size = 86777, upload-time = "2025-07-30T10:01:56.943Z" }, + { url = "https://files.pythonhosted.org/packages/74/cd/15777dfde1c29d96de7f18edf4cc94c385646852e7c7b0320aa91ccca583/argon2_cffi_bindings-25.1.0-cp39-abi3-win32.whl", hash = "sha256:473bcb5f82924b1becbb637b63303ec8d10e84c8d241119419897a26116515d2", size = 27180, upload-time = "2025-07-30T10:01:57.759Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl", hash = "sha256:a98cd7d17e9f7ce244c0803cad3c23a7d379c301ba618a5fa76a67d116618b98", size = 31715, upload-time = "2025-07-30T10:01:58.56Z" }, + { url = "https://files.pythonhosted.org/packages/42/b9/f8d6fa329ab25128b7e98fd83a3cb34d9db5b059a9847eddb840a0af45dd/argon2_cffi_bindings-25.1.0-cp39-abi3-win_arm64.whl", hash = "sha256:b0fdbcf513833809c882823f98dc2f931cf659d9a1429616ac3adebb49f5db94", size = 27149, upload-time = "2025-07-30T10:01:59.329Z" }, +] + +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + +[[package]] +name = "astroid" +version = "3.3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/74/dfb75f9ccd592bbedb175d4a32fc643cf569d7c218508bfbd6ea7ef9c091/astroid-3.3.11.tar.gz", hash = "sha256:1e5a5011af2920c7c67a53f65d536d65bfa7116feeaf2354d8b94f29573bb0ce", size = 400439, upload-time = "2025-07-13T18:04:23.177Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/0f/3b8fdc946b4d9cc8cc1e8af42c4e409468c84441b933d037e101b3d72d86/astroid-3.3.11-py3-none-any.whl", hash = "sha256:54c760ae8322ece1abd213057c4b5bba7c49818853fc901ef09719a60dbf9dec", size = 275612, upload-time = "2025-07-13T18:04:21.07Z" }, +] + +[[package]] +name = "asttokens" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/a5/8e3f9b6771b0b408517c82d97aed8f2036509bc247d46114925e32fe33f0/asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7", size = 62308, upload-time = "2025-11-15T16:43:48.578Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a", size = 27047, upload-time = "2025-11-15T16:43:16.109Z" }, +] + +[[package]] +name = "async-lru" +version = "2.0.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/4d/71ec4d3939dc755264f680f6c2b4906423a304c3d18e96853f0a595dfe97/async_lru-2.0.5.tar.gz", hash = "sha256:481d52ccdd27275f42c43a928b4a50c3bfb2d67af4e78b170e3e0bb39c66e5bb", size = 10380, upload-time = "2025-03-16T17:25:36.919Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl", hash = "sha256:ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943", size = 6069, upload-time = "2025-03-16T17:25:35.422Z" }, +] + +[[package]] +name = "attrs" +version = "25.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, +] + +[[package]] +name = "autobahn" +version = "25.12.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cbor2" }, + { name = "cffi" }, + { name = "cryptography" }, + { name = "hyperlink" }, + { name = "msgpack", marker = "platform_python_implementation == 'CPython'" }, + { name = "py-ubjson" }, + { name = "txaio" }, + { name = "u-msgpack-python", marker = "platform_python_implementation != 'CPython'" }, + { name = "ujson" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/54/d5/9adf0f5b9eb244e58e898e9f3db4b00c09835ef4b6c37d491886e0376b4f/autobahn-25.12.2.tar.gz", hash = "sha256:754c06a54753aeb7e8d10c5cbf03249ad9e2a1a32bca8be02865c6f00628a98c", size = 13893652, upload-time = "2025-12-15T11:13:19.086Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/b7/0a0e3ecb2af7e452f5f359d19bdc647cbc8658f3f498bfa3bf8545cf4768/autobahn-25.12.2-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:c840ee136bfaf6560467160129b0b25a0e33c9a51e2b251e98c5474f27583915", size = 1960463, upload-time = "2025-12-15T11:13:10.183Z" }, + { url = "https://files.pythonhosted.org/packages/19/8b/4215ac49d6b793b592fb08698f3a0e21a59eb3520be7f7ed288fcb52d919/autobahn-25.12.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9abda5cf817c0f8a19a55a67a031adf2fc70ed351719b5bd9e6fa0f5f4bc8f89", size = 2225590, upload-time = "2025-12-15T11:13:11.367Z" }, + { url = "https://files.pythonhosted.org/packages/f6/58/e498821606db57305c8f3c26d9b28fd73e4e0583a1f48330df500721c418/autobahn-25.12.2-cp314-cp314-win_amd64.whl", hash = "sha256:18b12e8af7fc115487715afa10b3f5b5a4b5989bebbe05b71722cf9fce7b1bfb", size = 2184111, upload-time = "2025-12-15T11:13:12.461Z" }, +] + +[[package]] +name = "automat" +version = "25.4.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/0f/d40bbe294bbf004d436a8bcbcfaadca8b5140d39ad0ad3d73d1a8ba15f14/automat-25.4.16.tar.gz", hash = "sha256:0017591a5477066e90d26b0e696ddc143baafd87b588cfac8100bc6be9634de0", size = 129977, upload-time = "2025-04-16T20:12:16.002Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/ff/1175b0b7371e46244032d43a56862d0af455823b5280a50c63d99cc50f18/automat-25.4.16-py3-none-any.whl", hash = "sha256:04e9bce696a8d5671ee698005af6e5a9fa15354140a87f4870744604dcdd3ba1", size = 42842, upload-time = "2025-04-16T20:12:14.447Z" }, +] + +[[package]] +name = "babel" +version = "2.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.14.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c3/b0/1c6a16426d389813b48d95e26898aff79abbde42ad353958ad95cc8c9b21/beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86", size = 627737, upload-time = "2025-11-30T15:08:26.084Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb", size = 107721, upload-time = "2025-11-30T15:08:24.087Z" }, +] + +[[package]] +name = "bleach" +version = "6.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/18/3c8523962314be6bf4c8989c79ad9531c825210dd13a8669f6b84336e8bd/bleach-6.3.0.tar.gz", hash = "sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22", size = 203533, upload-time = "2025-10-27T17:57:39.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl", hash = "sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6", size = 164437, upload-time = "2025-10-27T17:57:37.538Z" }, +] + +[package.optional-dependencies] +css = [ + { name = "tinycss2" }, +] + +[[package]] +name = "blis" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d0/d0/d8cc8c9a4488a787e7fa430f6055e5bd1ddb22c340a751d9e901b82e2efe/blis-1.3.3.tar.gz", hash = "sha256:034d4560ff3cc43e8aa37e188451b0440e3261d989bb8a42ceee865607715ecd", size = 2644873, upload-time = "2025-11-17T12:28:30.511Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/8a/80f7c68fbc24a76fc9c18522c46d6d69329c320abb18e26a707a5d874083/blis-1.3.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c3e33cfbf22a418373766816343fcfcd0556012aa3ffdf562c29cddec448a415", size = 6934081, upload-time = "2025-11-17T12:28:16.436Z" }, + { url = "https://files.pythonhosted.org/packages/e5/52/d1aa3a51a7fc299b0c89dcaa971922714f50b1202769eebbdaadd1b5cff7/blis-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6f165930e8d3a85c606d2003211497e28d528c7416fbfeafb6b15600963f7c9b", size = 1231486, upload-time = "2025-11-17T12:28:18.008Z" }, + { url = "https://files.pythonhosted.org/packages/99/4f/badc7bd7f74861b26c10123bba7b9d16f99cd9535ad0128780360713820f/blis-1.3.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:878d4d96d8f2c7a2459024f013f2e4e5f46d708b23437dae970d998e7bff14a0", size = 2814944, upload-time = "2025-11-17T12:28:19.654Z" }, + { url = "https://files.pythonhosted.org/packages/72/a6/f62a3bd814ca19ec7e29ac889fd354adea1217df3183e10217de51e2eb8b/blis-1.3.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f36c0ca84a05ee5d3dbaa38056c4423c1fc29948b17a7923dd2fed8967375d74", size = 11345825, upload-time = "2025-11-17T12:28:21.354Z" }, + { url = "https://files.pythonhosted.org/packages/d4/6c/671af79ee42bc4c968cae35c091ac89e8721c795bfa4639100670dc59139/blis-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e5a662c48cd4aad5dae1a950345df23957524f071315837a4c6feb7d3b288990", size = 3008771, upload-time = "2025-11-17T12:28:23.637Z" }, + { url = "https://files.pythonhosted.org/packages/be/92/7cd7f8490da7c98ee01557f2105885cc597217b0e7fd2eeb9e22cdd4ef23/blis-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9de26fbd72bac900c273b76d46f0b45b77a28eace2e01f6ac6c2239531a413bb", size = 14219213, upload-time = "2025-11-17T12:28:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/0a/de/acae8e9f9a1f4bb393d41c8265898b0f29772e38eac14e9f69d191e2c006/blis-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:9e5fdf4211b1972400f8ff6dafe87cb689c5d84f046b4a76b207c0bd2270faaf", size = 6324695, upload-time = "2025-11-17T12:28:28.401Z" }, +] + +[[package]] +name = "catalogue" +version = "2.0.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/38/b4/244d58127e1cdf04cf2dc7d9566f0d24ef01d5ce21811bab088ecc62b5ea/catalogue-2.0.10.tar.gz", hash = "sha256:4f56daa940913d3f09d589c191c74e5a6d51762b3a9e37dd53b7437afd6cda15", size = 19561, upload-time = "2023-09-25T06:29:24.962Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/96/d32b941a501ab566a16358d68b6eb4e4acc373fab3c3c4d7d9e649f7b4bb/catalogue-2.0.10-py3-none-any.whl", hash = "sha256:58c2de0020aa90f4a2da7dfad161bf7b3b054c86a5f09fcedc0b2b740c109a9f", size = 17325, upload-time = "2023-09-25T06:29:23.337Z" }, +] + +[[package]] +name = "cbor2" +version = "5.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/8e/8b4fdde28e42ffcd741a37f4ffa9fb59cd4fe01625b544dfcfd9ccb54f01/cbor2-5.8.0.tar.gz", hash = "sha256:b19c35fcae9688ac01ef75bad5db27300c2537eb4ee00ed07e05d8456a0d4931", size = 107825, upload-time = "2025-12-30T18:44:22.455Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/0c/0654233d7543ac8a50f4785f172430ddc97538ba418eb305d6e529d1a120/cbor2-5.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ad72381477133046ce217617d839ea4e9454f8b77d9a6351b229e214102daeb7", size = 70710, upload-time = "2025-12-30T18:44:03.209Z" }, + { url = "https://files.pythonhosted.org/packages/84/62/4671d24e557d7f5a74a01b422c538925140c0495e57decde7e566f91d029/cbor2-5.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6da25190fad3434ce99876b11d4ca6b8828df6ca232cf7344cd14ae1166fb718", size = 285005, upload-time = "2025-12-30T18:44:05.109Z" }, + { url = "https://files.pythonhosted.org/packages/87/85/0c67d763a08e848c9a80d7e4723ba497cce676f41bc7ca1828ae90a0a872/cbor2-5.8.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c13919e3a24c5a6d286551fa288848a4cedc3e507c58a722ccd134e461217d99", size = 282435, upload-time = "2025-12-30T18:44:06.465Z" }, + { url = "https://files.pythonhosted.org/packages/b2/01/0650972b4dbfbebcfbe37cbba7fc3cd9019a8da6397ab3446e07175e342b/cbor2-5.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f8c40d32e5972047a777f9bf730870828f3cf1c43b3eb96fd0429c57a1d3b9e6", size = 277493, upload-time = "2025-12-30T18:44:07.609Z" }, + { url = "https://files.pythonhosted.org/packages/b3/6c/7704a4f32adc7f10f3b41ec067f500a4458f7606397af5e4cf2d368fd288/cbor2-5.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7627894bc0b3d5d0807f31e3107e11b996205470c4429dc2bb4ef8bfe7f64e1e", size = 276085, upload-time = "2025-12-30T18:44:09.021Z" }, + { url = "https://files.pythonhosted.org/packages/88/6d/e43452347630efe8133f5304127539100d937c138c0996d27ec63963ec2c/cbor2-5.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:b51c5e59becae746ca4de2bbaa8a2f5c64a68fec05cea62941b1a84a8335f7d1", size = 71657, upload-time = "2025-12-30T18:44:10.162Z" }, + { url = "https://files.pythonhosted.org/packages/8b/66/9a780ef34ab10a0437666232e885378cdd5f60197b1b5e61a62499e5a10a/cbor2-5.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:53b630f4db4b9f477ad84077283dd17ecf9894738aa17ef4938c369958e02a71", size = 67171, upload-time = "2025-12-30T18:44:11.619Z" }, + { url = "https://files.pythonhosted.org/packages/d6/4f/101071f880b4da05771128c0b89f41e334cff044dee05fb013c8f4be661c/cbor2-5.8.0-py3-none-any.whl", hash = "sha256:3727d80f539567b03a7aa11890e57798c67092c38df9e6c23abb059e0f65069c", size = 24374, upload-time = "2025-12-30T18:44:21.476Z" }, +] + +[[package]] +name = "certifi" +version = "2026.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, +] + +[[package]] +name = "cfgv" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/b5/721b8799b04bf9afe054a3899c6cf4e880fcf8563cc71c15610242490a0c/cfgv-3.5.0.tar.gz", hash = "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132", size = 7334, upload-time = "2025-11-19T20:55:51.612Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445, upload-time = "2025-11-19T20:55:50.744Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" }, + { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" }, + { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" }, + { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" }, + { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" }, + { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" }, + { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" }, + { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" }, + { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" }, + { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" }, + { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" }, + { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, +] + +[[package]] +name = "click" +version = "8.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, +] + +[[package]] +name = "cloudpathlib" +version = "0.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/18/2ac35d6b3015a0c74e923d94fc69baf8307f7c3233de015d69f99e17afa8/cloudpathlib-0.23.0.tar.gz", hash = "sha256:eb38a34c6b8a048ecfd2b2f60917f7cbad4a105b7c979196450c2f541f4d6b4b", size = 53126, upload-time = "2025-10-07T22:47:56.278Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/8a/c4bb04426d608be4a3171efa2e233d2c59a5c8937850c10d098e126df18e/cloudpathlib-0.23.0-py3-none-any.whl", hash = "sha256:8520b3b01468fee77de37ab5d50b1b524ea6b4a8731c35d1b7407ac0cd716002", size = 62755, upload-time = "2025-10-07T22:47:54.905Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "comm" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" }, +] + +[[package]] +name = "confection" +version = "0.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "srsly" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/51/d3/57c6631159a1b48d273b40865c315cf51f89df7a9d1101094ef12e3a37c2/confection-0.1.5.tar.gz", hash = "sha256:8e72dd3ca6bd4f48913cd220f10b8275978e740411654b6e8ca6d7008c590f0e", size = 38924, upload-time = "2024-05-31T16:17:01.559Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/00/3106b1854b45bd0474ced037dfe6b73b90fe68a68968cef47c23de3d43d2/confection-0.1.5-py3-none-any.whl", hash = "sha256:e29d3c3f8eac06b3f77eb9dfb4bf2fc6bcc9622a98ca00a698e3d019c6430b14", size = 35451, upload-time = "2024-05-31T16:16:59.075Z" }, +] + +[[package]] +name = "constantly" +version = "23.10.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/6f/cb2a94494ff74aa9528a36c5b1422756330a75a8367bf20bd63171fc324d/constantly-23.10.4.tar.gz", hash = "sha256:aa92b70a33e2ac0bb33cd745eb61776594dc48764b06c35e0efd050b7f1c7cbd", size = 13300, upload-time = "2023-10-28T23:18:24.316Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/40/c199d095151addf69efdb4b9ca3a4f20f70e20508d6222bffb9b76f58573/constantly-23.10.4-py3-none-any.whl", hash = "sha256:3fd9b4d1c3dc1ec9757f3c52aef7e53ad9323dbe39f51dfd4c43853b68dfa3f9", size = 13547, upload-time = "2023-10-28T23:18:23.038Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, + { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, + { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, + { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" }, + { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" }, + { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" }, + { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" }, + { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, + { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, + { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, + { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, +] + +[[package]] +name = "cryptography" +version = "46.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/33/c00162f49c0e2fe8064a62cb92b93e50c74a72bc370ab92f86112b33ff62/cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1", size = 749258, upload-time = "2025-10-15T23:18:31.74Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/42/9c391dd801d6cf0d561b5890549d4b27bafcc53b39c31a817e69d87c625b/cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a", size = 7225004, upload-time = "2025-10-15T23:16:52.239Z" }, + { url = "https://files.pythonhosted.org/packages/1c/67/38769ca6b65f07461eb200e85fc1639b438bdc667be02cf7f2cd6a64601c/cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc", size = 4296667, upload-time = "2025-10-15T23:16:54.369Z" }, + { url = "https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d", size = 4450807, upload-time = "2025-10-15T23:16:56.414Z" }, + { url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb", size = 4299615, upload-time = "2025-10-15T23:16:58.442Z" }, + { url = "https://files.pythonhosted.org/packages/64/02/b73a533f6b64a69f3cd3872acb6ebc12aef924d8d103133bb3ea750dc703/cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849", size = 4016800, upload-time = "2025-10-15T23:17:00.378Z" }, + { url = "https://files.pythonhosted.org/packages/25/d5/16e41afbfa450cde85a3b7ec599bebefaef16b5c6ba4ec49a3532336ed72/cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8", size = 4984707, upload-time = "2025-10-15T23:17:01.98Z" }, + { url = "https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec", size = 4482541, upload-time = "2025-10-15T23:17:04.078Z" }, + { url = "https://files.pythonhosted.org/packages/78/f6/50736d40d97e8483172f1bb6e698895b92a223dba513b0ca6f06b2365339/cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91", size = 4299464, upload-time = "2025-10-15T23:17:05.483Z" }, + { url = "https://files.pythonhosted.org/packages/00/de/d8e26b1a855f19d9994a19c702fa2e93b0456beccbcfe437eda00e0701f2/cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e", size = 4950838, upload-time = "2025-10-15T23:17:07.425Z" }, + { url = "https://files.pythonhosted.org/packages/8f/29/798fc4ec461a1c9e9f735f2fc58741b0daae30688f41b2497dcbc9ed1355/cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926", size = 4481596, upload-time = "2025-10-15T23:17:09.343Z" }, + { url = "https://files.pythonhosted.org/packages/15/8d/03cd48b20a573adfff7652b76271078e3045b9f49387920e7f1f631d125e/cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71", size = 4426782, upload-time = "2025-10-15T23:17:11.22Z" }, + { url = "https://files.pythonhosted.org/packages/fa/b1/ebacbfe53317d55cf33165bda24c86523497a6881f339f9aae5c2e13e57b/cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac", size = 4698381, upload-time = "2025-10-15T23:17:12.829Z" }, + { url = "https://files.pythonhosted.org/packages/96/92/8a6a9525893325fc057a01f654d7efc2c64b9de90413adcf605a85744ff4/cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018", size = 3055988, upload-time = "2025-10-15T23:17:14.65Z" }, + { url = "https://files.pythonhosted.org/packages/7e/bf/80fbf45253ea585a1e492a6a17efcb93467701fa79e71550a430c5e60df0/cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb", size = 3514451, upload-time = "2025-10-15T23:17:16.142Z" }, + { url = "https://files.pythonhosted.org/packages/2e/af/9b302da4c87b0beb9db4e756386a7c6c5b8003cd0e742277888d352ae91d/cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c", size = 2928007, upload-time = "2025-10-15T23:17:18.04Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e2/a510aa736755bffa9d2f75029c229111a1d02f8ecd5de03078f4c18d91a3/cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217", size = 7158012, upload-time = "2025-10-15T23:17:19.982Z" }, + { url = "https://files.pythonhosted.org/packages/73/dc/9aa866fbdbb95b02e7f9d086f1fccfeebf8953509b87e3f28fff927ff8a0/cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5", size = 4288728, upload-time = "2025-10-15T23:17:21.527Z" }, + { url = "https://files.pythonhosted.org/packages/c5/fd/bc1daf8230eaa075184cbbf5f8cd00ba9db4fd32d63fb83da4671b72ed8a/cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715", size = 4435078, upload-time = "2025-10-15T23:17:23.042Z" }, + { url = "https://files.pythonhosted.org/packages/82/98/d3bd5407ce4c60017f8ff9e63ffee4200ab3e23fe05b765cab805a7db008/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54", size = 4293460, upload-time = "2025-10-15T23:17:24.885Z" }, + { url = "https://files.pythonhosted.org/packages/26/e9/e23e7900983c2b8af7a08098db406cf989d7f09caea7897e347598d4cd5b/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459", size = 3995237, upload-time = "2025-10-15T23:17:26.449Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/af68c509d4a138cfe299d0d7ddb14afba15233223ebd933b4bbdbc7155d3/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422", size = 4967344, upload-time = "2025-10-15T23:17:28.06Z" }, + { url = "https://files.pythonhosted.org/packages/ca/e3/8643d077c53868b681af077edf6b3cb58288b5423610f21c62aadcbe99f4/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7", size = 4466564, upload-time = "2025-10-15T23:17:29.665Z" }, + { url = "https://files.pythonhosted.org/packages/0e/43/c1e8726fa59c236ff477ff2b5dc071e54b21e5a1e51aa2cee1676f1c986f/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044", size = 4292415, upload-time = "2025-10-15T23:17:31.686Z" }, + { url = "https://files.pythonhosted.org/packages/42/f9/2f8fefdb1aee8a8e3256a0568cffc4e6d517b256a2fe97a029b3f1b9fe7e/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665", size = 4931457, upload-time = "2025-10-15T23:17:33.478Z" }, + { url = "https://files.pythonhosted.org/packages/79/30/9b54127a9a778ccd6d27c3da7563e9f2d341826075ceab89ae3b41bf5be2/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3", size = 4466074, upload-time = "2025-10-15T23:17:35.158Z" }, + { url = "https://files.pythonhosted.org/packages/ac/68/b4f4a10928e26c941b1b6a179143af9f4d27d88fe84a6a3c53592d2e76bf/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20", size = 4420569, upload-time = "2025-10-15T23:17:37.188Z" }, + { url = "https://files.pythonhosted.org/packages/a3/49/3746dab4c0d1979888f125226357d3262a6dd40e114ac29e3d2abdf1ec55/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de", size = 4681941, upload-time = "2025-10-15T23:17:39.236Z" }, + { url = "https://files.pythonhosted.org/packages/fd/30/27654c1dbaf7e4a3531fa1fc77986d04aefa4d6d78259a62c9dc13d7ad36/cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914", size = 3022339, upload-time = "2025-10-15T23:17:40.888Z" }, + { url = "https://files.pythonhosted.org/packages/f6/30/640f34ccd4d2a1bc88367b54b926b781b5a018d65f404d409aba76a84b1c/cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db", size = 3494315, upload-time = "2025-10-15T23:17:42.769Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8b/88cc7e3bd0a8e7b861f26981f7b820e1f46aa9d26cc482d0feba0ecb4919/cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21", size = 2919331, upload-time = "2025-10-15T23:17:44.468Z" }, + { url = "https://files.pythonhosted.org/packages/fd/23/45fe7f376a7df8daf6da3556603b36f53475a99ce4faacb6ba2cf3d82021/cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936", size = 7218248, upload-time = "2025-10-15T23:17:46.294Z" }, + { url = "https://files.pythonhosted.org/packages/27/32/b68d27471372737054cbd34c84981f9edbc24fe67ca225d389799614e27f/cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683", size = 4294089, upload-time = "2025-10-15T23:17:48.269Z" }, + { url = "https://files.pythonhosted.org/packages/26/42/fa8389d4478368743e24e61eea78846a0006caffaf72ea24a15159215a14/cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d", size = 4440029, upload-time = "2025-10-15T23:17:49.837Z" }, + { url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0", size = 4297222, upload-time = "2025-10-15T23:17:51.357Z" }, + { url = "https://files.pythonhosted.org/packages/fd/cf/da9502c4e1912cb1da3807ea3618a6829bee8207456fbbeebc361ec38ba3/cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc", size = 4012280, upload-time = "2025-10-15T23:17:52.964Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8f/9adb86b93330e0df8b3dcf03eae67c33ba89958fc2e03862ef1ac2b42465/cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3", size = 4978958, upload-time = "2025-10-15T23:17:54.965Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a0/5fa77988289c34bdb9f913f5606ecc9ada1adb5ae870bd0d1054a7021cc4/cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971", size = 4473714, upload-time = "2025-10-15T23:17:56.754Z" }, + { url = "https://files.pythonhosted.org/packages/14/e5/fc82d72a58d41c393697aa18c9abe5ae1214ff6f2a5c18ac470f92777895/cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac", size = 4296970, upload-time = "2025-10-15T23:17:58.588Z" }, + { url = "https://files.pythonhosted.org/packages/78/06/5663ed35438d0b09056973994f1aec467492b33bd31da36e468b01ec1097/cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04", size = 4940236, upload-time = "2025-10-15T23:18:00.897Z" }, + { url = "https://files.pythonhosted.org/packages/fc/59/873633f3f2dcd8a053b8dd1d38f783043b5fce589c0f6988bf55ef57e43e/cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506", size = 4472642, upload-time = "2025-10-15T23:18:02.749Z" }, + { url = "https://files.pythonhosted.org/packages/3d/39/8e71f3930e40f6877737d6f69248cf74d4e34b886a3967d32f919cc50d3b/cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963", size = 4423126, upload-time = "2025-10-15T23:18:04.85Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c7/f65027c2810e14c3e7268353b1681932b87e5a48e65505d8cc17c99e36ae/cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4", size = 4686573, upload-time = "2025-10-15T23:18:06.908Z" }, + { url = "https://files.pythonhosted.org/packages/0a/6e/1c8331ddf91ca4730ab3086a0f1be19c65510a33b5a441cb334e7a2d2560/cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df", size = 3036695, upload-time = "2025-10-15T23:18:08.672Z" }, + { url = "https://files.pythonhosted.org/packages/90/45/b0d691df20633eff80955a0fc7695ff9051ffce8b69741444bd9ed7bd0db/cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f", size = 3501720, upload-time = "2025-10-15T23:18:10.632Z" }, + { url = "https://files.pythonhosted.org/packages/e8/cb/2da4cc83f5edb9c3257d09e1e7ab7b23f049c7962cae8d842bbef0a9cec9/cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372", size = 2918740, upload-time = "2025-10-15T23:18:12.277Z" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + +[[package]] +name = "cymem" +version = "2.0.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/2f0fbb32535c3731b7c2974c569fb9325e0a38ed5565a08e1139a3b71e82/cymem-2.0.13.tar.gz", hash = "sha256:1c91a92ae8c7104275ac26bd4d29b08ccd3e7faff5893d3858cb6fadf1bc1588", size = 12320, upload-time = "2025-11-14T14:58:36.902Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/2e/f0e1596010a9a57fa9ebd124a678c07c5b2092283781ae51e79edcf5cb98/cymem-2.0.13-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d2a4bf67db76c7b6afc33de44fb1c318207c3224a30da02c70901936b5aafdf1", size = 43812, upload-time = "2025-11-14T14:58:04.227Z" }, + { url = "https://files.pythonhosted.org/packages/bc/45/8ccc21df08fcbfa6aa3efeb7efc11a1c81c90e7476e255768bb9c29ba02a/cymem-2.0.13-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:92a2ce50afa5625fb5ce7c9302cee61e23a57ccac52cd0410b4858e572f8614b", size = 42951, upload-time = "2025-11-14T14:58:05.424Z" }, + { url = "https://files.pythonhosted.org/packages/01/8c/fe16531631f051d3d1226fa42e2d76fd2c8d5cfa893ec93baee90c7a9d90/cymem-2.0.13-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bc116a70cc3a5dc3d1684db5268eff9399a0be8603980005e5b889564f1ea42f", size = 249878, upload-time = "2025-11-14T14:58:06.95Z" }, + { url = "https://files.pythonhosted.org/packages/47/4b/39d67b80ffb260457c05fcc545de37d82e9e2dbafc93dd6b64f17e09b933/cymem-2.0.13-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:68489bf0035c4c280614067ab6a82815b01dc9fcd486742a5306fe9f68deb7ef", size = 252571, upload-time = "2025-11-14T14:58:08.232Z" }, + { url = "https://files.pythonhosted.org/packages/53/0e/76f6531f74dfdfe7107899cce93ab063bb7ee086ccd3910522b31f623c08/cymem-2.0.13-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:03cb7bdb55718d5eb6ef0340b1d2430ba1386db30d33e9134d01ba9d6d34d705", size = 248555, upload-time = "2025-11-14T14:58:09.429Z" }, + { url = "https://files.pythonhosted.org/packages/c7/7c/eee56757db81f0aefc2615267677ae145aff74228f529838425057003c0d/cymem-2.0.13-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1710390e7fb2510a8091a1991024d8ae838fd06b02cdfdcd35f006192e3c6b0e", size = 254177, upload-time = "2025-11-14T14:58:10.594Z" }, + { url = "https://files.pythonhosted.org/packages/77/e0/a4b58ec9e53c836dce07ef39837a64a599f4a21a134fc7ca57a3a8f9a4b5/cymem-2.0.13-cp314-cp314-win_amd64.whl", hash = "sha256:ac699c8ec72a3a9de8109bd78821ab22f60b14cf2abccd970b5ff310e14158ed", size = 40853, upload-time = "2025-11-14T14:58:12.116Z" }, + { url = "https://files.pythonhosted.org/packages/61/81/9931d1f83e5aeba175440af0b28f0c2e6f71274a5a7b688bc3e907669388/cymem-2.0.13-cp314-cp314-win_arm64.whl", hash = "sha256:90c2d0c04bcda12cd5cebe9be93ce3af6742ad8da96e1b1907e3f8e00291def1", size = 36970, upload-time = "2025-11-14T14:58:13.114Z" }, + { url = "https://files.pythonhosted.org/packages/b7/ef/af447c2184dec6dec973be14614df8ccb4d16d1c74e0784ab4f02538433c/cymem-2.0.13-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:ff036bbc1464993552fd1251b0a83fe102af334b301e3896d7aa05a4999ad042", size = 46804, upload-time = "2025-11-14T14:58:14.113Z" }, + { url = "https://files.pythonhosted.org/packages/8c/95/e10f33a8d4fc17f9b933d451038218437f9326c2abb15a3e7f58ce2a06ec/cymem-2.0.13-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:fb8291691ba7ff4e6e000224cc97a744a8d9588418535c9454fd8436911df612", size = 46254, upload-time = "2025-11-14T14:58:15.156Z" }, + { url = "https://files.pythonhosted.org/packages/e7/7a/5efeb2d2ea6ebad2745301ad33a4fa9a8f9a33b66623ee4d9185683007a6/cymem-2.0.13-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d8d06ea59006b1251ad5794bcc00121e148434826090ead0073c7b7fedebe431", size = 296061, upload-time = "2025-11-14T14:58:16.254Z" }, + { url = "https://files.pythonhosted.org/packages/0b/28/2a3f65842cc8443c2c0650cf23d525be06c8761ab212e0a095a88627be1b/cymem-2.0.13-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c0046a619ecc845ccb4528b37b63426a0cbcb4f14d7940add3391f59f13701e6", size = 285784, upload-time = "2025-11-14T14:58:17.412Z" }, + { url = "https://files.pythonhosted.org/packages/98/73/dd5f9729398f0108c2e71d942253d0d484d299d08b02e474d7cfc43ed0b0/cymem-2.0.13-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:18ad5b116a82fa3674bc8838bd3792891b428971e2123ae8c0fd3ca472157c5e", size = 288062, upload-time = "2025-11-14T14:58:20.225Z" }, + { url = "https://files.pythonhosted.org/packages/5a/01/ffe51729a8f961a437920560659073e47f575d4627445216c1177ecd4a41/cymem-2.0.13-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:666ce6146bc61b9318aa70d91ce33f126b6344a25cf0b925621baed0c161e9cc", size = 290465, upload-time = "2025-11-14T14:58:21.815Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ac/c9e7d68607f71ef978c81e334ab2898b426944c71950212b1467186f69f9/cymem-2.0.13-cp314-cp314t-win_amd64.whl", hash = "sha256:84c1168c563d9d1e04546cb65e3e54fde2bf814f7c7faf11fc06436598e386d1", size = 46665, upload-time = "2025-11-14T14:58:23.512Z" }, + { url = "https://files.pythonhosted.org/packages/66/66/150e406a2db5535533aa3c946de58f0371f2e412e23f050c704588023e6e/cymem-2.0.13-cp314-cp314t-win_arm64.whl", hash = "sha256:e9027764dc5f1999fb4b4cabee1d0322c59e330c0a6485b436a68275f614277f", size = 39715, upload-time = "2025-11-14T14:58:24.773Z" }, +] + +[[package]] +name = "debugpy" +version = "1.8.19" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/73/75/9e12d4d42349b817cd545b89247696c67917aab907012ae5b64bbfea3199/debugpy-1.8.19.tar.gz", hash = "sha256:eea7e5987445ab0b5ed258093722d5ecb8bb72217c5c9b1e21f64efe23ddebdb", size = 1644590, upload-time = "2025-12-15T21:53:28.044Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/b9/cbec520c3a00508327476c7fce26fbafef98f412707e511eb9d19a2ef467/debugpy-1.8.19-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:1e8c4d1bd230067bf1bbcdbd6032e5a57068638eb28b9153d008ecde288152af", size = 2537372, upload-time = "2025-12-15T21:53:57.318Z" }, + { url = "https://files.pythonhosted.org/packages/88/5e/cf4e4dc712a141e10d58405c58c8268554aec3c35c09cdcda7535ff13f76/debugpy-1.8.19-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:d40c016c1f538dbf1762936e3aeb43a89b965069d9f60f9e39d35d9d25e6b809", size = 4268729, upload-time = "2025-12-15T21:53:58.712Z" }, + { url = "https://files.pythonhosted.org/packages/82/a3/c91a087ab21f1047db328c1d3eb5d1ff0e52de9e74f9f6f6fa14cdd93d58/debugpy-1.8.19-cp314-cp314-win32.whl", hash = "sha256:0601708223fe1cd0e27c6cce67a899d92c7d68e73690211e6788a4b0e1903f5b", size = 5286388, upload-time = "2025-12-15T21:54:00.687Z" }, + { url = "https://files.pythonhosted.org/packages/17/b8/bfdc30b6e94f1eff09f2dc9cc1f9cd1c6cde3d996bcbd36ce2d9a4956e99/debugpy-1.8.19-cp314-cp314-win_amd64.whl", hash = "sha256:8e19a725f5d486f20e53a1dde2ab8bb2c9607c40c00a42ab646def962b41125f", size = 5327741, upload-time = "2025-12-15T21:54:02.148Z" }, + { url = "https://files.pythonhosted.org/packages/25/3e/e27078370414ef35fafad2c06d182110073daaeb5d3bf734b0b1eeefe452/debugpy-1.8.19-py2.py3-none-any.whl", hash = "sha256:360ffd231a780abbc414ba0f005dad409e71c78637efe8f2bd75837132a41d38", size = 5292321, upload-time = "2025-12-15T21:54:16.024Z" }, +] + +[[package]] +name = "decorator" +version = "5.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, +] + +[[package]] +name = "dill" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/12/80/630b4b88364e9a8c8c5797f4602d0f76ef820909ee32f0bacb9f90654042/dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0", size = 186976, upload-time = "2025-04-16T00:41:48.867Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049", size = 119668, upload-time = "2025-04-16T00:41:47.671Z" }, +] + +[[package]] +name = "distlib" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, +] + +[[package]] +name = "dodgy" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/40/10/236a51323133319e108bc52594a66a39ec2f8fa9e4e47543936b5f4582d0/dodgy-0.2.1.tar.gz", hash = "sha256:28323cbfc9352139fdd3d316fa17f325cc0e9ac74438cbba51d70f9b48f86c3a", size = 4896, upload-time = "2019-12-31T16:44:59.472Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/f4/65b8a29adab331611259b86cf1d87a64f523fed52aba5d4bbdb2be2aed43/dodgy-0.2.1-py3-none-any.whl", hash = "sha256:51f54c0fd886fa3854387f354b19f429d38c04f984f38bc572558b703c0542a6", size = 5362, upload-time = "2019-12-31T16:44:58.264Z" }, +] + +[[package]] +name = "dweepy" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1b/da/a810d2a0fb08d7bf715363538a380072a5158ac40b2084992633ba2b85d9/dweepy-0.3.0.tar.gz", hash = "sha256:5d5c2b9071ad1e1069ec5d144ac7f47bc632062a6a8effb725142c7576a68f6b", size = 8080, upload-time = "2017-05-11T10:51:23.719Z" } + +[[package]] +name = "executing" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, +] + +[[package]] +name = "fastjsonschema" +version = "2.21.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de", size = 374130, upload-time = "2025-08-14T18:49:36.666Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024, upload-time = "2025-08-14T18:49:34.776Z" }, +] + +[[package]] +name = "filelock" +version = "3.20.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/65/ce7f1b70157833bf3cb851b556a37d4547ceafc158aa9b34b36782f23696/filelock-3.20.3.tar.gz", hash = "sha256:18c57ee915c7ec61cff0ecf7f0f869936c7c30191bb0cf406f1341778d0834e1", size = 19485, upload-time = "2026-01-09T17:55:05.421Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/36/7fb70f04bf00bc646cd5bb45aa9eddb15e19437a28b8fb2b4a5249fac770/filelock-3.20.3-py3-none-any.whl", hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1", size = 16701, upload-time = "2026-01-09T17:55:04.334Z" }, +] + +[[package]] +name = "flake8" +version = "7.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mccabe" }, + { name = "pycodestyle" }, + { name = "pyflakes" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/af/fbfe3c4b5a657d79e5c47a2827a362f9e1b763336a52f926126aa6dc7123/flake8-7.3.0.tar.gz", hash = "sha256:fe044858146b9fc69b551a4b490d69cf960fcb78ad1edcb84e7fbb1b4a8e3872", size = 48326, upload-time = "2025-06-20T19:31:35.838Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/56/13ab06b4f93ca7cac71078fbe37fcea175d3216f31f85c3168a6bbd0bb9a/flake8-7.3.0-py2.py3-none-any.whl", hash = "sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e", size = 57922, upload-time = "2025-06-20T19:31:34.425Z" }, +] + +[[package]] +name = "flake8-polyfill" +version = "1.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "flake8" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e6/67/1c26634a770db5c442e361311bee73cb3a177adb2eb3f7af8953cfd9f553/flake8-polyfill-1.0.2.tar.gz", hash = "sha256:e44b087597f6da52ec6393a709e7108b2905317d0c0b744cdca6208e670d8eda", size = 7591, upload-time = "2017-12-30T13:46:58.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/b5/a43fed6fd0193585d17d6faa7b85317d4461f694aaed546098c69f856579/flake8_polyfill-1.0.2-py2.py3-none-any.whl", hash = "sha256:12be6a34ee3ab795b19ca73505e7b55826d5f6ad7230d31b18e106400169b9e9", size = 7350, upload-time = "2017-12-30T13:46:54.79Z" }, +] + +[[package]] +name = "fonttools" +version = "4.61.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/ca/cf17b88a8df95691275a3d77dc0a5ad9907f328ae53acbe6795da1b2f5ed/fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69", size = 3565756, upload-time = "2025-12-12T17:31:24.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/8f/4e7bf82c0cbb738d3c2206c920ca34ca74ef9dabde779030145d28665104/fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd", size = 2846094, upload-time = "2025-12-12T17:30:43.511Z" }, + { url = "https://files.pythonhosted.org/packages/71/09/d44e45d0a4f3a651f23a1e9d42de43bc643cce2971b19e784cc67d823676/fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d9203500f7c63545b4ce3799319fe4d9feb1a1b89b28d3cb5abd11b9dd64147e", size = 2396589, upload-time = "2025-12-12T17:30:45.681Z" }, + { url = "https://files.pythonhosted.org/packages/89/18/58c64cafcf8eb677a99ef593121f719e6dcbdb7d1c594ae5a10d4997ca8a/fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fa646ecec9528bef693415c79a86e733c70a4965dd938e9a226b0fc64c9d2e6c", size = 4877892, upload-time = "2025-12-12T17:30:47.709Z" }, + { url = "https://files.pythonhosted.org/packages/8a/ec/9e6b38c7ba1e09eb51db849d5450f4c05b7e78481f662c3b79dbde6f3d04/fonttools-4.61.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f35ad7805edba3aac1a3710d104592df59f4b957e30108ae0ba6c10b11dd75", size = 4972884, upload-time = "2025-12-12T17:30:49.656Z" }, + { url = "https://files.pythonhosted.org/packages/5e/87/b5339da8e0256734ba0dbbf5b6cdebb1dd79b01dc8c270989b7bcd465541/fonttools-4.61.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b931ae8f62db78861b0ff1ac017851764602288575d65b8e8ff1963fed419063", size = 4924405, upload-time = "2025-12-12T17:30:51.735Z" }, + { url = "https://files.pythonhosted.org/packages/0b/47/e3409f1e1e69c073a3a6fd8cb886eb18c0bae0ee13db2c8d5e7f8495e8b7/fonttools-4.61.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b148b56f5de675ee16d45e769e69f87623a4944f7443850bf9a9376e628a89d2", size = 5035553, upload-time = "2025-12-12T17:30:54.823Z" }, + { url = "https://files.pythonhosted.org/packages/bf/b6/1f6600161b1073a984294c6c031e1a56ebf95b6164249eecf30012bb2e38/fonttools-4.61.1-cp314-cp314-win32.whl", hash = "sha256:9b666a475a65f4e839d3d10473fad6d47e0a9db14a2f4a224029c5bfde58ad2c", size = 2271915, upload-time = "2025-12-12T17:30:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/52/7b/91e7b01e37cc8eb0e1f770d08305b3655e4f002fc160fb82b3390eabacf5/fonttools-4.61.1-cp314-cp314-win_amd64.whl", hash = "sha256:4f5686e1fe5fce75d82d93c47a438a25bf0d1319d2843a926f741140b2b16e0c", size = 2323487, upload-time = "2025-12-12T17:30:59.804Z" }, + { url = "https://files.pythonhosted.org/packages/39/5c/908ad78e46c61c3e3ed70c3b58ff82ab48437faf84ec84f109592cabbd9f/fonttools-4.61.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e76ce097e3c57c4bcb67c5aa24a0ecdbd9f74ea9219997a707a4061fbe2707aa", size = 2929571, upload-time = "2025-12-12T17:31:02.574Z" }, + { url = "https://files.pythonhosted.org/packages/bd/41/975804132c6dea64cdbfbaa59f3518a21c137a10cccf962805b301ac6ab2/fonttools-4.61.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9cfef3ab326780c04d6646f68d4b4742aae222e8b8ea1d627c74e38afcbc9d91", size = 2435317, upload-time = "2025-12-12T17:31:04.974Z" }, + { url = "https://files.pythonhosted.org/packages/b0/5a/aef2a0a8daf1ebaae4cfd83f84186d4a72ee08fd6a8451289fcd03ffa8a4/fonttools-4.61.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a75c301f96db737e1c5ed5fd7d77d9c34466de16095a266509e13da09751bd19", size = 4882124, upload-time = "2025-12-12T17:31:07.456Z" }, + { url = "https://files.pythonhosted.org/packages/80/33/d6db3485b645b81cea538c9d1c9219d5805f0877fda18777add4671c5240/fonttools-4.61.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:91669ccac46bbc1d09e9273546181919064e8df73488ea087dcac3e2968df9ba", size = 5100391, upload-time = "2025-12-12T17:31:09.732Z" }, + { url = "https://files.pythonhosted.org/packages/6c/d6/675ba631454043c75fcf76f0ca5463eac8eb0666ea1d7badae5fea001155/fonttools-4.61.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c33ab3ca9d3ccd581d58e989d67554e42d8d4ded94ab3ade3508455fe70e65f7", size = 4978800, upload-time = "2025-12-12T17:31:11.681Z" }, + { url = "https://files.pythonhosted.org/packages/7f/33/d3ec753d547a8d2bdaedd390d4a814e8d5b45a093d558f025c6b990b554c/fonttools-4.61.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:664c5a68ec406f6b1547946683008576ef8b38275608e1cee6c061828171c118", size = 5006426, upload-time = "2025-12-12T17:31:13.764Z" }, + { url = "https://files.pythonhosted.org/packages/b4/40/cc11f378b561a67bea850ab50063366a0d1dd3f6d0a30ce0f874b0ad5664/fonttools-4.61.1-cp314-cp314t-win32.whl", hash = "sha256:aed04cabe26f30c1647ef0e8fbb207516fd40fe9472e9439695f5c6998e60ac5", size = 2335377, upload-time = "2025-12-12T17:31:16.49Z" }, + { url = "https://files.pythonhosted.org/packages/e4/ff/c9a2b66b39f8628531ea58b320d66d951267c98c6a38684daa8f50fb02f8/fonttools-4.61.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2180f14c141d2f0f3da43f3a81bc8aa4684860f6b0e6f9e165a4831f24e6a23b", size = 2400613, upload-time = "2025-12-12T17:31:18.769Z" }, + { url = "https://files.pythonhosted.org/packages/c7/4e/ce75a57ff3aebf6fc1f4e9d508b8e5810618a33d900ad6c19eb30b290b97/fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371", size = 1148996, upload-time = "2025-12-12T17:31:21.03Z" }, +] + +[[package]] +name = "fqdn" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/3e/a80a8c077fd798951169626cde3e239adeba7dab75deb3555716415bd9b0/fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f", size = 6015, upload-time = "2021-03-11T07:16:29.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014", size = 9121, upload-time = "2021-03-11T07:16:28.351Z" }, +] + +[[package]] +name = "geographiclib" +version = "2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/78/4892343230a9d29faa1364564e525307a37e54ad776ea62c12129dbba704/geographiclib-2.1.tar.gz", hash = "sha256:6a6545e6262d0ed3522e13c515713718797e37ed8c672c31ad7b249f372ef108", size = 37004, upload-time = "2025-08-21T21:34:26Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/b3/802576f2ea5dcb48501bb162e4c7b7b3ca5654a42b2c968ef98a797a4c79/geographiclib-2.1-py3-none-any.whl", hash = "sha256:e2a873b9b9e7fc38721ad73d5f4e6c9ed140d428a339970f505c07056997d40b", size = 40740, upload-time = "2025-08-21T21:34:24.955Z" }, +] + +[[package]] +name = "geopy" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "geographiclib" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/fd/ef6d53875ceab72c1fad22dbed5ec1ad04eb378c2251a6a8024bad890c3b/geopy-2.4.1.tar.gz", hash = "sha256:50283d8e7ad07d89be5cb027338c6365a32044df3ae2556ad3f52f4840b3d0d1", size = 117625, upload-time = "2023-11-23T21:49:32.734Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/15/cf2a69ade4b194aa524ac75112d5caac37414b20a3a03e6865dfe0bd1539/geopy-2.4.1-py3-none-any.whl", hash = "sha256:ae8b4bc5c1131820f4d75fce9d4aaaca0c85189b3aa5d64c3dcaf5e3b7b882a7", size = 125437, upload-time = "2023-11-23T21:49:30.421Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "hyperlink" +version = "21.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3a/51/1947bd81d75af87e3bb9e34593a4cf118115a8feb451ce7a69044ef1412e/hyperlink-21.0.0.tar.gz", hash = "sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b", size = 140743, upload-time = "2021-01-08T05:51:20.972Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl", hash = "sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4", size = 74638, upload-time = "2021-01-08T05:51:22.906Z" }, +] + +[[package]] +name = "identify" +version = "2.6.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/e7/685de97986c916a6d93b3876139e00eef26ad5bbbd61925d670ae8013449/identify-2.6.15.tar.gz", hash = "sha256:e4f4864b96c6557ef2a1e1c951771838f4edc9df3a72ec7118b338801b11c7bf", size = 99311, upload-time = "2025-10-02T17:43:40.631Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/1c/e5fd8f973d4f375adb21565739498e2e9a1e54c858a97b9a8ccfdc81da9b/identify-2.6.15-py2.py3-none-any.whl", hash = "sha256:1181ef7608e00704db228516541eb83a88a9f94433a8c80bb9b5bd54b1d81757", size = 99183, upload-time = "2025-10-02T17:43:39.137Z" }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + +[[package]] +name = "imageio" +version = "2.37.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pillow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/6f/606be632e37bf8d05b253e8626c2291d74c691ddc7bcdf7d6aaf33b32f6a/imageio-2.37.2.tar.gz", hash = "sha256:0212ef2727ac9caa5ca4b2c75ae89454312f440a756fcfc8ef1993e718f50f8a", size = 389600, upload-time = "2025-11-04T14:29:39.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/fe/301e0936b79bcab4cacc7548bf2853fc28dced0a578bab1f7ef53c9aa75b/imageio-2.37.2-py3-none-any.whl", hash = "sha256:ad9adfb20335d718c03de457358ed69f141021a333c40a53e57273d8a5bd0b9b", size = 317646, upload-time = "2025-11-04T14:29:37.948Z" }, +] + +[[package]] +name = "incremental" +version = "24.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/3c/82e84109e02c492f382c711c58a3dd91badda6d746def81a1465f74dc9f5/incremental-24.11.0.tar.gz", hash = "sha256:87d3480dbb083c1d736222511a8cf380012a8176c2456d01ef483242abbbcf8c", size = 24000, upload-time = "2025-11-28T02:30:17.861Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/55/0f4df2a44053867ea9cbea73fc588b03c55605cd695cee0a3d86f0029cb2/incremental-24.11.0-py3-none-any.whl", hash = "sha256:a34450716b1c4341fe6676a0598e88a39e04189f4dce5dc96f656e040baa10b3", size = 21109, upload-time = "2025-11-28T02:30:16.442Z" }, +] + +[[package]] +name = "introtopython" +version = "0.9.0" +source = { virtual = "." } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "dweepy" }, + { name = "geopy" }, + { name = "imageio" }, + { name = "ipykernel" }, + { name = "jupyterlab" }, + { name = "matplotlib" }, + { name = "nltk" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "prospector" }, + { name = "pydub" }, + { name = "scikit-learn" }, + { name = "scipy" }, + { name = "seaborn" }, + { name = "spacy" }, + { name = "textatistic" }, + { name = "textblob" }, + { name = "watson-developer-cloud" }, +] + +[package.optional-dependencies] +audio = [ + { name = "pyaudio" }, + { name = "pysine" }, +] +dev = [ + { name = "packaging" }, + { name = "pre-commit" }, + { name = "validate-pyproject" }, +] + +[package.metadata] +requires-dist = [ + { name = "beautifulsoup4" }, + { name = "dweepy" }, + { name = "geopy" }, + { name = "imageio" }, + { name = "ipykernel" }, + { name = "jupyterlab" }, + { name = "matplotlib" }, + { name = "nltk" }, + { name = "numpy" }, + { name = "packaging", marker = "extra == 'dev'", specifier = ">=25.0" }, + { name = "pandas" }, + { name = "pre-commit", marker = "extra == 'dev'", specifier = ">=4" }, + { name = "prospector" }, + { name = "pyaudio", marker = "extra == 'audio'", specifier = "==0.2.14" }, + { name = "pydub" }, + { name = "pysine", marker = "extra == 'audio'", specifier = "==0.9.2" }, + { name = "scikit-learn" }, + { name = "scipy" }, + { name = "seaborn" }, + { name = "spacy" }, + { name = "textatistic" }, + { name = "textblob" }, + { name = "validate-pyproject", marker = "extra == 'dev'", specifier = ">=0.11.0" }, + { name = "watson-developer-cloud" }, +] +provides-extras = ["dev", "docs", "audio"] + +[[package]] +name = "ipykernel" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appnope", marker = "sys_platform == 'darwin'" }, + { name = "comm" }, + { name = "debugpy" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "matplotlib-inline" }, + { name = "nest-asyncio" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/a4/4948be6eb88628505b83a1f2f40d90254cab66abf2043b3c40fa07dfce0f/ipykernel-7.1.0.tar.gz", hash = "sha256:58a3fc88533d5930c3546dc7eac66c6d288acde4f801e2001e65edc5dc9cf0db", size = 174579, upload-time = "2025-10-27T09:46:39.471Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/17/20c2552266728ceba271967b87919664ecc0e33efca29c3efc6baf88c5f9/ipykernel-7.1.0-py3-none-any.whl", hash = "sha256:763b5ec6c5b7776f6a8d7ce09b267693b4e5ce75cb50ae696aaefb3c85e1ea4c", size = 117968, upload-time = "2025-10-27T09:46:37.805Z" }, +] + +[[package]] +name = "ipython" +version = "9.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "ipython-pygments-lexers" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/dd/fb08d22ec0c27e73c8bc8f71810709870d51cadaf27b7ddd3f011236c100/ipython-9.9.0.tar.gz", hash = "sha256:48fbed1b2de5e2c7177eefa144aba7fcb82dac514f09b57e2ac9da34ddb54220", size = 4425043, upload-time = "2026-01-05T12:36:46.233Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/92/162cfaee4ccf370465c5af1ce36a9eacec1becb552f2033bb3584e6f640a/ipython-9.9.0-py3-none-any.whl", hash = "sha256:b457fe9165df2b84e8ec909a97abcf2ed88f565970efba16b1f7229c283d252b", size = 621431, upload-time = "2026-01-05T12:36:44.669Z" }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, +] + +[[package]] +name = "isoduration" +version = "20.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/1a/3c8edc664e06e6bd06cce40c6b22da5f1429aa4224d0c590f3be21c91ead/isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", size = 11649, upload-time = "2020-11-01T11:00:00.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321, upload-time = "2020-11-01T10:59:58.02Z" }, +] + +[[package]] +name = "isort" +version = "6.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1e/82/fa43935523efdfcce6abbae9da7f372b627b27142c3419fcf13bf5b0c397/isort-6.1.0.tar.gz", hash = "sha256:9b8f96a14cfee0677e78e941ff62f03769a06d412aabb9e2a90487b3b7e8d481", size = 824325, upload-time = "2025-10-01T16:26:45.027Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/cc/9b681a170efab4868a032631dea1e8446d8ec718a7f657b94d49d1a12643/isort-6.1.0-py3-none-any.whl", hash = "sha256:58d8927ecce74e5087aef019f778d4081a3b6c98f15a80ba35782ca8a2097784", size = 94329, upload-time = "2025-10-01T16:26:43.291Z" }, +] + +[[package]] +name = "jedi" +version = "0.19.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "joblib" +version = "1.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/f2/d34e8b3a08a9cc79a50b2208a93dce981fe615b64d5a4d4abee421d898df/joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3", size = 331603, upload-time = "2025-12-15T08:41:46.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", size = 309071, upload-time = "2025-12-15T08:41:44.973Z" }, +] + +[[package]] +name = "json5" +version = "0.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/77/e8/a3f261a66e4663f22700bc8a17c08cb83e91fbf086726e7a228398968981/json5-0.13.0.tar.gz", hash = "sha256:b1edf8d487721c0bf64d83c28e91280781f6e21f4a797d3261c7c828d4c165bf", size = 52441, upload-time = "2026-01-01T19:42:14.99Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/9e/038522f50ceb7e74f1f991bf1b699f24b0c2bbe7c390dd36ad69f4582258/json5-0.13.0-py3-none-any.whl", hash = "sha256:9a08e1dd65f6a4d4c6fa82d216cf2477349ec2346a38fd70cc11d2557499fbcc", size = 36163, upload-time = "2026-01-01T19:42:13.962Z" }, +] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114, upload-time = "2024-06-10T19:24:42.462Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595, upload-time = "2024-06-10T19:24:40.698Z" }, +] + +[[package]] +name = "jsonschema" +version = "4.26.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, +] + +[package.optional-dependencies] +format-nongpl = [ + { name = "fqdn" }, + { name = "idna" }, + { name = "isoduration" }, + { name = "jsonpointer" }, + { name = "rfc3339-validator" }, + { name = "rfc3986-validator" }, + { name = "rfc3987-syntax" }, + { name = "uri-template" }, + { name = "webcolors" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, +] + +[[package]] +name = "jupyter-client" +version = "8.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/05/e4/ba649102a3bc3fbca54e7239fb924fd434c766f855693d86de0b1f2bec81/jupyter_client-8.8.0.tar.gz", hash = "sha256:d556811419a4f2d96c869af34e854e3f059b7cc2d6d01a9cd9c85c267691be3e", size = 348020, upload-time = "2026-01-08T13:55:47.938Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl", hash = "sha256:f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a", size = 107371, upload-time = "2026-01-08T13:55:45.562Z" }, +] + +[[package]] +name = "jupyter-core" +version = "5.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/49/9d1284d0dc65e2c757b74c6687b6d319b02f822ad039e5c512df9194d9dd/jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508", size = 89814, upload-time = "2025-10-16T19:19:18.444Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407", size = 29032, upload-time = "2025-10-16T19:19:16.783Z" }, +] + +[[package]] +name = "jupyter-events" +version = "0.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema", extra = ["format-nongpl"] }, + { name = "packaging" }, + { name = "python-json-logger" }, + { name = "pyyaml" }, + { name = "referencing" }, + { name = "rfc3339-validator" }, + { name = "rfc3986-validator" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/c3/306d090461e4cf3cd91eceaff84bede12a8e52cd821c2d20c9a4fd728385/jupyter_events-0.12.0.tar.gz", hash = "sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b", size = 62196, upload-time = "2025-02-03T17:23:41.485Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl", hash = "sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb", size = 19430, upload-time = "2025-02-03T17:23:38.643Z" }, +] + +[[package]] +name = "jupyter-lsp" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/5a/9066c9f8e94ee517133cd98dba393459a16cd48bba71a82f16a65415206c/jupyter_lsp-2.3.0.tar.gz", hash = "sha256:458aa59339dc868fb784d73364f17dbce8836e906cd75fd471a325cba02e0245", size = 54823, upload-time = "2025-08-27T17:47:34.671Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl", hash = "sha256:e914a3cb2addf48b1c7710914771aaf1819d46b2e5a79b0f917b5478ec93f34f", size = 76687, upload-time = "2025-08-27T17:47:33.15Z" }, +] + +[[package]] +name = "jupyter-server" +version = "2.17.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "argon2-cffi" }, + { name = "jinja2" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "jupyter-events" }, + { name = "jupyter-server-terminals" }, + { name = "nbconvert" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "prometheus-client" }, + { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "pyzmq" }, + { name = "send2trash" }, + { name = "terminado" }, + { name = "tornado" }, + { name = "traitlets" }, + { name = "websocket-client" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/ac/e040ec363d7b6b1f11304cc9f209dac4517ece5d5e01821366b924a64a50/jupyter_server-2.17.0.tar.gz", hash = "sha256:c38ea898566964c888b4772ae1ed58eca84592e88251d2cfc4d171f81f7e99d5", size = 731949, upload-time = "2025-08-21T14:42:54.042Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl", hash = "sha256:e8cb9c7db4251f51ed307e329b81b72ccf2056ff82d50524debde1ee1870e13f", size = 388221, upload-time = "2025-08-21T14:42:52.034Z" }, +] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "terminado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/d5/562469734f476159e99a55426d697cbf8e7eb5efe89fb0e0b4f83a3d3459/jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269", size = 31430, upload-time = "2024-03-12T14:37:03.049Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa", size = 13656, upload-time = "2024-03-12T14:37:00.708Z" }, +] + +[[package]] +name = "jupyterlab" +version = "4.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "async-lru" }, + { name = "httpx" }, + { name = "ipykernel" }, + { name = "jinja2" }, + { name = "jupyter-core" }, + { name = "jupyter-lsp" }, + { name = "jupyter-server" }, + { name = "jupyterlab-server" }, + { name = "notebook-shim" }, + { name = "packaging" }, + { name = "setuptools" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/21/413d142686a4e8f4268d985becbdb4daf060524726248e73be4773786987/jupyterlab-4.5.1.tar.gz", hash = "sha256:09da1ddfbd9eec18b5101dbb8515612aa1e47443321fb99503725a88e93d20d9", size = 23992251, upload-time = "2025-12-15T16:58:59.361Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/c3/acced767eecc11a70c65c45295db5396c4f0c1937874937d5a76d7b177b6/jupyterlab-4.5.1-py3-none-any.whl", hash = "sha256:31b059de96de0754ff1f2ce6279774b6aab8c34d7082e9752db58207c99bd514", size = 12384821, upload-time = "2025-12-15T16:58:55.563Z" }, +] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900, upload-time = "2023-11-23T09:26:37.44Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884, upload-time = "2023-11-23T09:26:34.325Z" }, +] + +[[package]] +name = "jupyterlab-server" +version = "2.28.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "jinja2" }, + { name = "json5" }, + { name = "jsonschema" }, + { name = "jupyter-server" }, + { name = "packaging" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/2c/90153f189e421e93c4bb4f9e3f59802a1f01abd2ac5cf40b152d7f735232/jupyterlab_server-2.28.0.tar.gz", hash = "sha256:35baa81898b15f93573e2deca50d11ac0ae407ebb688299d3a5213265033712c", size = 76996, upload-time = "2025-10-22T13:59:18.37Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl", hash = "sha256:e4355b148fdcf34d312bbbc80f22467d6d20460e8b8736bf235577dd18506968", size = 59830, upload-time = "2025-10-22T13:59:16.767Z" }, +] + +[[package]] +name = "kiwisolver" +version = "1.4.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/3c/85844f1b0feb11ee581ac23fe5fce65cd049a200c1446708cc1b7f922875/kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", size = 97564, upload-time = "2025-08-10T21:27:49.279Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/32/6cc0fbc9c54d06c2969faa9c1d29f5751a2e51809dd55c69055e62d9b426/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386", size = 123806, upload-time = "2025-08-10T21:27:01.537Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/2bfb1d4a4823d92e8cbb420fe024b8d2167f72079b3bb941207c42570bdf/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552", size = 66605, upload-time = "2025-08-10T21:27:03.335Z" }, + { url = "https://files.pythonhosted.org/packages/f7/69/00aafdb4e4509c2ca6064646cba9cd4b37933898f426756adb2cb92ebbed/kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3", size = 64925, upload-time = "2025-08-10T21:27:04.339Z" }, + { url = "https://files.pythonhosted.org/packages/43/dc/51acc6791aa14e5cb6d8a2e28cefb0dc2886d8862795449d021334c0df20/kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58", size = 1472414, upload-time = "2025-08-10T21:27:05.437Z" }, + { url = "https://files.pythonhosted.org/packages/3d/bb/93fa64a81db304ac8a246f834d5094fae4b13baf53c839d6bb6e81177129/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4", size = 1281272, upload-time = "2025-08-10T21:27:07.063Z" }, + { url = "https://files.pythonhosted.org/packages/70/e6/6df102916960fb8d05069d4bd92d6d9a8202d5a3e2444494e7cd50f65b7a/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df", size = 1298578, upload-time = "2025-08-10T21:27:08.452Z" }, + { url = "https://files.pythonhosted.org/packages/7c/47/e142aaa612f5343736b087864dbaebc53ea8831453fb47e7521fa8658f30/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6", size = 1345607, upload-time = "2025-08-10T21:27:10.125Z" }, + { url = "https://files.pythonhosted.org/packages/54/89/d641a746194a0f4d1a3670fb900d0dbaa786fb98341056814bc3f058fa52/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5", size = 2230150, upload-time = "2025-08-10T21:27:11.484Z" }, + { url = "https://files.pythonhosted.org/packages/aa/6b/5ee1207198febdf16ac11f78c5ae40861b809cbe0e6d2a8d5b0b3044b199/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf", size = 2325979, upload-time = "2025-08-10T21:27:12.917Z" }, + { url = "https://files.pythonhosted.org/packages/fc/ff/b269eefd90f4ae14dcc74973d5a0f6d28d3b9bb1afd8c0340513afe6b39a/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5", size = 2491456, upload-time = "2025-08-10T21:27:14.353Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d4/10303190bd4d30de547534601e259a4fbf014eed94aae3e5521129215086/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce", size = 2294621, upload-time = "2025-08-10T21:27:15.808Z" }, + { url = "https://files.pythonhosted.org/packages/28/e0/a9a90416fce5c0be25742729c2ea52105d62eda6c4be4d803c2a7be1fa50/kiwisolver-1.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7", size = 75417, upload-time = "2025-08-10T21:27:17.436Z" }, + { url = "https://files.pythonhosted.org/packages/1f/10/6949958215b7a9a264299a7db195564e87900f709db9245e4ebdd3c70779/kiwisolver-1.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c", size = 66582, upload-time = "2025-08-10T21:27:18.436Z" }, + { url = "https://files.pythonhosted.org/packages/ec/79/60e53067903d3bc5469b369fe0dfc6b3482e2133e85dae9daa9527535991/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548", size = 126514, upload-time = "2025-08-10T21:27:19.465Z" }, + { url = "https://files.pythonhosted.org/packages/25/d1/4843d3e8d46b072c12a38c97c57fab4608d36e13fe47d47ee96b4d61ba6f/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d", size = 67905, upload-time = "2025-08-10T21:27:20.51Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ae/29ffcbd239aea8b93108de1278271ae764dfc0d803a5693914975f200596/kiwisolver-1.4.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c", size = 66399, upload-time = "2025-08-10T21:27:21.496Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ae/d7ba902aa604152c2ceba5d352d7b62106bedbccc8e95c3934d94472bfa3/kiwisolver-1.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122", size = 1582197, upload-time = "2025-08-10T21:27:22.604Z" }, + { url = "https://files.pythonhosted.org/packages/f2/41/27c70d427eddb8bc7e4f16420a20fefc6f480312122a59a959fdfe0445ad/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64", size = 1390125, upload-time = "2025-08-10T21:27:24.036Z" }, + { url = "https://files.pythonhosted.org/packages/41/42/b3799a12bafc76d962ad69083f8b43b12bf4fe78b097b12e105d75c9b8f1/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134", size = 1402612, upload-time = "2025-08-10T21:27:25.773Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b5/a210ea073ea1cfaca1bb5c55a62307d8252f531beb364e18aa1e0888b5a0/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370", size = 1453990, upload-time = "2025-08-10T21:27:27.089Z" }, + { url = "https://files.pythonhosted.org/packages/5f/ce/a829eb8c033e977d7ea03ed32fb3c1781b4fa0433fbadfff29e39c676f32/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21", size = 2331601, upload-time = "2025-08-10T21:27:29.343Z" }, + { url = "https://files.pythonhosted.org/packages/e0/4b/b5e97eb142eb9cd0072dacfcdcd31b1c66dc7352b0f7c7255d339c0edf00/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a", size = 2422041, upload-time = "2025-08-10T21:27:30.754Z" }, + { url = "https://files.pythonhosted.org/packages/40/be/8eb4cd53e1b85ba4edc3a9321666f12b83113a178845593307a3e7891f44/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f", size = 2594897, upload-time = "2025-08-10T21:27:32.803Z" }, + { url = "https://files.pythonhosted.org/packages/99/dd/841e9a66c4715477ea0abc78da039832fbb09dac5c35c58dc4c41a407b8a/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369", size = 2391835, upload-time = "2025-08-10T21:27:34.23Z" }, + { url = "https://files.pythonhosted.org/packages/0c/28/4b2e5c47a0da96896fdfdb006340ade064afa1e63675d01ea5ac222b6d52/kiwisolver-1.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891", size = 79988, upload-time = "2025-08-10T21:27:35.587Z" }, + { url = "https://files.pythonhosted.org/packages/80/be/3578e8afd18c88cdf9cb4cffde75a96d2be38c5a903f1ed0ceec061bd09e/kiwisolver-1.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32", size = 70260, upload-time = "2025-08-10T21:27:36.606Z" }, +] + +[[package]] +name = "lark" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/34/28fff3ab31ccff1fd4f6c7c7b0ceb2b6968d8ea4950663eadcb5720591a0/lark-1.3.1.tar.gz", hash = "sha256:b426a7a6d6d53189d318f2b6236ab5d6429eaf09259f1ca33eb716eed10d2905", size = 382732, upload-time = "2025-10-27T18:25:56.653Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl", hash = "sha256:c629b661023a014c37da873b4ff58a817398d12635d3bbb2c5a03be7fe5d1e12", size = 113151, upload-time = "2025-10-27T18:25:54.882Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.10.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/76/d3c6e3a13fe484ebe7718d14e269c9569c4eb0020a968a327acb3b9a8fe6/matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3", size = 34806269, upload-time = "2025-12-10T22:56:51.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/43/9c0ff7a2f11615e516c3b058e1e6e8f9614ddeca53faca06da267c48345d/matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f", size = 8262481, upload-time = "2025-12-10T22:56:10.885Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ca/e8ae28649fcdf039fda5ef554b40a95f50592a3c47e6f7270c9561c12b07/matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b", size = 8151473, upload-time = "2025-12-10T22:56:12.377Z" }, + { url = "https://files.pythonhosted.org/packages/f1/6f/009d129ae70b75e88cbe7e503a12a4c0670e08ed748a902c2568909e9eb5/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cf267add95b1c88300d96ca837833d4112756045364f5c734a2276038dae27d", size = 9553896, upload-time = "2025-12-10T22:56:14.432Z" }, + { url = "https://files.pythonhosted.org/packages/f5/26/4221a741eb97967bc1fd5e4c52b9aa5a91b2f4ec05b59f6def4d820f9df9/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008", size = 9824193, upload-time = "2025-12-10T22:56:16.29Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f3/3abf75f38605772cf48a9daf5821cd4f563472f38b4b828c6fba6fa6d06e/matplotlib-3.10.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:41703cc95688f2516b480f7f339d8851a6035f18e100ee6a32bc0b8536a12a9c", size = 9615444, upload-time = "2025-12-10T22:56:18.155Z" }, + { url = "https://files.pythonhosted.org/packages/93/a5/de89ac80f10b8dc615807ee1133cd99ac74082581196d4d9590bea10690d/matplotlib-3.10.8-cp314-cp314-win_amd64.whl", hash = "sha256:83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11", size = 8272719, upload-time = "2025-12-10T22:56:20.366Z" }, + { url = "https://files.pythonhosted.org/packages/69/ce/b006495c19ccc0a137b48083168a37bd056392dee02f87dba0472f2797fe/matplotlib-3.10.8-cp314-cp314-win_arm64.whl", hash = "sha256:2c1998e92cd5999e295a731bcb2911c75f597d937341f3030cc24ef2733d78a8", size = 8144205, upload-time = "2025-12-10T22:56:22.239Z" }, + { url = "https://files.pythonhosted.org/packages/68/d9/b31116a3a855bd313c6fcdb7226926d59b041f26061c6c5b1be66a08c826/matplotlib-3.10.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b5a2b97dbdc7d4f353ebf343744f1d1f1cca8aa8bfddb4262fcf4306c3761d50", size = 8305785, upload-time = "2025-12-10T22:56:24.218Z" }, + { url = "https://files.pythonhosted.org/packages/1e/90/6effe8103f0272685767ba5f094f453784057072f49b393e3ea178fe70a5/matplotlib-3.10.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f5c3e4da343bba819f0234186b9004faba952cc420fbc522dc4e103c1985908", size = 8198361, upload-time = "2025-12-10T22:56:26.787Z" }, + { url = "https://files.pythonhosted.org/packages/d7/65/a73188711bea603615fc0baecca1061429ac16940e2385433cc778a9d8e7/matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f62550b9a30afde8c1c3ae450e5eb547d579dd69b25c2fc7a1c67f934c1717a", size = 9561357, upload-time = "2025-12-10T22:56:28.953Z" }, + { url = "https://files.pythonhosted.org/packages/f4/3d/b5c5d5d5be8ce63292567f0e2c43dde9953d3ed86ac2de0a72e93c8f07a1/matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:495672de149445ec1b772ff2c9ede9b769e3cb4f0d0aa7fa730d7f59e2d4e1c1", size = 9823610, upload-time = "2025-12-10T22:56:31.455Z" }, + { url = "https://files.pythonhosted.org/packages/4d/4b/e7beb6bbd49f6bae727a12b270a2654d13c397576d25bd6786e47033300f/matplotlib-3.10.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:595ba4d8fe983b88f0eec8c26a241e16d6376fe1979086232f481f8f3f67494c", size = 9614011, upload-time = "2025-12-10T22:56:33.85Z" }, + { url = "https://files.pythonhosted.org/packages/7c/e6/76f2813d31f032e65f6f797e3f2f6e4aab95b65015924b1c51370395c28a/matplotlib-3.10.8-cp314-cp314t-win_amd64.whl", hash = "sha256:25d380fe8b1dc32cf8f0b1b448470a77afb195438bafdf1d858bfb876f3edf7b", size = 8362801, upload-time = "2025-12-10T22:56:36.107Z" }, + { url = "https://files.pythonhosted.org/packages/5d/49/d651878698a0b67f23aa28e17f45a6d6dd3d3f933fa29087fa4ce5947b5a/matplotlib-3.10.8-cp314-cp314t-win_arm64.whl", hash = "sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f", size = 8192560, upload-time = "2025-12-10T22:56:38.008Z" }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/74/97e72a36efd4ae2bccb3463284300f8953f199b5ffbc04cbbb0ec78f74b1/matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe", size = 8110, upload-time = "2025-10-23T09:00:22.126Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", size = 9658, upload-time = "2022-01-24T01:14:51.113Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350, upload-time = "2022-01-24T01:14:49.62Z" }, +] + +[[package]] +name = "mistune" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/55/d01f0c4b45ade6536c51170b9043db8b2ec6ddf4a35c7ea3f5f559ac935b/mistune-3.2.0.tar.gz", hash = "sha256:708487c8a8cdd99c9d90eb3ed4c3ed961246ff78ac82f03418f5183ab70e398a", size = 95467, upload-time = "2025-12-23T11:36:34.994Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl", hash = "sha256:febdc629a3c78616b94393c6580551e0e34cc289987ec6c35ed3f4be42d0eee1", size = 53598, upload-time = "2025-12-23T11:36:33.211Z" }, +] + +[[package]] +name = "mock" +version = "5.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/07/8c/14c2ae915e5f9dca5a22edd68b35be94400719ccfa068a03e0fb63d0f6f6/mock-5.2.0.tar.gz", hash = "sha256:4e460e818629b4b173f32d08bf30d3af8123afbb8e04bb5707a1fd4799e503f0", size = 92796, upload-time = "2025-03-03T12:31:42.911Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/d9/617e6af809bf3a1d468e0d58c3997b1dc219a9a9202e650d30c2fc85d481/mock-5.2.0-py3-none-any.whl", hash = "sha256:7ba87f72ca0e915175596069dbbcc7c75af7b5e9b9bc107ad6349ede0819982f", size = 31617, upload-time = "2025-03-03T12:31:41.518Z" }, +] + +[[package]] +name = "msgpack" +version = "1.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/f2/bfb55a6236ed8725a96b0aa3acbd0ec17588e6a2c3b62a93eb513ed8783f/msgpack-1.1.2.tar.gz", hash = "sha256:3b60763c1373dd60f398488069bcdc703cd08a711477b5d480eecc9f9626f47e", size = 173581, upload-time = "2025-10-08T09:15:56.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/71/201105712d0a2ff07b7873ed3c220292fb2ea5120603c00c4b634bcdafb3/msgpack-1.1.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e23ce8d5f7aa6ea6d2a2b326b4ba46c985dbb204523759984430db7114f8aa00", size = 81127, upload-time = "2025-10-08T09:15:24.408Z" }, + { url = "https://files.pythonhosted.org/packages/1b/9f/38ff9e57a2eade7bf9dfee5eae17f39fc0e998658050279cbb14d97d36d9/msgpack-1.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6c15b7d74c939ebe620dd8e559384be806204d73b4f9356320632d783d1f7939", size = 84981, upload-time = "2025-10-08T09:15:25.812Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a9/3536e385167b88c2cc8f4424c49e28d49a6fc35206d4a8060f136e71f94c/msgpack-1.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99e2cb7b9031568a2a5c73aa077180f93dd2e95b4f8d3b8e14a73ae94a9e667e", size = 411885, upload-time = "2025-10-08T09:15:27.22Z" }, + { url = "https://files.pythonhosted.org/packages/2f/40/dc34d1a8d5f1e51fc64640b62b191684da52ca469da9cd74e84936ffa4a6/msgpack-1.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:180759d89a057eab503cf62eeec0aa61c4ea1200dee709f3a8e9397dbb3b6931", size = 419658, upload-time = "2025-10-08T09:15:28.4Z" }, + { url = "https://files.pythonhosted.org/packages/3b/ef/2b92e286366500a09a67e03496ee8b8ba00562797a52f3c117aa2b29514b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:04fb995247a6e83830b62f0b07bf36540c213f6eac8e851166d8d86d83cbd014", size = 403290, upload-time = "2025-10-08T09:15:29.764Z" }, + { url = "https://files.pythonhosted.org/packages/78/90/e0ea7990abea5764e4655b8177aa7c63cdfa89945b6e7641055800f6c16b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8e22ab046fa7ede9e36eeb4cfad44d46450f37bb05d5ec482b02868f451c95e2", size = 415234, upload-time = "2025-10-08T09:15:31.022Z" }, + { url = "https://files.pythonhosted.org/packages/72/4e/9390aed5db983a2310818cd7d3ec0aecad45e1f7007e0cda79c79507bb0d/msgpack-1.1.2-cp314-cp314-win32.whl", hash = "sha256:80a0ff7d4abf5fecb995fcf235d4064b9a9a8a40a3ab80999e6ac1e30b702717", size = 66391, upload-time = "2025-10-08T09:15:32.265Z" }, + { url = "https://files.pythonhosted.org/packages/6e/f1/abd09c2ae91228c5f3998dbd7f41353def9eac64253de3c8105efa2082f7/msgpack-1.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:9ade919fac6a3e7260b7f64cea89df6bec59104987cbea34d34a2fa15d74310b", size = 73787, upload-time = "2025-10-08T09:15:33.219Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b0/9d9f667ab48b16ad4115c1935d94023b82b3198064cb84a123e97f7466c1/msgpack-1.1.2-cp314-cp314-win_arm64.whl", hash = "sha256:59415c6076b1e30e563eb732e23b994a61c159cec44deaf584e5cc1dd662f2af", size = 66453, upload-time = "2025-10-08T09:15:34.225Z" }, + { url = "https://files.pythonhosted.org/packages/16/67/93f80545eb1792b61a217fa7f06d5e5cb9e0055bed867f43e2b8e012e137/msgpack-1.1.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:897c478140877e5307760b0ea66e0932738879e7aa68144d9b78ea4c8302a84a", size = 85264, upload-time = "2025-10-08T09:15:35.61Z" }, + { url = "https://files.pythonhosted.org/packages/87/1c/33c8a24959cf193966ef11a6f6a2995a65eb066bd681fd085afd519a57ce/msgpack-1.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a668204fa43e6d02f89dbe79a30b0d67238d9ec4c5bd8a940fc3a004a47b721b", size = 89076, upload-time = "2025-10-08T09:15:36.619Z" }, + { url = "https://files.pythonhosted.org/packages/fc/6b/62e85ff7193663fbea5c0254ef32f0c77134b4059f8da89b958beb7696f3/msgpack-1.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5559d03930d3aa0f3aacb4c42c776af1a2ace2611871c84a75afe436695e6245", size = 435242, upload-time = "2025-10-08T09:15:37.647Z" }, + { url = "https://files.pythonhosted.org/packages/c1/47/5c74ecb4cc277cf09f64e913947871682ffa82b3b93c8dad68083112f412/msgpack-1.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70c5a7a9fea7f036b716191c29047374c10721c389c21e9ffafad04df8c52c90", size = 432509, upload-time = "2025-10-08T09:15:38.794Z" }, + { url = "https://files.pythonhosted.org/packages/24/a4/e98ccdb56dc4e98c929a3f150de1799831c0a800583cde9fa022fa90602d/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f2cb069d8b981abc72b41aea1c580ce92d57c673ec61af4c500153a626cb9e20", size = 415957, upload-time = "2025-10-08T09:15:40.238Z" }, + { url = "https://files.pythonhosted.org/packages/da/28/6951f7fb67bc0a4e184a6b38ab71a92d9ba58080b27a77d3e2fb0be5998f/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d62ce1f483f355f61adb5433ebfd8868c5f078d1a52d042b0a998682b4fa8c27", size = 422910, upload-time = "2025-10-08T09:15:41.505Z" }, + { url = "https://files.pythonhosted.org/packages/f0/03/42106dcded51f0a0b5284d3ce30a671e7bd3f7318d122b2ead66ad289fed/msgpack-1.1.2-cp314-cp314t-win32.whl", hash = "sha256:1d1418482b1ee984625d88aa9585db570180c286d942da463533b238b98b812b", size = 75197, upload-time = "2025-10-08T09:15:42.954Z" }, + { url = "https://files.pythonhosted.org/packages/15/86/d0071e94987f8db59d4eeb386ddc64d0bb9b10820a8d82bcd3e53eeb2da6/msgpack-1.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:5a46bf7e831d09470ad92dff02b8b1ac92175ca36b087f904a0519857c6be3ff", size = 85772, upload-time = "2025-10-08T09:15:43.954Z" }, + { url = "https://files.pythonhosted.org/packages/81/f2/08ace4142eb281c12701fc3b93a10795e4d4dc7f753911d836675050f886/msgpack-1.1.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d99ef64f349d5ec3293688e91486c5fdb925ed03807f64d98d205d2713c60b46", size = 70868, upload-time = "2025-10-08T09:15:44.959Z" }, +] + +[[package]] +name = "murmurhash" +version = "1.0.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/23/2e/88c147931ea9725d634840d538622e94122bceaf346233349b7b5c62964b/murmurhash-1.0.15.tar.gz", hash = "sha256:58e2b27b7847f9e2a6edf10b47a8c8dd70a4705f45dccb7bf76aeadacf56ba01", size = 13291, upload-time = "2025-11-14T09:51:15.272Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/69/726df275edf07688146966e15eaaa23168100b933a2e1a29b37eb56c6db8/murmurhash-1.0.15-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:7c4280136b738e85ff76b4bdc4341d0b867ee753e73fd8b6994288080c040d0b", size = 28029, upload-time = "2025-11-14T09:50:44.124Z" }, + { url = "https://files.pythonhosted.org/packages/59/8f/24ecf9061bc2b20933df8aba47c73e904274ea8811c8300cab92f6f82372/murmurhash-1.0.15-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d4d681f474830489e2ec1d912095cfff027fbaf2baa5414c7e9d25b89f0fab68", size = 27912, upload-time = "2025-11-14T09:50:45.266Z" }, + { url = "https://files.pythonhosted.org/packages/ba/26/fff3caba25aa3c0622114e03c69fb66c839b22335b04d7cce91a3a126d44/murmurhash-1.0.15-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d7e47c5746785db6a43b65fac47b9e63dd71dfbd89a8c92693425b9715e68c6e", size = 131847, upload-time = "2025-11-14T09:50:46.819Z" }, + { url = "https://files.pythonhosted.org/packages/df/e4/0f2b9fc533467a27afb4e906c33f32d5f637477de87dd94690e0c44335a6/murmurhash-1.0.15-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e8e674f02a99828c8a671ba99cd03299381b2f0744e6f25c29cadfc6151dc724", size = 132267, upload-time = "2025-11-14T09:50:48.298Z" }, + { url = "https://files.pythonhosted.org/packages/da/bf/9d1c107989728ec46e25773d503aa54070b32822a18cfa7f9d5f41bc17a5/murmurhash-1.0.15-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:26fd7c7855ac4850ad8737991d7b0e3e501df93ebaf0cf45aa5954303085fdba", size = 131894, upload-time = "2025-11-14T09:50:49.485Z" }, + { url = "https://files.pythonhosted.org/packages/0d/81/dcf27c71445c0e993b10e33169a098ca60ee702c5c58fcbde205fa6332a6/murmurhash-1.0.15-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cb8ebafae60d5f892acff533cc599a359954d8c016a829514cb3f6e9ee10f322", size = 132054, upload-time = "2025-11-14T09:50:50.747Z" }, + { url = "https://files.pythonhosted.org/packages/bc/32/e874a14b2d2246bd2d16f80f49fad393a3865d4ee7d66d2cae939a67a29a/murmurhash-1.0.15-cp314-cp314-win_amd64.whl", hash = "sha256:898a629bf111f1aeba4437e533b5b836c0a9d2dd12d6880a9c75f6ca13e30e22", size = 26579, upload-time = "2025-11-14T09:50:52.278Z" }, + { url = "https://files.pythonhosted.org/packages/af/8e/4fca051ed8ae4d23a15aaf0a82b18cb368e8cf84f1e3b474d5749ec46069/murmurhash-1.0.15-cp314-cp314-win_arm64.whl", hash = "sha256:88dc1dd53b7b37c0df1b8b6bce190c12763014492f0269ff7620dc6027f470f4", size = 24341, upload-time = "2025-11-14T09:50:53.295Z" }, + { url = "https://files.pythonhosted.org/packages/38/9c/c72c2a4edd86aac829337ab9f83cf04cdb15e5d503e4c9a3a243f30a261c/murmurhash-1.0.15-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:6cb4e962ec4f928b30c271b2d84e6707eff6d942552765b663743cfa618b294b", size = 30146, upload-time = "2025-11-14T09:50:54.705Z" }, + { url = "https://files.pythonhosted.org/packages/ac/d7/72b47ebc86436cd0aa1fd4c6e8779521ec389397ac11389990278d0f7a47/murmurhash-1.0.15-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5678a3ea4fbf0cbaaca2bed9b445f556f294d5f799c67185d05ffcb221a77faf", size = 30141, upload-time = "2025-11-14T09:50:55.829Z" }, + { url = "https://files.pythonhosted.org/packages/64/bb/6d2f09135079c34dc2d26e961c52742d558b320c61503f273eab6ba743d9/murmurhash-1.0.15-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ef19f38c6b858eef83caf710773db98c8f7eb2193b4c324650c74f3d8ba299e0", size = 163898, upload-time = "2025-11-14T09:50:56.946Z" }, + { url = "https://files.pythonhosted.org/packages/b9/e2/9c1b462e33f9cb2d632056f07c90b502fc20bd7da50a15d0557343bd2fed/murmurhash-1.0.15-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22aa3ceaedd2e57078b491ed08852d512b84ff4ff9bb2ff3f9bf0eec7f214c9e", size = 168040, upload-time = "2025-11-14T09:50:58.234Z" }, + { url = "https://files.pythonhosted.org/packages/e8/73/8694db1408fcdfa73589f7df6c445437ea146986fa1e393ec60d26d6e30c/murmurhash-1.0.15-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bba0e0262c0d08682b028cb963ac477bd9839029486fa1333fc5c01fb6072749", size = 164239, upload-time = "2025-11-14T09:50:59.95Z" }, + { url = "https://files.pythonhosted.org/packages/2d/f9/8e360bdfc3c44e267e7e046f0e0b9922766da92da26959a6963f597e6bb5/murmurhash-1.0.15-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4fd8189ee293a09f30f4931408f40c28ccd42d9de4f66595f8814879339378bc", size = 161811, upload-time = "2025-11-14T09:51:01.289Z" }, + { url = "https://files.pythonhosted.org/packages/f9/31/97649680595b1096803d877ababb9a67c07f4378f177ec885eea28b9db6d/murmurhash-1.0.15-cp314-cp314t-win_amd64.whl", hash = "sha256:66395b1388f7daa5103db92debe06842ae3be4c0749ef6db68b444518666cdcc", size = 29817, upload-time = "2025-11-14T09:51:02.493Z" }, + { url = "https://files.pythonhosted.org/packages/76/66/4fce8755f25d77324401886c00017c556be7ca3039575b94037aff905385/murmurhash-1.0.15-cp314-cp314t-win_arm64.whl", hash = "sha256:c22e56c6a0b70598a66e456de5272f76088bc623688da84ef403148a6d41851d", size = 26219, upload-time = "2025-11-14T09:51:03.563Z" }, +] + +[[package]] +name = "nbclient" +version = "0.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "nbformat" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/56/91/1c1d5a4b9a9ebba2b4e32b8c852c2975c872aec1fe42ab5e516b2cecd193/nbclient-0.10.4.tar.gz", hash = "sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9", size = 62554, upload-time = "2025-12-23T07:45:46.369Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl", hash = "sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440", size = 25465, upload-time = "2025-12-23T07:45:44.51Z" }, +] + +[[package]] +name = "nbconvert" +version = "7.16.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "bleach", extra = ["css"] }, + { name = "defusedxml" }, + { name = "jinja2" }, + { name = "jupyter-core" }, + { name = "jupyterlab-pygments" }, + { name = "markupsafe" }, + { name = "mistune" }, + { name = "nbclient" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "pandocfilters" }, + { name = "pygments" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/59/f28e15fc47ffb73af68a8d9b47367a8630d76e97ae85ad18271b9db96fdf/nbconvert-7.16.6.tar.gz", hash = "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582", size = 857715, upload-time = "2025-01-28T09:29:14.724Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl", hash = "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b", size = 258525, upload-time = "2025-01-28T09:29:12.551Z" }, +] + +[[package]] +name = "nbformat" +version = "5.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fastjsonschema" }, + { name = "jsonschema" }, + { name = "jupyter-core" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload-time = "2024-04-04T11:20:37.371Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload-time = "2024-04-04T11:20:34.895Z" }, +] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, +] + +[[package]] +name = "nltk" +version = "3.9.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "joblib" }, + { name = "regex" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f9/76/3a5e4312c19a028770f86fd7c058cf9f4ec4321c6cf7526bab998a5b683c/nltk-3.9.2.tar.gz", hash = "sha256:0f409e9b069ca4177c1903c3e843eef90c7e92992fa4931ae607da6de49e1419", size = 2887629, upload-time = "2025-10-01T07:19:23.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/90/81ac364ef94209c100e12579629dc92bf7a709a84af32f8c551b02c07e94/nltk-3.9.2-py3-none-any.whl", hash = "sha256:1e209d2b3009110635ed9709a67a1a3e33a10f799490fa71cf4bec218c11c88a", size = 1513404, upload-time = "2025-10-01T07:19:21.648Z" }, +] + +[[package]] +name = "nodeenv" +version = "1.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb", size = 55611, upload-time = "2025-12-20T14:08:54.006Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" }, +] + +[[package]] +name = "nose" +version = "1.3.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/a5/0dc93c3ec33f4e281849523a5a913fa1eea9a3068acfa754d44d88107a44/nose-1.3.7.tar.gz", hash = "sha256:f1bffef9cbc82628f6e7d7b40d7e255aefaa1adb6a1b1d26c69a8b79e6208a98", size = 280488, upload-time = "2015-06-02T09:12:32.961Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/d8/dd071918c040f50fa1cf80da16423af51ff8ce4a0f2399b7bf8de45ac3d9/nose-1.3.7-py3-none-any.whl", hash = "sha256:9ff7c6cc443f8c51994b34a667bbcf45afd6d945be7477b52e97516fd17c53ac", size = 154731, upload-time = "2015-06-02T09:12:40.57Z" }, +] + +[[package]] +name = "notebook-shim" +version = "0.2.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/54/d2/92fa3243712b9a3e8bafaf60aac366da1cada3639ca767ff4b5b3654ec28/notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb", size = 13167, upload-time = "2024-02-14T23:35:18.353Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", size = 13307, upload-time = "2024-02-14T23:35:16.286Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/62/ae72ff66c0f1fd959925b4c11f8c2dea61f47f6acaea75a08512cdfe3fed/numpy-2.4.1.tar.gz", hash = "sha256:a1ceafc5042451a858231588a104093474c6a5c57dcc724841f5c888d237d690", size = 20721320, upload-time = "2026-01-10T06:44:59.619Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/a7/ef08d25698e0e4b4efbad8d55251d20fe2a15f6d9aa7c9b30cd03c165e6f/numpy-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3869ea1ee1a1edc16c29bbe3a2f2a4e515cc3a44d43903ad41e0cacdbaf733dc", size = 16652046, upload-time = "2026-01-10T06:43:54.797Z" }, + { url = "https://files.pythonhosted.org/packages/8f/39/e378b3e3ca13477e5ac70293ec027c438d1927f18637e396fe90b1addd72/numpy-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e867df947d427cdd7a60e3e271729090b0f0df80f5f10ab7dd436f40811699c3", size = 12378858, upload-time = "2026-01-10T06:43:57.099Z" }, + { url = "https://files.pythonhosted.org/packages/c3/74/7ec6154f0006910ed1fdbb7591cf4432307033102b8a22041599935f8969/numpy-2.4.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:e3bd2cb07841166420d2fa7146c96ce00cb3410664cbc1a6be028e456c4ee220", size = 5207417, upload-time = "2026-01-10T06:43:59.037Z" }, + { url = "https://files.pythonhosted.org/packages/f7/b7/053ac11820d84e42f8feea5cb81cc4fcd1091499b45b1ed8c7415b1bf831/numpy-2.4.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:f0a90aba7d521e6954670550e561a4cb925713bd944445dbe9e729b71f6cabee", size = 6542643, upload-time = "2026-01-10T06:44:01.852Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c4/2e7908915c0e32ca636b92e4e4a3bdec4cb1e7eb0f8aedf1ed3c68a0d8cd/numpy-2.4.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d558123217a83b2d1ba316b986e9248a1ed1971ad495963d555ccd75dcb1556", size = 14418963, upload-time = "2026-01-10T06:44:04.047Z" }, + { url = "https://files.pythonhosted.org/packages/eb/c0/3ed5083d94e7ffd7c404e54619c088e11f2e1939a9544f5397f4adb1b8ba/numpy-2.4.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f44de05659b67d20499cbc96d49f2650769afcb398b79b324bb6e297bfe3844", size = 16363811, upload-time = "2026-01-10T06:44:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/0e/68/42b66f1852bf525050a67315a4fb94586ab7e9eaa541b1bef530fab0c5dd/numpy-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:69e7419c9012c4aaf695109564e3387f1259f001b4326dfa55907b098af082d3", size = 16197643, upload-time = "2026-01-10T06:44:08.33Z" }, + { url = "https://files.pythonhosted.org/packages/d2/40/e8714fc933d85f82c6bfc7b998a0649ad9769a32f3494ba86598aaf18a48/numpy-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2ffd257026eb1b34352e749d7cc1678b5eeec3e329ad8c9965a797e08ccba205", size = 18289601, upload-time = "2026-01-10T06:44:10.841Z" }, + { url = "https://files.pythonhosted.org/packages/80/9a/0d44b468cad50315127e884802351723daca7cf1c98d102929468c81d439/numpy-2.4.1-cp314-cp314-win32.whl", hash = "sha256:727c6c3275ddefa0dc078524a85e064c057b4f4e71ca5ca29a19163c607be745", size = 6005722, upload-time = "2026-01-10T06:44:13.332Z" }, + { url = "https://files.pythonhosted.org/packages/7e/bb/c6513edcce5a831810e2dddc0d3452ce84d208af92405a0c2e58fd8e7881/numpy-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:7d5d7999df434a038d75a748275cd6c0094b0ecdb0837342b332a82defc4dc4d", size = 12438590, upload-time = "2026-01-10T06:44:15.006Z" }, + { url = "https://files.pythonhosted.org/packages/e9/da/a598d5cb260780cf4d255102deba35c1d072dc028c4547832f45dd3323a8/numpy-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:ce9ce141a505053b3c7bce3216071f3bf5c182b8b28930f14cd24d43932cd2df", size = 10596180, upload-time = "2026-01-10T06:44:17.386Z" }, + { url = "https://files.pythonhosted.org/packages/de/bc/ea3f2c96fcb382311827231f911723aeff596364eb6e1b6d1d91128aa29b/numpy-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4e53170557d37ae404bf8d542ca5b7c629d6efa1117dac6a83e394142ea0a43f", size = 12498774, upload-time = "2026-01-10T06:44:19.467Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ab/ef9d939fe4a812648c7a712610b2ca6140b0853c5efea361301006c02ae5/numpy-2.4.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:a73044b752f5d34d4232f25f18160a1cc418ea4507f5f11e299d8ac36875f8a0", size = 5327274, upload-time = "2026-01-10T06:44:23.189Z" }, + { url = "https://files.pythonhosted.org/packages/bd/31/d381368e2a95c3b08b8cf7faac6004849e960f4a042d920337f71cef0cae/numpy-2.4.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:fb1461c99de4d040666ca0444057b06541e5642f800b71c56e6ea92d6a853a0c", size = 6648306, upload-time = "2026-01-10T06:44:25.012Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e5/0989b44ade47430be6323d05c23207636d67d7362a1796ccbccac6773dd2/numpy-2.4.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423797bdab2eeefbe608d7c1ec7b2b4fd3c58d51460f1ee26c7500a1d9c9ee93", size = 14464653, upload-time = "2026-01-10T06:44:26.706Z" }, + { url = "https://files.pythonhosted.org/packages/10/a7/cfbe475c35371cae1358e61f20c5f075badc18c4797ab4354140e1d283cf/numpy-2.4.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:52b5f61bdb323b566b528899cc7db2ba5d1015bda7ea811a8bcf3c89c331fa42", size = 16405144, upload-time = "2026-01-10T06:44:29.378Z" }, + { url = "https://files.pythonhosted.org/packages/f8/a3/0c63fe66b534888fa5177cc7cef061541064dbe2b4b60dcc60ffaf0d2157/numpy-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42d7dd5fa36d16d52a84f821eb96031836fd405ee6955dd732f2023724d0aa01", size = 16247425, upload-time = "2026-01-10T06:44:31.721Z" }, + { url = "https://files.pythonhosted.org/packages/6b/2b/55d980cfa2c93bd40ff4c290bf824d792bd41d2fe3487b07707559071760/numpy-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7b6b5e28bbd47b7532698e5db2fe1db693d84b58c254e4389d99a27bb9b8f6b", size = 18330053, upload-time = "2026-01-10T06:44:34.617Z" }, + { url = "https://files.pythonhosted.org/packages/23/12/8b5fc6b9c487a09a7957188e0943c9ff08432c65e34567cabc1623b03a51/numpy-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:5de60946f14ebe15e713a6f22850c2372fa72f4ff9a432ab44aa90edcadaa65a", size = 6152482, upload-time = "2026-01-10T06:44:36.798Z" }, + { url = "https://files.pythonhosted.org/packages/00/a5/9f8ca5856b8940492fc24fbe13c1bc34d65ddf4079097cf9e53164d094e1/numpy-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:8f085da926c0d491ffff3096f91078cc97ea67e7e6b65e490bc8dcda65663be2", size = 12627117, upload-time = "2026-01-10T06:44:38.828Z" }, + { url = "https://files.pythonhosted.org/packages/ad/0d/eca3d962f9eef265f01a8e0d20085c6dd1f443cbffc11b6dede81fd82356/numpy-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:6436cffb4f2bf26c974344439439c95e152c9a527013f26b3577be6c2ca64295", size = 10667121, upload-time = "2026-01-10T06:44:41.644Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "pandas" +version = "2.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635, upload-time = "2025-09-29T23:25:52.486Z" }, + { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079, upload-time = "2025-09-29T23:26:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" }, + { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" }, + { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" }, + { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071, upload-time = "2025-09-29T23:32:27.484Z" }, + { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504, upload-time = "2025-09-29T23:29:31.47Z" }, + { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702, upload-time = "2025-09-29T23:29:54.591Z" }, + { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" }, + { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, + { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, + { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, +] + +[[package]] +name = "pandocfilters" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454, upload-time = "2024-01-18T20:08:13.726Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663, upload-time = "2024-01-18T20:08:11.28Z" }, +] + +[[package]] +name = "parso" +version = "0.8.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/de/53e0bcf53d13e005bd8c92e7855142494f41171b34c2536b86187474184d/parso-0.8.5.tar.gz", hash = "sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a", size = 401205, upload-time = "2025-08-23T15:15:28.028Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl", hash = "sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887", size = 106668, upload-time = "2025-08-23T15:15:25.663Z" }, +] + +[[package]] +name = "pep8-naming" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "flake8-polyfill" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/af/1e182d83519eb3fca41befaa2b671f1dcb4c4280e830aa0908c038b1de67/pep8-naming-0.10.0.tar.gz", hash = "sha256:f3b4a5f9dd72b991bf7d8e2a341d2e1aa3a884a769b5aaac4f56825c1763bf3a", size = 15024, upload-time = "2020-03-20T21:24:25.903Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/69/6018efb8ae18bd5a05f5f447666060a44aa8fe017f439c50fe8c8bd990cf/pep8_naming-0.10.0-py2.py3-none-any.whl", hash = "sha256:5d9f1056cb9427ce344e98d1a7f5665710e2f20f748438e308995852cfa24164", size = 8092, upload-time = "2020-03-20T21:24:24.25Z" }, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, +] + +[[package]] +name = "pillow" +version = "12.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/02/d52c733a2452ef1ffcc123b68e6606d07276b0e358db70eabad7e40042b7/pillow-12.1.0.tar.gz", hash = "sha256:5c5ae0a06e9ea030ab786b0251b32c7e4ce10e58d983c0d5c56029455180b5b9", size = 46977283, upload-time = "2026-01-02T09:13:29.892Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/87/bdf971d8bbcf80a348cc3bacfcb239f5882100fe80534b0ce67a784181d8/pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:5cb7bc1966d031aec37ddb9dcf15c2da5b2e9f7cc3ca7c54473a20a927e1eb91", size = 4062533, upload-time = "2026-01-02T09:12:20.791Z" }, + { url = "https://files.pythonhosted.org/packages/ff/4f/5eb37a681c68d605eb7034c004875c81f86ec9ef51f5be4a63eadd58859a/pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:97e9993d5ed946aba26baf9c1e8cf18adbab584b99f452ee72f7ee8acb882796", size = 4138546, upload-time = "2026-01-02T09:12:23.664Z" }, + { url = "https://files.pythonhosted.org/packages/11/6d/19a95acb2edbace40dcd582d077b991646b7083c41b98da4ed7555b59733/pillow-12.1.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:414b9a78e14ffeb98128863314e62c3f24b8a86081066625700b7985b3f529bd", size = 3601163, upload-time = "2026-01-02T09:12:26.338Z" }, + { url = "https://files.pythonhosted.org/packages/fc/36/2b8138e51cb42e4cc39c3297713455548be855a50558c3ac2beebdc251dd/pillow-12.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e6bdb408f7c9dd2a5ff2b14a3b0bb6d4deb29fb9961e6eb3ae2031ae9a5cec13", size = 5266086, upload-time = "2026-01-02T09:12:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/53/4b/649056e4d22e1caa90816bf99cef0884aed607ed38075bd75f091a607a38/pillow-12.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3413c2ae377550f5487991d444428f1a8ae92784aac79caa8b1e3b89b175f77e", size = 4657344, upload-time = "2026-01-02T09:12:31.117Z" }, + { url = "https://files.pythonhosted.org/packages/6c/6b/c5742cea0f1ade0cd61485dc3d81f05261fc2276f537fbdc00802de56779/pillow-12.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e5dcbe95016e88437ecf33544ba5db21ef1b8dd6e1b434a2cb2a3d605299e643", size = 6232114, upload-time = "2026-01-02T09:12:32.936Z" }, + { url = "https://files.pythonhosted.org/packages/bf/8f/9f521268ce22d63991601aafd3d48d5ff7280a246a1ef62d626d67b44064/pillow-12.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d0a7735df32ccbcc98b98a1ac785cc4b19b580be1bdf0aeb5c03223220ea09d5", size = 8042708, upload-time = "2026-01-02T09:12:34.78Z" }, + { url = "https://files.pythonhosted.org/packages/1a/eb/257f38542893f021502a1bbe0c2e883c90b5cff26cc33b1584a841a06d30/pillow-12.1.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c27407a2d1b96774cbc4a7594129cc027339fd800cd081e44497722ea1179de", size = 6347762, upload-time = "2026-01-02T09:12:36.748Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5a/8ba375025701c09b309e8d5163c5a4ce0102fa86bbf8800eb0d7ac87bc51/pillow-12.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15c794d74303828eaa957ff8070846d0efe8c630901a1c753fdc63850e19ecd9", size = 7039265, upload-time = "2026-01-02T09:12:39.082Z" }, + { url = "https://files.pythonhosted.org/packages/cf/dc/cf5e4cdb3db533f539e88a7bbf9f190c64ab8a08a9bc7a4ccf55067872e4/pillow-12.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c990547452ee2800d8506c4150280757f88532f3de2a58e3022e9b179107862a", size = 6462341, upload-time = "2026-01-02T09:12:40.946Z" }, + { url = "https://files.pythonhosted.org/packages/d0/47/0291a25ac9550677e22eda48510cfc4fa4b2ef0396448b7fbdc0a6946309/pillow-12.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b63e13dd27da389ed9475b3d28510f0f954bca0041e8e551b2a4eb1eab56a39a", size = 7165395, upload-time = "2026-01-02T09:12:42.706Z" }, + { url = "https://files.pythonhosted.org/packages/4f/4c/e005a59393ec4d9416be06e6b45820403bb946a778e39ecec62f5b2b991e/pillow-12.1.0-cp314-cp314-win32.whl", hash = "sha256:1a949604f73eb07a8adab38c4fe50791f9919344398bdc8ac6b307f755fc7030", size = 6431413, upload-time = "2026-01-02T09:12:44.944Z" }, + { url = "https://files.pythonhosted.org/packages/1c/af/f23697f587ac5f9095d67e31b81c95c0249cd461a9798a061ed6709b09b5/pillow-12.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:4f9f6a650743f0ddee5593ac9e954ba1bdbc5e150bc066586d4f26127853ab94", size = 7176779, upload-time = "2026-01-02T09:12:46.727Z" }, + { url = "https://files.pythonhosted.org/packages/b3/36/6a51abf8599232f3e9afbd16d52829376a68909fe14efe29084445db4b73/pillow-12.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:808b99604f7873c800c4840f55ff389936ef1948e4e87645eaf3fccbc8477ac4", size = 2543105, upload-time = "2026-01-02T09:12:49.243Z" }, + { url = "https://files.pythonhosted.org/packages/82/54/2e1dd20c8749ff225080d6ba465a0cab4387f5db0d1c5fb1439e2d99923f/pillow-12.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc11908616c8a283cf7d664f77411a5ed2a02009b0097ff8abbba5e79128ccf2", size = 5268571, upload-time = "2026-01-02T09:12:51.11Z" }, + { url = "https://files.pythonhosted.org/packages/57/61/571163a5ef86ec0cf30d265ac2a70ae6fc9e28413d1dc94fa37fae6bda89/pillow-12.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:896866d2d436563fa2a43a9d72f417874f16b5545955c54a64941e87c1376c61", size = 4660426, upload-time = "2026-01-02T09:12:52.865Z" }, + { url = "https://files.pythonhosted.org/packages/5e/e1/53ee5163f794aef1bf84243f755ee6897a92c708505350dd1923f4afec48/pillow-12.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8e178e3e99d3c0ea8fc64b88447f7cac8ccf058af422a6cedc690d0eadd98c51", size = 6269908, upload-time = "2026-01-02T09:12:54.884Z" }, + { url = "https://files.pythonhosted.org/packages/bc/0b/b4b4106ff0ee1afa1dc599fde6ab230417f800279745124f6c50bcffed8e/pillow-12.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:079af2fb0c599c2ec144ba2c02766d1b55498e373b3ac64687e43849fbbef5bc", size = 8074733, upload-time = "2026-01-02T09:12:56.802Z" }, + { url = "https://files.pythonhosted.org/packages/19/9f/80b411cbac4a732439e629a26ad3ef11907a8c7fc5377b7602f04f6fe4e7/pillow-12.1.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdec5e43377761c5dbca620efb69a77f6855c5a379e32ac5b158f54c84212b14", size = 6381431, upload-time = "2026-01-02T09:12:58.823Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b7/d65c45db463b66ecb6abc17c6ba6917a911202a07662247e1355ce1789e7/pillow-12.1.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:565c986f4b45c020f5421a4cea13ef294dde9509a8577f29b2fc5edc7587fff8", size = 7068529, upload-time = "2026-01-02T09:13:00.885Z" }, + { url = "https://files.pythonhosted.org/packages/50/96/dfd4cd726b4a45ae6e3c669fc9e49deb2241312605d33aba50499e9d9bd1/pillow-12.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:43aca0a55ce1eefc0aefa6253661cb54571857b1a7b2964bd8a1e3ef4b729924", size = 6492981, upload-time = "2026-01-02T09:13:03.314Z" }, + { url = "https://files.pythonhosted.org/packages/4d/1c/b5dc52cf713ae46033359c5ca920444f18a6359ce1020dd3e9c553ea5bc6/pillow-12.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0deedf2ea233722476b3a81e8cdfbad786f7adbed5d848469fa59fe52396e4ef", size = 7191878, upload-time = "2026-01-02T09:13:05.276Z" }, + { url = "https://files.pythonhosted.org/packages/53/26/c4188248bd5edaf543864fe4834aebe9c9cb4968b6f573ce014cc42d0720/pillow-12.1.0-cp314-cp314t-win32.whl", hash = "sha256:b17fbdbe01c196e7e159aacb889e091f28e61020a8abeac07b68079b6e626988", size = 6438703, upload-time = "2026-01-02T09:13:07.491Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0e/69ed296de8ea05cb03ee139cee600f424ca166e632567b2d66727f08c7ed/pillow-12.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27b9baecb428899db6c0de572d6d305cfaf38ca1596b5c0542a5182e3e74e8c6", size = 7182927, upload-time = "2026-01-02T09:13:09.841Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f5/68334c015eed9b5cff77814258717dec591ded209ab5b6fb70e2ae873d1d/pillow-12.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f61333d817698bdcdd0f9d7793e365ac3d2a21c1f1eb02b32ad6aefb8d8ea831", size = 2545104, upload-time = "2026-01-02T09:13:12.068Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", size = 21715, upload-time = "2025-12-05T13:52:58.638Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" }, +] + +[[package]] +name = "pre-commit" +version = "4.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cfgv" }, + { name = "identify" }, + { name = "nodeenv" }, + { name = "pyyaml" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/40/f1/6d86a29246dfd2e9b6237f0b5823717f60cad94d47ddc26afa916d21f525/pre_commit-4.5.1.tar.gz", hash = "sha256:eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61", size = 198232, upload-time = "2025-12-16T21:14:33.552Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl", hash = "sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77", size = 226437, upload-time = "2025-12-16T21:14:32.409Z" }, +] + +[[package]] +name = "preshed" +version = "3.0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cymem" }, + { name = "murmurhash" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bf/34/eb4f5f0f678e152a96e826da867d2f41c4b18a2d589e40e1dd3347219e91/preshed-3.0.12.tar.gz", hash = "sha256:b73f9a8b54ee1d44529cc6018356896cff93d48f755f29c134734d9371c0d685", size = 15027, upload-time = "2025-11-17T13:00:33.621Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/39/7b33910b7ba3db9ce1515c39eb4657232913fb171fe701f792ef50726e60/preshed-3.0.12-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:0d8b458dfbd6cc5007d045fa5638231328e3d6f214fd24ab999cc10f8b9097e5", size = 129211, upload-time = "2025-11-17T12:59:57.182Z" }, + { url = "https://files.pythonhosted.org/packages/32/67/97dceebe0b2b4dd94333e4ec283d38614f92996de615859a952da082890d/preshed-3.0.12-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8e9196e2ea704243a69df203e0c9185eb7c5c58c3632ba1c1e2e2e0aa3aae3b4", size = 123311, upload-time = "2025-11-17T12:59:58.449Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6f/f3772f6eaad1eae787f82ffb65a81a4a1993277eacf5a78a29da34608323/preshed-3.0.12-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ffa644e1730012ed435fb9d0c3031ea19a06b11136eff5e9b96b2aa25ec7a5f5", size = 831683, upload-time = "2025-11-17T13:00:00.229Z" }, + { url = "https://files.pythonhosted.org/packages/1a/93/997d39ca61202486dd06c669b4707a5b8e5d0c2c922db9f7744fd6a12096/preshed-3.0.12-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:39e83a16ce53e4a3c41c091fe4fe1c3d28604e63928040da09ba0c5d5a7ca41e", size = 830035, upload-time = "2025-11-17T13:00:02.191Z" }, + { url = "https://files.pythonhosted.org/packages/0a/f2/51bf44e3fdbef08d40a832181842cd9b21b11c3f930989f4ff17e9201e12/preshed-3.0.12-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2ec9bc0baee426303a644c7bf531333d4e7fd06fedf07f62ee09969c208d578d", size = 841728, upload-time = "2025-11-17T13:00:03.643Z" }, + { url = "https://files.pythonhosted.org/packages/d3/b1/2d0e3d23d9f885f7647654d770227eb13e4d892deb9b0ed50b993d63fb18/preshed-3.0.12-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7db058f1b4a3d4d51c4c05b379c6cc9c36fcad00160923cb20ca1c7030581ea4", size = 858860, upload-time = "2025-11-17T13:00:05.185Z" }, + { url = "https://files.pythonhosted.org/packages/e7/57/7c28c7f6f9bfce02796b54f1f6acd2cebb3fa3f14a2dce6fb3c686e3c3a8/preshed-3.0.12-cp314-cp314-win_amd64.whl", hash = "sha256:c87a54a55a2ba98d0c3fd7886295f2825397aff5a7157dcfb89124f6aa2dca41", size = 120325, upload-time = "2025-11-17T13:00:06.428Z" }, + { url = "https://files.pythonhosted.org/packages/33/c3/df235ca679a08e09103983ec17c668f96abe897eadbe18d635972b43d8a9/preshed-3.0.12-cp314-cp314-win_arm64.whl", hash = "sha256:d9c5f10b4b971d71d163c2416b91b7136eae54ef3183b1742bb5993269af1b18", size = 107393, upload-time = "2025-11-17T13:00:07.718Z" }, + { url = "https://files.pythonhosted.org/packages/7e/f1/51a2a72381c8aa3aeb8305d88e720c745048527107e649c01b8d49d6b5bf/preshed-3.0.12-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2739a9c57efcfa16466fa6e0257d67f0075a9979dc729585fbadaed7383ab449", size = 137703, upload-time = "2025-11-17T13:00:09.001Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ab/f3c3d50647f3af6ce6441c596a4f6fb0216d549432ef51f61c0c1744c9b9/preshed-3.0.12-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:364249656bfbf98b4008fac707f35835580ec56207f7cbecdafef6ebb6a595a6", size = 134889, upload-time = "2025-11-17T13:00:10.29Z" }, + { url = "https://files.pythonhosted.org/packages/54/9a/012dbae28a0b88cd98eae99f87701ffbe3a7d2ea3de345cb8a6a6e1b16cd/preshed-3.0.12-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7f933d509ee762a90f62573aaf189eba94dfee478fca13ea2183b2f8a1bb8f7e", size = 911078, upload-time = "2025-11-17T13:00:11.911Z" }, + { url = "https://files.pythonhosted.org/packages/88/c1/0cd0f8cdb91f63c298320cf946c4b97adfb8e8d3a5d454267410c90fcfaa/preshed-3.0.12-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f73f4e29bf90e58034e6f5fa55e6029f3f2d7c042a7151ed487b49898b0ce887", size = 930506, upload-time = "2025-11-17T13:00:13.375Z" }, + { url = "https://files.pythonhosted.org/packages/20/1a/cab79b3181b2150eeeb0e2541c2bd4e0830e1e068b8836b24ea23610cec3/preshed-3.0.12-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a61ede0c3d18f1ae128113f785a396351a46f4634beccfdf617b0a86008b154d", size = 900009, upload-time = "2025-11-17T13:00:14.781Z" }, + { url = "https://files.pythonhosted.org/packages/31/9a/5ea9d6d95d5c07ba70166330a43bff7f0a074d0134eb7984eca6551e8c70/preshed-3.0.12-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:eafc08a86f77be78e722d96aa8a3a0aef0e3c7ac2f2ada22186a138e63d4033c", size = 910826, upload-time = "2025-11-17T13:00:16.861Z" }, + { url = "https://files.pythonhosted.org/packages/92/71/39024f9873ff317eac724b2759e94d013703800d970d51de77ccc6afff7e/preshed-3.0.12-cp314-cp314t-win_amd64.whl", hash = "sha256:fadaad54973b8697d5ef008735e150bd729a127b6497fd2cb068842074a6f3a7", size = 141358, upload-time = "2025-11-17T13:00:18.167Z" }, + { url = "https://files.pythonhosted.org/packages/9d/0d/431bb85252119f5d2260417fa7d164619b31eed8f1725b364dc0ade43a8e/preshed-3.0.12-cp314-cp314t-win_arm64.whl", hash = "sha256:c0c0d3b66b4c1e40aa6042721492f7b07fc9679ab6c361bc121aa54a1c3ef63f", size = 114839, upload-time = "2025-11-17T13:00:19.513Z" }, +] + +[[package]] +name = "prometheus-client" +version = "0.23.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/23/53/3edb5d68ecf6b38fcbcc1ad28391117d2a322d9a1a3eff04bfdb184d8c3b/prometheus_client-0.23.1.tar.gz", hash = "sha256:6ae8f9081eaaaf153a2e959d2e6c4f4fb57b12ef76c8c7980202f1e57b48b2ce", size = 80481, upload-time = "2025-09-18T20:47:25.043Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/db/14bafcb4af2139e046d03fd00dea7873e48eafe18b7d2797e73d6681f210/prometheus_client-0.23.1-py3-none-any.whl", hash = "sha256:dd1913e6e76b59cfe44e7a4b83e01afc9873c1bdfd2ed8739f1e76aeca115f99", size = 61145, upload-time = "2025-09-18T20:47:23.875Z" }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, +] + +[[package]] +name = "prospector" +version = "1.17.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dodgy" }, + { name = "mccabe" }, + { name = "packaging" }, + { name = "pep8-naming" }, + { name = "pycodestyle" }, + { name = "pydocstyle" }, + { name = "pyflakes" }, + { name = "pylint" }, + { name = "pylint-celery" }, + { name = "pylint-django" }, + { name = "pyyaml" }, + { name = "requirements-detector" }, + { name = "setoptconf-tmp" }, + { name = "toml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/05/89/180c37306d39adea1137160e626d55a621bc4d4a325386adae1f37f97416/prospector-1.17.3.tar.gz", hash = "sha256:c4df723012c45fc70f5b71f5eee318dbccaf903c2012c8ecf3ec89f60e5cb822", size = 71052, upload-time = "2025-08-13T11:19:11.555Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/93/e400ea04527e304beb52fda165000fa3997e2b6f7fc8bcedea4528e8447f/prospector-1.17.3-py3-none-any.whl", hash = "sha256:e3698bba95f86ef50d626df33b29272cf6462061aca2b19161186c4405a6a402", size = 96195, upload-time = "2025-08-13T11:19:10.25Z" }, +] + +[[package]] +name = "psutil" +version = "7.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/73/cb/09e5184fb5fc0358d110fc3ca7f6b1d033800734d34cac10f4136cfac10e/psutil-7.2.1.tar.gz", hash = "sha256:f7583aec590485b43ca601dd9cea0dcd65bd7bb21d30ef4ddbf4ea6b5ed1bdd3", size = 490253, upload-time = "2025-12-29T08:26:00.169Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/c2/5fb764bd61e40e1fe756a44bd4c21827228394c17414ade348e28f83cd79/psutil-7.2.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:494c513ccc53225ae23eec7fe6e1482f1b8a44674241b54561f755a898650679", size = 129716, upload-time = "2025-12-29T08:26:16.017Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d2/935039c20e06f615d9ca6ca0ab756cf8408a19d298ffaa08666bc18dc805/psutil-7.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3fce5f92c22b00cdefd1645aa58ab4877a01679e901555067b1bd77039aa589f", size = 130133, upload-time = "2025-12-29T08:26:18.009Z" }, + { url = "https://files.pythonhosted.org/packages/77/69/19f1eb0e01d24c2b3eacbc2f78d3b5add8a89bf0bb69465bc8d563cc33de/psutil-7.2.1-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93f3f7b0bb07711b49626e7940d6fe52aa9940ad86e8f7e74842e73189712129", size = 181518, upload-time = "2025-12-29T08:26:20.241Z" }, + { url = "https://files.pythonhosted.org/packages/e1/6d/7e18b1b4fa13ad370787626c95887b027656ad4829c156bb6569d02f3262/psutil-7.2.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d34d2ca888208eea2b5c68186841336a7f5e0b990edec929be909353a202768a", size = 184348, upload-time = "2025-12-29T08:26:22.215Z" }, + { url = "https://files.pythonhosted.org/packages/98/60/1672114392dd879586d60dd97896325df47d9a130ac7401318005aab28ec/psutil-7.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2ceae842a78d1603753561132d5ad1b2f8a7979cb0c283f5b52fb4e6e14b1a79", size = 140400, upload-time = "2025-12-29T08:26:23.993Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7b/d0e9d4513c46e46897b46bcfc410d51fc65735837ea57a25170f298326e6/psutil-7.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:08a2f175e48a898c8eb8eace45ce01777f4785bc744c90aa2cc7f2fa5462a266", size = 135430, upload-time = "2025-12-29T08:26:25.999Z" }, + { url = "https://files.pythonhosted.org/packages/c5/cf/5180eb8c8bdf6a503c6919f1da28328bd1e6b3b1b5b9d5b01ae64f019616/psutil-7.2.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b2e953fcfaedcfbc952b44744f22d16575d3aa78eb4f51ae74165b4e96e55f42", size = 128137, upload-time = "2025-12-29T08:26:27.759Z" }, + { url = "https://files.pythonhosted.org/packages/c5/2c/78e4a789306a92ade5000da4f5de3255202c534acdadc3aac7b5458fadef/psutil-7.2.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:05cc68dbb8c174828624062e73078e7e35406f4ca2d0866c272c2410d8ef06d1", size = 128947, upload-time = "2025-12-29T08:26:29.548Z" }, + { url = "https://files.pythonhosted.org/packages/29/f8/40e01c350ad9a2b3cb4e6adbcc8a83b17ee50dd5792102b6142385937db5/psutil-7.2.1-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e38404ca2bb30ed7267a46c02f06ff842e92da3bb8c5bfdadbd35a5722314d8", size = 154694, upload-time = "2025-12-29T08:26:32.147Z" }, + { url = "https://files.pythonhosted.org/packages/06/e4/b751cdf839c011a9714a783f120e6a86b7494eb70044d7d81a25a5cd295f/psutil-7.2.1-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab2b98c9fc19f13f59628d94df5cc4cc4844bc572467d113a8b517d634e362c6", size = 156136, upload-time = "2025-12-29T08:26:34.079Z" }, + { url = "https://files.pythonhosted.org/packages/44/ad/bbf6595a8134ee1e94a4487af3f132cef7fce43aef4a93b49912a48c3af7/psutil-7.2.1-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f78baafb38436d5a128f837fab2d92c276dfb48af01a240b861ae02b2413ada8", size = 148108, upload-time = "2025-12-29T08:26:36.225Z" }, + { url = "https://files.pythonhosted.org/packages/1c/15/dd6fd869753ce82ff64dcbc18356093471a5a5adf4f77ed1f805d473d859/psutil-7.2.1-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:99a4cd17a5fdd1f3d014396502daa70b5ec21bf4ffe38393e152f8e449757d67", size = 147402, upload-time = "2025-12-29T08:26:39.21Z" }, + { url = "https://files.pythonhosted.org/packages/34/68/d9317542e3f2b180c4306e3f45d3c922d7e86d8ce39f941bb9e2e9d8599e/psutil-7.2.1-cp37-abi3-win_amd64.whl", hash = "sha256:b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17", size = 136938, upload-time = "2025-12-29T08:26:41.036Z" }, + { url = "https://files.pythonhosted.org/packages/3e/73/2ce007f4198c80fcf2cb24c169884f833fe93fbc03d55d302627b094ee91/psutil-7.2.1-cp37-abi3-win_arm64.whl", hash = "sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442", size = 133836, upload-time = "2025-12-29T08:26:43.086Z" }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, +] + +[[package]] +name = "py-ubjson" +version = "0.16.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/c7/28220d37e041fe1df03e857fe48f768dcd30cd151480bf6f00da8713214a/py-ubjson-0.16.1.tar.gz", hash = "sha256:b9bfb8695a1c7e3632e800fb83c943bf67ed45ddd87cd0344851610c69a5a482", size = 50316, upload-time = "2020-04-18T15:05:57.698Z" } + +[[package]] +name = "pyasn1" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322, upload-time = "2024-09-10T22:41:42.55Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135, upload-time = "2024-09-11T16:00:36.122Z" }, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" }, +] + +[[package]] +name = "pyaudio" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/1d/8878c7752febb0f6716a7e1a52cb92ac98871c5aa522cba181878091607c/PyAudio-0.2.14.tar.gz", hash = "sha256:78dfff3879b4994d1f4fc6485646a57755c6ee3c19647a491f790a0895bd2f87", size = 47066, upload-time = "2023-11-07T07:11:48.806Z" } + +[[package]] +name = "pycodestyle" +version = "2.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/e0/abfd2a0d2efe47670df87f3e3a0e2edda42f055053c85361f19c0e2c1ca8/pycodestyle-2.14.0.tar.gz", hash = "sha256:c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783", size = 39472, upload-time = "2025-06-20T18:49:48.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl", hash = "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d", size = 31594, upload-time = "2025-06-20T18:49:47.491Z" }, +] + +[[package]] +name = "pycparser" +version = "2.23" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, +] + +[[package]] +name = "pydantic" +version = "2.12.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.41.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622, upload-time = "2025-11-04T13:40:56.68Z" }, + { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725, upload-time = "2025-11-04T13:40:58.807Z" }, + { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040, upload-time = "2025-11-04T13:41:00.853Z" }, + { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691, upload-time = "2025-11-04T13:41:03.504Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897, upload-time = "2025-11-04T13:41:05.804Z" }, + { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302, upload-time = "2025-11-04T13:41:07.809Z" }, + { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877, upload-time = "2025-11-04T13:41:09.827Z" }, + { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680, upload-time = "2025-11-04T13:41:12.379Z" }, + { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960, upload-time = "2025-11-04T13:41:14.627Z" }, + { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102, upload-time = "2025-11-04T13:41:16.868Z" }, + { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039, upload-time = "2025-11-04T13:41:18.934Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126, upload-time = "2025-11-04T13:41:21.418Z" }, + { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489, upload-time = "2025-11-04T13:41:24.076Z" }, + { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288, upload-time = "2025-11-04T13:41:26.33Z" }, + { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255, upload-time = "2025-11-04T13:41:28.569Z" }, + { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760, upload-time = "2025-11-04T13:41:31.055Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092, upload-time = "2025-11-04T13:41:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385, upload-time = "2025-11-04T13:41:35.508Z" }, + { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832, upload-time = "2025-11-04T13:41:37.732Z" }, + { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585, upload-time = "2025-11-04T13:41:40Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078, upload-time = "2025-11-04T13:41:42.323Z" }, + { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914, upload-time = "2025-11-04T13:41:45.221Z" }, + { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560, upload-time = "2025-11-04T13:41:47.474Z" }, + { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244, upload-time = "2025-11-04T13:41:49.992Z" }, + { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955, upload-time = "2025-11-04T13:41:54.079Z" }, + { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" }, + { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" }, + { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" }, +] + +[[package]] +name = "pydocstyle" +version = "6.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "snowballstemmer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/d5385ca59fd065e3c6a5fe19f9bc9d5ea7f2509fa8c9c22fb6b2031dd953/pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1", size = 36796, upload-time = "2023-01-17T20:29:19.838Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/ea/99ddefac41971acad68f14114f38261c1f27dac0b3ec529824ebc739bdaa/pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019", size = 38038, upload-time = "2023-01-17T20:29:18.094Z" }, +] + +[[package]] +name = "pydub" +version = "0.25.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/9a/e6bca0eed82db26562c73b5076539a4a08d3cffd19c3cc5913a3e61145fd/pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f", size = 38326, upload-time = "2021-03-10T02:09:54.659Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/53/d78dc063216e62fc55f6b2eebb447f6a4b0a59f55c8406376f76bf959b08/pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6", size = 32327, upload-time = "2021-03-10T02:09:53.503Z" }, +] + +[[package]] +name = "pyflakes" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/45/dc/fd034dc20b4b264b3d015808458391acbf9df40b1e54750ef175d39180b1/pyflakes-3.4.0.tar.gz", hash = "sha256:b24f96fafb7d2ab0ec5075b7350b3d2d2218eab42003821c06344973d3ea2f58", size = 64669, upload-time = "2025-06-20T18:45:27.834Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl", hash = "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f", size = 63551, upload-time = "2025-06-20T18:45:26.937Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "pyhyphen" +version = "4.0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appdirs" }, + { name = "requests" }, + { name = "setuptools" }, + { name = "wheel" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/54/a9/8040f40c8ffb5156a378c852511cdc10c8da41d9a87ec46aedb54d9ca218/PyHyphen-4.0.4.tar.gz", hash = "sha256:e156f0f9c48ac5ff625f9c59c43117c50e4415f2907cf0561031174c8e76e93e", size = 40474, upload-time = "2024-07-30T08:50:27.289Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/14/0a239a505658f6f09b648257233f80f56f4710c9b03ba7051ef84a4c67f4/PyHyphen-4.0.4-cp37-abi3-macosx_11_0_universal2.whl", hash = "sha256:feab019b508e30ebf88f384ba26e2376e7569812f3e9fb83d2882dbfd6475fa1", size = 50961, upload-time = "2024-07-30T08:50:23.987Z" }, + { url = "https://files.pythonhosted.org/packages/4a/89/34432450eaec027a2662a161986b62ab63b5e194cb549cc5248d576c102c/PyHyphen-4.0.4-cp37-abi3-win_amd64.whl", hash = "sha256:097ad69b6f5a6f85ec3491b5ff7d5750e4f52c5d46a152c208a17fd8f10a50c7", size = 38483, upload-time = "2024-07-30T08:50:25.692Z" }, +] + +[[package]] +name = "pylint" +version = "3.3.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "astroid" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "dill" }, + { name = "isort" }, + { name = "mccabe" }, + { name = "platformdirs" }, + { name = "tomlkit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/9d/81c84a312d1fa8133b0db0c76148542a98349298a01747ab122f9314b04e/pylint-3.3.9.tar.gz", hash = "sha256:d312737d7b25ccf6b01cc4ac629b5dcd14a0fcf3ec392735ac70f137a9d5f83a", size = 1525946, upload-time = "2025-10-05T18:41:43.786Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/a7/69460c4a6af7575449e615144aa2205b89408dc2969b87bc3df2f262ad0b/pylint-3.3.9-py3-none-any.whl", hash = "sha256:01f9b0462c7730f94786c283f3e52a1fbdf0494bbe0971a78d7277ef46a751e7", size = 523465, upload-time = "2025-10-05T18:41:41.766Z" }, +] + +[[package]] +name = "pylint-celery" +version = "0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "astroid" }, + { name = "pylint" }, + { name = "pylint-plugin-utils" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d7/11/7241fec486839a853cee783e3a00950d46ee1e3e993884341b1d4208a287/pylint-celery-0.3.tar.gz", hash = "sha256:41e32094e7408d15c044178ea828dd524beedbdbe6f83f712c5e35bde1de4beb", size = 1899, upload-time = "2014-09-25T07:23:50.824Z" } + +[[package]] +name = "pylint-django" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pylint" }, + { name = "pylint-plugin-utils" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/0d/d775fec0dde8ca5d20e9170a2ca332dfa21b77f7e7e47fc3ab9b2261773c/pylint_django-2.7.0-py3-none-any.whl", hash = "sha256:76ef7e7bbbcf7ee86adbb2beac0ffaa7232509a17bf4a488d81467a1bbaa215b", size = 42892, upload-time = "2026-01-01T11:17:04.292Z" }, +] + +[[package]] +name = "pylint-plugin-utils" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pylint" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/73/85/24eaf5d0d078fc8799ae6d89faf326d6e4d27d862fc9a710a52ab07b7bb5/pylint_plugin_utils-0.9.0.tar.gz", hash = "sha256:5468d763878a18d5cc4db46eaffdda14313b043c962a263a7d78151b90132055", size = 10474, upload-time = "2025-06-24T07:14:00.534Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/c9/a3b871b0b590c49e38884af6dab58ab9711053bd5c39b8899b72e367b9f6/pylint_plugin_utils-0.9.0-py3-none-any.whl", hash = "sha256:16e9b84e5326ba893a319a0323fcc8b4bcc9c71fc654fcabba0605596c673818", size = 11129, upload-time = "2025-06-24T07:13:58.993Z" }, +] + +[[package]] +name = "pyopenssl" +version = "25.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/80/be/97b83a464498a79103036bc74d1038df4a7ef0e402cfaf4d5e113fb14759/pyopenssl-25.3.0.tar.gz", hash = "sha256:c981cb0a3fd84e8602d7afc209522773b94c1c2446a3c710a75b06fe1beae329", size = 184073, upload-time = "2025-09-17T00:32:21.037Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/81/ef2b1dfd1862567d573a4fdbc9f969067621764fbb74338496840a1d2977/pyopenssl-25.3.0-py3-none-any.whl", hash = "sha256:1fda6fc034d5e3d179d39e59c1895c9faeaf40a79de5fc4cbbfbe0d36f4a77b6", size = 57268, upload-time = "2025-09-17T00:32:19.474Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/33/c1/1d9de9aeaa1b89b0186e5fe23294ff6517fce1bc69149185577cd31016b2/pyparsing-3.3.1.tar.gz", hash = "sha256:47fad0f17ac1e2cad3de3b458570fbc9b03560aa029ed5e16ee5554da9a2251c", size = 1550512, upload-time = "2025-12-23T03:14:04.391Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/40/2614036cdd416452f5bf98ec037f38a1afb17f327cb8e6b652d4729e0af8/pyparsing-3.3.1-py3-none-any.whl", hash = "sha256:023b5e7e5520ad96642e2c6db4cb683d3970bd640cdf7115049a6e9c3682df82", size = 121793, upload-time = "2025-12-23T03:14:02.103Z" }, +] + +[[package]] +name = "pysine" +version = "0.9.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mock" }, + { name = "nose" }, + { name = "numpy" }, + { name = "pyaudio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/92/b5/0c071ddc6fa982f58aa4e3167b423a29cd27e99d992bf2c17c33e83682b5/pysine-0.9.2.tar.gz", hash = "sha256:574853e257d05482d2396422f28a4723903d35d195df09d0e400d7cd6c6fb23f", size = 4576, upload-time = "2017-08-28T15:29:36.349Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/01/32bc126eef61060eb2cf6f7c6247a376d1bd5f2cb986f90df0c98ee01544/pysine-0.9.2-py2.py3-none-any.whl", hash = "sha256:9ec0264bcc8acdf6e95f08dd2fbdc2c2fe8af263b0e4983f121bd677eb61f536", size = 6003, upload-time = "2017-08-28T15:29:33.616Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-json-logger" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/29/bf/eca6a3d43db1dae7070f70e160ab20b807627ba953663ba07928cdd3dc58/python_json_logger-4.0.0.tar.gz", hash = "sha256:f58e68eb46e1faed27e0f574a55a0455eecd7b8a5b88b85a784519ba3cff047f", size = 17683, upload-time = "2025-10-06T04:15:18.984Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl", hash = "sha256:af09c9daf6a813aa4cc7180395f50f2a9e5fa056034c9953aec92e381c5ba1e2", size = 15548, upload-time = "2025-10-06T04:15:17.553Z" }, +] + +[[package]] +name = "pytz" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, +] + +[[package]] +name = "pywinpty" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/bb/a7cc2967c5c4eceb6cc49cfe39447d4bfc56e6c865e7c2249b6eb978935f/pywinpty-3.0.2.tar.gz", hash = "sha256:1505cc4cb248af42cb6285a65c9c2086ee9e7e574078ee60933d5d7fa86fb004", size = 30669, upload-time = "2025-10-03T21:16:29.205Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/15/f12c6055e2d7a617d4d5820e8ac4ceaff849da4cb124640ef5116a230771/pywinpty-3.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:28297cecc37bee9f24d8889e47231972d6e9e84f7b668909de54f36ca785029a", size = 2050386, upload-time = "2025-10-03T21:18:50.477Z" }, + { url = "https://files.pythonhosted.org/packages/de/24/c6907c5bb06043df98ad6a0a0ff5db2e0affcecbc3b15c42404393a3f72a/pywinpty-3.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:34b55ae9a1b671fe3eae071d86618110538e8eaad18fcb1531c0830b91a82767", size = 2049834, upload-time = "2025-10-03T21:19:25.688Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "pyzmq" +version = "27.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload-time = "2025-09-08T23:08:03.807Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload-time = "2025-09-08T23:08:05.301Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload-time = "2025-09-08T23:08:06.828Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload-time = "2025-09-08T23:08:08.396Z" }, + { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload-time = "2025-09-08T23:08:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload-time = "2025-09-08T23:08:11.907Z" }, + { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload-time = "2025-09-08T23:08:13.513Z" }, + { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload-time = "2025-09-08T23:08:15.163Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload-time = "2025-09-08T23:08:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload-time = "2025-09-08T23:08:18.926Z" }, + { url = "https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a", size = 1341197, upload-time = "2025-09-08T23:08:44.973Z" }, + { url = "https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175, upload-time = "2025-09-08T23:08:46.601Z" }, + { url = "https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427, upload-time = "2025-09-08T23:08:48.187Z" }, + { url = "https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d", size = 847929, upload-time = "2025-09-08T23:08:49.76Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146", size = 1650193, upload-time = "2025-09-08T23:08:51.7Z" }, + { url = "https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd", size = 2024388, upload-time = "2025-09-08T23:08:53.393Z" }, + { url = "https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a", size = 1885316, upload-time = "2025-09-08T23:08:55.702Z" }, + { url = "https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92", size = 587472, upload-time = "2025-09-08T23:08:58.18Z" }, + { url = "https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0", size = 661401, upload-time = "2025-09-08T23:08:59.802Z" }, + { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170, upload-time = "2025-09-08T23:09:01.418Z" }, +] + +[[package]] +name = "referencing" +version = "0.37.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, +] + +[[package]] +name = "regex" +version = "2025.11.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/a9/546676f25e573a4cf00fe8e119b78a37b6a8fe2dc95cda877b30889c9c45/regex-2025.11.3.tar.gz", hash = "sha256:1fedc720f9bb2494ce31a58a1631f9c82df6a09b49c19517ea5cc280b4541e01", size = 414669, upload-time = "2025-11-03T21:34:22.089Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/e9/f6e13de7e0983837f7b6d238ad9458800a874bf37c264f7923e63409944c/regex-2025.11.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9697a52e57576c83139d7c6f213d64485d3df5bf84807c35fa409e6c970801c6", size = 489089, upload-time = "2025-11-03T21:32:50.027Z" }, + { url = "https://files.pythonhosted.org/packages/a3/5c/261f4a262f1fa65141c1b74b255988bd2fa020cc599e53b080667d591cfc/regex-2025.11.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e18bc3f73bd41243c9b38a6d9f2366cd0e0137a9aebe2d8ff76c5b67d4c0a3f4", size = 291059, upload-time = "2025-11-03T21:32:51.682Z" }, + { url = "https://files.pythonhosted.org/packages/8e/57/f14eeb7f072b0e9a5a090d1712741fd8f214ec193dba773cf5410108bb7d/regex-2025.11.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:61a08bcb0ec14ff4e0ed2044aad948d0659604f824cbd50b55e30b0ec6f09c73", size = 288900, upload-time = "2025-11-03T21:32:53.569Z" }, + { url = "https://files.pythonhosted.org/packages/3c/6b/1d650c45e99a9b327586739d926a1cd4e94666b1bd4af90428b36af66dc7/regex-2025.11.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9c30003b9347c24bcc210958c5d167b9e4f9be786cb380a7d32f14f9b84674f", size = 799010, upload-time = "2025-11-03T21:32:55.222Z" }, + { url = "https://files.pythonhosted.org/packages/99/ee/d66dcbc6b628ce4e3f7f0cbbb84603aa2fc0ffc878babc857726b8aab2e9/regex-2025.11.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4e1e592789704459900728d88d41a46fe3969b82ab62945560a31732ffc19a6d", size = 864893, upload-time = "2025-11-03T21:32:57.239Z" }, + { url = "https://files.pythonhosted.org/packages/bf/2d/f238229f1caba7ac87a6c4153d79947fb0261415827ae0f77c304260c7d3/regex-2025.11.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6538241f45eb5a25aa575dbba1069ad786f68a4f2773a29a2bd3dd1f9de787be", size = 911522, upload-time = "2025-11-03T21:32:59.274Z" }, + { url = "https://files.pythonhosted.org/packages/bd/3d/22a4eaba214a917c80e04f6025d26143690f0419511e0116508e24b11c9b/regex-2025.11.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce22519c989bb72a7e6b36a199384c53db7722fe669ba891da75907fe3587db", size = 803272, upload-time = "2025-11-03T21:33:01.393Z" }, + { url = "https://files.pythonhosted.org/packages/84/b1/03188f634a409353a84b5ef49754b97dbcc0c0f6fd6c8ede505a8960a0a4/regex-2025.11.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:66d559b21d3640203ab9075797a55165d79017520685fb407b9234d72ab63c62", size = 787958, upload-time = "2025-11-03T21:33:03.379Z" }, + { url = "https://files.pythonhosted.org/packages/99/6a/27d072f7fbf6fadd59c64d210305e1ff865cc3b78b526fd147db768c553b/regex-2025.11.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:669dcfb2e38f9e8c69507bace46f4889e3abbfd9b0c29719202883c0a603598f", size = 859289, upload-time = "2025-11-03T21:33:05.374Z" }, + { url = "https://files.pythonhosted.org/packages/9a/70/1b3878f648e0b6abe023172dacb02157e685564853cc363d9961bcccde4e/regex-2025.11.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:32f74f35ff0f25a5021373ac61442edcb150731fbaa28286bbc8bb1582c89d02", size = 850026, upload-time = "2025-11-03T21:33:07.131Z" }, + { url = "https://files.pythonhosted.org/packages/dd/d5/68e25559b526b8baab8e66839304ede68ff6727237a47727d240006bd0ff/regex-2025.11.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e6c7a21dffba883234baefe91bc3388e629779582038f75d2a5be918e250f0ed", size = 789499, upload-time = "2025-11-03T21:33:09.141Z" }, + { url = "https://files.pythonhosted.org/packages/fc/df/43971264857140a350910d4e33df725e8c94dd9dee8d2e4729fa0d63d49e/regex-2025.11.3-cp314-cp314-win32.whl", hash = "sha256:795ea137b1d809eb6836b43748b12634291c0ed55ad50a7d72d21edf1cd565c4", size = 271604, upload-time = "2025-11-03T21:33:10.9Z" }, + { url = "https://files.pythonhosted.org/packages/01/6f/9711b57dc6894a55faf80a4c1b5aa4f8649805cb9c7aef46f7d27e2b9206/regex-2025.11.3-cp314-cp314-win_amd64.whl", hash = "sha256:9f95fbaa0ee1610ec0fc6b26668e9917a582ba80c52cc6d9ada15e30aa9ab9ad", size = 280320, upload-time = "2025-11-03T21:33:12.572Z" }, + { url = "https://files.pythonhosted.org/packages/f1/7e/f6eaa207d4377481f5e1775cdeb5a443b5a59b392d0065f3417d31d80f87/regex-2025.11.3-cp314-cp314-win_arm64.whl", hash = "sha256:dfec44d532be4c07088c3de2876130ff0fbeeacaa89a137decbbb5f665855a0f", size = 273372, upload-time = "2025-11-03T21:33:14.219Z" }, + { url = "https://files.pythonhosted.org/packages/c3/06/49b198550ee0f5e4184271cee87ba4dfd9692c91ec55289e6282f0f86ccf/regex-2025.11.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ba0d8a5d7f04f73ee7d01d974d47c5834f8a1b0224390e4fe7c12a3a92a78ecc", size = 491985, upload-time = "2025-11-03T21:33:16.555Z" }, + { url = "https://files.pythonhosted.org/packages/ce/bf/abdafade008f0b1c9da10d934034cb670432d6cf6cbe38bbb53a1cfd6cf8/regex-2025.11.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:442d86cf1cfe4faabf97db7d901ef58347efd004934da045c745e7b5bd57ac49", size = 292669, upload-time = "2025-11-03T21:33:18.32Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ef/0c357bb8edbd2ad8e273fcb9e1761bc37b8acbc6e1be050bebd6475f19c1/regex-2025.11.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:fd0a5e563c756de210bb964789b5abe4f114dacae9104a47e1a649b910361536", size = 291030, upload-time = "2025-11-03T21:33:20.048Z" }, + { url = "https://files.pythonhosted.org/packages/79/06/edbb67257596649b8fb088d6aeacbcb248ac195714b18a65e018bf4c0b50/regex-2025.11.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf3490bcbb985a1ae97b2ce9ad1c0f06a852d5b19dde9b07bdf25bf224248c95", size = 807674, upload-time = "2025-11-03T21:33:21.797Z" }, + { url = "https://files.pythonhosted.org/packages/f4/d9/ad4deccfce0ea336296bd087f1a191543bb99ee1c53093dcd4c64d951d00/regex-2025.11.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3809988f0a8b8c9dcc0f92478d6501fac7200b9ec56aecf0ec21f4a2ec4b6009", size = 873451, upload-time = "2025-11-03T21:33:23.741Z" }, + { url = "https://files.pythonhosted.org/packages/13/75/a55a4724c56ef13e3e04acaab29df26582f6978c000ac9cd6810ad1f341f/regex-2025.11.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f4ff94e58e84aedb9c9fce66d4ef9f27a190285b451420f297c9a09f2b9abee9", size = 914980, upload-time = "2025-11-03T21:33:25.999Z" }, + { url = "https://files.pythonhosted.org/packages/67/1e/a1657ee15bd9116f70d4a530c736983eed997b361e20ecd8f5ca3759d5c5/regex-2025.11.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eb542fd347ce61e1321b0a6b945d5701528dca0cd9759c2e3bb8bd57e47964d", size = 812852, upload-time = "2025-11-03T21:33:27.852Z" }, + { url = "https://files.pythonhosted.org/packages/b8/6f/f7516dde5506a588a561d296b2d0044839de06035bb486b326065b4c101e/regex-2025.11.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d6c2d5919075a1f2e413c00b056ea0c2f065b3f5fe83c3d07d325ab92dce51d6", size = 795566, upload-time = "2025-11-03T21:33:32.364Z" }, + { url = "https://files.pythonhosted.org/packages/d9/dd/3d10b9e170cc16fb34cb2cef91513cf3df65f440b3366030631b2984a264/regex-2025.11.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:3f8bf11a4827cc7ce5a53d4ef6cddd5ad25595d3c1435ef08f76825851343154", size = 868463, upload-time = "2025-11-03T21:33:34.459Z" }, + { url = "https://files.pythonhosted.org/packages/f5/8e/935e6beff1695aa9085ff83195daccd72acc82c81793df480f34569330de/regex-2025.11.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:22c12d837298651e5550ac1d964e4ff57c3f56965fc1812c90c9fb2028eaf267", size = 854694, upload-time = "2025-11-03T21:33:36.793Z" }, + { url = "https://files.pythonhosted.org/packages/92/12/10650181a040978b2f5720a6a74d44f841371a3d984c2083fc1752e4acf6/regex-2025.11.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:62ba394a3dda9ad41c7c780f60f6e4a70988741415ae96f6d1bf6c239cf01379", size = 799691, upload-time = "2025-11-03T21:33:39.079Z" }, + { url = "https://files.pythonhosted.org/packages/67/90/8f37138181c9a7690e7e4cb388debbd389342db3c7381d636d2875940752/regex-2025.11.3-cp314-cp314t-win32.whl", hash = "sha256:4bf146dca15cdd53224a1bf46d628bd7590e4a07fbb69e720d561aea43a32b38", size = 274583, upload-time = "2025-11-03T21:33:41.302Z" }, + { url = "https://files.pythonhosted.org/packages/8f/cd/867f5ec442d56beb56f5f854f40abcfc75e11d10b11fdb1869dd39c63aaf/regex-2025.11.3-cp314-cp314t-win_amd64.whl", hash = "sha256:adad1a1bcf1c9e76346e091d22d23ac54ef28e1365117d99521631078dfec9de", size = 284286, upload-time = "2025-11-03T21:33:43.324Z" }, + { url = "https://files.pythonhosted.org/packages/20/31/32c0c4610cbc070362bf1d2e4ea86d1ea29014d400a6d6c2486fcfd57766/regex-2025.11.3-cp314-cp314t-win_arm64.whl", hash = "sha256:c54f768482cef41e219720013cd05933b6f971d9562544d691c68699bf2b6801", size = 274741, upload-time = "2025-11-03T21:33:45.557Z" }, +] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + +[[package]] +name = "requirements-detector" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "astroid" }, + { name = "packaging" }, + { name = "semver" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fb/28/ba8a796b45f85b30522ecfcde0045e24f83dca4fec1825623978cb527652/requirements_detector-1.4.0.tar.gz", hash = "sha256:0326c39269d87504c0e1b75932b86a6fdaa8a9eb3ce82243e5a21b696c2ade76", size = 15890, upload-time = "2025-06-11T07:41:30.788Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/88/16e2e64fc9b2244ae1132f09770fa367bdf3d3d8538cedf6149dedbefe91/requirements_detector-1.4.0-py3-none-any.whl", hash = "sha256:d76592a688e2f4553e6d1eb95ac3be0ec105549bc21348712aa12d714c1cd28f", size = 21102, upload-time = "2025-06-11T07:41:18.226Z" }, +] + +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513, upload-time = "2021-05-12T16:37:54.178Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490, upload-time = "2021-05-12T16:37:52.536Z" }, +] + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/88/f270de456dd7d11dcc808abfa291ecdd3f45ff44e3b549ffa01b126464d0/rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055", size = 6760, upload-time = "2019-10-28T16:00:19.144Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", size = 4242, upload-time = "2019-10-28T16:00:13.976Z" }, +] + +[[package]] +name = "rfc3987-syntax" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lark" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2c/06/37c1a5557acf449e8e406a830a05bf885ac47d33270aec454ef78675008d/rfc3987_syntax-1.1.0.tar.gz", hash = "sha256:717a62cbf33cffdd16dfa3a497d81ce48a660ea691b1ddd7be710c22f00b4a0d", size = 14239, upload-time = "2025-07-18T01:05:05.015Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl", hash = "sha256:6c3d97604e4c5ce9f714898e05401a0445a641cfa276432b0a648c80856f6a3f", size = 8046, upload-time = "2025-07-18T01:05:03.843Z" }, +] + +[[package]] +name = "rpds-py" +version = "0.30.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0", size = 362099, upload-time = "2025-11-30T20:23:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be", size = 353192, upload-time = "2025-11-30T20:23:29.151Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c4/76eb0e1e72d1a9c4703c69607cec123c29028bff28ce41588792417098ac/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f", size = 384080, upload-time = "2025-11-30T20:23:30.785Z" }, + { url = "https://files.pythonhosted.org/packages/72/87/87ea665e92f3298d1b26d78814721dc39ed8d2c74b86e83348d6b48a6f31/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f", size = 394841, upload-time = "2025-11-30T20:23:32.209Z" }, + { url = "https://files.pythonhosted.org/packages/77/ad/7783a89ca0587c15dcbf139b4a8364a872a25f861bdb88ed99f9b0dec985/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87", size = 516670, upload-time = "2025-11-30T20:23:33.742Z" }, + { url = "https://files.pythonhosted.org/packages/5b/3c/2882bdac942bd2172f3da574eab16f309ae10a3925644e969536553cb4ee/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18", size = 408005, upload-time = "2025-11-30T20:23:35.253Z" }, + { url = "https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad", size = 382112, upload-time = "2025-11-30T20:23:36.842Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8e/1da49d4a107027e5fbc64daeab96a0706361a2918da10cb41769244b805d/rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07", size = 399049, upload-time = "2025-11-30T20:23:38.343Z" }, + { url = "https://files.pythonhosted.org/packages/df/5a/7ee239b1aa48a127570ec03becbb29c9d5a9eb092febbd1699d567cae859/rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f", size = 415661, upload-time = "2025-11-30T20:23:40.263Z" }, + { url = "https://files.pythonhosted.org/packages/70/ea/caa143cf6b772f823bc7929a45da1fa83569ee49b11d18d0ada7f5ee6fd6/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65", size = 565606, upload-time = "2025-11-30T20:23:42.186Z" }, + { url = "https://files.pythonhosted.org/packages/64/91/ac20ba2d69303f961ad8cf55bf7dbdb4763f627291ba3d0d7d67333cced9/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f", size = 591126, upload-time = "2025-11-30T20:23:44.086Z" }, + { url = "https://files.pythonhosted.org/packages/21/20/7ff5f3c8b00c8a95f75985128c26ba44503fb35b8e0259d812766ea966c7/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53", size = 553371, upload-time = "2025-11-30T20:23:46.004Z" }, + { url = "https://files.pythonhosted.org/packages/72/c7/81dadd7b27c8ee391c132a6b192111ca58d866577ce2d9b0ca157552cce0/rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed", size = 215298, upload-time = "2025-11-30T20:23:47.696Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950", size = 228604, upload-time = "2025-11-30T20:23:49.501Z" }, + { url = "https://files.pythonhosted.org/packages/e8/95/ab005315818cc519ad074cb7784dae60d939163108bd2b394e60dc7b5461/rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6", size = 222391, upload-time = "2025-11-30T20:23:50.96Z" }, + { url = "https://files.pythonhosted.org/packages/9e/68/154fe0194d83b973cdedcdcc88947a2752411165930182ae41d983dcefa6/rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb", size = 364868, upload-time = "2025-11-30T20:23:52.494Z" }, + { url = "https://files.pythonhosted.org/packages/83/69/8bbc8b07ec854d92a8b75668c24d2abcb1719ebf890f5604c61c9369a16f/rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8", size = 353747, upload-time = "2025-11-30T20:23:54.036Z" }, + { url = "https://files.pythonhosted.org/packages/ab/00/ba2e50183dbd9abcce9497fa5149c62b4ff3e22d338a30d690f9af970561/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7", size = 383795, upload-time = "2025-11-30T20:23:55.556Z" }, + { url = "https://files.pythonhosted.org/packages/05/6f/86f0272b84926bcb0e4c972262f54223e8ecc556b3224d281e6598fc9268/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898", size = 393330, upload-time = "2025-11-30T20:23:57.033Z" }, + { url = "https://files.pythonhosted.org/packages/cb/e9/0e02bb2e6dc63d212641da45df2b0bf29699d01715913e0d0f017ee29438/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e", size = 518194, upload-time = "2025-11-30T20:23:58.637Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ca/be7bca14cf21513bdf9c0606aba17d1f389ea2b6987035eb4f62bd923f25/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419", size = 408340, upload-time = "2025-11-30T20:24:00.2Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c7/736e00ebf39ed81d75544c0da6ef7b0998f8201b369acf842f9a90dc8fce/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551", size = 383765, upload-time = "2025-11-30T20:24:01.759Z" }, + { url = "https://files.pythonhosted.org/packages/4a/3f/da50dfde9956aaf365c4adc9533b100008ed31aea635f2b8d7b627e25b49/rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8", size = 396834, upload-time = "2025-11-30T20:24:03.687Z" }, + { url = "https://files.pythonhosted.org/packages/4e/00/34bcc2565b6020eab2623349efbdec810676ad571995911f1abdae62a3a0/rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5", size = 415470, upload-time = "2025-11-30T20:24:05.232Z" }, + { url = "https://files.pythonhosted.org/packages/8c/28/882e72b5b3e6f718d5453bd4d0d9cf8df36fddeb4ddbbab17869d5868616/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404", size = 565630, upload-time = "2025-11-30T20:24:06.878Z" }, + { url = "https://files.pythonhosted.org/packages/3b/97/04a65539c17692de5b85c6e293520fd01317fd878ea1995f0367d4532fb1/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856", size = 591148, upload-time = "2025-11-30T20:24:08.445Z" }, + { url = "https://files.pythonhosted.org/packages/85/70/92482ccffb96f5441aab93e26c4d66489eb599efdcf96fad90c14bbfb976/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40", size = 556030, upload-time = "2025-11-30T20:24:10.956Z" }, + { url = "https://files.pythonhosted.org/packages/20/53/7c7e784abfa500a2b6b583b147ee4bb5a2b3747a9166bab52fec4b5b5e7d/rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0", size = 211570, upload-time = "2025-11-30T20:24:12.735Z" }, + { url = "https://files.pythonhosted.org/packages/d0/02/fa464cdfbe6b26e0600b62c528b72d8608f5cc49f96b8d6e38c95d60c676/rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3", size = 226532, upload-time = "2025-11-30T20:24:14.634Z" }, +] + +[[package]] +name = "scikit-learn" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "joblib" }, + { name = "numpy" }, + { name = "scipy" }, + { name = "threadpoolctl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/d4/40988bf3b8e34feec1d0e6a051446b1f66225f8529b9309becaeef62b6c4/scikit_learn-1.8.0.tar.gz", hash = "sha256:9bccbb3b40e3de10351f8f5068e105d0f4083b1a65fa07b6634fbc401a6287fd", size = 7335585, upload-time = "2025-12-10T07:08:53.618Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/05/1af2c186174cc92dcab2233f327336058c077d38f6fe2aceb08e6ab4d509/scikit_learn-1.8.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c22a2da7a198c28dd1a6e1136f19c830beab7fdca5b3e5c8bba8394f8a5c45b3", size = 8528667, upload-time = "2025-12-10T07:08:27.541Z" }, + { url = "https://files.pythonhosted.org/packages/a8/25/01c0af38fe969473fb292bba9dc2b8f9b451f3112ff242c647fee3d0dfe7/scikit_learn-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:6b595b07a03069a2b1740dc08c2299993850ea81cce4fe19b2421e0c970de6b7", size = 8066524, upload-time = "2025-12-10T07:08:29.822Z" }, + { url = "https://files.pythonhosted.org/packages/be/ce/a0623350aa0b68647333940ee46fe45086c6060ec604874e38e9ab7d8e6c/scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29ffc74089f3d5e87dfca4c2c8450f88bdc61b0fc6ed5d267f3988f19a1309f6", size = 8657133, upload-time = "2025-12-10T07:08:31.865Z" }, + { url = "https://files.pythonhosted.org/packages/b8/cb/861b41341d6f1245e6ca80b1c1a8c4dfce43255b03df034429089ca2a2c5/scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb65db5d7531bccf3a4f6bec3462223bea71384e2cda41da0f10b7c292b9e7c4", size = 8923223, upload-time = "2025-12-10T07:08:34.166Z" }, + { url = "https://files.pythonhosted.org/packages/76/18/a8def8f91b18cd1ba6e05dbe02540168cb24d47e8dcf69e8d00b7da42a08/scikit_learn-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:56079a99c20d230e873ea40753102102734c5953366972a71d5cb39a32bc40c6", size = 8096518, upload-time = "2025-12-10T07:08:36.339Z" }, + { url = "https://files.pythonhosted.org/packages/d1/77/482076a678458307f0deb44e29891d6022617b2a64c840c725495bee343f/scikit_learn-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:3bad7565bc9cf37ce19a7c0d107742b320c1285df7aab1a6e2d28780df167242", size = 7754546, upload-time = "2025-12-10T07:08:38.128Z" }, + { url = "https://files.pythonhosted.org/packages/2d/d1/ef294ca754826daa043b2a104e59960abfab4cf653891037d19dd5b6f3cf/scikit_learn-1.8.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:4511be56637e46c25721e83d1a9cea9614e7badc7040c4d573d75fbe257d6fd7", size = 8848305, upload-time = "2025-12-10T07:08:41.013Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e2/b1f8b05138ee813b8e1a4149f2f0d289547e60851fd1bb268886915adbda/scikit_learn-1.8.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:a69525355a641bf8ef136a7fa447672fb54fe8d60cab5538d9eb7c6438543fb9", size = 8432257, upload-time = "2025-12-10T07:08:42.873Z" }, + { url = "https://files.pythonhosted.org/packages/26/11/c32b2138a85dcb0c99f6afd13a70a951bfdff8a6ab42d8160522542fb647/scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c2656924ec73e5939c76ac4c8b026fc203b83d8900362eb2599d8aee80e4880f", size = 8678673, upload-time = "2025-12-10T07:08:45.362Z" }, + { url = "https://files.pythonhosted.org/packages/c7/57/51f2384575bdec454f4fe4e7a919d696c9ebce914590abf3e52d47607ab8/scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15fc3b5d19cc2be65404786857f2e13c70c83dd4782676dd6814e3b89dc8f5b9", size = 8922467, upload-time = "2025-12-10T07:08:47.408Z" }, + { url = "https://files.pythonhosted.org/packages/35/4d/748c9e2872637a57981a04adc038dacaa16ba8ca887b23e34953f0b3f742/scikit_learn-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:00d6f1d66fbcf4eba6e356e1420d33cc06c70a45bb1363cd6f6a8e4ebbbdece2", size = 8774395, upload-time = "2025-12-10T07:08:49.337Z" }, + { url = "https://files.pythonhosted.org/packages/60/22/d7b2ebe4704a5e50790ba089d5c2ae308ab6bb852719e6c3bd4f04c3a363/scikit_learn-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f28dd15c6bb0b66ba09728cf09fd8736c304be29409bd8445a080c1280619e8c", size = 8002647, upload-time = "2025-12-10T07:08:51.601Z" }, +] + +[[package]] +name = "scipy" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/56/3e/9cca699f3486ce6bc12ff46dc2031f1ec8eb9ccc9a320fdaf925f1417426/scipy-1.17.0.tar.gz", hash = "sha256:2591060c8e648d8b96439e111ac41fd8342fdeff1876be2e19dea3fe8930454e", size = 30396830, upload-time = "2026-01-10T21:34:23.009Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/2d/51006cd369b8e7879e1c630999a19d1fbf6f8b5ed3e33374f29dc87e53b3/scipy-1.17.0-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:c17514d11b78be8f7e6331b983a65a7f5ca1fd037b95e27b280921fe5606286a", size = 31346803, upload-time = "2026-01-10T21:28:57.24Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2e/2349458c3ce445f53a6c93d4386b1c4c5c0c540917304c01222ff95ff317/scipy-1.17.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:4e00562e519c09da34c31685f6acc3aa384d4d50604db0f245c14e1b4488bfa2", size = 27967182, upload-time = "2026-01-10T21:29:04.107Z" }, + { url = "https://files.pythonhosted.org/packages/5e/7c/df525fbfa77b878d1cfe625249529514dc02f4fd5f45f0f6295676a76528/scipy-1.17.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f7df7941d71314e60a481e02d5ebcb3f0185b8d799c70d03d8258f6c80f3d467", size = 20139125, upload-time = "2026-01-10T21:29:10.179Z" }, + { url = "https://files.pythonhosted.org/packages/33/11/fcf9d43a7ed1234d31765ec643b0515a85a30b58eddccc5d5a4d12b5f194/scipy-1.17.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:aabf057c632798832f071a8dde013c2e26284043934f53b00489f1773b33527e", size = 22443554, upload-time = "2026-01-10T21:29:15.888Z" }, + { url = "https://files.pythonhosted.org/packages/80/5c/ea5d239cda2dd3d31399424967a24d556cf409fbea7b5b21412b0fd0a44f/scipy-1.17.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a38c3337e00be6fd8a95b4ed66b5d988bac4ec888fd922c2ea9fe5fb1603dd67", size = 32757834, upload-time = "2026-01-10T21:29:23.406Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7e/8c917cc573310e5dc91cbeead76f1b600d3fb17cf0969db02c9cf92e3cfa/scipy-1.17.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00fb5f8ec8398ad90215008d8b6009c9db9fa924fd4c7d6be307c6f945f9cd73", size = 34995775, upload-time = "2026-01-10T21:29:31.915Z" }, + { url = "https://files.pythonhosted.org/packages/c5/43/176c0c3c07b3f7df324e7cdd933d3e2c4898ca202b090bd5ba122f9fe270/scipy-1.17.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f2a4942b0f5f7c23c7cd641a0ca1955e2ae83dedcff537e3a0259096635e186b", size = 34841240, upload-time = "2026-01-10T21:29:39.995Z" }, + { url = "https://files.pythonhosted.org/packages/44/8c/d1f5f4b491160592e7f084d997de53a8e896a3ac01cd07e59f43ca222744/scipy-1.17.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:dbf133ced83889583156566d2bdf7a07ff89228fe0c0cb727f777de92092ec6b", size = 37394463, upload-time = "2026-01-10T21:29:48.723Z" }, + { url = "https://files.pythonhosted.org/packages/9f/ec/42a6657f8d2d087e750e9a5dde0b481fd135657f09eaf1cf5688bb23c338/scipy-1.17.0-cp314-cp314-win_amd64.whl", hash = "sha256:3625c631a7acd7cfd929e4e31d2582cf00f42fcf06011f59281271746d77e061", size = 37053015, upload-time = "2026-01-10T21:30:51.418Z" }, + { url = "https://files.pythonhosted.org/packages/27/58/6b89a6afd132787d89a362d443a7bddd511b8f41336a1ae47f9e4f000dc4/scipy-1.17.0-cp314-cp314-win_arm64.whl", hash = "sha256:9244608d27eafe02b20558523ba57f15c689357c85bdcfe920b1828750aa26eb", size = 24951312, upload-time = "2026-01-10T21:30:56.771Z" }, + { url = "https://files.pythonhosted.org/packages/e9/01/f58916b9d9ae0112b86d7c3b10b9e685625ce6e8248df139d0fcb17f7397/scipy-1.17.0-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:2b531f57e09c946f56ad0b4a3b2abee778789097871fc541e267d2eca081cff1", size = 31706502, upload-time = "2026-01-10T21:29:56.326Z" }, + { url = "https://files.pythonhosted.org/packages/59/8e/2912a87f94a7d1f8b38aabc0faf74b82d3b6c9e22be991c49979f0eceed8/scipy-1.17.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:13e861634a2c480bd237deb69333ac79ea1941b94568d4b0efa5db5e263d4fd1", size = 28380854, upload-time = "2026-01-10T21:30:01.554Z" }, + { url = "https://files.pythonhosted.org/packages/bd/1c/874137a52dddab7d5d595c1887089a2125d27d0601fce8c0026a24a92a0b/scipy-1.17.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:eb2651271135154aa24f6481cbae5cc8af1f0dd46e6533fb7b56aa9727b6a232", size = 20552752, upload-time = "2026-01-10T21:30:05.93Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f0/7518d171cb735f6400f4576cf70f756d5b419a07fe1867da34e2c2c9c11b/scipy-1.17.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:c5e8647f60679790c2f5c76be17e2e9247dc6b98ad0d3b065861e082c56e078d", size = 22803972, upload-time = "2026-01-10T21:30:10.651Z" }, + { url = "https://files.pythonhosted.org/packages/7c/74/3498563a2c619e8a3ebb4d75457486c249b19b5b04a30600dfd9af06bea5/scipy-1.17.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fb10d17e649e1446410895639f3385fd2bf4c3c7dfc9bea937bddcbc3d7b9ba", size = 32829770, upload-time = "2026-01-10T21:30:16.359Z" }, + { url = "https://files.pythonhosted.org/packages/48/d1/7b50cedd8c6c9d6f706b4b36fa8544d829c712a75e370f763b318e9638c1/scipy-1.17.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8547e7c57f932e7354a2319fab613981cde910631979f74c9b542bb167a8b9db", size = 35051093, upload-time = "2026-01-10T21:30:22.987Z" }, + { url = "https://files.pythonhosted.org/packages/e2/82/a2d684dfddb87ba1b3ea325df7c3293496ee9accb3a19abe9429bce94755/scipy-1.17.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33af70d040e8af9d5e7a38b5ed3b772adddd281e3062ff23fec49e49681c38cf", size = 34909905, upload-time = "2026-01-10T21:30:28.704Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5e/e565bd73991d42023eb82bb99e51c5b3d9e2c588ca9d4b3e2cc1d3ca62a6/scipy-1.17.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb55bb97d00f8b7ab95cb64f873eb0bf54d9446264d9f3609130381233483f", size = 37457743, upload-time = "2026-01-10T21:30:34.819Z" }, + { url = "https://files.pythonhosted.org/packages/58/a8/a66a75c3d8f1fb2b83f66007d6455a06a6f6cf5618c3dc35bc9b69dd096e/scipy-1.17.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1ff269abf702f6c7e67a4b7aad981d42871a11b9dd83c58d2d2ea624efbd1088", size = 37098574, upload-time = "2026-01-10T21:30:40.782Z" }, + { url = "https://files.pythonhosted.org/packages/56/a5/df8f46ef7da168f1bc52cd86e09a9de5c6f19cc1da04454d51b7d4f43408/scipy-1.17.0-cp314-cp314t-win_arm64.whl", hash = "sha256:031121914e295d9791319a1875444d55079885bbae5bdc9c5e0f2ee5f09d34ff", size = 25246266, upload-time = "2026-01-10T21:30:45.923Z" }, +] + +[[package]] +name = "seaborn" +version = "0.13.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "matplotlib" }, + { name = "numpy" }, + { name = "pandas" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/86/59/a451d7420a77ab0b98f7affa3a1d78a313d2f7281a57afb1a34bae8ab412/seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7", size = 1457696, upload-time = "2024-01-25T13:21:52.551Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/11/00d3c3dfc25ad54e731d91449895a79e4bf2384dc3ac01809010ba88f6d5/seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987", size = 294914, upload-time = "2024-01-25T13:21:49.598Z" }, +] + +[[package]] +name = "semver" +version = "3.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/d1/d3159231aec234a59dd7d601e9dd9fe96f3afff15efd33c1070019b26132/semver-3.0.4.tar.gz", hash = "sha256:afc7d8c584a5ed0a11033af086e8af226a9c0b206f313e0301f8dd7b6b589602", size = 269730, upload-time = "2025-01-24T13:19:27.617Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/24/4d91e05817e92e3a61c8a21e08fd0f390f5301f1c448b137c57c4bc6e543/semver-3.0.4-py3-none-any.whl", hash = "sha256:9c824d87ba7f7ab4a1890799cec8596f15c1241cb473404ea1cb0c55e4b04746", size = 17912, upload-time = "2025-01-24T13:19:24.949Z" }, +] + +[[package]] +name = "send2trash" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/62/6e/421803dec0c0dfbf5a27e66491ebe6643a461e4f90422f00ea4c68ae24aa/send2trash-2.0.0.tar.gz", hash = "sha256:1761421da3f9930bfe51ed7c45343948573383ad4c27e3acebc91be324e7770d", size = 17206, upload-time = "2025-12-31T04:12:48.664Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/5a/f2f2e5eda25579f754acd83399c522ee03d6acbe001dfe53c8a1ec928b44/send2trash-2.0.0-py3-none-any.whl", hash = "sha256:e70d5ce41dbb890882cc78bc25d137478330b39a391e756fadf82e34da4d85b8", size = 17642, upload-time = "2025-12-31T04:12:45.336Z" }, +] + +[[package]] +name = "service-identity" +version = "24.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "cryptography" }, + { name = "pyasn1" }, + { name = "pyasn1-modules" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/a5/dfc752b979067947261dbbf2543470c58efe735c3c1301dd870ef27830ee/service_identity-24.2.0.tar.gz", hash = "sha256:b8683ba13f0d39c6cd5d625d2c5f65421d6d707b013b375c355751557cbe8e09", size = 39245, upload-time = "2024-10-26T07:21:57.736Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/2c/ca6dd598b384bc1ce581e24aaae0f2bed4ccac57749d5c3befbb5e742081/service_identity-24.2.0-py3-none-any.whl", hash = "sha256:6b047fbd8a84fd0bb0d55ebce4031e400562b9196e1e0d3e0fe2b8a59f6d4a85", size = 11364, upload-time = "2024-10-26T07:21:56.302Z" }, +] + +[[package]] +name = "setoptconf-tmp" +version = "0.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c1/f1/dda18cbb5df090c67ed879760f49ee65aa1b5d4266c66175467f61aa8f58/setoptconf-tmp-0.3.1.tar.gz", hash = "sha256:e0480addd11347ba52f762f3c4d8afa3e10ad0affbc53e3ffddc0ca5f27d5778", size = 13691, upload-time = "2021-09-08T08:07:46.802Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/98/6d072ea4b59693d93782b1e685547dd8e90f7880d4b3c050f67d4b9eec4f/setoptconf_tmp-0.3.1-py3-none-any.whl", hash = "sha256:76035d5cd1593d38b9056ae12d460eca3aaa34ad05c315b69145e138ba80a745", size = 32347, upload-time = "2021-09-08T08:07:44.866Z" }, +] + +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "smart-open" +version = "7.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/67/9a/0a7acb748b86e2922982366d780ca4b16c33f7246fa5860d26005c97e4f3/smart_open-7.5.0.tar.gz", hash = "sha256:f394b143851d8091011832ac8113ea4aba6b92e6c35f6e677ddaaccb169d7cb9", size = 53920, upload-time = "2025-11-08T21:38:40.698Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/95/bc978be7ea0babf2fb48a414b6afaad414c6a9e8b1eafc5b8a53c030381a/smart_open-7.5.0-py3-none-any.whl", hash = "sha256:87e695c5148bbb988f15cec00971602765874163be85acb1c9fb8abc012e6599", size = 63940, upload-time = "2025-11-08T21:38:39.024Z" }, +] + +[[package]] +name = "snowballstemmer" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/75/a7/9810d872919697c9d01295633f5d574fb416d47e535f258272ca1f01f447/snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895", size = 105575, upload-time = "2025-05-09T16:34:51.843Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274, upload-time = "2025-05-09T16:34:50.371Z" }, +] + +[[package]] +name = "soupsieve" +version = "2.8.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/89/23/adf3796d740536d63a6fbda113d07e60c734b6ed5d3058d1e47fc0495e47/soupsieve-2.8.1.tar.gz", hash = "sha256:4cf733bc50fa805f5df4b8ef4740fc0e0fa6218cf3006269afd3f9d6d80fd350", size = 117856, upload-time = "2025-12-18T13:50:34.655Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/f3/b67d6ea49ca9154453b6d70b34ea22f3996b9fa55da105a79d8732227adc/soupsieve-2.8.1-py3-none-any.whl", hash = "sha256:a11fe2a6f3d76ab3cf2de04eb339c1be5b506a8a47f2ceb6d139803177f85434", size = 36710, upload-time = "2025-12-18T13:50:33.267Z" }, +] + +[[package]] +name = "spacy" +version = "3.8.11" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "catalogue" }, + { name = "cymem" }, + { name = "jinja2" }, + { name = "murmurhash" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "preshed" }, + { name = "pydantic" }, + { name = "requests" }, + { name = "setuptools" }, + { name = "spacy-legacy" }, + { name = "spacy-loggers" }, + { name = "srsly" }, + { name = "thinc" }, + { name = "tqdm" }, + { name = "typer-slim" }, + { name = "wasabi" }, + { name = "weasel" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/59/9f/424244b0e2656afc9ff82fb7a96931a47397bfce5ba382213827b198312a/spacy-3.8.11.tar.gz", hash = "sha256:54e1e87b74a2f9ea807ffd606166bf29ac45e2bd81ff7f608eadc7b05787d90d", size = 1326804, upload-time = "2025-11-17T20:40:03.079Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/78/ddeb09116b593f3cccc7eb489a713433076b11cf8cdfb98aec641b73a2c2/spacy-3.8.11-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:43c24d19a3f85bde0872935294a31fd9b3a6db3f92bb2b75074177cd3acec03f", size = 6067734, upload-time = "2025-11-17T20:39:42.629Z" }, + { url = "https://files.pythonhosted.org/packages/65/bb/1bb630250dc70e00fa3821879c6e2cb65c19425aba38840d3484061285c1/spacy-3.8.11-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b6158c21da57b8373d2d1afb2b73977c4bc4235d2563e7788d44367fc384939a", size = 5732963, upload-time = "2025-11-17T20:39:44.872Z" }, + { url = "https://files.pythonhosted.org/packages/7a/56/c58071b3db23932ab2b934af3462a958e7edf472da9668e4869fe2a2199e/spacy-3.8.11-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1c0bd1bde1d91f1d7a44774ca4ca3fcf064946b72599a8eb34c25e014362ace1", size = 32447290, upload-time = "2025-11-17T20:39:47.392Z" }, + { url = "https://files.pythonhosted.org/packages/34/eb/d3947efa2b46848372e89ced8371671d77219612a3eebef15db5690aa4d2/spacy-3.8.11-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:99b767c41a772e544cf2d48e0808764f42f17eb2fd6188db4a729922ff7f0c1e", size = 32488011, upload-time = "2025-11-17T20:39:50.408Z" }, + { url = "https://files.pythonhosted.org/packages/04/9e/8c6c01558b62388557247e553e48874f52637a5648b957ed01fbd628391d/spacy-3.8.11-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a3c500f04c164e4366a1163a61bf39fd50f0c63abdb1fc17991281ec52a54ab4", size = 31731340, upload-time = "2025-11-17T20:39:53.221Z" }, + { url = "https://files.pythonhosted.org/packages/23/1f/21812ec34b187ef6ba223389760dfea09bbe27d2b84b553c5205576b4ac2/spacy-3.8.11-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a2bfe45c0c1530eaabc68f5434c52b1be8df10d5c195c54d4dc2e70cea97dc65", size = 32478557, upload-time = "2025-11-17T20:39:55.826Z" }, + { url = "https://files.pythonhosted.org/packages/f3/16/a0c9174a232dfe7b48281c05364957e2c6d0f80ef26b67ce8d28a49c2d91/spacy-3.8.11-cp314-cp314-win_amd64.whl", hash = "sha256:45d0bbc8442d18dcea9257be0d1ab26e884067e038b1fa133405bf2f20c74edf", size = 14396041, upload-time = "2025-11-17T20:39:58.557Z" }, + { url = "https://files.pythonhosted.org/packages/aa/d0/a6aad5b73d523e4686474b0cfcf46f37f3d7a18765be5c1f56c1dcee4c18/spacy-3.8.11-cp314-cp314-win_arm64.whl", hash = "sha256:90a12961ecc44e0195fd42db9f0ce4aade17e6fe03f8ab98d4549911d9e6f992", size = 13823760, upload-time = "2025-11-17T20:40:00.831Z" }, +] + +[[package]] +name = "spacy-legacy" +version = "3.0.12" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/79/91f9d7cc8db5642acad830dcc4b49ba65a7790152832c4eceb305e46d681/spacy-legacy-3.0.12.tar.gz", hash = "sha256:b37d6e0c9b6e1d7ca1cf5bc7152ab64a4c4671f59c85adaf7a3fcb870357a774", size = 23806, upload-time = "2023-01-23T09:04:15.104Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/55/12e842c70ff8828e34e543a2c7176dac4da006ca6901c9e8b43efab8bc6b/spacy_legacy-3.0.12-py2.py3-none-any.whl", hash = "sha256:476e3bd0d05f8c339ed60f40986c07387c0a71479245d6d0f4298dbd52cda55f", size = 29971, upload-time = "2023-01-23T09:04:13.45Z" }, +] + +[[package]] +name = "spacy-loggers" +version = "1.0.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/67/3d/926db774c9c98acf66cb4ed7faf6c377746f3e00b84b700d0868b95d0712/spacy-loggers-1.0.5.tar.gz", hash = "sha256:d60b0bdbf915a60e516cc2e653baeff946f0cfc461b452d11a4d5458c6fe5f24", size = 20811, upload-time = "2023-09-11T12:26:52.323Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/78/d1a1a026ef3af911159398c939b1509d5c36fe524c7b644f34a5146c4e16/spacy_loggers-1.0.5-py3-none-any.whl", hash = "sha256:196284c9c446cc0cdb944005384270d775fdeaf4f494d8e269466cfa497ef645", size = 22343, upload-time = "2023-09-11T12:26:50.586Z" }, +] + +[[package]] +name = "srsly" +version = "2.5.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "catalogue" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cf/77/5633c4ba65e3421b72b5b4bd93aa328360b351b3a1e5bf3c90eb224668e5/srsly-2.5.2.tar.gz", hash = "sha256:4092bc843c71b7595c6c90a0302a197858c5b9fe43067f62ae6a45bc3baa1c19", size = 492055, upload-time = "2025-11-17T14:11:02.543Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/03/3d248f538abc141d9c7ed1aa10e61506c0f95515a61066ee90e888f0cd8f/srsly-2.5.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a0911dcf1026f982bd8c5f73e1c43f1bc868416408fcbc1f3d99eb59475420c5", size = 659866, upload-time = "2025-11-17T14:10:22.811Z" }, + { url = "https://files.pythonhosted.org/packages/43/22/0fcff4c977ddfb32a6b10f33d904868b16ce655323756281f973c5a3449e/srsly-2.5.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f0ff3ac2942aee44235ca3c7712fcbd6e0d1a092e10ee16e07cef459ed6d7f65", size = 655868, upload-time = "2025-11-17T14:10:24.036Z" }, + { url = "https://files.pythonhosted.org/packages/1b/c1/e158f26a5597ac31b0f306d2584411ec1f984058e8171d76c678bf439e96/srsly-2.5.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:78385fb75e1bf7b81ffde97555aee094d270a5e0ea66f8280f6e95f5bb508b3e", size = 1156753, upload-time = "2025-11-17T14:10:25.366Z" }, + { url = "https://files.pythonhosted.org/packages/d9/bc/2001cd27fd6ecdae79050cf6b655ca646dedc0b69a756e6a87993cc47314/srsly-2.5.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2e9943b70bd7655b9eefca77aab838c3b7acea00c9dd244fd218a43dc61c518b", size = 1157916, upload-time = "2025-11-17T14:10:26.705Z" }, + { url = "https://files.pythonhosted.org/packages/5c/dd/56f563c2d0cd76c8fd22fb9f1589f18af50b54d31dd3323ceb05fe7999b8/srsly-2.5.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7d235a2bb08f5240e47c6aba4d9688b228d830fbf4c858388d9c151a10039e6d", size = 1114582, upload-time = "2025-11-17T14:10:27.997Z" }, + { url = "https://files.pythonhosted.org/packages/2e/e6/e155facc965a119e6f5d32b7e95082cadfb62cc5d97087d53db93f3a5a98/srsly-2.5.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ad94ee18b3042a6cdfdc022556e2ed9a7b52b876de86fe334c4d8ec58d59ecbc", size = 1129875, upload-time = "2025-11-17T14:10:29.295Z" }, + { url = "https://files.pythonhosted.org/packages/b6/3a/c12a4d556349c9f491b0a9d27968483f22934d2a02dfb14fb1d3a7d9b837/srsly-2.5.2-cp314-cp314-win_amd64.whl", hash = "sha256:6658467165d8fa4aec0f5f6e2da8fe977e087eaff13322b0ff20450f0d762cee", size = 658858, upload-time = "2025-11-17T14:10:30.612Z" }, + { url = "https://files.pythonhosted.org/packages/70/db/52510cbf478ab3ae8cb6c95aff3a499f2ded69df6d84df8a293630e9f10a/srsly-2.5.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:517e907792acf574979752ce33e7b15985c95d4ed7d8e38ee47f36063dc985ac", size = 666843, upload-time = "2025-11-17T14:10:32.082Z" }, + { url = "https://files.pythonhosted.org/packages/3d/da/4257b1d4c3eb005ecd135414398c033c13c4d3dffb715f63c3acd63d8d1a/srsly-2.5.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e5602797e6f87bf030b11ad356828142367c5c81e923303b5ff2a88dfb12d1e4", size = 663981, upload-time = "2025-11-17T14:10:33.542Z" }, + { url = "https://files.pythonhosted.org/packages/c6/f8/1ec5edd7299d8599def20fc3440372964f7c750022db8063e321747d1cf8/srsly-2.5.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3452306118f8604daaaac6d770ee8f910fca449e8f066dcc96a869b43ece5340", size = 1267808, upload-time = "2025-11-17T14:10:35.285Z" }, + { url = "https://files.pythonhosted.org/packages/3e/5c/4ef9782c9a3f331ef80e1ea8fc6fab50fc3d32ae61a494625d2c5f30cc4c/srsly-2.5.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e2d59f1ce00d73397a7f5b9fc33e76d17816ce051abe4eb920cec879d2a9d4f4", size = 1252838, upload-time = "2025-11-17T14:10:37.024Z" }, + { url = "https://files.pythonhosted.org/packages/39/da/d13cfc662d71eec3ccd4072433bf435bd2e11e1c5340150b4cc43fad46f4/srsly-2.5.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ebda3736651d33d92b17e26c525ba8d0b94d0ee379c9f92e8d937ba89dca8978", size = 1244558, upload-time = "2025-11-17T14:10:38.73Z" }, + { url = "https://files.pythonhosted.org/packages/26/50/92bf62dfb19532b823ef52251bb7003149e1d4a89f50a63332c8ff5f894b/srsly-2.5.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:74a9338fcc044f4bdc7113b2d9db2db8e0a263c69f1cba965acf12c845d8b365", size = 1244935, upload-time = "2025-11-17T14:10:42.324Z" }, + { url = "https://files.pythonhosted.org/packages/95/81/6ea10ef6228ce4438a240c803639f7ccf5eae3469fbc015f33bd84aa8df1/srsly-2.5.2-cp314-cp314t-win_amd64.whl", hash = "sha256:8e2b9058623c44b07441eb0d711dfdf6302f917f0634d0a294cae37578dcf899", size = 676105, upload-time = "2025-11-17T14:10:43.633Z" }, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, +] + +[[package]] +name = "terminado" +version = "0.18.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess", marker = "os_name != 'nt'" }, + { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "tornado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e", size = 32701, upload-time = "2024-03-12T14:34:39.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", size = 14154, upload-time = "2024-03-12T14:34:36.569Z" }, +] + +[[package]] +name = "textatistic" +version = "0.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyhyphen" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/73/f8/74dade1df8998ce9a42cba21b3cdf284f3f273e7e22fbcab27955d213e61/textatistic-0.0.1.tar.gz", hash = "sha256:281dec67821ab43833e0f7ed846b7931ef4f8a88efc18930339481f5a9e4d62f", size = 29941, upload-time = "2015-10-25T13:03:04.062Z" } + +[[package]] +name = "textblob" +version = "0.19.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nltk" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/a1/31fc6a5e9e46f2d84f72f12048588feac5464486e526dbfcc4719569cd3e/textblob-0.19.0.tar.gz", hash = "sha256:0a3d06a47cf7759441da3418c4843aed3797a998beba2108c6245a2020f83b01", size = 637872, upload-time = "2025-01-13T23:03:07.352Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d6/40aa5aead775582ea0cf35870e5a3f16fab4b967f1ad2debe675f673f923/textblob-0.19.0-py3-none-any.whl", hash = "sha256:af6b8827886f1ee839a625f4865e5abb1584eae8db2259627b33a6a0b02ef19d", size = 624280, upload-time = "2025-01-13T23:03:01.034Z" }, +] + +[[package]] +name = "thinc" +version = "8.3.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "blis" }, + { name = "catalogue" }, + { name = "confection" }, + { name = "cymem" }, + { name = "murmurhash" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "preshed" }, + { name = "pydantic" }, + { name = "setuptools" }, + { name = "srsly" }, + { name = "wasabi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/3a/2d0f0be132b9faaa6d56f04565ae122684273e4bf4eab8dee5f48dc00f68/thinc-8.3.10.tar.gz", hash = "sha256:5a75109f4ee1c968fc055ce651a17cb44b23b000d9e95f04a4d047ab3cb3e34e", size = 194196, upload-time = "2025-11-17T17:21:46.435Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/32/7a96e1f2cac159d778c6b0ab4ddd8a139bb57c602cef793b7606cd32428d/thinc-8.3.10-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:44d7038a5d28572105332b44ec9c4c3b6f7953b41d224588ad0473c9b79ccf9e", size = 793037, upload-time = "2025-11-17T17:21:32.538Z" }, + { url = "https://files.pythonhosted.org/packages/12/d8/81e8495e8ef412767c09d1f9d0d86dc60cd22e6ed75e61b49fbf1dcfcd65/thinc-8.3.10-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:639f20952af722cb0ab4c3d8a00e661686b60c04f82ef48d12064ceda3b8cd0c", size = 740768, upload-time = "2025-11-17T17:21:34.852Z" }, + { url = "https://files.pythonhosted.org/packages/c2/6d/716488a301d65c5463e92cb0eddae3672ca84f1d70937808cea9760f759c/thinc-8.3.10-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9306e62c7e7066c63b0c0ba1d164ae0c23bf38edf5a7df2e09cce69a2c290500", size = 3834983, upload-time = "2025-11-17T17:21:36.81Z" }, + { url = "https://files.pythonhosted.org/packages/9c/a1/d28b21cab9b79e9c803671bebd14489e14c5226136fad6a1c44f96f8e4ef/thinc-8.3.10-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2982604c21096de1a87b04a781a645863eece71ec6ee9f139ac01b998fb5622d", size = 3845215, upload-time = "2025-11-17T17:21:38.362Z" }, + { url = "https://files.pythonhosted.org/packages/93/9d/ff64ead5f1c2298d9e6a9ccc1c676b2347ac06162ad3c5e5d895c32a719e/thinc-8.3.10-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c6b82698e27846004d4eafc38317ace482eced888d4445f7fb9c548fd36777af", size = 4826596, upload-time = "2025-11-17T17:21:40.027Z" }, + { url = "https://files.pythonhosted.org/packages/4a/44/b80c863608d0fd31641a2d50658560c22d4841f1e445529201e22b3e1d0f/thinc-8.3.10-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2950acab8ae77427a86d11655ed0a161bc83a1edf9d31ba5c43deca6cd27ed4f", size = 4988146, upload-time = "2025-11-17T17:21:41.73Z" }, + { url = "https://files.pythonhosted.org/packages/93/6d/1bdd9344b2e7299faa55129dda624d50c334eed16a3761eb8b1dacd8bfcd/thinc-8.3.10-cp314-cp314-win_amd64.whl", hash = "sha256:c253139a5c873edf75a3b17ec9d8b6caebee072fdb489594bc64e35115df7625", size = 1738054, upload-time = "2025-11-17T17:21:43.328Z" }, + { url = "https://files.pythonhosted.org/packages/45/c4/44e3163d48e398efb3748481656963ac6265c14288012871c921dc81d004/thinc-8.3.10-cp314-cp314-win_arm64.whl", hash = "sha256:ad6da67f534995d6ec257f16665377d7ad95bef5c1b1c89618fd4528657a6f24", size = 1665001, upload-time = "2025-11-17T17:21:45.019Z" }, +] + +[[package]] +name = "threadpoolctl" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload-time = "2025-03-13T13:49:23.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" }, +] + +[[package]] +name = "tinycss2" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload-time = "2024-10-24T14:58:29.895Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload-time = "2024-10-24T14:58:28.029Z" }, +] + +[[package]] +name = "toml" +version = "0.10.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f", size = 22253, upload-time = "2020-11-01T01:40:22.204Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588, upload-time = "2020-11-01T01:40:20.672Z" }, +] + +[[package]] +name = "tomlkit" +version = "0.13.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207, upload-time = "2025-06-05T07:13:44.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901, upload-time = "2025-06-05T07:13:43.546Z" }, +] + +[[package]] +name = "tornado" +version = "6.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/37/1d/0a336abf618272d53f62ebe274f712e213f5a03c0b2339575430b8362ef2/tornado-6.5.4.tar.gz", hash = "sha256:a22fa9047405d03260b483980635f0b041989d8bcc9a313f8fe18b411d84b1d7", size = 513632, upload-time = "2025-12-15T19:21:03.836Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/a9/e94a9d5224107d7ce3cc1fab8d5dc97f5ea351ccc6322ee4fb661da94e35/tornado-6.5.4-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d6241c1a16b1c9e4cc28148b1cda97dd1c6cb4fb7068ac1bedc610768dff0ba9", size = 443909, upload-time = "2025-12-15T19:20:48.382Z" }, + { url = "https://files.pythonhosted.org/packages/db/7e/f7b8d8c4453f305a51f80dbb49014257bb7d28ccb4bbb8dd328ea995ecad/tornado-6.5.4-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2d50f63dda1d2cac3ae1fa23d254e16b5e38153758470e9956cbc3d813d40843", size = 442163, upload-time = "2025-12-15T19:20:49.791Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b5/206f82d51e1bfa940ba366a8d2f83904b15942c45a78dd978b599870ab44/tornado-6.5.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1cf66105dc6acb5af613c054955b8137e34a03698aa53272dbda4afe252be17", size = 445746, upload-time = "2025-12-15T19:20:51.491Z" }, + { url = "https://files.pythonhosted.org/packages/8e/9d/1a3338e0bd30ada6ad4356c13a0a6c35fbc859063fa7eddb309183364ac1/tornado-6.5.4-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50ff0a58b0dc97939d29da29cd624da010e7f804746621c78d14b80238669335", size = 445083, upload-time = "2025-12-15T19:20:52.778Z" }, + { url = "https://files.pythonhosted.org/packages/50/d4/e51d52047e7eb9a582da59f32125d17c0482d065afd5d3bc435ff2120dc5/tornado-6.5.4-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5fb5e04efa54cf0baabdd10061eb4148e0be137166146fff835745f59ab9f7f", size = 445315, upload-time = "2025-12-15T19:20:53.996Z" }, + { url = "https://files.pythonhosted.org/packages/27/07/2273972f69ca63dbc139694a3fc4684edec3ea3f9efabf77ed32483b875c/tornado-6.5.4-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9c86b1643b33a4cd415f8d0fe53045f913bf07b4a3ef646b735a6a86047dda84", size = 446003, upload-time = "2025-12-15T19:20:56.101Z" }, + { url = "https://files.pythonhosted.org/packages/d1/83/41c52e47502bf7260044413b6770d1a48dda2f0246f95ee1384a3cd9c44a/tornado-6.5.4-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:6eb82872335a53dd063a4f10917b3efd28270b56a33db69009606a0312660a6f", size = 445412, upload-time = "2025-12-15T19:20:57.398Z" }, + { url = "https://files.pythonhosted.org/packages/10/c7/bc96917f06cbee182d44735d4ecde9c432e25b84f4c2086143013e7b9e52/tornado-6.5.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6076d5dda368c9328ff41ab5d9dd3608e695e8225d1cd0fd1e006f05da3635a8", size = 445392, upload-time = "2025-12-15T19:20:58.692Z" }, + { url = "https://files.pythonhosted.org/packages/0c/1a/d7592328d037d36f2d2462f4bc1fbb383eec9278bc786c1b111cbbd44cfa/tornado-6.5.4-cp39-abi3-win32.whl", hash = "sha256:1768110f2411d5cd281bac0a090f707223ce77fd110424361092859e089b38d1", size = 446481, upload-time = "2025-12-15T19:21:00.008Z" }, + { url = "https://files.pythonhosted.org/packages/d6/6d/c69be695a0a64fd37a97db12355a035a6d90f79067a3cf936ec2b1dc38cd/tornado-6.5.4-cp39-abi3-win_amd64.whl", hash = "sha256:fa07d31e0cd85c60713f2b995da613588aa03e1303d75705dca6af8babc18ddc", size = 446886, upload-time = "2025-12-15T19:21:01.287Z" }, + { url = "https://files.pythonhosted.org/packages/50/49/8dc3fd90902f70084bd2cd059d576ddb4f8bb44c2c7c0e33a11422acb17e/tornado-6.5.4-cp39-abi3-win_arm64.whl", hash = "sha256:053e6e16701eb6cbe641f308f4c1a9541f91b6261991160391bfc342e8a551a1", size = 445910, upload-time = "2025-12-15T19:21:02.571Z" }, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, +] + +[[package]] +name = "twisted" +version = "25.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "automat" }, + { name = "constantly" }, + { name = "hyperlink" }, + { name = "incremental" }, + { name = "typing-extensions" }, + { name = "zope-interface" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/13/0f/82716ed849bf7ea4984c21385597c949944f0f9b428b5710f79d0afc084d/twisted-25.5.0.tar.gz", hash = "sha256:1deb272358cb6be1e3e8fc6f9c8b36f78eb0fa7c2233d2dbe11ec6fee04ea316", size = 3545725, upload-time = "2025-06-07T09:52:24.858Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/66/ab7efd8941f0bc7b2bd555b0f0471bff77df4c88e0cc31120c82737fec77/twisted-25.5.0-py3-none-any.whl", hash = "sha256:8559f654d01a54a8c3efe66d533d43f383531ebf8d81d9f9ab4769d91ca15df7", size = 3204767, upload-time = "2025-06-07T09:52:21.428Z" }, +] + +[[package]] +name = "txaio" +version = "25.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7f/67/ea9c9ddbaa3e0b4d53c91f8778a33e42045be352dc7200ed2b9aaa7dc229/txaio-25.12.2.tar.gz", hash = "sha256:9f232c21e12aa1ff52690e365b5a0ecfd42cc27a6ec86e1b92ece88f763f4b78", size = 117393, upload-time = "2025-12-09T15:03:26.527Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/05/bdb6318120cac9bf97779674f49035e0595d894b42d4c43b60637bafdb1f/txaio-25.12.2-py3-none-any.whl", hash = "sha256:5f6cd6c6b397fc3305790d15efd46a2d5b91cdbefa96543b4f8666aeb56ba026", size = 31208, upload-time = "2025-12-09T04:30:27.811Z" }, +] + +[[package]] +name = "typer-slim" +version = "0.21.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/17/d4/064570dec6358aa9049d4708e4a10407d74c99258f8b2136bb8702303f1a/typer_slim-0.21.1.tar.gz", hash = "sha256:73495dd08c2d0940d611c5a8c04e91c2a0a98600cbd4ee19192255a233b6dbfd", size = 110478, upload-time = "2026-01-06T11:21:11.176Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/0a/4aca634faf693e33004796b6cee0ae2e1dba375a800c16ab8d3eff4bb800/typer_slim-0.21.1-py3-none-any.whl", hash = "sha256:6e6c31047f171ac93cc5a973c9e617dbc5ab2bddc4d0a3135dc161b4e2020e0d", size = 47444, upload-time = "2026-01-06T11:21:12.441Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + +[[package]] +name = "tzdata" +version = "2025.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, +] + +[[package]] +name = "u-msgpack-python" +version = "2.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/9d/a40411a475e7d4838994b7f6bcc6bfca9acc5b119ce3a7503608c4428b49/u-msgpack-python-2.8.0.tar.gz", hash = "sha256:b801a83d6ed75e6df41e44518b4f2a9c221dc2da4bcd5380e3a0feda520bc61a", size = 18167, upload-time = "2023-05-18T09:28:12.187Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/5e/512aeb40fd819f4660d00f96f5c7371ee36fc8c6b605128c5ee59e0b28c6/u_msgpack_python-2.8.0-py2.py3-none-any.whl", hash = "sha256:1d853d33e78b72c4228a2025b4db28cda81214076e5b0422ed0ae1b1b2bb586a", size = 10590, upload-time = "2023-05-18T09:28:10.323Z" }, +] + +[[package]] +name = "ujson" +version = "5.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/d9/3f17e3c5773fb4941c68d9a37a47b1a79c9649d6c56aefbed87cc409d18a/ujson-5.11.0.tar.gz", hash = "sha256:e204ae6f909f099ba6b6b942131cee359ddda2b6e4ea39c12eb8b991fe2010e0", size = 7156583, upload-time = "2025-08-20T11:57:02.452Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/08/4518146f4984d112764b1dfa6fb7bad691c44a401adadaa5e23ccd930053/ujson-5.11.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:65724738c73645db88f70ba1f2e6fb678f913281804d5da2fd02c8c5839af302", size = 55462, upload-time = "2025-08-20T11:56:04.873Z" }, + { url = "https://files.pythonhosted.org/packages/29/37/2107b9a62168867a692654d8766b81bd2fd1e1ba13e2ec90555861e02b0c/ujson-5.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29113c003ca33ab71b1b480bde952fbab2a0b6b03a4ee4c3d71687cdcbd1a29d", size = 53246, upload-time = "2025-08-20T11:56:06.054Z" }, + { url = "https://files.pythonhosted.org/packages/9b/f8/25583c70f83788edbe3ca62ce6c1b79eff465d78dec5eb2b2b56b3e98b33/ujson-5.11.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c44c703842024d796b4c78542a6fcd5c3cb948b9fc2a73ee65b9c86a22ee3638", size = 57631, upload-time = "2025-08-20T11:56:07.374Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ca/19b3a632933a09d696f10dc1b0dfa1d692e65ad507d12340116ce4f67967/ujson-5.11.0-cp314-cp314-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:e750c436fb90edf85585f5c62a35b35082502383840962c6983403d1bd96a02c", size = 59877, upload-time = "2025-08-20T11:56:08.534Z" }, + { url = "https://files.pythonhosted.org/packages/55/7a/4572af5324ad4b2bfdd2321e898a527050290147b4ea337a79a0e4e87ec7/ujson-5.11.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f278b31a7c52eb0947b2db55a5133fbc46b6f0ef49972cd1a80843b72e135aba", size = 57363, upload-time = "2025-08-20T11:56:09.758Z" }, + { url = "https://files.pythonhosted.org/packages/7b/71/a2b8c19cf4e1efe53cf439cdf7198ac60ae15471d2f1040b490c1f0f831f/ujson-5.11.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ab2cb8351d976e788669c8281465d44d4e94413718af497b4e7342d7b2f78018", size = 1036394, upload-time = "2025-08-20T11:56:11.168Z" }, + { url = "https://files.pythonhosted.org/packages/7a/3e/7b98668cba3bb3735929c31b999b374ebc02c19dfa98dfebaeeb5c8597ca/ujson-5.11.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:090b4d11b380ae25453100b722d0609d5051ffe98f80ec52853ccf8249dfd840", size = 1195837, upload-time = "2025-08-20T11:56:12.6Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ea/8870f208c20b43571a5c409ebb2fe9b9dba5f494e9e60f9314ac01ea8f78/ujson-5.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:80017e870d882d5517d28995b62e4e518a894f932f1e242cbc802a2fd64d365c", size = 1088837, upload-time = "2025-08-20T11:56:14.15Z" }, + { url = "https://files.pythonhosted.org/packages/63/b6/c0e6607e37fa47929920a685a968c6b990a802dec65e9c5181e97845985d/ujson-5.11.0-cp314-cp314-win32.whl", hash = "sha256:1d663b96eb34c93392e9caae19c099ec4133ba21654b081956613327f0e973ac", size = 41022, upload-time = "2025-08-20T11:56:15.509Z" }, + { url = "https://files.pythonhosted.org/packages/4e/56/f4fe86b4c9000affd63e9219e59b222dc48b01c534533093e798bf617a7e/ujson-5.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:849e65b696f0d242833f1df4182096cedc50d414215d1371fca85c541fbff629", size = 45111, upload-time = "2025-08-20T11:56:16.597Z" }, + { url = "https://files.pythonhosted.org/packages/0a/f3/669437f0280308db4783b12a6d88c00730b394327d8334cc7a32ef218e64/ujson-5.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:e73df8648c9470af2b6a6bf5250d4744ad2cf3d774dcf8c6e31f018bdd04d764", size = 39682, upload-time = "2025-08-20T11:56:17.763Z" }, + { url = "https://files.pythonhosted.org/packages/6e/cd/e9809b064a89fe5c4184649adeb13c1b98652db3f8518980b04227358574/ujson-5.11.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:de6e88f62796372fba1de973c11138f197d3e0e1d80bcb2b8aae1e826096d433", size = 55759, upload-time = "2025-08-20T11:56:18.882Z" }, + { url = "https://files.pythonhosted.org/packages/1b/be/ae26a6321179ebbb3a2e2685b9007c71bcda41ad7a77bbbe164005e956fc/ujson-5.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:49e56ef8066f11b80d620985ae36869a3ff7e4b74c3b6129182ec5d1df0255f3", size = 53634, upload-time = "2025-08-20T11:56:20.012Z" }, + { url = "https://files.pythonhosted.org/packages/ae/e9/fb4a220ee6939db099f4cfeeae796ecb91e7584ad4d445d4ca7f994a9135/ujson-5.11.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1a325fd2c3a056cf6c8e023f74a0c478dd282a93141356ae7f16d5309f5ff823", size = 58547, upload-time = "2025-08-20T11:56:21.175Z" }, + { url = "https://files.pythonhosted.org/packages/bd/f8/fc4b952b8f5fea09ea3397a0bd0ad019e474b204cabcb947cead5d4d1ffc/ujson-5.11.0-cp314-cp314t-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:a0af6574fc1d9d53f4ff371f58c96673e6d988ed2b5bf666a6143c782fa007e9", size = 60489, upload-time = "2025-08-20T11:56:22.342Z" }, + { url = "https://files.pythonhosted.org/packages/2e/e5/af5491dfda4f8b77e24cf3da68ee0d1552f99a13e5c622f4cef1380925c3/ujson-5.11.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10f29e71ecf4ecd93a6610bd8efa8e7b6467454a363c3d6416db65de883eb076", size = 58035, upload-time = "2025-08-20T11:56:23.92Z" }, + { url = "https://files.pythonhosted.org/packages/c4/09/0945349dd41f25cc8c38d78ace49f14c5052c5bbb7257d2f466fa7bdb533/ujson-5.11.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1a0a9b76a89827a592656fe12e000cf4f12da9692f51a841a4a07aa4c7ecc41c", size = 1037212, upload-time = "2025-08-20T11:56:25.274Z" }, + { url = "https://files.pythonhosted.org/packages/49/44/8e04496acb3d5a1cbee3a54828d9652f67a37523efa3d3b18a347339680a/ujson-5.11.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:b16930f6a0753cdc7d637b33b4e8f10d5e351e1fb83872ba6375f1e87be39746", size = 1196500, upload-time = "2025-08-20T11:56:27.517Z" }, + { url = "https://files.pythonhosted.org/packages/64/ae/4bc825860d679a0f208a19af2f39206dfd804ace2403330fdc3170334a2f/ujson-5.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:04c41afc195fd477a59db3a84d5b83a871bd648ef371cf8c6f43072d89144eef", size = 1089487, upload-time = "2025-08-20T11:56:29.07Z" }, + { url = "https://files.pythonhosted.org/packages/30/ed/5a057199fb0a5deabe0957073a1c1c1c02a3e99476cd03daee98ea21fa57/ujson-5.11.0-cp314-cp314t-win32.whl", hash = "sha256:aa6d7a5e09217ff93234e050e3e380da62b084e26b9f2e277d2606406a2fc2e5", size = 41859, upload-time = "2025-08-20T11:56:30.495Z" }, + { url = "https://files.pythonhosted.org/packages/aa/03/b19c6176bdf1dc13ed84b886e99677a52764861b6cc023d5e7b6ebda249d/ujson-5.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:48055e1061c1bb1f79e75b4ac39e821f3f35a9b82de17fce92c3140149009bec", size = 46183, upload-time = "2025-08-20T11:56:31.574Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ca/a0413a3874b2dc1708b8796ca895bf363292f9c70b2e8ca482b7dbc0259d/ujson-5.11.0-cp314-cp314t-win_arm64.whl", hash = "sha256:1194b943e951092db611011cb8dbdb6cf94a3b816ed07906e14d3bc6ce0e90ab", size = 40264, upload-time = "2025-08-20T11:56:32.773Z" }, +] + +[[package]] +name = "uri-template" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/c7/0336f2bd0bcbada6ccef7aaa25e443c118a704f828a0620c6fa0207c1b64/uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7", size = 21678, upload-time = "2023-06-21T01:49:05.374Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363", size = 11140, upload-time = "2023-06-21T01:49:03.467Z" }, +] + +[[package]] +name = "urllib3" +version = "2.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, +] + +[[package]] +name = "validate-pyproject" +version = "0.24.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fastjsonschema" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d2/e5/dd60cbfc9b0701d8621c73e56c261142c1a01d1f74d0da30133bd272ecc6/validate_pyproject-0.24.1.tar.gz", hash = "sha256:e182fc51354add988e5bee6fc06ceb327832a78d921730fc618275e5b29e6b71", size = 117054, upload-time = "2025-03-21T21:05:32.623Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/39/6983dd79f01aaa4c75d9ffa550fa393f0c4c28f7ccd6956e4188c62cefbc/validate_pyproject-0.24.1-py3-none-any.whl", hash = "sha256:b7b05fa9117204c9c4606ab317acd095b18d1bfc78fb7dc8cc06f77d0582ca2d", size = 53732, upload-time = "2025-03-21T21:05:31.139Z" }, +] + +[[package]] +name = "virtualenv" +version = "20.36.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/aa/a3/4d310fa5f00863544e1d0f4de93bddec248499ccf97d4791bc3122c9d4f3/virtualenv-20.36.1.tar.gz", hash = "sha256:8befb5c81842c641f8ee658481e42641c68b5eab3521d8e092d18320902466ba", size = 6032239, upload-time = "2026-01-09T18:21:01.296Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/2a/dc2228b2888f51192c7dc766106cd475f1b768c10caaf9727659726f7391/virtualenv-20.36.1-py3-none-any.whl", hash = "sha256:575a8d6b124ef88f6f51d56d656132389f961062a9177016a50e4f507bbcc19f", size = 6008258, upload-time = "2026-01-09T18:20:59.425Z" }, +] + +[[package]] +name = "wasabi" +version = "1.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/f9/054e6e2f1071e963b5e746b48d1e3727470b2a490834d18ad92364929db3/wasabi-1.1.3.tar.gz", hash = "sha256:4bb3008f003809db0c3e28b4daf20906ea871a2bb43f9914197d540f4f2e0878", size = 30391, upload-time = "2024-05-31T16:56:18.99Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/7c/34330a89da55610daa5f245ddce5aab81244321101614751e7537f125133/wasabi-1.1.3-py3-none-any.whl", hash = "sha256:f76e16e8f7e79f8c4c8be49b4024ac725713ab10cd7f19350ad18a8e3f71728c", size = 27880, upload-time = "2024-05-31T16:56:16.699Z" }, +] + +[[package]] +name = "watson-developer-cloud" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "autobahn" }, + { name = "pyopenssl" }, + { name = "python-dateutil" }, + { name = "requests" }, + { name = "service-identity" }, + { name = "twisted" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e0/cd/6b24e38ce986a15ee481c1e6fac262910faf1a58200e4a3dcfafa0a9a78e/watson-developer-cloud-2.0.0.tar.gz", hash = "sha256:96cae91cd022f556055b27ff33033c3c42815e0781f8ddbb92eb5163a0cbf10d", size = 233994, upload-time = "2018-09-12T20:59:50.512Z" } + +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + +[[package]] +name = "weasel" +version = "0.4.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cloudpathlib" }, + { name = "confection" }, + { name = "packaging" }, + { name = "pydantic" }, + { name = "requests" }, + { name = "smart-open" }, + { name = "srsly" }, + { name = "typer-slim" }, + { name = "wasabi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/d7/edd9c24e60cf8e5de130aa2e8af3b01521f4d0216c371d01212f580d0d8e/weasel-0.4.3.tar.gz", hash = "sha256:f293d6174398e8f478c78481e00c503ee4b82ea7a3e6d0d6a01e46a6b1396845", size = 38733, upload-time = "2025-11-13T23:52:28.193Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/74/a148b41572656904a39dfcfed3f84dd1066014eed94e209223ae8e9d088d/weasel-0.4.3-py3-none-any.whl", hash = "sha256:08f65b5d0dbded4879e08a64882de9b9514753d9eaa4c4e2a576e33666ac12cf", size = 50757, upload-time = "2025-11-13T23:52:26.982Z" }, +] + +[[package]] +name = "webcolors" +version = "25.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/7a/eb316761ec35664ea5174709a68bbd3389de60d4a1ebab8808bfc264ed67/webcolors-25.10.0.tar.gz", hash = "sha256:62abae86504f66d0f6364c2a8520de4a0c47b80c03fc3a5f1815fedbef7c19bf", size = 53491, upload-time = "2025-10-31T07:51:03.977Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl", hash = "sha256:032c727334856fc0b968f63daa252a1ac93d33db2f5267756623c210e57a4f1d", size = 14905, upload-time = "2025-10-31T07:51:01.778Z" }, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" }, +] + +[[package]] +name = "websocket-client" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98", size = 70576, upload-time = "2025-10-07T21:16:36.495Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616, upload-time = "2025-10-07T21:16:34.951Z" }, +] + +[[package]] +name = "wheel" +version = "0.45.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c/wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", size = 107545, upload-time = "2024-11-23T00:18:23.513Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494, upload-time = "2024-11-23T00:18:21.207Z" }, +] + +[[package]] +name = "wrapt" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/49/2a/6de8a50cb435b7f42c46126cf1a54b2aab81784e74c8595c8e025e8f36d3/wrapt-2.0.1.tar.gz", hash = "sha256:9c9c635e78497cacb81e84f8b11b23e0aacac7a136e73b8e5b2109a1d9fc468f", size = 82040, upload-time = "2025-11-07T00:45:33.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/81/d08d83c102709258e7730d3cd25befd114c60e43ef3891d7e6877971c514/wrapt-2.0.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:5e53b428f65ece6d9dad23cb87e64506392b720a0b45076c05354d27a13351a1", size = 78290, upload-time = "2025-11-07T00:44:34.691Z" }, + { url = "https://files.pythonhosted.org/packages/f6/14/393afba2abb65677f313aa680ff0981e829626fed39b6a7e3ec807487790/wrapt-2.0.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ad3ee9d0f254851c71780966eb417ef8e72117155cff04821ab9b60549694a55", size = 61255, upload-time = "2025-11-07T00:44:35.762Z" }, + { url = "https://files.pythonhosted.org/packages/c4/10/a4a1f2fba205a9462e36e708ba37e5ac95f4987a0f1f8fd23f0bf1fc3b0f/wrapt-2.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d7b822c61ed04ee6ad64bc90d13368ad6eb094db54883b5dde2182f67a7f22c0", size = 61797, upload-time = "2025-11-07T00:44:37.22Z" }, + { url = "https://files.pythonhosted.org/packages/12/db/99ba5c37cf1c4fad35349174f1e38bd8d992340afc1ff27f526729b98986/wrapt-2.0.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7164a55f5e83a9a0b031d3ffab4d4e36bbec42e7025db560f225489fa929e509", size = 120470, upload-time = "2025-11-07T00:44:39.425Z" }, + { url = "https://files.pythonhosted.org/packages/30/3f/a1c8d2411eb826d695fc3395a431757331582907a0ec59afce8fe8712473/wrapt-2.0.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e60690ba71a57424c8d9ff28f8d006b7ad7772c22a4af432188572cd7fa004a1", size = 122851, upload-time = "2025-11-07T00:44:40.582Z" }, + { url = "https://files.pythonhosted.org/packages/b3/8d/72c74a63f201768d6a04a8845c7976f86be6f5ff4d74996c272cefc8dafc/wrapt-2.0.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3cd1a4bd9a7a619922a8557e1318232e7269b5fb69d4ba97b04d20450a6bf970", size = 117433, upload-time = "2025-11-07T00:44:38.313Z" }, + { url = "https://files.pythonhosted.org/packages/c7/5a/df37cf4042cb13b08256f8e27023e2f9b3d471d553376616591bb99bcb31/wrapt-2.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b4c2e3d777e38e913b8ce3a6257af72fb608f86a1df471cb1d4339755d0a807c", size = 121280, upload-time = "2025-11-07T00:44:41.69Z" }, + { url = "https://files.pythonhosted.org/packages/54/34/40d6bc89349f9931e1186ceb3e5fbd61d307fef814f09fbbac98ada6a0c8/wrapt-2.0.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3d366aa598d69416b5afedf1faa539fac40c1d80a42f6b236c88c73a3c8f2d41", size = 116343, upload-time = "2025-11-07T00:44:43.013Z" }, + { url = "https://files.pythonhosted.org/packages/70/66/81c3461adece09d20781dee17c2366fdf0cb8754738b521d221ca056d596/wrapt-2.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c235095d6d090aa903f1db61f892fffb779c1eaeb2a50e566b52001f7a0f66ed", size = 119650, upload-time = "2025-11-07T00:44:44.523Z" }, + { url = "https://files.pythonhosted.org/packages/46/3a/d0146db8be8761a9e388cc9cc1c312b36d583950ec91696f19bbbb44af5a/wrapt-2.0.1-cp314-cp314-win32.whl", hash = "sha256:bfb5539005259f8127ea9c885bdc231978c06b7a980e63a8a61c8c4c979719d0", size = 58701, upload-time = "2025-11-07T00:44:48.277Z" }, + { url = "https://files.pythonhosted.org/packages/1a/38/5359da9af7d64554be63e9046164bd4d8ff289a2dd365677d25ba3342c08/wrapt-2.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:4ae879acc449caa9ed43fc36ba08392b9412ee67941748d31d94e3cedb36628c", size = 60947, upload-time = "2025-11-07T00:44:46.086Z" }, + { url = "https://files.pythonhosted.org/packages/aa/3f/96db0619276a833842bf36343685fa04f987dd6e3037f314531a1e00492b/wrapt-2.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:8639b843c9efd84675f1e100ed9e99538ebea7297b62c4b45a7042edb84db03e", size = 59359, upload-time = "2025-11-07T00:44:47.164Z" }, + { url = "https://files.pythonhosted.org/packages/71/49/5f5d1e867bf2064bf3933bc6cf36ade23505f3902390e175e392173d36a2/wrapt-2.0.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:9219a1d946a9b32bb23ccae66bdb61e35c62773ce7ca6509ceea70f344656b7b", size = 82031, upload-time = "2025-11-07T00:44:49.4Z" }, + { url = "https://files.pythonhosted.org/packages/2b/89/0009a218d88db66ceb83921e5685e820e2c61b59bbbb1324ba65342668bc/wrapt-2.0.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:fa4184e74197af3adad3c889a1af95b53bb0466bced92ea99a0c014e48323eec", size = 62952, upload-time = "2025-11-07T00:44:50.74Z" }, + { url = "https://files.pythonhosted.org/packages/ae/18/9b968e920dd05d6e44bcc918a046d02afea0fb31b2f1c80ee4020f377cbe/wrapt-2.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c5ef2f2b8a53b7caee2f797ef166a390fef73979b15778a4a153e4b5fedce8fa", size = 63688, upload-time = "2025-11-07T00:44:52.248Z" }, + { url = "https://files.pythonhosted.org/packages/a6/7d/78bdcb75826725885d9ea26c49a03071b10c4c92da93edda612910f150e4/wrapt-2.0.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e042d653a4745be832d5aa190ff80ee4f02c34b21f4b785745eceacd0907b815", size = 152706, upload-time = "2025-11-07T00:44:54.613Z" }, + { url = "https://files.pythonhosted.org/packages/dd/77/cac1d46f47d32084a703df0d2d29d47e7eb2a7d19fa5cbca0e529ef57659/wrapt-2.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2afa23318136709c4b23d87d543b425c399887b4057936cd20386d5b1422b6fa", size = 158866, upload-time = "2025-11-07T00:44:55.79Z" }, + { url = "https://files.pythonhosted.org/packages/8a/11/b521406daa2421508903bf8d5e8b929216ec2af04839db31c0a2c525eee0/wrapt-2.0.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6c72328f668cf4c503ffcf9434c2b71fdd624345ced7941bc6693e61bbe36bef", size = 146148, upload-time = "2025-11-07T00:44:53.388Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c0/340b272bed297baa7c9ce0c98ef7017d9c035a17a6a71dce3184b8382da2/wrapt-2.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3793ac154afb0e5b45d1233cb94d354ef7a983708cc3bb12563853b1d8d53747", size = 155737, upload-time = "2025-11-07T00:44:56.971Z" }, + { url = "https://files.pythonhosted.org/packages/f3/93/bfcb1fb2bdf186e9c2883a4d1ab45ab099c79cbf8f4e70ea453811fa3ea7/wrapt-2.0.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fec0d993ecba3991645b4857837277469c8cc4c554a7e24d064d1ca291cfb81f", size = 144451, upload-time = "2025-11-07T00:44:58.515Z" }, + { url = "https://files.pythonhosted.org/packages/d2/6b/dca504fb18d971139d232652656180e3bd57120e1193d9a5899c3c0b7cdd/wrapt-2.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:949520bccc1fa227274da7d03bf238be15389cd94e32e4297b92337df9b7a349", size = 150353, upload-time = "2025-11-07T00:44:59.753Z" }, + { url = "https://files.pythonhosted.org/packages/1d/f6/a1de4bd3653afdf91d250ca5c721ee51195df2b61a4603d4b373aa804d1d/wrapt-2.0.1-cp314-cp314t-win32.whl", hash = "sha256:be9e84e91d6497ba62594158d3d31ec0486c60055c49179edc51ee43d095f79c", size = 60609, upload-time = "2025-11-07T00:45:03.315Z" }, + { url = "https://files.pythonhosted.org/packages/01/3a/07cd60a9d26fe73efead61c7830af975dfdba8537632d410462672e4432b/wrapt-2.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:61c4956171c7434634401db448371277d07032a81cc21c599c22953374781395", size = 64038, upload-time = "2025-11-07T00:45:00.948Z" }, + { url = "https://files.pythonhosted.org/packages/41/99/8a06b8e17dddbf321325ae4eb12465804120f699cd1b8a355718300c62da/wrapt-2.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:35cdbd478607036fee40273be8ed54a451f5f23121bd9d4be515158f9498f7ad", size = 60634, upload-time = "2025-11-07T00:45:02.087Z" }, + { url = "https://files.pythonhosted.org/packages/15/d1/b51471c11592ff9c012bd3e2f7334a6ff2f42a7aed2caffcf0bdddc9cb89/wrapt-2.0.1-py3-none-any.whl", hash = "sha256:4d2ce1bf1a48c5277d7969259232b57645aae5686dba1eaeade39442277afbca", size = 44046, upload-time = "2025-11-07T00:45:32.116Z" }, +] + +[[package]] +name = "zope-interface" +version = "8.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/a4/77daa5ba398996d16bb43fc721599d27d03eae68fe3c799de1963c72e228/zope_interface-8.2.tar.gz", hash = "sha256:afb20c371a601d261b4f6edb53c3c418c249db1a9717b0baafc9a9bb39ba1224", size = 254019, upload-time = "2026-01-09T07:51:07.253Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/da/3c89de3917751446728b8898b4d53318bc2f8f6bf8196e150a063c59905e/zope_interface-8.2-cp314-cp314-macosx_10_9_x86_64.whl", hash = "sha256:46c7e4e8cbc698398a67e56ca985d19cb92365b4aafbeb6a712e8c101090f4cb", size = 209223, upload-time = "2026-01-09T08:05:36.449Z" }, + { url = "https://files.pythonhosted.org/packages/00/7f/62d00ec53f0a6e5df0c984781e6f3999ed265129c4c3413df8128d1e0207/zope_interface-8.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a87fc7517f825a97ff4a4ca4c8a950593c59e0f8e7bfe1b6f898a38d5ba9f9cf", size = 209366, upload-time = "2026-01-09T08:05:38.197Z" }, + { url = "https://files.pythonhosted.org/packages/ef/a2/f241986315174be8e00aabecfc2153cf8029c1327cab8ed53a9d979d7e08/zope_interface-8.2-cp314-cp314-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:ccf52f7d44d669203c2096c1a0c2c15d52e36b2e7a9413df50f48392c7d4d080", size = 261037, upload-time = "2026-01-09T08:05:39.568Z" }, + { url = "https://files.pythonhosted.org/packages/02/cc/b321c51d6936ede296a1b8860cf173bee2928357fe1fff7f97234899173f/zope_interface-8.2-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:aae807efc7bd26302eb2fea05cd6de7d59269ed6ae23a6de1ee47add6de99b8c", size = 264219, upload-time = "2026-01-09T08:05:41.624Z" }, + { url = "https://files.pythonhosted.org/packages/ab/fb/5f5e7b40a2f4efd873fe173624795ca47eaa22e29051270c981361b45209/zope_interface-8.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:05a0e42d6d830f547e114de2e7cd15750dc6c0c78f8138e6c5035e51ddfff37c", size = 264390, upload-time = "2026-01-09T08:05:42.936Z" }, + { url = "https://files.pythonhosted.org/packages/f9/82/3f2bc594370bc3abd58e5f9085d263bf682a222f059ed46275cde0570810/zope_interface-8.2-cp314-cp314-win_amd64.whl", hash = "sha256:561ce42390bee90bae51cf1c012902a8033b2aaefbd0deed81e877562a116d48", size = 212585, upload-time = "2026-01-09T08:05:44.419Z" }, +]