{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction to Developing with Jupyter Notebooks\n", "#### Interactive Jupyter Notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook provides an introduction to Jupyter Notebooks, including an overview of the notebook interface and basic programing concepts. This notebook was created by Becky Vandewalle based on prior work by Dandong Yin." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Notebook Outline:\n", "- [Introduction](#intro)\n", "- [Setup](#setup) (run this first!)\n", "- [The Jupyter Ecosystem](#eco)\n", " - [Explore the Interface](#explore)\n", " - [Command Mode and Edit Mode](#cmd_and_edit)\n", " - [Common Keyboard Shortcuts](#shortcuts)\n", " - [Markdown](#markdown)\n", " - [HTML](#html)\n", "- [Using command-line tools](#command_line)\n", " - [Linux file system basics](#linux_fs)\n", " - [Permission control](#permissions)\n", "- [Next Steps](#next)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## Introduction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Jupyter Notebook interface makes interactive computing easily accessible. It contains a web interface for dynamic programming and visualization and stores all the content in a file for reproducibility.\n", ">General documentation: https://jupyter.org/documentation\n", "
Introduction to the Jupyter Notebook: https://jupyter-notebook.readthedocs.io/en/stable/notebook.html\n", "
Jupyter Notebook Basics: https://jupyter-notebook.readthedocs.io/en/stable/examples/Notebook/Notebook%20Basics.html\n", "\n", "This notebook is an extension of the [Jupyter Notebook QuickStart Notebook](Jupyter_Notebook_QuickStart_p3.ipynb). While there will be some overlap, this Notebook includes much more detail on Notebook features." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## Setup\n", "Run this cell for the rest of the Notebook to work!" ] }, { "cell_type": "code", "execution_count": 145, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# import required libraries\n", "\n", "import os\n", "from IPython.display import Image\n", "\n", "\n", "\n", "#execfile(os.path.join('/share/pyintro_resources/','highlight_feats.py'))\n", "# Python 2 -> Python 3\n", "\n", "filename = 'pyintro_resources/highlight_feats.py'\n", "exec(compile(open(filename, \"rb\").read(), filename, 'exec'))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## The Jupyter Ecosystem" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Jupyter project has a variety of features that support and extend Jupyter Notebook functionality. Here we will focus on the Jupyter Notebook, which makes use of [IPython](https://ipython.readthedocs.io/en/stable/) for interactive scripting. Other programming languages can be used in a Jupyter Notebook through [kernels](https://jupyter.readthedocs.io/en/latest/projects/kernels.html) (IPython is a kernel maintained by Project Jupyter). Finally, [Widgets](https://ipywidgets.readthedocs.io/en/stable/examples/Widget%20Basics.html) can be used to create a graphic interface for interacting with scripts and displaying results. This is just a small part of the Jupyter Ecosystem - there is more to explore in future notebooks!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "### Explore the Interface" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Two key areas for working with Jupyter Notebooks are the Notebook Dashboard, where you work with files, folder, and notebooks, and the Notebook Interface itself. Check out some important features of the user interface using the widget below." ] }, { "cell_type": "code", "execution_count": 146, "metadata": { "scrolled": false }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "4052966abfd94c09a4ab947ef780dd4e", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Dropdown(description='Section:', options=('Select', 'Notebook Dashboard', 'Notebook', 'Notebook Cells'), value…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "4a251a13425a4d5580efde3186057990", "version_major": 2, "version_minor": 0 }, "text/plain": [ "RadioButtons(description='Features:', options=(), value=None)" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "91c12df71a6a4a619bb064aa82f0d353", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HTML(value='')" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "cae958b8a3e445f692442976d6048598", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Select a feature to learn more\n", "\n", "hl_feats()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "### Command Mode and Edit Mode" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are two modes that are used when working with a Jupyter Notebook, Command Mode and Edit Mode:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Command Mode:\n", "- Cell has a grey background\n", "- You can edit features of the notebook as a whole, but not text within the selected cell\n", "\n", "Below is a cell in Command Mode:" ] }, { "cell_type": "code", "execution_count": 147, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 147, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Image(os.path.join('pyintro_resources/img', 'command_mode.png'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Edit Mode:\n", "- Cell has a blue border\n", "- You can enter text at the cursor position\n", "\n", "Below is a cell in Edit Mode. Note the cursor after the end of `world\")`." ] }, { "cell_type": "code", "execution_count": 148, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 148, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Image(os.path.join('pyintro_resources/img/edit_mode.png'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Switching between Command and Edit modes\n", "

Clicking in a cell currently displayed with a grey box (a code cell) will take you to Edit Mode. Double clicking on a cell without a grey box (more on [Markdown cells](#markdown) later) will take you to Command Mode and clicking once more will take you to Edit Mode. Pressing Esc or clicking outside the cell while in Edit Mode will switch to Command Mode." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "### Common Keyboard Shortcuts" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A variety of keyboard shortcuts make editing a Notebook more efficient. Check the Command Palette (first item in the view tab) if you forget one. Also, keep in mind that these shortcuts are mode sensitive - they will often work differently in Command Mode vs Edit Mode. Try some of these out in the next few cells!\n", "\n", "The Command Palette is highlighted below:" ] }, { "cell_type": "code", "execution_count": 149, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 149, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Image(os.path.join('pyintro_resources/img', 'tool_bar_shortcut.png'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Save:\n", "

\n", "You can save the notebook by hitting s in Command Mode, by clicking the Save button on the toolbar, or by File -> Save and Checkpoint." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Run Cell:\n", "

\n", "You can run a cell by hitting Enter (or Shift+Return) in Command or Edit Mode. If the cell produces output, that will typically be displayed directly below the cell." ] }, { "cell_type": "code", "execution_count": 150, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "You ran this cell!\n" ] } ], "source": [ "# run me!\n", "\n", "print('You ran this cell!')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Inserting a Cell Above the Current Cell:\n", "

\n", "You can insert a cell above the currently selected cell by hitting a in Command Mode." ] }, { "cell_type": "code", "execution_count": 151, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# try to insert a new cell above this one" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Inserting a Cell Below the Current Cell:\n", "

\n", "You can insert a cell above the currently selected cell by hitting b in Command Mode." ] }, { "cell_type": "code", "execution_count": 152, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# try to insert a new cell below this one" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Copy and Paste a Cell:\n", "

\n", "You can copy a cell by hitting c in Command Mode and paste below the current cell by hitting v or paste above the current cell by hitting Shift+v in Command Mode." ] }, { "cell_type": "code", "execution_count": 153, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# Copy this cell - place the new cell --Above-- this one" ] }, { "cell_type": "code", "execution_count": 154, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# Copy this cell - place the new cell --Below-- this one" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Delete a Cell:\n", "\n", "You can delete a cell by hitting d twice in Command Mode." ] }, { "cell_type": "code", "execution_count": 155, "metadata": { "scrolled": true }, "outputs": [], "source": [ "## Delete me!" ] }, { "cell_type": "code", "execution_count": 156, "metadata": { "scrolled": true }, "outputs": [], "source": [ "## Delete me too!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Change a Cell Mode from Code to Markdown:\n", "\n", "You can change a cell from code to markdown by hitting m in Command Mode. The cell below is a code cell - practice changing this cell to a markdown cell." ] }, { "cell_type": "code", "execution_count": 157, "metadata": { "scrolled": true }, "outputs": [], "source": [ "#### Change me to Markdown!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Change a Cell Mode from Markdown to Code:\n", "\n", "You can change a cell from code to markdown by hitting y in Command Mode (don't forget to double click on a Markdown Cell to edit it). The cell below is a markdown cell - practice changing this cell to a code cell (and run it)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Change me to Code!\n", "\n", "print ('hello')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using Tab:\n", "\n", "The Tab key is good for giving coding suggestions. If you have a partially complete keyword or object name, Tab will suggest ways to complete the word. If you have a function, pressing Tab within the parentheses will show arguments." ] }, { "cell_type": "code", "execution_count": 158, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "# first, remove the pound sign (#) before 'pr' below to uncomment the line\n", "# place the cursor after the 'r' and press tab to see possible words starting with 'pr'\n", "# !!note, running this cell with only 'pr' in the next line will raise an error because 'pr' is not complete!\n", "\n", "#pr\n", "\n", "# place the cursor in the parentheses and press tab to see arguments\n", "\n", "print()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "### Markdown" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Markdown is a popular markup language for simple text formatting. This language is used in Markdown cells." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Headings:\n", "

\n", "Headings are useful to organize text. Place one or multiple # signs in front of text at the beginning of a line to create a heading. Double click the next (markdown) cell to see how these headings are created." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Big\n", "## Medium\n", "### Small\n", "#### Smaller\n", "##### Tiny\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lists:\n", "

\n", "Lists are very useful for organizing information. Markdown supports both numbered and bulleted lists. Double click the next two (markdown) cells to see how these lists are created. Note that the actual numbers entered in the numbered list are changed to be in order! Also, although you can continue to indent in a bulleted list, there are only so many symbols used." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Numbered List:\n", "1. Thing one\n", "4. Thing two\n", "3. Thing three\n", "\n", "\n", "2. Thing two again\n", "4. Thing three again" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bulleted List:\n", "- Thing one\n", " - Thing one a\n", "- Thing two\n", " - Thing two a\n", " - Thing two double a\n", " - Too many things\n", "- Thing three" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Links:\n", "

\n", "Links help for referencing information. Create a link using square brackets followed by parentheses. You can link to a website, another file or notebook in your Notebook Dashboard, or even to another section of the current notebook. Double click the next (markdown) cell to see how these links are created." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[link to the Cybergis Center website](https://cybergis.illinois.edu/)\n", "
[link to an image](img/Jupyter_dashboard.png) (note path is relative to this notebook)\n", "
[link to a Markdown cell by header](#Markdown) (type heading after # for internal link)\n", "
[link to a Markdown cell by section id](#markdown) (link to HTML anchor in cell above Markdown heading)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Equations:\n", "

\n", "Equations are written using LaTeX. Surrounding the equation with one dollar sign ($) on each end makes it inline. With two dollar signs, the equation is displayed on its own line. Double click the next (markdown) cell to see how these equations are created. Some symbols are found on the keyboard, like +, ^, and *. Others are formed using a slash followed by a text tag, like \\times.\n", ">See a list of LaTeX math symbols [here](https://artofproblemsolving.com/wiki/index.php/LaTeX:Symbols)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here is an inline equation $\\int^a_b \\frac{1}{3}x^3$ in the line. $$\\int^a_b \\frac{1}{3}x^3$$ The second equation is not inline." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "### HTML" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "HTML tags can be used to adjust text formatting. Double click the next (markdown) cell to see some commonly used tags." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "bold text, italic text\n", "

(line breaks above and below)\n", "

\n", "text color, \n", "text size, \n", "text font " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## Using command-line tools" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In a Jupyter Notebook, a cell starts with \"!\" is recognized as a Bash command. Below are some common commands:\n", "

\n", "- `ls`: list files and directories\n", "- `cd`: change current working directory\n", "- `pwd`: print current working directory\n", "- `head`: peek the first (10) lines of a file\n", "- `tail`: peek the last (10) lines of a file\n", "- `wc`: count a file (lines, words, etc.)\n", "- `file`: check the type of a file\n", "\n", "Try out a few commands below!" ] }, { "cell_type": "code", "execution_count": 159, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "'ls' is not recognized as an internal or external command,\n", "operable program or batch file.\n" ] } ], "source": [ "!ls" ] }, { "cell_type": "code", "execution_count": 160, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "'pwd' is not recognized as an internal or external command,\n", "operable program or batch file.\n" ] } ], "source": [ "!pwd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "### Linux file system basics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Linux file system structure is set up like a tree. The root, /, is the top level container for all the other files and folders (called directories). Folders can be nested inside other folders. To show that one folder is within another, a slash separates the two folders, like: parent_folder/child_folder. This also is the case for files in a folder: myfolder/text.txt shows that the file text.txt is within myfolder.\n", "\n", "When you printed the current directory above using the pwd command, you should see a path starting with several folders (home, jovyan, and work)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "### Permission control" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Any file or directory in the Linux file system has a set of permissions.\n", "\n", "There are 3 kinds of permissions (read, write, and execute) and 3 kinds of users (owner, group, and others). When you check file permissions, `r` is short for read, `w` for write and `x` for execute. Each set of three slots indicates whether these permissions are for the file `Owner`, `Group`, or `Others`.\n", "\n", "![](http://linuxcommand.org/images/file_permissions.png)\n", "\n", "\n", "Check permissions: `ls -l`\n", "\n", "Change permissions (for files you own): `chmod`\n", "\n", "Change ownership (for files you own): `chown`\n", "\n", "Change group (for files you own): `chgrp`\n", "\n", ">For more info: http://linuxcommand.org/lc3_lts0090.php" ] }, { "cell_type": "code", "execution_count": 161, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "'ls' is not recognized as an internal or external command,\n", "operable program or batch file.\n" ] } ], "source": [ "!ls -l test_file.txt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## Next Steps" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that you are more familiar with the Jupyter Notebook environment, check out the Intro to Python Programming Notebook for an overview of programming with Python!" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_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.2" } }, "nbformat": 4, "nbformat_minor": 2 }