Изменяемые и неизменяемый типы объектов#
Программисту C/C++ может показаться, что во второй строке увеличивается на 1 значение, хранящееся в созданном на первой строке целочисленном объекте. На самом деле это не так: создаётся новый объект, хранящий результат вычисления выражения a + 1 , а затем имя a связывается с этим новым объектом. Чтобы продемонстрировать это, напечатаем идентификатор объекта до и после увеличения на 1.
Видим, что идентификатор меняет свое значение, а значит имя a ссылается на разные объекты до и после инструкции a += 1 .
В python все типы объектов можно разделить на два вида: изменяемые ( mutable ) и неизменяемые ( immutable ).
Значение, хранящееся в объекте неизменяемого типа, невозможно изменить никакими способами. Единственный способ получить объект такого типа с другим значением — создать новый объект с нужным значением.
Значение, хранящееся в объекте изменяемого типа, можно изменить не создавая новый объект. Изменения объекта возможно за счет вызова его методов или применения к нему операторов.
Все встроенные числовые типы ( bool , int , float , complex , ( decimal , fractions , которые также присутствуют в стандартной библиотеке, но обсуждаться здесь не будут)) являются неизменяемыми. Единственный изменяемый тип объектов, с которым мы уже сталкивались — list . Продемонстрируем его изменяемость.
Оператор “ += ” определен и для списков, только с другим эффектом: он расширяет список слева от него, элементами итерируемого объекта справа.
Изменяемые и неизменяемые объекты в Python
Все в Python – это объект. Каждый новичок должен сразу усвоить, что все объекты в Python могут быть либо изменяемыми (мутабельным), либо неизменяемыми (иммутабельным).

Давайте углубимся в детали. Поскольку все в Python является объектом, то каждая переменная является экземпляром какого-то класса (объектом). Когда объект инстанцируется, ему присваивается уникальный id. Тип объекта определяется во время выполнения и после этого не меняется, однако состояние может меняться, если оно изменяемое. Проще говоря, изменяемый объект можно изменить после его создания, а неизменяемый – нет.
Объекты встроенных типов, таких как int, float, bool, str, tuple, unicode, являются неизменяемыми. Объекты встроенных типов, таких как list, set, dict, являются изменяемыми. Самописные классы, как правило, изменяемые. Если есть потребность сымитировать неизменяемость, нужно переопределить методы установки и удаления атрибутов класса так, чтобы они вызывали исключения.

Возникает вопрос, как узнать, что наша переменная изменяемый или неизменяемый объект. Для этого нам нужно понять, зачем нужны функции id и type.
Id() и type()
Встроенная функция id() возвращается id объекта в виде целого числа. Число обычно коррелирует с местоположением объекта в памяти, но не всегда, поскольку все зависит от реализации Python и используемой платформы. Оператор is сравнивает id двух объектов.
Встроенная функция type() возвращает тип объекта. Давайте обратимся к примеру.
Теперь мы знаем, как сравнить две простые строковые переменные, чтобы определить их тип и id. С помощью этих двух функций мы можем узнать типы объектов связанных с переменными и их изменяемость/неизменяемость.
Изменяемые и неизменяемые объекты
Итак, как мы выяснили, изменяемый объект может изменять свое состояние или содержимое, а неизменяемый – нет.
Изменяемые объекты:
list, dict, set, byte array
Неизменяемые объекты:
int, float, complex, string, tuple, frozenset (неизменяемая версия set), bytes
Пример определения изменяемости объекта:
Мы создаем объект типа int. Id x и y указывают на один и тот же объект:
А теперь просто прибавим единицу:
Объект переменной x изменился. Объект 10 не может изменяться. Неизменяемые объекты не допускают изменений после создания.
А если объект изменяемый:
Мы создаем объект типа list. Id переменных m и n привязаны к одному списку, в котором лежит коллекция из трех неизменяемых объектов типа int.
Удаление элемента из объекта списка изменяет сам объект:
Но id объекта не изменяется
Переменные m и n будут указывать на один и тот же объект списка после изменения. В объекте списка теперь лежит [1,2].
Итак, что же мы поняли из примеров выше?
Python обрабатывает изменяемые и неизменяемые объекты по-разному.
Доступ к неизменяемым объектам осуществляется быстрее, чем к изменяемым.
Изменяемые объекты отлично подойдут, если вам нужно менять размер объектов, например, list, dict и т.д.
Неизменяемые значения используются, когда вам нужно убедиться, что созданный вами объект никогда не будет меняться.
Неизменяемые объект принципиально дорого менять, поскольку для этого требуется создать копию, а изменяемые менять легко.
Исключения в неизменяемости
Не все неизменяемые объекты на самом деле являются неизменяемыми. Запутались? Позвольте мне объяснить.
Как мы говорили ранее, такие коллекции в Python, как кортежи, неизменяемы. То есть значение кортежа нельзя менять после его создания. Но значение кортежа на самом деле – это последовательность имен с неизменяемыми привязками к объектам. Главное, что нужно понимать, так это то, что сами «привязки» менять нельзя, а вот объекты на их концах – можно.
Рассмотрим кортеж t = (‘holberton’, [1, 2, 3])
Он содержит элементы разных типов данных, первый из которых – неизменяемая строка, а второй – изменяемый список. Сам со себе кортеж неизменяемый, то есть для него нет методов изменения содержимого. Строка также неизменяемая по той же причине. Но у списка есть такие методы, поэтому его можно изменить. Здесь тонкий момент, но не менее важный: «значение» неизменяемого объекта не может измениться, а вот его элементы могут.
Как объекты передаются в функции
Для нас важно знать разницу между изменяемыми и неизменяемыми типами, чтобы понимать, как они обрабатываются при передаче в функции. Эффективность использования памяти сильно зависит от выбора соответствующих объектов.
Например, если изменяемый объект вызывается по ссылке в функции, он может изменить исходную переменную. Следовательно, чтобы избежать этого, исходную переменную надо скопировать в другую переменную. Неизменяемые объекты можно передавать по ссылке, потому что их значение в любом случае не может меняться.
Как видно из примера выше, мы получили доступ к списку по ссылке, поэтому смогли изменить исходный список.
Давайте посмотрим на другой пример:
В примере выше в функцию передается один и тот же объект, но значение переменных не меняется даже если их id одинаковые. Так работает передача по значению. Что же здесь происходит? Когда функция вызывает значение, передается только значение переменной, а не сам объект. Таким образом, переменная, ссылающаяся на объект, не изменяется, а сам объект изменяется, но только в пределах области видимости функции. Следовательно, изменение не видно «снаружи».
В завершение приглашаем всех на бесплатный урок, где поговорим про организацию рабочего места:
что такое IDE и какие IDE существуют;
как настроить самую полнофункциональную IDE для Python — PyCharm Community Edition;
версии Python, почему их так много;
как разрабатывать несколько проектов на одной машине (что нужно учитывать, зачем нужны виртуальные среды (venv) для проектов) и что это такое;
как запустить приложение в Docker-контейнере (зачем это делать, как это можно сделать, что нужно учесть).
В результате вы сможете организовать изолированную среду для разработки и запуска приложения с помощью venv и docker, узнаете почему существуют различные версии Python, и как организовать свое рабочее место, чтобы разрабатывать несколько различных проектов, использующих разные версии Python и сторонних пакетов, одновременно, и без боли.
Типы данных в Python для начинающих: какие бывают и как с ними работать
Готовимся к собеседованию на должность Python-разработчика. Знакомимся с системой типов в Python, встроенными типами данных и правилами работы с ними.


Иллюстрация: Оля Ежак для Skillbox Media

Python — объектно-ориентированный язык программирования, его основу составляют объекты и классы. Объект — это область памяти компьютера, которая описывается типом (он же класс) и значением. При этом от типа зависит область значений объекта, операции и методы, которые к нему можно применять.
Python предоставляет богатый набор встроенных типов данных. Поэтому при решении стандартных задач питонист реже пишет собственные классы, чем, например, разработчик на Java.
Из этой статьи вы узнаете:
Что такое строгая динамическая типизация
Python — язык программирования со строгой динамической типизацией.
«Строгая» означает, что язык не производит неявные преобразования типов и не создаёт сюрпризов при их случайном смешении.
Чтобы понять, о чём идёт речь, запустите этот код на Python и JavaScript, а затем сравните результаты:
JavaScript любезно выдаст строку ’11’, а Python выругается такой фразой:
TypeError: unsupported operand type (s) for +: ‘int’ and ‘str’
Можно подумать, что JavaScript лучше, чем Python, — ведь он даёт больше свободы разработчикам. Но не всё так однозначно: в больших скриптах, на 3–5 тысяч строк, такая свобода может сыграть злую шутку. Например, если банковская программа вместо 100 + 100 = 200 долларов спишет со счёта 100100 🙂
К счастью, в Python такой трюк не пройдёт. Строгий интерпретатор забьёт тревогу и не позволит разработчику смешать типы.
«Динамическая» означает, что типы объектов определяются в процессе исполнения программы (runtime). Поэтому питонисты могут не указывать типы переменных. Переменные в Python — это всего лишь указатели на объекты, они не содержат информации о типе.
Вы можете создавать и изменять переменные в любой момент, главное — присвойте значение:
А вот в языках со статической типизацией, таких как C++, C# и Java, типы объектов определяются ещё на этапе компиляции. Поэтому при попытке запустить такой код, например, в C++ компилятор выдаст ошибку:
«невозможно преобразовать „const char [20]“ в „int“»
Придётся объявлять новую переменную:
Мы оставим детальное сравнение статической и динамической типизации для другой статьи. На практике и та, и другая имеют свои плюсы и минусы.

Изменяемые и неизменяемые типы данных
Типы данных в Python можно разделить на изменяемые и неизменяемые.
Когда мы присваиваем новое значение неизменяемому объекту, Python не перезаписывает его, а создаёт новый объект с тем же именем. Чтобы в этом убедиться, достаточно проверить id — уникальный номер, который присваивается каждому объекту в Python:
Когда мы прибавляем 5 к переменной int_obj, на её месте создаётся новый объект с тем же именем. Заметьте: при первом выводе id равен 140717895746096, а после выполнения операции сложения — 140717895746256.
А вот идентификатор списка list_obj не меняется, потому что списки в Python — это изменяемые объекты:
К неизменяемым объектам относятся числа, строки и кортежи, а к изменяемым — списки, словари и множества. Это свойство нужно учитывать при передаче объектов в функцию. Например, если вы не хотите, чтобы функция изменила исходный список, передайте в неё копию этого списка.
Теперь рассмотрим встроенные типы данных языка Python.
Какие встроенные типы данных есть в Python
В недрах интерпретатора Python зашито много типов данных. Их можно разделить на три группы:
- Простые — числа и строки.
- Коллекции — списки, кортежи и словари.
- Остальные — файлы, итераторы, сокеты, NaN.
Отдавайте предпочтение встроенным типам. Они упрощают разработку и более эффективны, чем пользовательские классы, потому что представляют собой оптимизированные структуры данных на языке C.
Числа
Программы на Python умеют работать с целыми числами (int), числами с плавающей точкой (float) и комплексными числами (complex). В целом числовые объекты в Python поддерживают те же операции, что и числа в других языках программирования:
Также в стандартной библиотеке Python есть модуль math, который подключается директивой import math, — он содержит широкий набор функций для работы с числовыми данными:
А теперь получим какое-нибудь очень большое число. Например, возведём 27 в 560-ю степень:
Для таких объектов в Python есть специальный тип — long. Но если в том же C++ самый большой тип long long ограничен 64 битами (самое большое положительное число равно 18 446 744 073 709 551 615), то «длинные числа» в Python не ограничены.
Строки
Строки (string) — это последовательности символов, поэтому к ним применимы многие методы других последовательностей: списков и кортежей. Например, обращение к элементу по индексу, вычисление количества символов, конкатенация и получение среза.
Рассмотрим основные операции со строками в Python:
Строки поддерживают работу с отрицательными индексами. Их удобно использовать, когда нужно обратиться к элементу с конца:
Кроме того, у типа string есть ряд методов, уникальных для него:
Списки
Список (list) — это упорядоченная коллекция объектов. Списки могут иметь сколько угодно уровней вложенности и хранить неограниченное количество объектов. Кроме того, в одном списке могут одновременно храниться объекты разных типов.
Над списками можно производить те же операции, что и над строками:
Но у списков есть и специфические методы, которые присущи только им. Например, можно добавить новый элемент в конце списка, удалить i-й элемент или отсортировать список:
Кортежи
Кортежи (tuple) — это те же списки, только неизменяемые. Над ними можно производить те же операции, что и над списками, — кроме тех, которые изменяют кортеж:
При попытке заменить элемент ‘p’ на ‘c’ Python выдаст сообщение об ошибке:
TypeError: ‘tuple’ object does not support item assignment
Вы спросите: зачем нужны кортежи, когда есть списки с более широким набором методов и операций? Как мы уже сказали выше, иногда программистам важно быть уверенными, что функция не изменит значение объекта. Как раз для таких случаев и годятся кортежи.
Словари
Словарь (dict) — это неупорядоченная коллекция пар «ключ — значение». В качестве ключей могут выступать любые неизменяемые объекты (числа, строки и даже кортежи).
Получать доступ к элементам, удалять и создавать новые довольно просто:
В качестве значений словарь может хранить объекты совершенно разных типов — даже другие словари. Глубина вложенности не ограничена.
Так как словари являются отображениями, а не последовательностями, то элементы в них не упорядочены. Это значит, что при выводе элементов в цикле for их порядок не всегда будет совпадать с порядком, заданным при инициализации словаря.
Файлы
Объекты-файлы позволяют работать с файловой системой компьютера. Чтобы создать такой объект, нужно передать функции open имя файла и режим доступа (чтение или запись).
Допустим, вы собрались написать книгу о Python. Тогда нужно создать файловый объект в режиме записи — w write, а затем записывать в него строки текста с помощью метода write ():
А теперь проверим, всё ли сохранилось как надо. Для этого создадим новый объект-файл с помощью той же функции open, но в режиме чтения — r read:
Как вы можете убедиться, все строки, которые мы записали в файл, на месте.
Для закрепления — небольшая шпаргалка по базовым типам в Python:

Что почитать про типы данных в Python
Теперь вы знаете о типах в Python достаточно, чтобы решать простейшие задачи и даже ответить на вопросы на собеседовании. Если хотите узнать о системе типов ещё больше — почитайте классические источники:
- «Изучаем Python 3», Часть II. Типы и операции, М. Лутц;
- «Программирование на Python 3», Глава 2. Типы данных, М. Саммерфилд;
- документацию Python, раздел «Built-in Types».
Больше интересного про код в нашем телеграм-канале. Подписывайтесь!
Читайте также:
Числа, состоящие из действительной и мнимой части. Применяются в теории колебаний, квантовой механике и при обработке сигналов.
На Python пишут веб-приложения и нейросети, проводят научные вычисления и автоматизируют процессы. Язык просто выучить, даже если вы никогда не программировали. На курсе вы создадите Telegram-бота, полноценный магазин и аналог популярной соцсети для портфолио, а Центр карьеры поможет найти работу Python-разработчиком.
Узнать про курс
Профессии с трудоустройством
- Графический дизайнер
- Python-программист
- Инженер по тестированию
- Бизнес-аналитик
- Интернет-маркетолог 2023
Новости
+7 (499) 444-90-36 Отдел заботы о пользователях
Москва, Ленинский проспект, дом 6, строение 20
- Премии Рунета 2018, 2019, 2020
- Все направления
- О Skillbox
- Вебинары
Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies
Введение в типы данных Python
Когда мы имеем дело со значениями в программе, например, присваивая их для хранения переменной или передавая в качестве аргументов функции, нам приходится манипулировать различными типами этих значений ( ) такими, например, как числа или строки. В Python , как и в других языках программирования, имеется как встроенный комплект стандартных типов данных, так и возможность определять собственные пользовательские типы данных. При этом следует помнить про одну важную особенность – все данные в Python представлены в виде объектов, которые представляют собой выделенные области памяти со значениями данного типа и определенными для этих значений наборами операций (см. пример №1 ).
Пример №1. Определение типа и размера данных.
Как видим, Python предоставляет нам довольно обширный стандартный набор операций над строковыми объектами (надеюсь вы не забыли про кнопку «Результат» ). Тоже самое касается и других встроенных типов. Если же программисту вдруг станет тесно, он всегда может разработать собственный тип данных и определить для него необходимый набор операций.
Базовые типы данных Python
Давайте с целью первичного ознакомления перечислим некоторые основные типы данных встроенные в Python .
- Числа – это целые ( -8 , 0 , 47 ), вещественные ( -0.54 или -.54 , 0.0 , 2.475 ) и комплексные числа ( -3+5j , 77+2j ). Все они относятся к неизменяемым типам данных.
- Строки – это текст произвольной длины, взятый в одинарные, двойные или тройные кавычки. Например, ’25 яблок’ , «Ok, Python!» , »’Строка в тройных кавычках так»’ , «»»или так.»»» . Строки также являются неизменяемым типом данных, хотя получить доступ к символу строки можно по его индексу.
- Списки – это упорядоченные неименованные изменяемые коллекции значений (объектов), например, [‘A’, ‘B’, ‘C’] или [2, [True, False], «house»] . Литерал списка задается квадратными скобками, внутри которых через запятую перечисляются значения любых типов данных включая и сами списки. Доступ к значениям списка осуществляется по индексам (об этом чуть позже).
- Кортежи – это упорядоченные неименованные неизменяемые коллекции значений (объектов), например, (‘A’, ‘B’, ‘C’) или (2, «house», True) . Литерал кортежа задается круглыми скобками, внутри которых через запятую перечисляются значения неизменяемых типов данных. Доступ к значениям осуществляется по индексам. Но, т.к. кортежи являются неизменяемыми последовательностями, то добавлять или удалять элементы из них нельзя.
- Словари – это именованные изменяемые неупорядоченные коллекции значений (объектов), например, <'Name': 'Sveta', 'Age': 25>. Литерал словаря задается фигурными скобками, внутри которых через запятую перечисляются пары ключ: значение . В качестве ключей в принципе можно использовать любые неизменяемые уникальные значения, например, числа или строки, а в качестве значений вообще любые типы объектов, включая другие словари. Доступ к значениям в словаре осуществляется по ключам.
- Множества – это неименованные и неупорядоченные изменяемые коллекции уникальных и неизменяемых значений (объектов), например, <'Name', False, 25>. Литерал множества задается фигурными скобками, внутри которых через запятую перечисляются значения неизменяемых типов данных. Сами множества являются изменяемыми коллекциями значений, но вот значения в коллекции должны относиться к неизменяемым типам вроде чисел и строк.
- Логические значения – этот тип данных содержит всего две булевых константы: True и False .
- NoneType – специальное значение None , которое означает отсутствие значения.
Чтобы узнать тип объекта, используемого в программе, можно воспользоваться встроенной функцией type(obj) , которой в качестве аргумента нужно передать интересующий нас объект (см. пример №2 ). Функция является встроенной в интерпретатор Питона , поэтому ее не нужно импортировать и она общедоступна для использования из любой точки программы. Посмотреть весь список встроенных функций можно в справочнике стандартной библиотеки в разделе Built-in Functions .
Пример №2. Литералы встроенных типов данных в исходном коде.
Хотелось бы добавить, что встроенные типы данных можно классифицировать по нескольким признакам: изменяемые (списки, словари, множества) и неизменяемые (числа, строки, кортежи, логические значения, значение None ), а также упорядоченные (строки, списки, кортежи) и неупорядоченные (словари и множества). Эта классификация очень важна для понимания возможностей типов и области их применения. Однако здесь мы в подробности углубляться не будем, оставив более детальное рассмотрение перечисленных типов данных до последующих параграфов нашего учебника.
Динамическая типизация в Python
Как упоминалось ранее, Python относится к языкам программирования с динамической типизацией данных. Давайте рассмотрим это понятие подробнее.
– это прием, при котором переменная связывается с типом в момент присваивания значения, а не в момент объявления переменной.
Это значит, что в Python программисту не нужно объявлять тип переменной в исходном коде. Интерпретатор делает это автоматически во время присвоения переменной нового значения. При этом он самостоятельно контролирует объем памяти, распределяемый под вновь создаваемый объект (см. пример №3 ).
Объем занимаемой любым объектом памяти можно узнать при помощи метода sys.getsizeof(obj) модуля sys стандартной библиотеки, который возвращает размер объекта в байтах. В качестве аргумента методу необходимо передать интересующий нас объект.
Проверить объект на принадлежность к типу можно при помощи встроенной функции isinstance(obj, type) , которой в качестве аргументов нужно передать проверяемый объект, а также имя типа. Если имя типа объекта совпадает с типом объекта, то функция вернет True , иначе – False .
Пример №3. Динамическая типизация в действии.
Как видим, интерпретатор все сделал за нас. Однако при этом не стоит забывать, что мы сами должны следить за тем, чтобы в выражениях использовались значения допустимых типов (см. пример №4 ). Например, если в текущем фрагменте кода мы делим переменные, следует самим следить за тем, чтобы в обоих на момент выполнения операции хранились числа, иначе может возникнуть ошибка.
Пример №4. Неправильное использование значений различных типов.
Хорошо, а где интерпретатор хранит тип значения? Все очень просто. Как мы уже говорили, в Python все состоит из объектов. Переменные как таковые типа не имеют. Когда в коде программы мы присваиваем переменной значение, интерпретатор создает для значения объект, в котором хранятся как тип значения, так и набор допустимых для данного типа операций. Самой же переменной присваивается только ссылка на этот объект. Таким образом в Python переменные не хранят сами значения, а только ссылаются на объекты присваиваемых им значений. Когда же мы присваиваем переменной другое значение, ей присваивается новая ссылка, указывающая на объект нового значения. А прежний объект, если он больше не используется в программе, просто удаляется, т.е. задействуется механизм автоматической сборки мусора .
О приведении типов в Python
Довольно часто в программе требуется преобразовать значение одного типа данных в другой. Например, когда пользователь вводит данные для вычислений в строковом виде, перед вычислениями возникает необходимость преобразования строки в число (см. пример №5 ). Если этого не сделать, то мы получим либо ошибку (как в предыдущем примере), либо совсем неожиданный результат.
Для передачи в программу данных, вводимых пользователем с клавиатуры, используется встроенная функция input() , которая останавливает текущий поток программы до тех пор, пока пользователь не введет все данные и не нажмет Enter . При этом функции можно передавать в качестве аргумента строку с сообщением, которое будет выведено пользователю на экран. Таким сообщением обычно бывает подсказка о типе вводимых данных или призыв к какому-то действию.
Пример №5. Приведение типов в Python (часть 1).
В примере выше для преобразования строки в число мы использовали встроенную функцию float() . Кроме того, для преобразования различных типов данных между собой всегда доступны и другие встроенные функции (конструкторы типов): bool() , int() , complex() , str() , tuple() , list() , dict() или set() (см. пример №6 ). О каждой из них мы поговорим подробнее, когда будем рассматривать вопрос приведения типов в конце этой главы.
Пример №6. Приведение типов в Python (часть 2).
Как можно было убедиться на примере, во избежание ошибок в процессе преобразования типов нужно следить за возможностью такого преобразования. В общем случае, например, один тип числа легко преобразуется в другие числа, итерируемые объекты – в другие итерируемые объекты, а в логический тип можно преобразовать вообще все что угодно.
Получение помощи по объектам Python
Ранее мы уже отмечали, что в языке Python повсюду присутствуют объекты, которые представляют собой данные и наборы операций (методы) для обработки этих данных. Методы и данные, кстати, называют атрибутами объекта. Но как можно получить доступ к этим самым атрибутам? В Python все очень просто, и этот случай не исключение. Доступ к атрибутам любого объекта осуществляется через точку и имя атрибута (см. пример №7 ). А чтобы узнать, какие атрибуты имеет данный объект, можно воспользоваться очередной встроенной функцией dir() , которой в качестве аргумента следует передать требуемый объект. Результатом будет словарь со всеми атрибутами объекта.
Если необходимо узнать количество элементов какой-нибудь последовательности или коллекции, например, строки или словаря, проще всего воспользоваться встроенной функцией len() , которой нужно передать требуемый объект в качестве аргумента.
Пример №7. Получение атрибутов объектов.
Таким образом, если в процессе создания программы мы забудем, например, какие методы имеются в Python для обработки строк, всегда можно воспользоваться функцией dir() . Это касается объектов не только встроенных типов данных, но и созданных пользователем.
Но и это еще не все! Интерпретатор Python реально поставляется под ключ. Поэтому в комплекте имеется собственный встроенный справочник, что очень даже удобно (см. пример №8 ). Ведь типов данных довольно много и для каждого из них имеются не только общие, но и свои индивидуальные методы обработки этих данных. Так что, если информации предоставляемой функцией dir() становится не достаточно и хочется получить более подробную справку, следует обращаться за помощью к встроенной функции help() , которой нужно передать в качестве аргумента интересующий нас объект.
Обратите внимание, что запись в коде, например, my_func означает имя функции и сам объект функции. А выражение my_func() означает вызов этой функции. Так вот, когда в качестве аргумента нужно передать объект функции, следует передавать только ее имя и не использовать скобки.
Пример №8. Получение справки по объектам.
Опять же, поскольку в Python все является объектами, даже сами типы и модули, то передав функции help() имя импортируемого из стандартной библиотеки модуля, можно получить подробную справку и по нему.
Следует иметь в виду, что на экран информация выводится частями. Поэтому желательно максимально уточнять запрос (как в примере выше), чтобы не приходилось многократно нажимать Enter для вывода очередного блока информации.
Краткие итоги параграфа
- Все данные в Python представлены в виде объектов, которые представляют собой выделенные области памяти со значениями данного типа и определенными для этих значений наборами операций.
- К базовым типам данных Пайтона относятся числа ( int , float , complex ), строки ( str ), списки ( list ), кортежи ( tuple ), словари ( dict ), множества ( set ), булевы значения ( bool ) и специальное значение None ( NoneType ).
- Python относится к языкам программирования с динамической типизацией данных, поэтому программисту не нужно объявлять тип переменной в исходном коде. Интерпретатор делает это автоматически во время присвоения переменной нового значения. При этом он самостоятельно контролирует объем памяти, распределяемый под вновь создаваемый объект.
- Переменные в Python хранят не само значение, а ссылки на объект этого значения.
- Для преобразования одного встроенного типа данных в другой можно пользоваться соответствующими функциями (конструкторами типов): bool() , int() , float() , complex() , str() , tuple() , list() , dict() или set() . Однако нужно быть внимательным и во избежание ошибок проверять возможность такого преобразования.
- Для получения списка атрибутов объекта предназначена встроенная функция dir() , которой в качестве аргумента должен передаваться требуемый объект. Результатом будет словарь со всеми атрибутами объекта.
- Для получения более подробной справки по объектам следует использовать встроенную функцию help() , которой в качестве аргумента также нужно передавать требуемый объект.
На этом краткое описание типов данных Python мы заканчиваем, посвятив более подробному рассмотрению каждого из перечисленных типов весь остаток второй главы.
Вопросы и задания для самоконтроля
1. Определите устно типы следующих значений: ‘123’ , [1,2,3] , <1,2,3>, 123 , <1: 1, 2: 2, 3: 3>, (1,2,3) . Показать решение.
Ответ. ‘123’ – строка (т.е. тип str ), [1,2,3] – список (т.е. тип list ), <1,2,3>– множество (т.е. тип set ), 123 – целое число (т.е. тип int ), <1: 1, 2: 2, 3: 3>– словарь (т.е. тип dict ), (1,2,3) – кортеж (т.е. тип tuple ).
2. Выполните предыдущее задание, организовав вывод типов на экран при помощи скрипта. Показать решение.
3. Переменной li присвоили список [1, 2, 3] . В ходе выполения программы в список были добавлены еще два значения и он принял вид [1, 2, 3, 4, 5] . На сколько изменился объем памяти, занимаемый переменной? Показать решение.
4. Что такое динамическая типизация? Показать решение.
Ответ. – это прием, при котором переменная связывается с типом в момент присваивания значения, а не в момент объявления переменной.
5. Напишите код программы, которая будет запрашивать у пользователя два целых числа, а затем выводить на экран их произведение. Показать решение.
6. У какого типа больше атрибутов: tuple или list ? Сперва попытайтесь догадаться устно, а затем вычислите программно и выведите их атрибуты на экран. Показать решение.
Ответ. Поскольку кортежи относятся к неизменяемым последовательностям, то скорее всего у них будет меньше методов для обработки своих данных, чем у списков. Ведь списки могут изменяться, а значит для них должны быть доступны дополнительные методы, например, для удаления или добавления новых элементов. Это конечно все несколько субъективно, но тем не менее давайте проверим.
7. Получите описание функции len , использовав встроенную справку. Показать решение.
8. Какая из рассмотренных нами функций len() , type() , print() , isinstance() , dir() , help() или input() содержится в модуле sys ? Как мы можем получить доступ к ней? Показать решение.
Ответ. Все перечисленные функции являются встроенными и не требуют импорта модуля стандартной библиотеки sys . Но с одной такой функцией мы уже познакомились – это функция getsizeof() . Чтобы ее использовать, сперва нужно импортировать указанный модуль при помощи инструкции import sys .