Что такое + в Python?
Я пишу первую простую программу на Python и мне сложно понять, что такое в нем '+', почему он так по-разному используется. Он может складывать переменные с типом int (целые числа). Но, как я понимаю он и с другими категориями используется. И str, и bool, и т.д. Он же там по-разному действует? Как так получается?
Ответы (3 шт):
Лучше почитать учебник прежде, чем писать, иначе будут сюрпризы. + много куда входит, просто действует по-разному (и для int, и str, и bool) А учитывая динамическую типизацию, вопрос ещё веселее.
Вот несколько примеров:
a = 5
b = 6
c = 'Петя - '
d = 'Маша'
e = True
f = False
print ('a+b', a+b) # Печать: 11
print ('c+d', c+d) # Печать: Петя - Маша
print ('e+f', e+f) # Печать: 1 (а вовсе не False:-)
print ('a+e', a+e) # Печать: 6
print ('a+f', a+f) # Печать: 5
Вы путаете типы данных с операторами. "+" это арифметический оператор, а перечисленные вами Int, Str, Bool, это типы данных.
>>> 2+3
5
Советую вам почитать про операторы и типы данных, тогда вы научитесь отличать одно от другого.
Дополню ответы здесь.
Первое, введем терминологию на примере a + b
a- левый операнд+- оператор сложенияb- правый операнд
От простого к сложному. Действие оператора сложения зависит от типов данных, с которым их используют.
Для числовых типов данных (int, float, complex)
Оператор сложения работает, как обычное математическое сложение
# int + int = int
a = 1 + 2
print(type(a), a)
# out
# <class 'int'> 3
# int + float или float + int = float
b = 1 + 2.1
c = 3.1 + 1
print(type(b), b, "\n", type(c), c)
# out
# <class 'float'> 3.1
# <class 'float'> 4.1
# compex + int, int + complex, complex + complex, complex + float, float + complex = complex
d = (1 + 1j) + 1
e = 1 + (1 + 1j)
f = (1 + 1j) + (1 + 1j)
g = (1 + 1j) + 1.1
h = 1.1 + (1 + 1j)
print(f"{type(d), d}\n{type(e), e}\n{type(f), f}\n{type(g), g}\n{type(h), h}\n")
# out
# (<class 'complex'>, (2+1j))
# (<class 'complex'>, (2+1j))
# (<class 'complex'>, (2+2j))
# (<class 'complex'>, (2.1+1j))
# (<class 'complex'>, (2.1+1j))
Здесь стоит обратить внимание на комплексную запись числа (1 + 1j). Оператор сложения определяет тип данных, как complex.
Для последовательностей (str, list, tuple, dict)
В данных типах данных появляется такой термин, как конкатенация. Что буквально переводится с латыни присоединение цепями; сцепле́ние
str
Конкатенировать можно только строку со строкой. В любом другом случае, вы будете получать ошибку
TypeError: can only concatenate str (not "int") to str
Пример
a = "abcdef"
b = "ghi"
c = a + b
print(type(c), c)
# out
# <class 'str'> abcdefghi
list, tuple
Операция сложения для списков и кортежей тоже называется конкатенацией
a = [1, 2, 3, 4]
b = [5, 6, 7, 8]
c = a + b
print(type(c), c)
# out
# <class 'list'> [1, 2, 3, 4, 5, 6, 7, 8]
e = (1, 2, 3, 4)
f = (5, 6, 7, 8)
g = e + f
>>> print(type(g), g)
<class 'tuple'> (1, 2, 3, 4, 5, 6, 7, 8)
Если складывать с другими типами данных, результатом будет исключение TypeError
dict
Не поддерживается операция сложения.
Булевый тип (bool)
Здесь надо принять такую условность True = 1, False = 0. И оператор сложения с данным типом данных можно рассматривать, как сложение с числами 1 и 0
e = True + False # bool + bool
f = True + 10 # bool + int
g = True + 11.1 # bool + float
print(type(e), e)
print(type(f), f)
print(type(g), g)
# out
# <class 'int'> 1
# <class 'int'> 11
# <class 'float'> 12.1
Чуть сложнее.
При использовании оператора сложения в python вызывается метод __add__(). Буквально, для выражения a + b, где a - это экземпляр класса, в котором определен метод __add__(), будет вызываться следующая конструкция a.__add__(b).
У каждого типа данных можно спросить документацию по данному методу
>>> int.__add__.__doc__
'Return self+value.'
>>> str.__add__.__doc__
'Return self+value.'
>>> dict.__add__.__doc__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'dict' has no attribute '__add__'
Небольшой пример переопределения __add__()
>>> class MyType5:
... def __init__(self) -> None:
... self.value = 5
... def __add__(self, value):
... return self.value + value
...
>>> my = MyType5()
>>> my + 1
6
В примере наглядно показано, что переопределение метода __add__() влияет на оператор сложения. Важно отметить, что здесь важен порядок слева направо. То есть метод __add__() должен быть определен у левого операнда
Если поменяем порядок
>>> 1 + my
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'MyType5'
То есть у типа данных int определен метод __add__(), но ему не известно, что делать с моим типом данных
