Основные типы данных в Python

Оглавление

Теперь вы знаете как взаимодействовать с интерпретатором Python и выполнять код Python. Пришло время углубиться в язык Python. Сначала мы обсудим основные типы данных, которые встроены в Python.

Вот что вы узнаете в этом уроке:

  • Вы узнаете о нескольких основных числовых, строковых и булевых типах, которые встроены в Python. К концу этого урока вы будете знать, как выглядят объекты этих типов и как их представлять.
  • Вы также получите представление о встроенных функциях Python. Это заранее написанные фрагменты кода, которые вы можете вызывать для выполнения полезных действий. Вы уже познакомились с встроенной print() функцией , но есть и множество других.

Целые числа

В Python 3 фактически нет ограничений на длину целочисленного значения. Конечно, оно ограничено объемом памяти, которым располагает ваша система, как и все остальное, но помимо этого целое число может быть настолько длинным, насколько вам нужно:

>>> print(123123123123123123123123123123123123123123123123 + 1)
123123123123123123123123123123123123123123123124

Python интерпретирует последовательность десятичных цифр без префикса как десятичное число:

>>> print(10)
10

Следующие строки могут быть добавлены к целому значению, чтобы указать основание, отличное от 10:

Prefix Interpretation Base
0b (zero + lowercase letter 'b')
0B (zero + uppercase letter 'B')
Binary 2
0o (zero + lowercase letter 'o')
0O (zero + uppercase letter 'O')
Octal 8
0x (zero + lowercase letter 'x')
0X (zero + uppercase letter 'X')
Hexadecimal 16

Например:

>>> print(0o10)
8

>>> print(0x10)
16

>>> print(0b10)
2

Для получения дополнительной информации о целых значениях с недесятичными основаниями см. следующие сайты Википедии: Двоичная, Восьмеричная и Шестидесятеричная.

Базовый тип целого числа в Python, независимо от базы, используемой для его задания, называется int:

>>> type(10)
<class 'int'>
>>> type(0o10)
<class 'int'>
>>> type(0x10)
<class 'int'>

Примечание: Самое время упомянуть, что если вы хотите вывести значение на экран в сеансе REPL, вам не нужно использовать функцию print(). Просто введите значение в строку >>> и нажмите Enter, и оно будет выведено на экран:

>>> 10
10
>>> 0x10
16
>>> 0b10
2

Многие примеры в этой серии уроков будут использовать эту функцию.

Обратите внимание, что это не работает внутри файла сценария. Значение, появляющееся в файле сценария в строке само по себе, ничего не сделает.

Числа с плавающей точкой

Тип float в Python обозначает число с плавающей точкой. Значения float указываются с десятичной точкой. По желанию можно добавить символ e или E, за которым следует положительное или отрицательное целое число, чтобы указать в научной нотации:

>>> 4.2
4.2
>>> type(4.2)
<class 'float'>
>>> 4.
4.0
>>> .2
0.2

>>> .4e7
4000000.0
>>> type(.4e7)
<class 'float'>
>>> 4.2e-4
0.00042

Глубокое погружение: Представление с плавающей точкой

Ниже приведена более подробная информация о том, как Python представляет числа с плавающей точкой внутри. Вы можете легко использовать числа с плавающей точкой в Python, не понимая их на таком уровне, поэтому не волнуйтесь, если это покажется вам слишком сложным. Информация представлена здесь на случай, если вам интересно.

Почти все платформы представляют значения с плавающей точкой в Python как 64-битные значения "двойной точности", в соответствии со стандартом IEEE 754. В этом случае максимальное значение, которое может иметь число с плавающей точкой, составляет примерно 1,8 ⨉ 10308. Python обозначит число, превышающее это значение, строкой inf:

>>> 1.79e308
1.79e+308
>>> 1.8e308
inf

Самое близкое к нулю ненулевое число равно примерно 5,0 ⨉ 10-324. Все, что ближе к нулю, чем это, фактически равно нулю:

>>> 5e-324
5e-324
>>> 1e-325
0.0

Числа с плавающей точкой представляются внутри как двоичные дроби (основание-2). Большинство десятичных дробей не могут быть точно представлены в виде двоичных дробей, поэтому в большинстве случаев внутреннее представление числа с плавающей точкой является приближением к фактическому значению. На практике разница между фактическим и представленным значением очень мала и обычно не вызывает серьезных проблем.

Дальнейшее чтение: Дополнительную информацию о представлении данных с плавающей точкой в Python и возможных подводных камнях можно найти в Floating Point Arithmetic: Issues and Limitations в документации по Python.

Комплексные числа

Комплексные числа задаются как <real part>+<imaginary part>j. Например:

>>> 2+3j
(2+3j)
>>> type(2+3j)
<class 'complex'>

Строки

Строки - это последовательности символьных данных. Тип строк в Python называется str.

Строковые литералы могут быть разграничены с помощью одинарных или двойных кавычек. Все символы между открывающим и закрывающим разделителем являются частью строки:

>>> print("I am a string.")
I am a string.
>>> type("I am a string.")
<class 'str'>

>>> print('I am too.')
I am too.
>>> type('I am too.')
<class 'str'>

Строка в Python может содержать столько символов, сколько вы захотите. Единственное ограничение - ресурсы памяти вашей машины. Строка также может быть пустой:

>>> ''
''

Что, если вы хотите включить символ кавычек как часть самой строки? Первым побуждением может быть попытка сделать что-то вроде этого:

>>> print('This string contains a single quote (') character.')
SyntaxError: invalid syntax

Как видите, это не очень хорошо работает. Строка в этом примере открывается одиночной кавычкой, поэтому Python считает, что следующая одиночная кавычка, та, что в круглых скобках, которая должна была стать частью строки, является закрывающим разделителем. Заключительная одинарная кавычка оказывается лишней и вызывает синтаксическую ошибку, показанную на рисунке.

Если вы хотите включить в строку любой из типов символов кавычек, самый простой способ - разделить строку символами другого типа. Если строка должна содержать одинарную кавычку, разделите ее двойными кавычками, и наоборот:

>>> print("This string contains a single quote (') character.")
This string contains a single quote (') character.

>>> print('This string contains a double quote (") character.')
This string contains a double quote (") character.

Последовательности в строках

Иногда требуется, чтобы Python по-другому интерпретировал символ или последовательность символов в строке. Это может происходить одним из двух способов:

  • Вы можете захотеть подавить специальную интерпретацию, которая обычно дается определенным символам в строке.
  • Вы можете захотеть применить специальную интерпретацию к символам в строке, которые обычно воспринимаются буквально.

Для этого можно использовать символ обратной косой черты (\). Символ обратной косой черты в строке указывает на то, что один или несколько следующих за ним символов должны обрабатываться особым образом. (Это называется последовательностью экранирования, поскольку обратная косая черта заставляет последующую последовательность символов "уйти" от своего обычного значения.)

Давайте посмотрим, как это работает.

Подавление значения специальных символов

Вы уже видели, с какими проблемами можно столкнуться при попытке включить в строку символы кавычек. Если строка разграничена одинарными кавычками, вы не можете напрямую указать символ одинарной кавычки как часть строки, потому что для этой строки одинарная кавычка имеет особое значение - она завершает строку:

>>> print('This string contains a single quote (') character.')
SyntaxError: invalid syntax

Указывая обратную косую черту перед символом кавычек в строке, вы "убегаете" от него и заставляете Python подавить его обычное специальное значение. Тогда он интерпретируется просто как буквальный символ одиночной кавычки:

>>> print('This string contains a single quote (\') character.')
This string contains a single quote (') character.

То же самое работает и в строке, разделенной двойными кавычками:

>>> print("This string contains a double quote (\") character.")
This string contains a double quote (") character.

Ниже приведена таблица управляющих последовательностей, которые заставляют Python подавлять обычную специальную интерпретацию символа в строке:

Escape
Sequence
Usual Interpretation of
Character(s) After Backslash
“Escaped” Interpretation
\' Terminates string with single quote opening delimiter Literal single quote (') character
\" Terminates string with double quote opening delimiter Literal double quote (") character
\<newline> Terminates input line Newline is ignored
\\ Introduces escape sequence Literal backslash (\) character

Обычно символ новой строки завершает ввод строки. Поэтому нажатие Enter в середине строки заставит Python подумать, что она не завершена:

>>> print('a

SyntaxError: EOL while scanning string literal

Чтобы разбить строку на более чем одну строку, включите обратную косую черту перед каждой новой строкой, и новые строки будут игнорироваться:

>>> print('a\
... b\
... c')
abc

Чтобы включить в строку литеральную обратную косую черту, выделите ее обратной косой чертой:

>>> print('foo\\bar')
foo\bar

Придание специального значения символам

Далее, предположим, вам нужно создать строку, содержащую символ табуляции. Некоторые текстовые редакторы могут позволить вам вставить символ табуляции непосредственно в ваш код. Но многие программисты считают это плохой практикой по нескольким причинам:

  • Компьютер может отличить символ табуляции от последовательности символов пробела, а вы - нет. Для человека, читающего код, символы табуляции и пробела визуально неразличимы.
  • Некоторые текстовые редакторы настроены на автоматическое удаление символов табуляции, расширяя их до соответствующего количества пробелов.
  • Некоторые среды Python REPL не будут вставлять табуляции в код.

В Python (и почти во всех других распространенных компьютерных языках) символ табуляции можно задать с помощью управляющей последовательности \t:

>>> print('foo\tbar')
foo     bar

Последовательность, которую можно перевести как \t, приводит к тому, что символ t теряет свое обычное значение - буквальное t. Вместо этого комбинация интерпретируется как символ табуляции.

Вот список управляющих последовательностей, которые заставляют Python применять специальное значение вместо буквальной интерпретации:

Escape Sequence “Escaped” Interpretation
\a ASCII Bell (BEL) character
\b ASCII Backspace (BS) character
\f ASCII Formfeed (FF) character
\n ASCII Linefeed (LF) character
\N{<name>} Character from Unicode database with given <name>
\r ASCII Carriage Return (CR) character
\t ASCII Horizontal Tab (TAB) character
\uxxxx Unicode character with 16-bit hex value xxxx
\Uxxxxxxxx Unicode character with 32-bit hex value xxxxxxxx
\v ASCII Vertical Tab (VT) character
\ooo Character with octal value ooo
\xhh Character with hex value hh

Примеры:

>>> print("a\tb")
a    b
>>> print("a\141\x61")
aaa
>>> print("a\nb")
a
b
>>> print('\u2192 \N{rightwards arrow}')
→ →

Этот тип управляющей последовательности обычно используется для вставки символов, которые не могут быть легко сгенерированы с клавиатуры или не могут быть легко прочитаны или напечатаны.

Сырые строки

Перед литералом необработанной строки ставится r или R, что указывает на то, что управляющие последовательности в связанной строке не транслируются. Символ обратной косой черты оставляется в строке:

>>> print('foo\nbar')
foo
bar
>>> print(r'foo\nbar')
foo\nbar

>>> print('foo\\bar')
foo\bar
>>> print(R'foo\\bar')
foo\\bar

Строки с тройными кавычками

В Python существует еще один способ разграничения строк. Строки, заключенные в тройные кавычки, разграничиваются соответствующими группами из трех одинарных или трех двойных кавычек. Последовательности экранирования по-прежнему работают в строках с тройными кавычками, но одинарные кавычки, двойные кавычки и новые строки можно включать без экранирования. Это позволяет создать строку, содержащую как одинарные, так и двойные кавычки:

>>> print('''This string has a single (') and a double (") quote.''')
This string has a single (') and a double (") quote.

Поскольку новые строки можно включать, не экранируя их, это также позволяет создавать многострочные строки:

>>> print("""This is a
string that spans
across several lines""")
This is a
string that spans
across several lines

В предстоящем уроке по структуре программ на Python вы увидите, как строки в тройных кавычках можно использовать для добавления поясняющего комментария к коду на Python.

Булевский тип, булевский контекст и "истинность"

Python 3 предоставляет тип данных Boolean. Объекты типа Boolean могут иметь одно из двух значений, True или False:

>>> type(True)
<class 'bool'>
>>> type(False)
<class 'bool'>

Как вы увидите в следующих уроках, выражения в Python часто оцениваются в булевом контексте, то есть они интерпретируются как истина или ложь. Значение, которое является истинным в булевом контексте, иногда называют "правдивым", а значение, которое является ложным в булевом контексте, - "ложным". (Вы также можете встретить написание "falsy" как "falsey")

"Истинность" объекта булева типа очевидна: Булевы объекты, равные True, являются истинными (true), а равные False - ложными (false). Но и небулевы объекты могут быть оценены в булевом контексте и определены как истинные или ложные.

Вы узнаете больше об оценке объектов в булевом контексте, когда столкнетесь с логическими операторами в предстоящем уроке по операторам и выражениям в Python.

Встроенные функции

Интерпретатор Python поддерживает множество встроенных функций: шестьдесят восемь, начиная с Python 3.6. О многих из них вы узнаете из следующих обсуждений, когда они будут появляться в контексте.

На данный момент мы приводим краткий обзор, чтобы дать представление о том, что доступно. Более подробная информация содержится в документации по встроенным функциям в Python. Многие из следующих описаний относятся к темам и концепциям, которые будут рассмотрены в будущих учебниках.

Математика

Function Description
abs() Returns absolute value of a number
divmod() Returns quotient and remainder of integer division
max() Returns the largest of the given arguments or items in an iterable
min() Returns the smallest of the given arguments or items in an iterable
pow() Raises a number to a power
round() Rounds a floating-point value
sum() Sums the items of an iterable

Преобразование типов

Function Description
ascii() Returns a string containing a printable representation of an object
bin() Converts an integer to a binary string
bool() Converts an argument to a Boolean value
chr() Returns string representation of character given by integer argument
complex() Returns a complex number constructed from arguments
float() Returns a floating-point object constructed from a number or string
hex() Converts an integer to a hexadecimal string
int() Returns an integer object constructed from a number or string
oct() Converts an integer to an octal string
ord() Returns integer representation of a character
repr() Returns a string containing a printable representation of an object
str() Returns a string version of an object
type() Returns the type of an object or creates a new type object

Переменные и итераторы

Function Description
all() Returns True if all elements of an iterable are true
any() Returns True if any elements of an iterable are true
enumerate() Returns a list of tuples containing indices and values from an iterable
filter() Filters elements from an iterable
iter() Returns an iterator object
len() Returns the length of an object
map() Applies a function to every item of an iterable
next() Retrieves the next item from an iterator
range() Generates a range of integer values
reversed() Returns a reverse iterator
slice() Returns a slice object
sorted() Returns a sorted list from an iterable
zip() Creates an iterator that aggregates elements from iterables

Композитный тип данных

Function Description
bytearray() Creates and returns an object of the bytearray class
bytes() Creates and returns a bytes object (similar to bytearray, but immutable)
dict() Creates a dict object
frozenset() Creates a frozenset object
list() Creates a list object
object() Creates a new featureless object
set() Creates a set object
tuple() Creates a tuple object

Классы, атрибуты и наследование

Function Description
classmethod() Returns a class method for a function
delattr() Deletes an attribute from an object
getattr() Returns the value of a named attribute of an object
hasattr() Returns True if an object has a given attribute
isinstance() Determines whether an object is an instance of a given class
issubclass() Determines whether a class is a subclass of a given class
property() Returns a property value of a class
setattr() Sets the value of a named attribute of an object
super() Returns a proxy object that delegates method calls to a parent or sibling class

Ввод/вывод

Function Description
format() Converts a value to a formatted representation
input() Reads input from the console
open() Opens a file and returns a file object
print() Prints to a text stream or the console

Переменные, ссылки и область применения

Function Description
dir() Returns a list of names in current local scope or a list of object attributes
globals() Returns a dictionary representing the current global symbol table
id() Returns the identity of an object
locals() Updates and returns a dictionary representing current local symbol table
vars() Returns __dict__ attribute for a module, class, or object

Разное

Function Description
callable() Returns True if object appears callable
compile() Compiles source into a code or AST object
eval() Evaluates a Python expression
exec() Implements dynamic execution of Python code
hash() Returns the hash value of an object
help() Invokes the built-in help system
memoryview() Returns a memory view object
staticmethod() Returns a static method for a function
__import__() Invoked by the import statement

Заключение

В этом уроке вы узнали о встроенных типах данных и функциях, которые предоставляет Python.

Все приведенные до сих пор примеры манипулировали и отображали только постоянные значения. В большинстве программ обычно требуется создавать объекты, значение которых меняется по мере выполнения программы.

Перейдите к следующему уроку, чтобы узнать о переменных Python.

Вернуться на верх