Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 594

Аналог operator* из C++ в Python

21.12.2021, 09:15. Показов 1822. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
- Здравствуйте, друзья!
Недавно столкнулся с такой задачей:
В C++ если я определил класс, а в нем оператор, то я мог работать с помощью этого оператора с объектами этого класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 class Matr {   // Матрица
    void Matr(...) {    // конструктор
        // (определение Матрицы)
    }
    Matr operator * (Matr a, Matr b) {  // оператор перемножения двух Матриц
        Matr c
        // (механизм перемножения двух Матриц c = a * b)
        return c
    }
 }
 ma = Matr(...) // создать 1-ю Матрицу
 mb = Matr(...) // создать 2-ю Матрицу
 mc = ma * mb   // перемножить две Матрицы
- Вопрос: - Есть ли в Python аппарат подобный оператору C++ ?
Не хочется делать это через функцию:
Python
1
2
3
4
5
6
7
 def matr_mul(a, b):
    c = (механизм перемножения двух Матриц c = a * b)
    return c
 
 ma = Matr(...)
 mb = Matr(...)
 mc = matr_mul(ma, mb)  // ЭТО НЕ ТАК КРАСИВО !
- Заранее спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.12.2021, 09:15
Ответы с готовыми решениями:

Аналог перегрузки оператора индексирования (operator [])
Как по-другому(то есть в виде обычной функции или как то ещё) можно записать перегрузку оператора индексирования? Например в моём случае:...

Python 3.8 и walrus operator (:=)
Забрел на python.org, а там python 3.8 предлагают скачать, попробовал, вот это := вроде работает lst = for x in lst: if n :=...

Аналог unique_ptr в python
Доброго дня всем! Коротко: существует ли в python аналог сишного unique_ptr? Возможно ли реализовать такое: a1 = A() ...

6
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,707
Записей в блоге: 14
21.12.2021, 09:31
Лучший ответ Сообщение было отмечено Staut как решение

Решение

Цитата Сообщение от Staut Посмотреть сообщение
Есть ли в Python аппарат подобный оператору C++ ?
- конечно! И гораздо более "приятный", чем в C++

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
class MatrixError(ValueError):
    pass
 
class Matrix:
    
    @staticmethod
    def multmatr(a,b):
        r1=a.rows
        c1=a.cols
        r2=b.rows
        c2=b.cols
        if c1 != r2:
            raise MatrixError("Умножение матриц невозможно!")
        tmp=[[0 for _ in range(r1)] for _ in range(c2)]
        for ir in range(r1):
            for ic in range(c2):
                s=0
                for k in range(c1):
                    s+=a.matr[ir][k]*b.matr[k][ic]
                tmp[ir][ic]=s    
        return Matrix(tmp)        
 
    def __init__(self,matr):
        self.matr=list(matr)
        self.rows=len(matr)
        self.cols=len(matr[0])
        for i in range(self.rows):
            if len(self.matr[i]) != self.cols:
                raise MatrixError("Строки разной длины!")
 
    def __mul__(self,r):
        r1=self.rows
        c1=self.cols
        if type(r) is Matrix:
            return Matrix.multmatr(self,r)
        else:
            tmp=[[self.matr[i][j]*r for i in range(r1)] for j in range(c1)]
            return Matrix(tmp)
            
    def __rmul__(self,r):
        if type(r) is Matrix:
            return Matrix.multmatr(r,self)
        else:
            r1=self.rows
            c1=self.cols
            tmp=[[self.matr[i][j]*r for i in range(r1)] for j in range(c1)]
            return Matrix(tmp)
 
    def __str__(self):
        return str(self.matr)
        
    def __getitem__(self,index):
        return self.matr[index[0]][index[1]]
        
    def __setitem__(self,index,v):
        self.matr[index[0]][index[1]] = v        
 
 
 
m1=Matrix([[1,2],[3,4]])
print(m1)
m2=Matrix([[5,6],[7,8]])
print(m2)
m3=m1*m2
print(m3)
m4=m2*m1
print(m4)
 
m6=Matrix([[1,2,3],[4,5,6]])
m7=Matrix([[1,4],[2,5],[3,6]])
m8=m6*m7
print(m8)
 
m9=m7*m6
print(m9)
1
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 594
21.12.2021, 18:03  [ТС]
- Спасибо огромное Catstail !
Немного разберусь (хотя и так вроде бы все понятно) и буду пользоваться.
Еще раз Спасибо !
0
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
21.12.2021, 19:31
Catstail, есть специальный оператор для умножения матриц:

Python
1
2
3
4
5
6
7
8
9
    def __matmul__(self, r):
        ...
 
m1=Matrix([[1,2],[3,4]])
print(m1)
m2=Matrix([[5,6],[7,8]])
print(m2)
m3=m1@m2
print(m3)
Добавлено через 3 минуты
И тогда логику умножения на матрицу и на число можно разделить между двумя версиями оператора: умножение на матрицу в matmul, умножение на число в mul. Никаких 'if'.
2
1712 / 579 / 76
Регистрация: 10.04.2009
Сообщений: 9,323
21.12.2021, 20:00
КулХацкеръ,
подскажите, а в Вашем варианте как класс объявить?
0
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
21.12.2021, 20:18
Лучший ответ Сообщение было отмечено zss как решение

Решение

Так же, как и у Catstail.

Вот полный код:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
class MatrixError(ValueError):
    pass
 
class Matrix:
    
    def __matmul__(self, r):
        r1=self.rows
        c1=self.cols
        r2=r.rows
        c2=r.cols
        if c1 != r2:
            raise MatrixError("Умножение матриц невозможно!")
        tmp=[[0 for _ in range(r1)] for _ in range(c2)]
        for ir in range(r1):
            for ic in range(c2):
                s=0
                for k in range(c1):
                    s+=self.matr[ir][k]*r.matr[k][ic]
                tmp[ir][ic]=s    
        return Matrix(tmp)        
 
    def __init__(self, matr):
        self.matr=list(matr)
        self.rows=len(matr)
        self.cols=len(matr[0])
        for i in range(self.rows):
            if len(self.matr[i]) != self.cols:
                raise MatrixError("Строки разной длины!")
 
    def __mul__(self, r):
        tmp=[[self.matr[i][j]*r for i in range(self.rows)] for j in range(self.cols)]
        return Matrix(tmp)
 
    def __str__(self):
        return str(self.matr)
        
    def __getitem__(self, index):
        return self.matr[index[0]][index[1]]
        
    def __setitem__(self, index, v):
        self.matr[index[0]][index[1]] = v
 
 
m1=Matrix([[1,2],[3,4]])
print(m1)
m2=Matrix([[5,6],[7,8]])
print(m2)
m3=m1@m2
print(m3)
m4=m2@m1
print(m4)
 
m6=Matrix([[1,2,3],[4,5,6]])
m7=Matrix([[1,4],[2,5],[3,6]])
m8=m6@m7
print(m8)
m9=m7@m6
print(m9)
2
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 594
22.12.2021, 10:38  [ТС]
- Спасибо Кул Хацкеръ! Тоже буду иметь в виду.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.12.2021, 10:38
Помогаю со студенческими работами здесь

Аналог grep -b на python
Всем привет.Столкнулся с такой проблемой.Есть функция def grepA(word,file,num=0): with open(file) as f: for line in...

Python 2.7 Sqlite3 аналог distinct
Доброго дня. Есть выборка: cur.execute('SELECT DISTINCT name FROM tech') name_tech = cur.fetchall() так вот,...

Аналог команд ss и netstat в python
Коллеги, добрый вечер. Подскажите как можно с помощью python посмотреть открытые порт в системе. Что то типа этих команд: netstat...

Есть ли аналог атрибутам из C# в Python?
Есть ли аналог атрибутам из C# в Python? Пример атрибутов: using System.ComponentModel; using System.Drawing; using...

Аналог Steam Desktop Authenticator на Python
Имеется программа: https://github.com/Jessecar96/SteamDesktopAuthenticator Заинтересовало сделать её, но на языке python. Вопрос: стоит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru