Типы данных
Литеральные константы
Примером литеральной константы может быть число, например, 5
, 1.23
, 9.25e-3
или что-нибудь вроде 'Это строка'
или "It's a string!"
. Они называются литеральными, потому что они “буквальны” – вы используете их значение буквально. Число 2
всегда представляет само себя и ничего другого – это “константа”, потому что её значение нельзя изменить. Поэтому всё это называется литеральными константами.
Числа
Числа в Python бывают трёх типов: целые, с плавающей точкой и комплексные.
Примером целого числа может служить
2
.Примерами чисел с плавающей точкой (или “плавающих” для краткости) могут быть
3.23
и52.3E-4
. ОбозначениеE
показывает степени числа 10. В данном случае52.3E-4
означает 52.3 * 10-4.Примеры комплексных чисел:
(-5+4j)
и(2.3 - 4.6j)
Строки
Строка – это последовательность символов. Чаще всего строки – это просто некоторые наборы слов.
Слова могут быть как на английском языке, так и на любом другом, поддерживаемом стандартом Unicode, что означает почти на любом языке мира.
Замечание для опытных программистов
В Python 3 нет ASCII-строк, потому что Unicode является надмножеством (включает в себя) ASCII. Если необходимо получить строку строго в кодировке ASCII, используйте str.encode("ascii")
.
Одинарные кавычки
Строку можно указать, используя одинарные кавычки, как например, 'Фраза в кавычках'
. Все пробелы и знаки табуляции сохранятся, как есть.
Двойные кавычки
Строки в двойных кавычках работают точно так же, как и в одинарных. Например, "What's your name?"
.
Тройные кавычки
Можно указывать “многострочные” строки с использованием тройных кавычек ("""
или '''
). В пределах тройных кавычек можно свободно использовать одинарные и двойные кавычки. Например:
Строки неизменяемы
Это означает, что после создания строки её больше нельзя изменять. На первый взгляд это может показаться недостатком, но на самом деле это не так. Впоследствии на примере разных программ мы увидим, почему это не является ограничением.
Объединение строковых констант
Если расположить рядом две строковых константы, Python автоматически их объединит. Например, 'What\'s ' 'your name?'
автоматически преобразуется в "What's your name?"
.
Метод format
Иногда бывает нужно составить строку на основе каких-либо данных. Вот здесь-то и пригождается метод format()
.
Сохраните следующие строки в файл str_format.py
:
Вывод:
Как это работает:
В строку могут быть включены определённые обозначения, а впоследствии может быть вызван метод
format
для замещения этих обозначений соответствующими аргументами.Взгляните на первый случай применения обозначений, где мы пишем
{0}
, и это соответствует переменнойname
, являющейся первым аргументом методаformat
. Аналогично, второе обозначение{1}
соответствует переменнойage
, являющейся вторым аргументом методаformat
.Заметьте, мы ведь могли добиться того же самого результата и объединением строк:
'Возраст' + name + ' -- ' + str(age) + ' лет.'
, однако вы сами видите, как это некрасиво, и как легко в таком случае допустить ошибку. Во-вторых, преобразование в строку делается методомformat
автоматически, в отличие от явного преобразования в нашем примере. В-третьих, используя методformat
, мы можем изменить сообщение, не затрагивая используемых переменных, и наоборот.На всякий случай имейте в виду, что цифры здесь не обязательны. Можно было бы просто написать:
и получить такой же результат, как и ранее.
В методе format
Python помещает значение каждого аргумента в обозначенное место. Могут быть и более детальные обозначения, как то:
Детально такие обозначения форматов описаны в Предложении по расширению Python PEP 3101.
Список
Список – это структура данных, которая содержит упорядоченный набор элементов, т.е. хранит последовательность элементов. Это легко представить, если вспомнить список покупок, в котором перечисляется, что нужно купить, с тем лишь исключением, что в списке покупок каждый элемент обычно размещается на отдельной строке, тогда как в Python они разделяются запятыми.
Список элементов должен быть заключён в квадратные скобки, чтобы Python понял, что это список. Как только список создан, можно добавлять, удалять или искать элементы в нём. Поскольку элементы можно добавлять и удалять, мы говорим, что список – это изменяемый тип данных, т.е. его можно модифицировать.
Кортеж
Кортежи служат для хранения нескольких объектов вместе. Их можно рассматривать как аналог списков, но без такой обширной функциональности, которую предоставляет класс списка. Одна из важнейших особенностей кортежей заключается в том, что они неизменяемы, так же, как и строки. Т.е. модифицировать кортежи невозможно.
Кортежи обозначаются указанием элементов, разделённых запятыми; по желанию их можно ещё заключить в круглые скобки.
Кортежи обычно используются в тех случаях, когда оператор или пользовательская функция должны наверняка знать, что набор значений, т.е. кортеж значений, не изменится.
Пример: (сохраните как using_tuple.py
)
Вывод:
Как это работает:
Переменная
zoo
обозначает кортеж элементов. Как мы видим, функцияlen
позволяет получить длину кортежа. Это также указывает на то, что кортеж является последовательностью.Теперь мы перемещаем этих животных в новый зоопарк, поскольку старый зоопарк закрывается. Поэтому кортеж
new_zoo
содержит тех животных, которые уже там, наряду с привезёнными из старого зоопарка. Возвращаясь к реальности, обратите внимание на то, что кортеж внутри кортежа не теряет своей индивидуальности.Доступ к элементам кортежа осуществляется указанием позиции элемента, заключённой в квадратные скобки – точно так же, как мы это делали для списков. Это называется оператором индексирования. Доступ к третьему элементу в
new_zoo
мы получаем, указываяnew_zoo[2]
, а доступ к третьему элементу внутри третьего элемента в кортежеnew_zoo
– указываяnew_zoo[2][2]
. Это достаточно просто, как только вы поймёте принцип.
Скобки
Хотя скобки и не являются обязательными, я предпочитаю всегда указывать их, чтобы было очевидно, что это кортеж, особенно в двусмысленных случаях. Например, print(1,2,3)
и print( (1,2,3) )
делают разные вещи: первое выражение выводит три числа, тогда как второе – кортеж, содержащий эти три числа.
Кортеж, содержащий 0 или 1 элемент
Пустой кортеж создаётся при помощи пустой пары скобок – “myempty = ()
”. Однако, с кортежем из одного элемента не всё так просто. Его нужно указывать при помощи запятой после первого (и единственного) элемента, чтобы Python мог отличить кортеж от скобок, окружающих объект в выражении. Таким образом, чтобы получить кортеж, содержащий элемент 2
, вам потребуется указать “singleton = (2,)
”.
Словарь
Словарь – это некий аналог адресной книги, в которой можно найти адрес или контактную информацию о человеке, зная лишь его имя; т.е. некоторые ключи (имена) связаны со значениями (информацией). Заметьте, что ключ должен быть уникальным – вы ведь не сможете получить корректную информацию, если у вас записаны два человека с полностью одинаковыми именами.
Обратите также внимание на то, что в словарях в качестве ключей могут использоваться только неизменяемые объекты (как строки), а в качестве значений можно использовать как неизменяемые, так и изменяемые объекты. Точнее говоря, в качестве ключей должны использоваться только простые объекты.
Пары ключ-значение указываются в словаре следующим образом: “d = {key1 : value1, key2 : value2 }
”. Обратите внимание, что ключ и значение разделяются двоеточием, а пары друг от друга отделяются запятыми, а затем всё это заключается в фигурные скобки.
Помните, что пары ключ-значение никоим образом не упорядочены в словаре. Если вам необходим некоторый порядок, вам придётся отдельно отсортировать словарь перед обращением к нему.
Словари являются экземплярами/объектами класса dict
.
Пример: (сохраните как using_dict.py
)
Вывод:
Как это работает:
Мы создаём словарь
ab
при помощи обозначений, описанных ранее. Затем мы обращаемся к парам ключ-значение, указывая ключ в операторе индексирования, которым мы пользовались для списков и кортежей. Как видите, синтаксис прост.Удалять пары ключ-значение можно при помощи нашего старого доброго оператора
del
. Мы просто указываем имя словаря и оператор индексирования для удаляемого ключа, после чего передаём это операторуdel
. Для этой операции нет необходимости знать, какое значение соответствует данному ключу.Далее мы обращаемся ко всем парам ключ-значение нашего словаря, используя метод
items
, который возвращает список кортежей, каждый из которых содержит пару элементов: ключ и значение. Мы получаем эту пару и присваиваем её значение переменнымname
иaddress
соответственно в циклеfor..in
, а затем выводим эти значения на экран в блоке for.Новые пары ключ-значение добавляются простым обращением к нужному ключу при помощи оператора индексирования и присваиванием ему некоторого значения, как мы сделали для Guido в примере выше.
Проверить, существует ли пара ключ-значение, можно при помощи оператора
in
.
Чтобы просмотреть список всех методов класса dict
смотрите help(dict)
.
Ключевые Аргументы и Словари
К слову, если вы использовали ключевые аргументы в ваших функциях, вы уже использовали словари! Только подумайте: вы указали пару ключ-значение среди параметров функции при её определении, а когда обращаетесь к переменным внутри функции, то это, фактически, обращение по ключу к словарю (который в терминах разработчиков компиляторов называется таблицей имён).
Последовательности
Списки, кортежи и строки являются примерами последовательностей. Но что такое последовательности и что в них такого особенного?
Основные возможности – это проверка принадлежности (т.е. выражения “in
” и “not in
”) и оператор индексирования, позволяющий получить напрямую некоторый элемент последовательности.
Все три типа последовательностей, упоминавшиеся выше (списки, кортежи и строки), также предоставляют операцию получения вырезки, которая позволяет получить вырезку последовательности, т.е. её фрагмент.
Пример: (сохраните как seq.py
)
Вывод:
Как это работает:
Прежде всего, мы видим, как использовать индексы для получения отдельных элементов последовательности. Это ещё называют приписыванием индекса. Когда мы указываем число в квадратных скобках после последовательности, как показано выше, Python извлекает элемент, соответствующий указанной позиции в последовательности. Помните, что Python начинает отсчёт с 0. Поэтому
shoplist[0]
извлекает первый элемент, аshoplist[3]
– четвёртый элемент последовательностиshoplist
.Индекс также может быть отрицательным числом. В этом случае позиция отсчитывается от конца последовательности. Поэтому
shoplist[-1]
указывает на последний элемент последовательностиshoplist
, аshoplist[-2]
– на предпоследний.Операция вырезки производится при помощи указания имени последовательности, за которым может следовать пара чисел, разделённых двоеточием и заключённых в квадратные скобки. Заметьте, как это похоже на операцию индексирования, которой мы пользовались до сих пор. Помните, что числа в скобках необязательны, тогда как двоеточие – обязательно.
Первое число (перед двоеточием) в операции вырезки указывает позицию, с которой вырезка должна начинаться, а второе число (после двоеточия) указывает, где вырезка должна закончиться. Если первое число не указано, Python начнёт вырезку с начала последовательности. Если пропущено второе число, Python закончит вырезку у конца последовательности. Обратите внимание, что полученная вырезка будет начинаться с указанной начальной позиции, а заканчиваться прямо перед указанной конечной позицией, т.е. начальная позиция будет включена в вырезку, а конечная – нет.
Таким образом,
shoplist[1:3]
возвращает вырезку из последовательности, начинающуюся с позиции 1, включает позицию 2, но останавливается на позиции 3, и поэтому возвращает вырезку из двух элементов. Аналогично,shoplist[:]
возвращает копию всей последовательности.Вырезка может осуществляться и с отрицательными значениями. Отрицательные числа обозначают позицию с конца последовательности. Например,
shoplist[:-1]
вернёт вырезку из последовательности, исключающую последний элемент, но содержащую все остальные.Кроме того, можно также указать третий аргумент для вырезки, который будет обозначать шаг вырезки (по умолчанию шаг вырезки равен 1):
Обратите внимание на то, что когда шаг равен 2, мы получаем элементы, находящиеся на позициях 0, 2, ... Когда шаг равен 3, мы получаем элементы с позиций 0, 3, ... и т.д.
Попробуйте разные комбинации параметров вырезки, используя интерактивную оболочку интерпретатора Python, т.е. его командную строку, чтобы сразу видеть результат. Последовательности замечательны тем, что они дают возможность обращаться к кортежам, спискам и строкам одним и тем же способом!
Множество
Множества – это неупорядоченные наборы простых объектов. Они необходимы тогда, когда присутствие объекта в наборе важнее порядка или того, сколько раз данный объект там встречается.
Используя множества, можно осуществлять проверку принадлежности, определять, является ли данное множество подмножеством другого множества, находить пересечения множеств и так далее.
Как это работает:
Этот пример достаточно нагляден, так как использует основы теории множеств из школьного курса математики.
Ссылки
Когда мы создаём объект и присваиваем его переменной, переменная только ссылается на объект, а не представляет собой этот объект! То есть имя переменной указывает на ту часть памяти компьютера, где хранится объект. Это называется привязкой имени к объекту.
Обычно вам не следует об этом беспокоиться, однако есть некоторый неочевидный эффект, о котором нужно помнить:
Пример: (сохраните как reference.py
)
Вывод:
Как это работает:
Большая часть объяснения содержится в комментариях.
Помните, что если вам нужно сделать копию списка или подобной последовательности, или другого сложного объекта (не такого простого объекта, как целое число), вам следует воспользоваться операцией вырезки. Если вы просто присвоите имя переменной другому имени, оба они будут ссылаться на один и тот же объект, а это может привести к проблемам, если вы не осторожны.
Last updated