Вопрос 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 — гибкий механизм, поведение которого зависит от типов операндов и может быть кастомизировано для пользовательских классов.