{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "# Типы и модель данных\n", "\n", " \n", "**С.В. Лемешевский** (email: `sergey.lemeshevsky@gmail.com`), Институт математики НАН Беларуси\n", "\n", "Date: **Feb 19, 2020**\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Здесь разберем как Python работает с переменными и определим, какие\n", "типы данных можно использовать в рамках этого языка. Подробно рассмотрим модель\n", "данных Python, а также механизмы создания и изменения значения\n", "переменных.\n", "\n", "# Кратко о типизации языков программирования\n", "
\n", "\n", "Если достаточно формально подходить к вопросу о типизации языка Python, то\n", "можно сказать, что он относится к языкам с неявной сильной динамической\n", "типизацией.\n", "\n", "Неявная типизация означает, что при объявлении переменной вам не нужно\n", "указывать её тип, при явной – это делать необходимо. В качестве примера языков с\n", "явной типизацией можно привести Java, C++ . Вот как будет выглядеть объявление\n", "целочисленной переменной в Java и Python.\n", "\n", "* Java:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " int a = 1 ;\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Python:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "a = 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "\n", "# Типы данных в Python\n", "
\n", "\n", "В Python типы данных можно разделить на встроенные в интерпретатор (`built-in`) и\n", "не встроенные, которые можно использовать при импортировании соответствующих\n", "модулей.\n", "\n", "К основным встроенным типам относятся:\n", "1. `None` (неопределенное значение переменной)\n", "\n", "2. Логические переменные (`Boolean Type`)\n", "\n", "3. Числа (`Numeric Type`)\n", "\n", "a. `int` – целое число\n", "\n", "b. `float` – число с плавающей точкой\n", "\n", "c. `complex` – комплексное число\n", "\n", "\n", "4. Списки (`Sequence Type`)\n", "\n", "a. `list` – список\n", "\n", "b. `tuple` – кортеж\n", "\n", "c. `range` – диапазон\n", "\n", "\n", "4. Строки (`Text Sequence Type`)\n", "\n", "a. `str`\n", "\n", "\n", "2. Бинарные списки ( Binary Sequence Types )\n", "\n", "a. `bytes` – байты\n", "\n", "b. `bytearray` – массивы байт\n", "\n", "c. `memoryview` – специальные объекты для доступа к внутренним данным объекта через `protocol buffer`\n", "\n", "\n", "4. Множества (`Set Types`)\n", "\n", "a. `set` – множество\n", "\n", "b. `frozenset` – неизменяемое множество\n", "\n", "\n", "3. Словари (`Mapping Types`)\n", "\n", "a. `dict` – словарь\n", "\n", "\n", "\n", "\n", "\n", "\n", "# Модель данных\n", "
\n", "\n", "Рассмотрим как создаются объекты в памяти, их устройство, процесс объявления\n", "новых переменных и работу операции присваивания.\n", "\n", "Для того, чтобы объявить и сразу инициализировать переменную необходимо\n", "написать её имя, потом поставить знак равенства и значение, с которым эта\n", "переменная будет создана.\n", "\n", "Например строка:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "b = 5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Объявляет переменную `b` и присваивает ей значение `5`.\n", "\n", "Целочисленное значение `5` в рамках языка Python по сути своей является\n", "*объектом*. Объект, в данном случае – это абстракция для представления данных,\n", "данные – это числа, списки, строки и т.п. При этом, под *данными* следует понимать как\n", "непосредственно сами объекты, так и отношения между ними (об этом чуть позже).\n", "Каждый объект имеет три атрибута – это *идентификатор*, *значение* и *тип*.\n", "\n", "*Идентификатор* – это уникальный признак объекта, позволяющий отличать объекты\n", "друг от друга, а *значение* – непосредственно информация, хранящаяся в памяти,\n", "которой управляет интерпретатор.\n", "\n", "При инициализации переменной, на уровне интерпретатора, происходит\n", "следующее:\n", "* создается целочисленный объект `5` (можно представить, что в этот момент создается ячейка и число `5` «кладется» в эту ячейку);\n", "\n", "* данный объект имеет некоторый идентификатор, значение: `5`, и тип: целое число;\n", "\n", "* посредством оператора `=` создается ссылка между переменной `b` и целочисленным объектом `5` (переменная `b` ссылается на объект `5`).\n", "\n", "> **Замечание.**\n", ">\n", "> Имя переменной не должно совпадать с ключевыми словами интерпретатора\n", "> Python . Список ключевых слов можно получить непосредственно в программе, для\n", "> этого нужно подключить модуль `keyword` и воспользоваться командой\n", "> `keyword.kwlist`." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import keyword\n", "print(\"Python keywords: \" , keyword.kwlist)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Проверить является или нет идентификатор ключевым словом можно так:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "4\n", " \n", "<\n", "<\n", "<\n", "!\n", "!\n", "C\n", "O\n", "D\n", "E\n", "_\n", "B\n", "L\n", "O\n", "C\n", "K\n", " \n", " \n", "p\n", "y\n", "c\n", "o\n", "d" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "5\n", " \n", "<\n", "<\n", "<\n", "!\n", "!\n", "C\n", "O\n", "D\n", "E\n", "_\n", "B\n", "L\n", "O\n", "C\n", "K\n", " \n", " \n", "p\n", "y\n", "c\n", "o\n", "d" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "6\n", " \n", "<\n", "<\n", "<\n", "!\n", "!\n", "C\n", "O\n", "D\n", "E\n", "_\n", "B\n", "L\n", "O\n", "C\n", "K\n", " \n", " \n", "p\n", "y\n", "c\n", "o\n", "d" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "False" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Для того, чтобы посмотреть на объект с каким идентификатором ссылается данная\n", "переменная, можно использовать функцию `id()`." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ ">>> a = 4\n", ">>> b = 5\n", ">>> id (a)\n", "1829984576\n", ">>> id (b)\n", "1829984592\n", ">>> a = b\n", ">>> id (a)\n", "1829984592" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Как видно из примера, идентификатор – это некоторое целочисленное значение,\n", "посредством которого уникально адресуется объект. Изначально переменная a\n", "ссылается на объект `4` с идентификатором `1829984576`, переменная `b`\n", "– на объект с `id = 1829984592`. После выполнения операции\n", "присваивания `a = b`, переменная a стала ссылаться на тот же объект,\n", "что и `b`.\n", "\n", "\n", "\n", "![](fig-datatype/refs.png)\n", "\n", "\n", "Тип переменной можно определить с помощью функции `type()`. Пример\n", "использования приведен ниже." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [], "source": [ ">>> a = 10\n", ">>> b = \"hello\"\n", ">>> c = ( 1 , 2 )\n", ">>> type (a)\n", "< class 'int' >\n", ">>> type (b)\n", "< class 'str' >\n", ">>> type (c)\n", "< class 'tuple' >" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "\n", "# Изменяемые и неизменяемые типы данных\n", "
\n", "\n", "В Python существуют изменяемые и неизменяемые типы.\n", "\n", "К неизменяемым (`immutable`) типам относятся:\n", "* целые числа (`int`);\n", "\n", "* числа с плавающей точкой (`float`);\n", "\n", "* комплексные числа (`complex`);\n", "\n", "* логические переменные (`bool`);\n", "\n", "* кортежи (`tuple`);\n", "\n", "* строки (`str`);\n", "\n", "* неизменяемые множества (`frozen set`).\n", "\n", "К изменяемым ( mutable ) типам относятся\n", "* списки (`list`);\n", "\n", "* множества (`set`);\n", "\n", "* словари (`dict`).\n", "\n", "Как уже было сказано ранее, при создании переменной, вначале создается объект,\n", "который имеет уникальный идентификатор, тип и значение, после этого переменная\n", "может ссылаться на созданный объект.\n", "\n", "Неизменяемость типа данных означает, что созданный объект больше не\n", "изменяется. Например, если мы объявим переменную `k = 15`, то будет создан объект\n", "со значением `15`, типа `int` и идентификатором, который можно узнать с помощью\n", "функции `id()`." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [], "source": [ ">>> k = 15\n", ">>> id (k)\n", "1672501744\n", ">>> type (k)\n", "< class 'int' >" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Объект с `id = 1672501744` будет иметь значение `15` и изменить его уже нельзя.\n", "Если тип данных изменяемый, то можно менять значение объекта.\n", "\n", "Например, создадим список `[1, 2]`, а потом заменим второй элемент на\n", "`3`." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ ">>> a = [ 1 , 2 ]\n", ">>> id (a)\n", "47997336\n", ">>> a[ 1 ] = 3\n", ">>> a\n", "[ 1 , 3 ]\n", ">>> id (a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Как видно, объект на который ссылается переменная `a`, был изменен. Это можно\n", "проиллюстрировать следующим рисунком.\n", "\n", "\n", "\n", "![](fig-datatype/mute.png)\n", "\n", "\n", "В рассмотренном случае, в качестве данных списка, выступают не объекты, а\n", "отношения между объектами. Т.е. в переменной a хранятся ссылки на объекты\n", "содержащие числа `1` и `3`, а не непосредственно сами эти числа.\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "" ] } ], "metadata": {}, "nbformat": 4, "nbformat_minor": 2 }