{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Python 入門\n", "\n", "この章では、プログラミング言語の一つであるPythonの基本的な使い方について述べる。\n", "\n", "プログラミングスキルを上達させるコツは、たくさんのコードを書くことである。\n", "以下に示すコードは全てColabで実行させ、その意味を考えること。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "この章ではたくさんのコードを例示する。\n", "コードは基本的には「セル」の中に表示されており、出力がそのすぐ下に表示される。\n", "\n", "セル内の「\\#」始まる文章は理解を助けるためのコメントであり、Pythonには読み込まれない。\n", "\n", "例えば" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# これは一行目のコメントである\n", "spam = 1 # これは二行目のコメントで\n", " # これは3行目のコメントである。\n", "text = '# この文章は、コーテーションの内側にあるためコメントではない。'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "このようにして、適宜コメントを残しておくことができる。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "なお、上の例の二行目は `spam` という変数に数字の1を割り当てるという意味である。\n", "\n", "ほとんどのプログラミング言語では、このような **変数** を用いることができる。変数は基本的には数字や文字などを保持しておく入れ物のようなものであると考えてもらえればよい。\n", "\n", "Pythonの変数は\n", "\n", "+ 英字から始まる好きな文字列を用いることができる\n", "+ 大文字と小文字は区別する\n", "+ **class** などいくつかの文字列は予約されているため使うことができない\n", "\n", "などが特徴である。\n", "現在の変数に割り当てている内容は以下の `print` 関数などで確かめることができる。" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] } ], "source": [ "print(spam)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# この文章は、コーテーションの内側にあるためコメントではない。\n" ] } ], "source": [ "print(text)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Python を電卓として使う\n", "\n", "Pythonは簡単な電卓のように使うことができる。\n", "例えば四則演算は`+`,`-`,`*`, `/`を用いることで計算する。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 数値" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2+2" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "20" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "50-5*6" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5.0" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(50-5*6)/4 " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ここで,小数部がない「4」や「20」は文字通り整数である. \n", "一方,「5.0」のように小数部が表示されているのは,Pythonの内部で結果が実数(浮動小数点数)として保持されていることを表す.浮動小数点数は8\"バイト\"のデジタルな値であることに起因して, \n", "- その有効桁数は10進で15桁程度 \n", "- 扱える数値の絶対値が10の308乗程度の大きさまでであること \n", "\n", "を頭の片隅にとめておくとよい.通常,これらのことが問題になることは少ないが,非常に精密な計算をしたり,巨大な値を扱う際に注意が必要になることがある.この浮動小数点数の構造については2回生配当の計算機数学で学習する.\n", "\n", "またPythonでは指数も簡単に計算できる。" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "25" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "5 **2 # 5の2乗" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "128" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2**7 # 2の7乗" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "以下は変数に計算結果を代入する例である。\n", "\n", "イコール記号`=`は、変数に値を割り当てることを意味する。\n", "この場合、結果は表示されない。" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "900" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "width=20\n", "height=5*9\n", "width*height" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "しかし、もし変数に何も値が割り当てられていない場合は、エラーになる。" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'n' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mn\u001b[0m \u001b[0;31m# 値を割り当てていない変数nにアクセスしてみる\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'n' is not defined" ] } ], "source": [ "n # 値を割り当てていない変数nにアクセスしてみる" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "このようにエラーがでた場合は、その内容を確認すること。\n", "ここでは 「NameError: name 'n' is not defined ( 'n' という名前が定義されていません)」とあるように、\n", "定義していない変数を使おうとしたことによるエラーであることがわかる。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "-------------------------------------\n", "\n", "### 文字列\n", "\n", "数値と同じように、Pythonは文字列も扱うことができる。\n", "文字列はシングルコーテーション`'...'`もしくはダブルコーテーション`\"...\"`で囲むことで表現できる。\n", "\n", "コーテーションで囲わない場合は、Pythonへの命令として扱われるため区別が必要である。" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'spam eggs'" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'spam eggs' # シングルコーテーションを使う" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"doesn't\"" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'doesn\\'t'\n", "# コーテーション自体を扱いたい場合は \\' というように「\\(バックスラッシュ)」が必要である。\n", "# なお、Windowsではバックスラッシュは半角の円マーク(¥)と表示されることがある。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "文字列は、`+`記号で繋ぐことができる。" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Python'" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'Py' + 'thon'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "また、文字列中の各文字には`[]`記号を用いてアクセスすることができる。\n", "\n", "なお、Pythonでは1番最初の要素にアクセスするためには0を与える(0から数える)。" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'P'" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "word = 'Python'\n", "word[0] # 0番目の文字" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'n'" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "word[5] # (0から数えて)5番目の文字" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "また、インデックス(`[]`内の数字)には、負の数を入れることができる。" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'n'" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "word[-1] # 最後の文字" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'o'" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "word[-2] # 最後から二番目の文字" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'P'" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "word[-6]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "このように特定の一つの文字にアクセスすることを「indexing(インデクシング)」と言う。\n", "\n", "また、Pythonは特定の一部分にアクセスする「slicing(スライシング)」にも対応している。" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Py'" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "word[0:2] # 0番目から2番目にわたる部分(なお、2番目は含まれない)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'tho'" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "word[2:5] # 2〜5番目の部分" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "また、`:`の片側を記入しない場合は、残り全てという意味になる。" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Pytho'" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "word[:5]" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Py'" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "word[:2]" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Pyth'" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "word[:-2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ただし、含まれる文字数以上の部分にアクセスしようとするとエラーになる。" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "ename": "IndexError", "evalue": "string index out of range", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mword\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m42\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mIndexError\u001b[0m: string index out of range" ] } ], "source": [ "word[42]" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "ename": "IndexError", "evalue": "string index out of range", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mword\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mIndexError\u001b[0m: string index out of range" ] } ], "source": [ "word[-10]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "-------------------------------\n", "\n", "## リスト\n", "\n", "Pythonには、複数の数値を*同時に*扱うことのできるリストという仕組みが用意されている。\n", "リストを用いるには、以下のように`[]`で囲った中に、複数の数値を「`,`」で区切って含める。" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1, 4, 9, 16, 25]" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "squares = [1, 4, 9, 16, 25]\n", "squares" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "リストは、文字列のようにインデクシング、スライシングが可能である。" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# インデクシング\n", "squares[0]" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "25" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 負の整数を用いたインデクシング\n", "squares[-1]" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[9, 16, 25]" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# スライシング\n", "squares[-3:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "リストは、文字列のように`+`記号で結合することができる。" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1, 4, 9, 16, 25, 36, 49, 64]" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "squares + [36, 49, 64]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "リストの内容は書き換えることができる。" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "64" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cubes = [1, 8, 27, 65, 125] # 何かおかしい。\n", "4 ** 3 # 4の3乗は65ではなく64" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1, 8, 27, 64, 125]" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cubes[3] = 64 # 正しい値を、3番めの要素に代入する。\n", "cubes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "さらに、リストの末尾に要素を加えることも可能である。" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1, 8, 27, 64, 125, 216, 343]" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cubes.append(216) # 6の3乗を加える。\n", "cubes.append(7**3) # 7の3乗も加える。\n", "cubes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "この操作ではリストの含む要素数が変化する。\n", "リストがいくつ要素を持っているかは`len()`関数で調べることができる。" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "7" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(cubes) # cubes というリストの要素数を調べる" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "リストの要素は、数値だけでなく、文字列、さらには別のリストとすることも可能である。" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[['a', 'b', 'c'], [1, 2, 3]]" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = ['a', 'b', 'c']\n", "n = [1,2,3]\n", "x = [a,n]\n", "\n", "x" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "インデックスを用いて要素を読みだす。" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['a', 'b', 'c']" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x[0]" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'b'" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x[0][1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## プログラミング学習の第一歩 ~ while ループ ~\n", "\n", "Pythonは、上記のような命令よりさらに複雑なものにも応用できる。\n", "\n", "例えば、次の例ではフィボナッチ数列を計算している。\n", "\n", "なお、フィボナッチ数列は以下のように定義される数式である。\n", "\n", "$$\n", "F_0 = 0, \\\\\n", "F_1 = 1, \\\\\n", "F_{n + 2} = F_{n} + F_{n + 1} \\;\\; (n ≧ 0)\n", "$$\n" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "1\n", "2\n", "3\n", "5\n", "8\n", "The loop ends\n" ] } ], "source": [ "# フィボナッチ数列。 2つの数値の和が、次の数値になる。\n", "a, b = 0, 1\n", "while b < 10:\n", " print(b)\n", " a, b = b, a+b\n", "print('The loop ends')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ここでは、いくつか新しい内容が出てきている。\n", "\n", "+ 1行目は、多重代入と呼ばれる操作である。`a`と`b`にそれぞれ`0`,`1`を代入している。\n", "\n", "\n", "+ `while`ループが用いられている。`while`文は、ある条件(ここでは`b<10`)が満たされている間、内部の命令を繰り返すものである。\n", "ここで`b<10`は、bが10未満の時に真となり、そうでないときは偽となる。真と評価されている間は`print(b)`, `a=b`, `b=a+b`が繰り返される。\n", "\n", "\n", "+ `while`文が繰り返す命令の範囲は*インデント*で示される。文頭に4文字分のスペースを明けている部分が繰り返し実行される(なお、キーボードの`Tab`キーを押すことで、4文字分のスペースを入力できる)。\n", "\n", "\n", "+ その次の`print(The loop ends)`コマンドはインデントされていない。そのため、`while`ループが終わった後に一度だけ実行される。\n", "\n", "\n", "+ `print()`関数`print(b)`や`print('The loop ends')`は、括弧内の値(引数:ひきすう と呼ぶ)を画面に表示させる役割を持つ。\n", "`while`ループにより繰り返し実行されるに従い、内容が毎回表示される。" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "毎回結果を表示させるよりも、リストに格納するほうがよい。" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]\n" ] } ], "source": [ "a, b = 0, 1\n", "fibonacci = [a] # 最初の要素のみが入ったリストを用意する。\n", "while b < 1000:\n", " fibonacci.append(b) # リストにbの値を追加する。\n", " a, b = b, a+b # 現在のbの値と、現在のaとbの値から計算したa+bの値をそれぞれ aとbに代入する。\n", "print(fibonacci)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "このような計算の結果は、数値を画面に表示させるよりも、その結果をグラフに表すほうが全体的な様子を理解しやすい。\n", "\n", "最後に、この結果をグラフに描画する方法を学ぶ。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----------------------\n", "### グラフ描画\n", "\n", "グラフ描画にはいくつか「ライブラリ」と呼ばれるプロブラム機能をまとめたものが必要である。\n", "Pythonのグラフ描画ライブラリの最も広く用いられているものは\n", "`matplotlib`というものである。\n", "\n", "`matplotlib`を使えるようにするためには、以下の`import`文を実行する。" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "# この行は、notebook内にグラフを表示するために必要である。\n", "%matplotlib inline\n", "\n", "# 「matplotlib というライブラリのうち、pyplotというモジュールを`plt`という名前で利用する」という意味。\n", "import matplotlib.pyplot as plt\n", "\n", "# これらの命令はグラフを描画するときに毎回必要なわけではなく、一度実行するだけでよい。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`plt.plot()`という関数のひとつ目の引数にさきほど計算した結果を格納したリストを、\n", "2つ目以降には、描画様式を与える。\n", "\n", "+ `'-'`: グラフを線で描く\n", "+ `'o'`: グラフを丸印で描く\n", "+ `'-o'`: 丸印で線で結んだグラフ描く" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(fibonacci,'-o')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "フィのナッチ数列が急激に値が増加するものであることが実感できる。\n", "\n", "値の小さいところを詳しく見るためには片対数グラフがよいだろう。\n", "\n", "片対数グラフを描くには、`plt.plot(fibonacci, 'o')`の代わりに、`plt.semilogy(fibonacci, 'o')`を実行する。" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.semilogy(fibonacci,'-o')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "フィボナッチ数列の値は、指数関数的に増加していることがわかる。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "フィボナッチ数列の一般項は以下の式で与えられることが知られている。\n", "\n", "$$\n", "F_n = \\frac{1}{\\sqrt{5}}\n", "\\left\\{\n", " \\left(\\frac{1+\\sqrt{5}}{2}\\right)^n\n", " -\\left(\\frac{1-\\sqrt{5}}{2}\\right)^n\n", "\\right\\}\n", "$$\n", "\n", "フィボナッチ数列の各項は整数であるのに対し、一般項に無理数である $\\sqrt{5}$ が出てくることは不思議に感じるかもしれない。\n", "試しに $n = 0, 1, 2$ などを代入してみるとよい。" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### 課題1\n", "\n", "$f(n) = n!$\n", "\n", "となる$f(n)$の値を、$n\\in{1,...,10}$に対し計算せよ。\n", "\n", "さらにそれを片対数グラフに描画せよ。" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# 解答をここに記入する" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 課題2\n", "\n", "Python における リストと文字列の共通点について述べよ。" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# 解答をここに記入する" ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_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.7" }, "latex_envs": { "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 0 }, "toc": { "toc_cell": false, "toc_number_sections": true, "toc_threshold": 6, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 1 }