Найти тему
Timeweb Cloud

Типы данных Python

📜 Читайте также: Python: как преобразовать список в строку

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

Каждая переменная в Python представляет собой зарезервированную область памяти. Тип переменной определяет, какой объем памяти будет выделен под данные и каким образом будет происходить взаимодействие с ними.

Соответственно, для полноценной работы с языком необходимо знать все реализованные в нем типы — именно на них основывается механизм хранения и преобразования информации в любом приложении.

Все типы данных Python можно разделить на 2 основные группы: встроенные и специализированные.

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

Вот полный список встроенных типов:

  • Числа — int, float, complex
  • Логические — true, false
  • Строки — str
  • Списки — list
  • Кортежи — tuple
  • Словари — dict
  • Множества — set, frozenset
  • Диапазоны — range
  • Байты — bytes, bytearray
  • NoneType — None

А вон некоторые из специализированных типов:

  • Дата и время — date, time, timedelta, timezone
  • Коллекции — ChainMap, Counter, UserList, UserString

Кстати, вывести в консоль название типа конкретной переменной можно с помощью простой команды:

print(type(1)) # в качестве аргумента было передано целое число.

Название типа выводится в таком формате:

<class 'int'>

Числа (Numbers)

Два основных числовых типа — int и float. Первый представляет собой целое число, а второй — число с плавающей запятой, которое имеет более высокую точность значения.

В Python переменные объявляются через присвоение конкретного значения:

variable = 1 # переменная типа int

variable = 1.5 # переменная типа float

С помощью специальных операторов над числами можно выполнять основные математические операции:

variable = 1 + 2 + 3 # операция сложения

print(type(variable)) # вывод: <class 'int'>

print(variable) # выводим значение переменной в консоль: 6

В процессе изменения значений переменные могут менять свои типы, резервируя больше памяти. Например, «легким движением руки» int может превратиться во float:

variable = 5 * 2 # операция умножения

print(type(variable)) # вывод: <class 'int'>

variable += 0.1

print(type(variable)) # вывод: <class 'float'>

Тем не менее, возможно выполнить и обратное преобразование типа:

variable = 6 / 2 # операция деления

print(type(variable)) # вывод: <class 'int'>

variable += 0.1

print(type(variable)) # вывод: <class 'float'>

print(variable) # вывод: 10.1

variable = int(variable) # присваиваем переменной value1 преобразованное в int ее же значение, которое обрезается до целых

print(variable) # вывод: 10

print(type(variable)) # вывод: <class 'int'>

Вот таблица, демонстрирующая возможные математические операции с числами:

-2

Кстати, с помощью специальной функции можно округлять значение переменной, указывая количество цифр после запятой:

print(round(9/4.0, 2)) # вывод: 2.25

print(round(9/4.0, 1)) # вывод: 2.2

Можно также получить двоичное или шестнадцатеричное представление числа в формате строки str:

print(bin(8)) # вывод: 0b1000

print(hex(10)) # вывод: 0xa

Более сложные операции выполняются с помощью модуля math, который предварительно импортируется:

import math

print(math.sqrt(9)) # вывод: 3.0

Более подробно об этом модуле можно узнать в официальной документации.

Логические (Boolean)

Всего лишь две константы являются булевыми значениями — true и false. При этом, различные другие типы значений могут аналогично интерпретироваться как булевые.

К истинным значениям относится:

  • true
  • Ненулевое число
  • Непустая строка
  • Непустой объект

К ложным, соответственно, относится:

  • false
  • 0
  • None
  • пустая строка
  • пустой объект

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

full_list = [1, 2, 3] # объявляем заполненный список

empty_list = [] # объявляем пустой список

print(bool(full_list)) # вывод: True

print(bool(empty_list)) # вывод: False

print(bool(0)) # вывод: False

print(bool(1)) # вывод: True

Строки (Strings)

Строки в Python можно указывать двумя типами кавычек:

string1 = “first” # двойные кавычки

string2 = ‘second’ # одинарные кавычки

Есть и другой способ — указание строки вместе с изначальным форматированием:

# можно использовать как “”” так и ‘’’

string1 = """

first line

second line

third line"""

print(string1) # вывод сохраняет все указанные отступы, пробелы и переносы строк

С помощью оператора суммирования строки можно объединять в одну:

string1 = "first"

string2 = "second"

print(string1 + string2) # соединяем две строки

print(string1 + ' ' + string2) # соединяем три строки

Умножение строки на число приводит к ее повторению соответствующее количество раз:

string1 = “repeat”

print(string1 * 3) # вывод: repeatrepeatrepeat

К конкретным символам строки можно обращаться как с начала строки, так и с конца. При этом нумерация начинается с нуля:

string1 = “word”

print(string1[0]) # вывод: w

print(string1[-1]) # вывод: d

Списки (Lists)

Списками в Python являются любые последовательности элементов. Во многих других языках программирования (в C++, например) такие последовательности называют массивами — они аналогично указываются через запятую внутри квадратных скобок.

listNumbers = [5, 7, 9, 11] # список цифр

listStrings = ['first', 'second', 'third'] # список строк

listMixed = [12, 2.5, 'string'] # список смешанных типов

Разумеется, к элементам списка можно обращаться по индексу:

listMixed = [12, 2.5, 'string']

print(listMixed[0]) # вывод: 12

print(listMixed[1]) # вывод: 2.5

print(listMixed[2]) # вывод: string

print(listMixed[-1]) # вывод: string

Аналогичным образом значение элементов можно менять:

listNumbers = [1, 2, 3, 4, 5]

print(listNumbers) # вывод: [1, 2, 3, 4, 5]

listNumbers[0] = 10

print(listNumbers) # вывод: [10, 2, 3, 4, 5]

Также вы можете получить доступ только к определенным элементам списка:

listNumbers = [1, 2, 3, 4, 5]

# положительное значение перед :: указывает количество исключаемых элементов сначала

print(listNumbers[1::]) # вывод: [2, 3, 4, 5]

# отрицательное значение перед :: указывает количество включаемых элементов с конца

print(listNumbers[-2::]) # вывод: [4, 5]

# положительное значение после :: указывает шаг списка с начала

print(listNumbers[::2]) # вывод: [1, 3, 5]

# отрицательно значение после :: указывает шаг списка с конца (т.е. инвертирует список)

print(listNumbers[::-2]) # вывод: [5, 3, 1]

# просто инвертированный список

print(listNumbers[::-1]) # вывод: [5, 4, 3, 2, 1]

С другой стороны, для инвертирования списка лучше использовать специальную функцию:

listNumbers = [1, 2, 3]

print(listNumbers) # вывод: [1, 2, 3]

listNumbers.reverse()

print(listNumbers) # вывод: [3, 2, 1]

Количество элементов тоже можно узнать:

listNumbers = [1, 2, 3]

print(len(listNumbers))

Вложенные списки тоже возможны — по сути, это классические многомерные массивы:

listNested = [[1, 2], [3, 4], [5, 6]]

print(listNested[0][0]) # вывод: 1

print(listNested[0][1]) # вывод: 2

print(listNested[1][0]) # вывод: 3

print(listNested[1][1]) # вывод: 4

print(listNested[2][0]) # вывод: 5

print(listNested[2][1]) # вывод: 6

Кортежи (Tuples)

Кортежами являются листы, которые нельзя изменить после инициализации. Для объявления кортежа используются круглые скобки:

listConstant1 = tuple()

listConstant2 = ('Alex', 'Mike')

print(listConstant1) # вывод: ()

print(listConstant2[0]) # вывод: Alex

Словари (Dictionaries)

Словари в какой-то степени похожи на списки с тем лишь исключением, что обращение к данным внутри выполняется не по индексу, а по ключу. При этом данные внутри словаря располагаются в том же порядке, в каком они были добавлены.

Таким образом, любые данные в словаре представляют собой пару «ключ-значение». Ключом может выступать только неизменяемый тип — число, строка, кортеж.

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

Словарь объявляется следующим образом:

# запись в одну строку

personal1 = { 'country': 'Russia', 'city': 'Moscow', 'name': 'Ivan' }

# запись в несколько строк

personal2 = {

'country': 'Russia',

'city': 'Moscow',

'name': 'Ivan'

}

Обращение к значением аналогично спискам с помощью квадратных скобок, но по ключу:

personal = { 'country': 'Russia', 'city': 'Moscow', 'name': 'Ivan' }

print(personal['country']) # вывод: Russia

print(personal['city']) # вывод: Moscow

Добавить новые значение можно также по ключу — уже после инициализации:

personal = { 'country': 'Russia', 'city': 'Moscow', 'name': 'Ivan' }

personal[‘age’] = 26

print(personal) # вывод: {'country': 'Russia', 'city': 'Moscow', 'name': 'Ivan', 'age': 26}

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

personal = {

'country': 'Russia',

'city': 'Moscow',

'name': 'Ivan',

'child1': { 'country': 'Russia', 'city': 'Moscow', 'name': 'Alex' },

'child2': { 'country': 'Russia', 'city': 'Moscow', 'name': 'Mike' }

}

print(personal['child1']['name']) # вывод: Alex

print(personal['child2']['name']) # вывод: Mike

Множества (Sets)

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

Как и словарь, множество объявляется с помощью фигурных скобок, но без указания ключей:

set1 = { 1, 2, 3 }

set2 = { 1, 2, 3, 1 }

print(set1) # вывод: {1, 2, 3}

print(set2) # вывод: {1, 2, 3}

Добавить новый элемент во множество можно с помощью специальной функции:

set1 = { 1, 2, 3 }

set1.add(4)

set1.add(5)

print(set1) # вывод: {1, 2, 3, 4, 5}

С помощью специальных операторов можно проверить наличие определенного значения внутри множества:

set1 = { 1, 2, 3 }

print(1 in set1) # вывод: True

print(4 not in set1) # вывод: True

Чтобы сделать множество неизменяемым, нужно использовать отдельный тип frozenset:

set1 = { 1, 2, 3 }

set2 = frozenset(set1)

set1.add(7) # работает

set2.add(7) # ошибка

Диапазоны (Ranges)

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

# диапазон от 0 до 4

range1 = range(4)

print(*range1) # вывод: 0, 1, 2, 3

# диапазон от 1 до 4

range2 = range(1, 4)

print(*range2) # вывод: 1, 2, 3

# диапазон от 2 до 8 с шагом 2

range3 = range(2, 8, 2)

print(*range3) # вывод: 2, 4, 6

# диапазон от 8 до 2 с шагом 2

range4 = range(8, 2, -2)

print(*range4) # вывод: 8, 6, 4

# символ * необходим для распаковки диапазона данных

Чаще всего диапазоны применяются в циклах для обработки каких-либо данных:

for i in range(4):

print(i) # тут также может быть какая-нибудь логика

# вывод: 0, 1, 2, 3

Байты (Bytes)

В Python есть отдельные типы для работы с «низкоуровневыми» байтовыми данными напрямую.

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

Существует как изменяемый (bytearray), так и неизменяемый (bytes) байтовый тип. Только в отличие от строк, элементы байтовых массивов представляются в виде целых чисел со значениями от 0 до 255.

bytes1 = b"first bytes sequence" # инициализация с помощью литерала b

bytes2 = bytes(“second bytes sequence”, "utf_8") # инициализация через функцию с обязательным указанием кодировки

bytes3 = bytes(4) # инициализация с заполнением всей длины нулями

print(bytes1) # вывод: b'first bytes sequence'

print(bytes2) # вывод: b'second bytes sequence'

print(bytes3) # вывод: b'\x00\x00\x00\x00'

# байтовая последовательность с преобразованием в шестнадцатеричный формат

print(bytes3.hex()) # вывод: 00000000

Тип bytearray в этом смысле отличается только тем, что изменение ранее установленных значений не вызывает ошибку:

by = bytearray("any string", "utf_8")

print(by) # вывод: bytearray(b'any string')

by[0] = 65 # меняем первый байт на A через указание ASCII номера

print(by) # вывод: bytearray(b'Any string')

by[0] = ord("a") # меняем первый байт на a с использованием функции конвертации символа в число

print(by) # вывод: bytearray(b'any string')

NoneType (None)

Тип None используется для установки пустой переменной. По сути, это аналог Null в других языках программирования. Есть огромное количество случаев, когда может понадобиться проверка переменной на предмет ее «пустости».

Например, некая функция подключения к удаленному серверу может возвращать «пустой» результат в случае ошибки соединения. В таком случае можно проверить успешность операции.

connection = None # здесь может быть некая функция подключения connectToServer()

if connection is None:

print('Error')

else:

print('success')

Кстати, аналогично другим типам None можно проверить с помощью функции type:

anyVariable = 2

print(type(anyVariable)) # вывод: <class 'Int'>

anyVariable = None # тип поменялся на None

print(type(anyVariable)) # вывод:<class 'NoneType'>

Заключение

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

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

В этом смысле, язык Python разительно отличается от того же C++ — документация выступает более «централизованным» источником знаний, нежели официальные стандарты C++, следуют которым в полной мере далеко не все производители компиляторов.

Кстати, в официальном канале Timeweb Cloud собрали комьюнити из специалистов, которые говорят про IT-тренды, делятся полезными инструкциями и даже приглашают к себе работать.💥