Первый коммит
This commit is contained in:
495
datatype.ipynb
Normal file
495
datatype.ipynb
Normal file
@@ -0,0 +1,495 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<!-- dom:TITLE: Типы и модель данных -->\n",
|
||||
"# Типы и модель данных\n",
|
||||
"<!-- dom:AUTHOR: С.В. Лемешевский Email:sergey.lemeshevsky@gmail.com at Институт математики НАН Беларуси -->\n",
|
||||
"<!-- Author: --> \n",
|
||||
"**С.В. Лемешевский** (email: `sergey.lemeshevsky@gmail.com`), Институт математики НАН Беларуси\n",
|
||||
"\n",
|
||||
"Date: **Feb 19, 2020**\n",
|
||||
"\n",
|
||||
"<!-- Common Mako variable and functions -->\n",
|
||||
"<!-- -*- coding: utf-8 -*- -->\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"Здесь разберем как Python работает с переменными и определим, какие\n",
|
||||
"типы данных можно использовать в рамках этого языка. Подробно рассмотрим модель\n",
|
||||
"данных Python, а также механизмы создания и изменения значения\n",
|
||||
"переменных.\n",
|
||||
"\n",
|
||||
"# Кратко о типизации языков программирования\n",
|
||||
"<div id=\"datatype:typization\"></div>\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": [
|
||||
"<!-- Local Variables: -->\n",
|
||||
"<!-- doconce-chapter-nickname: \"chapter\" -->\n",
|
||||
"<!-- doconce-section-nickname: \"typization\" -->\n",
|
||||
"<!-- End: -->\n",
|
||||
"# Типы данных в Python\n",
|
||||
"<div id=\"datatype:types\"></div>\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",
|
||||
"<!-- Local Variables: -->\n",
|
||||
"<!-- doconce-chapter-nickname: \"datatype\" -->\n",
|
||||
"<!-- doconce-section-nickname: \"types\" -->\n",
|
||||
"<!-- End: -->\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# Модель данных\n",
|
||||
"<div id=\"datatype:model\"></div>\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",
|
||||
"<!-- dom:FIGURE: [fig-datatype/refs.png, width=600 frac=1.0] -->\n",
|
||||
"<!-- begin figure -->\n",
|
||||
"<!-- end figure -->\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": [
|
||||
"<!-- Local Variables: -->\n",
|
||||
"<!-- doconce-chapter-nickname: \"datatype\" -->\n",
|
||||
"<!-- doconce-section-nickname: \"model\" -->\n",
|
||||
"<!-- End: -->\n",
|
||||
"# Изменяемые и неизменяемые типы данных\n",
|
||||
"<div id=\"datatype:mutable\"></div>\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",
|
||||
"<!-- dom:FIGURE: [fig-datatype/mute.png, width=600 frac=1.0] -->\n",
|
||||
"<!-- begin figure -->\n",
|
||||
"<!-- end figure -->\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"В рассмотренном случае, в качестве данных списка, выступают не объекты, а\n",
|
||||
"отношения между объектами. Т.е. в переменной a хранятся ссылки на объекты\n",
|
||||
"содержащие числа `1` и `3`, а не непосредственно сами эти числа.\n",
|
||||
"\n",
|
||||
"<!-- Local Variables: -->\n",
|
||||
"<!-- doconce-chapter-nickname: \"datatype\" -->\n",
|
||||
"<!-- doconce-section-nickname: \"mutable\" -->\n",
|
||||
"<!-- End: -->\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"<!-- Local Variables: -->\n",
|
||||
"<!-- doconce-chapter-nickname: \"datatype\" -->\n",
|
||||
"<!-- End: -->"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
Reference in New Issue
Block a user