Типы данных в Python: числа, списки и множества

Python

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

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

Это достигается благодаря внедрению в языки программирования типов данных, которые и позволяют превращать бинарные значения в другие. Разберемся, как работает эта технология и рассмотрим типы данных в Рython.

Основные типы данных в Python для начинающих

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

Например, если две переменные имеют тип данных — число (пусть это будет 5 и 3), то при их сложении компьютер выдаст 8. В случае, когда обе переменные имеют символьный тип данных, то вместо сложения произошла бы конкатенация строк, то есть склеивание. На выходе вместо 8 пользователь увидел бы строку «53» (неожиданно, согласны).

Вторая причина, по которой вместо одного типа (сплошной текст) используются множество других, это размер занимаемого пространства.

Например, для хранения одного только символа в юникоде достаточно 1 байта (8 битов). Для строки понадобится уже немного больше, так как в строке присутствуют специальные символы. Также переменная с плавающей точкой (десятичной дробью) будет занимать больше места, чем целое число. В C++ были даже ключевые слова, позволяющие регулировать размер выдаваемой памяти (long, short, unsigned…), но в Python такого функционала не предусмотрено. Впрочем, типизация данных в Python серьезно отличается от ее реализации в других ЯП, рассмотрим каждый тип отдельно.

Типы данных в Python: числа, списки и множества
Переменные – это по сути коробки с данными

Числа

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

  • int – целое число;
  • float – число с плавающей точкой;
  • complex – комплексное число (редко используется на ранних стадиях изучения языка).

Давайте по порядку. Целые числа – это все, что можно посчитать, без всяких долек и половин. 7 цветов радуги, 101 роза, 12 месяцев, 2 выходных дня и так далее. Если придерживаться более официальной трактовки, то числа типа int не имеют дробной части, то есть у них нет «хвоста» после целой части. Например, 3.14, 4.5, 99.9 – это уже нецелые числа.

Кстати, в Python вместо запятой дробная часть отделяется точкой. То есть правильно писать «1.2», а не «1,2», как учили в школе. Это важно, так как при использовании запятой интерпретатор (обработчик) Python примет десятичную дробь за два разных числа.

Числа с плавающей запятой – это обычные десятичные дроби. Впрочем, математики закидают нас негативными отзывами за такое высказывание, ведь плавающая запятая – это лишь один из способов представления вещественных (дробных) значений, но ни в коем случае не сама дробь. Однако, если вы новичок, то лучше ассоциируйте это с десятичной дробью.

На практике числа с плавающей точкой используются для измерения нецелых значений. Например, температура редко бывает ровной, например, 12 градусов. Она то 12.5, то 12.3, то 11.9 градусов. В таком случае и пригождаются дробные числа.

Особенность этого типа данных – это ограниченность в точности. Программист может получить только первые две цифры после запятой, а может все 10.

Комплексные числа – это числа, которые состоят из действительной и мнимой части. Пока достаточно знать это. Не пытайтесь сравнить комплексные числа с реальными примерами, ведь это чисто математическая особенность. Пример комплексного типа данных: 1+3i. Нет, знак плюса не означает сложение, ведь это уже готовая форма числа

Типы данных в Python: числа, списки и множества
Числа – основа всего

Для инициализации переменной достаточно просто указать ее имя, а после значение через знак пробела. Пример:

x = 5 # int (python types);
y = 9.8 # float
z = 1+3i # complex
Типы данных в Python: числа, списки и множества
Описание создания переменной

Списки

Нередко возникает необходимость собрать некоторые данные в одно место. Забудем на минуту про программирование. Представьте, что у вас есть 10 продуктов, которые вы собираетесь купить. Чтобы не забыть их, вы записываете каждый продукт на отдельный лист? Нет, скорее всего вы перепишите все списком на одну бумажку. Список студентов в группе, к слову, также помещается на один лист, а не разбрасывается по разным бумажкам.

Так вот, в Python также несколько связанных между собой переменных можно поместить в одну структуру, которая так и называется – список (list). Список – это упорядоченная последовательность значений. Примечательно, что в одном списке можно хранить значения с разными типами данных. Примеры однородного списка: [1,5,2,5,2], [«морковь «, » капуста», » тыква»], [4.2, 3.1, 5.4].  Пример неоднородного списка (с разными типами данных): [44, «New-York», 414, 64, 4.2]. Чтобы инициализировать список, нужно указать его название, а после знака «=» в квадратных скобках указать значения через запятую. Пример:

x = [5,6,3,4] # list

Чтобы обратиться к одному элементу, достаточно указать его индекс (порядковый номер). Важное примечание: в Python индексация начинается с 0, а не с 1. То есть, в этом примере число 5 имеет индекс 0. Следственно, чтобы обратиться к первому значению списка, нужно ввести:

print(x[0])

Списки, в отличие от массивов, легко изменить, добавить новые элементы и удалить существующие. Для любознательных рекомендуем вторую главу из книги «Грокаем Алгоритмы», где подробно описано отличие списка от массива.

Типы данных в Python: числа, списки и множества
Индексация в списках начинается с 0

Кортежи

Кортежи по сути ничем не отличаются от списков, за исключением одного «но» — их нельзя изменять. Это нужно скорее для программиста, чем для пользователя. Например, имеется кортеж для подключения к базе, в котором хранится название базы, логин и пароль. Изменять эти значения категорически нельзя. Чтобы объявить кортеж, достаточно заменить квадратные скобки на круглые:

x = (5, 6, 3, 4) # tuple

Строки

Тут нет какого-то двоякого смысла, строки – это упорядоченная последовательность символов. Даже предложение, которое вы читаете, это строка. Чтобы объявить строку, достаточно поместить содержимое в двойные («) или одинарные (‘) кавычки:

word = «hello world» # string

 Чтобы создать многострочную переменную, нужно поместить текст в три одинарные кавычки слева и справа (»’):

word =''' hello world
and everyone''' # string

Примечательно, что строки – это те же списки с символами. Следственно, если разработчик хочет получит первый элемент строки, то ему достаточно написать:

print (word[0]) # ‘h’

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

word = ‘dad\’s phone’ # — с помощью знака \ мы пометили одинарную кавычку как часть строки.

На просторах интернета есть даже таблицы с символами экранирования.

Множества

Множества – это структурные данные, в которых находятся только уникальные значения. То есть, если в списках можно было несколько раз использовать одно и то же значение ([4,4,2,4]), то в множествах все символы встречаются только один раз ({4,2}). Также множества не индексируются, то есть обратиться по индексу к ним нельзя. Чтобы объявить множества, достаточно поместить значения не в квадратные скобки, а в круглые:

k = {4,2,6} # set

Словари

Словари – это связки ключ значение. Если в списках мы обращались к элементам по индексу, то к словарю мы обращаемся именно по имени. Это удобно, ведь такой метод представления данных более удобный. Однако отсортировать и перебрать такой вариант будет труднее. Инициализация:

diction = { # dict
	"Name": "Steve", # Name - имя ключа, по которому можно обратиться, Steve - значение внутри ключа
	"age": 43
}

Пример обращения:

print(diction[«age»]) # 43

На этом основные элементы подходят к концу.

Типы данных в Python: числа, списки и множества
Небольшая шпаргалка

Как работать с типами данных

По сути, каждая переменная подчиняется собственным правилам, взаимодействует только с определенными функциями. В таблице ниже представлены примеры работы со строками.

Переменная Название Функция, команда или операция Пример
Int, float, complex Математические операции +, -, *, /, ** (возведение в степень), % (нахождение остатка) int x = 10 int y = 5 print (x / y) # 2.0 при делении получается число с плавающей точкой print (x + y) # 15
string (str), list Конкатенация + или , one =  «hi,» two = «guys» print(one, guys) # hi, guys
Разбивка на слова с переводом в список (только для строк) .split(аргумент) word = «one two three» word = word.split(» «)# в скобках указан разделитель, в данном случае пробел print(word) # [«one», «two», «three»]
Срезы (выбор отдельных частей строки) [начальный:конечный] word = «ABCDEFG» print(word[1:3]) # BC
Склеивание (только для списков) «разделитель».join(список) word = [«i», «Love», «Python»] word = «-«.join(word) print(word) # i-love-Python
Работа со строками

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

Типы данных в Python: числа, списки и множества
Дополнительные примеры работы со строками

Как узнать тип данных

Создать переменную легко, но как же узнать тип переменной python. Чтобы определить, это достаточно просто поместить ее в функцию type, а после вызвать через print. Покажем на наглядном примере:

one = 27
print(type(one)) # <class 'int'> (в таком формате указываются свойства объекта или его описание)
two = "Umbrella" # <class 'str'>
print(type(two)) # <class 'list'>
three = [5,1,5,2]
print(type(three))

Для практики сделайте такие же действия для множества, словаря и кортежа. Для проверки используйте функцию print.

Преобразование типов данных

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

number = 727
print (type(number)) # int
number = str(number)
print (type(number)) # str

Примером, где может пригодиться преобразование, можно назвать обычное сложение строки и числа. Чтобы добавить число в строку, необходимо сначала перевести ее в тип int. Лайфхак на заметку: чтобы почистить список от дубликатов, достаточно просто перевести его в множество, а потом вернуть обратно. Код:

nu = [4,1,5,2,4,5]
print(nu)
nu = set(nu)
nu = list(nu)
print(nu)

Для практики попробуйте преобразовывать разные типы в другие, чтобы понять, что можно преобразовать, а что нет. Например, int в dict перевести точно не получится, а вот в str или float – запросто.

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

Если вы пришли в python из другого языка, например, C++ или Java (для сравнения), то могли заметить, что здесь нет явного указания типизации. Не нужно перед названием переменной указывать, число будет в ней или символ. Это и называется динамическая типизация, когда не нужно явно указывать тип данных, а интерпретатор сам его определит. Возможно, в практике вам встретится такая конструкция:

x :int = 42
print(type(x))

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

Типы данных в Python: числа, списки и множества
При динамике тип переменной определяется уже в процессе запуска программы

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

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

x = [5,4,6,2] # список - структурный тип
j = x # значит происходит копирование по ссылке, а не по значению
print (j)
x[0] - 3 # изменение первого элемента
print (j) # [3,4,6,2] элемент j также изменился, хотя мы его не изменяли

k = 5 # int - атомарный тип
u = k # значит копируем по значению
k = 9 # изменяем значение
print (u) # 5 Значение u не изменилось, хоть мы и изменили k

Будьте осторожны при присваивании, так как можете столкнуться со случайным изменением списка без ведома разработчика. Вообще, чтобы скопировать списки, используется функция copy().

Подытоживая, хочется сказать, что хоть в питоне и нет статической типизации, необходимо все равно знать типы данных, так как это спасет от множества нелепых ситуаций, как например, склеивание строки и числа, либо перевод множества в дробь и так далее. Да и в целом, это позволяет понять, в каком виде представлены разные данные в Рython. Благодарим за прочтение.

Айтистанция
Добавить комментарий

Мы используем файлы cookie на нашем сайте

OK