【入門者向け】FizzBuzzを通して掴むPythonプログラミングの概要|Python入門 #1

f:id:lib-arts:20190116121417p:plain

下記の記事でPythonを勧めたので簡単な入門者向けのチュートリアル記事を書いておこうと思います。

プログラミング未経験で何もやったことがない方向けという想定で書きますので、他の言語の経験者は所々読み飛ばしていただくのが良いと思います。
ちなみに、プログラマでなくとも基本的なプログラミングを知っておくことで色々と仕事の効率化ができて得する場面が多いので、知っておくと良いと思います。

 

さて、対象読者の想定を行った上で早速内容ですが、#1ではFizzBuzz問題を主に取り扱います。何故FizzBuzz問題かというと、この問題にプログラミングの一番基本となる繰り返し(for文)と条件分岐(if文)が出てくるからです。問題自体は一度理解してしまえば大した問題ではないのですが、繰り返しと条件分岐の組み合わせは数多くのシチュエーションで出てくるのでこれができるかできないかでコーディングの自由度が大きく変わります。
なので、必ず身につけていただきたいと思います!

以下目次になります。


1. FizzBuzz問題の概要、実装戦略
2. 実装にあたってのPythonの構文
2.1 Pythonの変数、配列
2.2 Pythonの繰り返し文(for文)
2.3 Pythonの条件分岐文(if文)
3. 実装結果&解説


1. 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, 31, 32, Fizz, 34,...., Fizz, 100

上記のように出力を行うプログラムを構築せよ。詳細としては1から100の数字を出力していく中で、3で割り切れる場合は「Fizz」、5で割り切れる場合は「Buzz」、両者で割り切れる場合(すなわち15で割り切れる場合)は「FizzBuzz」と出力すれば良い。(ここで、カンマ区切りか改行区切りかは問題上どちらでも良いので、特に指定はないものとする)

上記がFizzBuzz問題になります。問題自体はシンプルになります。

・実装戦略
この問題はどのように考えると良いでしょうか。3つの要素に分解して説明します。
1つめとして、数を扱う方法について色々と知らねばなりません。プログラミング言語において数字を扱うには変数や配列という考え方を理解しておく必要があります。それぞれ言語によって若干用法が異なるものの、本質的な目的自体はほぼ同じと考えて良いので、言語問わず汎用的な概念です。2.1節では変数や配列の基本的な考え方とPythonにおける実現方法について簡単にまとめます。
2つめは、数を数え上げるには処理が重複になることに関連します。出力を行うprint文を使うにもこのままだと100回書かなくてはなりません。が、100回も同じ処理を書くのは辛いし変更したい際に編集箇所が多く大変です。こちらは繰り返し文という考え方を理解すると良いです。繰り返し文については2.2節で基本的な考え方とPythonにおける実現方法についてまとめられればと思います。
3つめとしては、繰り返し文内で条件によって処理の分岐が必要となってきます。単に数字だけを出力しないように色々と処理を分岐しなくてはなりません。条件分岐に関しては2.3節で基本的な考え方とPythonにおける実装について取り扱います。

上記を踏まえてコーディング戦略を考えてみます。簡単に3段階にしてみました。

1. 1~100の数字を出力できるようにする
2. 1のプログラムにおいて3の倍数の時だけFizzを出力できるようにする
3. 題意を満たすプログラムにする

なんとなく実装の方針についてイメージがついてきたところで、実際に2節でPythonの文法も交えながら説明していきたいと思います。


2. 実装にあたってのPythonの構文

2節では実際にPythonの実装を交えながらそれぞれの要素についてご説明できればと思います。
環境としてはJupyter(ブラウザでPythonが実行できる対話環境)を推奨します。手順は後日別記事でまとめますが、環境構築は大変なので知り合いの詳しい方に頼むというのも一つの手です。(実際に環境周りで失敗すると先に進めなくてモチベーションが下がると思います)


2.1 Pythonの変数、配列

まずは1~100までの数字を扱わなくてはなりませんので、Pythonにおいての数字の使用方法についてまとめます。
">>>"がある行は出力なので、何もない行をコピペで実行してみてください。#はコメントアウトでコメントをつけたい際に使用します。

・変数
a=1 #数字の取り扱い
b=2
print(a)
>>> 1
print(type(a))
>>> <class 'int'>
print(a+b)
>>> 3

 

・配列(リスト)
a=[1,2,3,4]
print(a)
>>> [1, 2, 3, 4]
print(a[1])
>>> 2
print(type(a))
>>> <class 'list'>
print(type(a[1]))
>>> <class 'int'>

上記がPythonにおける数字の取り扱い方です。変数は一つのもの、配列は複数のものを取り扱うと一旦理解しておくと良いです。また、それぞれ文字だけでは何が入っているかわからない際の手助けとして、type関数は便利なので聞いたな程度には抑えておいていただく方が良いと思います。ここではlistは配列の一つ、intは変数の型(形式程度の理解で十分です)を表しています。a[1]とすれば配列から値を取り出すことができ、0から数えるので2番目の値ということで2を出力します。これはint型(整数の取り扱いに使用)なのでtypeを使うことでintを出力します。

変数や配列の扱いについては色々とあるのですが、情報量をなるべく減らしたいため一番ベーシックな内容に絞ってピックアップしました。(変数の型や配列の型は他にも色々とありますが長くなるので別記事で解説します)

 

2.2 Pythonの繰り返し文(for文)
次に1から100までの数字を出力したいのでfor文について解説します。

for i in range(整数N):
    処理

まず、基本構文としてですがPythonにおけるN回の繰り返し文はfor文を使って上記のように実装されます。色々な書き方がありますが、最初のうちは書き方を一つに統一しておくと良いと思います。
また、今回の目的に合わせた実装は下記のようになります。

for i in range(100):
    print(i+1)
>>> 1, 2, 3,......,100

上の二文を実行すれば100までの数字を出力することができます。(出力はカンマ区切りではなく改行区切りになると思いますが、スクロールの都合上カンマ区切りで表記しました。)


2.3 Pythonの条件分岐文(if文)
2.2節で数字の出力について取り扱えたので2.3では条件分岐によって処理を分岐していくところについて取り扱えればと思います。

if 条件1:
    処理1
elif 条件2:
    処理2
else:
    処理3

上記がif文の構文になります。基本的には条件を満たすか満たさないかで処理を切り分けていくような記述になります。ちなみに今回のように繰り返し文を数字で制御する場合は余りに着目してコーディングを行うと解けるケースが多いです。2.2節で出力した内容の3の倍数の際にFizzを出力してみましょう。

for i in range(100):
    idx = i+1
    if idx%3 == 0:
        print("Fizz")
    else:
        print(i+1)
>>> 1, 2, Fizz, 4, 5, Fizz,......, Fizz, 100

だいぶFizzBuzz問題の解答っぽくなってきました。
3節で問題の正解についてまとめたいと思います。

 

3. 実装結果&解説

for i in range(100):
    idx = i+1
    if (idx%5==0 and idx%3==0):
        print("FizzBuzz")
    elif idx%3 == 0:
        print("Fizz")
    elif idx%5 == 0:
        print("Buzz")
    else:
        print(i+1)
>>> 1, 2, Fizz, 4, Buzz, Fizz,......, Fizz, Buzz

上記が実装結果になります。2.3節の内容に条件式はいくつか足しましたが、本質的にはそれほど変わっていません。15で割るに関しては『%15』を用いても良かったですが、論理演算子によってaかつbの実装も抑えておいていただけたらということであえてand条件を用いています。
シンプルな問題ではあるのですが、上記解答だけで様々なプログラミングについての基礎スキルが必要とされるので入門にあたってはまずFizzBuzzが解けるのを目標とするのが良いのではと思います。
Pythonなどの高級言語と言われている機能が豊富な言語において高度な処理は関数化されていることが多いのですが、そのまま使う前にちょっとした処理が必要な際にも繰り返しと条件分岐を抑えてさえおけばそれだけでかなり実現できることの幅が広がってきます。

 

4. まとめ
今回取り扱ったFizzBuzzは問題そのものがシンプルなのにも関わらず、変数、繰り返し、条件分岐などプログラミングの基礎を抑える上で非常に有用です。今回わからなかった方もこれを機に解けるようにしていただければ基本的なコーディングが色々とできるようになるのではと思います!