{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Jupyter Notebook\n", "\n", "## Jupyter Notebookとは\n", "\n", "[Jupyter](https://jupyter.org/) Notebookは、プログラムとその実行結果、[Markdown](https://ja.wikipedia.org/wiki/Markdown)形式のドキュメント、[LaTeX](https://ja.wikipedia.org/wiki/LaTeX)形式([MathJax](https://www.mathjax.org/))の数式、図表などをまとめて記述・格納できるウェブアプリケーションである。データ分析や機械学習の実行過程の「ノート」をつける用途だけでなく、ブラウザ上でお手軽にプログラミングを体験する環境としても広く普及している。\n", "\n", "例えば、物理の解説とその実験を行うプログラム、その実行結果をまとめたノートを作ることができる。\n", "\n", "![Jupyter Notebookの例](assets/image/jupyter-notebook2.png)\n", "\n", "Jupyterの前身である[IPython Notebook](https://ipython.org/notebook.html)は、[Python](https://www.python.org/)のインタラクティブなシェルである[IPython](https://ipython.org/)のプロジェクトとして開発が進められ、研究者や開発者から急速な支持を集めた。プログラミング言語に依存した部分(カーネルと呼ばれる)を分離し、Python以外の言語のサポートも進んだことから、IPython NotebookはJupyterプロジェクトにスピンオフされた。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Google Colaboratory\n", "\n", "[Google Colaboratory](https://colab.research.google.com/)はGoogleが提供するクラウド実行型のJupyter環境である。後述する制限はあるものの、Googleアカウントがあれば無料で利用できる。詳しくは、[Colaboratory へようこそ(公式ドキュメント)](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)を参照のこと。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Google Colaboratoryを開始する\n", "\n", "Googleアカウントにログインしたブラウザで、[https://colab.research.google.com/](https://colab.research.google.com/) にアクセスすればよい。以下の画面で「ノートブックを新規作成」を選ぶ。\n", "\n", "![新しいノートブックの作成](assets/image/colab-new.png)\n", "\n", "すると、以下の画面のように新しいノートブックが作成される。\n", "\n", "![新しく作成されたノートブック](assets/image/colab-clean.png)\n", "\n", "### セルの操作\n", "\n", "ノートブックはプログラムやテキストを記述する**セル**と呼ばれるブロックの集まりで構成されている。セルはプログラムを記述し、その実行結果を保持する**コードセル**と、文章を記述する**テキストセル**の2種類に大別される。新しく作成されたセルはコードセルとして動作する。\n", "\n", "Pythonのコードを実行するには、セルにプログラムを入力し、`⌘/Ctrl` + `Enter`キーを押す。すると、Googleのクラウドサーバ上でプログラムが実行され、その実行結果がブラウザに表示される。ここでは、以下のプログラムを入力・実行し、その出力が表示されている。\n", "\n", "```\n", "print('Hello, World!')\n", "```\n", "\n", "![コードを実行](assets/image/colab-code.png)\n", "\n", "テキストセルを作成するには、「挿入」メニューからテキストセルを追加するか、いったん作成されたコードセルを選択して、`⌘/Ctrl` + `m` -> `m`を押す。\n", "\n", "![テキストセルの挿入](assets/image/colab-insert-text.png)\n", "\n", "テキストセルでは[Markdown記法](https://colab.research.google.com/notebooks/markdown_guide.ipynb)を用いることができるほか、LaTeX形式で数式を記述できる。\n", "\n", "![テキストセルの編集](assets/image/colab-text.png)\n", "\n", "セルの位置の移動や出力の消去などは、メニューから行える。その他、Google Colaboratoryで便利なキー操作を以下に挙げる。なお、このキー操作は「ツール」メニューの「キーボード ショートカット」から一覧を閲覧したり、キー割り当てを変更できる。\n", "\n", "+ カーソル(十字)キー: 選択セルを変更\n", "+ `⌘/Ctrl` + `Enter`: 実行(コードセル)、または確定(テキストセル)\n", "+ `⌘/Ctrl` + `m` -> `i`: 実行を中断\n", "+ `⌘/Ctrl` + `m` -> `a`: 上にコードセルを追加\n", "+ `⌘/Ctrl` + `m` -> `b`: 下にコードセルを追加\n", "+ `⌘/Ctrl` + `m` -> `d`: セルを削除\n", "+ `⌘/Ctrl` + `m` -> `y`: コードセルに変更\n", "+ `⌘/Ctrl` + `m` -> `m`: テキストセルに変更\n", "+ `⌘/Ctrl` + `m` -> `k`: セルを一つ上に移動\n", "+ `⌘/Ctrl` + `m` -> `j`: セルを一つ下に移動\n", "\n", "### ノートブックの保存、ダウンロード、アップロード\n", "\n", "左上の名前(デフォルトでは\"Untitled?.ipynb\"となっている)の部分をクリックすることで、保存するファイル名を変更できる。\n", "\n", "![ファイル名の変更](assets/image/colab-rename.png)\n", "\n", "作成したノートブックは「ファイル」->「.ipynb をダウンロード」をクリックすることで、ダウンロードできる。保存されるファイルの拡張子は\".ipynb\"である。\n", "\n", "![ノートブックのダウンロード](assets/image/colab-save.png)\n", "\n", "逆に、手元にある.ipynbファイルをアップロードして、Google Colaboratory上で閲覧したり、動かすこともできる。「ファイル」->「ノートブックをアップロード」をクリックし、以下の画面になったらアップロードしたいファイルをドラッグ・ドロップすればよい。\n", "\n", "![ノートブックのアップロード](assets/image/colab-upload.png)\n", "\n", "\n", "### 無料版Google Colaboratoryの制限\n", "\n", "Google Colaboratoryで新しいノートブックを開くと、プログラムの実行環境であるインスタンスが立ち上がる。そのインスタンスは**立ち上げから12時間で強制終了**となる。また、Colaboratoryにアクセスしているブラウザを閉じるなど、インスタンスとのセッションが切れた状態が90分続いても、強制終了となる。ただ、ノートブックそのものはGoogle Drive上に保存され続けるので、新たにノートブックを開いてインスタンスを立ち上げ直せば、再度実行することができる。プログラミングや機械学習の勉強用途であれば、無料版のGoogle Colaboratoryで十分と思われる。" ] }, { "cell_type": "markdown", "metadata": { "jp-MarkdownHeadingCollapsed": true, "tags": [] }, "source": [ "## 自分のパソコンにJupyterをインストールする\n", "\n", "Jupyterを自分のパソコンにインストールして動作させることもできる。この場合、Google Colaboratoryでノートブックを実行するときのような時間制限はない。Windows 10の場合、以下の2つの方法が現実的と思われる。\n", "\n", "1. [Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/ja-jp/windows/wsl/about)上に[Ubuntu](https://ubuntu.com/)をインストールし、さらに[conda](https://www.anaconda.com/products/individual)をインストール\n", "1. Windows版の[Anaconda](https://www.anaconda.com/)をインストールする\n", "\n", "1.はインストールに手間がかかるが、Linux環境上でJupyterを動作させることができる。ネット上の多くの解説はLinux系の環境を前提としているため、こちらの方が環境の違いで悩まされずに済む。2.はお手軽にインストールできるが、コードセルでWindowsのコマンドしか実行できず、ネット上の解説の通りにならないことがある。また、デフォルトの文字コードが UTF-8 ではなく、Shift_JIS (CP932) になることにも注意が必要である。\n", "\n", "自分のパソコンにJupyterをインストールした場合は、Jupyter Notebookの進化版であるJupyter Labを使うことができる。\n", "\n", "![Jupyter Lab](assets/image/jupyter-lab.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Jupyter (IPython) の便利機能" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 入力や出力の参照" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "x, y = 10, 5" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "15" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x + y" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x - y" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "50" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x * y" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.0" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x / y" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2.0, 50, 5)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "_, __, ___" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'x + y'" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "In[2]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "15" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Out[2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### シェルコマンドの実行" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "prefecture.txt\t prefecture3.txt requirements.txt\n", "prefecture2.txt prefecture4.txt tokyo-covid.txt\n" ] } ], "source": [ "!ls *.txt" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "東京 とうきょう Tokyo\n", "神奈川 かながわ Kanagawa\n", "千葉 ちば Chiba\n", "埼玉 さいたま Saitama\n" ] } ], "source": [ "!cat prefecture.txt" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "とうきょう\n", "かながわ\n", "ちば\n", "さいたま\n" ] } ], "source": [ "!cut -f2 -d\" \" prefecture.txt" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "yomi = !cut -f2 -d\" \" prefecture.txt" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['とうきょう', 'かながわ', 'ちば', 'さいたま']" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "yomi" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### イントロスペクション" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\u001b[0;31mDocstring:\u001b[0m\n", "print(value, ..., sep=' ', end='\\n', file=sys.stdout, flush=False)\n", "\n", "Prints the values to a stream, or to sys.stdout by default.\n", "Optional keyword arguments:\n", "file: a file-like object (stream); defaults to the current sys.stdout.\n", "sep: string inserted between values, default a space.\n", "end: string appended after the last value, default a newline.\n", "flush: whether to forcibly flush the stream.\n", "\u001b[0;31mType:\u001b[0m builtin_function_or_method\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "print?" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\u001b[0;31mDocstring:\u001b[0m\n", "S.format(*args, **kwargs) -> str\n", "\n", "Return a formatted version of S, using substitutions from args and kwargs.\n", "The substitutions are identified by braces ('{' and '}').\n", "\u001b[0;31mType:\u001b[0m method_descriptor\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "str.format?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 実行速度の計測" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "11.1 µs ± 674 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)\n" ] } ], "source": [ "%timeit sum(range(1000))" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "24.3 µs ± 1.01 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n" ] } ], "source": [ "%timeit sum([x for x in range(1000)])" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "31 µs ± 298 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n" ] } ], "source": [ "%timeit sum(x for x in range(1000))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "31.4 µs ± 288 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n" ] } ], "source": [ "%%timeit\n", "s = 0\n", "for i in range(1000):\n", " s += i" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### デバッグ" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "def count_upper(s):\n", " n = 0\n", " for c in s:\n", " if c.isupper():\n", " ++n\n", " return n" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "count_upper('New York')" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Automatic pdb calling has been turned ON\n" ] } ], "source": [ "%pdb on" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "def count_upper(s):\n", " breakpoint()\n", " n = 0\n", " for c in s:\n", " if c.isupper():\n", " ++n\n", " return n" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "> \u001b[0;32m\u001b[0m(3)\u001b[0;36mcount_upper\u001b[0;34m()\u001b[0m\n", "\u001b[0;32m 1 \u001b[0;31m\u001b[0;32mdef\u001b[0m \u001b[0mcount_upper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 2 \u001b[0;31m \u001b[0mbreakpoint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m----> 3 \u001b[0;31m \u001b[0mn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 4 \u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 5 \u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misupper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\n" ] }, { "name": "stdin", "output_type": "stream", "text": [ "ipdb> n\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "> \u001b[0;32m\u001b[0m(4)\u001b[0;36mcount_upper\u001b[0;34m()\u001b[0m\n", "\u001b[0;32m 2 \u001b[0;31m \u001b[0mbreakpoint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 3 \u001b[0;31m \u001b[0mn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m----> 4 \u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 5 \u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misupper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 6 \u001b[0;31m \u001b[0;34m+\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\n" ] }, { "name": "stdin", "output_type": "stream", "text": [ "ipdb> n\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "> \u001b[0;32m\u001b[0m(5)\u001b[0;36mcount_upper\u001b[0;34m()\u001b[0m\n", "\u001b[0;32m 3 \u001b[0;31m \u001b[0mn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 4 \u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m----> 5 \u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misupper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 6 \u001b[0;31m \u001b[0;34m+\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 7 \u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\n" ] }, { "name": "stdin", "output_type": "stream", "text": [ "ipdb> n\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "> \u001b[0;32m\u001b[0m(6)\u001b[0;36mcount_upper\u001b[0;34m()\u001b[0m\n", "\u001b[0;32m 3 \u001b[0;31m \u001b[0mn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 4 \u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 5 \u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misupper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m----> 6 \u001b[0;31m \u001b[0;34m+\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 7 \u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\n" ] }, { "name": "stdin", "output_type": "stream", "text": [ "ipdb> n\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "> \u001b[0;32m\u001b[0m(4)\u001b[0;36mcount_upper\u001b[0;34m()\u001b[0m\n", "\u001b[0;32m 2 \u001b[0;31m \u001b[0mbreakpoint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 3 \u001b[0;31m \u001b[0mn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m----> 4 \u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 5 \u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misupper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 6 \u001b[0;31m \u001b[0;34m+\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\n" ] }, { "name": "stdin", "output_type": "stream", "text": [ "ipdb> p n\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "0\n" ] }, { "name": "stdin", "output_type": "stream", "text": [ "ipdb> quit\n" ] }, { "ename": "BdbQuit", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mBdbQuit\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mcount_upper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'New York'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m\u001b[0m in \u001b[0;36mcount_upper\u001b[0;34m(s)\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mbreakpoint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misupper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m+\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m\u001b[0m in \u001b[0;36mcount_upper\u001b[0;34m(s)\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mbreakpoint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mc\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misupper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m+\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/lib/python3.8/bdb.py\u001b[0m in \u001b[0;36mtrace_dispatch\u001b[0;34m(self, frame, event, arg)\u001b[0m\n\u001b[1;32m 86\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;31m# None\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 87\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mevent\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'line'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 88\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdispatch_line\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 89\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mevent\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'call'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 90\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdispatch_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/lib/python3.8/bdb.py\u001b[0m in \u001b[0;36mdispatch_line\u001b[0;34m(self, frame)\u001b[0m\n\u001b[1;32m 111\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstop_here\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbreak_here\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 112\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0muser_line\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 113\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquitting\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mBdbQuit\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 114\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrace_dispatch\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 115\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mBdbQuit\u001b[0m: " ] }, { "name": "stdout", "output_type": "stream", "text": [ "> \u001b[0;32m/home/okazaki/anaconda3/lib/python3.8/bdb.py\u001b[0m(113)\u001b[0;36mdispatch_line\u001b[0;34m()\u001b[0m\n", "\u001b[0;32m 111 \u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstop_here\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbreak_here\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 112 \u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0muser_line\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m--> 113 \u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquitting\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mBdbQuit\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 114 \u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrace_dispatch\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 115 \u001b[0;31m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\n" ] }, { "name": "stdin", "output_type": "stream", "text": [ "ipdb> quit\n" ] } ], "source": [ "count_upper('New York')" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum(1 for c in 'New York' if c.isupper())" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "remove-cell" ] }, "source": [ "---\n", "\n", "[Python早見帳](https://chokkan.github.io/python/) © Copyright 2020-2024 by [岡崎 直観 (Naoaki Okazaki)](https://www.chokkan.org/). この作品はクリエイティブ・コモンズ 表示 - 非営利 - 改変禁止 4.0 国際 ライセンスの下に提供されています。\"クリエイティブ・コモンズ・ライセンス\"" ] } ], "metadata": { "@context": { "CreativeWork": "http://schema.org/CreativeWork", "Organization": "http://schema.org/Organization", "Person": "http://schema.org/Person", "author": "http://schema.org/author", "copyrightHolder": "http://schema.org/copyrightHolder", "copyrightYear": "http://schema.org/copyrightYear", "license": "http://schema.org/license", "name": "http://schema.org/name", "title": "http://schema.org/name", "url": "http://schema.org/url" }, "@type": "CreativeWork", "author": [ { "@type": "Person", "name": "Naoaki Okazaki", "url": "https://www.chokkan.org/" } ], "copyrightHolder": [ { "@type": "Person", "name": "Naoaki Okazaki", "url": "https://www.chokkan.org/" } ], "copyrightYear": 2024, "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.8.10" }, "license": "https://creativecommons.org/licenses/by-nc-nd/4.0/deed.ja", "title": "Python早見帳" }, "nbformat": 4, "nbformat_minor": 4 }