皆さんこんにちは!
ENHANCERのPengです!
今回は6月3日にENHANCERのメンバーで行ったZoom定期勉強会の内容の二つ目、「多重ループを抜ける方法」について書いていこうと思います!
みなさん、食欲に耐えられず甘いものを食べ続けてしまう無限ループに陥ったことはありませんか?
それは健康上大変危険です。
そんな無限ループからの脱出法ですら、Pythonが教えてくれるかもしれません。(※教えてくれません。)
意外とわからない多重ループの仕組みとその抜け方を学んでいきましょう!
僕らENHANCERはプログラミング初学者がお互い高め合って成長できるように立ち上がったわけですが、その一環として定期的に勉強会を行っています。
勉強会では、各自がわからなかったところや発見したことなどを持ち寄って議論することを基本としているわけですが、ここでは今回話題に挙がった「多重ループの抜け方」について説明していきます。
今回の勉強会ではこのほかに「モジュール・パッケージとは」「import文」「関数とメソッド」などをみんなで勉強しました!
その内容はこちらにまとめてあります!
ループ文
ループ文ってなんでしょう。ループ文とはその名の通り、プログラムを何回か繰り返す文章です。
例えば以下のようなものがあります。
for i in range(100):
print("北斗百裂拳")
これは「北斗百裂拳」を100回実行する恐ろしいコードです。。。
このように目的としているものを繰り返すことができるのがループ文の強みですね。
forループ
多重ループの説明の前に、「forループ」おさらいをしておきましょう。
forループでは以下のような構文で動作します。
for [変数名] in [イテラブル※]:
[コードブロック]
※値に含まれている要素を一個ずつ順に取り出すことができるオブジェクト。
例えば、このようにコードを書くと、、
name = "Satoshi"
for master in name:
print(master)
S
a
t
o
s
h
i
と出力されます。また、このようにコードを書くと、、
names = ["Satoshi", "Takeshi", "Kasumi"]
for character in names:
print(character)
Satoshi
Takeshi
Kasumi
と出力されます。
つまりここではそれぞれ「”Satosi”」、「”Satoshi”,”Takeshi”,”Kasumi”」がイテラブルです。
また、冒頭で挙げたように、range()
を用いて回数を指定すると、その回数分だけプログラムを実行できます。
ループの抜け方
forループを用いたループ文の抜け方にはbreak
を使います。
例えばこんな感じです。
for i in range(100):
print("北斗百裂拳")
break
北斗百裂拳
実行すると、なんと100回発動されるはずの北斗百裂拳を一回に抑えることができました!!break
はすばらしいパワーを秘めています。
多重ループ
では、多重ループとはどのようなループでしょうか。
例えば以下のような文章があります。
a = ["ドーナツ", "ケーキ", "ポテチ"]
b = ["食べたい", "食べよう","おいしかった"]
for i in a:
for j in b:
print(i,j)
すると、このように出力されます。
ドーナツ 食べたい
ドーナツ 食べよう
ドーナツ おいしかった
ケーキ 食べたい
ケーキ 食べよう
ケーキ おいしかった
ポテチ 食べたい
ポテチ 食べよう
ポテチ おいしかった
なんて欲求過多な文章でしょう。このループを「食欲の地獄ループ」と名付けておきます。これでは確実に糖尿病になります、。
それはさておき、この多重ループ(ここでは2重ループ)では、このように大きなforの一つ目を行うたびに、中に入ってるforがすべて繰り返される形で文章を繰り返していっていることに気が付いたでしょうか。これが多重ループの仕組みです。
多重ループの抜け方
ではここまでを理解した上で、恐ろしい食欲の地獄ループの抜け方を考えてみましょう。
ドーナツを食べた後にケーキが食べたくなって、加えてポテチなんて、、、
たまにはいいですが、ドーナツを食べた後にケーキが食べたくなっても我慢しなければなりません。地獄ループから抜け出しましょう。
まずはいつも通りbreak
を使って以下のようにコードを書いてみます。
a = ["ラーメン", "ケーキ", "ポテチ"]
b = ["食べたい", "食べよう","おいしかった"]
for i in a:
for j in b:
print(i,j)
if i == "ケーキ" and j == "食べたい":
break
このコードでは「もし i がケーキ、j が食べたいになったらループを止める」と指示してます。しかし、これを実行するとこのようになってしまいます。
ラーメン 食べたい
ラーメン 食べよう
ラーメン おいしかった
ケーキ 食べたい
ポテチ 食べたい
ポテチ 食べよう
ポテチ おいしかった
なんてことでしょう。ケーキを我慢したのにポテチを食べてしまいました。実はここでは「ケーキ食べたい」の文章が出てきたところの小さなループしか中断できていません。
つまり、二周目はbreakされたわけですが、三周目はbreakされていないためポテチを食べてしまう羽目になってしまいました。
ドーナツだけで我慢するにはどうすればいいのでしょうか。食欲に勝つことは不可能なのでしょうか。
・・・
安心してください。このようにコードを書けば食欲の地獄ループから抜けることができます。
a = ["ラーメン", "ケーキ", "ポテチ"]
b = ["食べたい", "食べよう","おいしかった"]
mind = False
for i in a:
for j in b:
print(i,j)
if i == "ケーキ" and j == "食べたい":
mind = True
break
if mind :
break
なにを変えたかというと、「mind = False」を変数として加え、外側ループ「for i in a」の方に「if文」を、内側ループに「mind = True」を加えました。これを実行すると、、
ドーナツ 食べたい
ドーナツ 食べよう
ドーナツ おいしかった
ケーキ 食べたい
素晴らしい。ドーナツだけで我慢することができました!!
どうしてこうなったかというと、
「i が ケーキ、j が 食べたい」になったとき、mind が 「False」から「True」に変換される。
↓
外側ループのfor文で常に「False」だった「mind」が「True」になることによってif文が動作し、外側ループも「break」が発動。
といったかんじです。
また、「i == “ケーキ”、j == “食べたい”」になる前は常に外側ループのif文は「False」となっているので、このようなコードも書けます。
a = ["ドーナツ", "ケーキ", "ポテチ"]
b = ["食べたい", "食べよう","おいしかった"]
mind = False
for i in a:
for j in b:
print(i,j)
if i =="ポテチ" and j =="おいしかった":
mind = True
if mind :
print("糖尿病になった")
else :
print("太った")
食欲に身を任せた結果、どんな結末に至ったか、あなたのご想像にお任せします。健康第一!!
・・・
おわりに
これで6月3日勉強会②「多重forループを抜ける方法」を終わりたいと思います。
今回の内容は「GitHub」にコードを上げていますので、以下のリンクからご確認ください。
皆さんが健康的な生活を送れることを心より祈っております。
次回の記事もお楽しみに!
ENHANCER Peng
“6月3日勉強会 ② ~ 多重forループを抜ける方法 ~” への2件の返信