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

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

На схеме выше изображена иерархия только части стандартных типов данных. В Python их больше, например, неизменяемые множества (frozenset) или неизменяемые последовательности отдельных байтов (bytes). 

Давайте немного разберем указанные типы. 

  1. Целое число (int)

Целые числа могут быть представлены в Python с использованием десятичных, двоичных, шестнадцатеричных или восьмеричных систем счисления. Почти всегда используются привычные десятичные. Они состоят из десяти цифр: 0123456789. Десятичное (ненулевое) число не может начинаться с нуля. При этом запись в двоичной системе в Python начинается как раз у нуля, и именно так интерпретатор языка понимает, что здесь используется двоичная система. 

  1. Числа с плавающей запятой (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Е степень выражена не числом.

  1. Комплексные числа (complex)

Python предлагает сложный тип данных для вычислений с комплексными числами. Комплексное число записывается как выражение вида:

a + bj или a + bJ, где a и b — целые числа (int) или числа с плавающей запятой (float). После мнимой части b следует маленькая буква j или большая J, обозначающая мнимую единицу i (обычно в электротехнике буква j используется вместо i). 

  1. Строки (str)

Строки — это последовательность символов из алфавита. Строка начинается и заканчивается одинарными или двойными кавычками.

Примеры:  'Python' или "Python".

  1. Кортежи (tuple)

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

Пример записи имени человека и года рождения (2, "разных типов данных"):

человек = ('Анна', 2001)

  1. Список (list)

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

Пример: simple_numbers = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

  1. Множества (set)

Множества — это неупорядоченные коллекции без повторений. То есть элементы одного множества не имеют определенного порядка, и каждый элемент встречается только один раз. В Python множества представлены типом set. Вы создаете объект этого типа, перечисляя элементы в фигурных скобках: {1, 2, 3}

  1. Словарь (dict)

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

Пример: >>> d = {'sun':'Sonne', 'moon':'Mond', 'star':'Stern'}

Между двумя компонентами пары стоит двоеточие. Выражение перед двоеточием называется ключом, а после него — значением. Ключ обеспечивает доступ к значению. Вы пишете ключ в квадратных скобках после названия словаря. 

Пример:

>>> d['moon']

'Mond'

  1. Логические значения — тип данных bool

Два значения «истина» и «ложь» представлены литералами True и False. Обратите внимание на орфографию! И True, и False начинаются с заглавных букв. Особенностью Python является то, что все объекты имеют истинностное значение: Пустые наборы, например, пустая строка '' или пустой список [] и числа со значением ноль имеют значение False. Непустые наборы и все ненулевые числа имеют значение True. Вы можете получить логическое значение объекта, набрав bool():

>>> bool(123)

>>> True

>>> bool(0)

>>> False

  1. NoneType

Для типа данных NoneType существует только один литерал, а именно пустой объект None. Звучит несколько парадоксально: объект None ничего не означает. Тем не менее, его можно присвоить переменной и вывести с помощью print(). Объект None крайне редко используется непосредственно при программировании, но часто встречается в сообщениях об ошибке.

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

bombora.ru
bombora.ru

Комментарии (31)


  1. sunsexsurf
    28.01.2025 17:01

    На картинке “dictionsry”. Вы б хоть хотя бы такую элементарищину вычитывали бы… «статья» - хлам, конечно. Если уж вы про базовые вещи, то хотя бы про память бы чтоль рассказали, как оно там внутри все хранится и для чего нужны словари, и когда кортежи лучше списков (и наоборот).


    1. bombora_IT Автор
      28.01.2025 17:01

      Благодарим за ваши комментарии! Про опечатку передадим редактору, про память расскажем в новых статьях.


    1. leshabirukov
      28.01.2025 17:01

      О, а я в надписи "изображение (dictionsry)" возмутился на "изображение" (в данном случае projection - "отображение") а `s` не заметил.


    1. TyVik
      28.01.2025 17:01

      Годы идут, но ничего не меняется


  1. CrazyElf
    28.01.2025 17:01

    Термин "последовательности" слишком математический. С точки зрения программирования привычнее было бы говорить о "массивах", наверное.


    1. fireSparrow
      28.01.2025 17:01

      Ну, во встроенном модуле typing обобщённый тип для них называется Sequence, что означает именно "последовательность", как в математическом, так и в повседневном смысле.

      привычнее было бы говорить о "массивах"

      "Привычнее" - понятие субъективное, но в целом термин "последовательность" в программировании вполне устоявшийся.

      Кроме того, "массив" в питоне - это отдельный тип данных.


      1. CrazyElf
        28.01.2025 17:01

        Ну, насчёт массивов в Питоне (и не только в нём) - там прям по той формуле "you need to go deeper". На разных слоях вещи выглядят по-разному. На верхнем уровне их как будто и нет встроенных, но если начать копаться, то тот же список - это на самом то деле динамический массив. Это и в Питоне так и, например, в C# так же сделано.


  1. CBET_TbMbI
    28.01.2025 17:01

    Мда... Даже про лимиты числовых данных ничего не сказано.

    В отличие от строк и кортежей, список можно изменить.

    Вот прочитает новичок и подумает, что строки нельзя менять. Один раз присвоил им значения и всё - до конца работы программы не изменить. Тоже самое подумает про числа, после первой картинки.


    1. zzzzzzerg
      28.01.2025 17:01

      Но ведь нельзя же строки менять.


      1. CBET_TbMbI
        28.01.2025 17:01

        А чем переназначение от смены отличается?


        1. 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'

          В первом случае изменяется переменная, во втором случае каждый раз создается новая.


          1. CrazyElf
            28.01.2025 17:01

            А вот и нет. Я сам в своё время был в шоке, но операция += для строк в питоне оптимизирована. Место под строку видимо выделяется с запасом, примерно как под список. И если посмотреть через dis, то для += используется операция INPLACE_ADD вместо BINARY_ADD для обычного сложения. Добавление в строку всего в 2 раза медленнее, чем добавление в байтовый массив. Но если заменить += на реальное сложение строк с промежуточной записью в другую переменную, то работать такая функция будет уже в 500 раз медленнее. Замена на s = s + 's', кстати, не помогает - всё-равно работает быстро. Питон понимает, что его хотят обмануть и всё-равно на каком-то этапе меняет этот код на s += 's'.


            1. zzzzzzerg
              28.01.2025 17:01

              s = 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 меняется не на каждой итерации, видать каждый раз когда выполняется новая аллокация.


              1. CrazyElf
                28.01.2025 17:01

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


                1. zzzzzzerg
                  28.01.2025 17:01

                  Я то с вами не спорю :)


                  1. CrazyElf
                    28.01.2025 17:01

                    А, сорри, с утра не прочитал нормально )) Я сам увидел, что id меняется, но не смотрел всегда или не всегда, надо ещё покопаться )


              1. 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