##はじめに
flag作って処理して!
けっこー前に突然言われて新人エンジニアにはなんのこっちゃ分らんかった。とりあえず分かりましたー言うて調べてみるものの分からず聞く羽目に…。
今回はFlag処理とは何ぞやってところから。
実際の実装例を簡単にpythonで説明する。
##そもそもフラグって何?
フラグは状態判定に使う変数でBooleanで使うことが多いですが、
1.2つの値のどちらかを設定する
2.2つの状態のどちらかを表現する
この二つの機能を持っていればFlagとしての役割は果たせます。
flag = True
みたいな感じで使われることが多いですが、もの自体は只の変数なので名前は何でもいいです。
hogehoge = True
でも piyopiyo = True
でも問題ないです。
肝心なのは状態判定の為に必要なものを用意しているってこと。
##例
簡単な例いきましょう
flag = True
num = 0
while flag:
print ("num は " + str(num))
num += 1
if num > 2:
flag = False
print("処理終わり")
今回の例では数値が2以上になったときにFlagの状態を切り替えて、whileループを止めています。
##列挙型enum
FlagやIntFlagは列挙型Enumの一種で、pythonでのフラグ処理ならこれ使うことも多い
例
from enum import Flag
class PlayerStatus(Flag):
SLEEP = "sleep" #睡眠
POISON = "poison" #毒
PARALYSIS = "paralysis" #麻痺
これの良いところは一つの変数に複数のフラグを設定できることです。 例えば、睡眠かつ毒状態のステータスは
status = PlayerStatus.SLEEP | PlayerStatus.POISON
print(status)
#結果
#PlayerStatus.POISON|SLEEP
例
status = PlayerStatus.SLEEP | PlayerStatus.POISON
if status & PlayerStatus.SLEEP:
print("SLEEP!")
if status & PlayerStatus.POISON:
print("POISON!")
if status & PlayerStatus.PARALYSIS:
print("PARALYSIS!")
#結果
#SLEEP!
#POISON!
###ただこのやり方だと列挙型のenumを使うメリットはそこまでない。###
じゃあどうする?
from enum import Flag ,auto
class PlayerStatus(Flag):
SLEEP = auto()
POISON = auto()
PARALYSIS = auto()
for s in PlayerStatus:
print(s.name,s.value)
#結果
#SLEEP 1
#POISON 2
#PARALYSIS 4
書き方こうすると処理が高速化出来る。
本来はビット単位で管理するのでメモリが節約でき、プログラムの高速化も狙える。
autoという関数を使うと自動で二のべき乗を割り振ってくれます。
フラグがたくさんあって整理が難しい場合や、少しでも処理を高速化したい場合には便利なので列挙型enumとauto関数
使うと良いよ。