{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "9a2fVTUU9-3O"
},
"source": [
"# Pythonの基礎1"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "949ryGknjhuK"
},
"source": [
"## 本セミナーの目標\n",
"本セミナーは、Python初級者が次の3つをマスターできることを目標としています。\n",
"\n",
"1. データの入力: ファイル読み取りの方法\n",
"1. データの構造化: データ成形・加工の方法\n",
"1. データの出力: 可視化の方法や保存\n",
"\n",
"これら3つのステップは、装置や計測方法が異なっていても、共通して行うデータ処理の流れですよね。Excelによるデータ処理でも、普段から行っている作業です。\n",
"\n",
"では、Pythonではどのように進めるのでしょうか?本セミナーは、この作業の流れを習得することを目的したカリキュラムです。\n",
"\n",
"またARIM事業では、各機器ごとにデータ構造化コードを作成していますが、実は、この3つのステップを組み入れたコードを各機器ごとに、その機器での利用形態や今後のデータ利活用にあわせて作っています。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "l_lhtGKkjcM4"
},
"source": [
"## こんなことができます\n",
"本セミナーの内容を習得すると、例として次のようなプログラムを作成・実行することができるようになります。\n",
"\n",
"- CSVファイルを読み込みます。\n",
"- CSVファイルから読み込んだデータのうち、欠損値を含む行を取り除きます。\n",
"- データをグラフで出力します。\n",
"\n",
"![こんなことができます](https://github.com/tendo-sms/python_beginner_2023/raw/main/files_1/figure/sample_1_01_fig.png)\n",
"\n",
"まずは、実際にプログラムを動かしてみましょう。\n",
"\n",
"まだプログラムの具体的な内容を理解する必要はありません。このような短いプログラムを記述するだけで、データの加工やグラフ出力ができる、というイメージをつかんでいただければ十分です。\n",
"\n",
"以下に、プログラムの「**ソースコード**」が記述されています。ソースコードとは、プログラムで行いたい処理をプログラミング言語(今回はPython)で記述したものです。\n",
"\n",
"プログラムを実行するには、ソースコードの任意の場所をクリックした後、次のどちらかの操作を行います。\n",
"\n",
"- ソースコード左上の実行ボタンを押す\n",
"- Ctrl+Enterを押す"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 472
},
"id": "OZbw8VcA-sDb",
"outputId": "0e602be9-9ca3-4966-e1d3-e29af5ac4c1f"
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# ソースコード\n",
"# スペクトルデータのグラフを作成\n",
"#---------------------------------------\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# CSVファイルからデータを読み込み\n",
"# Google Colaboratoryではオンラインのファイルを読み込むが\n",
"# 通常はローカルドライブのファイルを読み込む\n",
"df = pd.read_csv(\"https://raw.githubusercontent.com/tendo-sms/python_beginner_2023/main/files_1/sample_1_01.csv\")\n",
"\n",
"# 欠損値を含む行を削除\n",
"df = df.dropna()\n",
"\n",
"# 折れ線グラフをプロット\n",
"x = df['Wavelength']\n",
"y = df['Intensity']\n",
"\n",
"plt.plot(x, y)\n",
"\n",
"# グラフタイトル・軸ラベルの設定\n",
"plt.title(\"Spectrum\")\n",
"plt.xlabel(\"Wavelength\")\n",
"plt.ylabel(\"Intensity\")\n",
"\n",
"# 完成したグラフを画面に描画\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tImtiVf4n7Dm"
},
"source": [
"最初にプログラムを実行するときは、少し時間がかかることがあります。しばらく待つと、プログラムが実行された結果、グラフが表示されます。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "3RFtPAkmLrBx"
},
"source": [
"# Pythonの実行環境・エディタの紹介\n",
"Pythonのプログラムは、次の流れで実行します。\n",
"\n",
"1. エディタでソースコードを作成する。(Windowsのメモ帳や、LinuxのVim/Emacs等をイメージしてください)\n",
"1. Python実行環境がソースコードに従ってプログラムを実行する。\n",
"\n",
"ここでは、代表的なPython実行環境とエディタをご紹介します。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-rK-8LG8jso0"
},
"source": [
"## Python実行環境\n",
"代表的なPythonの実行環境として、公式版PythonとAnacondaがあります。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "oh0-eKokjzv5"
},
"source": [
"### 公式版Python\n",
"- 公式に配布されているPython実行環境です。\n",
"- Pythonは、非常に多くのさまざまな機能が「**パッケージ**」という形で公開されています。公式版Pythonは必要最低限の構成で配布されているので、自分で必要なパッケージだけをインストールして使いたい場合は、公式版Pythonを利用します。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tQNkRY2Zj97S"
},
"source": [
"### Anaconda\n",
"- 公式版Pythonに加え、データサイエンスをはじめとした、さまざまな分野でよく利用されるパッケージを同梱して配布されている、人気の高いPython実行環境です。\n",
"- パッケージやツールを自分でインストールする手間を軽減したい場合は、Anacondaを利用します。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Qvb_HxxikAKT"
},
"source": [
"## エディタ\n",
"Pythonプログラムのソースコードを作成するための、代表的なエディタについてご紹介します。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "n3ICcTRqkCMH"
},
"source": [
"### Visual Studio Code\n",
"- Visual Studio Code(VSCode)は、Microsoftが開発しているエディタです。\n",
"- ソースコードの作成に加え、あらかじめPython実行環境をPCにインストールしておけば、Visual Studio Codeの画面上でプログラムを実行することもできます。\n",
"- 複数のソースコードをまとめて管理したり、プログラムの不具合を調査する便利な機能を持っています。そのため、大規模なプログラム開発ではVisual Studio Codeがおすすめです。\n",
"\n",
"![VS Code](https://github.com/tendo-sms/python_beginner_2023/raw/main/files_1/figure/vscode_ss.png)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "dRoi_HyUkGTY"
},
"source": [
"### Jupyter Notebook\n",
"- Jupyter Notebookは、Webブラウザ上で動作するエディタ+Python実行環境です。\n",
"- 対話型のインタフェースで、Pythonプログラムのソースコード作成し、その場ですぐに実行まで行うことができます。\n",
"- ソースコードだけでなく、説明テキストなどを同時に記述できます。\n",
"- あらかじめ、Python実行環境をインストールしておく必要があります。\n",
" - 公式版Pythonをインストールした場合、続けてJupyter Notebookのインストールを行います。\n",
" - Anacondaをインストールした場合、Jupyter Notebookが同梱されているため、すぐに利用開始できます。\n",
"\n",
"![Jupyter Notebook](https://github.com/tendo-sms/python_beginner_2023/raw/main/files_1/figure/jupyter_ss.png)\n",
"\n",
"- 後継のエディタとして、JupyterLabがあります。まだ利用者やWebでの情報はJupyter Notebookの方が多い印象ですが、今後はJupyterLabが主流になっていく可能性があります。\n",
"\n",
"【小ネタ】Jupyterの「py」は、Pythonの頭文字です。そのため、Jupyterの正しい読み方は「ジュパイター」だという意見もあります。しかし現実には、ほとんどの人が「ジュピター」と呼んでいるのが実態です。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "dECG44JKkKtj"
},
"source": [
"### Google Colaboratory\n",
"- Jupyter Notebookをベースに、Googleが開発したエディタ+実行環境です。\n",
"- ソースコードの作成および実行、説明テキストの記述など、基本的な機能はJupyter Notebookとほぼ同じです。\n",
"- Python実行環境・エディタをPCにインストールする必要がありません。GoogleアカウントとWebブラウザさえあれば、Pythonを実行できます。\n",
"\n",
"![Google Colaboratory](https://github.com/tendo-sms/python_beginner_2023/raw/main/files_1/figure/colab_ss.png)\n",
"\n",
"本セミナーでは、Google Colaboratoryを使用しています。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "o7qUnoRpLvmu"
},
"source": [
"# プログラムを動かしてみよう\n",
"ここから、いよいよPythonの基礎について学んでいきましょう。\n",
"\n",
"実際にソースコードを見ながら、プログラムがどのように動いているのかを見ていきます。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "1QBUKzmTklMu"
},
"source": [
"## 文字列を出力する\n",
"以下のソースコードは、画面に\"Hello, world.\"という文字列と、整数値の10を出力するプログラムです。\n",
"\n",
"- ソースコードに「**print関数**」という命令が記述されています。print関数はPythonにあらかじめ用意された命令であり、()内に指定された文字列や数値などを画面に出力します。\n",
"- Pythonでは、文字列を\"(ダブルクォート)または'(シングルクォート)で囲むルールになっています。整数値などの場合は、囲む必要はありません。\n",
"\n",
"それでは実際に、プログラムを動かしてみましょう。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "9rL6G8HBi-jl",
"outputId": "5e3fb55a-35d1-4237-9b3b-7bbc885a734e"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Hello, world.\n",
"10\n"
]
}
],
"source": [
"print(\"Hello, world.\")\n",
"print(10)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "AiYv0xkai5le"
},
"source": [
"- ここでご紹介したprint関数のように、Pythonではよく使用する便利な機能を「**関数**」という形で提供しています。関数については、「Pythonの基礎2」の講義でさらに詳しくご説明します。\n",
"\n",
"【小ネタ】Pythonに限らず様々なプログラミング言語の入門書において、一番最初に学ぶプログラムが「画面に\"Hello, world.\"と表示する。」であることが多いです。ある意味、最も有名なソースコードと言えるかもしれません。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "MYGc6ZFcknqz"
},
"source": [
"## 変数を使用する\n",
"次のソースコードで、AAAやaaaは「**変数**」と呼ばれるものです。変数は、文字列や数値などの値を格納する入れ物のようなものです。\n",
"\n",
"- 「変数名=値」と記述すると、変数に値が格納(代入)されます。=の前後に半角空白を入れても構いません。\n",
"- print関数は、()に文字列や数値を直接指定するだけでなく、変数を指定することもできます。変数を指定すると、変数を格納された値が画面に出力されます。\n",
"\n",
"それでは実際に、プログラムを動かしてみましょう。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "SlIvlExGuo04",
"outputId": "c4b13a0f-28f9-4168-9911-def11dabca37"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Hello, world.\n",
"10\n"
]
}
],
"source": [
"AAA = \"Hello, world.\"\n",
"aaa = 10\n",
"\n",
"print(AAA)\n",
"print(aaa)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "h_Jb-C5hu32L"
},
"source": [
"- 変数名は、大文字と小文字が区別されることに注意が必要です。変数名「AAA」と「aaa」は、別の変数として扱われます。\n",
"- 変数名には、英大文字、英小文字、数字、_(アンダーバー)を使用することができます。ただし、数字で始まる変数名は使用できません。\n",
" - 厳密には、日本語などの全角文字も変数名として使用することは可能です。しかし他の著名なプログラミング言語も含め、慣例として変数名に全角文字は使用しません。原則として、上記の文字を使いましょう。\n",
"\n",
"様々な変数名の例を、次に示します。\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "T0QFbMnKiE9A",
"outputId": "1fadc20b-3c37-461b-c99b-dd106bf0307f"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Hello, world.\n",
"10\n",
"123\n"
]
}
],
"source": [
"Hello_World = \"Hello, world.\"\n",
"number10 = 10\n",
"_valueX = 123\n",
"\n",
"print(Hello_World)\n",
"print(number10)\n",
"print(_valueX)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "B6mko_J6iFg4"
},
"source": [
"## 文字列の長さを求める\n",
"次のソースコードは、\"Hello world.\"という文字列の長さを出力するプログラムです。\n",
"\n",
"- ソースコードに「**len関数**」という命令が記述されています。len関数はPythonにあらかじめ用意された関数であり、()内に指定されたデータの長さを取得します。\n",
"- len関数で求めた文字列の長さを、str_lenという変数に格納しています。\n",
"- 変数str_lenに格納された値を、print関数で画面に出力しています。\n",
"\n",
"それでは、実際にプログラムを動かしてみましょう。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "WI4ANqAIvqZG",
"outputId": "fc9f3cb4-e8f7-4e7c-ac3d-e0a2d7d15cbc"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"11\n"
]
}
],
"source": [
"str_len = len(\"Hello, world.\")\n",
"print(str_len)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "0A9AU2LPF7y0"
},
"source": [
"## コメントを記述する\n",
"プログラムには、コメントを記述することができます。コメントはプログラムを読みやすくするための記述であり、プログラムの動作には何の影響も与えません。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "23tvQ-gskrSx"
},
"source": [
"### #によるコメント\n",
"次のソースコードは、「変数を使用する」でご紹介したプログラムにコメントを追加したものです。\n",
"\n",
"- #で開始する行は、行末までがコメントとなります。複数行のコメントを記述したい場合は、それぞれの行の先頭に#を記述する必要があります。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "B47HO2NFwXVD",
"outputId": "600b2af7-b3a4-41a7-8628-3961141bdbce"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Hello, world.\n",
"10\n"
]
}
],
"source": [
"# 変数に文字列を格納する\n",
"AAA = \"Hello, world.\"\n",
"\n",
"# 変数に数値を格納する\n",
"aaa = 10\n",
"\n",
"# 変数の値を画面に出力する\n",
"# 変数名の大文字と小文字は区別されることに注意する\n",
"print(AAA)\n",
"print(aaa)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "yBbTItgMxDsD"
},
"source": [
"プログラムを見た人が内容を理解しやすいよう、積極的にコメントを書くことを心がけましょう。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "cNZyEATUkwAE"
},
"source": [
"### docstringによるコメント\n",
"コメントには、#で開始するコメントのほかに、docstring(ドックストリング)というコメントも存在します。以下のソースコードは、docstringによるコメントを記述した例です。\n",
"\n",
"- docstringは、後述する自作関数・クラスなどの、仕様や利用方法を記述するのに使用します。\n",
"- 関数やクラスの定義で、一番最初に記述した文字列は、docstringとなります。\n",
"- docstringでは多くの情報を見やすく記載するため、、\"\"\"(ダブルクォート3つ)、または'''(シングルクォート3つ)で囲んだ文字列を記述することが多いです。\"Hello, world.\"のように1つのクォートで囲む場合、改行を含むには特殊な記述が必要です。3つのクォートで囲むと、改行をそのまま記述することができます。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "jYI1UAyAy8o_"
},
"outputs": [],
"source": [
"def remainder(v1, v2):\n",
" \"\"\"割り算の余りを求める関数です\n",
"\n",
" Args:\n",
" v1 (int, float): 数値\n",
" v2 (int, float): 数値\n",
"\n",
" Returns:\n",
" rem (int, float): 余り\n",
" \"\"\"\n",
" rem = v1 % v2\n",
" return rem"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "4BPqt8PI1ID0"
},
"source": [
"【小ネタ】docstringは単にソースコードを読みやすくするだけではありません。docstringを書いておくと、help機能で自作関数の仕様を確認することができるのです!"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "lGR2yma9Gfx8"
},
"outputs": [],
"source": [
"help(remainder)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ihRHbpMQI0T7"
},
"source": [
"# 代表的なデータ型\n",
"Pythonで扱うデータには、データの種類を示す「**型(type)**」という概念があります。\n",
"\n",
"【ワンポイント】「型」の判別は、データ構造化の作業では大変に重要な作業となります。例えば、「2」という数字があった場合を考えます。これはプログラムで認識させるときに「文字」としての\"2\"であるのか、整数としての\"2\"であるのか、あるいは浮動小数点数としての\"2.0\"として処理をするのがよいか。それぞれによって、プログラムの内容も変わります。それを、Pythonに限らず各種のプログラミング言語においては「型」で判別をします。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "P7ulLyNQkzVc"
},
"source": [
"## 基本的なデータ型\n",
"まずは基本的なデータ型として、次の表に示すデータ型を紹介します。\n",
"\n",
"| データ型 | Pythonプログラムでの表現 |\n",
"| --- | --- |\n",
"| 文字列 | str |\n",
"| 整数 | int |\n",
"| 浮動小数点数 | float |\n",
"| 論理値 | bool |"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_nTA8-yck1Di"
},
"source": [
"### 文字列(str)\n",
"\"(ダブルクォート)または'(シングルクォート)で囲まれた値は、文字列となります。\n",
"\n",
"\n",
"次のプログラムを実行して、データの型を確認しましょう。「**type関数**」は、指定したデータの型が何であるかを取得します。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "KM-3VSZH2GnQ",
"outputId": "743fe6ba-da2b-4181-819b-dc193d0905f0"
},
"outputs": [
{
"data": {
"text/plain": [
"str"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 文字列型の値を変数に格納する\n",
"str_value = \"Hello, world.\"\n",
"\n",
"# データの型を取得する\n",
"type(str_value)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "D5D_SJXDlY5q"
},
"source": [
"「docstringによるコメント」でご紹介したように、\"\"\"(ダブルクォート3つ)、または'''(シングルクォート3つ)で囲むと、文字列に改行などの特殊な文字をそのまま記述できます。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "MwB9a8Bilnbo",
"outputId": "8e2eba13-ca1e-4cb7-a077-a2886e1194b6"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Hello, world.\n",
"Hello, python\n"
]
},
{
"data": {
"text/plain": [
"str"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 文字列型の値を変数に格納する\n",
"str_value = \"\"\"Hello, world.\n",
"Hello, python\"\"\"\n",
"\n",
"# 改行を含む文字列を出力する\n",
"print(str_value)\n",
"\n",
"# データの型を取得する\n",
"type(str_value)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "SWUrZkjx2-zR"
},
"source": [
"**【注意事項 (とても重要!)】**\n",
"\n",
"上記のプログラムを実行すると、type関数の結果として「str」が画面に出力されました。実は、このようにtype関数の結果が画面に出力されるのは、Jupyter NotebookやGoogle Colaboratoryの独自機能によるものです。本来、type関数には画面に結果を出力する機能はありません。\n",
"\n",
"type関数だけでなく、Jupyter NotebookやGoogle Colaboratoryでは、print関数を使わなくても計算結果などを画面に表示してくれることがあります。しかし、これはあくまでエディタの補助的な機能によるもので、本来は**データを画面に出力するときはprint関数を使用する**ことを必ず覚えておいてください。本来、type関数の結果を画面に出力するには、次のように記述します。\n",
"\n",
"```\n",
"print(type(str_value))\n",
"```\n",
"\n",
"以降の例では、print関数をきちんと使って、ソースコードを記述しています。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ox_lHrCOk4Vt"
},
"source": [
"### 整数(int)\n",
"- 整数を値として使用できます。\n",
"- 次のプログラムを実行して、データの型を確認しましょう。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "KqhVtQBw3RIR",
"outputId": "411f1dcf-dea4-4467-a514-fee0bdd7860d"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"# 整数型の値を変数に格納する\n",
"int_value = 10\n",
"\n",
"# データの型を取得する\n",
"print(type(int_value))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "l6wksDF93YhF"
},
"source": [
"- 上記は整数を10進数で記述しました。それ以外にも、2進数、8進数、16進数で記述することもできます。\n",
" - 先頭に「0b」または「0B」を付けると、2進数で記述できます。\n",
" - 先頭に「0o」または「0O」を付けると、8進数で記述できます。\n",
" - 先頭に「0x」または「0X」を付けると、16進数で記述できます。\n",
"- それぞれの記述例を、次に示します。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Dxxpu2jIylTZ",
"outputId": "76e6e2e1-d479-4322-9f31-99daab68ffa6"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"11\n",
"511\n",
"26\n"
]
}
],
"source": [
"# 2進数\n",
"print(0b1011)\n",
"\n",
"# 8進数\n",
"print(0o777)\n",
"\n",
"# 16進数\n",
"print(0x1A)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "pQM30rlKLZGp"
},
"source": [
"【ワンポイント】では、ここで次のようしたらどうなるでしょうか?"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Ts24UFNOLaa8",
"outputId": "eef44b70-a527-417f-feb1-5b758fff6127"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"int_value = \"10\"\n",
"print(type(int_value))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "te8SHxHjyl1w"
},
"source": [
"同じ半角の10であっても、\"10\"とダブルクォートで囲むことで、文字列となりましたね。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "iXpCFo4ek7Q0"
},
"source": [
"### 浮動小数点数(float)\n",
"- 浮動小数点数を値として使用できます。\n",
"- 次のプログラムを実行して、データの型を確認しましょう。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "5etvfDD63j97",
"outputId": "9caa42b0-dfed-4bc9-ac78-f7efa57834bd"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"# 浮動小数点数型の値を変数に格納する\n",
"float_value = 3.14\n",
"\n",
"# データの型を取得する\n",
"print(type(float_value))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "4JRxet664SgI"
},
"source": [
"### 論理値(bool)\n",
"- 論理値としてTrueまたはFalseのいずれかを値として使用できます。先頭のT、Fのみ大文字とする点に注意してください。\n",
"- 次のプログラムを実行して、データの型を確認しましょう。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "zfH-wv_J4poU",
"outputId": "39edfc89-a4d2-4d66-b99d-1cb958fb2e30"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"bool_value = True\n",
"\n",
"# データの型を取得する\n",
"print(type(bool_value))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "5Vm8e-MCy_Z4"
},
"source": [
"## 型の変換\n",
"Pythonでは、データ型を変換する関数が用意されています。\n",
"\n",
"次のソースコードでは、「**str関数**」を使って整数型の値を文字列型に変換しています。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "vU07vbSczDRN",
"outputId": "9dc927a7-3ab5-4f23-a079-995b484a9939"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"\n"
]
}
],
"source": [
"# 整数型の値を定義\n",
"int_value = 100\n",
"print(type(int_value))\n",
"\n",
"# str関数を使って整数型の100を文字列型\"100\"に変換する\n",
"int_to_str = str(int_value)\n",
"print(type(int_to_str))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "W7qy9JLuZ-RI"
},
"source": [
"次のソースコードでは、「**int関数**」を使って文字列型の値を整数型に変換しています。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "MQAs9QFXYzLw",
"outputId": "a186a794-7811-4178-898a-557726a7899b"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"\n"
]
}
],
"source": [
"# 文字列型の値を定義\n",
"str_value = \"999\"\n",
"print(type(str_value))\n",
"\n",
"# int関数を使って文字列型の\"999\"を整数型999に変換する\n",
"str_to_int = int(str_value)\n",
"print(type(str_to_int))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rF4h0bYFB_8F"
},
"source": [
"str関数およびint関数以外にも、それぞれのデータ型に対応した変換用の関数が用意されています。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "TH4MTSFuaQzo"
},
"source": [
"## 複数の値からなるデータ型\n",
"次に、複数の値からなるデータ型として、次の表に示すデータ型を紹介します。\n",
"\n",
"| データ型 | Pythonプログラムでの表現 |\n",
"| --- | --- |\n",
"| リスト | list |\n",
"| タプル | tuple |\n",
"| 辞書 | dict |\n",
"| 集合 | set |\n",
"\n",
"このようなデータ型は、「**コンテナ型**」とも呼ばれます。\n",
"\n",
"Pythonの入門書や、Python以前からあるプログラミング言語などでは、「配列」と呼ぶこともある内容で、データの格納方法を示す概念です。\n",
"\n",
"この中でも**リスト**と**辞書**はデータ構造化の中でも最も頻繁に使います。しっかりと理解をしましょう。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "6Bot3Dgrk_Hb"
},
"source": [
"### リスト(list)\n",
"リストは、複数の値を順序付けられた一つのデータとして扱うことができます。\n",
"\n",
"- リストは、[値1,値2,値3,・・・]という形式で表現します。,(カンマ)の前後に空白を入れても構いません。\n",
"- 値の重複を許可します。\n",
"\n",
"次のプログラムを実行して、データ内容と型を確認しましょう。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "CIKcNV2q-Ssf",
"outputId": "db1f002e-e1c2-4387-e0fb-6e27b6fca71f"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1, 3, 5, 5, 7]\n",
"\n"
]
}
],
"source": [
"# リストを作成する 値が重複していてもよい\n",
"num_list = [1, 3, 5, 5, 7]\n",
"\n",
"# リストの内容を画面に出力する\n",
"print(num_list)\n",
"\n",
"# データの型を画面に出力する\n",
"print(type(num_list))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "fbUbL0HX_eDz"
},
"source": [
"リストの値は、上記の整数型だけでなく、任意のデータ型とすることができます。次のソースコードは、様々なデータ型の値を持つリストの例です。\n",
"\n",
"- リストを値として持つリスト(入れ子のリスト)とすることもできます。\n",
"- 1つのリスト内に複数のデータ型を混在させることもできます。よく理解して使えば便利な反面、きちんとしたドキュメントなどでの説明がないと、後に修復できないほどのエラーを生じさせる要因ともなります。気を付けましょう。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "VzGgcnFq_5bP",
"outputId": "91240c70-72d6-4eb2-f0eb-7b25bbe6d330"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['Tokyo', 'Osaka', 'Nagoya']\n",
"[[1, 3], [5, 5, 7]]\n",
"[10, 'Tokyo', True, [1, 3]]\n"
]
}
],
"source": [
"# 文字列型のリスト\n",
"str_list = [\"Tokyo\", \"Osaka\", \"Nagoya\"]\n",
"print(str_list)\n",
"\n",
"# リストのリスト(入れ子のリスト)\n",
"list_list = [[1, 3], [5, 5, 7]]\n",
"print(list_list)\n",
"\n",
"# 複数のデータ型が混在したリスト\n",
"multi_list = [10, \"Tokyo\", True, [1, 3]]\n",
"print(multi_list)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ff9hNTogBC8x"
},
"source": [
"リストについては、「データ構造化の代表的なデータ操作方法」の講義でも詳しく説明します。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "U0ll2edYlIgm"
},
"source": [
"### タプル(tuple)\n",
"タプルはリストと似ていますが、次の点が異なります。それ以外は、リストと同様に使用することができます。\n",
"- タプルは、(値1,値2,値3,・・・)という形式で表現します。,(カンマ)の前後に空白を入れても構いません。\n",
"- タプルを作成後、タプルに含まれる値を変更することができません。そのため、プログラムの不具合などによる意図しない変更を防ぐことができます。\n",
" - 【ご参考】このように、作成後に値を変更できない性質を「イミュータブル」といいます。逆に、リストのように作成後に値を変更することができる性質を「ミュータブル」と言います。\n",
"- 同じ処理をリストとタプルで記述したケースを比較すると、基本的にタプルの方がプログラムの実行速度が速くなります。\n",
"- このあとご紹介する「辞書」のキーとしてリストを使用することはできませんが、タプルは使用することができます。\n",
"\n",
"次のプログラムを実行して、データ内容と型を確認しましょう。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ux6A0ZCyPSxt",
"outputId": "3cf5326a-d406-4ab7-d0cc-99d0e1772f20"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(100, 1, 2, 3, 4, 5, 6, 7)\n",
"\n"
]
}
],
"source": [
"# タプルを作成する。値の重複を許可する\n",
"num_tuple = (0, 1, 2, 3, 4, 5, 6, 7)\n",
"num_tuple = (100, 1, 2, 3, 4, 5, 6, 7)\n",
"\n",
"# タプルの内容を画面に出力する\n",
"print(num_tuple)\n",
"\n",
"# データ型を確認する\n",
"print(type(num_tuple))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "cxAiIbYUEBKV"
},
"source": [
"### 辞書(dict)\n",
"辞書はキー(key)と値(value)のペアを複数集めたデータです。\n",
"\n",
"- 辞書は、{キー1:値1,キー2:値2,キー3:値3, ・・・}という形式で表現します。,(カンマ)や:(コロン)の前後に空白を入れても構いません。\n",
"- キーには文字列以外にも何種類かの型を使用できますが、一般的には文字列を使用します。\n",
" - キーは、作成後に値を変更できない「イミュータブル」な性質を持ちます。\n",
"- 値には、任意の型を使用できます。\n",
"- 辞書に含まれるキーと値のペアには、基本的に順序(何番目のペア、などの概念)はありません。\n",
" - 厳密には、順序の概念があるOrderdDictという機能があったり、比較的新しいPythonでは順序を意識したプログラムを書くこともできますが、今回は詳しい説明はしません。\n",
"- 値の重複を許可しますが、キーの重複は許可しません。\n",
"\n",
"次のプログラムを実行して、データ内容と型を確認しましょう。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "0A6mmVe065U3",
"outputId": "b66e2570-1cbf-4156-9e66-49abe991e15f"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}\n",
"\n",
"{'key1': 'value1', 2: 10, 'key3': [1, 2, 3]}\n"
]
}
],
"source": [
"# 辞書を作成する\n",
"mydict = {\"key1\": \"value1\", \"key2\": \"value2\", \"key3\": \"value3\"}\n",
"\n",
"# 辞書の内容を画面に出力する\n",
"print(mydict)\n",
"\n",
"# データ型を確認する\n",
"print(type(mydict))\n",
"\n",
"# キーや値には文字列以外のデータ型も使用できる\n",
"multi_mydict = {\"key1\": \"value1\", 2: 10, \"key3\": [1, 2, 3]}\n",
"print(multi_mydict)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_zces1mnWRlX"
},
"source": [
"【小ネタ】計測にかかるメタデータの構造化では、この辞書型を必須として使っています。例えばSEMのメタデータではkey='倍率'、value=10000といったように格納します。様式2で選定したメタデータは、ここで活用されます。\n",
"\n",
"辞書ついては、「データ構造化の代表的なデータ操作方法」の講義でも詳しく説明します。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Q_XgvHfqYjWF"
},
"source": [
"次のソースコードでは、タプルのところでご紹介したように、辞書のキーとしてタプルを使用しています。一方、辞書のキーとしてリストは使用できません。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "RBt5XPDdWRPL",
"outputId": "2f7632a2-01fc-4705-9a04-966728223c91"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{('key1-1', 'key1-2'): 'value1', ('key2-1', 'key2-2'): 'value2'}\n"
]
}
],
"source": [
"# 辞書を作成する\n",
"mydict = {(\"key1-1\", \"key1-2\"): \"value1\", (\"key2-1\", \"key2-2\"): \"value2\"}\n",
"\n",
"# タプルの内容を画面に出力する\n",
"print(mydict)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "eim__C6m3ncj"
},
"source": [
"### 集合(set)\n",
"集合は、値の集合を示すデータです。\n",
"\n",
"- 集合は、{値1,値2,値3,・・・}という形式で表現します。,(カンマ)の前後に空白を入れることもできます。\n",
"- 集合に含まれる値には、順序(何番目の値、など)はありません。\n",
"- 値の重複を許可しません。\n",
"\n",
"次のプログラムを実行して、データ内容と型を確認しましょう。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "77SG8HUyBBYF",
"outputId": "0c8138fa-b9fd-46a8-a53f-f674de990f33"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{1, 3, 5, 7}\n",
"\n"
]
}
],
"source": [
"# 集合を作成する\n",
"num_set = {1, 3, 5, 7}\n",
"\n",
"# 集合の内容を画面に出力する\n",
"print(num_set)\n",
"\n",
"# データ型を確認する\n",
"print(type(num_set))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "6SsitwyJEp4B"
},
"source": [
"次のソースコードは、3つの集合の積を求めています。\n",
"\n",
"- 集合1&集合2&集合3・・・と記述すると、集合の積を求めることができます。&(アンド)の前後に半角空白を入れることもできます。\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "KUZ0vHHeb3Tx",
"outputId": "b0c174e3-dea3-4524-ab78-3f2e5076d76b"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{8, 2, 4}\n"
]
}
],
"source": [
"# 3つの集合を作成する\n",
"setA = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}\n",
"setB = {2, 4, 6, 8, 10}\n",
"setC = {1, 2, 4, 8}\n",
"\n",
"# 積集合を求める\n",
"setP = setA & setB & setC\n",
"\n",
"# 求めた積集合を画面に出力する\n",
"print(setP)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Mb7pMK31lnuc"
},
"source": [
"## 要素の数の数え方や選び方"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "fX65BN3VlE4B"
},
"source": [
"### 要素の数の数え方\n",
"次のソースコードのように、len関数に複数の値からなるデータ型のデータを指定すると、データに含まれる値の数を取得することができます。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "vox7rHnfBH2i",
"outputId": "ba9cf73c-fa84-4619-9e74-c766450a9845"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"5\n",
"4\n",
"3\n",
"2\n"
]
}
],
"source": [
"# 値の数が5個のリストの長さを取得\n",
"str_list = [\"Tokyo\", \"Osaka\", \"Nagoya\", \"Fukuoka\", \"Hokkaido\"]\n",
"len_str_list = len(str_list)\n",
"print(len_str_list)\n",
"\n",
"# 値の数が4個の辞書の長さを取得\n",
"int_dict = {\"key1\": 1, \"key2\": 2, \"key3\": 3, \"key4\": 4}\n",
"len_int_dict = len(int_dict)\n",
"print(len_int_dict)\n",
"\n",
"# 値の数が3個のタプルの長さを取得\n",
"int_tuple = (10, 20, 30)\n",
"len_int_tuple = len(int_tuple)\n",
"print(len_int_tuple)\n",
"\n",
"# 値の数が2個の集合の長さを取得\n",
"int_set = {100, 200}\n",
"len_int_set = len(int_set)\n",
"print(len_int_set)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "EcSRJXmo_2PL"
},
"source": [
"なお、リスト、タプル、辞書、および集合は、要素の数を0とすることもできます。この場合、len関数の結果も0となります。\n",
"\n",
"| データ型 | 要素0のとき |\n",
"| --- | --- |\n",
"| リスト | [] |\n",
"| タプル | () |\n",
"| 辞書 | {} |\n",
"| 集合 | set() ※{}とすると辞書になってしまうので注意してください|\n",
"\n",
"最初に要素の数を0としておいて、プログラムの中で要素を次々と増やしていく、といった使い方があります。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "HshYznyVAOPY",
"outputId": "8efe097d-86e0-4d4b-e022-e1b8a8d21fee"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0\n",
"0\n",
"0\n",
"0\n"
]
}
],
"source": [
"# 値の数が0個のリストの長さを取得\n",
"str_list = []\n",
"len_str_list = len(str_list)\n",
"print(len_str_list)\n",
"\n",
"# 値の数が0個の辞書の長さを取得\n",
"int_dict = {}\n",
"len_int_dict = len(int_dict)\n",
"print(len_int_dict)\n",
"\n",
"# 値の数が0個のタプルの長さを取得\n",
"int_tuple = ()\n",
"len_int_tuple = len(int_tuple)\n",
"print(len_int_tuple)\n",
"\n",
"# 値の数が0個の集合の長さを取得\n",
"# {}とすると辞書になってしまうのでset()と記述する\n",
"int_set = set()\n",
"len_int_set = len(int_set)\n",
"print(len_int_set)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "z5ccfZBJC_B8"
},
"source": [
"## 要素の選び方 (任意の一つの値を取得)\n",
"次のソースコードでは、リストに含まれる値のうち、任意の一つの値を取得しています。\n",
"\n",
"- リストから特定の1つの要素を取得する場合、リストに続く[]の中に、何番目の要素を取得するかを示す整数を記述します。\n",
"- 何番目の要素かを示す整数は、0から始まる点に注意が必要です。\n",
"- マイナスの整数を指定すると、「後ろから何番目」という意味になります。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "JLBZLCc2DTbE",
"outputId": "74d0df09-ae7b-4879-8664-a38440c47807"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Osaka\n",
"Osaka\n"
]
}
],
"source": [
"# リストを作成\n",
"# 0番目が\"Tokyo\"、1番目が\"Osaka\"、2番目が\"Nagoya\"となる点に注意\n",
"str_list = [\"Tokyo\", \"Osaka\", \"Nagoya\"]\n",
"\n",
"# 2番目の要素を取得する\n",
"print(str_list[1])\n",
"\n",
"# 後ろから2番目の要素を取得する\n",
"# -3番目が\"Tokyo\"、-2番目が\"Osaka\"、-1番目が\"Nagoya\"となる\n",
"print(str_list[-2])"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Y_dsVkxdjAZk"
},
"source": [
"タプルについても、リストと同じように値を取得できます。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "i6gC-9rPjE2p",
"outputId": "00111ce1-d00e-4d47-bded-a687c6ad3727"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Osaka\n",
"Osaka\n"
]
}
],
"source": [
"# タプルを作成\n",
"str_tuple = (\"Tokyo\", \"Osaka\", \"Nagoya\")\n",
"\n",
"# 2番目の要素を取得する\n",
"print(str_tuple[1])\n",
"\n",
"# 後ろから2番目の要素を取得する\n",
"print(str_tuple[-2])"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "AAqBCzf_hdav"
},
"source": [
"辞書には順序の考えがないため、このように順序指定により値を取得することはできません。\n",
"\n",
"辞書については、次のいずれかの方法で任意の一つの値を取得できます。\n",
"\n",
"- 辞書名に続く[]の中に、値を取り出したいキーを指定します。この場合、存在しないキーを指定するとプログラムがエラーとなります。\n",
"- 辞書名.get(キー)と指定します。この場合、存在しないキーを指定すると、値がないことを示す「**None**」というものが取得されます。プログラムはエラーになりません。\n",
"- 辞書名.get(キー, デフォルト値)と指定します。存在しないキーを指定すると、デフォルト値が取得できます。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "LilSd_Tvhozr",
"outputId": "95996095-d314-4f8d-cb9a-b33ae38aec62"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"None\n",
"None\n",
"None\n",
"None\n",
"default_value\n"
]
}
],
"source": [
"# 辞書を作成する\n",
"str_dict = {\"key1\": \"value1\", \"key2\": \"value2\", \"key3\": \"value3\"}\n",
"\n",
"# キー\"key2\"に対応する値を取得する\n",
"# 存在しないキーを指定するとプログラムがエラーとなる\n",
"print(str_dict[\"key2\"])\n",
"\n",
"# get(キー)では存在しないキーを指定するとNoneとなる\n",
"print(str_dict.get(\"key2\"))\n",
"print(str_dict.get(\"keyX\"))\n",
"\n",
"# get(キー, デフォルト値)では存在しないキーを指定するとデフォルト値となる\n",
"print(str_dict.get(\"key2\", \"default_value\"))\n",
"print(str_dict.get(\"keyX\", \"default_value\"))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "pIiyTCAfa-VL"
},
"source": [
"なお、値がNoneであるペアを含む辞書に対して辞書名.get(キー)とした結果、Noneであった場合、値のNoneを取得したのか、存在しないキーを指定したのか、区別することができません。そのような可能性がある場合は、辞書名.get(キー, デフォルト値)の方法を使用してください。また、「Pythonの基礎2」の講義でご紹介するif制御文を用いると、指定したキーが辞書の中に含まれるかを、事前にチェックすることができます。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "0XIdc39OE1EX"
},
"source": [
"## 要素の選び方 (スライス)\n",
"次のソースコードは、リストのうち一部の要素を切り出した別のリストを取得しています。このような操作を「**スライス**」と呼びます。\n",
"\n",
"- スライスは、リストに続く[]の中に開始点や終了点などを整数で指定します。次のような指定ができます。\n",
" - リスト[X:Y]と指定すると、リストのX番目から(Y-1)番目までの要素を取得できます。\n",
" - リスト[X:]と指定すると、リストのX番目から最後までの要素を取得できます。\n",
" - リスト[:Y]と指定すると、リストの最初から(Y-1)番目までの要素を取得できます。\n",
" - リスト[X:Y:D]と指定すると、リストのX番目から(Y-1)番目までの要素をD個おきに取得できます。\n",
" - リスト[X::D]と指定すると、リストのX番目から最後までの要素をD個おきに取得できます。\n",
" - リスト[:Y:D]と指定すると、リストの最初から(Y-1)番目までの要素をD個おきに取得できます。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ldvgZG_QJqMR",
"outputId": "7285b891-b24c-4954-fc95-e0758feeb3b8"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[3, 4, 5]\n",
"[4, 5, 6, 7]\n",
"[0, 1, 2, 3, 4, 5, 6]\n",
"[1, 3, 5]\n"
]
}
],
"source": [
"# リストを作成\n",
"num_list = [0, 1, 2, 3, 4, 5, 6, 7]\n",
"\n",
"# リストの3番目から5番目までの値を取得\n",
"# 5番目までの値を取得する場合は、終了点を6とする必要がある点に注意\n",
"print(num_list[3:6])\n",
"\n",
"# リストの4番目から最後までの値を取得\n",
"print(num_list[4:])\n",
"\n",
"# リストの最初から6番目までの値を取得\n",
"# 6番目までの値を取得する場合は、終了点を7とする必要がある点に注意\n",
"print(num_list[:7])\n",
"\n",
"# リストの1番目から5番目までの値を2個おきに取得\n",
"# 5番目までの値を取得する場合は、終了点を6とする必要がある点に注意\n",
"print(num_list[1:6:2])"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "3DrWrJxij5gs"
},
"source": [
"タプルについても、リストと同じようにスライスを使用できます。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "gC3RLVg5kHbW",
"outputId": "6e555001-910e-4672-d00f-508a1f051bf2"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(3, 4, 5)\n",
"(4, 5, 6, 7)\n",
"(0, 1, 2, 3, 4, 5, 6)\n",
"(1, 3, 5)\n"
]
}
],
"source": [
"# タプルを作成\n",
"num_tuple = (0, 1, 2, 3, 4, 5, 6, 7)\n",
"\n",
"# タプルの3番目から5番目までの値を取得\n",
"print(num_tuple[3:6])\n",
"\n",
"# タプルの4番目から最後までの値を取得\n",
"print(num_tuple[4:])\n",
"\n",
"# タプルの最初から6番目までの値を取得\n",
"print(num_tuple[:7])\n",
"\n",
"# タプルの1番目から5番目までの値を2個おきに取得\n",
"print(num_tuple[1:6:2])"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "piFXI3GVkenQ"
},
"source": [
"なお、集合については要素を選ぶ機能はありません。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ZaZ0OSiIb3vG"
},
"source": [
"# 代表的な演算子\n",
"Pythonでは、数値の四則演算をはじめとして、様々な演算子が用意されています。ここでは、よく使用する代表的な演算子を紹介します。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ndPl8Lt1lJXI"
},
"source": [
"## 算術演算子\n",
"算術演算子として、次の演算子を使用できます。\n",
"\n",
"| 演算子 | 機能 |\n",
"| --- | --- |\n",
"| x + y | 加算 |\n",
"| x - y | 減算 |\n",
"| x * y | 乗算 |\n",
"| x / y | 除算 |\n",
"| x % y | xをyで割った余り |\n",
"| x ** y | xのy乗 |\n",
"| x // y | 切り捨て除算 |\n",
"\n",
"なお、()による計算順序の指定もできます。\n",
"\n",
"次のソースコードは、算術演算子を使用した計算プログラムの例です。\n",
"\n",
"- 算術演算子は2項演算子であり、「値1 演算子 値2」という形式で記述します。演算子の左右には半角空白を入れることができます。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "NTw7HJ9XGjkq",
"outputId": "e0c20ad2-8346-4775-ecf8-944af19912dc"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"15\n",
"1\n",
"100\n",
"150\n"
]
}
],
"source": [
"int_num = 10\n",
"\n",
"# 5を加算\n",
"print(int_num + 5)\n",
"\n",
"# 3で割った余り\n",
"print(int_num % 3)\n",
"\n",
"# 2乗\n",
"print(int_num ** 2)\n",
"\n",
"# ()を用いた計算順序の指定\n",
"print((int_num + 5) * 10)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "V0u_p8WjZpnr"
},
"source": [
"整数型だけでなく、浮動小数点数型の計算にも使用できます。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "bbHabyPQZv-T",
"outputId": "66e3a575-1709-49cf-c443-6865ed42d8f5"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"4.71\n"
]
}
],
"source": [
"float_num = 3.14\n",
"\n",
"# 浮動小数点数の乗算\n",
"diameter = 1.5\n",
"print(diameter * float_num)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "47JCxl_GG7tH"
},
"source": [
"## 文字列演算子\n",
"文字列演算子として、次の演算子を使用できます。\n",
"\n",
"| 演算子 | 機能 |\n",
"| --- | --- |\n",
"| s + t | 文字列sと文字列tを連結 |\n",
"| s * t | 文字列sをt回繰り返す |\n",
"\n",
"次のソースコードは、文字列演算子を使用した計算プログラムの例です。\n",
"\n",
"- 文字列演算子は2項演算子であり、「値1 演算子 値2」という形式で記述します。演算子の左右には半角空白を入れることができます。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "HmDli19BIKgI",
"outputId": "f146e67f-18c8-4b49-900d-6922d7706b90"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"abcdef\n",
"abcabcabc\n"
]
}
],
"source": [
"# 文字列の連結\n",
"print(\"abc\" + \"def\")\n",
"\n",
"# 文字列の繰り返し\n",
"print(\"abc\" * 3)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tG1H-AVdIZUa"
},
"source": [
"\n",
"\n",
"【小ネタ】文字の足し算は、ファイルの出力のときに多用しています。例: \"sample\"という名前のファイル名を\".csv\"を付けてsaveするときは、(\"sample\"+\".csv\")とします。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "6yDKkPNl38PK"
},
"source": [
"## 代入演算子\n",
"代入演算子として、次の演算子を使用できます。\n",
"\n",
"| 演算子 | 機能 |\n",
"| --- | --- |\n",
"| x = n | xにnを代入 |\n",
"| x += n | x = x + nと同じ |\n",
"| x -= n | x = x - nと同じ |\n",
"| x *= n | x = x * nと同じ |\n",
"| x /= n | x = x / nと同じ |\n",
"| x %= n | x = x % nと同じ |\n",
"| x **= n | x = x ** nと同じ |\n",
"| x //= n | x = x // nと同じ |\n",
"\n",
"次のソースコードは、代入演算子を使用した計算プログラムの例です。\n",
"- 代入演算子は、「変数名 演算子 代入する値」という形式で記述します。演算子の左右には半角空白を入れることができます。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "X_auPd9POEJm",
"outputId": "40cf86fd-874a-4e8b-dc7d-89eea2d4cfae"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"5\n",
"15\n"
]
}
],
"source": [
"# =で代入\n",
"x = 5\n",
"print(x)\n",
"\n",
"# +=で代入\n",
"# x = x + 10と同じ動作\n",
"x += 10\n",
"print(x)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Le7Jhw3AOnFC"
},
"source": [
"\n",
"## 比較演算子\n",
"比較演算子として、次の演算子を使用できます。\n",
"\n",
"| 演算子 | 機能 |\n",
"| --- | --- |\n",
"| x == y | xがyと等しい(=が2つであることに注意) |\n",
"| x != y | xがyと異なる |\n",
"| x < y | xがyよりも小さい |\n",
"| x > y | xがyよりも大きい |\n",
"| x <= y | xがy以下である |\n",
"| x >= y | xがy以上である |\n",
"\n",
"比較演算子は、比較結果が成り立つときに論理値のTrue、成り立たないときに論理値のFalseとなります。\n",
"\n",
"次のソースコードは、比較演算子による比較結果がTrueとなるかFalseとなるかを確認しています。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ml5c83HNRzZg",
"outputId": "03af0d1f-0e90-471e-86a1-af862c0121dd"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"True\n",
"False\n"
]
}
],
"source": [
"num_value = 10\n",
"\n",
"# 比較結果が成り立つ例\n",
"print(num_value == 10)\n",
"\n",
"# 比較結果が成り立たない例\n",
"print(num_value != 10)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "W3BAL6R9gM-w"
},
"source": [
"なお、==および!=と似ている比較演算子として、次の比較演算子もあります。\n",
"\n",
"| 演算子 | 機能 |\n",
"| --- | --- |\n",
"| x is y | xがyと等しい |\n",
"| x is not y | xがyと異なる |\n",
"\n",
"これらの演算子は、==および!=と厳密には同じではありません。次のソースコードを実行してみましょう。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "L1uhPWAsge2s",
"outputId": "41870964-3761-4452-9734-51c98190ada9"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"True\n",
"False\n"
]
}
],
"source": [
"# 内容が同じ2つのリストを作成\n",
"list1 = [1, 2, 3]\n",
"list2 = [1, 2, 3]\n",
"\n",
"# ==とisそれぞれを用いて比較\n",
"print(list1 == list2)\n",
"print(list1 is list2)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ifgZNNuYSk7f"
},
"source": [
"- ここでは詳しくは説明しませんが、別々に作成した2つのリストは、中に含まれる値が同じであってもPythonの中では別のデータとして管理されています。\n",
"- ==はリストに含まれる値しか比較しませんが、isはPythonの中で同じデータとして扱われているかを比較します。\n",
"- 今のところは、isおよびis notではなく、==および!=を使って等しい・等しくないの判定を行うようにしましょう。\n",
"\n",
"比較演算子として、次のような演算子も使用できます。\n",
"\n",
"| 演算子 | 機能 |\n",
"| --- | --- |\n",
"| x in y | xがyに含まれる |\n",
"| x not in y | xがyに含まれない |\n",
"\n",
"使用例として、次のソースコードのように、リスト中にある値が含まれるかどうかを判定できます。\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "EpvoZnuV1F8C",
"outputId": "58fc79e0-f762-42c2-9ea2-4916f7cc4f90"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"True\n",
"False\n",
"False\n",
"True\n"
]
}
],
"source": [
"list1 = [1, 2, 3]\n",
"\n",
"# list1の値に2が含まれるか\n",
"print(2 in list1)\n",
"\n",
"# list1の値に5が含まれるか\n",
"print(5 in list1)\n",
"\n",
"# list1の値に2が含まれないか\n",
"print(2 not in list1)\n",
"\n",
"# list1の値に5が含まれないか\n",
"print(5 not in list1)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "AelTwuFq1GNo"
},
"source": [
"inおよびnot inは、文字列の操作にも使用できます。詳細は、「Pythonの基礎2」の講義で「文字列の操作」としてご紹介します。\n",
"\n",
"また、比較演算子のより具体的な使用例は、同じく「Pythonの基礎2」の講義で「代表的な制御構文」としてご説明します。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "M59YZbR6lNIo"
},
"source": [
"## ブール演算子\n",
"ブール演算子として、次の演算子を使用できます。\n",
"\n",
"| 演算子 | 機能 |\n",
"| --- | --- |\n",
"| x and y | xもyもTrueであればTrue |\n",
"| x or y | xまたはyがTrueであればTrue |\n",
"| not x | xがFalseであればTrue |\n",
"\n",
"ブール演算子は、比較演算子と組み合わせて複雑な条件比較を行うことなどに使用します。次のソースコードは、比較演算子とブール演算子を組み合わせて、結果がTrueとなるかFalseとなるかを確認しています。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "XDhDrX7tdDTf",
"outputId": "b5bc43f0-e9fd-44a1-9b7d-47e5b5d99f55"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"True\n",
"True\n",
"False\n",
"False\n"
]
}
],
"source": [
"num_value = 10\n",
"str_value = \"abc\"\n",
"\n",
"# 比較結果が成り立つ例\n",
"print(num_value == 10 and str_value == \"abc\")\n",
"print(not num_value == 20)\n",
"\n",
"# 比較結果が成り立たない例\n",
"print(num_value != 10 and str_value == \"abc\")\n",
"print(num_value == 20 or str_value == \"def\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Tmv0aLVBtSRW"
},
"source": [
"今回の講義は、ここまでとなります。次回はPythonの基礎の後編として、次の内容をご紹介します。\n",
"\n",
"- 代表的な制御構文\n",
"- 文字列の操作\n",
"- 予約語\n",
"- 関数とメソッド\n",
"- 例外\n",
"- 注意すべき用語"
]
}
],
"metadata": {
"colab": {
"provenance": []
},
"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.17"
}
},
"nbformat": 4,
"nbformat_minor": 4
}