Типы данных в Python

Ключевое слово null обычно используется во многих языках программирования, таких как Java, C++, C# и JavaScript. Это значение, которое присваивается переменной.
Концепция ключевого слова null в том, что она дает переменной нейтральное или «нулевое» поведение.
А что же в Python?
Числа: целые, вещественные, комплексные
Числа в Python 3: целые, вещественные, комплексные. Работа с числами и операции над ними.
Исключения в python. Конструкция try — except для обработки исключений
Исключения (exceptions) — ещё один тип данных в python. Исключения необходимы для того, чтобы сообщать программисту об ошибках.
Байты (bytes и bytearray)
Байтовые строки в Python — что это такое и с чем это едят? Байтовые строки очень похожи на обычные строки, но с некоторыми отличиями. Попробуем выяснить, с какими.
Файлы. Работа с файлами.
В данной статье мы рассмотрим встроенные средства python для работы с файлами: открытие / закрытие, чтение и запись.
Множества (set и frozenset)
Доброго времени суток! Сегодня я расскажу о работе с множествами в python, операциях над ними и покажу примеры их применения.
Функции и их аргументы
В этой статье я планирую рассказать о функциях, именных и анонимных, инструкциях def, return и lambda, обязательных и необязательных аргументах функции, функциях с произвольным числом аргументов.
Кортежи (tuple)
Сегодня я расскажу о таком типе данных, как кортежи (tuple) и о том, где они применяются.
Словари (dict) и работа с ними. Методы словарей
Сегодня я расскажу о таком типе данных, как словари, о работе со словарями, операциях над ними, методах, о генераторах словарей.
Списки (list). Функции и методы списков
Сегодня я расскажу о таком типе данных, как списки, операциях над ними и методах, о генераторах списков и о применении списков.
- Книги о Python
- GUI (графический интерфейс пользователя)
- Курсы Python
- Модули
- Новости мира Python
- NumPy
- Обработка данных
- Основы программирования
- Примеры программ
- Типы данных в Python
- Видео
- Python для Web
- Работа для Python-программистов
- Сделай свой вклад в развитие сайта!
- Самоучитель Python
- Карта сайта
- Отзывы на книги по Python
- Реклама на сайте
Типы данных в Python – особенности разработки
Что такое? Типы данных в Python, как и в любом другом языке программирования, играют важную роль, и их понимание является ключом к написанию эффективного кода. Речь идет про классы и экземпляры (объекты) этих классов.
Какие существуют? В Python есть разные типы данных, каждый из которых обладает своими уникальными характеристиками и возможностями использования. Самые ходовые – числа, списки, кортежи, словари, строки, множества.
В статье рассказывается:
- Что такое типы данных в Python
- Модель данных
- Числа
- Списки
- Кортежи
- Словари
- Строки
- Множества
- Что важно запомнить про типы данных Python
Пройди тест и узнай, какая сфера тебе подходит:
айти, дизайн или маркетинг.
Бесплатно от Geekbrains
Что такое типы данных в Python
Типом данных называют большое количество значений и комплекс операций, которые можно использовать на этих значениях. В языке программирования Python к ним относятся числа, строки, списки, словари, кортежи, множества и логический тип данных. Типы данных в Python можно разделить на:
- изменяемые (множества, списки, словари);
- неизменяемые (кортежи, строки, числа);
- упорядоченные (списки, строки, кортежи, словари);
- неупорядоченные (множества).
Python отличается от других языков своей типизацией – у него она неявная, сильная и динамическая. О чём это говорит? Неявная типизация означает, что нет необходимости при объявлении переменной определять конкретный тип данных, к которому она принадлежит, как это делается, к примеру, в языке С++.
Процесс объявления переменной в Python очень простой:
Узнай, какие ИТ — профессии
входят в ТОП-30 с доходом
от 210 000 ₽/мес
Павел Симонов
Исполнительный директор Geekbrains
Команда GeekBrains совместно с международными специалистами по развитию карьеры подготовили материалы, которые помогут вам начать путь к профессии мечты.
Подборка содержит только самые востребованные и высокооплачиваемые специальности и направления в IT-сфере. 86% наших учеников с помощью данных материалов определились с карьерной целью на ближайшее будущее!
Скачивайте и используйте уже сегодня:

Павел Симонов
Исполнительный директор Geekbrains
Топ-30 самых востребованных и высокооплачиваемых профессий 2023
Поможет разобраться в актуальной ситуации на рынке труда
Подборка 50+ бесплатных нейросетей для упрощения работы и увеличения заработка
Только проверенные нейросети с доступом из России и свободным использованием
ТОП-100 площадок для поиска работы от GeekBrains
Список проверенных ресурсов реальных вакансий с доходом от 210 000 ₽
Получить подборку бесплатно
Уже скачали 25510
Динамическая типизация говорит о том, что ошибки будут выявляться во время разработки программы. В языках программирования, у которых статическая типизация, поиск недочётов происходит во время компиляции. К примеру, в языке Python можно присоединить к одной переменной сначала объект одного типа данных, а потом другого:
Сильная (иначе строгая) типизация говорит о том, что в Python нельзя смешивать типы данных. Если переменная была определена как число, то сложить её со строкой не получится:
Благодаря этому повышается надёжность кода, потому что приходится явно преобразовывать число к строке:
Модель данных
До того, как разобраться с конкретными типами данных, немного поговорим о том, что значит модель данных, как образуются объекты в памяти, о работе процесса присваивания (=).
Для объявления переменной в Python, надо обозначить её имя, разместить знак присваивания (=) и ввести значение, которое сохранится в переменной.
Переменная под именем «а» получила число 10. Целочисленное значение 10 представляет собой объект, как всё в языке Python (числа, строки, списки и прочее). Объект – это абстракция данных. Под данными подразумеваются не только объекты, но и отношения между ними. В объект входит три компонента: тип, идентификатор и значение.
Во время создания переменной на уровне интерпретатора формируется целочисленный объект 10, который откладывается где-то в памяти. У этого объекта есть идентификатор, значение 10 и целочисленный тип. Через оператора присваивания (=) генерируется ссылка между переменной a и объектом 10, целочисленного типа.
Название переменной обязательно должно отличаться от ключевых слов Python. Для проверки можно использовать способ iskeyword() из модуля keyword.
Приведём ещё один пример, чтобы лучше разобраться в операции присвоения в Python:
Здесь используется функцию id для определения идентификатора, с которым связана переменная. Не стоит опираться на конкретные значения, потому что у вас они получатся не такими. Отметим также, что после присвоения изменился идентификатор, на который ссылается переменная.
Создание пользовательских типов данных в Python
В программировании на Python есть много случаев, когда может понадобиться больше одной переменной для представления определенного объекта.
Содержание:
- Зачем нужны пользовательские типы данных;
- Определение пользовательского типа данных;
- Инициализация пользовательского типа данных;
- Доступ к полям объекта пользовательского класса данных;
- Пользовательские типы данных и функции;
- Вложенные пользовательские типы данных.
Зачем нужны пользовательские типы данных?
Например, для представления одной книги, в книжном магазине, необходимо указать название книги, год издания, авторов (их может быть несколько), количество экземпляров этой книги, цена за единицу, общую стоимость всех книг или любую другую информацию:
book_title = 'Название книги' book_date = '01-01-2019' book_author = ['Автор 1', 'Автор 2'] book_price = 256 book_num = 9 book_total = book_price * book_num
Теперь есть шесть отдельных независимых переменных. Если надо будет передавать информацию о книге в какую-то функцию для дальнейшей обработки, то придется передавать каждую переменную по отдельности. Кроме того, если необходимо хранить информацию о какой-то еще книге, то придется дополнительно объявить еще шесть переменных! Такая реализация не очень эффективна и вообще, в итоге можно запутаться.
Python позволяет программистам, с помощью обычных классов, создавать свои собственные пользовательские типы данных, которые предназначены для упорядоченного хранения нестандартных данных. Проще говоря, группируют несколько отдельных переменных разных типов в единое целое.
Определение пользовательского типа данных.
Пользовательские типы данных создаются программистом с использованием синтаксиса класса:
class Book: def __init__(self, title=None, date=None, authors=None, price=0, num=0): self.title = title self.date = date self.price = price self.num = num self.total = self.price * self.num if authors is None: self.authors = [] else: self.authors = authors def __repr__(self): return f'self.__class__.__name__>(title=self.title>, date=self.date>, \ authors=self.authors>, price=self.price>, num=self.num>, total=self.total>)'
Код выше определяет тип данных Book , для хранения информации о книге в книжном магазине. Но такая запись пользовательского типа данных очень многословна, что совсем не по питонически. Для упрощенного и удобного создания пользовательских типов данных, с версии Python 3.7 введен встроенный модуль dataclasses . Этот модуль использует декоратор @dataclass и несколько вспомогательных функций для упрощенного написания пользовательских типов данных.
Посмотрим, на сколько короче можно записать тип данных Book , представленный выше:
from dataclasses import dataclass, field @dataclass class Book(): """Тип данных книга""" title: str = None date: str = None authors: list = field(default_factory=list) price: float = 0 num: int = 0 total: float = field(init=False) def __post_init__(self): # инициализация переменной `total` self.total = self.price * self.num
И это все! Коротко? На самом деле, модуль класса данных dataclasses автоматически добавит сгенерированные специальные методы __init__() и __repr__() . Этот модуль дает очень много дополнительных возможностей и полезных фич при создании собственных типов данных, а вызов функции dataclasses.field() для определенного поля, поможет его кастомизировать под свои нужды. При создании своих типов данных, обязательно используете этот модуль, т.к. он защитит вас от многих распространенных ошибок (например объявления изменчивых типов данных по умолчанию).
Примечание. модуль dataclasses не проверяет, указанный в аннотации тип переменной!
Вернемся к пользовательским типам. И так, объявленный тип содержит шесть переменных:
- title — название книги,
- date — дата выхода книги,
- authors — авторы книги.
- price — стоимость одной книги,
- num — количество книг в магазине,
- total — общая стоимость книг.
Эти переменные называются полями типа данных. Код класса Book — это простое объявление типа. Чтобы использовать тип данных Book() , необходимо просто создать его экземпляр:
>>> book = Book()
Инициализация пользовательского типа данных.
Инициализация пользовательского типа путем присваивания значений каждому члену по порядку — занятие неблагодарное и довольно громоздкое (особенно, если много полей), поэтому легче инициализировать тип сразу, при создании экземпляра класса данных. Это позволяет инициализировать некоторые или сразу все поля объявленного типа:
# создаем отдельную переменную типа Book, например для книги gold_key >>> gold_key = Book('Золотой ключик', '1989', ['А. Толстой'], 512, 7) >>> gold_key # Book(title='Золотой ключик', date='1989', authors=['А. Толстой'], # price=512, num=7, total=3584) # создаем отдельную переменную типа Book для day_watch >>> day_watch = Book('Дневной Дозор', '2006', ['В. Васильев', 'С. Лукьяненко'], 1024, 9) >>> day_watch # Book(title='Дневной Дозор', date='2006', authors=['В. Васильев', 'С. Лукьяненко'], # price=1024, num=9, total=9216)
Доступ к полям объекта пользовательского класса данных.
Для того, чтобы получить доступ к отдельным полям типа данных, используется точечная нотация. Например, в коде, приведенном ниже, используется точка для выбора значения каждого поля пользовательского типа данных:
>>> gold_key.title # 'Золотой ключик' >>> gold_key.price # 512 >>> gold_key.authors # ['А. Толстой'] >>> day_watch.title # 'Дневной Дозор' >>> day_watch.date # '2006' >>> day_watch.authors[0] # 'В. Васильев' >>> day_watch.authors # ['В. Васильев', 'С. Лукьяненко']
В этом примере, легко определить, какая переменная относится к типу gold_key , а какая к day_watch . Это обеспечивает гораздо более высокий уровень организации, чем в случае с обычными отдельными переменными.
Переменные — поля типа данных работают так же, как и простые переменные, поэтому с ними можно выполнять обычные операции доступные типу данных, к которому они относятся:
# присвоение новых значений >>> gold_key.title = 'Современный золотой ключик' >>> gold_key.title # 'Современный золотой ключик' >>> gold_key.authors.append('Неизвестный соавтор') >>> gold_key.authors # ['А. Толстой', 'Неизвестный соавтор'] >>> gold_key.date = 2021 >>> gold_key # Book(title='Золотой ключик', date=2021, authors=['А. Толстой', 'Неизвестный соавтор'], # price=512, num=7, total=3584) # операции сравнения отдельных полей >>> gold_key.total day_watch.total # True
Модуль класса данных dataclasses добавляет возможность сравнения самих типов данных с использованием хэша на основе их местоположения в памяти, как два обычных объекта.
Пользовательские типы данных и функции.
Большим преимуществом использования пользовательских типов данных является возможность передать сразу весь тип в функцию, а не по одной переменной:
from dataclasses import dataclass, field @dataclass class Book(): """Тип данных книга""" title: str = None date: str = None authors: list = field(default_factory=list) price: float = 0 num: int = 0 total: float = field(init=False) def __post_init__(self): # инициализация переменной `total` self.total = self.price * self.num def print_state_book(book): """Печать сведений о книге""" print(f'Название: book.title>') print('Авторы:') for author in book.authors: print(' '*2, author) print(f'Стоимость книги: book.price:0.2f>') print(f'Количество: book.num>') print(f'Итого: book.total:0.2f>') >>> gold_key = Book('Золотой ключик', '1989', ['А. Толстой'], 512, 7) >>> day_watch = Book('Дневной Дозор', '2006', ['В. Васильев', 'С. Лукьяненко'], 1024, 9) >>> print_state_book(gold_key) # Название: Золотой ключик # Авторы: # А. Толстой # Стоимость книги: 512.00 # Количество: 7 # Итого: 3584.00 >>> print_state_book(day_watch) # Название: Дневной Дозор # Авторы: # В. Васильев # С. Лукьяненко # Стоимость книги: 1024.00 # Количество: 9 # Итого: 9216.00
Вложенные пользовательские типы данных.
Одни пользовательские типы данных могут создаваться на основе других. Такое поведение хорошо прослеживается на примере с точкой на плоскости и координатами прямоугольника.
from dataclasses import dataclass, field @dataclass class Point: """Точка на плоскости""" x: int = 0 y: int = 0 @dataclass class Rect: """Прямоугольник на плоскости""" top_left: Point = field(default=Point) bottom_right: Point = field(default=Point) # создаем точки на плоскости >>> point1 = Point(10, 20) >>> point2 = Point(30, 55) # чертим прямоугольник >>> rect = Rect(point1, point2) >>> rect Rect(top_left=Point(x=10, y=20), bottom_right=Point(x=30, y=55))
Пользовательские типы данных, так же можно наследовать. Например из точки на плоскости можно создать точку в пространстве, а потом нарисовать прямоугольный параллелепипед.
Примечание: мы не сильны в стереометрии и возможно нужны дополнительные данные для типа RectBox . Этот класс создан чисто в учебных целях, что бы в совокупности проследить наследование пользовательских типов, а также создание одного типа на основе другого.
from dataclasses import dataclass, field @dataclass class Point: """Точка на плоскости""" x: int = 0 y: int = 0 # наследуемся от пользовательского типа `Point` @dataclass class SpacePoint(Point): """Точка в пространстве""" z: int = 0 # создаем тип `RectBox` на # основе типа `SpacePoint` @dataclass class RectBox: """Прямоугольный параллелепипед""" front_top_left: SpacePoint = field(default=SpacePoint) back_bottom_right: SpacePoint = field(default=SpacePoint) # создаем точки в пространстве >>> space_point1 = SpacePoint(10, 20, 10) >>> space_point2 = SpacePoint(30, 55, 80) # рисуем прямоугольный параллелепипед >>> rect_box = RectBox(space_point1, space_point2) >>> rect_box # RectBox(front_top_left=SpacePoint(x=10, y=20, z=10), # back_bottom_right=SpacePoint(x=30, y=55, z=80)) # изменим одну координату >>> rect_box.front_top_left.y = 10 >>> rect_box # RectBox(front_top_left=SpacePoint(x=10, y=10, z=10), # back_bottom_right=SpacePoint(x=30, y=55, z=80))
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Пространство имен и область видимости в классах
- Определение классов
- Объект класса и конструктор класса
- Создание экземпляра класса
- Метод экземпляра класса
- Что такое метод класса и зачем нужен
- Что такое статический метод в классах Python и зачем нужен
- Атрибуты класса и переменные экземпляра класса
- Кэширование методов экземпляра декоратором lru_cache
- Закрытые/приватные методы и переменные класса Python
- Наследование классов
- Множественное наследование классов
- Абстрактные классы
- Перегрузка методов в классе Python
- Что такое миксины и как их использовать
- Класс Python как структура данных, подобная языку C
- Создание пользовательских типов данных
- Специальные (магические) методы класса Python
- Базовая настройка классов Python магическими методами
- Настройка доступа к атрибутам класса Python
- Дескриптор класса для чайников
- Протокол дескриптора класса
- Практический пример дескриптора
- Использование метода .__new__() в классах Python
- Специальный атрибут __slots__ класса Python
- Специальный метод __init_subclass__ класса Python
- Определение метаклассов metaclass
- Эмуляция контейнерных типов в классах Python
- Другие специальные методы класса
- Как Python ищет специальные методы в классах
- Шаблон проектирования Фабрика и его реализация
Как в Python 3 можно создать тип запись?
Имеется в виду аналог типа record в Паскале (последовательность переменных указанного при создании типа, связанных одним общим именем)? Общий вид описания типа record в Паскаль:
var = record :; :; . end;
Пример использования в коде:
var coord = record x: integer; y: integer; end; begin coord.x:= 5; end.
Отслеживать
ViktoroUrso
задан 6 фев 2019 в 9:24
ViktoroUrso ViktoroUrso
35 9 9 бронзовых знаков
Не все, кто знаком с питоном, знакомы и с тонкостями паскаля, как и наоброт, поэтому покажите пример того, чего хочется.
6 фев 2019 в 9:31
В Python для этого используются классы.
6 фев 2019 в 9:32
Автор хочет, чтобы можно было использовать Point.X и Point.Y , а не Point[0]` и Point[1]
6 фев 2019 в 9:43
Общий вид описания типа record в Паскаль: var <имя_записи>= record :; :; . end; То есть правильно я понимаю, что в Python нельзя сделать сборку нескольких переменных разных типов, к которым можно обращаться через одно имя (переменную-запись) с уточнением конкретного поля, кроме как объявить класс? По другому точно никак?имя_записи>
26 фев 2019 в 13:40
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Ответ нашёл сам, опираясь на подсказку @insolor (спасибо ему). Eсли кому-то будет интересно, то создать в Python аналогичную структуру данных можно используя модуль collections , а именно класс collections.namedtuple .
Этот класс позволяет создать тип данных, ведущий себя как кортеж, с тем дополнением, что каждому элементу присваивается имя, по которому можно в дальнейшем получать доступ:
>>> Point = namedtuple('Point', ['x', 'y']) >>> p = Point(x=1, y=2) >>> p.x >>> 1