Продолжим наш экскурс для начинающих в основы и особенности либертарианского языка программирования, самого, пожалуй, популярного и востребованного среди тех, кто сегодня пытается войти в… да вы и сами знаете какая тут должна быть рифма.
Сегодня поговорим про типы данных в Python и их иерархию. В иерархии типов упорядочение отражается в том, что существуют общие операции для типов, принадлежащих к типу более высокого уровня.
На схеме выше изображена иерархия только части стандартных типов данных. В Python их больше, например, неизменяемые множества (frozenset) или неизменяемые последовательности отдельных байтов (bytes).
Давайте немного разберем указанные типы.
Целое число (int)
Целые числа могут быть представлены в Python с использованием десятичных, двоичных, шестнадцатеричных или восьмеричных систем счисления. Почти всегда используются привычные десятичные. Они состоят из десяти цифр: 0123456789. Десятичное (ненулевое) число не может начинаться с нуля. При этом запись в двоичной системе в Python начинается как раз у нуля, и именно так интерпретатор языка понимает, что здесь используется двоичная система.
Числа с плавающей запятой (float)
Число с плавающей запятой может быть представлено в виде десятичной дроби или в экспоненциальной записи. Десятичная дробь состоит из последовательности цифр с точкой, например: 3.14, или 0.45, или 0.23, или 2.0 (но не просто 2).
Литерал float в экспоненциальной записи состоит из числа, за которым следует буква e или E, знака (+ или -), который также может быть опущен для положительных показателей степени, и, наконец, целого числа в качестве Степени.
Допустимые литералы:
1.0е-3 соответствует числу 1 * 10–3 или 0.001.
2.1Е+2 соответствует числу 2,1 * 102 или 210.
Недопустимо:
0.1-Е7 знак минус перед Е.
1.2е0.3 степень выражена нецелым числом.
1Е степень выражена не числом.
Комплексные числа (complex)
Python предлагает сложный тип данных для вычислений с комплексными числами. Комплексное число записывается как выражение вида:
a + bj или a + bJ, где a и b — целые числа (int) или числа с плавающей запятой (float). После мнимой части b следует маленькая буква j или большая J, обозначающая мнимую единицу i (обычно в электротехнике буква j используется вместо i).
Строки (str)
Строки — это последовательность символов из алфавита. Строка начинается и заканчивается одинарными или двойными кавычками.
Примеры: 'Python' или "Python".
Кортежи (tuple)
Несколько объектов одного или разных типов объединяются в кортеж. Литерал кортежа начинается и заканчивается круглыми скобками, а разные элементы в скобках разделены запятой.
Пример записи имени человека и года рождения (2, "разных типов данных"):
человек = ('Анна', 2001)
Список (list)
Список — это изменяемая последовательность объектов любого типа. Литерал списка начинается и заканчивается квадратными скобками. Элементы в нем перечислены через запятую. В отличие от строк и кортежей, список можно изменить.
Пример: simple_numbers = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
Множества (set)
Множества — это неупорядоченные коллекции без повторений. То есть элементы одного множества не имеют определенного порядка, и каждый элемент встречается только один раз. В Python множества представлены типом set. Вы создаете объект этого типа, перечисляя элементы в фигурных скобках: {1, 2, 3}
Словарь (dict)
Словарь состоит из пар вида ключ: значение, заключенных в две фигурные скобки и разделенных запятыми.
Пример: >>> d = {'sun':'Sonne', 'moon':'Mond', 'star':'Stern'}
Между двумя компонентами пары стоит двоеточие. Выражение перед двоеточием называется ключом, а после него — значением. Ключ обеспечивает доступ к значению. Вы пишете ключ в квадратных скобках после названия словаря.
Пример:
>>> d['moon']
'Mond'
Логические значения — тип данных bool
Два значения «истина» и «ложь» представлены литералами True и False. Обратите внимание на орфографию! И True, и False начинаются с заглавных букв. Особенностью Python является то, что все объекты имеют истинностное значение: Пустые наборы, например, пустая строка '' или пустой список [] и числа со значением ноль имеют значение False. Непустые наборы и все ненулевые числа имеют значение True. Вы можете получить логическое значение объекта, набрав bool():
>>> bool(123)
>>> True
>>> bool(0)
>>> False
NoneType
Для типа данных NoneType существует только один литерал, а именно пустой объект None. Звучит несколько парадоксально: объект None ничего не означает. Тем не менее, его можно присвоить переменной и вывести с помощью print(). Объект None крайне редко используется непосредственно при программировании, но часто встречается в сообщениях об ошибке.
Информация взята из начальных глав книги Михаэля Вайгенда «Python для учебы и работы. Как освоить самый мощный язык программирования для будущей карьеры», которая отлично подходит для каждого желающего начать изучения Python.
Комментарии (31)
CrazyElf
28.01.2025 17:01Термин "последовательности" слишком математический. С точки зрения программирования привычнее было бы говорить о "массивах", наверное.
fireSparrow
28.01.2025 17:01Ну, во встроенном модуле typing обобщённый тип для них называется Sequence, что означает именно "последовательность", как в математическом, так и в повседневном смысле.
привычнее было бы говорить о "массивах"
"Привычнее" - понятие субъективное, но в целом термин "последовательность" в программировании вполне устоявшийся.
Кроме того, "массив" в питоне - это отдельный тип данных.
CrazyElf
28.01.2025 17:01Ну, насчёт массивов в Питоне (и не только в нём) - там прям по той формуле "you need to go deeper". На разных слоях вещи выглядят по-разному. На верхнем уровне их как будто и нет встроенных, но если начать копаться, то тот же список - это на самом то деле динамический массив. Это и в Питоне так и, например, в C# так же сделано.
CBET_TbMbI
28.01.2025 17:01Мда... Даже про лимиты числовых данных ничего не сказано.
В отличие от строк и кортежей, список можно изменить.
Вот прочитает новичок и подумает, что строки нельзя менять. Один раз присвоил им значения и всё - до конца работы программы не изменить. Тоже самое подумает про числа, после первой картинки.
zzzzzzerg
28.01.2025 17:01Но ведь нельзя же строки менять.
CBET_TbMbI
28.01.2025 17:01А чем переназначение от смены отличается?
omaxx
28.01.2025 17:01Сравните время исполнения:
b = bytearray() for i in range(1_000_000): b += b'b' s = str() for i in range(1_000_000): s += 's'
В первом случае изменяется переменная, во втором случае каждый раз создается новая.
CrazyElf
28.01.2025 17:01А вот и нет. Я сам в своё время был в шоке, но операция
+=
для строк в питоне оптимизирована. Место под строку видимо выделяется с запасом, примерно как под список. И если посмотреть черезdis
, то для+=
используется операцияINPLACE_ADD
вместоBINARY_ADD
для обычного сложения. Добавление в строку всего в 2 раза медленнее, чем добавление в байтовый массив. Но если заменить+=
на реальное сложение строк с промежуточной записью в другую переменную, то работать такая функция будет уже в 500 раз медленнее. Замена на s = s + 's', кстати, не помогает - всё-равно работает быстро. Питон понимает, что его хотят обмануть и всё-равно на каком-то этапе меняет этот код на s += 's'.zzzzzzerg
28.01.2025 17:01s = str() id_s = id(s) prev_i = 0 for i in range(1_000_000): s += 's' if id_s != id(s): print (i, i - prev_i, id_s, id(s)) prev_i = i id_s = id(s)
Можно увидеть что id меняется не на каждой итерации, видать каждый раз когда выполняется новая аллокация.
CrazyElf
28.01.2025 17:01Да, id меняется, но сама операция выполняется быстро, вы замерьте время. Я предполагаю, что питоновский объект меняется, но сама строка в памяти лежит на том же месте и не копируется, а дописывается.
omaxx
28.01.2025 17:01Запустил:
0 0 4382700472 4382744632
1 1 4382744632 4370906112
2 1 4370906112 4370906256
3 1 4370906256 4370906352
4 1 4370906352 4370906448
5 1 4370906448 4370906544
6 1 4370906544 4370906640
7 1 4370906640 4371180656
8 1 4371180656 4371180464
9 1 4371180464 4371180336Каждая итерация новый id.
Python 3.13.1
sunsexsurf
На картинке “dictionsry”. Вы б хоть хотя бы такую элементарищину вычитывали бы… «статья» - хлам, конечно. Если уж вы про базовые вещи, то хотя бы про память бы чтоль рассказали, как оно там внутри все хранится и для чего нужны словари, и когда кортежи лучше списков (и наоборот).
bombora_IT Автор
Благодарим за ваши комментарии! Про опечатку передадим редактору, про память расскажем в новых статьях.
leshabirukov
О, а я в надписи "изображение (dictionsry)" возмутился на "изображение" (в данном случае projection - "отображение") а `s` не заметил.
TyVik
Годы идут, но ничего не меняется