Python3x: Using Boolean to represent integers such that True ==1; False == 0

前回[Priority of Boolean Operators: and, or and not](http://qiita.com/weedslayer/items/2d1778d38ebcf7d02d1b)で長々とpython3におけるbooleanの特徴を書いたが今回はbooleanを整数として扱えるという特徴について軽く触れてみたいと思う。これもいつもと同様、講義で出くわした内容。

#True == 1 False == 0

>
_Booleans represent the truth values False and True. The two objects representing the values False and True are the only Boolean objects._

簡単にいうと[ここまでとpriority of booleans](http://qiita.com/weedslayer/items/2d1778d38ebcf7d02d1b)が前回やった内容。

>_The Boolean type is a subtype of the integer type, and Boolean values behave like the values 0 and 1, respectively, in almost all contexts, the exception being that when converted to a string, the strings "False" or "True" are returned, respectively._

ここらへんにスコープを定めていこうと思う。どうやらこの数字としてのboolean valueは`str()`を除けばどの環境下でもほぼ問題なく数字として扱えるらしい。ただ処理が行われる前にストリングに変えてしまうとそのまま`'True'`として返ってきてしまうと。

完璧に理解したわけではないが、一番手っ取り早い方法は「まずは試す」ことだと思ったのでいじってたりググったりして気になったことをメモっておきます。

どうやら`int`というオブジェクトの中にはサブクラスといって同じく`int`として扱えることができるオブジェクトが存在するらしい。その一つが`bool`であると。他にも`method`を使って新たにオブジェクトを定義して使うことも出来るらしいが大分路線が外れていきそうなので今回はパス。

#使い方

一番最初に思いついたのが`True == 1; False == 1`だとしたら`Truethy value == 1; Falsey Value == 0`に簡単変換できる。これが出来るのだとしたらほぼすべての変数の値を変換することができる。何がいいたいのかというと例えば何かのデータを集めてくる作業をしている時などにデータの仕分け作業をしているときにこの特徴をフルに使えそうな気がします。早速ぐぐってみたらそれの根っこになりそうなものを発見。

```
x = 6
x = int(bool(x))
```

一言でいうと値がTruethy valueなら`1`を返しそうでなければ0を返すようになっている。このままだとシンプルすぎて使えない。そこで稚拙ながら自分で役に立ちそうな関数を作ってみたので参考に。

```
def foo(n, m):
	if n == m:
		return True
	else:
		return False

def feed_me():
	n1 = int(input("yourgf1: feed me some number!: "))
	n2 = int(input("yourgf2: wait feed me some numbers too!: "))
	x = int(bool(foo(n1, n2)))
	print(x) # use return statement if you wish to store data

feed_me()
```

これでもまだシンプルすぎるかもしれないが`foo()`のconditionを変えてあげるだけであとは自分で好きなようにいじれる。あとは<a href="http://d.hatena.ne.jp/SumiTomohiko/20070802/1186074596" target="_blank">こちら</a>から拾ってきた以下のコードを参考にしてくっつけてみると何かもっと使えそうな何かになる気がします。

>
_例えばTrueまたはFalseが要素となっているリストbool_arrayがあったとして、その中のTrueを数えるとき、素直に書けば、_
>
```
count = 0
for b in bool_array:
    if b is True:
        count += 1
```
>
_となるところを、
`count = sum(bool_array)`
と置き換えられます（これがあとで読む人にとって優しいかは別にして）。_

これを参考に以下の様なコードをつくってみた。

```
def im_your_boss(n, m):
	if n == m:
		return True
	else:
		return False

def feed_me():
	n1 = int(input("yourgf1: feed me some number!: "))
	n2 = int(input("yourgf2: wait feed me some number too!: "))
	x = int(bool(im_your_boss(n1, n2)))
	return summation(x)

def summation(y):
	sample_list = []
	sample_list += [y]
	return sum(sample_list)

w = feed_me()
print(w)
```

こんな一回きりのプログラムではきっと訳にも立たないと思いますが、雰囲気はこんな感じではないかと思っています。結果を全てリストに入れておいてそれをあとでまとめて足して`Truethy value`の数を数えるほうが効率的かもしれません。

#参考にしたリンク
- [python official document](https://docs.python.org/3.4/reference/datamodel.html#the-standard-type-hierarchy)
- [Is False == 0 and True == 1 in Python an implementation detail or is it guaranteed by the language?](http://stackoverflow.com/questions/2764017/is-false-0-and-true-1-in-python-an-implementation-detail-or-is-it-guarante)
- [How to convert false to 0 and true to 1 in python](http://stackoverflow.com/questions/20840803/how-to-convert-false-to-0-and-true-to-1-in-python)
- [[Python] Trueは1, Falseは0.](http://d.hatena.ne.jp/SumiTomohiko/20070802/1186074596)