ゼロからPython塾 第7回【Chapter6】繰り返し構文!for文とwhile文

こんちは。さのです。今日もよろしくです。

 BACK NUMBER 

前回(第6回)の記事はこちらこちら。まだ読んでない人はぜひ!

 

まずは前回の復習クイズの答え合わせから始めましょう!

height = float (input('身長を入力してください>>'))
weight = float (input('体重を入力してください>>'))

bmi = weight / height / height

print('あなたのBMIは%fです' %bmi)

if bmi < 18.5 :
    print('瘦せ型です、太りましょう!')
elif bmi >= 18.5 and bmi < 25.0:
    print('標準です、健康!')
else:
    print('肥満型です、痩せましょう!')
身長を入力してください>>2.04
体重を入力してください>>100.5
あなたのBMIは24.149366です
標準です、健康!

さあどうだったでしょうか。なかなかの難易度だったと思います…だからできた人は自信をもってください!

まずは身長と体重を入力させなければなりません。ここで1つ目の注意点です。input関数は前回の日付と違い、身長と体重なので、小数型でなければなりません。思い出してくださいね、小数型はintではなくfloatです。

次にそれらを計算し、BMI値を導きます。(体重[kg])÷(身長[m])^2 でしたね。つまり、体重を身長で2回割れば良いのです。もちろん「weight / (height * height)」でも大丈夫です。ただ、もしこれが10乗とかになった場合、この書き方では面倒ですよね。そんなときのために簡単に累乗を表す方法があります。それが「pow(height, 2)」です。カンマの後ろに指数を書くだけです。これも合わせて覚えておきましょう!


pow(〇, △)で、〇の△乗を表す!

BMI値を算出したら、それをprint関数で出力です。小数型の置換は%fでしたね!24.149366という結果が出力されています。なんだか小数点以下桁数が多いですね。削ることもできます。表示したい桁数が小数点以下1桁なら%0.1f、小数点以下2桁なら%0.2f・・・というように、%とfの間に0.〇と表示したい桁数を打ち込むだけです。

さて最後はその算出されたBMI値によって「痩せ型」「標準」「肥満型」の3パターンに振り分けるif文ですね。ここは特に注意点はありません。前回やった通りに、ifが18.0未満、elifが18.0以上25.0未満、そして25.0以上をelseとするだけです。

以上です。難しかったのはBMIを式で表現するところ、小数型だからfloatにするところの2点かなと思います。しっかり復習して知識を体系化させておいてください!

 

さて本日は、繰り返し構文についてです。その名の通り、繰り返したいときに使われます。この同じような役割を持った文法が2つあり、それがfor文とwhile文です。これらもまたよく出てくる基本文法なので、しっかり押さえていきましょう!

 目次 

【Chapter6】繰り返し構文!for文とwhile文

まずは基本的なことから
range関数
breakとcontinue

まず基本から
無限ループ
while文でのbreak

 

for文

まずfor文からやっていきましょう。forは「~のために」という和訳がまず思い浮かぶかもしれませんが、ここではfor a long timeなどにあるような「期間」を表す意味で用いられます。ある期間、つまりある始点から終点までを繰り返すよ、ということです。ループのforともよく言われます。

まずは基本的なことから

if文に基本形があったように、for文にも基本形はあります。何を繰り返したいかを指定して、それをある変数で表すだけです。早速ですがまとめましょう。

for 変数 in 何を繰り返したいか :
	繰り返したい条件

※コロンを忘れずに!

これだけではわかりにくいので、例を見ていきましょう。


list = [2, 5, 8, 12]
for a in list
print(a)

2
5
8
12

listという配列2、5、8、12の要素を繰り返して表示させるために、そのlistを変数aとしてfor文に組み込むことで各要素が繰り返し出力されます。もちろん、文字列でも同じことが言えます。

program = ['R', 'java', 'C++', 'C#']
for b in program:
    print(b)
R
java
C++
C#

基本的なことはこれだけです。繰り返したいものをなんかしらの変数に置き換えて、それを出力するだけですね!

range関数

これまで配列を作るときには、いちいち[ ]で囲んでました。でもそれってなかなか面倒ですよね。それを一気にやってしまおうというのが、range関数です。

例を見てみましょう。0から5まで出力するとします。

for n in range(6):
    print(n)
0
1
2
3
4
5

配列は0からスタートでしたね。だからrange(6)で0から5までの6つ出力されました。記述した数字より1つ前まで出力されます。

でも毎回0からスタートなんかしてられませんよね。1からスタートしたいときだってありますし、10からスタートしたいときだってあります。そんなときはこうしましょう。5から9まで出力してみましょう。

for n in range(5, 9):
    print(n)
5
6
7
8
9

スタートしたい数字をrange関数の左側に、終わりにしたい数字+1を右側に書くことで理想の始点と終点を決めることができます。右側に書いた数字までは到達しないことを注意してください。

もっと応用してみましょう。これまでは1ずつの増加でしたが、2ずつだったり、3ずつだったり増加幅も変えることができます。2から10まで4ずつ増加させてみましょう。

for n in range(2, 11, 4):
    print(n)
2
6
10

まずはrange関数の左側に始点、真ん中に終点+1を書きます。さきほどと一緒です。次に増加幅を右側に書きます。始点と終点を決めてから、増加分を決めるという手順です。簡単ですね、ここでまとめましょう。

0から〇まで1ずつ増加 range(〇+1)
◇から〇まで1ずつ増加 range(◇, 〇+1)
◇から〇まで◎ずつ増加 range(◇, 〇+1, ◎)

breakとcontinue

ループしていると、そんなに繰り返さなくていいよ!ってこともでできます。継続しているともたまに休んだりやめたくなることってありますよね、そんな感じです。それをしてくれるのがbreakで、指定したところで壊して止めてくれます。

for n in range(10):
    if n == 5:
        break
    print (n)
0
1
2
3
4

まずfor文でrange関数0から9までループを指示しています。0で1周、1で1周、2で1周、3で1周・・・と10回のループが行われていますね。0はif文の条件には当てはまらないのでbreakされずにprint関数により出力されます。1、2、3、4も同様にif文の条件には当てはまらないので、スルーしてprint出力されます。つぎに、6回目の5のループに入りました。5はif文の条件に当てはまるのでbreakされ、ここで処理が終了してしまいます。だから次にあるprint関数にはつながらず、出力されないのです。

なぜここまで丁寧に説明したかというと、次のプログラムとの違いをしっかりと分かってもらいたいからです。

for n in range(10):
    print (n)
	if n == 5:
        break
0
1
2
3
4
5

さきほどと同じようなプログラムなのに、5が出力されていますよね。違いは、print関数の位置ですね、if文よりも上にあります。これが原因です。つまり、for文の次に出力が行われ、そのあとにif文で条件が付け加えられています。出力のあとにif文がきているので、5と出力したあとにbreakが効果を発揮します。そのため、5までは出力され、そこで処理が終了するというわけです。

この違いを理解することができれば、if文はもう大丈夫です!しっかりと違いを確認しておいてください!

さて次は、continueです。これは名前の通り「つづけるよ」ということです。breakの逆ですね。continueすると、その前のfor文に戻って続くよというイメージです。

for n in range(50):
    if n % 7 != 0:
        continue
    print (n)
7
14
21
28
35
42
49

0から49までの数字で、7で割った余りが0になるものだけ表示しているプログラムです。if文の条件は7で割ったときの余りが0ではないときですね。その条件のときはcontinueされ、print関数には進まず、for文に戻ります。逆に、7で割った余りが0の時は無視され、下のprint関数につながります。このような処理が行われることで、7で割り切れる数だけ出力されます。

 

while文

次はwhile文です。whileは「~の間」というイメージで大丈夫です。その間を繰り返すよ、ということです。ではなぜ同じ役割を持つ文が2つもあるのでしょうか。

基本的にはfor文もwhile文も大差なく、どちらでも記述可能なのですが、複雑なプログラムになると、while文でないと書けないこともでてきます。while文はfor文の応用みたいな感じで、汎用性が高いのです。fじゃあwhile文だけでいいじゃんとか言わないでくださいね。事実while文だけあればなんとかなってしまうので…

まず基本から

とりあえず基本形を確認しましょう。こんな感じです。

while (条件の式) :
	繰り返したい条件

※コロンを忘れずに!

これだけ!?と思われたかもしれませんが、これだけです。forより短いですね。早速例を見ていきましょう。1から5までのループを表示させます。

n = 1
while (n <= 5):
    print(n)
    n += 1
1
2
3
4
5

1から5までが出力されましたね。まず1行目でnに1を代入します。そしてそのnが5までの繰り返しをすればOKなので、whileの条件式にはnが5までが入ります。そしてprint関数によりそれを出力します。その下にある「n += 1」というのは、これは「n = n+1」と同値です(このように表すのはルールなので覚えるしかありません、下の表で覚えましょう)。この意味は、既存のnに1を足して、それを新しいnとしてくださいね、ということです。つまり、n+1をnに新たに代入しているのです。こうすることで、nは1ずつ増加しますね。これが5以下であるうちは続けられるのです。

a = a+b a += b
a = a-b a -= b
a = a*b a *= b
a = a/b a /= b

「n = n+1」とか「a = a+b」なんかあり得ないじゃん、イコールじゃないじゃんと思うかもしれませんが、プログラムで用いられる「=」は等号ではありませんよね?ただの代入記号です(等号は「==」で表されます)。だから何の問題もありません。

while文も簡単ですよね!どんどん行きましょう!

無限ループ

名前の通り、ここからここまでですよというループの範囲を決めないで無限に繰り返されるループのことです。1から無限につづくプログラム例を見ていきましょう。

n = 1
while (True):
    print(n)
    n += 1
1
2
3
4
5
6
7
8
...

こちらでもまずはnに1を代入します。そして先ほどは条件式が入っていたwhileのカッコ内にTrueが入っていますね。これはどんな条件でもTrueだから範囲がないよということを示しています。これが原因でループが無限に続くわけです。あとは先ほどと同じです。1が足されて次のループでまた足されて…が続いて永遠に足されていくのです。

while文でのbreak

今やった無限ループを打ち切るにはどうすればいいのでしょう。for文で同じようなことやりましたね、そうです、breakです。では先ほどのプログラムを10で打ち切ってみましょう。

n = 1
while (True):
    print(n)
    n += 1
    if n == 11:
        break
1
2
3
4
5
6
7
8
9
10

nが11になったら打ち切れば、10まで出力してくれますね。breakの使い方は先ほどのfor文と同じです。いい復習になりましたね。

 

お疲れさまでした!いかがでしたか?繰り返しはパーフェクトになりましたね!while文だけできればまぁなんとかなるんですが、知っておくことは大切なのでfor文も理解しておいてくださいね!では最後にクイズです。今回の内容だけでは解けませんよ!今まで習ったことをフルに活用してください!


1から30までの数字を出力するプログラムを書いてください。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」と出力し、3と5両方の倍数の場合には「FizzBuzz」と出力すること。
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz

 

※私はWindows派なので、この記事の通り進めていくとMacを使っている方はうまくいかないことがあるかもしれません。が、お許しください。もしご要望があれば、頑張って対応していきたいと思います。ちなみに私はDELLのXPS13、Windows10でやっています。
※記事を読んでいて「おかしいぞ?」とかプログラミングをして「実行してもエラーだぞ?」などあったら遠慮なく以下のメッセージから教えてください。お願いします!その他疑問も受け付けております。

最後まで読んでいただきありがとうございました。

 NEXT NUMBER 

次回(第8回)はもう少しお待ちください!

ではまた!!!!!!!

無料メールマガジン登録

週1回、注目のAIニュースやイベント情報を
編集部がピックアップしてお届けしています。

こちらの規約にご同意のうえチェックしてください。

規約に同意する