for文の気持ち

「for文を書こう」という着想を説明します

Posted by Sacoche on Monday, August 8, 2022

やること

超初心者向けにfor文を書くときの気持ちを言語化します (以前プログラミング始めたての方にシェアしたら、好評だったトピックです)

  • pythonで書くけど、Rでも基本は同じです。
  • 具体例を丁寧に書くので、非常に冗長です。

ストーリーの進め方は以下の通りです。

  1. for文を書かずに、for文を使うべきコードを書いてみる (for文のありがたさを知る)
  2. for文を書きたくなったら、手を出してみる
  3. 完成形を目指してコードを書く

この記事を読むと、あなたはだんだん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. 簡単で具体的なものを観察して、抽象化できると思ったらコードに反映させよう。
  3. コードを書くとき、やりたいこと説明できると完璧!1,2がしっかりできていれば、大丈夫です!

そんじゃあね。