どうも~むるむるです~
今回の記事では「繰り返し処理:For文,While文」について学んでいきたいと思います.
このシリーズではプログラミング初心者が最低限のPythonの知識を最短で身に着けることを目標としています.
このシリーズでは以下の順番でPythonの基本的な知識を学習していきます.
- Python:Anacondaインストールとhello world,簡単な計算,コメントアウト
- 変数について
- データ型:int, float, str, bool
- データ型:list, tuple, dict
- 条件分岐:if – else 文
- 繰り返し:for文,while文 (この記事)
- 関数の定義,呼び出し,ラムダ式
- クラス
- モジュールのインポート
- 例外処理:try, except, else, finally
- map, reduce, filter
繰り返し:For文
For文は同じ処理を繰り返し行いたい場合に使われます.構文は以下のようになります.
処理
イテラブルオブジェクトとは,ザックリ言うとリストやタプルなどの複数の要素を含み,そこから一つずつ取り出せるものです.
for文を使うと,そのイテラブルオブジェクトの入っている要素を一つずつ取り出して変数に代入していきます.
例を見てみた方がわかりやすいでしょう.
list1 = [0, 1 ,2 ,3] for i in list1: print(i) ''' 出力結果: 0 1 2 3 '''
if-else文の時と同じで for文の中身を書くときも1つ分だけインデントを下げなくてはいけません.
上の例では「[0, 1, 2, 3]」というリストの前から一つずつ変数「i」に代入して出力をしています.
もちろん,リストの要素は整数である必要はなく,文字列や小数,真偽値の他,リストのリストを作ることもできます.
# listのlist listOflist = [[1,2,3], [4,5], [6,7,8]] for li in listOflist: print(li) ''' 出力結果: [1, 2, 3] [4, 5] [6, 7, 8] '''
range関数
毎回上のようにリストを自分で書くのは面倒だと思う方も多いでしょう.そういうときはrange関数の出番です.
range関数を使えば簡単に数字の連番などが作れます.
以下の表とコードを見てください.
range関数 | 意味 | 例 |
range(n) | 0からn-1までの連番 | range(5): 0, 1, 2, 3, 4 |
range(n, m) | nからm-1までの連番 | range(2,5): 2, 3, 4 |
range(n, m, l) | nからm-1までのl飛びの数字 | range(2, 10, 3): 2, 5, 8 |
## range for i in range(3): print(i) print('==========') for i in range(3, 5): print(i) print('==========') for i in range(1, 10, 2): print(i) ''' 出力結果: 0 1 2 ========== 3 4 ========== 1 3 5 7 9 '''
最後の数字が含まれないことに気を付けてください.
数字を小さい順に並べたいときもrange関数を使って以下のように書くことができます.
## 逆順 for i in range(10, 0, -2): print(i) print("=======================") for i in reversed(range(2, 11, 2)): print(i) ''' 出力結果: 10 8 6 4 2 ======================= 10 8 6 4 2 '''
2つ目のfor文ではreversed関数を使っています.これを使うことでrange関数をそのままひっくり返すことができます.
breakとcontinue
for文を書いているうえで,途中で条件を満たしたときだけ繰り返し処理をスキップしたり,その場でストップしたいときもあると思います.
そういう時は「break」と「continue」を使います.
下の例を見るのが一番わかりやすいでしょう.
# continue と break print('continueを使った場合') for i in range(5): if i == 2: continue print(i) print('=================') print('breakを使った場合') for i in range(5): if i == 2: break print(i) ''' 出力結果: continueを使った場合 0 1 3 4 ================= breakを使った場合 0 1 '''
for文の中で「continue」を使うと,その回だけ繰り返し処理がスキップして次の回にいきます.
上の例では変数「i」が2の時だけ,繰り返し処理をスキップし次に進んでいるので0, 1, 3, 4は出力されていますが,2は出力されていないのがわかると思います.
「break」は「continue」と少し似ていますが,「break」のときは,その場でfor文から抜けてしまうので,上の例では0, 1だけ出力されて,それ以降は出力されていません.
リスト内包表記
新しいリストを作るときに,リスト内表記というのを使うと,簡単にリストが作れます.リスト内包表記は以下のように書くことができます.
例を見てみましょう.
sq = [i**2 for i in range(10)] print(sq) ''' 出力結果: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] '''
リスト内表記の書き方と上のコードを見比べてみてください.
上のコードでは0から9まで(「range(10)」)の値を2乗した値(「i**2」)がリストに入っています.
また,リスト内包表記には条件を追加することもできます.書き方と例を見てみましょう.
sq_even = [i**2 for i in range(10) if i % 2 == 0] print(sq_even) ''' 出力結果: [0, 4, 16, 36, 64] '''
上の例では条件(「i % 2 == 0」)のときだけ「i**2」を要素とするリストを作っています.つまり,偶数の2乗のリストになっています.
繰り返し:While文
for文ではイテラブルオブジェクトの要素がなくなるまで繰り返し処理を行いましたが,繰り返し処理を行う別の方法としてWhile文を使う方法があります.
While文は設定した条件がTrueである限り繰り返し処理を続けます.書き方とコード例は以下です.
条件式がTrueのとき実行される処理
count = 0 while count < 5: count += 1 # count = count + 1 と同じ print(count) ''' 出力結果: 5 '''
上では「count < 5」を満たしている間は繰り返し処理が行われ,そうでなくなったときに繰り返し処理をやめます.上にある「+=」はコメントにもあるとおり,自身の値に右辺の値をさらに足したものを代入することを意味する代入演算子です.
While文を使うときに気を付けたいのが条件式がずっと「True」のままだと,繰り返し処理から抜け出せなくなります.例えば以下の例を見てみてください.
# 無限ループ count = 1 while count > 0: count += 1
上のコードでは「count > 0」を満たす限り繰り返し処理が続けられますが,自身の値に毎回1を足していっても,いつまでたっても条件式「count > 0」は「False」になりません.
このように繰り返し処理のループから抜け出せなくなることを無限ループと言ったりしますが,たまに気づかずにやってしまうので気を付けましょう.
確認クイズ
クイズ1
以下のコードで出力される値を考えてみてください.考えたら実際にコードを書いてみて当たっているか確認してみましょう.
for i in range(100): if i % 2 == 0: continue if i % 3 == 0: print(i) if i == 21: break
クイズ2
リスト内包表記を使って,0~100まで3の倍数だけを含むリストを作ってください.
次回
次回は「関数の定義,関数の呼び出し,ラムダ式」について学習します.
次の記事はこちら.
機械学習のためにしっかりとPythonを勉強したいなら,ある程度の基礎を身に着けた後に下の本を読むのがお勧めです.この本をこなせば,より高いレベルへ到達できるでしょう.