肉眼天文台

食メモとかたまに囲碁とか趣味についての雑記です

独学でPythonその3~Pythonで論理ゲートを作って遊んでみたの巻~

前回の

wjenga.hatenablog.com

を経て、背伸びし過ぎたので志向を変えて遊んでみた。

以下、参考にしたサイトなど

www.geeksforgeeks.org

 

まずはNOTゲートをdef使ってNOTの操作を定義して

今回は後々これ使って色々したいのでおまじない

if __name__=='__main__':

を入れてる。

blog.pyq.jp

 

def NOT(a):
if(a == 0):
return 1
elif(a == 1):
return 0

if __name__=='__main__':
for xs in [(0), (1)]:
y = NOT(xs)
print(str(xs) + " -> " + str(y))

 

出力結果

0 -> 1
1 -> 0

 

素晴らしい。NOTゲートの完成だ。

 

続いてORゲートを作る。

def OR(a, b):
if a == 1:
return 1
elif b == 1:
return 1
else:
return 0

if __name__=='__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = OR(xs[0], xs[1])
print(str(xs) + " -> " + str(y))

 

出力結果

(0, 0) -> 0
(1, 0) -> 1
(0, 1) -> 1
(1, 1) -> 1

 

素晴らしい。ORゲートの完成だ。

 

 ちなみにnumpy使って作るとこうなるらしい。

 

import numpy as np


def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([1, 1])
b = -0.9
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1

if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = OR(xs[0], xs[1])
print(str(xs) + " -> " + str(y))

 

いや長いw必ずしもimport numpy as npすればいいわけではないと。。。

 

続いてANDゲートを作る。

def AND (a, b):
if a == 1 and b == 1:
return 1
else:
return 0

if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = AND(xs[0], xs[1])
print(str(xs) + " -> " + str(y))

 

出力結果

(0, 0) -> 0
(1, 0) -> 0
(0, 1) -> 0
(1, 1) -> 1

 

素晴らしい。ANDゲートの完成だ。

 

ちなみにnumpy使って作るとこうなるらしい。 

import numpy as np


def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([1, 1])
b = -1
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1

if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = AND(xs[0], xs[1])
print(str(xs) + " -> " + str(y))

 

 

最後は納戸・・・NANDゲートを作る。

def NAND (a, b):
if a == 1 and b == 1:
return 0
else:
return 1

if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = NAND(xs[0], xs[1])
print(str(xs) + " -> " + str(y))

 

出力結果

(0, 0) -> 1
(1, 0) -> 1
(0, 1) -> 1
(1, 1) -> 0

 

素晴らしい。NANDゲートの完成だ。

 

ちなみにnumpy使って作るとこうなるらしい。 

import numpy as np


def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.9, -0.9])
b = 1
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1

if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = NAND(xs[0], xs[1])
print(str(xs) + " -> " + str(y))

 

結局NANDゲートが一つあれば事足りるらしい。

 

おまけのNORゲート

def NOR(a, b):
if(a == 0) and (b == 0):
return 1
elif(a == 0) and (b == 1):
return 0
elif(a == 1) and (b == 0):
return 0
elif(a == 1) and (b == 1):
return 0

if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = NOR(xs[0], xs[1])
print(str(xs) + " -> " + str(y))

 

出力結果

(0, 0) -> 1
(1, 0) -> 0
(0, 1) -> 0
(1, 1) -> 0

 

素晴らしい。NORゲートの完成だ。