とりあえずPythonで。
普段業務では基本PHP、たまにnginxまわりでlua使っています。
プライベートではPerlをおぼえようとしていたり。
PHPやPerlは後からオブジェクト指向の考え方が取り入れられたと聞く。
ので初期からそれが盛り込まれていた言語をなにか覚えようかなっと、とりあえずPythonを選んだ。
RubyとPythonでどっちにしょうかなってところだったんだけど、Raspberry piが標準に選んだのがpythonだったなあという理由からこっちにした。
バージョンは3.6。
さわり始める前の印象。
- インデント強制気持ちわるい。
- {}欲しい。
- 初心者向けって一時期喧伝されてたなあ。
- 実装シンプルになるって聞いた。
とりあえず学生時分はあんまりそそられないなあって印象だった。(おもにインデント強制が)
基本セル・オートマトンつくった。
パッケージ管理。
composerやcartonみたいなパッケージ管理ツールを探したけれど、Pythonの場合はちょっと考え方が違うらしい。
プロジェクトごとの環境をつくってプロジェクトごとに環境を切り替える感じなよう。
pip freeze
と virtualenv
を使った方法が割とメジャー?
pipenv
なるものが簡単そうだった。 上の二つを総合的に扱うためのツールだとか。
https://github.com/kennethreitz/pipenv
https://qiita.com/subarunari/items/dcbdad68ba1809b721b9
今回は標準モジュールで事足りたので使ってはいない。
各種操作。
# listの初期化 0 を 151 個並べる
default_init = [0 for i in range(151)]
roule = list(format(args.roule, 'b').zfill(8))
roule.reverse()
# 文字列をlistに変換
# list(str)
# 数値を二進数表記の文字列に変換
# format(int, 'b').zfill(8)
# zfill(8) 8桁になるよう0で埋める
# 配列を逆順にする
# roule.reverse()
書いててあって楽だなあと思ったのはこの辺り。
class。
classの定義はこう。
from typing import List
class Cell:
def __init__(self, roule: List[int], init_status: int):
self._roule = []
self._around_cells = []
self._situation = None
self._status = init_status
self.setRoule(roule)
def setRoule(self, roule: List[int]) -> None:
self._roule = roule
型ヒント使っているけどドキュメントこんなこと言っているのでどうなんだろう。
注釈 typing モジュールは 暫定的に 標準ライブラリに追加されました。マイナーリリースの間でもコアデベロッパーが必要だと判断した場合は、新機能の追加や API の変更がなされることがあります。
Pythonではファイルをモジュール、ディレクトリをパッケージと呼ぶみたい。
ディレクトリをパッケージとして使用するためには __init__.py
というファイルを置くらしい。
けど別になくても一応使える。
んだけどimportするとき気持ち悪いのでやっぱり置いたほうがいいと思う。
中身はこんな感じ。
from .Cell import Cell
from .LineOfCell import LineOfCell
コマンドライン引数解析。
argparse っていうのが標準ライブラリにあった。
https://docs.python.jp/3/library/argparse.html
https://qiita.com/sesame/items/3c03ac7ebeecb060af4f
parser.add_argument(
'--roule', '-r', metavar = 'roule', type = int,
required = False, default = 30,
help = 'roule of cell automaton. default: 30'
)
自分的には PHP, Perl とかよりいい感じな気がする。
できたもの。
githubへあげています。
https://github.com/yoko-chance/BasicCellAutomaton
ここまでさわってみてからの印象。
- インデントでブロック表現ってのはよくできた仕様だなあ、だれが書いても同じだもの。
- それでも{}は欲しい気がする。
- コメントで区切るってのもありなのかなあ。
- 区切らないと見づらいようなでかいブロックにするのがわるいってのも大きいので一概には言えないとは思う。
- なんというかわりとあっさりと実装できたので初心者向けってのもわかる気がする。
- フレームワークとかでなんとかなるのかなと思いつつ、いちいち第一引数に
self
いるのがたまにむっとなる。
わりかしすらすらっと使えた。
最低限できれいなコードにはなるし、たしかにプログラミング初学者にはおすすめしたくもなる。
今回は特段使用していないが数学的な処理用ライブラリも揃っているとのことなので、音響とかビジュアル表現とかそういう分野で楽しくできそう。
ちょいちょい使っていきたいなと思う。
この記事は 株式会社ソニックムーブ Advent Calendar 2017 14日目の記事です。
アドベントカレンダーはこっち。 -> https://qiita.com/advent-calendar/2017/sonicmoov
ソニックムーブについてはこっち。 -> https://www.sonicmoov.com