Осваиваем Python. Унция 1. Типы данных.
Продолжаю своё начинание. Данная статья является логическим продолжением первой. Было приятно читать ваши комментарии. Я надеялся, что данный цикл статей окажется для кого-то полезным, но совершенно не предполагал, что заинтересовавшихся будет довольно большое количество. Это заставляет относится к делу серьёзнее и ответственнее.
Без лишних слов, сразу к делу.
Числа, строки и кортежи
Причина того, что эти типы оказались сведёнными в один раздел, кроется в одном очень важном моменте. Без понимания которого можно допустить трудно обнаруживаемые ошибки. Дело в том, что данные типы в отличии от списков и словарей являются неизменяемыми объектами. Т.е. создав их однажды — изменить их значение не представляется возможным. Возникает справедливый вопрос: каким тогда образом работают следующие инструкции?
Инструкция x = 2 создаёт числовой объект со значением 2 и присваивает ссылку на этот объект переменной x. Далее инструкция x = 3 создаёт новый числовой объект со значением 3 и присваивает ссылку на него переменной x. А объект со значением 2 удаляется из памяти автоматическим сборщиком мусора т.к. была потеряна последняя ссылка на этот объект.
Благодаря этому справедливо следующее:
>>> x = y = 3 # переменные x и y содержат одну и ту же ссылку на объект 3
>>> x = 2 # переменная x теперь содержит ссылку на другой объект 2
>>> x
2
>>> y # y по-прежнему ссылается на объект 3
3
В тему будет упомянуть про оператор is. Этот оператор возвращает значение True, когда слева и справа от него находятся переменные содержащие указатели на один и тот же объект. Возникает вопрос о странном поведении этого оператора:
>>> x = 2
>>> y = 2 # создано два разных объекта
>>> x is y # по идее должно быть возвращено значение False
True
Здесь дело в кэширующих внутренних механизмах самого интерпретатора. Для оптимизации скорости выполнения при объявлении числового или короткого строкового объекта — в кэше создаётся пара ссылка и значение. И в дальнейшем при объявлении такого же объекта — не создаётся новый объект, а используется уже созданный. Напрашивается вывод о несостоятельности использования оператора is для числовых и строковых типов данных.
- целые числа неограниченной длины — интерпретатор сам определит необходимость использования объектов неограниченной длины и сделает необходимые преобразования. Более нет необходимости следить за переполнениями.
- Числа с плавающей точкой
- восьмеричные и шестнадцатеричные числа
- комплексные числа
>>> print 2 ** 150 # 2 в степени 150
1427247692705959881058285969449495136382746624
>>> print int(5.89),round(5.89),round(5.89,1) # округление вниз, вверх, с точностью до 1 знака
5 6.0 5.9
>>> import math
>>> math.pi
3.1415926535897931
>>> print math.sin(math.pi/2)
1.0
>>> import random
>>> random.randint(1,100) # случайное целое число в диапазоне от 1 до 100
19
Строки:
Строки в апострофах и в кавычках — это одно и то же
Строки в тройных кавычках — в тройные кавычки можно заключить целый блок строк, например целиком HTML или XML документ.
Неформатированные строки — строки вида r«\n\t» — последовательности в такой строке не будут заменены на спец. Символы
Строки символов юникода — u’string’ # теряет актуальность в версии 3.0 подробнее об изменениях 3.0
Базовые операции над строками:
>>> print str(len(‘string’))*3 # len() — возвращает количество символов в строке
666 # * — перегруженый оператор, делающий повтор строки указанное число раз
>>> ‘r’ in ‘string’ # оператор in возвращает True если подстрока найдена в строке
True
>>> ‘string’.replace(‘r’,») # замена одной подстроки на другую
‘sting’
>>> ‘string’.find(‘ri’) # возвращает номер смещения искомой подстроки
2
>>> ‘a,b,c’.split(‘,’) # функция разделения на подстроки по указанному символу или подстроке
[‘a’, ‘b’, ‘c’]
Более полную информацию о строковых методах можно получить, введя в интерактивном режиме команду help(str).
Так же строки уже были описаны моим будущим соавтором этого цикла статей тут
Индексирование, выборка и срезы последовательностей данных.
Думаю, о том, что к элементам строки можно получать доступ по их индексам, как в массиве — особо долго рассказывать не нужно.
>>> ‘string'[1]
‘t’
>>> ‘string'[-2] # второй элемент с конца строки
‘n’
Срез — достаточно мощный инструмент выборки данных из последовательностей, который используется не только в строках но и в коллекциях, речь о которых пойдёт в этой статье чуть ниже.
Общий вид:
S[i:j:h], где S — строка, i — значение смещения, левая граница (включительно), j — значение смещения, правая граница (она не входит в срез), h — значение шага.
Примеры:
Говоря о строках, конечно, нельзя забыть о регулярных выражениях. В Python для их использования необходимо импортировать модуль re
Я надеюсь, что о них удастся поговорить отдельно.
Кортежи
Кортеж — это упорядоченная, неизменяемая коллекция объектов произвольных типов, поддерживающая произвольное число уровней вложенности.
Основы синтаксиса так же уже описывал cleg в статье
Списки и словари
Списки и словари являются изменяемыми встроенными типами данных. А это значит, если возвращаться к тому с чего мы начали разговор, что, если создать список Y, затем сделать присваивание X=Y, а затем изменить X, то Y тоже изменится. За этим нужно внимательно следить! Для того, чтобы этого не происходило, необходимо создать новый объект эквивалентный исходному, например, так: X=Y[:]
Иллюстрация:
>>> M = L = range(2,12,3)
>>> print M,L
[2, 5, 8, 11] [2, 5, 8, 11]
>>> L[2] = 112
>>> print M,L
[2, 5, 112, 11] [2, 5, 112, 11]
>>> M = L[:]
>>> L[2] = 0
>>> print M,L
[2, 5, 112, 11] [2, 5, 0, 11]
Или, если требуется обеспечить неизменность созданного объекта — использовать вместо списков кортежи.
- операции над последовательностями неприменимы к словарям т.к. словари — это не последовательность, а отображение.
- Ключи не обязательно должны быть строками. В роли ключей могут выступать любые неизменяемые объекты. Т.е. если рассматривать встроенные типы данных, то — это числа, строки и кортежи. Ясно, что при использования чисел, словарь превращается в подобие списка, однако, остаётся при этом неупорядоченным. Используя в качестве ключа кортежи, появляется возможность использовать составные ключи. Экземпляры пользовательских классов так же могут выступать в качестве ключей при условии, что они реализуют определённые методы указывающие интерпретатору на то, что объект является неизменяемым.
Множества
Множества — это контейнеры для других объектов. Множества создаются встроенной функцией set и поддерживают типичные математические операции над множествами
Элементами множества могут стать любые неизменяемые объекты.
После того, как мы проделали определённые операции над множествами — их можно разместить обратно в список, например, так:
На этом всё на сегодня.
Пользуясь терминологией Радио-Т хочется задать вопрос 🙂 Куда подкрутить градус гиковости, по вашему мнению? Если вверх, то на мой взгляд, циклы и ветвления стоит раскрыть только с точки зрения особенностей присущих Python.
Спасибо за внимание! Мы продолжим 🙂
Python-шпаргалка. Часть 1 — Язык и Типы объектов
Данная статья представляет собой очень краткую, но емкую выжимку всего, что должен знать начинающий разработчик или QA-инженер о языке Python. Надеюсь, что усердие, приложенное при написании данной статьи, поможет многим подготовиться к собеседованиям на соответствующие вакансии и расширить свой IT-кругозор.
Статью стоит воспринимать не как учебник, а как удобную шпаргалку или «опорный сигнал» (так моя учительница истории называла подобное «творчество» в школе). Здесь не будет подробных определений, объяснений в целую главу, а лишь четкие термины, списки, краткие выжимки кода. Статья основана на замечательной книге Марка Лутца «Изучаем Python (5-е издание)», так что за её корректность и достоверность можете не переживать. Итак, начнем.
Вкратце о Python
Python — высокоуровневый язык программирования общего назначения (часто называется языком сценариев), ориентированный на повышение производительности разработчика и читаемости кода.
- Качество ПО
- Высокая скорость разработки
- Переносимость программ
- Библиотеки поддержки
- Интеграция компонентов (можно вызывать функции из библиотек C/C++)
- Динамическая типизация (при этом она строгая)
- Автоматическое управление памятью
- Модульное программирование
- Встроенные типы объектов
- Библиотеки утилит
- Сценарий компилируется (перевод программы) в байт-код (платформонезависимое представление исходного текста программы, .pyc файл)
- Байт-код передается виртуальной машине PVM.
- Отсутствует этап сборки
- Байт код не является двоичным машинным кодом (не может выполняться так же быстро)
- CPython (реализация на ANSI C)
- Jython (реализация на Java классах)
- IronPython (реализация для использования с .Net)
Типы объектов в Python
Данные в Python представляется в форме объектов — либо встроенных, либо создаваемых с помощью конструкций языка Python или других (например С).
Формы отображения объектов:
- repr (в виде программного кода, например 6.28300000000004)
- str (более читаемый, например 6.283)
Некоторые операции над последовательностями:
- len(s) — длина
- s[0] — обращение к элементу
- s[-1] — обращение к элементу с конца последовательности
- s[1:3] — срез начиная со смещения 1 и до 2 (не 3)
- s[:] — скопировать все содержимое (не путать с a=s)
- s*8 — повторение
- s+’xyz’ — конкатенация
- \n — конец строки
- \t — табуляция
- ord(‘\n’) — байт с числовым значением
- ‘A\0B\0C’ — \0 двоичный ноль
Списки (lists) – это упорядоченные по местоположению коллекции объектов произвольных типов, размер которых не ограничен.
Списки являются последовательностями => поддерживают все операции над последовательностями. Единственное отличие состоит в том, что результатом таких операций являются списки, а не строки.
Словари (dictionary) — не являются последовательностями, это коллекции объектов, где доступ к ним осуществляется не по определенным смещениям от начала коллекции, а по ключам. Изменяемый тип. Также возможна вложенность.
Кортеж (tuple) — список, который невозможно изменить. Кортежи являются последовательностями, как списки, но они являются неизменяемыми, как строки. Возможна вложенность. Возможно одновременное хранение объектов разных типов.
Объекты-файлы — это основной интерфейс между программным кодом на языке Python и внешними файлами на компьютере. Файлы являются одним из базовых типов, но они представляют собой нечто необычное, поскольку для файлов отсутствует возможность создания объектов в виде литералов. Вместо этого, чтобы создать объект файла, необходимо вызвать встроенную функцию open, передав ей имя внешнего файла и строку режима доступа к файлу.
f = open('data.txt', 'w') # Создается новый файл для вывода
Самый лучший на сегодняшний день способ чтения файлов состоит в том, чтобы не читать его содержимое целиком – файлы предоставляют итераторы, которые обеспечивают автоматическое построчное чтение содержимого файла в циклах for и в других контекстах.
Множества — это неупорядоченные коллекции уникальных и неизменяемых объектов. Множества создаются встроенной функцией set.
X = set('spam') # В 2.6 и 3.0 можно создавать из последовательностей Y = # В 3.0 можно определять литералы множеств X, Y (, ) X & Y # Пересечение X | Y # Объединение X – Y # Разность