{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Самые необходимые типы данных" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[К оглавлению](00_contents.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Тип данных** позволяет указать компьютеру, какие действия можно выполнять с этими данными и как это делать.\n", "\n", "Наиболее часто использьуемые типы данных приведены в таблице\n", "\n", "Тип данных | Применение\n", ":----------|:-----------------------------------------\n", "int | Целые числа\n", "float | Действительные числа\n", "bool | Логические значения\n", "str | Строки\n", "list | Списки - упорядоченные последовательности значений (изменяемые)\n", "tuple | Кортежи - упорядоченные последовательности значений (неизменяемые)\n", "dict | Словари - коллекции объектов с доступом по ключу\n", "ndarray | Массивы numpy\n", "None | Пустое значение\n", "\n", "Тип объекта можно узнать с помощью функции `type()`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "type(3)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "type(3.)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "type('ноль')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "type(False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Простые типы данных" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Числовые типы данных\n", "\n", "Два наиболее часто используемых числовых типа данных - целые (`int`) и действительные (`float`) числа.\n", "\n", "При необходимости, *преобразование типов* происходит автоматически. Если в выражении содержится хотя бы одно действительное число, то результат будет действительным числом." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "2 * 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "2 * 2." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "5 / 2 # 2.5 в Python 3, но 2 в Python 2 " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Логический тип данных" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Логический тип данных представлен двумя константами - `True` и `False`\n", "\n", "Результат логического типа часто появляется в операциях сравнения:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "5 > 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "2 * 2 == 5" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "2 * 2 != 5" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "'Колбаса' > 'Бутерброд'" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(ord('К'), ord('Б')) #Коды символов К и Б" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Можно комбинировать несколько логических выражений с помощью логических операторов: `and`, `or`, `not`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "5 > 2 and 'a' < 'b'" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "not 5 > 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "not 5 > 2 or 2 * 2 == 4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Строки" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "s = 'Сочи '" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "s2 = 'Море'\n", "s + s2" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "y = 2014\n", "s + y #ошибка!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "s + str(y) #правильно: приведение типа к строковому типу" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Сложные строки при выводе результатов расчета удобно получать с помощью оператора форматированного вывода %" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "r = 10\n", "from math import pi\n", "print('Площадь круга радиусом %s равна %s' % (r, pi * r**2)) #формат по умолчанию" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print('Площадь круга радиусом %.1f равна %.2f' % (r, pi * r**2)) #заданный формат" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Справочник по форматам](https://docs.python.org/2/library/string.html#formatspec)\n", "\n", "Количество цифр после запятой можно также задавать с помощью волшебной команды `%precision`, но это будет работать не везде." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Пустое значение\n", "\n", "Чтобы показать, что имя переменной не связано ни с каким объектом, в Python используется специальное значение: `None`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "run_control": { "marked": false } }, "outputs": [], "source": [ "x = None\n", "print(x)\n", "type(x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "run_control": { "marked": false } }, "outputs": [], "source": [ "x is None #проверка на пустое значение" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Коллекции\n", "\n", "Типы-коллекции содержат большое количество элементов. В Python множество инструментов для удобной обработки коллекций.\n", "\n", "### Списки\n", "_Список_ (_list_) позволяет создать коллекцию объектов любого типа." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "l = [1, 2., 'три', False]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Нумерация элементов в Python начинается от нуля.\n", "\n", "![Индексирование элементов списка](pics/list_indexing.svg 'Индексирование элементов списка')\n", "\n", "\n", "Диапазон значений можно указать с помощью двоеточия: `[a:b]`\n", "\n", "Обратите внимание, что правая граница (`b`) не включается в диапазон!\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Извлечение элементов:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(l)\n", "l[0] #нумерация элементов начинается с нуля" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(l)\n", "l[-1] #последний элемент" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(l)\n", "l[1:3] #элементы с индексами 1 и 2. NB: Элемент 3 не включается!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(l)\n", "l[2:] #все элементы, начиная с индекса 2 и до конца списка" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(l)\n", "l + l #слияние списков" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "run_control": { "marked": false } }, "outputs": [], "source": [ "print(s)\n", "l2 = list(s) #список из строки\n", "print(l2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Список - _изменяемый_ тип данных (_mutable_)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(l)\n", "l[2] = 3\n", "l" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Кортежи\n", "\n", "_Кортеж_ (_tuple_) позволяет создать коллекцию объектов любого вида, однако, в отличие от списка, элементы этой коллекции нельзя менять после создания. Кортеж - _неизменяемый_ тип (_immutable_)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "t = (1, 2., 'три', False)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "t[1:2]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "t[2] = 3 #ошибка!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "t + t #новый кортеж, составленный из двух копий t" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Словари\n", "\n", "_Словарь_ (_dict_) позволяет создавать коллекцию объектов любого вида. Однако для выбора _значений_ (_values_) из коллекции используются не индексы, а _ключи_ (_keys_)\n", "\n", "![Словарь](pics/dic_indexing.svg 'Ключи и значения в словаре')\n", "\n", "Ключом может быть любой неизменяемый объект. Значение может быть любым объектом." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "mydict = {'звери': ['собака', 'крот', 'утконос'],\n", " 'птицы': ['дятел', 'дрофа']}" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "mydict['птицы'] #извлечение значения по ключу" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "mydict['деревья'] = ['дуб', 'баобаб']\n", "mydict" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "mydict[0] #ошибка - элементы словаря не упорядочены, поэтому нельзя использовать числовые индексы" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "mydict['грибы'] #ошибка - такого ключа нет" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Объекты\n", "\n", "Все типы данных в Python являются _объектными_. Объекты, помимо самих данных, содержат также и _методы_, позволяющие эти данные обрабатывать." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x = 5.0\n", "print(x)\n", "type(x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(dir(x))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Для доступа к членам класса - вызова методов, или просмотра/изменения атрибутов используется \"запись с точкой\": \n", "- `объектная_переменная.метод()` \n", "- `объектная_переменная.имя_атрибута`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x.imag # Мнимая часть числа" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(s)\n", "type(s)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(dir(s))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если в блокноте сразу после ввода точки нажать клавишу `Tab`, то выводится подсказка по методам и атрибутам объекта, на который ссылается переменная" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Попробуйте здесь получить подсказку по методам объекта-строки (переменная s)\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "s.upper()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "s.upper().strip()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(l)\n", "type(l)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(dir(l))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "l.reverse() #список изменяется \"на месте\"\n", "print(l)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Чтобы задать, какие атрибуты (данные) и методы (операции) будут у объекта, разработчики создают _классы_. Объектно-ориентированный подход упрощает разработку программ, потому что классы скрывают детали реализации от пользователя. Чтобы воспользоваться объектом, достаточно знать, какие методы он поддерживает и правила использования этих методов. Во многих случаях (например, при сравнениях, выполнении арифметических операций, при печати) нужные методы вызываются автоматически." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "list?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В определение класса может быть включен специальный метод - `__init__()` (_конструктор_). Конструктор автоматически выполняется при создании нового объекта на основе данного класса. Это позволяет сразу при создании получить объект с нужными свойствами. Данные для этого передаются через аргументы конструктора. При использовании инициализации объекта в программе, необходимо указывать эти аргументы в скобках после имени класса." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "dict(color = 'red', linestyle = 'dashed', size = 0.5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Массивы numpy\n", "\n", "_Массив_ (_array_) - тип данных, предназначенный для обработки табличных данных. Определение этого типа данных и функции для работы с массивами содержатся в пакете `numpy`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Создание массивов" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr1 = np.array([10, 20, 25, 32]) #массив из списка\n", "print(arr1)\n", "type(arr1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr1.shape #форма массива" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr1.ndim #число измерений" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#двухмерный массив из списка:\n", "arr2 = np.array([[1, 2, 3],\n", " [4, 5, 6],\n", " [7, 8, 9]])\n", "print(arr2)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr2.shape" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "arr2.ndim" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "I = np.identity(5) #единичная матрица\n", "print(I)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "I.shape" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "I.ndim" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "A = np.zeros((3, 4))\n", "print(A)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x = np.arange(-10, 11, 2)\n", "x" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "y = np.linspace(-10, 10, 11)\n", "y" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(x.dtype, y.dtype)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(x.nbytes, y.nbytes)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Операции с массивами" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "A[1, 1] = 5 #изменение элемента\n", "print(A)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "A[1:, 2:] = 10\n", "print(A)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(A[1]) #извлечение строки" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(A[:, 1]) #извлечение столбца" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(A * 2) #полэлементное умножение" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(A * A)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(np.sqrt(A * A)) #применение функции к каждому элементу массива" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(A.T) #транспонирование" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "B = A #переменная B ссылается на тот же массив, что и переменная A\n", "B[0, 0] = 33\n", "print(B)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(A) #массив изменился, поэтому ссылка A также показывает измененный вариант" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "C = A.copy() #создается копия массива\n", "C[0, 0] = 55\n", "print(C) " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print(A) #оригинал не изменился" ] } ], "metadata": { "hide_input": false, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.4.3" }, "latex_envs": { "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 0 }, "toc": { "toc_cell": false, "toc_number_sections": false, "toc_threshold": 4, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 0 }