Files
python-course-ipynb/datatype.ipynb
2020-02-19 16:50:23 +03:00

476 lines
16 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"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",
"\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": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"keyword.iskeyword( \"try\" )"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"keyword.iskeyword( \"b\" )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Для того, чтобы посмотреть на объект с каким идентификатором ссылается данная\n",
"переменная, можно использовать функцию `id()`."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"a = 4\n",
"b = 5\n",
"id (a)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"id (b)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"a = b\n",
"id (a)"
]
},
{
"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",
"![](fig-datatype/refs.png)<!-- end figure -->\n",
"\n",
"\n",
"Тип переменной можно определить с помощью функции `type()`. Пример\n",
"использования приведен ниже."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"a = 10\n",
"b = \"hello\"\n",
"c = ( 1 , 2 )\n",
"type (a)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"type (b)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"type (c)"
]
},
{
"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": 12,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"k = 15\n",
"id (k)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"type (k)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Объект с `id = 1672501744` будет иметь значение `15` и изменить его уже нельзя.\n",
"Если тип данных изменяемый, то можно менять значение объекта.\n",
"\n",
"Например, создадим список `[1, 2]`, а потом заменим второй элемент на\n",
"`3`."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"a = [1 ,2]\n",
"id (a)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"a[1] = 3\n",
"a"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"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",
"![](fig-datatype/mute.png)<!-- 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
}