ما الفرق بين تنفيذ function خارج الكلاس و داخله كما باللينك المرفق

https://github.com/Ahmed-Sh/Matrix
The above link shows my code for a function calculating the Determinant of a matrix, I noticed three things:

The function is working fine when using it outside the class,and when tried to make a class and use the same function build just changing the names to be self.names of some variables the function gives me the error message: self.co_factors = [[sign_mat[i][j] * self.det(self.minors[i][j]) for j in range(len(self.minors))]for i in range(len(self.minors))] IndexError: list index out of range
I changed the name of the variable self.minor to minor in all necessary positions, the function worked fine with no errors!!!,why it’s working alone and not in the class and what the variable name changing got to do with it !!!
I see a warning message in Pycharm on the same variable when calling it inside the function to do the recursion saying Type ‘int’ doesn’t have expected attribute’__ len__ ‘,’__ getitem__’ ,what does it mean? Thank you for your help

3 Likes

السلام عليكم
الزملاء الافاضل و معلمينا بالموقع , هل من مجيب علي السؤال , اذا كان هناك مشكلة في وضوح السؤال ارجو التنبيه لاعادة الصياغه و جزيل الشكر لكم جميعا.
@YaserAlnajjar @hichem2h @ahmedalrifai @Alhakem

1 Like

معلش إلاساتذة مشغولين شوية

هذا رابط ممكن يفيدك https://harmash.com/python/python-class-and-object/
https://discuss.codecademy.com/t/list-index-out-of-range-error/444217 وأنا لا اعرف الغاية من السؤال عذراً

2 Likes

السلام عليكم
جزاك الله خيرا , الغرض من السؤال اني مش فاهم ليه ال function مش بتشتغل داخل الكلاس بنفس الطريقه اللي بتشتغل بيها براه هيا بتشتغل كويس برا و بتطلعلي نتيجة حساب ال determinant بدون اخطاء.
لكن لما بستخدمها جوا الكلاس بتيجي في نقطه معينه وهيا بتعمل recursion بتتخطي ال If condition و تكمل و يديني رسالة الخطأ المذكوره , وعلشان اتخطي المشكله دي وانا جوا الكلاس لازم اغير اسم المتغير self.minors و احوله الي متغير local بمعني اني حذفت كلمة self فانا مش عارف ليه البرنامج بيعمل كده و كنت عايز حد يوضحلي السبب @abdallahmiri

2 Likes

هم مشغولين بس بالمخيم وإن شاء الله تتحل

2 Likes

أهلا أحمد

قمت بتعديل الكود بهذا الشكل واشتغل معي:

class MatDet:

    #def __init__(self, ):
    #    self.minors = 0

    def det(self, m):
        print(f"m = {m}")
        print(f"len m =  {(len(m))}, len m[0] =  {len(m[0])}")
        if len(m) != len(m[0]):
            return "Invalid Operation: This operation works on square matrix only"
        elif len (m) == 1:
            return m[0][0]
        else:
            indices = [[(i, j) for j in range(len(m))]for i in range(len(m))]
            minors = [[0 for j in range(len(m))]for i in range(len(m))]
            sign_mat = [[0 for j in range(len(m))]for i in range(len(m))]
            # print(f"Indices = {indices}\nself.minors = {self.minors}\nsign_mat = {sign_mat}\n {('*') * 20} ")
            for coordinates in indices:
                for x, y in coordinates:
                    element_sign = (-1) ** (x + y)
                    n = list([m[i][j] for j in range(len(m))if i != x and j != y]for i in range((len(m))))
                    n.pop(x)
                    minors[x][y] = n
                    sign_mat[x][y] = element_sign
            co_factors =  [[sign_mat[i][j] * self.det(minors[i][j]) for j in range(len(minors))]for i in range(len(minors))]
            result = [[m[i][j] * co_factors[i][j]for i in range(len(m))]for j in range(len(m))]
            return sum(result[0])

الفكرة ببساطة أنني حذفت استعمال self، لأن هنا كل مرة سنقوم بتعديل المتغير self.minors سيتم تعديل القيمة التي تمريرها داخل الدالة مع أنك تقوم بتمرير نفس المتغير على نفس الدالة recursively

أتمنى أن تكون الفكرة وصلت :grin:

2 Likes

شكرا مهندس ياسر , انا كنت متخيل المفروض انه يكون بيتعامل مع self.minor بنفس المبدأ اللي بيتعامل بيه مع minor.
بارك الله فيك @YaserAlnajjar

2 Likes