はじめに
初めて触るプログラミング言語を学習する際、本を買うほどでも無い時に
どこから手を付けるか、というのは結構大事なことかなと個人的には思っています。
今回はファーストステップ何から手を付けますか、というお話。
結論:FizzBuzzがハイハイ期にはいいかと思う
ハイハイ期=赤ん坊がハイハイしている時期のこと。
Hello,Worldを出力した後にやる事としてはFizzBuzzが良いと思います。
アルゴリズムを考えた時、必ず出てくる基本が以下。
- IF
- For(Loop)
これらを使った簡単な処理と言ったらFizzBuzzかなと。
FizzBuzzって何
1から順に数えて
- 3の倍数なら「Fizz」
- 5の倍数なら「Buzz」
- 15の倍数なら「FizzBuzz」
を返すっていう遊び
今回の記事でやること
FizzBuzzやろうね、おしまい。では、ちょっと面白くないので
同じFizzBuzzでも言語によっての違いを見るといいかと思いました。
Python,PHP,JavaScript,Goの4パターンを書いたので見比べてみてください。
変数とか今回必要ないんだけど、書き方の違いを見るためにあえて書きました。
見るべきところ
- ifの書き方
- for文の書き方
- 定数・変数の書き方
- コメントの書き方
Python
AIの機械学習やデータ分析で使われるようになって注目度がさらに上がった印象。
インデントでブロックを分けるのが特徴で、最初は戸惑うかもしれない。
シンプルさが強み。
"""
FizzBuzz
- 3の倍数ならFizz
- 5の倍数ならBuzz
- 15の倍数ならFizzBuzz
"""
FIZZ_BUZZ = "FizzBuzz"
FIZZ = "Fizz"
BUZZ = "Buzz"
def fizzbuzz(n: int) -> str:
"""
FizzBuzz
- 3の倍数ならFizz
- 5の倍数ならBuzz
- 15の倍数ならFizzBuzz
Args:
n (int): チェックする数字
Returns:
str: FizzBuzzの結果
"""
fifteen = 15
three = 3
five = 5
if n % fifteen == 0:
return FIZZ_BUZZ
elif n % three == 0:
return FIZZ
elif n % five == 0:
return BUZZ
else:
return str(n)
if __name__ == "__main__":
for i in range(1, 101):
print(fizzbuzz(i))
ifの書き方
if n % fifteen == 0:
return FIZZ_BUZZ
elif n % three == 0:
return FIZZ
elif n % five == 0:
return BUZZ
else:
return str(n)
後で出てくる言語達は、基本的にforもifも { } でくくる事がルールになってるが
Pythonでは{}で囲うルールがない。
インデントを下げることでブロックが変わったことになる。
for文の書き方
for i in range(1, 101):
print(fizzbuzz(i))
iを初期化してー、みたいな書き方はしない。
range()の中で開始と終了、ステップ数を書く。慣れると楽
定数・変数の書き方
定数が存在しない。
FIZZ_BUZZ = "FizzBuzz"
FIZZ = "Fizz"
BUZZ = "Buzz"
それっぽく書いて、変えないように注意する。
変数については型はあるけど、かなり緩い。宣言しない。
fifteen = 15
three = 3
five = 5
fifteen="15"とか文字列を入れても怒らない。
コメントの書き方
"""
FizzBuzz
- 3の倍数ならFizz
- 5の倍数ならBuzz
- 15の倍数ならFizzBuzz
"""
# コメント
関数の説明を下に書くのはPythonの特徴。
def fizzbuzz(n: int) -> str:
"""
FizzBuzz
- 3の倍数ならFizz
- 5の倍数ならBuzz
- 15の倍数ならFizzBuzz
Args:
n (int): チェックする数字
Returns:
str: FizzBuzzの結果
"""
おまけ
Pythonといったら リスト内包表記 が特徴なので、「FizzBuzzを一行で書くとしたら」というのでやってみるとこんな感じ。
print('\n'.join([(FIZZ * (n % 3 == 0) + BUZZ * (n % 5 == 0)) or str(n) for n in range(1, 101)]))
可読性を無視した書き方だけど、動きはする。
趣旨とずれるので説明は割愛するけど、条件さえ合えば10行ほどの処理が1行に圧縮できる言語なんだ、って思ってもらえれば。
PHP
老舗のスクリプト言語という印象。(Perlとかはさておき)
Pythonを扱う前は、よく触ってた。
Webシステムでよく出てくるかも。
<?php
/**
* FizzBuzz
* - 3の倍数ならFizz
* - 5の倍数ならBuzz
* - 15の倍数ならFizzBuzz
*/
const FIZZ_BUZZ = "FizzBuzz";
const FIZZ = "Fizz";
const BUZZ = "Buzz";
/**
* FizzBuzz
* - 3の倍数ならFizz
* - 5の倍数ならBuzz
* - 15の倍数ならFizzBuzz
*
* @param int $n チェックする数字
* @return string FizzBuzzの結果
*/
function fizzbuzz($n) {
$fifteen = 15;
$three = 3;
$five = 5;
if ($n % $fifteen == 0) {
return FIZZ_BUZZ;
} elseif ($n % $three == 0) {
return FIZZ;
} elseif ($n % $five == 0) {
return BUZZ;
} else {
return strval($n);
}
}
for ($i = 1; $i <= 100; $i++) {
echo fizzbuzz($i) . "\n";
}
?>
ifの書き方
至って普通。
Javaとかやってる人には慣れ親しんだ書き方だと思います。
if ($n % $fifteen == 0) {
return FIZZ_BUZZ;
} elseif ($n % $three == 0) {
return FIZZ;
} elseif ($n % $five == 0) {
return BUZZ;
} else {
return strval($n);
}
for文の書き方
至って普通。
Javaとかやってる人には慣れ親しんだ書き方だと思います(2回目)
for ($i = 1; $i <= 100; $i++) {
echo fizzbuzz($i) . "\n";
}
定数・変数の書き方
定数はPythonと違って、ちゃんと定数(変更不可)
const FIZZ_BUZZ = "FizzBuzz";
const FIZZ = "Fizz";
const BUZZ = "Buzz";
変数はPythonと同じく宣言なし。
$fifteen = 15;
$three = 3;
$five = 5;
コメントの書き方
関数コメントの書き方
/**
* FizzBuzz
* - 3の倍数ならFizz
* - 5の倍数ならBuzz
* - 15の倍数ならFizzBuzz
*
* @param int $n チェックする数字
* @return string FizzBuzzの結果
*/
function fizzbuzz($n) {
/*
ブロックコメント
*/
// コメント
@param
、@return
といったタグを使うのがJavaっぽい
JavaScript
node.jsが出てきて人気が爆発した印象。
書き方だけで言えばPHPに似てるかなと
/**
* FizzBuzz
* - 3の倍数ならFizz
* - 5の倍数ならBuzz
* - 15の倍数ならFizzBuzz
*/
const FIZZ_BUZZ = "FizzBuzz"
const FIZZ = "Fizz"
const BUZZ = "Buzz"
/**
* FizzBuzz
* - 3の倍数ならFizz
* - 5の倍数ならBuzz
* - 15の倍数ならFizzBuzz
*
* @param {number} n - チェックする数字
* @returns {string} FizzBuzzの結果
*/
const fizzbuzz = (n) => {
const fifteen = 15;
const three = 3;
const five = 5;
if (n % fifteen === 0) {
return FIZZ_BUZZ;
} else if (n % three === 0) {
return FIZZ;
} else if (n % five === 0) {
return BUZZ;
}
return String(n);
};
for (let i = 1; i <= 100; i++) {
console.log(fizzbuzz(i));
}
ifの書き方
至って普通。
Javaとかやってる人には慣れ親しんだ書き方だと思います(3回目)
if (n % fifteen === 0) {
return FIZZ_BUZZ;
} else if (n % three === 0) {
return FIZZ;
} else if (n % five === 0) {
return BUZZ;
}
for文の書き方
至って普通。
Javaとかやってる人には慣れ親しんだ書き方だと思います(4回目)
for (let i = 1; i <= 100; i++) {
console.log(fizzbuzz(i));
}
定数・変数の書き方
const FIZZ_BUZZ = "FizzBuzz"
const FIZZ = "Fizz"
const BUZZ = "Buzz"
const fifteen = 15;
const three = 3;
const five = 5;
コメントの書き方
関数コメント
/**
* FizzBuzz
* - 3の倍数ならFizz
* - 5の倍数ならBuzz
* - 15の倍数ならFizzBuzz
*
* @param {number} n - チェックする数字
* @returns {string} FizzBuzzの結果
*/
/*
ブロックコメント
*/
// コメント
Go
この中では唯一のコンパイル言語。
C言語並みかそれ以上の実行速度ということで注目された比較的新しい言語です。
/*
FizzBuzz
- 3の倍数ならFizz
- 5の倍数ならBuzz
- 15の倍数ならFizzBuzz
*/
package main
import (
"fmt"
"strconv"
)
const (
fizzBuzz = "FizzBuzz"
fizz = "Fizz"
buzz = "Buzz"
)
// fizzbuzz は指定された数値に対してFizzBuzzの結果を返します
// - 3の倍数ならFizz
// - 5の倍数ならBuzz
// - 15の倍数ならFizzBuzz
//
// Args:
// n: チェックする数字
// Returns:
// FizzBuzzの結果
func fizzbuzz(n int) string {
fifteen := 15
three := 3
five := 5
if n % fifteen == 0 {
return fizzBuzz
} else if n % three == 0 {
return fizz
} else if n % five == 0 {
return buzz
}
return strconv.Itoa(n)
}
func main() {
for i := 1; i <= 100; i++ {
fmt.Println(fizzbuzz(i))
}
}
ifの書き方
Javaっぽい。
でも行末にセミコロンを付けないあたりがモダンな感じがします。
if n % fifteen == 0 {
return fizzBuzz
} else if n % three == 0 {
return fizz
} else if n % five == 0 {
return buzz
}
for文の書き方
for i := 1; i <= 100; i++ {
fmt.Println(fizzbuzz(i))
}
( )で囲わないのがモダン…なんですかね。クセでつけてしまいそう。
fmtをインポートしないとPrintが出来ないのはJavaも似たようなものかもしれません。
定数・変数の書き方
慣例として、定数はキャメルケースだそう。
const (
fizzBuzz = "FizzBuzz"
fizz = "Fizz"
buzz = "Buzz"
)
型宣言はしなくてもOK。
しても勿論OK。
fifteen := 15
three := 3
five := 5
Pythonと違って、いい加減にやると代入できなくなるので注意です
コメントの書き方
関数コメント
// fizzbuzz は指定された数値に対してFizzBuzzの結果を返します
// - 3の倍数ならFizz
// - 5の倍数ならBuzz
// - 15の倍数ならFizzBuzz
/*
ブロックコメント
*/
// コメント
おまけ
godocコマンドでコメントで書いたパッケージの説明や、関数その他もろもろの説明をHTMLで出力できます。
まとめ
FizzBuzzを最初の一歩にどうでしょうか。
単純ではありますが、初歩の初歩からです。
また、for文やif文、変数の宣言も一つではない場合もあり
書き方の工夫もありますので「もっと簡単にできないか」「拡張性高い書き方はないか」など
FizzBuzzだけでも深堀りしていくと楽しくなり、もっともっと勉強したくなるのではないでしょうか。
参考にしてみてください
(おまけ)各言語の特徴まとめ
Python
- インデントでブロック管理、{}を使わない独特な記法
- シンプルで可読性重視、初心者にも理解しやすい
- リスト内包表記で一行で複雑な処理も可能
PHP
- Webシステム開発でよく使用される老舗スクリプト言語
- Java風の書き方で他言語経験者には馴染みやすい
- 変数は必ず$マークを付ける独特な記法
JavaScript
- Node.jsの登場でサーバーサイドでも人気爆発
- アロー関数
=>
でモダンで簡潔な記法が可能 - constとletで適切なスコープ管理ができる
Go
- コンパイル言語でC言語並みの高速な実行速度を実現
- モダンな記法(括弧省略、セミコロン省略)で記述が簡潔
- 静的型付けだが型推論により宣言が楽