Типизация в Python
Всем привет папищики, сегодня разберем очень интересную тему - Типизация в языке программирования Python3. Я тут сначала сложным языком напишу, а дальше постараюсь объяснять на пальцах с примерами.
Python является интерпретируемым языком с динамической типизацией, что означает, что тип данных переменной определяется во время выполнения программы, а не во время компиляции. Это позволяет Python быть более гибким и удобным в использовании.
Забегая вперед, стоит сказать, что Python имеет динамическую, строгую, неявную типизацию.
Интегеры, стринги и прочие бесы
Если вы знаете какие типы данных есть в питоне и с чем их кушают, то можете пропускать этот раздел.
Думаю вы поняли, что сначала мы поговорим про типы данных. В питоне есть простые и сложные типы данных.
К простым относятся: целочисленный(int), числа с плавающей точкой(float), строковый(str), логический(bool).
Сложные это - списки(list), кортежи(tuple), словари(dict), множества(set).
Да, существует еще такое понятие как матрица, когда мы создаем списки в списках, существует еще такая штука как complex для комплексных чисел и прочие танцы с бубном, но мы затронем базовые типы данных.
# простые
integer_type = 5 # `int` (integer) — целые числа.
string_type = 'stroka' #`str` (string) — последовательность символов, заключенных в кавычки.
float_type = 3.14 # `float` (floating-point) — числа с плавающей точкой.
bool_type = True # `bool` (boolean) — логические значения `True` (истина) и `False` (ложь).
# сложные
list_type = [1, 2, 'hello', 2.79, False, 5] # `list` — упорядоченная изменяемая коллекция элементов, которые могут быть разных типов.
dict_type = {'first': 1,'second': 2,'third': 3} # `dict` (dictionary) — неупорядоченная коллекция пар ключ-значение, позволяющая быстро находить значение по ключу.
tuple_type = (1, 2, 3, 4, 5) # `tuple` — упорядоченная неизменяемая коллекция элементов, которые могут быть разных типов
set_type = {1, 2, 3, 4} # `set` — неупорядоченная коллекция уникальных элементов.Как вы поняли, сложные типы определяются автоматически по скобке. Имхо, лучше все-таки использовать не скобки, а ключевые слова, если требуется создать пустой список и т.п. Например:
list_type = list() dict_type = dict() tuple_type = tuple() set_type = set()
Казалось бы, определить тип данных несложно: 1 - целое число, "хелло ворлд" - строка и т.д. Но это МЫ можем вот так вот просто определить, а компьютеру нужен какой-то свой способ для того, чтобы понимать где какой тип данных. Надо же как-то в коде записать переменные таким образом, чтобы наш компьютер точно понял какой тип данных мы хотим использовать. Вот для таких целей и придумали типизацию.
Типизация - это способ определения типов данных, которые могут быть использованы в языке программирования или системе. Они нужны, чтобы программист или система могли понимать какие типы данных хранятся в переменных или передаются между функциями.
Короче, есть два стула, на одном типизированные языки(питон, си, пхп и другие известные ЯП), на другом безмам... бестиповые(нетипизированные) языки программирования.(например: язык ассемблера). Про бестиповые говорить мы сегодня не будем. А конкретно затронем питончик)
Типизация подразделяется на разные виды(подчеркнутые используются в питоне):
Это свойство языка программирования, которое позволяет переменным иметь различные типы данных в течение жизни программы. В динамически типизированных языках, таких как Python и JavaScript, тип переменной определяется во время выполнения программы, и переменная может быть присвоена значению любого типа в любое время.
x = 5 # x становится целым числом x = "hello" # x теперь строка
В статически типизированных языках (например, Java, C++), типы данных переменных определяются во время компиляции программы и остаются неизменными во время выполнения. Это означает, что каждая переменная должна быть явно объявлена с указанием её типа, и эти типы проверяются компилятором перед выполнением программы. Например в Java:
int x = 5; // x является целым числом (int) String y = "hello"; // y является строкой (String)
Строгая типизация или почему нельзя сделать 1 + "2" в Python
Строгая типизация - это когда язык программирования требует строгого соответствия типов данных и не допускает автоматических преобразований между разными типами данных без явного указания. Например, если у тебя есть переменная типа целого числа (integer), то ты не можешь использовать её в выражении, которое ожидает строку (string), пока не преобразовав её явным образом. Например:
a = 4 b = "4" result = a+b # выведет TypeError
Нестрогая типизация (или динамическая типизация) - это когда язык программирования позволяет автоматически преобразовывать типы данных во время выполнения программы без явного указания программистом. Например, если в языке с нестрогой типизацией ты пытаешься сложить число и строку, то язык автоматически сконвертирует число в строку и выполнит операцию. Например в JS:
var x = 5; var y = "10"; var result = x + y; // result будет равен "510", так как число 5 будет неявно преобразовано в строку и выполнится конкатенация строк.
При явной типизации, при создании переменной нужно обязательно указывать тип данных. Например в Java:
private String a = 5; private String b = 6; private int c = "privet";
При неявной типизации, необязательно указывать тип данных. Например на Python:
a = 5 b = 6 c = "privet"
Да, в питоне может быть и неявная типизация, НО мы имеем возможность указывать ее явно.
x: int = 5
Если честно, ни разу так не делал, когда просто объявлял переменные в коде, но я знаю где можно найти применение этой фишке.
Представляю вашему вниманию - Тайп-хинты(Type-hints). Шо?
Тайп-хинты (Type hints) в Python - это аннотации, которые позволяют указывать типы данных переменных, параметров функций и возвращаемых значений. Они вообще не влияют на выполнение работы программы, но зато повышают читабельность кода. Взгляните на пример.
# используем тайп хинты
def divide1(x: int, y: int) -> tuple[int, float]:
celoe = x // y
ostatok = x % y
return celoe, ostatok
# не используем тайп хинты
def divide2(x, y):
celoe = x // y
ostatok = x % y
return celoe, ostatok
result = divide1(10, 3)
print(result) # (3, 1)
result = divide2(10, 3)
print(result) # (3, 1)Как вы могли заметить - ничего по сути то не изменилось в выполнении программы, но зато, по первой функции мы можем понять, что на вход должны прийти два числа, а вернуть обратно кортеж с числами.
Во втором же случае, можно понять, что функция должна принять два числа, т.к. строки или булевы значения нельзя поделить. Но я просто привел пример такой, что тут почти на интуитивном уровне понятно какие типы данных должна принять функция. НО ПЕРВОЕ ЖЕ ПРОЩЕ НУ ПОСМОТРИТЕ, ТАМ ЖЕ НИЧЕГО НЕ НАДО СМОТРЕТЬ И ИСКАТЬ, ВСЕ УЖЕ ЗАРАНЕЕ НАПИСАНО.
def average(numbers):
total = sum(numbers)
return total / len(numbers)Ну давайте, скажите, какой тип данных функция принимает и возвращает. У вас три секунды.
А вот жоские гигачады сеньоры напишут:
def average(numbers: list[int]) -> float:
total = sum(numbers)
return total / len(numbers)И вот тут-то все сразу ясно. Принимаем список - отдаем число с плавающей точкой.
В общем очень надеюсь, что я смог убедить вас в том, что тайп-хинты - это очень круто, лайк разрабам.
А в итоге мы имеем вот что. Мы разобрались в том, какие типы данных есть в Питоне, что такое типизация, на какие виды делится типизация и особенности каждого из видов.
Python имеет динамическую, строгую, неявную типизацию.
Разобрались в том, что такое тайп-хинты и почему это круто.
Очень надеюсь, что данный пост был для вас полезен и вы узнали что-то новое. Всем спасибо❤️