Опубликован: 14.08.2023 165
Python работает с двумя категориями типов данных:
К специализированным типам данных относятся, например: datetime (дата и время) и deque (двухсторонняя очередь).
Встроенные типы данных можно разделить на три группы:
Для повышения эффективности программного кода отдавайте предпочтение встроенным типам, так как они упрощают разработку и более эффективны, чем пользовательские классы, потому что представляют собой оптимизированные структуры данных на языке 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
— это встроенный тип данных в Python, который представляет отсутствие значения.
Он предполагает, что переменная или функция не возвращает значение или что значение равно None
или null
.
Ключевое слово None
— это объект, тип данных класса NoneType
.
Мы можем присвоить None
любой переменной, но мы не можем создавать другие объекты NoneType
.
В Python нет ключевого слова null
, но есть None
.
Чтобы узнать тип данных, нужно воспользоваться встроенной функцией type()
:
a = 3.5
type(a)
<class 'float'>
Использование аннотации типов в Python
Изменяемые и неизменяемые типы данных
Динамическая типизация в Python
Преобразование типов данных в Python
Комментариев нет.