やること
超初心者向けにfor文を書くときの気持ちを言語化します (以前プログラミング始めたての方にシェアしたら、好評だったトピックです)
- pythonで書くけど、Rでも基本は同じです。
- 具体例を丁寧に書くので、非常に冗長です。
ストーリーの進め方は以下の通りです。
- for文を書かずに、for文を使うべきコードを書いてみる (for文のありがたさを知る)
- for文を書きたくなったら、手を出してみる
- 完成形を目指してコードを書く
この記事を読むと、あなたはだんだんfor文を書きたくなる…!
課題
九九のnの段までを表示してください。ただし、すでに既出の計算は非表示にしてください。 例えば、2の段まで表示するとします。1の段で1×2が登場するので、2の段で2×1は表示しないようにしてください。
解答例は以下の通りです。
これを目指して、コーディングしていきましょう。
def TimesTable(n):
for i in range(1, n+1, 1):
print(f'''{i}の段''')
for j in range(i, 10, 1):
answer = i*j
print(f'''{i} × {j} = {answer}''')
TimesTable(2) # example: n=2
## 1の段
## 1 × 1 = 1
## 1 × 2 = 2
## 1 × 3 = 3
## 1 × 4 = 4
## 1 × 5 = 5
## 1 × 6 = 6
## 1 × 7 = 7
## 1 × 8 = 8
## 1 × 9 = 9
## 2の段
## 2 × 2 = 4
## 2 × 3 = 6
## 2 × 4 = 8
## 2 × 5 = 10
## 2 × 6 = 12
## 2 × 7 = 14
## 2 × 8 = 16
## 2 × 9 = 18
1の段を書いてみる
for文を書かずに、for文の内容を書く
超初心者は最初から完成形を目指してはいけません。まずは求めるものの一部で良いから動くものを作りましょう。
今回で言うと、1×1, 1×2,…をとりあえず書きたいですよね。やってみましょう。
1*1
## 1
1*2
## 2
1*3
## 3
1*4
## 4
やりたいことはできていますが、さすがにそろそろ面倒ですよね?
要は後ろの数が1つずつ増えていくだけです。1から始まって、1ずつ増えて、10になったら計算を終了してほしい… そうですね、for文の出番です。
ポイント: 入門したての人は、まず簡単な例を自分の目で確かめる。
1の段をfor文で書く
わざわざfor文を書かずに書くことで、「後ろの数が1つずつ増えていくだけじゃん」と気づくことができました。そこでfor文の出番です。
for i in range(1, 10, 1): # iは1から始まって1ずつ増加し、10になったら終了する。
answer = 1*i
print(answer)
## 1
## 2
## 3
## 4
## 5
## 6
## 7
## 8
## 9
かんたんでしょ?
nの段までの九九を書く
for文を使わずに
1の段を書けたので、同じ用に2の段, 3の段, …と書いていきましょう。
2の段は2×1, 2×2, 2×3, … ですから、2×iを作ればいいだけです。
for i in range(1, 10, 1): # iはから始まって1ずつ増加し、10になったら終了する。
answer = 2*i # 2にすればいいだけ
print(answer)
## 2
## 4
## 6
## 8
## 10
## 12
## 14
## 16
## 18
続いて3の段
for i in range(1, 10, 1): # iはから始まって1ずつ増加し、10になったら終了する。
answer = 3*i # 3にすればいいだけ
print(answer)
## 3
## 6
## 9
## 12
## 15
## 18
## 21
## 24
## 27
続いて4の段
for i in range(1, 10, 1): # iはから始まって1ずつ増加し、10になったら終了する。
answer = 4*i # 4にすればいいだけ
print(answer)
## 4
## 8
## 12
## 16
## 20
## 24
## 28
## 32
## 36
以下略…
結局 × の前の数字が1つずつ増えていくだけですね。1つずつ増やしたい…nの段まで増やしたい…n+1は表示したくない…
そうです、またもやfor文の出番です。for文を使って表しましょう。
for i in range(1, 4, 1): # 例として3の段まで
for j in range(1, 10, 1):
answer = i*j
print(answer)
## 1
## 2
## 3
## 4
## 5
## 6
## 7
## 8
## 9
## 2
## 4
## 6
## 8
## 10
## 12
## 14
## 16
## 18
## 3
## 6
## 9
## 12
## 15
## 18
## 21
## 24
## 27
このように、表したい具体的な事象を抽象化してコードに翻訳していくことが重要です。 目指すコードは抽象的ですが、最初から抽象的なコードを書くのは困難です。 コードを考えるときは、初学者ほど具体例を作るべきだと思います。
完成形を作る
要件に合わせる
いい感じで九九を書けていますね!
ただ、かぶっている九九を表示したくないわけです。例えば1×2と2×1は被っている。2×1を消したい。 だから、2の段は2から始まってほしい。3の段は3から始まってほしい。4の段は4から…
そうですね、aの段はaから始まればよいだけです。また具体例に助けられました。コードを修正しましょう。
for i in range(1, 3, 1): # 例として2の段まで
for j in range(i, 10, 1):
answer = i*j
print(answer)
## 1
## 2
## 3
## 4
## 5
## 6
## 7
## 8
## 9
## 4
## 6
## 8
## 10
## 12
## 14
## 16
## 18
体裁を整える
最後に体裁を整えましょう。
- 1の段、2の段と、何の段かを明示する
- 九九の結果だけでなく、かける数かけられる数を記載する
f文字列を使います。(こういうのは慣れなだけ)
for i in range(1, 3, 1):
print(f'''{i}の段''')
for j in range(i, 10, 1):
answer = i*j
print(f'''{i} × {j} = {answer}''')
## 1の段
## 1 × 1 = 1
## 1 × 2 = 2
## 1 × 3 = 3
## 1 × 4 = 4
## 1 × 5 = 5
## 1 × 6 = 6
## 1 × 7 = 7
## 1 × 8 = 8
## 1 × 9 = 9
## 2の段
## 2 × 2 = 4
## 2 × 3 = 6
## 2 × 4 = 8
## 2 × 5 = 10
## 2 × 6 = 12
## 2 × 7 = 14
## 2 × 8 = 16
## 2 × 9 = 18
きれいに出力できましたね!
最後にnの段まで返す関数にしておしまいです。
# 解答例
def TimesTable(n):
for i in range(1, n+1, 1):
print(f'''{i}の段''')
for j in range(i, 10, 1):
answer = i*j
print(f'''{i} × {j} = {answer}''')
TimesTable(2) # example: n=2
## 1の段
## 1 × 1 = 1
## 1 × 2 = 2
## 1 × 3 = 3
## 1 × 4 = 4
## 1 × 5 = 5
## 1 × 6 = 6
## 1 × 7 = 7
## 1 × 8 = 8
## 1 × 9 = 9
## 2の段
## 2 × 2 = 4
## 2 × 3 = 6
## 2 × 4 = 8
## 2 × 5 = 10
## 2 × 6 = 12
## 2 × 7 = 14
## 2 × 8 = 16
## 2 × 9 = 18
まとめ
完成しました!入門時点で大事な点は次の3つだと思います。
- まずは簡単な例から。1番小さな例から始めよう。
- 簡単で具体的なものを観察して、抽象化できると思ったらコードに反映させよう。
- コードを書くとき、やりたいこと説明できると完璧!1,2がしっかりできていれば、大丈夫です!
そんじゃあね。