2-3.繰り返しの基礎を学ぼう
人間が苦手だけど,コンピューターが得意なこと,それは繰り返しと一貫性です.何かの計算を1万回間違いなく解いてと言われてできる人はおそらくいません.しかし,コンピューターであれば適切な式と命令が与えられれば,ものにもよりますが5秒程度で全ての計算が終わることでしょう.つまり,膨大な量のデータを瞬時に処理できるということです.繰り返し処理を学ぶことでこれまで処理できなかった膨大で複雑な計算を必要とするタスクも容易にこなすことができるようになるでしょう.
(1)配列(リスト)とインデックス
繰り返し文の学習に入る前に配列の作り方を学ぶ必要があります.配列は[ ]と,を使って表現します.[ ]で配列を囲い,,でそれぞれの要素を分けています.例えば,Pythonで使う配列は以下のように表現します.配列には数値も文字列も入れることが出来ます.
繰り返し文の学習に入る前に配列の作り方を学ぶ必要があります.配列は[ ]と,を使って表現します.[ ]で配列を囲い,,でそれぞれの要素を分けています.例えば,Pythonで使う配列は以下のように表現します.配列には数値も文字列も入れることが出来ます.
a = [1, 56, 25, 46] b = [“Brazil”, ”Russia”, “India”, “China”, “South Africa”]
では,変数aから25を,変数bからChinaを出力させたいとします.こうするにはどうしたら良いでしょうか?配列からその要素を抽出するには配列番号(インデックス)を知る必要があります.例えば,上記のケースでは以下のように目的の要素を表示させます.
print(a[2]) print(b[3])
上記のように表示できるのには,配列のそれぞれの要素に0から始まる数字が対応して付与されているからです.変数aの要素と要素番号の関係を以下に示します.
| 要素番号 | 0 | 1 | 2 | 3 |
| 要素 | 1 | 65 | 25 | 46 |
ここで特に注意しなくてはならないのが.インデックスは0から始まるということです.初心者はここを勘違いしてプログラムからエラーを出されることが多いので覚えておきましょう.
なお,インデックスは後ろから数えることも出来ます.先程の例のように変数aの25を表示させたい時は配列の一番右側を[-1]からスタートし,以下のように表現します.
print(a[-2])
(3) for…inを活用する
さて,ここからようやくfor文の出番です.for文はその後のinとセットで使われます.for…inの定義は以下のとおりです.
さて,ここからようやくfor文の出番です.for文はその後のinとセットで使われます.for…inの定義は以下のとおりです.
for variables in list:
配列list内の要素variablesを順次抜き出し,その数だけforブロック内の処理を実行します.
配列list内の要素variablesを順次抜き出し,その数だけforブロック内の処理を実行します.
例として,前ページの変数aを使ってforの簡単なプログラムを作成します.ここで,プログラム中のiやjがvariables,配列aがlistに相当します.
for_1.py
- a = [1, 56, 25, 46]
-
- for i in a:
- print(i)
-
- for i, j in enumerate(a):
- print(i, j)
-
enumerate(list)
配列list内の要素と要素番号を同時に対象の変数に格納します.
配列list内の要素と要素番号を同時に対象の変数に格納します.
for_1.pyの出力
1 56 25 46 0 1 1 56 2 25 3 46
出力にあるように,配列の各要素を抜き出し,その数だけ繰り返しを行っていることが見て取れます.更に,enumerate()関数を使うことで変数iに要素番号を,変数jに要素をそれぞれリストから吐き出し順次計算を行っていることが分かるかと思います.このようにfor…inを使うことでリストから繰り返しの動作を行えるようになりました.
(4) Whileで条件付き繰り返し
for…inだけではなく,whileという文を使うことで繰り返しを行なうことが出来ます.
for…inだけではなく,whileという文を使うことで繰り返しを行なうことが出来ます.
while conditional expression:
条件式conditional expressionがTureである限りネスト内を繰り返す
条件式conditional expressionがTureである限りネスト内を繰り返す
ここで,while文を使った簡単なゲーム風戦闘シーンを再現しましょう.
Game_Battle.py
- import random
-
- Man = 15 # hit point
- Monster = 20
-
- Nturns = 1 # Number of turns
-
- while Man >= 0 and Monster >= 0: # iterate code among nests as long as condition is “True”
-
- while Man >= 0 and Monster >= 0: # iterate code among nests as long as condition is “True”
- Attack_Man = random.randint(1,8) # determine striking power
- Attack_Monster = random.randint(1,5)
-
- Man -= Attack_Monster # equal to Man = Man - Attack_Monster
- Monster -= Attack_Man
-
- print(“Man is damaged:”, str(Attack_Monster))
- print(“Monster is damaged:”, str(Attack_Man))
-
- Nturns += 1
-
- # retrieve who is dead
- print(“At turn”,str(Nturns))
- if Man < 0:
- print(“Man is dead”)
- else:
- print(“Monster is dead”)
-
random.randint(start,end)
一様分布に従ってstartからendまでの範囲で整数をランダムに生成する
一様分布に従ってstartからendまでの範囲で整数をランダムに生成する
ここで初めてimportという文章が出てきました.importは外部ライブラリを呼び出すコードです.ここでの外部ライブラリはrandomです.random は乱数生成に関する関数が内包されたライブラリです.
ここで,#の後に変数の説明があることが分かるかと思います.これを「コメントアウト」と言います.#以後のコメントはその行内においてプログラムの実行には関わりません.これを応用すると,テストやバグ箇所の確認のために途中のコードをコメントアウトすることが出来ます.Atomでは,コメントアウトしたい範囲を選択してCtrl+/を押すとその範囲のコードを全てコメントアウト出来ます.
(5) BreakとContinue
繰り返し文で結構使用することが多いのがBreakとContinueです.前者は繰り返しを中断させるコマンド,後者は該当する処理だけをスキップするものです.下にBreakとContinueの例を示します.
繰り返し文で結構使用することが多いのがBreakとContinueです.前者は繰り返しを中断させるコマンド,後者は該当する処理だけをスキップするものです.下にBreakとContinueの例を示します.
Breakの例
Continueの例
- array = [1,2,3,4,5]
- for i in array:
- if i == 4:
- continue
- print(i)
-
左側は出力として1,2,3なります.右側は1,2,3,5となります.前者は条件式の4を迎えた時点で繰り返しが中断されています.後者は条件式の4を迎えたらその場合のprint(i)を実行せず,i=5の繰り返しに向かいます.breakの実用的な例としては,配列から特定の値を見つけ出したらもうこれ以上繰り返しを行う必要がないといったものです.具体的には以下のようなものがあります.
- Array = [45,68,100,56,29,56,88,69,92]
- for i in Array:
- if i > 80:
- print(Found target value:,i)
- break
-
Found target value:100
コラム3.メモ帳を使う猛者
プログラムを作る際にはプログラム開発に特化したエディタを使用することをおすすめします.しかし,一方でメモ帳を使ってプログラムを作る猛者を時々見かけます.エディタを使わないことによるデメリットは色々ありますが,特にプログラムの実行が面倒です.エディタを使えばエディタの内部でキーボードを一回クリックするだけで直ぐに開発したプログラムの実行内容を確認できます.
しかし,メモ帳を使った場合,プログラムを保存→コマンドプロンプトを実行→プログラムを指定して実行,というプロセスを踏まなくてはなりません.これらがエディタを使うことを推奨する理由の一つです.
コラム4.for _ の正体
時々コードを探しているとfor _ in range(5)のような表現を見かけます。普通はfor i in range(5)のように書くと思いますが、これはどう言う意味で、どういった動作を行うものなのでしょうか。
例えば、print(“TMU”)というコードを5回実行するプログラムでは、for _ in range(5): print(“TMU“)もfor i in range(5): print(“TMU“)も同じ結果を出します。ここでは、for文のネストに変数iが影響する動作はありません。ループの中でi=1,2,3...と変わっていってはいますが、これはprintとは無関係です。_の場合は変数は生成せずに指定された回数だけループ内の動作を実行します。
私はこれが好きで、「ループ内で変数が変わることはありませんよ」というメッセージをアンダーバー(_)から伝える事ができます。
ちなみに、ループ内の動作が一つだけであれば上記のようにfor文と動作を一行で書くことができます。