今回作るものをまずは確認しよう。
[実行例]
何段の階段を作る?>5 * ** *** **** *****
階段の高さを入力すると*によって上のような階段を描画するプログラムだ。
今回は*を繰り返し出力するわけだがこういった時にはfor文を使う。
まずはfor文の基礎から学習しよう。
for i in range(5): print(i)
[結果]
0 1 2 3 4
まずはrange()メソッドの理解が必要だ。これは引数に5などを指定すると
range(5) # 0,1,2,3,4
といった並び式を生成する。引数二つだと開始を指定できる
range(3,5) # 3,4
さらに引数3つでstepを指定できる
range(1,10,3) # 1,4,7
for文はこの並び式を先頭から一つずつ取り出しながら繰り返し処理をする。
つまり、
for i in range(5): print(i)
とすれば最初は0を取り出してそれをiに代入する。
そしてスイート(実行される処理部)に進みそのiを出力している。
for文はその並び式の要素がなくなるまでそれを繰り返す。
今回で言えば0,1,2,3,4と一つずつ取り出しながら5回繰り返し処理を行うわけだ。
一般にfor文は以下のように表せる。
for 変数 in 並び式: スイート
OKだろうか?基本的な問題をやっておこう。
問題
1から10まで以下のように出力せよ。
1 2 3 4 5 6 7 8 9 10
[解答]
for i in range(1,11): print(i,end=' ') print()
注意すべき点はrange()の第2引数の値はn-1の値までしか使われない点だ。今回のように10まで使いたい時は11を指定する必要がある。
それと今回はprint()の引数にend=’ ‘ というを付け加えている。こうすると改行することなしに、指定した文字を最後に出力する。(今回は半角スペース)
そしてfor文を抜けた後にprint()として改行処理を行っている。
2重for文
for文は入れ子にすることができる。
さっそくサンプルを見てみよう。
for i in range(1,4): for j in range(1,11): print(i*j,end=' ') print()
複雑になったがあわてないでほしい、順番に見ていけば大丈夫だ。
まずfor文はrange(1,4)で生成される並び式1,2,3から最初のひとつの目の1を取り出して処理の部分に入る
そうしたらiが1の状態で中のfor文(うす緑の部分)を普通に行う。
うす緑の部分のfor文はrange(1,11)で生成される1,2…10を一つずつjとして取り出し繰り返し処理を行うものだ。
最初に取り出されるのは1。
print(i*j,end=' ')
iもjも1なので最初に1と半角スペースが出力される。
1
うす緑の部分のfor文のルールにしたがって次に2がjとして取り出される。
print(i*j,end=' ')
iが1でjが2になので2と半角スペースが出力される
1 2
うす緑の部分のfor文は同様に10までを出力する。
1 2 3 4 5 6 7 8 9 10
うす緑の部分の繰り返し処理が全て終了したので、for文を抜け
print()
で改行処理を行う。
これで外側のfor文のiが1の時の処理が終わったことになる。
次に取り出されるiは2だ。こんどはiが2の状態で緑の部分の処理を行うことになる。
ここの部分はrange(1,11)で生成される1,2…10を一つずつjとして取り出すfor文だ。
最初にjとして1を取り出して処理を行う。iは今2なので
print(i*j,end=' ')
の処理は2と半角スペースの出力となり
1 2 3 4 5 6 7 8 9 10 2
次にjとして2を取り出して
print(i*j,end=' ')
を行う。iは2なので
1 2 3 4 5 6 7 8 9 10 2 4
以下同様にjが10まで繰り返され
1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20
最後に改行処理を行ってうす緑の部分が終了となる。
iが2の時の処理が終わったので次はiが3だ。
ここの部分にある処理はrange(1,11)で生成される1,2…10を一つずつjとして取り出すfor文だ。
iが3,jが1なので
print(i*j,end=' ')
は3と半角スペースを出力する。
1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3
次にjとして2を取り出す。3*2は6だ
1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6
以下同様にjが10まで繰り返される
1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30
最後に改行してiが3の時のうす緑の部分が終わりだ。
外側のfor文も全部終わったのでこれでこの2重for文はすべて終了となる。
ちなみにiとかjとかの変数名はこういった場合によく使われるものでカウンター変数と呼ばれたりする。
最初の課題にチャレンジ
ここまで理解できたら最初の問題はもうできる。
一緒にやっていこう。
何段の階段を作る?>5 * ** *** **** *****
1.
まず文言を出力して、ユーザーからの入力を受け取るので。
height=int(input('何段の階段を作る?>'))
これは
height=input('何段の階段を作る?>') height=int(height)
と今まで2行に分けて書いていた処理を一度に行っている。
結果はもちろん同じでユーザーがいれた文字列としての数字を数値に変換している。
これで高さがわかったのでまずは高さの回数分回るfor文をつくりたい。
もしユーザーが3と入力したら3回,5と入力したら5回まわすループを作るにはどうすればよいだろうか?
range(height)
を使えば良さそうだ。
もしユーザーが3と入力するとrange(3)は0,1,2
5と入力するとrange(5)は0,1,2,3,4
これで入力した回数まわるループができる。
コーディングしていこう。
height=int(input('何段の階段を作る?>')) for i in range(height):
これで段数の分まわるループができたが処理の部分はどうかけばよいだろう?
まずは普通にiの値を出力してみよう。
height=int(input('何段の階段を作る?>')) for i in range(height): print(i)
[結果]
何段の階段を作る?>5 0 1 2 3 4
0と出ているところが*
1と出ているところが**
2と出ているところが***
3と出ているところが****
4と出ているところが*****
となってくれれば良い。
その数字(iの値)に1を足した数のぶんだけ*を繰り返し描画すればよさそうだ。
height=int(input('何段の階段を作る?>')) for i in range(height): for j in range(i+1): print('*',end='')
非常にいい感じだが、どこにも改行処理が入っていないのでこれでは一列にすべて描画してしまう。
*を繰り返し描画している内側のfor文が終わったところで改行処理を入れれば良い。
height=int(input('何段の階段を作る?>')) for i in range(height): for j in range(i+1): print('*',end='') print()
OK!これで完成だ。
今回やった部分は初学者には難所の部分の一つだ。くり返し練習しコツを掴んでいこう。
コメント