Вопрос 14 из 16

Основы Python

Как работает умножение?

Показать ответ

Короткий ответ

  • Для чисел: арифметическое умножение
  • Для последовательностей: повторение элементов

Развернутый ответ

Умножение в Python работает по-разному в зависимости от типов операндов. Вот полное объяснение с примерами:


1. Умножение чисел (арифметическое)

# Целые числа (int)
print(3 * 4)  # 12

# Числа с плавающей точкой (float)
print(2.5 * 1.5)  # 3.75

# Комплексные числа
print((1+2j) * (3+4j))  # (-5+10j)

2. Умножение последовательностей

Строки (str)

text = "abc"
print(text * 3)  # 'abcabcabc'

Списки (list)

items = [1, 2]
print(items * 3)  # [1, 2, 1, 2, 1, 2]

Кортежи (tuple)

t = (1, 2)
print(t * 2)  # (1, 2, 1, 2)

3. Особенности умножения последовательностей

  • Создаются поверхностные копии элементов
  • Для вложенных изменяемых объектов это может привести к неожиданностям:
matrix = [[0] * 3] * 3  # Опасный способ!
matrix[0][0] = 1        # Изменятся все элементы в столбце
print(matrix)  # [[1, 0, 0], [1, 0, 0], [1, 0, 0]]

# Правильный способ:
matrix = [[0 for _ in range(3)] for _ in range(3)]

4. Умножение массивов NumPy

В библиотеке NumPy умножение работает иначе:

import numpy as np

# Поэлементное умножение
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a * b)  # [4 10 18]

# Матричное умножение
print(a @ b)  # 32 (скалярное произведение)

5. Перегрузка оператора умножения

В пользовательских классах можно определить поведение оператора * через методы:

  • __mul__(self, other) — для операции *
  • __rmul__(self, other) — для операции *, когда левый операнд не поддерживает умножение
  • __imul__(self, other) — для операции *=
class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __mul__(self, scalar):
        return Vector(self.x * scalar, self.y * scalar)
    
    def __repr__(self):
        return f"Vector({self.x}, {self.y})"

v = Vector(1, 2)
print(v * 3)  # Vector(3, 6)

6. Особые случаи

  • Умножение None вызовет TypeError
  • Умножение последовательности на отрицательное число даст пустую последовательность
  • Умножение последовательности на float вызовет TypeError
print("text" * 0)    # '' (пустая строка)
print([1, 2] * -1)  # [] (пустой список)

7. Матричное умножение (@)

Python 3.5+ поддерживает оператор @ для матричного умножения:

class Matrix:
    def __matmul__(self, other):
        # Реализация матричного умножения
        pass

Умножение в Python — гибкий механизм, поведение которого зависит от типов операндов и может быть кастомизировано для пользовательских классов.