⚙️ Типизация в Python



Частый вопрос на собеседовании: «Какая типизация у языка Python?»

Давайте разберемся, что такое типизация языков программирования и какие виды типизации бывают.



Типизация языков программирования ‌—‌ ‌это‌ ‌то,‌ ‌как‌ ‌различные‌ ‌языки‌ ‌распознают‌ ‌типы‌ ‌переменных.‌ ‌Она‌ ‌определяет,‌ ‌как‌ ‌вы‌ ‌будете‌ ‌работать‌ ‌с‌ ‌типами‌ ‌переменных:‌ ‌нужно‌ ‌ли‌ ‌их‌ ‌задавать‌ ‌изначально,‌ ‌можно‌ ‌ли‌ ‌изменять‌ ‌и‌ ‌так‌ ‌далее.‌ ‌



Типизация бывает:

▫️динамическая и статическая,

▫️сильная (строгая) и слабая (нестрогая)



##############

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



В языках со статической типизацией программист прописывает типы переменных. В примере кода статически типизированного языка C++ обязательно указывается тип переменных, в данном случае — int:



int a = 8;

int b = 2;



Статически типизированные языки программирования: Java, C#, C, C++, Go, Pascal, Scala, Rust.



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



data‌ ‌=‌ ‌8‌

data‌ ‌=‌ ‌"Hello"‌



Динамически типизированные языки программирования: Python, JavaScript, PHP, Perl, Ruby, Lisp.



##############

❗️Сильная‌ ‌и‌ ‌слабая‌ ‌типизация‌



В‌ ‌слабо‌ ‌типизированных‌ ‌языках‌ ‌программирования‌ ‌можно‌ ‌смешивать‌ ‌разные‌ ‌типы‌ ‌данных. Так‌ ‌код‌ ‌получается‌ ‌короче‌ ‌—‌ ‌язык‌ ‌«старается‌»‌ ‌сам‌ ‌выполнять‌ ‌операции‌ ‌преобразования‌ ‌с‌ ‌разными‌ ‌типами.‌ ‌Впрочем,‌ ‌в‌ ‌таком‌ ‌случае‌ ‌не‌ ‌всегда‌ ‌ясно,‌ ‌как‌ ‌поведёт‌ ‌себя‌ ‌программа.‌ Например,‌ ‌в‌ ‌JavaScript‌ ‌возможна‌ ‌такая‌ ‌запись:‌ ‌



5‌‌ ‌‌+‌‌ ‌‌'6'‌;‌ ‌‌//‌ ‌'56'‌ ‌

4‌‌ ‌‌*‌‌ ‌‌'3'‌;‌ ‌‌//‌ ‌12‌ ‌

2‌‌ ‌‌+‌‌ ‌‌true‌;‌‌//‌ ‌3‌ ‌

false‌‌ ‌-‌ ‌‌4‌;‌‌//‌ ‌-4‌



При‌ ‌сильной‌ ‌или‌ ‌строгой‌ ‌типизации,‌ ‌как‌ ‌в‌ ‌Python,‌ ‌язык‌ ‌не‌ ‌позволяет‌ ‌смешивать‌ ‌разные‌ ‌типы‌ ‌—‌ ‌то‌ ‌есть,‌ ‌если‌ ‌вы‌ ‌обозначили‌ ‌переменную‌ ‌как‌ ‌число,‌ ‌то‌ ‌добавить‌ ‌к‌ ‌ней‌ ‌строку‌ ‌уже‌ ‌не‌ ‌получится:‌ ‌ ‌



‌foo‌ ‌=‌ ‌"x"‌ ‌ ‌

foo‌ ‌=‌ ‌foo‌ ‌+‌ ‌5‌ ‌ ‌

Traceback‌ ‌(most‌ ‌recent‌ ‌call‌ ‌last):‌ ‌ ‌

‌File‌ ‌"<pyshell#3>",‌ ‌line‌ ‌1,‌ ‌in‌ ‌?‌ ‌ ‌

‌foo‌ ‌=‌ ‌foo‌ ‌+‌ ‌5‌ ‌

TypeError:‌ ‌cannot‌ ‌concatenate‌ ‌'str'‌ ‌and‌ ‌'int'‌ ‌objects‌ ‌ ‌



Языки‌ ‌с‌ ‌сильной‌ ‌типизацией‌ ‌надёжнее.‌ ‌Да и‌ ‌программист,‌ ‌прописывая‌ ‌все‌ ‌преобразования‌ ‌вручную,‌ ‌лучше‌ ‌понимает,‌ ‌как‌ ‌работает‌ ‌его‌ ‌код.