# python_course1
## 本章の目的
1. Pythonの概要を理解し、JupitarLabでPythonコードを実行できるようになること
2. 数値や文字列といったデータ型の性質とPythonの基本的なコーディングルールを理解すること
3. if文やfor文などの制御構文を理解すること
## Pythonとは?

Pythonとはプログラミング言語の一種です。人工知能を始めとして、ビックデータ解析やWebアプリケーションに利用されており、注目を集めています。初期バージョンである0.9の発表は1991年で、2020年10月現在ではPython3.9がリリースされています。
Pythonの特徴の一つとして、インタプリタ言語であることが挙げられます。インタプリタとは、ソースコードを1行ずつ読み込み、機械語に解釈しながら処理を実行する方式のことです。一方で、C言語などはコンパイラ言語と呼ばれています。Pythonはコンパイラ言語に比べ処理速度では劣りますが、コンパイル(ソースコードを機械語に翻訳し、実行可能な形式のファイルに変換すること)の手間がなく手軽にプログラミングができるという強みがあります。
## Pythonを使うメリット
Pythonでのコーディングによるメリットは様々ありますが、2点抜粋して紹介します。
### ムダのないシンプルなコード
Pythonはシンプルであることをポリシーとしています。コーディングルールが比較的少ないため、読み書きしやすく、また記述量を少なくできます。
例を見ていきましょう。下記コードは、「Hello World!」という文字列をコンソール画面に表示するプログラムです。
###### C言語の場合
```
#include <stdio.h>
int main(void){
printf("Hello World!¥n");
return 0;
}
```
###### Pythonの場合
```
print("Hello World!¥n")
```
C言語ではprint以外にもコード記述が必要ですが、Pythonだとprintのみで済むことが確認できます。
### 充実したライブラリ
ライブラリとは、よく利用されるコードや機能を、他のプログラムから使用できるように集約したものです。プログラマは必要に応じて外部のライブラリを使用し、プログラムを作成することができます。Pythonでは、データ分析や機械学習向けのライブラリが豊富です。そのため、例えば、機械学習の複雑なアルゴリズムを厳密に理解していなくともAI開発が行えます。
## Pythonコードの実行
### Pythonの実行環境構築
それではさっそく、Pythonのプログラミングをしていきましょう!...といきたいところですが、その前にまず、書いたコードを実行できる環境を準備しなくてはいけません。1つの方法として、「pyファイル」を作成し、コマンドプロンプトやターミナルのコンソール画面で「python」という命令を実行する、というものがあります。しかし、この方法はプログラミング未経験な方にとっては少し複雑です。そこで、本コースではJupyterLabという環境でPythonの学習を進めていきます。
### JupyterLabとは?

JupyterLab(ジュピターラボ)とは、JupyterNotebookの後継にあたり、ブラウザ上で動作するIDE(統合開発環境)です。データを可視化しながらプログラミングしていくため、データ分析や機械学習の用途に適しています。なお、JupyterLabはオープンソースとして公開されており、多くのユーザに利用されています。
### JupyterLabの導入手順
JupyterLabは下記手順に従ってインストールしていきます。(OSはWindowsを想定しています。)
#### 1. Anacondaのインストール
Anacondaとは、データサイエンス向けの環境を提供する、世界で最も有名なプラットフォームの一つです。まず、以下のサイトからAnacondaのインストーラをダウンロードしてください。
https://www.anaconda.com/products/individual
サイトにアクセスしたら、以下のPython 3.x系列の最新版をクリックして、インストーラをダウンロードします。

ダウンロードが完了したら、exeファイルを起動してインストールを完了させてください。特別な設定は必要ありません。
#### 2. Anaconda NavigatorでのJupyterLabの起動
Anaconda のインストールが完了すると、スタートメニューに「Anaconda」フォルダが追加されます。その中のAnaconda Navigator」をクリックしてください。以下の画面が表示されたら、JupyterLabの「Launch」をクリックします。ブラウザが起動し、JupiterLabのページが表示されたら準備完了です。

#### 3. JupyterLabの使い方
ここから、JupyterLabの基本的な使い方を紹介していきます。JupyterLabには他にも様々な機能やコマンドがあるため、慣れてきたらご自身で試してみてください。
##### 1. 作業の保存先の設定
まず、作業データを保存するためのフォルダを選択します。下図の赤枠内のフォルダ一覧から、保存先に設定したいフォルダ名をダブルクリックしてください。新しくフォルダを作成する場合は、赤枠内の空いているスペースで右クリックし、「New Folder」を選択してください。

特にこだわりがなければ、「Python」フォルダを作成してファイルの保存先に設定しましょう。
##### 2. Notebookの作成
次にNotebookを作成します。JupyterLabにおけるNotebookとは、プログラムや実行結果をまとめて管理できるファイルのことで、拡張子は「ipynb」です。表示画面右の「Launcher」タブ内より、「Notebook」メニューの「Python3」をクリックしてください。

デフォルトではファイル名が「Untitled」になっているため、適切なファイル名に変更しましょう。指定ファイルの上で右クリックし、出てきたメニューから「Rename」を選択してください。

特にファイル名の指定はありませんが、ひとまず「Test.ipynb」としておきましょう。
##### 3. Pythonコードの実行
それでは、Pythonのプログラミングをやっていきましょう。画面中の青枠で囲まれた領域を「セル」と呼び、このセルにコードを記述していきます。
下記コードを実行してみましょう。
```
print("Hello Python!")
```
記述が完了したら、画面上部のメニューにある「▶」のボタンをクリックしてください(「Shift + Enter」でも可能です)。

セルの下に実行結果が表示され、その下に新しいセルが作成されます。

セルには編集モードと操作モードの2種類があります。編集モードは、セルの枠が青色のときで、プログラムを入力するためのモードです。また、操作モードは、セルの枠が灰色のときで、セルの追加・削除などセル自体を操作するためのモードです。
##### 4. コードの修正
プログラムの実行後、エラーが出たり想定通りの結果が出ないことは日常茶飯事です。このとき、コードを修正する必要があります。修正したいセルをクリックしてください。クリックしたセルが、操作モードから編集モードに切り替わります。
先ほどのコードを修正してみましょう。下記コードに変更してみてください。
```
print("Hello Hello Python!")
```
以下のように実行結果が変わったことを確認できます。

##### 5. セルの削除
誤って作ってしまったセルや不要になったセルを削除したいときがあります。そういった場合は、該当するセル上で右クリックしてください。メニューの中から「Delete Cells」を選択すると、セルを削除できます。ただし、プログラムがすべて消えてしまう恐れがあるため、削除は慎重におこなうのがよいでしょう。

##### 6. 実行処理の強制停止
プログラムが応答しない場合に強制停止したいことがあります。例えば、プログラムが無限ループにはまったとしましょう(ここでは詳しく説明しませんが、無限ループとは一生終わらない処理だと思ってください)。
無限ループのコード例を以下に示します。
```
while 1:
a = 0
```
このコードを実行すると、JupyterLab内で処理が止まることなく走り続けます。セルの左側のラベルが「[*]」であり画面右上に「●」の表示があれば、処理が続いている証拠となります。確認してみてください。
処理を強制的に停止させるには、画面上部のメニューにある「■」ボタンをクリックします。エラーメッセージとともに、処理が停止します。

##### 7. 作業データの保存
JupyterLabには自動保存機能がついていますが、手動でプログラムやテキストを保存することもできます。やり方は簡単で、以下の赤枠のアイコンをクリックするだけです。

##### 8. JupyterLabの終了
ブラウザを終了しても、JupyterLabのサーバは起動し続けてしまいます。そのため、JupyterLabを停止させたほうがよいでしょう。手順を以下に示します。
画面右上のメニューの「File」から「Shut Down」を選択してください。

次のような確認メッセージが表示されるため、「Shut Down」ボタンを押してください。

## Pythonの基本文法
### コードの区切り
Pythonでの1文は1行で、文の区切りは改行で表します。以下にエラーの発生する間違ったコード例を示します。
###### 1文が2行に分かれている間違い
```
print("Hello
Python!")
```
###### 2文が1行にある間違い
```
print("Hello") print("Python!")
```
なお、セミコロン「;」をつけるとそれが文の区切りになります。しかし、コードが読みづらくなるため、基本は使わなくてよいでしょう。
### コメントアウト
Pythonコード中に余計な記述があれば、当然エラーが発生します。しかし、処理の説明を残しておきたいという場面が、プログラミングでは頻出します。そういった場合には、コメントを利用しましょう。コメントを残すことをコメントアウトと呼びます。Pythonでは、コメントアウトにはハッシュ「#」を使い、ハッシュ後の1行がコメントとして認識されます。以下に記述例を示します。
###### 実行コード
```
print("Hello Python!") # ここにコメントを記述
# ハッシュのあとは半角スペースをひとついれよう
#これはダメ
# これもダメ
```
###### 実行結果
```
Hello Python!
```
他人が見て分かりやすいコードにするため、コメントはなるべく記述するようにしましょう。
### 変数
プログラミングにおける変数(variable)とは、よく「データを格納する箱」と表現されます。データの入れ物だと思ってください。変数にデータを入れておくことで、必要なときにその変数を呼び出せばデータを参照できます。
#### 変数名と変数定義
変数定義の例を以下に示します。
###### 実行コード
```
age = 20
name = "Yamada"
print(age)
print(name)
```
###### 実行結果
```
20
Yamada
```
変数には好きな名前をつけることができ、変数名といいます。また、変数の名前を決めたり最初に入れる値(初期値)を決めたりすることを「定義する」するといいます。ここでは「age」と「name」を定義しました。変数をあらかじめ定義し初期化しておくことは、不要なバグの発生を防ぐために重要なため、忘れないようにしましょう。
#### 変数名の決め方
「a」や「hoge」といった、見て意味の伝わりにくい変数は、名前として好ましくありません。一見してどのような変数か分かる名前が理想的です。
また、PythonにはPEP8という公式のコーディング規約(参考:[PEP8: Pythonコードのスタイルガイド](https://pep8-ja.readthedocs.io/ja/latest/))があり、参考にするとよいでしょう。ただし、プロジェクト内で独自の命名規則が決まっている場合には、必ずそれに従いましょう。PEP8の中で広く普及している下記2点は特に留意しましょう。
1. 名前は英小文字のみにする
2. 2つ以上の単語はアンダースコア「_」でつなげる
また、予約語(言語側で特別な処理を行う構文などに使われている単語)は変数名として使用できません。例えば、Pythonでは「if」や「int」などが予約語にあたります。注意しましょう。
#### 変数の使い方
変数の使い方を以下に示します。
###### 実行コード
```
number = 2
number = 4
number = number + 1
print(number)
```
###### 実行結果
```
5
```
なぜこのような実行結果になるのでしょうか。Pythonに限らず、多くのプログラミング言語では「=」に「等しい」の意味はありません。右辺の処理結果を左辺へ「代入する」という意味になります。そのため、実行コード2行目でnumberの値は「2」から「4」に更新されます(処理前の値は消えてしまうため注意が必要です)。3行目では、右辺で演算処理を行っています(Pythonでの演算方法は後述します)。プログラミングに馴染みのない方は気持ちの悪い文に見えるかもしれませんが、右辺の「number」はここまでの処理での「number」の中身を参照しています。2行目で「4」に値が更新されているため、「number」の値は「4」です。そして「4 + 1」の計算結果を左辺に「代入して」います。その結果、「number」の中身は「5」に更新され出力として「5」が表示されるというわけです。
余談ですが、3行目の右辺はデータの参照なため、「number」の値は変化しません。代入して初めて変数の値が変わります。変数の参照か代入かの見極めはコードを読む際に重要になってきますため、頭の片隅に留めておいてください。
#### 変数のデータ型
データ型とは、どのような種類の値が格納されているかを表すラベルです。Pythonでの主なデータ型は以下のとおりです。
| データ型 | 値の種類 | サンプル |
| -------- | :------- | ------------------------------------------------------------ |
| str | 文字列 | say = "Happy birthday!" |
| int | 整数 | age = 30 |
| float | 実数 | height = 156.78 |
| bool | 真偽値 | is_female = True |
| list | 配列 | what_to_bring = ["birthday card", "gift"] |
| tuple | タプル | what_to_bring = ("birthday card", "gift") |
| dict | 辞書 | personal_infomation = {"name": "Hanako", "age": 20, "is_female": True} |
これ以外にもPythonで使われるデータ型は多く存在します。
変数のデータ型を確認するためには、type()という命令(関数)を行います。
###### 実行コード
```
number = 123
print(type(number))
word = "change"
print(type(word))
```
###### 実行結果
```
<class 'int'>
<class 'str'>
```
なお、上述のコードはPython以外の言語ではエラーとなる確率が高いです。C言語やJavaでは、変数のデータ型をプログラマが指定する決まりがあるからです。代入される値から言語内でデータ型を推論する機能は、Pythonの特徴の一つです。
#### 算術演算子と数値演算
何らかの演算を行うときに使う記号を演算子と呼びます。特に、基本的な四則演算などに用いる演算子を算術演算子といいます。算術演算子の例を以下に示します。
| 算術演算子の記号 | 処理内容 |
| ---------------- | ---------------------------------------- |
| + | 加算 |
| - | 減算 |
| * | 乗算 |
| / | 答えを実数値とする除算 |
| % | 剰余(割り算のあまり) |
| // | 答えを小数点以下を切り捨て整数とする除算 |
| ** | べき乗 |
サンプルコードで動作を確認してみましょう。
###### 実行コード
```
number = 6 + 7
print(number)
number = 6 - 7
print(number)
number = 4 * 9
print(number)
number = 19 / 8
print(number)
number = 19 % 8
print(number)
number = 19 // 8
print(number)
number = 3 ** 4
print(number)
```
###### 実行結果
```
13
-1
36
2.375
3
2
81
```
1つ注意すべきことは、「/」で割り算を実行したときの出力は実数(float型)になってしまうことです。仮に割り切れたとしても、実数として値が返ってきます。整数値(int型)での値がほしい場合は、「//」の演算子を使うようにしましょう。
#### 文字列
Pythonでは、ダブルクォーテーション「"」もしくはシングルクォーテーション「'」で囲まれたものを「文字列」という型として扱います。「"」と「'」はどちらを使ってもかまいません。
##### 文字列の特徴
文字列はあくまで文字列データなため、数値の演算はできません。また、文字列は半角英数字だけでなく、日本語表記(全角文字)も扱えます。
サンプルコードで動作を確認してみましょう。
###### 実行コード
```
characters = "6 + 7"
print(characters)
characters = "日本語でも大丈夫!"
print(characters)
```
###### 実行結果
```
6 + 7
日本語でも大丈夫!
```
##### エスケープシーケンス
クォーテーションや改行など、特殊な文字を記述したい場合があります。そのようなときは、エスケープシーケンス(「\」または 「¥」)を利用します。「\」と文字の組み合わせで、さまざまな特殊文字を表現できます。たとえば、ダブルクォーテーションは「\ "」、改行は「\ n」です。
###### 実行コード
```
characters = "\"や\nも表現できます"
print(characters)
```
###### 実行結果
```
"や
も表現できます
```
この他にもエスケープシーケンスの組み合わせはたくさんあるため、必要に応じて調べてみてください。
##### 文字列演算子と文字列操作
文字列演算子を用いて、文字列を連結したり繰り返したりすることができます。
| 文字列演算子の記号 | 処理内容 |
| ------------------ | -------- |
| + | 連結 |
| * | 繰り返し |
算術演算子と記号が重複しているため注意しましょう。
サンプルコードで動作を確認してみましょう。
###### 実行コード
```
first_characters = "文字列は"
second_characters = "繰り返したり" * 3
concatenated_characters = first_characters + second_characters + "結合できます"
print(concatenated_characters)
```
###### 実行結果
```
文字列は繰り返したり繰り返したり繰り返したり結合できます
```
#### キャスト(型変換)
コードを作成していると、「文字列データを数値データとして取り出したい」や「実数を整数に丸めたい」という場合が多々あります。そういった場合は、変数をキャストしましょう。キャストとは、変数のデータ型を強制的に変更してしまうことです。
Pythonの主な命令(関数)を以下に示します。
| 命令(関数) | 処理内容 |
| ---------- | ------------------------- |
| int() | 変数を整数(int)へ型変換 |
| float() | 変数を実数(float)へ型変換 |
| str() | 変数を文字列(str)へ型変換 |
サンプルコードで動作を確認してみましょう。
###### 実行コード
```
characters = "100"
number = int(characters)
number= number + 100
print(number)
```
###### 実行結果
```
200
```
文字列データを整数データに置き換えて処理しているため、問題なく演算ができています。
#### 条件式と真偽値
真偽値とは、TrueかFalseの2種類のみで決まる値のことで、Pythonではbool型がこれに該当します。また、真偽値はint()によって、Trueは1、Falseは0 に置き換え可能です。
真偽値は条件式の結果として出力される値です。指定した条件を満たしていればTrue、満たしていなければFalseとなります。
##### 比較演算子
条件式で2つの値を比較するには、比較演算子を使います。比較演算子の例を以下に示します。
| 比較演算子の記号 | 用例 | 比較条件 |
| ---------------- | ------ | ---------------------- |
| > | a > b | aはbより大きい |
| < | a < b | aはbより小さい |
| >= | a >= b | aはbより等しいか大きい |
| <= | a <= b | aはbより等しいか小さい |
| == | a == b | aとbは等しい |
| != | a != b | aとbは等しくない |
サンプルコードで動作を確認してみましょう。下記コードは、「taroさんとhanakoさんの年齢は18歳以上か」を判定する条件式です。
###### 実行コード
```
age_taro = 15
age_hanako = 30
print(age_taro >= 18)
print(age_hanako >= 18)
```
###### 実行結果
```
False
True
```
##### 論理演算子
複数の条件式を組み合わせたい場合には、論理演算子を用います。論理演算子の例を以下に示します。
| 比較演算子の記号 | 用例 | 比較条件 |
| ---------------- | ------------------- | ------------------------------------------ |
| and | (a > b) and (c > d) | 「aはbより大きい」かつ「cはdより大きい」 |
| or | (a > b) or (c > d) | 「aはbより大きい」または「cはdより大きい」 |
| not | not (a > b) | 「aはbより大きくない」 |
サンプルコードで動作を確認してみましょう。下記コードは、「taroさんとhanakoさんの年齢がともに18歳以上か」を判定する条件式です。
###### 実行コード
```
age_taro = 15
age_hanako = 30
print((age_taro >= 18) and (age_hanako >= 18))
```
###### 実行結果
```
False
```
## 条件分岐
ある条件によって処理を場合分けしたいことがあります。例えば、料金検索システムにおいて、選択された交通手段に応じて表示する料金を変えたい場合、電車が選択された場合はA円を表示、タクシーが選択された場合はB円を表示、のように項目値によって処理を場合分けする必要があります。このような用途のため、Pythonではif文(if, elif, else)という制御構文が用意されています。
なお、行頭にある出てくる空白のことをインデントと言います(半角英数字4文字分)。半角英数字でスペースキーを4回押す、あるいはtabキー1を1回押すことで適切にインデントをとることができます。
### if文
#### if文の書式
まず、if文の書式を確認しましょう。
```
if [条件式A]:
条件式Aが真の場合の処理
elif [条件式B]:
条件式Bが真の場合の処理
...
(elifの繰り返し)
...
else:
どの条件式も真にならなかった場合の処理
```
ifは1つめの条件分岐、elifは2つめ以降の条件分岐、そしてelseは条件が満たされなかった場合の分岐を意味します。上から順に条件判定が行われ、いずれかの条件が真になった場合、インデントされた内部の処理が実行されます。そして、いずれの条件も真とならなかった場合には、else内の処理が実行されます。なお、elifとelseは記述せずとも動作するため、場合分けが単純な場合など、ifのみを使用することもあります。
#### if文の記述例
次に、if文(if, elif, else)の記述例を見てみましょう。
##### if
まず、サンプルコードでifの動作を確認してみましょう。下記コードは、簡易的な料金検索システムを例として、交通手段として電車が選択された場合に、料金200円を表示する処理です。「利用したい交通手段を入力してください。:」と表示されたら「電車」と入力してみましょう。
###### 実行コード
```
transportation_type = input("利用したい交通手段を入力してください。:")
if transportation_type == '電車':
print('料金は200円です。')
```
###### 実行結果
```
利用したい交通手段を入力してください。:電車
料金は200円です。
```
##### elif
次に、サンプルコードでelifの動作を確認してみましょう。先の例で、電車に加えタクシーの料金を表示することを考えます。このように複数の条件分岐を記述したい場合には、ifに加えelifを使用します。「利用したい交通手段を入力してください。:」と表示されたら「タクシー」と入力してみましょう。
###### 実行コード
```
transportation_type = input("利用したい交通手段を入力してください。:")
if transportation_type == '電車':
print('料金は200円です。')
elif transportation_type == 'タクシー':
print('料金は1000円です。')
```
###### 実行結果
```
利用したい交通手段を入力してください。:タクシー
料金は1000円です。
```
##### else
最後に、サンプルコードでelseの動作を確認してみましょう。先の例で、電車あるいはタクシー以外の項目が入力された場合、未対応のメッセージを表示することを考えます。このように、ifやelseで記述した条件が満たされなかった場合の処理を記述したい場合には、elseを使用します。「利用したい交通手段を入力してください。:」と表示されたら「バス」と入力してみましょう。
###### 実行コード
```
transportation_type = input("利用したい交通手段を入力してください。:")
if transportation_type == '電車':
print('料金は200円です。')
elif transportation_type == 'タクシー':
print('料金は1000円です。')
else:
print('入力された交通手段は未対応です。')
```
###### 実行結果
```
利用したい交通手段を入力してください。:バス
入力された交通手段は未対応です。
```
## 繰り返し
同じことを繰り返し行う処理を記述したい場合、同じ処理を何度も記述する必要があります。例えば、1から10までの数字をコンソールに表示するためのコードは次のようになるでしょう。
###### 実行コード
```
print(1)
print(2)
print(3)
print(4)
print(5)
print(6)
print(7)
print(8)
print(9)
print(10)
```
###### 実行結果
```
1
2
3
4
5
6
7
8
9
10
```
上記例は引数が違うだけのprint文が並んでおり、非常に冗長です。また、実際の業務アプリケーションにおいて何千何万といった繰り返し処理は多々あり、そのような場合には大きな時間と労力がかかります。そこで、このような繰り返し処理を簡単に記述するため、while文とfor文という繰り返し構文が用意されています。
### while文
まず、while文の書式を確認しましょう。
#### while文の書式
```
while [条件式]:
条件式が真の場合の処理
```
whileは条件が満たされている間、インデントされた内部の処理(反復処理)を繰り返すことを意味します。
#### while文の記述例
次に、サンプルコードでwhileの動作を確認してみましょう。下記のコードは、先に挙げた、1から10までの数字をコンソールに表示するコードを、while文を使用して書き直したものです。
###### 実行コード
```
count = 1
while count <= 10:
print(count)
count += 1
```
###### 実行結果
```
1
2
3
4
5
6
7
8
9
10
```
ループを使用しない場合に比べ、簡潔な記述になったことが確認できると思います。この例では、内部の処理としてcount値がコンソールに表示され、1ずつ増えていきます。そして、countが10以下である限り処理が繰り返され、結果として1から10までの数字がコンソールに出力されます。
### for文
Pythonでは集計処理や加工処理を扱う場合が多いため、集合に対する反復処理を簡単にかけると便利です。日次の売上から週次の売上を計算する処理を例にとり、while文による記述を以下に示します。
###### 実行コード
```
daily_sales = [10, 10, 10, 10, 20, 15, 15]
weekly_sales = 0
day = 0
while day < 7:
daily_sale = daily_sales[day]
weekly_sales += daily_sale
day += 1
print('週次の売上は' + str(weekly_sales) + '万円です。')
```
###### 実行結果
```
週次の売上は90万円です。
```
このような機能をより簡単に作成するため、for文という繰り返し構文が用意されています。for文を使えば、集合のサイズや構造を気にすることなく、集合要素に対する処理を記述することができます。
#### for文の書式
まず、for文の書式を確認しましょう。
```
for (要素) in (集合):
要素を対象とした何かしらの処理
```
forは与えられた集合の1つ1つに対する何かしらの処理を意味します。
#### for文の記述例
次に、サンプルコードでforの動作を確認してみましょう。下記コードは、先に挙げた、日次の売上から週次の売上を計算する処理をfor文を使って書き直したものです。
###### 実行コード
```
daily_sales = [10, 10, 10, 10, 20, 15, 15]
weekly_sales = 0
for daily_sale in daily_sales:
weekly_sales += daily_sale
print('週次の売上は' + str(weekly_sales) + '万円です。')
```
###### 実行結果
```
週次の売上は90万円です。
```
集合のサイズやカウントを気にする必要がないため、while文に比べて集計処理を簡単に記述できることが確認できます。
### break文
これまでの例では繰り返しの終了条件が明確でしたが、終了条件がいつ満たされるかはっきりわからない場合があります。例えば、自動応答システムにおいて、ユーザからの入力がある限り質問に回答し続ける場合、ユーザが対話を終了するまで処理を繰り返す必要があります。このような機能は、break文を使用して作成することができます。
#### break文の書式
まず、break文の書式を確認しましょう。
```
(whileもしくはfor) ... :
...
if (条件式):
break
...
```
break文はwhileなど繰り返し構文の内部で使用され、ループを抜けることを意味します。
#### break文の記述例
次に、サンプルコードでbreakの動作を確認してみましょう。下記コードは、簡易的な自動応答システムを例として、都道府県が入力されたら、その県庁所在地を表示する処理です。「県庁所在地を調べたい都道府県を指定してください。:」と表示されたら1回目で「北海道」と入力し、2回目で何も入力せず「Enter」を押してみましょう。
###### 実行コード
```
while True:
prefecture = input("県庁所在地を調べたい都道府県を指定してください。:")
if prefecture == '':
break
elif prefecture == '北海道':
print('北海道の県庁所在地は札幌です。')
print("応答を終了します。")
```
###### 実行結果
```
県庁所在地を調べたい都道府県を指定してください。:北海道
北海道の県庁所在地は札幌です。
県庁所在地を調べたい都道府県を指定してください。:
応答を終了します。
```
都道府県(北海道のみの対応)が入力される限り県庁所在地を表示し、何も入力されなかった(Enterのみが押された)場合にループを抜け、処理が終了することを確認できます。
### continue文
ループを抜けるのではなく、反復処理を1度スキップして次の反復処理に進みたい場合があります。例として、外部APIを利用した経路検索システムを考えます。ユーザの指定した出発地や目的地が不正な場合には、料金やアクセス時間がかかるため、外部APIへの接続をスキップするのが適当だと考えられます。このような処理は、continue文を使用して作成できます。
#### continue文の書式
まず、continue文の書式を確認しましょう。
```
(whileもしくはfor) ... :
...
if (条件式):
continue
...
```
continue文はwhileなど繰り返し構文の内部で使用され、反復処理を1度スキップすることを意味します。
#### continue文の記述例
次に、サンプルコードでcontinueの動作を確認してみましょう。下記コードは、簡易的な経路検索システムを例として、出発駅と目的駅が入力された場合に、路線案内を表示する処理です。「出発駅を指定してください。:」と表示されたら「上野」と入力し、「目的駅を指定してください。:」と表示されたら「御徒町」と入力してみましょう。さらに、2回目ではそれぞれ何も入力せず「Enter」を押してみましょう。
###### 実行コード
```
while True:
origin = input("出発駅を指定してください。:")
destination = input("目的駅を指定してください。:")
if origin != '上野' or destination != '御徒町':
print('指定された駅間の検索は対応しておりません。')
continue
print('路線を検索しています。')
print('山手線にお乗りください。')
print("経路検索を終了します。")
```
###### 実行結果
```
出発駅を指定してください。:上野
目的駅を指定してください。:御徒町
路線を検索しています。
山手線にお乗りください。
出発駅を指定してください。:
目的駅を指定してください。:
指定された駅間の検索は対応しておりません。
出発駅を指定してください。:
```
出発駅として上野、目的駅として御徒町が入力された場合には路線検索し、それ以外の入力ではエラーメッセージが表示され、後続の処理がスキップされることを確認できます。
## 例外
プログラム実行時に、想定していないエラーが発生することは多々あります。想定していないエラーが発生した場合、悪影響が出ないよう後続の処理を中断し、原因を特定できるようにエラーメッセージを出力したり、データを復元したり、といった処理が必要となります。そのような処理は例外処理と呼ばれ、Pythonではtry文という制御構文が用意されています。
### try文
#### try文の書式
まず、try文の書式を確認しましょう。
```
try:
エラーが発生し得る何かしらの処理
except タイプAのエラー:
タイプAのエラーが発生した場合の後処理
...
except:
不明なタイプのエラーが発生した場合の後処理
finally:
エラーの発生有無に関わらず実行する共通の後処理
```
tryはエラーの発生し得る処理、exceptはエラータイプごとの例外処理、finallyはエラーの発生に関係なく実行する後処理を意味します。tryの内部処理が実行されエラーが起きるとexceptブロックのコードが実行され、例外が起きなければexceptの内部処理は実行されません。そして、エラーの発生に関わらずfinallyの処理が実行されます。なお、共通の後処理が必要ない場合には、finallyを省略しても問題ありません。
#### try文の記述例
次に、サンプルコードでcontinueの動作を確認してみましょう。下記コードは、指定された曜日の売上を表示する処理です。「売上を表示したい曜日を番号で指定してください。月:0, 火:1, 水:2, 木:3, 金:4, 土:5, 日:6。:」と表示されたら「8」と入力してみましょう。
###### 実行コード
```
dayofweek_sales = [10, 10, 10, 10, 20, 15, 15] # 月曜から順にリストに売上が格納されている。
dayofweek_index = input('売上を表示したい曜日を番号で指定してください。月:0, 火:1, 水:2, 木:3, 金:4, 土:5, 日:6。:')
try:
dayofweek_sale = dayofweek_sales[int(dayofweek_index)]
print('指定された曜日の売上は' + str(dayofweek_sale) + '万円です。')
except IndexError as err:
print('指定された番号の曜日は存在しません。')
except ValueError as err:
print('数値を入力してください。')
except Exception as err:
print('原因不明なエラーが発生しました。')
finally:
print('処理を終了します。')
```
###### 実行結果
```
売上を表示したい曜日を番号で指定してください。月:0, 火:1, 水:2, 木:3, 金:4, 土:5, 日:6。:8
指定された番号の曜日は存在しません。
処理を終了します。
```
曜日として0〜6の数字が入力された場合には、対応する曜日の売上が表示されます。それ以外の入力では、エラーの種類に応じたメッセージが表示され、最後に処理の終了を伝えるメッセージが表示されます。
## まとめ
本章では、Pythonの歴史や特徴、JupitarLabによるPythonコードの実行方法、そして基本的な文法や制御方法について説明しました。簡単なプログラムであればここまでの内容で作成できるので、ぜひ色々なプログラムを作り、ちょっとした「自動化」を体験してみてください。