Встроенные типы данных в Python

Опубликован: 14.08.2023 165

Python работает с двумя категориями типов данных:

  • Встроенными типами (они поддерживаются по умолчанию);
  • Специализированными (для операций с ними нужно подключение определенного модуля).

К специализированным типам данных относятся, например: datetime (дата и время) и deque (двухсторонняя очередь).

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

  • Простые (числа, строки, булевый тип).
  • Коллекции (списки, кортежи, словари, множества).
  • Остальные (файлы, итераторы, сокеты, NaN).

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

Числа

Python умеет работать с целыми числами (тип данных int), числами с плавающей точкой (тип данных float) и комплексными числами (тип данных complex). В целом числовые объекты в Python поддерживают те же операции, что и числа в других языках программирования (сложение +, вычитание -, умножение *, деление /, возведение в степень ** и др.)

Для максимально точных расчетов с десятичными числами в Python используют модуль decimal (тип данных Decimal), а для операций с рациональными числами (дробями) – модуль fractions (тип данных Fraction).

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

Тип данных Decimal предоставляет более высокую точность, но и этой точности может в некоторых случаях не хватить.

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

# точность вычислений с числами float
x = 0.1 + 0.2
print(f'{x=}')
x=0.30000000000000004

# точность вычислений с модулем decimal
from decimal import Decimal

x = Decimal("0.1") + Decimal("0.7")
print(f'{x=}')
x=Decimal('0.8')

Decimal(1) / Decimal (3)
Decimal('0.3333333333333333333333333333')

Decimal(1) / Decimal (3) * Decimal (3) == Decimal (1)
False

# точность вычислений с модулем fractions
from fractions import Fraction

Fraction(1) / Fraction(3) * Fraction(3) == Fraction(1)
True

Также в стандартной библиотеке Python есть модуль math, который подключается директивой import math, и содержит широкий набор функций для работы с числовыми данными.

Для работы с очень большими числами в Python 2+ имеется специальный тип данных long, который в Python 3+ переименован в тип данных int. Причем, если в C++ самый большой long long ограничен 64 битами (самое большое положительное число равно 18 446 744 073 709 551 615), то «длинные числа» в Python не ограничены.

Например, возведём 35 в 800-ю степень:

print(35 ** 800)

# результат: 
# 17965341631312893054265044294512768786567407046981616366471225558262137462540353
    72303324450263852730988467627513174860085830113094864989387799992271874353601472
    2586114223246935260690034309450203682283207... и так далее

Строки

Строки (string) — это последовательности символов, поэтому к ним применимы многие методы других последовательностей: списков и кортежей. Например, обращение к элементу по индексу, вычисление количества символов, конкатенация и получение среза.

first_str = 'skill'
second_str = 'box'

# конкатенация строк
some_string = first_str + second_str
print(some_string)   
# skillbox

# длина строки
length = len(some_string)
print(length) 
# 8

# первый символ строки
first_symbol = some_string[0]
print(first_symbol) 
# s

# срез строки с первого по пятый символ
skill_slice = some_string[0:5]
print(skill_slice) 
# skill

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

# последний символ строки
last_symbol = some_string[-1]
print(last_symbol) 
# x

# последние три символа строки 'skillbox'
box_slice = some_string[-3:]
print(box_slice) 
# box

Кроме того, у типа string есть ряд методов, уникальных для него:

# поиск подстроки
# если подстрока найдена, метод вернёт позицию её первого элемента, если нет — вернёт -1
ill_substr = some_string.find('ill')
print(ill_substr)

# поиск подстроки с заменой, заменим skill на school
school_box = some_string.replace('skill', 'school')
print(school_box) 
# schoolbox

# разбить строку по разделителю
student_name = 'Ivan_Ivanovich_Petrov'
list_of_substr = student_name.split('_')
print(list_of_substr) 
# ['Ivan', 'Ivanovich', 'Petrov']

Списки

Список (list) — это упорядоченная коллекция объектов. Списки могут иметь сколько угодно уровней вложенности и хранить неограниченное количество объектов. Кроме того, в одном списке могут одновременно храниться объекты разных типов.

Над списками можно производить те же операции, что и над строками:

some_list = ['s', 'k', 'i', 'l', 'l', 'b', 'o', 'x']

# первый символ списка
list_first_symbol = some_list[0]
print(list_first_symbol) 
# s

# срез списка с первого по пятый элемент
list_slice = some_list[0:5]
print(list_slice) 
# ['s', 'k', 'i', 'l', 'l']

# последний элемент списка
list_last_symbol = some_list[-1]
print(list_last_symbol) 
# x

Но у списков есть и специфические методы, которые присущи только им. Например, можно добавить новый элемент в конце списка, удалить i-й элемент или отсортировать список:

# добавить новый элемент в конец списка
some_list.append('!')
print(some_list) 
# ['s', 'k', 'i', 'l', 'l', 'b', 'o', 'x', '!']

# удалить элемент с индексом 3
some_list.pop(3)
print(some_list) 
# 's', 'k', 'i', 'l', 'b', 'o', 'x', '!']

#отсортировать элементы списка в порядке возрастания
some_list.sort()
print(some_list) 
# ['!', 'b', 'i', 'k', 'l', 'o', 's', 'x']

Кортежи

Кортежи (tuple) — это те же списки, только неизменяемые. Над ними можно производить те же операции, что и над списками, — кроме тех, которые изменяют кортеж:

some_tuple = ('p', 'y', 't', 'h', 'o', 'n')

# последний элемент кортежа
last_element = some_tuple[-1]
print(last_element)

# срез кортежа с первого по третий элемент
tuple_slice = some_tuple[0:3]
print(tuple_slice)

# меняем значение первого элемента
some_tuple[0] = 'c'

При попытке заменить элемент 'p' на 'c' Python выдаст сообщение об ошибке:

`TypeError: 'tuple' object does not support item assignment`

Вы спросите: зачем нужны кортежи, когда есть списки с более широким набором методов и операций? Как мы уже сказали выше, иногда программистам важно быть уверенными, что функция не изменит значение объекта. Как раз для таких случаев и годятся кортежи.

Словари

Словарь (dict) — это неупорядоченная коллекция пар «ключ — значение». В качестве ключей могут выступать любые неизменяемые объекты (числа, строки и даже кортежи).

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

# словарь с данными об ученике Skillbox
some_dict = {'first_name':'Алексей', 
             'age':35, 'is_paid':True, 
             'courses':['python', 'javascript', 'html/css'], }
print(some_dict)

# элемент с ключом 'last_name'
print(some_dict['first_name']) 
# 'Алексей'

# создать элемент, присвоив значение несуществующему ключу
some_dict['second_name'] = 'Петров'
print(some_dict)
# {'first_name': 'Алексей', 'age': 35, 'is_paid': True, 'courses': ['python', 'javascript', 'html/css'], 'second_name': 'Петров'}

del some_dict['is_paid']
print(some_dict)
# {'first_name': 'Алексей', 'age': 35, 'courses': ['python', 'javascript', 'html/css'], 'second_name': 'Петров'}

В качестве значений словарь может хранить объекты совершенно разных типов — даже другие словари. Глубина вложенности не ограничена.

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

Множества

Множество (set) - это изменяемый неупорядоченный тип данных, содержащих только уникальные элементы.

И хотя, множества относятся к изменяемому типу данных, в Python есть и неизменяемые множества (тип данных frozenset).

Множество в Python - это последовательность элементов, которые разделены между собой запятой и заключены в фигурные скобки.

С помощью множества можно легко убрать повторяющиеся элементы:

# преобразование списка в множество
vlans= [10, 20, 30, 40, 20, 100, 10] 
set (vlans)
{10, 20, 30, 40, 100}.

Файлы

Объекты-файлы позволяют работать с файловой системой компьютера. Чтобы создать такой объект, нужно передать функции open имя файла и режим доступа (чтение или запись).

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

# начнём с первой главы
# создадим файл с книгой в текущей папке
my_book = open("my_book.txt", 'w')
my_book.write('Chapter 1: Hello, Python!\n')
my_book.write('To be continued...\n')
# закроем поток записи
my_book.close()

А теперь проверим, всё ли сохранилось как надо. Для этого создадим новый объект-файл с помощью той же функции open, но в режиме чтения — r (read):

# откроем нашу книгу и проверим содержимое
book = open("my_book.txt", 'r')
text = book.read()
print(text)

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

Булевый тип данных

В Python, как и в других языках, есть логический тип данных bool, который имеет всего два значения: True (истина) и False (ложь).

Его возвращают логические операторы (например сравнение чисел или проверка присутствия элемента в списке), и именно этот тип обычно используется в if и while.

Тем не менее, явно использовать bool или операторы необязательно: существуют правила, по которым значение любого типа приводится к True или False.

NoneType

NoneType — это встроенный тип данных в Python, который представляет отсутствие значения. Он предполагает, что переменная или функция не возвращает значение или что значение равно None или null.

Ключевое слово None — это объект, тип данных класса NoneType. Мы можем присвоить None любой переменной, но мы не можем создавать другие объекты NoneType.

В Python нет ключевого слова null, но есть None.

Чтобы узнать тип данных, нужно воспользоваться встроенной функцией type():

a = 3.5
type(a) 
<class 'float'>

Похожие посты

Использование аннотации типов в Python

Изменяемые и неизменяемые типы данных

Динамическая типизация в Python

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

Комментариев нет.