{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "view-in-github"
},
"source": [
"
"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rk52fX27r7hj"
},
"source": [
"# Pythonの基本 その1:\n",
"\n",
"授業の冒頭で説明するように、プログラミングによるデータ分析は、複雑なデータの取り扱いを簡単にしてくれたり、系統的な作業を可能にしミス(精度)をコントロールすることが出来たりと利点が多い。しかし、その恩恵を受けるためには基本的な事項をまず学修しなくてはならない。\n",
"\n",
":::{margin}\n",
"さらにいうと英語で検索できればウェブ上で収集できる情報は何倍にも膨れ上がる.\n",
":::\n",
"この授業で重視するのは**Pythonの文法や作法、テクニックではない**。というのも、自分が実現したい操作・作業をきちんと**言語化**することさえできれば、授業で扱う程度の内容であればググればだいたいのことは解決できるし、インターフェース(見た目)が違ったとしても別のプログラミング言語やデータ解析ツールにも応用が効く。 \n",
"\n",
"したがって、以降では「いったいなんのためにホニャララなんてものを導入(定義)するのか?」を意識しながら学習していくことにしよう。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "9f041YDhyHKb"
},
"source": [
"## 変数の定義と簡単な演算\n",
"\n",
"**「\"値\"に固有の名前(識別子)を付したもの」** を**変数**と定義する。\n",
"\n",
"どのようなものが\"値\"として扱えるかは後で見ていくことにして、まずは代表的な値である**実数値**,**整数**を変数として定義してみよう。"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"id": "_emEY3U-SGBk"
},
"outputs": [],
"source": [
"a = 2.0 \n",
"b = 5"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2.0\n"
]
}
],
"source": [
"print(a)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CUJ8eEf8x2bs"
},
"source": [
"これで変数```a```と変数```b```に値が代入され\"定義\"された。 \n",
"プログラムでは通常、等号記号(`=`)は代入に使用される。値の代入は、等号の左に変数(値を入れたいものの名前)、等号の右に値を書くことで行う。\n",
"\n",
"注: よく書籍などでは変数を箱と見立てて箱の中に数値や文字列を入れる説明もよく見られるが、変数は値が保管されるメモリ上の住所を示すものというのが正確。関連した話題としては、次の章の**リスト操作の注意点**を参照.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "kSahHBeguqRX"
},
"source": [
"## 簡単な演算\n",
"次に、上で定義された変数を使って四則演算をしてみよう。\n",
"\n",
"足し算"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"id": "PLwBPo2OyCvc",
"outputId": "e803fa31-9566-4d87-a253-a3a99ee33753"
},
"outputs": [
{
"data": {
"text/plain": [
"7.0"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a+b "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "1ntUEuJWyBoC"
},
"source": [
"引き算"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"id": "1IpzKL9TyW2k",
"outputId": "08807a99-86e7-40a3-f556-bd67d6cf2338"
},
"outputs": [
{
"data": {
"text/plain": [
"-3.0"
]
},
"execution_count": 7,
"metadata": {
"tags": []
},
"output_type": "execute_result"
}
],
"source": [
"a-b"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "S4-CasuLyiJM"
},
"source": [
"掛け算 掛け算記号は`*`(アスタリスク)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"id": "ZQCmuN-IyiZQ",
"outputId": "80bc16fe-5012-4c2e-db6a-001609a5d640"
},
"outputs": [
{
"data": {
"text/plain": [
"10.0"
]
},
"execution_count": 8,
"metadata": {
"tags": []
},
"output_type": "execute_result"
}
],
"source": [
"a*b"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"割り算"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"a/b"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "uYolSMVnyiiz"
},
"source": [
"演算した結果を別の変数`c`として定義したり代入して保存しておくこともできる"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "8Z5Q-TN0yirc"
},
"outputs": [],
"source": [
"c=a*b "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_eyM3WdUyiyP"
},
"source": [
"`c`の値が後で知りたいと思ったときは、以下のように`print`関数というものを使う"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"id": "dS6W58sfyi8w",
"outputId": "0b78e406-7d9d-4f8c-d584-4cd1195f3680"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10.0\n"
]
}
],
"source": [
"print(c)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "SvfvgAEu2hAq"
},
"source": [
"変数の値を確認することは、プログラムが正しく動いているかを確認する最も単純かつ強力な方法である。 \n",
"慣れないうちは「値はなんだっけな?」「何かおかしい、意図した動きと違うな」と思ったら`print`してみよう。\n",
"\n",
"またコード部分に`#`(半角シャープ記号)をつけるとその行の`#`以降に書かれたことは無視されるのでコメント(注釈)を書いたりすることができる。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "MArtGR067qrB"
},
"outputs": [],
"source": [
"print(\"Hello\") # Helloとプリントする(ここは読まれない)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"なれないうちは**どういった計算をするのか**、**その行をいつ編集したのか**などコメントを逐一書いておくのも良い。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "uNWje7ZmSPQh"
},
"outputs": [],
"source": [
"## 10月1日に編集\n",
"print(b//a) # 切り捨て除算 \n",
"print(b%a) # bをaで割った余り\n",
"print(a**b) # aのb乗"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"上の例で、`#`を忘れると"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 135
},
"id": "CVrAtuQS7zqd",
"outputId": "a02ec808-9b4b-4ce3-cbd6-5d75b0561b7f"
},
"outputs": [
{
"ename": "SyntaxError",
"evalue": "ignored",
"output_type": "error",
"traceback": [
"\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m print(\"Hello\") Helloとプリントする\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
]
}
],
"source": [
"print(\"Hello\") Helloとプリントする"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "F5KhEPy9ngiO"
},
"source": [
"構文エラー(SyntaxError)が発生する。\n",
"基本的に`SyntaxError:`は**あなたの書いたコードがPythonの文法上許されない書き方になっている**ことを意味している。\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(\"Hello\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"は一見問題ないように見えるが、`print`関数の右側の括弧`(`が全角になっているため、これもSyntaxErrorとなる。\n",
"細かな文法やエラーの原因の特定については、一緒に少しずつ慣れていこう。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "qYviUyHp50-g"
},
"source": [
"一度定義した変数は、値を更新することもできる。\n",
"\n",
"```a = a + 2```は、\"aに2を加えた値\"でaを再定義することを表し、```a += 2 ```と書いても同じ結果が得られる。(`+=` を用いた書き方のほうがシンプルなので、今後多用します)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "kShmmBdw6Bfg"
},
"outputs": [],
"source": [
"a = 2.0 \n",
"a += 4.0; print(\"2行目\", a) \n",
"a -= 3.0; print(\"3行目\", a)\n",
"a *= 3.0; print(\"4行目\", a)\n",
"a /= 3.0; print(\"5行目\", a)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"上では、セミコロン(`;`)で、複数のコードを1行に書くことができる機能を用いた。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ksTr3vgORMth"
},
"source": [
"## 変数名に関する約束\n",
"\n",
"この授業では**変数名に全角文字(ひらがな・カタカナ・漢字)は使わず、文字列かコメントにのみ使う**と約束をしよう。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "lHrhJ0kP3sqB"
},
"outputs": [],
"source": [
"#非推奨\n",
"あ=1.0\n",
"print(あ)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "e7-sDw8n3Vnh"
},
"source": [
"上記のように、変数名にひらがな等を使用すること自体は可能で、Google Colaboratoryでも何も特別なことをしなくてもひらがなが使える。また、最近の多くのプログラミング言語は全角文字をサポートしている。\n",
"ただファイルの互換性などを考慮すると、一般にはひらがなや漢字など全角文字を変数に指定することは避けたほうが無難である。\n",
"\n",
"また、変数名などにひらがなを使うことに由来して起こりがちなバグとしては「括弧()を間違って全角にしてしまってそれに気が付かない」といったことがある。コードを編集する際に日本語の変数などを利用していると、半角・全角の切り替え忘れなどが生じうるので、コードセルではなるべく半角英数字のみを使うというのが、ミスを防ぐための一つの方法にもなっている。\n",
"\n",
"以降ではこの慣例にならって、変数名に全角文字は使わない。変数名は基本的に半角英数字, アンダースコア`_`のみで定義しよう。\n",
"```+-%/=```などの記号も使うことができない。たとえば```-```は既に引き算という演算を表すのに使用されているので、```a-b``` という名前の変数を定義しようとしても、コンピュータにとっては変数ではなく[a マイナス b]という演算だと認識されてしまう。\n",
"また変数の頭に数字を使うこともできない。 例: ```2a```\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "9nJInAMR8xBc"
},
"outputs": [],
"source": [
"a=5.0\n",
"a2 = a*2.0 #これはOK"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 134
},
"id": "-AQ_v6oN80VD",
"outputId": "8341c2a7-9ebb-4730-d47a-1b1ce7f2ac1b"
},
"outputs": [
{
"ename": "SyntaxError",
"evalue": "ignored",
"output_type": "error",
"traceback": [
"\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m 2a = a*2.0 #これは構文エラー(SyntaxError)\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
]
}
],
"source": [
"2a = a*2.0 #これは構文エラー(SyntaxError)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "67WnrlQFvGzc"
},
"source": [
"その他、よくあるエラーについては[こちら](https://sotayoshida.github.io/Lecture_DataScience/notebooks/Python_misc_Error.html)を参照"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Xzh2hrEGQyoh"
},
"source": [
"## Pythonでの文字列操作\n",
"\n",
"Pythonでは、数値はもちろん文字列も**値**として扱うことができる。文字列は`\"\"`(ダブルクォーテーション)か`''`(シングルクォーテーション)で囲むことで定義することができる。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "Uf5RoETJQf9T"
},
"outputs": [],
"source": [
"text = \"私の名前はXXXです\" ## XXXのところを自分の名前にしてみましょう。\n",
"print(text)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "vu7JQswcQima"
},
"source": [
"文字列には、足し算や整数値との掛け算が適用できる。たとえば\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "1KfLiGbXSGtu"
},
"outputs": [],
"source": [
"text1 = \"ティッシュ配りの\"\n",
"text2 = \"バイトを監視する\"\n",
"print(text1 + text2) "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "gapLeKPbSS9X"
},
"source": [
"とすれば、`text1`と`text2`にそれぞれ代入した2つの文字列を連結した一つの文字列を表示することができる。\n",
"また、"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "lkPrilk0Smn1"
},
"outputs": [],
"source": [
"a = 2\n",
"print(str(a)+\"人の\"+text1+ text2 * 5 +\"正社員\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "SXWbu7hERxhk"
},
"source": [
"とすれば、`text2`部分を5回繰り返して他の文字列とつなぎ合わせた長い文字列を作ることもできる。\n",
"\n",
"1点注意点としては、整数値を代入した`a`を文字列として他の文字列と結合したいときは、\n",
"`str()`関数(`str`はstringの略)を使って、文字列に変換してやらなくてはならない。\n",
"これに関連して、後ほど変数の**型**というものを勉強する。\n",
"\n",
"また足し算と掛け算は定義できるが、文字列に対して引き算や割り算を行おうとするとエラーを吐く。\n",
"\n",
"**※もう少し詳細な文字列操作**\n",
"`replace`関数,`split`関数,`strip`関数なども便利ですが、この章では省略します。以降の\"ファイル・文字列操作\"の章で扱います。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "cA-K0W0gdUVm"
},
"source": [
"## プログラムの実行順 \n",
"\n",
"基本的にプログラミングでは、上から処理が実行される。 \n",
"(ループや関数が導入されると少し事情が異なり、ブロックと呼ばれる処理単位でまとめて実行されることもあるが、この点については、2・3章以降で追々見ていくことにしましょう)\n",
"\n",
"以下の2行のコードは、実行するとエラーが出る。 \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 185
},
"id": "Nxtzf6oydyPo",
"outputId": "7928123b-07af-4bbb-c159-969ac7098e58"
},
"outputs": [
{
"ename": "NameError",
"evalue": "ignored",
"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[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnum\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 2\u001b[0m \u001b[0mnum\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mNameError\u001b[0m: name 'num' is not defined"
]
}
],
"source": [
"print(num)\n",
"num=2"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "pDZNSdGSXLLS"
},
"source": [
"理由は、エラーメッセージを読むと分かるように、```num```という変数が定義されていない(not defined/undefined)のに、その値を`print`しようとしたからである。\n",
"\n",
"\n",
"\n",
"もちろん```num=2```の代入部分を含むコードを実行した後ならエラーはでない。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "iGbewJx35Cv-",
"outputId": "39440ce3-4345-42f7-c5f9-ef3d405a7cdc"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2\n"
]
}
],
"source": [
"num=2\n",
"print(num)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "diGHO3vHByMP"
},
"source": [
"とくにGoogle Colab(Jupyter Notebook)環境では、**セルをまたいでコードを実行することがあるので、意図した変数の値がきちんと引き継がれているか注意が必要**になる。また**変数のスコープ**という概念にも注意が必要となる(関数を扱う第3章で解説します).\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "nvVmV3T2eNNg"
},
"source": [
"Jupyter Notebook環境では、セルのコードを逐次実行した場合**コードセルの左側に表示される括弧[ ]内の整数でコードの実行順を確認することができる**。コードやノートが複雑になってくると、正しい順番で実行しないとエラーが出たり、エラーは出ないけれど意図した出力にならないといった事が起こりえるので、注意が必要。慣れないうちは、処理(プログラム)をあまりバラバラのセルに書かず、一つにまとめて書くのがオススメ\n",
"\n",
"**良い例**"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "i04YCgvREx3D"
},
"outputs": [],
"source": [
"a = 2\n",
"f = a**2 + 3*a + 1\n",
"print(f)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "M9wpT6pdE94M"
},
"source": [
"**悪い例**\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "NZz13R9wE5d-"
},
"outputs": [],
"source": [
"a = 5"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "tSEolkA1FBIb"
},
"outputs": [],
"source": [
"f = a**2 + 3*a + 1\n",
"print(f)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "QWdmQhl7FOdy"
},
"source": [
"このようにコードを分けてしまうと、```f```では最後に```a```に代入された値を用いて計算が行われるので、```a=5```のセルを実行し忘れると、意図した値にならない。(あるいは未定義ならエラーとなる)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "iZWBifqG1hiM"
},
"source": [
"## 変数の型 \n",
"プログラムの中で扱う変数には様々な\"型\"(`type`, タイプ)が存する。\n",
"代表的なものとしては、 \n",
"- `float`: 浮動小数点数(≒実数の有限桁内の近似)\n",
"- `int`: 整数 \n",
"- `str`: 文字列 (stringの略) \n",
"- `bool`: 真偽値 (下で説明します) \n",
"\n",
"が挙げられ、この他にも様々な型が存在している。 \n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CiI90I_KBFp4"
},
"source": [
"たとえば以下のように変数の型は```type()```という関数を使うことで調べることができる。\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "lk5U6eRixEmS"
},
"outputs": [],
"source": [
"a=2\n",
"b=2.0\n",
"print( type(a), type(b))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "SeEQBeHX_Ajq"
},
"source": [
"```{margin} 浮動小数点\n",
"いい加減な理解としては、\"実数値\"に近い概念だと思ってください。\n",
"\"いい加減な理解\"というのは\"厳密には違う\"という意味で、それについては後で説明します。\n",
"```\n",
"`a=2`は`int`(整数)型で、`b`(=2.0)は`float`、つまり浮動小数点(floating point)。\n",
"\n",
"Pythonでは特定の型同士のみに許された特殊な演算等もある。変数の型が調べたくなったときは```type```関数を使ってみよう。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Ju30-9Eg_mkm"
},
"source": [
"### プログラムでの実数の取り扱い"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "uV441Uk-5U6g"
},
"source": [
"整数としての2(つまり`int`型の2)は理想的な整数2であるのに対して、`float`型の2.0というのは、 \n",
"「コンピュータが扱える有限の精度のもとで十分2.0とみなせる値」という意味しか持たない。\n",
"\n",
"変数`a`に以下の値を代入して`print`してみよう。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "_bHmWs7-70G_"
},
"outputs": [],
"source": [
"a = 2.00000000000000000000055511151231257827021181583404541015625\n",
"print(a)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Cil16n_8jY5E"
},
"source": [
"コンピュータで実数値を表現する際、小数点以下の桁数を無限桁考慮するのは、機械にとっても大変なので、ある程度の精度で打ち切ることが必要になる。\n",
"\n",
"Pythonで扱う実数値は、現在の世界標準である[IEEE 754](https://ja.wikipedia.org/wiki/IEEE_754)という規格のもとで、十進数に換算して16桁程度の精度(倍精度実数の場合)の近似となっている、とザックリ理解しておけば当面は問題ないでしょう。\n",
"\n",
"たとえば、`0.3`と`0.1+0.1+0.1`は、コンピュータが無限の精度を持っていれば(つまり0.3や0.1のあとに無限に0が続く数を扱うことができれば)等しい数になるべきだが、有限の精度を採用している都合上\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "guk4yu1W-ceA",
"outputId": "997d7dab-636b-4a3b-8602-8c7105b5f980"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"-5.551115123125783e-17\n"
]
}
],
"source": [
"print(0.3 - (0.1+0.1+0.1))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "fVklyhDm-0do"
},
"source": [
"というように差をとると極小の値だけずれている事が分かる。\n",
"\n",
"授業で扱う対象の場合は、この有限精度が実用上のトラブルを起こすことは無いはず。\n",
"一方で(研究等で)いわゆる数値計算を行う場合は、このようなごく小さな誤差が掛け算によって増幅され無視できない影響を引き起こすことがしばしばあるので、工夫や適切な処理が必要になることもある。 "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "9pzeE-C812cT"
},
"source": [
"$\\clubsuit$ さらに進んだ注\n",
"\n",
"コンピューターでは、0か1の二値を取るビット(bit)を最小単位として数値など各種の情報を表現して扱います。\n",
"たとえば整数値は、ビットを用いた表現と1対1対応させることができます。ビットが2つ使えるとするならば、[00]が1, [01]が2,[10]が3,[11]が4といった具合です。\n",
"(もちろん実際の対応関係とは異なり、あくまで一例です)\n",
"\n",
"一方で実数は、いくらでも小さく分割できるため集合としては非可算無限(それぞれの値に、1対1対応する\"番号\"をつけることができない)となり、これをコンピューターで扱おうとすると、必ず何らかの\"近似\"が必要になります。\n",
"この近似の方法として通常用いられるのが、**浮動小数点**という考え方でありその標準を定めたものが前述のIEEE754となります。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "0rTMkwwu542w"
},
"source": [
"## 予約語\n",
"\n",
"Pythonには、あらかじめ役割が与えられている言葉(**予約語**)があり変数名として使う事はできません。 \n",
"\n",
"実際にコード用のセルにこれらの語句を入力すると下記のように黒ではなく別の色で表示されます。このような場合は**変数に別の名前をつける**ようにしましょう。\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "NZupgRYXzOqc"
},
"outputs": [],
"source": [
"# 予約語は色で分かる\n",
"False, None, True, and, as, assert, break, \n",
"class, continue, def, del, elif, else, except, \n",
"finally, for, from, global, if, import, in, is, \n",
"lambda, nonlocal,not, or, pass, raise, return, \n",
"try, while, with, yield"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"予約語の役割については登場したその都度説明します。 "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2clzBTJo47u2"
},
"source": [
"## ブール(bool)\n",
"真偽値(`bool`,ブール)は`True`(真)と`False`(偽)の二値を取る型です。たとえば"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "Ft3Id7uO5VtR"
},
"outputs": [],
"source": [
"a=2.0; b = 5.0"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "v3Dkiheo5ZE7"
},
"source": [
" のとき、"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "jlQpKJu6xTv-"
},
"outputs": [],
"source": [
"print(a < b) # aがbより小さいかどうか"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "e6CjUOwrxcgH"
},
"outputs": [],
"source": [
"print(a == b) # aがbと等しいかどうか プログラムでの等号は=ではなく==です。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "GjZXvoth5lZv"
},
"source": [
"これを考えるとなにが嬉しいかというと、ある条件をみたす(みたさない)ときだけ特定の作業をするプログラムを書くことが出来ます。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "wHr_li34xe8s"
},
"outputs": [],
"source": [
"if a==b: \n",
" print(\"aとbが一緒だよ!!やったぜ!!!\")\n",
"else:\n",
" print(\"aとbが違うじゃないか!!!\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "xyNnie55N77B"
},
"source": [
"このような**条件分岐**の具体例については次の章で見ることにしましょう。 "
]
}
],
"metadata": {
"colab": {
"include_colab_link": true,
"name": "Python_chapter1_Introduction.ipynb",
"provenance": []
},
"interpreter": {
"hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49"
},
"kernelspec": {
"display_name": "Python 3.9.10 64-bit",
"language": "python",
"name": "python3"
},
"language_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.9"
}
},
"nbformat": 4,
"nbformat_minor": 0
}