Типы данных языка программирования python

Список типов данных в Python

Начнём с того, что все данные в Python являются объектами. Они могут создаваться нами вручную, либо быть изначально встроенными на уровне языка. Объект можно охарактеризовать, как особую область памяти, где хранятся некоторые значения и определённые для этих значений операции.

Проиллюстрировать фундаментальность объектов в разрезе Питона можно, приведя пример общего вида программы на этом языке. Итак:

  1. Программа состоит из модулей;
  2. Модуль, в свою очередь, представляет собой набор инструкций;
  3. Инструкции содержат выражения;
  4. Выражения служат для создания и обработки объектов;

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

Что такое динамическая типизация

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

Нетипизированные языки в основной своей массе сосредоточены на низком уровне, где большинство программ напрямую взаимодействует с железом. Так как компьютер «мыслит» нулями и единицами, различия между строкой и, допустим, классом для него будут заключаться лишь в наборах этих самых 0 и 1. В связи с этим, внутри бестиповых языков, близких к машинному коду, возможны любые операции над какими угодно данными. Результат на совести разработчика.

Python же — язык типизированный. А, раз в нём определено понятие «типа», то должен существовать и процесс распознавания и верификации этих самых «типов». В противном случае вероятны ситуации, когда логика кода окажется нарушенной, а программа выполнится некорректно.

Читайте также:  Modify files with php

Таким процессом и является типизация. В ходе её выполнения происходит подтверждение используемых типов и применение к ним соответствующих ограничений. Типизация может быть статической и динамической. В первом случае, проверка выполняется во время компиляции, во втором — непосредственно во время выполнения программного кода.

Python — язык с динамической типизацией. И здесь, к примеру, одна и та же переменная, при многократной инициализации, может являть собой объекты разных типов:

a = 1 print(type(a)) a = ‘one’ print(type(a)) a = print(type(a))

В языке со статической типизацией такой фокус не пройдёт:

// код на C++ int main() < int b = 2; cout > error: invalid conversion from ‘const char*’ to ‘int’ [-fpermissive] b = «two»;

💭 Адепты и приверженцы разных языков часто спорят о том, что лучше: динамическая типизация или статическая, но, само собой, преимущества и недостатки есть и там, и там.

👍 К плюсам динамической типизации можно отнести:

1 . Создание разнородных коллекций. Благодаря тому, что в Python типы данных проверяются прямиком во время выполнения программного кода, ничто не мешает создавать коллекции, состоящие их элементов разных типов. Причём делается это легко и просто:

# список, элементами которого являются строка, целое число и кортеж variety_list = [‘String’, 42, (5,25)]

2 . Абстрагирование в алгоритмах. Создавая на Питоне, предположим, функцию сортировки, можно не писать отдельную её реализацию для строк и чисел, поскольку она и так корректно отработает на любом компарируемом множестве.

3 . Простота изучения. Не секрет, что изучать Питон с нуля гораздо легче, чем, например, Java. И такая ситуация будет наблюдаться не только для этой пары. Языки с динамической типизацией в большинстве своём лучше подходят в качестве учебного инструмента для новичков в программировании.

🙁 К минусам же динамической проверки типов можно отнести такие моменты, как:

1 . Ошибки. Ошибки типизации и логические ошибки на их основе. Они достаточно редки, однако зачастую весьма сложно отлавливаемые. Вполне реальна ситуация, когда разработчик писал функцию, подразумевая, что она будет принимать числовое значение, но в результате воздействия тёмной магии или банальной невнимательности, ей на вход поступает строка и …функция отрабатывает без ошибок выполнения, однако её результат, — ошибка, сам по себе. Статическая же типизация исключает такие ситуации априори.

2 . Оптимизация. Статически типизированные языки обычно работают быстрее своих динамических братьев, поскольку являются более «тонким» инструментом, оптимизация которого, в каждом конкретном случае, может быть настроена более тщательно и рационально.

Так или иначе, сказать, что «одно лучше другого» нельзя. Иначе «другого» бы не было. Динамически типизированные языки экономят уйму времени при кодинге, но могут обернуться неожиданными проблемами на этапе тестирования или, куда хуже, продакшена. Однако вряд ли кто-то будет спорить с тем, что динамический Python куда более дружелюбный для новичков, нежели статический C++.

Разница между атомарными и структурными типами данных

По одной из классификаций все типы данных в Python делятся на атомарные и ссылочные.

Разница между этими двумя группами уходит глубоко в корни языка. Вкратце:

Атомарные объекты, при их присваивании, передаются по значению, а ссылочные — по ссылке

# пример присваивания атомарного объекта atom = 3 btom = atom atom = 2 print(atom) > 2 print(btom) > 3

Из результатов видно, что переменной btom было присвоено именно значение, содержащееся в atom, а не ссылка, указывающая на область памяти.

Посмотрим, как это работает для структурных типов:

# пример присваивания ссылочного объекта link = [‘Ipona’, ‘Master Sword’] alin = link link[0] = ‘Zelda’ print(link) > [‘Zelda’, ‘Master Sword’] print(alin) > [‘Zelda’, ‘Master Sword’]

Поскольку списки — это ссылочные объекты, то вполне закономерно, что после присваивания переменной link переменной alin передалась именно ссылка на объект list-а и, при печати, на экран были выведены две одинаковые надписи.

Собственно, в этом и вся разница.

Числовые типы

«Все сущее есть Число» — сказал однажды мудрый грек по имени Пифагор. Числа — важнейший и фундаментальнейший из всех типов данных для всех языков программирования. В Python для их представления служит числовой тип данных.

int (целое число)

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

# примеры целых чисел a = -3000 b = 0 c = 9000

Там, где есть числа, есть и математика. Поэтому резонно, что целые числа используются для исчисления всевозможных математических выражений. Также int применяется в качестве описаний количественных свойств какого-либо объекта.

float (число с плавающей точкой)

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

print(0.3 + 0.3 + 0.3) > 0.8999999999999999 print(0.3 * 3 == 0.9) > False

В плане записи, float ничем не отличаются от int :

# примеры вещественных чисел zero = 0.0 pi = 3.14 e = 2.71

В плане использования — тоже, разве что в любых мало-мальски серьёзных вычислениях без float никуда.

complex (комплексное число)

Привет высшей математике! Как вещественный ряд расширяет множество рациональных чисел, так и ряд комплексных чисел расширяет множество вещественных. Показательной особенностью комплексного ряда является возможность извлечения корня из отрицательных чисел.

В Python комплексные числа задаются с помощью функции complex() :

# пример комплексного числа z = complex(1, 2) print(z) > (1+2j) # вещественная часть print(z.real) > 1.0 # мнимая часть print(z.imag) > 2.0 # сопряженное комплексное число print(z.conjugate()) > (1-2j)

Помните, что операция сравнения для комплексных чисел не определена:

z1 = complex(4, 5) z2 = complex(100, 200) print(z1 > z2) > Traceback (most recent call last): print(z1> z2) TypeError: ‘>’ not supported between instances of ‘complex’ and ‘complex’

Комплексные числа широко применяются, например, для решения дифференциальных уравнений.

Источник

Оцените статью