1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Flagでの制御

Last updated at Posted at 2021-10-25
1 / 14

##はじめに
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関数
使うと良いよ。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?