タイトルを実現するために、コード欄のようなプログラムを以下の考え方で作成しました。
・A,B2つの行列を作る
・演算子のオーバーロードを用いて行列の要素ごとの割り算を行う
・関数デコレータを用いてゼロ除算がないかどうか調べる
これを実行すると以下のような結果が得られました。
ーーーーーーーーーーーーーーーーーーーーーーー
C=A/B:
C:OOOOOOOOOOOOOOOOOOOOOO: RuntimeWarning: divide by zero encountered in true_divide
print(A/B)
[[ inf 0.56017643]
[0.36731304 0.47638696]]
ーーーーーーーーーーーーーーーーーーーーーーー
このような結果が得られるということは
関数デコレータが実行されておらず、割り算を行う関数のみが働いているということなのでしょうか。
デコレータ内のif文の両方の条件分岐にprint文を記述しても
実行結果は変わらなかったため、関数デコレータは実行されていないと思います。
どのような理由で実行されていないか教えていただけるとありがたいです。
Python
1import sys 2import os 3import numpy as np 4def zero(func): 5 def inner(A, B): 6 if np.all(B != 0): 7 return func(a, b) 8 else: 9 print('ゼロ除算が発生します') 10 sys.exit() 11 return 12 return inner 13class Matrix: 14 def __init__(self, M, N, mat): 15 self.__M = M 16 self.__N = N 17 self.__mat = mat 18 @zero 19 def __truediv__(self, another): 20 return np.divide(self.__mat,another) 21if __name__ == "__main__": 22 A = np.random.random((2,2)) 23 B = np.random.random((2,2)) 24 B[0,0] = 0.0 25 C = Matrix(2, 2, A) 26 print("C=A/B:") 27 print(A/B)
回答2件
あなたの回答
tips
プレビュー