Динамическая, строгая, неявная.

У многих низкоуровневых языков (вроде ассемблера) вообще нет типизации — любые структуры в них — не более чем набор битов. Типизация позволяет упростить процесс обработки информации. Если данные имеют тип, то машина будет взаимодействовать с ними по правилам, установленным для этого типа.

Неявная типизация

Неявная типизация подразумевает возможность создавать объекты, не указывая их тип.

a = 10 (int)

b = ‘hello’ (str)

Если бы в Python была явная типизация, приходилось бы каждый раз указывать тип любой переменной. Но и у нее есть свои плюсы. Например, иногда полезно указывать, данные каких типов принимает функция, метод или аргумент. Впрочем, Python позволяет и такое:

def func(a: int, b: str) -> float:
    return round(float(a / len(b)), 2)

var: float = func(3, [1, 1, 1])  # 1.0

Строгая (Сильная) типизация

Python - язык с сильной типизацией. Это означает, что различные типы нельзя смешивать в одних выражениях.

2 + '2'
# Traceback (most recent call last):

Динамическая типизация

Это означает, что с определенным типом связывается не переменная, а ее значение. Если бы Python был языком со статической типизацией, мы бы не смогли сделать так:

a = 1
a = 'a'
a = SomeClass()

Однако за такое удобство приходится платить. Динамическая типизация, вместе с интерпретацией кода, стала причиной главнейшего проклятия Python - низкой скорости работы.