Документация Python неофициальный перевод
Содержание страницы

5. Встроенные типыBuilt-in Types

В следующих разделах описываются стандартные типы, встроенные в интерпретатор.

Примечание

Исторически (до выхода версии 2.2) встроенные типы Python отличались от пользовательских типов, поскольку их нельзя было использовать в качестве основы для объектно-ориентированного наследования. Теперь этого ограничения больше нет.

Основные встроенные типы – это числа, последовательности, отображения, файлы, классы, экземпляры и исключения.

Некоторые операции поддерживаются несколькими типами объектов; в частности, практически все объекты можно сравнивать, проверять на истинность и преобразовывать в строку (с помощью функции repr() или несколько отличающейся функции str()). Последняя функция неявно используется, когда объект выводится функцией print().

5.1. Проверка истинностиTruth Value Testing

Любой объект может быть проверен на истинность для использования в условии if или while, а также в качестве операнда булевых операций ниже. Следующие значения считаются ложными:

  • None

  • False

  • ноль любого числового типа, например, 0, 0L, 0.0, 0j.

  • любая пустая последовательность, например, '', (), [].

  • любое пустое отображение, например, {}.

  • экземпляры пользовательских классов, если класс определяет метод __nonzero__() или __len__(), и этот метод возвращает целый ноль или значение bool False. 1

Все остальные значения считаются истинными – поэтому объекты многих типов всегда истинны.

Операции и встроенные функции, возвращающие булев результат, всегда возвращают 0 или False для ложного и 1 или True для истинного, если не указано иное. (Важное исключение: булевы операции or и and всегда возвращают один из своих операндов.)

5.2. Булевы операции – and, or, notBoolean Operations – and, or, not

Это булевы операции в порядке возрастания приоритета:

Операция

Результат

Примечания

x or y

если x ложно, то y, иначе x

(1)

x and y

если x ложно, то x, иначе y

(2)

not x

если x ложно, то True, иначе False

(3)

Примечания:

  1. Это оператор с сокращённым вычислением: второй аргумент вычисляется, только если первый ложен.

  2. Это оператор с сокращённым вычислением: второй аргумент вычисляется, только если первый истинен.

  3. not имеет более низкий приоритет, чем небулевы операторы, поэтому not a == b интерпретируется как not (a == b), а a == not b является синтаксической ошибкой.

5.3. СравненияComparisons

Операции сравнения поддерживаются всеми объектами. Все они имеют одинаковый приоритет (который выше, чем у логических операций). Сравнения можно произвольно объединять в цепочки; например, x < y <= z эквивалентно x < y and y <= z, за исключением того, что y вычисляется только один раз (но в обоих случаях z не вычисляется вообще, если x < y оказывается ложным).

В этой таблице приведены операции сравнения:

Операция

Значение

Примечания

<

строго меньше

<=

меньше или равно

>

строго больше

>=

больше или равно

==

равно

!=

не равно

(1)

is

идентичность объектов

is not

отрицание идентичности объектов

Примечания:

  1. != можно также записать как <>, но это устаревшее использование, сохранённое только для обратной совместимости. В новом коде всегда следует использовать !=.

Объекты разных типов, за исключением разных числовых типов и разных строковых типов, никогда не сравниваются как равные; такие объекты упорядочиваются последовательно, но произвольно (таким образом, сортировка разнородного массива даёт согласованный результат). Кроме того, некоторые типы (например, файловые объекты) поддерживают лишь вырожденное понятие сравнения, при котором любые два объекта этого типа неравны. Опять же, такие объекты упорядочиваются произвольно, но последовательно. Операторы <, <=, > и >= вызовут исключение TypeError, если любой операнд является комплексным числом.

Неидентичные экземпляры класса обычно сравниваются как неравные, если только класс не определяет метод __eq__() или метод __cmp__().

Экземпляры класса нельзя упорядочить по отношению к другим экземплярам того же класса или объектам других типов, если только класс не определяет достаточное количество методов расширенного сравнения (__lt__(), __le__(), __gt__() и __ge__()) или метод __cmp__().

Особенности реализации CPython: Объекты разных типов, кроме чисел, упорядочиваются по именам своих типов; объекты одного типа, которые не поддерживают надлежащего сравнения, упорядочиваются по своему адресу.

Ещё две операции с тем же синтаксическим приоритетом, in и not in, поддерживаются только типами последовательностей (см. ниже).

5.4. Числовые типы – int, float, long, complexNumeric Types – int, float, long, complex

Существует четыре различных числовых типа: обычные целые числа, длинные целые числа, числа с плавающей точкой и комплексные числа. Кроме того, логические значения являются подтипом обычных целых чисел. Обычные целые числа (также называемые целыми числами) реализованы с использованием long в C, что даёт им точность не менее 32 бит (sys.maxint всегда установлено в максимальное значение обычного целого для текущей платформы, минимальное значение – -sys.maxint - 1). Длинные целые числа имеют неограниченную точность. Числа с плавающей точкой обычно реализуются с помощью double в C; информация о точности и внутреннем представлении чисел с плавающей точкой для машины, на которой выполняется программа, доступна в sys.float_info. Комплексные числа имеют действительную и мнимую части, каждая из которых является числом с плавающей точкой. Чтобы извлечь эти части из комплексного числа z, используйте z.real и z.imag. (Стандартная библиотека включает дополнительные числовые типы: fractions, хранящие рациональные числа, и decimal, хранящие числа с плавающей точкой с настраиваемой точностью.)

Числа создаются с помощью числовых литералов или как результат встроенных функций и операторов. Обычные целочисленные литералы (включая двоичные, шестнадцатеричные и восьмеричные числа) дают обычные целые числа, если только обозначаемое ими значение не слишком велико для представления в виде обычного целого; в этом случае они дают длинное целое число. Целочисленные литералы с суффиксом 'L' или 'l' дают длинные целые числа ('L' предпочтительнее, потому что 1l слишком похоже на одиннадцать!). Числовые литералы, содержащие десятичную точку или знак экспоненты, дают числа с плавающей точкой. Добавление 'j' или 'J' к числовому литералу даёт мнимое число (комплексное число с нулевой действительной частью), которое можно добавить к целому числу или числу с плавающей точкой, чтобы получить комплексное число с действительной и мнимой частями.

Python полностью поддерживает смешанную арифметику: когда бинарный арифметический оператор имеет операнды разных числовых типов, операнд с более «узким» типом расширяется до типа другого операнда, при этом обычное целое у́же длинного целого, длинное целое у́же числа с плавающей точкой, а число с плавающей точкой у́же комплексного. Сравнения между числами смешанных типов используют то же правило. 2 Конструкторы int(), long(), float() и complex() можно использовать для получения чисел конкретного типа.

Все встроенные числовые типы поддерживают следующие операции. Смотрите Оператор возведения в степень и последующие разделы для получения информации о приоритетах операторов.

Операция

Результат

Примечания

x + y

сумма x и y

x - y

разность x и y

x * y

произведение x и y

x / y

частное x и y

(1)

x // y

частное (с округлением вниз) от деления x на y

(4)(5)

x % y

остаток от x / y

(4)

-x

x с обратным знаком

+x

x без изменений

abs(x)

абсолютное значение или модуль x

(3)

int(x)

x, преобразованное в целое число

(2)

long(x)

x, преобразованное в длинное целое

(2)

float(x)

x, преобразованное в число с плавающей запятой

(6)

complex(re,im)

комплексное число с действительной частью re и мнимой частью im. im по умолчанию равно нулю.

c.conjugate()

сопряжённое комплексного числа c. (Тождественно для действительных чисел)

divmod(x, y)

пара (x // y, x % y)

(3)(4)

pow(x, y)

x в степени y

(3)(7)

x ** y

x в степени y

(7)

Примечания:

  1. Для целочисленного деления (обычных или длинных целых) результатом является целое число. Результат всегда округляется в сторону минус бесконечности: 1/2 равно 0, (-1)/2 равно -1, 1/(-2) равно -1 и (-1)/(-2) равно 0. Обратите внимание, что результат будет длинным целым, если хотя бы один операнд является длинным целым, независимо от числового значения.

  2. Преобразование из чисел с плавающей точкой с помощью int() или long() отбрасывает дробную часть в сторону нуля, как и родственная функция math.trunc(). Используйте функцию math.floor() для округления вниз и math.ceil() для округления вверх.

  3. См. Встроенные функции для полного описания.

  4. Устарело с версии 2.3: Оператор целочисленного деления, оператор взятия остатка и функция divmod() больше не определены для комплексных чисел. Вместо этого при необходимости преобразуйте в число с плавающей точкой с помощью функции abs().

  5. Также называется целочисленным делением. Результирующее значение является целым числом, хотя тип результата не обязательно int.

  6. float также принимает строки “nan” и “inf” с необязательным префиксом “+” или “-” для Not a Number (NaN) и положительной или отрицательной бесконечности.

    Новое в версии 2.6.

  7. Python определяет pow(0, 0) и 0 ** 0 как 1, что общепринято для языков программирования.

Все типы numbers.Real (int, long и float) также включают следующие операции:

Операция

Результат

math.trunc(x)

x, усечённое до Integral

round(x[, n])

x, округлённое до n знаков, с округлением половинок от нуля. Если n опущено, по умолчанию используется 0.

math.floor(x)

наибольшее целое число в виде float, меньшее или равное x

math.ceil(x)

наименьшее целое число в виде float, большее или равное x

5.4.1. Побитовые операции над целыми типамиBitwise Operations on Integer Types

Побитовые операции имеют смысл только для целых чисел. Отрицательные числа интерпретируются как их дополнительный код (при этом предполагается, что количество битов достаточно велико, чтобы при операции не произошло переполнения).

Приоритеты двоичных побитовых операций ниже, чем у числовых операций, и выше, чем у сравнений; унарная операция ~ имеет тот же приоритет, что и другие унарные числовые операции (+ и -).

В этой таблице перечислены побитовые операции, отсортированные по возрастанию приоритета:

Операция

Результат

Примечания

x | y

побитовое ИЛИ для x и y

x ^ y

побитовое исключающее ИЛИ для x и y

x & y

побитовое И для x и y

x << n

x, сдвинутое влево на n битов

(1)(2)

x >> n

x, сдвинутое вправо на n битов

(1)(3)

~x

инвертированные биты x

Примечания:

  1. Отрицательные значения сдвига недопустимы и вызывают ValueError.

  2. Сдвиг влево на n бит эквивалентен умножению на pow(2, n). Если результат превышает диапазон обычных целых чисел, возвращается длинное целое.

  3. Сдвиг вправо на n бит эквивалентен делению на pow(2, n).

5.4.2. Дополнительные методы целых типовAdditional Methods on Integer Types

Целочисленные типы реализуют numbers.Integral абстрактный базовый класс. Кроме того, они предоставляют ещё один метод:

int.bit_length()
long.bit_length()

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

>>> n = -37
>>> bin(n)
'-0b100101'
>>> n.bit_length()
6

Более точно, если x ненулевое, то x.bit_length() – это единственное положительное целое k, такое что 2**(k-1) <= abs(x) < 2**k. Эквивалентно, когда abs(x) достаточно мало, чтобы иметь правильно округлённый логарифм, то k = 1 + int(log(abs(x), 2)). Если x равно нулю, то x.bit_length() возвращает 0.

Эквивалентно следующему:

def bit_length(self):
    s = bin(self)       # двоичное представление:  bin(-37) --> '-0b100101'
    s = s.lstrip('-0b') # удалить ведущие нули и знак минус
    return len(s)       # len('100101') --> 6

Новое в версии 2.7.

5.4.3. Дополнительные методы типа floatAdditional Methods on Float

Тип float реализует numbers.Real абстрактный базовый класс. Кроме того, float имеет следующие дополнительные методы.

float.as_integer_ratio()

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

Новое в версии 2.6.

float.is_integer()

Возвращает True, если экземпляр float является конечным и имеет целочисленное значение, и False в противном случае:

>>> (-2.0).is_integer()
True
>>> (3.2).is_integer()
False

Новое в версии 2.6.

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

float.hex()

Возвращает представление числа с плавающей запятой в виде шестнадцатеричной строки. Для конечных чисел с плавающей запятой это представление всегда будет содержать ведущий 0x и завершающий p и экспоненту.

Новое в версии 2.6.

float.fromhex(s)

Метод класса, возвращающий число с плавающей запятой, представленное шестнадцатеричной строкой s. Строка s может содержать начальные и конечные пробелы.

Новое в версии 2.6.

Обратите внимание, что float.hex() – это метод экземпляра, а float.fromhex() – метод класса.

Шестнадцатеричная строка имеет вид:

[sign] ['0x'] integer ['.' fraction] ['p' exponent]

где необязательный sign может быть либо +, либо -, integer и fraction – строки шестнадцатеричных цифр, а exponent – десятичное целое с необязательным ведущим знаком. Регистр не имеет значения, и должна быть хотя бы одна шестнадцатеричная цифра в целой части либо в дробной. Этот синтаксис похож на синтаксис, указанный в разделе 6.4.4.2 стандарта C99, а также на синтаксис, используемый в Java 1.5 и выше. В частности, результат float.hex() может использоваться как шестнадцатеричный литерал с плавающей запятой в коде C или Java, а шестнадцатеричные строки, созданные символом формата %a в C или Double.toHexString в Java, принимаются float.fromhex().

Обратите внимание, что экспонента записывается в десятичном, а не шестнадцатеричном виде, и что она указывает степень двойки, на которую умножается коэффициент. Например, шестнадцатеричная строка 0x3.a7p10 представляет число с плавающей запятой (3 + 10./16 + 7./16**2) * 2.0**10, или 3740.0:

>>> float.fromhex('0x3.a7p10')
3740.0

Применение обратного преобразования к 3740.0 даёт другую шестнадцатеричную строку, представляющую то же число:

>>> float.hex(3740.0)
'0x1.d380000000000p+11'

5.5. Типы итераторовIterator Types

Новое в версии 2.2.

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

Для поддержки итерации в объектах-контейнерах необходимо определить один метод:

container.__iter__()

Возвращает объект-итератор. Этот объект должен поддерживать протокол итератора, описанный ниже. Если контейнер поддерживает разные типы итерации, можно предоставить дополнительные методы для явного запроса итераторов для этих типов. (Примером объекта, поддерживающего несколько форм итерации, может служить древовидная структура, поддерживающая обход как в ширину, так и в глубину.) Этот метод соответствует слоту tp_iter структуры типа для объектов Python в API Python/C.

Сами объекты итераторов должны поддерживать следующие два метода, которые вместе образуют протокол итератора:

iterator.__iter__()

Возвращает сам объект-итератор. Это необходимо, чтобы контейнеры и итераторы можно было использовать с операторами for и in. Данный метод соответствует слоту tp_iter структуры типа для объектов Python в API Python/C.

iterator.next()

Возвращает следующий элемент из контейнера. Если больше элементов нет, возбуждает исключение StopIteration. Этот метод соответствует слоту tp_iternext структуры типа для объектов Python в API Python/C.

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

Протокол предполагает, что если метод next() итератора однажды возбудил StopIteration, то при последующих вызовах он будет продолжать возбуждать то же исключение. Реализации, нарушающие это правило, считаются некорректными. (Ограничение добавлено в Python 2.3; в Python 2.2 многие итераторы этому правилу не соответствовали.)

5.5.1. Типы генераторовGenerator Types

Python генераторы предоставляют удобный способ реализации протокола итератора. Если метод __iter__() объекта-контейнера реализован как генератор, он автоматически возвращает объект итератора (технически объект генератора), предоставляющий методы __iter__() и next(). Дополнительную информацию о генераторах можно найти в документации по выражению yield.

5.6. Типы последовательностей – str, unicode, list, tuple, bytearray, buffer, xrangeSequence Types – str, unicode, list, tuple, bytearray, buffer, xrange

Существует семь типов последовательностей: строки, строки Unicode, списки, кортежи, bytearrays, buffers и объекты xrange.

Для других контейнеров см. встроенные классы dict и set, а также модуль collections.

Строковые литералы записываются в одинарных или двойных кавычках: 'xyzzy', "frobozz". См. Строковые литералы для получения дополнительной информации о строковых литералах. Строки Unicode во многом похожи на строки, но в синтаксисе обозначаются предшествующим символом 'u': u'abc', u"def". В дополнение к описанной здесь функциональности существуют также строковые методы, описанные в разделе Строковые методы. Списки создаются с помощью квадратных скобок, элементы разделяются запятыми: [a, b, c]. Кортежи создаются оператором запятой (не в квадратных скобках), с enclosing parentheses или без, но пустой кортеж должен заключаться в скобки, например a, b, c или (). Кортеж из одного элемента должен иметь завершающую запятую, например (d,).

Объекты bytearray создаются с помощью встроенной функции bytearray().

Объекты buffer не поддерживаются напрямую синтаксисом Python, но могут быть созданы вызовом встроенной функции buffer(). Они не поддерживают конкатенацию или повторение.

Объекты типа xrange похожи на буферы тем, что для их создания нет специального синтаксиса, но они создаются с помощью функции xrange(). Они не поддерживают срезы, конкатенацию или повторение, и использование in, not in, min() или max() для них неэффективно.

Большинство типов последовательностей поддерживают следующие операции. Операции in и not in имеют тот же приоритет, что и операции сравнения. Операции + и * имеют тот же приоритет, что и соответствующие числовые операции. 3 Дополнительные методы предоставляются для Изменяемых типов последовательностей.

В этой таблице перечислены операции над последовательностями, отсортированные по возрастанию приоритета. В таблице s и t – последовательности одного типа; n, i и j – целые числа.

Операция

Результат

Примечания

x in s

True, если элемент последовательности s равен x, иначе False

(1)

x not in s

False, если элемент последовательности s равен x, иначе True

(1)

s + t

конкатенация s и t

(6)

s * n, n * s

эквивалентно сложению s с собой n раз

(2)

s[i]

i-й элемент s, начиная с 0

(3)

s[i:j]

срез s от i до j

(3)(4)

s[i:j:k]

срез s от i до j с шагом k

(3)(5)

len(s)

длина s

min(s)

наименьший элемент s

max(s)

наибольший элемент s

s.index(x)

индекс первого вхождения x в s

s.count(x)

общее количество вхождений x в s

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

Примечания:

  1. Когда s является строкой или строкой Unicode, операции in и not in действуют как проверка на подстроку. В версиях Python до 2.3 x должна была быть строкой длины 1. В Python 2.3 и новее x может быть строкой любой длины.

  2. Значения n меньше 0 трактуются как 0 (что даёт пустую последовательность того же типа, что и s). Обратите внимание: элементы последовательности s не копируются; на них ссылаются многократно. Это часто преследует начинающих программистов Python; рассмотрите:

    >>> lists = [[]] * 3
    >>> lists
    [[], [], []]
    >>> lists[0].append(3)
    >>> lists
    [[3], [3], [3]]
    

    Произошло следующее: [[]] – это список из одного элемента, содержащего пустой список, поэтому все три элемента [[]] * 3 являются ссылками на этот единственный пустой список. Изменение любого из элементов lists изменяет этот единственный список. Создать список из разных списков можно так:

    >>> lists = [[] for i in range(3)]
    >>> lists[0].append(3)
    >>> lists[1].append(5)
    >>> lists[2].append(7)
    >>> lists
    [[3], [5], [7]]
    

    Подробное объяснение доступно в разделе FAQ Как создать многомерный список?.

  3. Если i или j отрицательно, индекс отсчитывается от конца последовательности s: подставляется len(s) + i или len(s) + j. Но обратите внимание, что -0 по-прежнему равно 0.

  4. Срез s от i до j определяется как последовательность элементов с индексом k, для которых i <= k < j. Если i или j больше len(s), используйте len(s). Если i опущен или равен None, используйте 0. Если j опущен или равен None, используйте len(s). Если i больше или равно j, срез пуст.

  5. The slice of s from i to j with step k is defined as the sequence of items with index x = i + n*k such that 0 <= n < (j-i)/k. In other words, the indices are i, i+k, i+2*k, i+3*k and so on, stopping when j is reached (but never including j). When k is positive, i and j are reduced to len(s) if they are greater. When k is negative, i and j are reduced to len(s) - 1 if they are greater. If i or j are omitted or None, they become “end” values (which end depends on the sign of k). Note, k cannot be zero. If k is None, it is treated like 1.

  6. Особенность реализации CPython: Если s и t обе являются строками, некоторые реализации Python, такие как CPython, обычно могут выполнять оптимизацию на месте для присваиваний вида s = s + t или s += t. Когда это применимо, такая оптимизация значительно снижает вероятность квадратичного времени выполнения. Эта оптимизация зависит от версии и реализации. Для кода, чувствительного к производительности, предпочтительнее использовать метод str.join(), который гарантирует стабильную линейную производительность конкатенации во всех версиях и реализациях.

    Изменено в версии 2.4: Ранее конкатенация строк никогда не выполнялась на месте.

5.6.1. Строковые методыString Methods

Ниже перечислены строковые методы, которые поддерживаются как 8-битными строками, так и объектами Unicode. Некоторые из них также доступны для объектов bytearray.

Кроме того, строки Python поддерживают методы типов последовательностей, описанные в разделе Типы последовательностей – str, unicode, list, tuple, bytearray, buffer, xrange. Для вывода форматированных строк используйте строки шаблонов или оператор %, описанный в разделе Операции форматирования строк. Также см. модуль re для строковых функций на основе регулярных выражений.

str.capitalize()

Возвращает копию строки, в которой первый символ переведён в верхний регистр, а остальные – в нижний.

Для 8-битных строк этот метод зависит от локали.

str.center(width[, fillchar])

Возвращает строку длины width, в которой исходная строка располагается по центру. Заполнение выполняется с использованием указанного символа fillchar (по умолчанию пробел).

Изменено в версии 2.4: Добавлена поддержка аргумента fillchar.

str.count(sub[, start[, end]])

Возвращает количество непересекающихся вхождений подстроки sub в диапазоне [start, end]. Необязательные аргументы start и end интерпретируются как в нотации срезов.

str.decode([encoding[, errors]])

Декодирует строку с помощью кодека, зарегистрированного для encoding. encoding по умолчанию берётся из кодировки строки по умолчанию. errors можно задать для установки другой схемы обработки ошибок. По умолчанию используется 'strict', что означает, что ошибки кодирования вызывают UnicodeError. Другие возможные значения: 'ignore', 'replace' и любые другие имена, зарегистрированные через codecs.register_error(); см. раздел Базовые классы кодеков.

Новое в версии 2.2.

Изменено в версии 2.3: Добавлена поддержка других схем обработки ошибок.

Изменено в версии 2.7: Добавлена поддержка именованных аргументов.

str.encode([encoding[, errors]])

Возвращает закодированную версию строки. Кодировка по умолчанию – текущая строковая кодировка по умолчанию. errors можно задать для установки другой схемы обработки ошибок. Значение по умолчанию для errors'strict', то есть ошибки кодирования вызывают UnicodeError. Другие возможные значения: 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' и любые другие имена, зарегистрированные через codecs.register_error(); см. раздел Базовые классы кодеков. Список возможных кодировок см. в разделе Стандартные кодировки.

Новое в версии 2.0.

Изменено в версии 2.3: Добавлена поддержка 'xmlcharrefreplace' и 'backslashreplace' и других схем обработки ошибок.

Изменено в версии 2.7: Добавлена поддержка именованных аргументов.

str.endswith(suffix[, start[, end]])

Возвращает True, если строка заканчивается указанным suffix, иначе возвращает False. suffix также может быть кортежем суффиксов для поиска. С необязательным start проверка начинается с этой позиции. С необязательным end сравнение прекращается на этой позиции.

Изменено в версии 2.5: Принимает кортежи в качестве suffix.

str.expandtabs([tabsize])

Возвращает копию строки, в которой все символы табуляции заменены на один или несколько пробелов в зависимости от текущей позиции столбца и заданного размера табуляции. Позиции табуляции находятся через каждые tabsize символов (по умолчанию 8, что даёт позиции табуляции на столбцах 0, 8, 16 и т.д.). Для разворачивания строки текущий столбец устанавливается в ноль, и строка просматривается посимвольно. Если символ – табуляция (\t), в результат вставляется один или несколько пробелов, пока текущий столбец не сравняется со следующей позицией табуляции. (Сам символ табуляции не копируется.) Если символ – новая строка (\n) или возврат каретки (\r), он копируется, а текущий столбец сбрасывается в ноль. Любой другой символ копируется без изменений, и текущий столбец увеличивается на единицу независимо от того, как этот символ представлен при печати.

>>> '01\t012\t0123\t01234'.expandtabs()
'01      012     0123    01234'
>>> '01\t012\t0123\t01234'.expandtabs(4)
'01  012 0123    01234'
str.find(sub[, start[, end]])

Возвращает наименьший индекс в строке, где подстрока sub найдена в срезе s[start:end]. Необязательные аргументы start и end интерпретируются как в записи среза. Возвращает -1, если sub не найдена.

Примечание

Метод find() следует использовать только если нужно знать позицию sub. Чтобы проверить, является ли sub подстрокой, используйте оператор in:

>>> 'Py' in 'Python'
True
str.format(*args, **kwargs)

Выполняет операцию форматирования строки. Строка, к которой применяется этот метод, может содержать буквальный текст или поля замены, ограниченные фигурными скобками {}. Каждое поле замены содержит либо числовой индекс позиционного аргумента, либо имя именованного аргумента. Возвращает копию строки, в которой каждое поле замены заменено строковым значением соответствующего аргумента.

>>> "The sum of 1 + 2 is {0}".format(1+2)
'The sum of 1 + 2 is 3'

См. Синтаксис форматных строк для описания различных параметров форматирования, которые можно указать в форматных строках.

Этот метод форматирования строк – новый стандарт в Python 3, и в новом коде его следует предпочитать форматированию %, описанному в разделе «Операции форматирования строк».

Новое в версии 2.6.

str.index(sub[, start[, end]])

Как find(), но возбуждает ValueError, если подстрока не найдена.

str.isalnum()

Возвращает True, если все символы в строке являются буквенно-цифровыми и есть хотя бы один символ, иначе False.

Для 8-битных строк этот метод зависит от локали.

str.isalpha()

Возвращает True, если все символы в строке являются буквенными и есть хотя бы один символ, иначе False.

Для 8-битных строк этот метод зависит от локали.

str.isdigit()

Возвращает True, если все символы в строке являются цифрами и есть хотя бы один символ, иначе False.

Для 8-битных строк этот метод зависит от локали.

str.islower()

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

Для 8-битных строк этот метод зависит от локали.

str.isspace()

Возвращает true, если строка содержит только пробельные символы и длина строки не менее одного символа; в противном случае – false.

Для 8-битных строк этот метод зависит от локали.

str.istitle()

Возвращает true, если строка является строкой в заглавном регистре (titlecased) и есть хотя бы один символ, например прописные символы могут следовать только за символами без регистра, а строчные – только за символами с регистром. Иначе возвращает false.

Для 8-битных строк этот метод зависит от локали.

str.isupper()

Возвращает true, если все буквенные символы 4 в строке в верхнем регистре и есть хотя бы один такой символ, иначе false.

Для 8-битных строк этот метод зависит от локали.

str.join(iterable)

Возвращает строку, полученную конкатенацией строк из iterable. Если в iterable есть хотя бы один объект Unicode, возвращается строка Unicode. Исключение TypeError возбуждается, если в iterable есть значения, не являющиеся строками или объектами Unicode. Разделителем между элементами служит строка, вызвавшая этот метод.

str.ljust(width[, fillchar])

Возвращает строку, выровненную по левому краю до длины width. Заполнение выполняется указанным символом fillchar (по умолчанию пробел). Исходная строка возвращается, если width меньше или равно len(s).

Изменено в версии 2.4: Добавлена поддержка аргумента fillchar.

str.lower()

Возвращает копию строки, в которой все символы, имеющие регистр, 4 преобразованы в нижний регистр.

Для 8-битных строк этот метод зависит от локали.

str.lstrip([chars])

Возвращает копию строки с удалёнными начальными символами. Аргумент chars – это строка, задающая набор удаляемых символов. Если он опущен или равен None, аргумент chars по умолчанию удаляет пробельные символы. Аргумент chars – это не префикс; удаляются все комбинации входящих в него символов:

>>> '   spacious   '.lstrip()
'spacious   '
>>> 'www.example.com'.lstrip('cmowz.')
'example.com'

Изменено в версии 2.2.2: Добавлена поддержка аргумента chars.

str.partition(sep)

Разделяет строку по первому вхождению sep и возвращает кортеж из трёх элементов: часть до разделителя, сам разделитель и часть после разделителя. Если разделитель не найден, возвращает кортеж из трёх элементов, содержащий саму строку и две пустые строки.

Новое в версии 2.5.

str.replace(old, new[, count])

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

str.rfind(sub[, start[, end]])

Возвращает наибольший индекс в строке, на котором найдена подстрока sub, при условии что sub находится в пределах s[start:end]. Необязательные аргументы start и end интерпретируются как в записи среза. В случае неудачи возвращает -1.

str.rindex(sub[, start[, end]])

Как rfind(), но возбуждает ValueError, если подстрока sub не найдена.

str.rjust(width[, fillchar])

Возвращает строку, выровненную по правому краю до длины width. Заполнение выполняется указанным символом fillchar (по умолчанию пробел). Исходная строка возвращается, если width меньше или равно len(s).

Изменено в версии 2.4: Добавлена поддержка аргумента fillchar.

str.rpartition(sep)

Разделяет строку по последнему вхождению sep и возвращает кортеж из трёх элементов: часть до разделителя, сам разделитель и часть после разделителя. Если разделитель не найден, возвращает кортеж из трёх элементов, содержащий две пустые строки и саму строку.

Новое в версии 2.5.

str.rsplit([sep[, maxsplit]])

Возвращает список слов в строке, используя sep в качестве строки-разделителя. Если указан maxsplit, выполняется не более maxsplit разбиений, причём самых правых. Если sep не указан или равен None, в качестве разделителя используется любая строка из пробельных символов. За исключением разбиения справа, rsplit() ведёт себя как split(), подробно описанный ниже.

Новое в версии 2.4.

str.rstrip([chars])

Возвращает копию строки с удалёнными завершающими символами. Аргумент chars – это строка, задающая набор удаляемых символов. Если он опущен или равен None, аргумент chars по умолчанию удаляет пробельные символы. Аргумент chars не является суффиксом; вместо этого удаляются все комбинации его значений:

>>> '   spacious   '.rstrip()
'   spacious'
>>> 'mississippi'.rstrip('ipz')
'mississ'

Изменено в версии 2.2.2: Добавлена поддержка аргумента chars.

str.split([sep[, maxsplit]])

Возвращает список слов в строке, используя sep в качестве строки-разделителя. Если указан maxsplit, выполняется не более maxsplit разбиений (следовательно, список будет содержать не более maxsplit+1 элементов). Если maxsplit не указан или равен -1, ограничения на количество разбиений нет (выполняются все возможные разбиения).

Если указан sep, последовательные разделители не группируются, а считаются разделителями пустых строк (например, '1,,2'.split(',') возвращает ['1', '', '2']). Аргумент sep может состоять из нескольких символов (например, '1<>2<>3'.split('<>') возвращает ['1', '2', '3']). Разделение пустой строки с указанным разделителем возвращает [''].

Если sep не указан или равен None, применяется другой алгоритм разбиения: последовательности пробельных символов считаются одним разделителем, и результат не будет содержать пустых строк в начале или конце, если строка содержит начальные или завершающие пробелы. Следовательно, разбиение пустой строки или строки, состоящей только из пробелов, с разделителем None возвращает [].

Например, ' 1  2   3  '.split() возвращает ['1', '2', '3'], а '  1  2   3  '.split(None, 1) возвращает ['1', '2   3  '].

str.splitlines([keepends])

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

Python распознаёт "\r", "\n" и "\r\n" как границы строк для 8-битных строк.

Например:

>>> 'ab c\n\nde fg\rkl\r\n'.splitlines()
['ab c', '', 'de fg', 'kl']
>>> 'ab c\n\nde fg\rkl\r\n'.splitlines(True)
['ab c\n', '\n', 'de fg\r', 'kl\r\n']

В отличие от split(), когда задана строка-разделитель sep, этот метод возвращает пустой список для пустой строки, и концевой разрыв строки не приводит к появлению дополнительной строки:

>>> "".splitlines()
[]
>>> "One line\n".splitlines()
['One line']

Для сравнения, split('\n') возвращает:

>>> ''.split('\n')
['']
>>> 'Two lines\n'.split('\n')
['Two lines', '']
unicode.splitlines([keepends])

Возвращает список строк из строки, как str.splitlines(). Однако метод для Unicode разбивает по следующим границам строк, которые являются надмножеством универсальных символов новой строки, распознаваемых для 8-битных строк.

Представление

Описание

\n

Перевод строки (LF)

\r

Возврат каретки (CR)

\r\n

Возврат каретки + перевод строки (CR+LF)

\v или \x0b

Линейная табуляция

\f или \x0c

Перевод страницы

\x1c

Разделитель файлов

\x1d

Разделитель групп

\x1e

Разделитель записей

\x85

Следующая строка (управляющий код C1)

\u2028

Разделитель строк

\u2029

Разделитель абзацев

Изменено в версии 2.7: \v и \f добавлены в список границ строк.

str.startswith(prefix[, start[, end]])

Возвращает True, если строка начинается с prefix, иначе возвращает False. prefix также может быть кортежем префиксов для поиска. При указании необязательного start строка проверяется начиная с этой позиции. При указании необязательного end сравнение строки прекращается на этой позиции.

Изменено в версии 2.5: Допускаются кортежи в качестве prefix.

str.strip([chars])

Возвращает копию строки с удалёнными начальными и завершающими символами. Аргумент chars – это строка, задающая набор удаляемых символов. Если он опущен или равен None, аргумент chars по умолчанию удаляет пробельные символы. Аргумент chars не является префиксом или суффиксом; вместо этого удаляются все комбинации его значений:

>>> '   spacious   '.strip()
'spacious'
>>> 'www.example.com'.strip('cmowz.')
'example'

Изменено в версии 2.2.2: Добавлена поддержка аргумента chars.

str.swapcase()

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

Для 8-битных строк этот метод зависит от локали.

str.title()

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

Алгоритм использует простое, не зависящее от языка определение слова как группы последовательных букв. Это определение работает во многих контекстах, но означает, что апострофы в сокращениях и притяжательных формах образуют границы слов, что может быть нежелательным результатом:

>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"

Обходной путь для апострофов можно построить с помощью регулярных выражений:

>>> import re
>>> def titlecase(s):
...     return re.sub(r"[A-Za-z]+('[A-Za-z]+)?",
...                   lambda mo: mo.group(0)[0].upper() +
...                              mo.group(0)[1:].lower(),
...                   s)
...
>>> titlecase("they're bill's friends.")
"They're Bill's Friends."

Для 8-битных строк этот метод зависит от локали.

str.translate(table[, deletechars])

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

Для создания таблицы перекодировки можно воспользоваться вспомогательной функцией maketrans() из модуля string. Для строковых объектов, если требуется только удаление символов, задайте аргумент table равным None:

>>> 'read this short text'.translate(None, 'aeiou')
'rd ths shrt txt'

Новое в версии 2.6: Добавлена поддержка аргумента None table.

Для объектов Unicode метод translate() не принимает необязательный аргумент deletechars. Вместо этого он возвращает копию s, где все символы преобразованы с помощью переданной таблицы перекодировки, которая должна быть отображением порядковых номеров Unicode в порядковые номера Unicode, строки Unicode или None. Символы, отсутствующие в отображении, остаются без изменений. Символы, сопоставленные с None, удаляются. Обратите внимание: более гибкий подход – создать собственный кодек для отображения символов с помощью модуля codecs (см. encodings.cp1251).

str.upper()

Возвращает копию строки, в которой все символы, имеющие регистр, 4 преобразованы в верхний регистр. Учтите, что s.upper().isupper() может быть False, если s содержит символы без регистра или если категория Unicode результирующего символа(ов) – не «Lu» (буква, верхний регистр), а, например, «Lt» (буква, титульный регистр).

Для 8-битных строк этот метод зависит от локали.

str.zfill(width)

Возвращает строку с числами, дополненную слева нулями до длины width. Знак префикса обрабатывается корректно. Исходная строка возвращается, если width меньше или равно len(s).

Новое в версии 2.2.2.

Следующие методы доступны только для объектов unicode:

unicode.isnumeric()

Возвращает True, если в S содержатся только числовые символы, и False в противном случае. Числовые символы включают цифры и все символы, обладающие свойством числового значения Unicode, например U+2155 – VULGAR FRACTION ONE FIFTH (простая дробь одна пятая).

unicode.isdecimal()

Возвращает True, если в S содержатся только десятичные символы, и False в противном случае. Десятичные символы включают цифры и все символы, которые можно использовать для образования чисел с десятичным основанием, например U+0660 – ARABIC-INDIC DIGIT ZERO (арабско-индийская цифра ноль).

5.6.2. Операции форматирования строкString Formatting Operations

У строк и объектов Unicode есть одна уникальная встроенная операция: оператор % (взятие по модулю). Он также известен как оператор форматирования или интерполяции строк. При записи format % values (где format – строка или объект Unicode) спецификации преобразования % в format заменяются нулём или более элементами из values. Результат похож на использование sprintf() в языке C. Если format является объектом Unicode или если любой из объектов, преобразуемых с помощью %s, является объектом Unicode, результатом также будет объект Unicode.

Если format требует один аргумент, то values может быть одним объектом, не являющимся кортежем. 5 В противном случае values должен быть кортежем с количеством элементов, точно указанным в строке формата, или одним объектом отображения (например, словарём).

Спецификатор преобразования содержит два или более символа и состоит из следующих компонентов, которые должны располагаться в указанном порядке:

  1. Символ '%', обозначающий начало спецификатора.

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

  3. Флаги преобразования (необязательно), влияющие на результат для некоторых типов преобразования.

  4. Минимальная ширина поля (необязательно). Если указана как '*' (звёздочка), то фактическая ширина берётся из следующего элемента кортежа в values, а преобразуемый объект следует после минимальной ширины поля и необязательной точности.

  5. Точность (необязательно) задаётся через '.' (точку) и следующее за ней значение точности. Если указана как '*' (звёздочка), то фактическая ширина считывается из следующего элемента кортежа values, а преобразуемое значение следует после точности.

  6. Модификатор длины (необязательно).

  7. Тип преобразования.

Когда правый аргумент является словарём (или другим типом отображения), форматы в строке должны включать ключ отображения в скобках, указывающий на этот словарь, вставленный сразу после символа '%'. Ключ отображения выбирает значение для форматирования из отображения. Например:

>>> print '%(language)s has %(number)03d quote types.' % \
...       {"language": "Python", "number": 2}
Python has 002 quote types.

В этом случае в формате не должно быть спецификаторов * (поскольку они требуют последовательного списка параметров).

Символы флагов преобразования:

Флаг

Значение

'#'

Преобразование значения будет использовать «альтернативную форму» (определённую ниже).

'0'

Для числовых значений преобразование будет дополняться нулями.

'-'

Преобразованное значение выравнивается по левому краю (переопределяет преобразование '0', если указаны оба).

' '

(пробел) Перед положительным числом (или пустой строкой), полученным в результате знакового преобразования, следует оставлять пробел.

'+'

Знак ('+' или '-') будет предшествовать преобразованию (переопределяет флаг «пробел»).

Модификатор длины (h, l или L) может присутствовать, но игнорируется, поскольку он не нужен для Python – так, например, %ld идентично %d.

Типы преобразования:

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

Значение

Примечания

'd'

Десятичное целое со знаком.

'i'

Десятичное целое со знаком.

'o'

Восьмеричное значение со знаком.

(1)

'u'

Устаревший тип – идентичен 'd'.

(7)

'x'

Шестнадцатеричное со знаком (строчные буквы).

(2)

'X'

Шестнадцатеричное со знаком (заглавные буквы).

(2)

'e'

Экспоненциальный формат чисел с плавающей точкой (строчные буквы).

(3)

'E'

Экспоненциальный формат чисел с плавающей точкой (заглавные буквы).

(3)

'f'

Десятичный формат чисел с плавающей точкой.

(3)

'F'

Десятичный формат чисел с плавающей точкой.

(3)

'g'

Формат чисел с плавающей точкой. Использует экспоненциальный формат со строчными буквами, если показатель степени меньше −4 или не меньше точности, в противном случае – десятичный формат.

(4)

'G'

Формат чисел с плавающей точкой. Использует экспоненциальный формат с заглавными буквами, если показатель степени меньше −4 или не меньше точности, в противном случае – десятичный формат.

(4)

'c'

Один символ (принимает целое число или строку из одного символа).

'r'

Строка (преобразует любой объект Python с помощью repr()).

(5)

's'

Строка (преобразует любой объект Python с помощью str()).

(6)

'%'

Ни один аргумент не преобразуется, результатом является символ '%' в итоговом выводе.

Примечания:

  1. Альтернативная форма приводит к вставке ведущего нуля ('0') между левым заполнением и форматированным числом, если первый символ результата ещё не является нулём.

  2. Альтернативная форма вставляет перед первой цифрой ведущий '0x' или '0X' (в зависимости от того, использовался ли формат 'x' или 'X').

  3. Альтернативная форма всегда включает десятичную точку в результат, даже если после неё нет цифр.

    Точность определяет количество цифр после десятичной точки; по умолчанию – 6.

  4. Альтернативная форма всегда включает десятичную точку в результат, а конечные нули не удаляются, как это было бы в противном случае.

    Точность определяет количество значащих цифр до и после десятичной точки; по умолчанию – 6.

  5. Преобразование %r появилось в Python 2.0.

    Точность определяет максимальное количество используемых символов.

  6. Если переданный объект или формат является строкой unicode, результирующая строка также будет unicode.

    Точность определяет максимальное количество используемых символов.

  7. См. PEP 237.

Поскольку строки Python имеют явную длину, преобразования %s не предполагают, что '\0' является концом строки.

Изменено в версии 2.7: Преобразования %f для чисел, чьё абсолютное значение превышает 1e50, больше не заменяются преобразованиями %g.

Дополнительные строковые операции определены в стандартных модулях string и re.

5.6.3. Тип XRangeXRange Type

Тип xrange является неизменяемой последовательностью, которая обычно используется для циклов. Преимущество типа xrange в том, что объект xrange всегда занимает один и тот же объём памяти, независимо от размера диапазона, который он представляет. Постоянных преимуществ в производительности нет.

Объекты XRange обладают очень небольшим набором возможностей: они поддерживают только индексацию, итерацию и функцию len().

5.6.4. Изменяемые типы последовательностейMutable Sequence Types

Объекты списков и bytearray поддерживают дополнительные операции, позволяющие изменять объект на месте. Другие изменяемые типы последовательностей (когда они будут добавлены в язык) также должны поддерживать эти операции. Строки и кортежи являются неизменяемыми типами последовательностей: такие объекты нельзя изменить после создания. Следующие операции определены для изменяемых типов последовательностей (где x – произвольный объект):

Операция

Результат

Примечания

s[i] = x

элемент i из s заменяется на x

s[i:j] = t

срез s от i до j заменяется содержимым итерируемого объекта t

del s[i:j]

то же, что и s[i:j] = []

s[i:j:k] = t

элементы s[i:j:k] заменяются элементами из t

(1)

del s[i:j:k]

удаляет элементы s[i:j:k] из списка

s.append(x)

то же, что и s[len(s):len(s)] = [x]

(2)

s.extend(t) или s += t

в основном то же, что и s[len(s):len(s)] = t

(3)

s *= n

обновляет s, повторяя его содержимое n раз

(11)

s.count(x)

возвращает количество i, для которых s[i] == x

s.index(x[, i[, j]])

возвращает наименьшее k, такое что s[k] == x и i <= k < j

(4)

s.insert(i, x)

то же, что и s[i:i] = [x]

(5)

s.pop([i])

то же, что и x = s[i]; del s[i]; return x

(6)

s.remove(x)

то же, что и del s[s.index(x)]

(4)

s.reverse()

переворачивает элементы s на месте

(7)

s.sort([cmp[, key[, reverse]]])

сортирует элементы s на месте

(7)(8)(9)(10)

Примечания:

  1. t должна иметь ту же длину, что и заменяемый срез.

  2. Реализация Python на C исторически принимала несколько параметров и неявно объединяла их в кортеж; в Python 2.0 это больше не работает. Использование этой «псевдовозможности» считается устаревшим начиная с Python 1.4.

  3. t может быть любым итерируемым объектом.

  4. Возникает исключение ValueError, если x не найден в s. Когда отрицательный индекс передаётся в качестве второго или третьего параметра методу index(), к нему прибавляется длина списка, как для срезов. Если он всё ещё отрицателен, он усекается до нуля, как для срезов.

    Изменено в версии 2.3: Ранее index() не имел аргументов для указания начальной и конечной позиций.

  5. Когда отрицательный индекс передаётся в качестве первого параметра методу insert(), к нему прибавляется длина списка, как для срезов. Если он всё ещё отрицателен, он усекается до нуля, как для срезов.

    Изменено в версии 2.3: Ранее все отрицательные индексы усекались до нуля.

  6. Необязательный аргумент i метода pop() по умолчанию равен -1, так что по умолчанию удаляется и возвращается последний элемент.

  7. Методы sort() и reverse() изменяют список на месте для экономии памяти при сортировке или реверсировании большого списка. Чтобы напомнить, что они работают через побочный эффект, они не возвращают отсортированный или реверсированный список.

  8. Метод sort() принимает необязательные аргументы для управления сравнениями.

    cmp задает пользовательскую функцию сравнения с двумя аргументами (элементами списка), которая должна возвращать отрицательное, нулевое или положительное число в зависимости от того, считается ли первый аргумент меньше, равным или больше второго аргумента: cmp=lambda x,y: cmp(x.lower(), y.lower()). Значение по умолчанию – None.

    key задает функцию одного аргумента, используемую для извлечения ключа сравнения из каждого элемента списка: key=str.lower. Значение по умолчанию – None.

    reverse – логическое значение. Если указано True, то элементы списка сортируются так, как если бы каждое сравнение было обратным.

    В целом, процессы преобразования key и reverse работают гораздо быстрее, чем указание эквивалентной функции cmp. Это связано с тем, что cmp вызывается несколько раз для каждого элемента списка, тогда как key и reverse затрагивают каждый элемент только один раз. Используйте functools.cmp_to_key() для преобразования функции cmp старого образца в функцию key.

    Изменено в версии 2.3: Добавлена поддержка None как эквивалента опускания cmp.

    Изменено в версии 2.4: Добавлена поддержка key и reverse.

  9. Начиная с Python 2.3, метод sort() гарантированно является устойчивым. Сортировка называется устойчивой, если она гарантированно не меняет относительный порядок равных элементов – это полезно при сортировке в несколько проходов (например, сначала по отделу, затем по уровню зарплаты).

  10. Особенность реализации CPython: Во время сортировки списка результат попытки изменить или даже просмотреть список не определен. Реализация на C в Python 2.3 и новее делает список пустым на время сортировки и возбуждает ValueError, если обнаруживает, что список был изменен во время сортировки.

  11. Значение n – это целое число или объект, реализующий __index__(). Нулевые и отрицательные значения n очищают последовательность. Элементы последовательности не копируются; на них ссылаются многократно, как объясняется для s * n в разделе Типы последовательностей – str, unicode, list, tuple, bytearray, buffer, xrange.

5.7. Типы множеств – set, frozensetSet Types – set, frozenset

Объект set – это неупорядоченная коллекция уникальных хешируемых объектов. Обычно используется для проверки принадлежности, удаления дубликатов из последовательности и выполнения математических операций, таких как пересечение, объединение, разность и симметричная разность. (О других контейнерах см. встроенные классы dict, list и tuple, а также модуль collections.)

Новое в версии 2.4.

Как и другие коллекции, множества поддерживают x in set, len(set) и for x in set. Будучи неупорядоченной коллекцией, множество не запоминает положение элементов или порядок вставки. Поэтому множества не поддерживают индексацию, срезы и другое поведение, свойственное последовательностям.

В Python есть два встроенных типа множеств: set и frozenset. Тип set изменяемый – его содержимое можно менять с помощью методов вроде add() и remove(). Поскольку он изменяемый, у него нет хеш-значения, поэтому его нельзя использовать ни в качестве ключа словаря, ни как элемент другого множества. Тип frozenset неизменяемый и хешируемый – его содержимое нельзя изменить после создания; соответственно, его можно использовать как ключ словаря или как элемент другого множества.

Начиная с Python 2.7, непустые множества (не frozensets) можно создавать, помещая список элементов, разделенных запятыми, в фигурные скобки, например: {'jack', 'sjoerd'}, в дополнение к конструктору set.

Конструкторы обоих классов работают одинаково:

class set([iterable])
class frozenset([iterable])

Возвращает новый объект set или frozenset, элементы которого берутся из iterable. Элементы множества должны быть хэшируемыми. Чтобы представлять множества множеств, внутренние множества должны быть frozenset объектами. Если iterable не указан, возвращается новое пустое множество.

Экземпляры set и frozenset предоставляют следующие операции:

len(s)

Возвращает количество элементов в множестве s (мощность s).

x in s

Проверяет принадлежность x множеству s.

x not in s

Проверяет отсутствие x в множестве s.

isdisjoint(other)

Возвращает True, если у множества нет общих элементов с other. Множества не пересекаются тогда и только тогда, когда их пересечение – пустое множество.

Новое в версии 2.6.

issubset(other)
set <= other

Проверяет, принадлежит ли каждый элемент множества множеству other.

set < other

Проверяет, является ли множество строгим подмножеством other, то есть set <= other and set != other.

issuperset(other)
set >= other

Проверяет, принадлежит ли каждый элемент other множеству.

set > other

Проверяет, является ли множество строгим надмножеством other, то есть set >= other and set != other.

union(*others)
set | other | ...

Возвращает новое множество, содержащее элементы из исходного множества и всех остальных.

Изменено в версии 2.6: Принимает несколько входных итерабельных объектов.

intersection(*others)
set & other & ...

Возвращает новое множество, содержащее элементы, общие для исходного множества и всех остальных.

Изменено в версии 2.6: Принимает несколько входных итерабельных объектов.

difference(*others)
set - other - ...

Возвращает новое множество, содержащее элементы исходного множества, которых нет в других.

Изменено в версии 2.6: Принимает несколько входных итерабельных объектов.

symmetric_difference(other)
set ^ other

Возвращает новое множество, содержащее элементы, которые есть либо в исходном множестве, либо в other, но не в обоих.

copy()

Возвращает поверхностную копию множества.

Замечание: версии методов union(), intersection(), difference(), symmetric_difference(), issubset() и issuperset() без операторов принимают любой итерируемый объект в качестве аргумента. В отличие от них, их операторные аналоги требуют, чтобы аргументы были множествами. Это исключает подверженные ошибкам конструкции вроде set('abc') & 'cbs' в пользу более читаемой set('abc').intersection('cbs').

И set, и frozenset поддерживают сравнение множеств. Два множества равны тогда и только тогда, когда каждый элемент одного содержится в другом (каждое является подмножеством другого). Множество меньше другого тогда и только тогда, когда первое является собственным подмножеством второго (является подмножеством, но не равным). Множество больше другого тогда и только тогда, когда первое является собственным надмножеством второго (является надмножеством, но не равным).

Экземпляры set сравниваются с экземплярами frozenset на основе их элементов. Например, set('abc') == frozenset('abc') возвращает True, и то же самое делает set('abc') in set([frozenset('abc')]).

Сравнения на подмножество и равенство не обобщаются до функции полного упорядочения. Например, любые два непустых непересекающихся множества не равны и не являются подмножествами друг друга, поэтому все из следующих возвращают False: a<b, a==b или a>b. Соответственно, множества не реализуют метод __cmp__().

Поскольку множества определяют лишь частичное упорядочение (отношения подмножеств), результат метода list.sort() для списков множеств не определён.

Элементы множества, как и ключи словаря, должны быть хэшируемыми.

Бинарные операции, в которых смешиваются экземпляры set и frozenset, возвращают тип первого операнда. Например: frozenset('ab') | set('bc') возвращает экземпляр frozenset.

В следующей таблице перечислены операции, доступные для set, которые не применимы к неизменяемым экземплярам frozenset:

update(*others)
set |= other | ...

Обновляет множество, добавляя элементы из всех других.

Изменено в версии 2.6: Принимает несколько входных итерабельных объектов.

intersection_update(*others)
set &= other & ...

Обновляет множество, оставляя только те элементы, которые есть в нём и во всех других.

Изменено в версии 2.6: Принимает несколько входных итерабельных объектов.

difference_update(*others)
set -= other | ...

Обновляет множество, удаляя элементы, найденные в других.

Изменено в версии 2.6: Принимает несколько входных итерабельных объектов.

symmetric_difference_update(other)
set ^= other

Обновляет множество, оставляя только элементы, которые есть в одном из множеств, но не в обоих.

add(elem)

Добавляет элемент elem в множество.

remove(elem)

Удаляет элемент elem из множества. Вызывает KeyError, если elem отсутствует в множестве.

discard(elem)

Удаляет элемент elem из множества, если он присутствует.

pop()

Удаляет и возвращает произвольный элемент множества. Вызывает KeyError, если множество пусто.

clear()

Удаляет все элементы из множества.

Обратите внимание: не-операторные версии методов update(), intersection_update(), difference_update() и symmetric_difference_update() принимают любой итерируемый объект в качестве аргумента.

Примечание: аргумент elem для методов __contains__(), remove() и discard() может быть множеством. Для поддержки поиска эквивалентного замороженного множества создается временное множество из elem.

См. также

Сравнение со встроенными типами множеств

Различия между модулем sets и встроенными типами множеств.

5.8. Типы отображений – dictMapping Types – dict

Объект отображение сопоставляет хешируемые значения с произвольными объектами. Отображения – изменяемые объекты. В настоящее время существует только один стандартный тип отображения – словарь. (О других контейнерах см. встроенные классы list, set и tuple, а также модуль collections.)

Ключи словаря могут быть почти любыми значениями. Значения, которые не являются хэшируемыми, то есть содержат списки, словари или другие изменяемые типы (которые сравниваются по значению, а не по идентичности объекта), не могут использоваться в качестве ключей. Числовые типы, используемые в качестве ключей, подчиняются обычным правилам числового сравнения: если два числа равны (например, 1 и 1.0), то их можно взаимозаменяемо использовать для индексации одной и той же записи словаря. (Однако имейте в виду, что поскольку компьютеры хранят числа с плавающей запятой как приближенные значения, обычно неразумно использовать их в качестве ключей словаря.)

Словари можно создать, поместив разделённый запятыми список пар key: value в фигурные скобки, например: {'jack': 4098, 'sjoerd': 4127} или {4098: 'jack', 4127: 'sjoerd'}, либо с помощью конструктора dict.

class dict(**kwarg)
class dict(mapping, **kwarg)
class dict(iterable, **kwarg)

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

Если позиционный аргумент не указан, создаётся пустой словарь. Если позиционный аргумент указан и является объектом отображения (mapping), создаётся словарь с теми же парами ключ-значение, что и у объекта отображения. В противном случае позиционный аргумент должен быть итерируемым объектом. Каждый элемент итерируемого объекта сам должен быть итерируемым объектом, содержащим ровно два объекта. Первый объект каждого элемента становится ключом в новом словаре, а второй – соответствующим значением. Если ключ встречается более одного раза, последнее значение для этого ключа становится соответствующим значением в новом словаре.

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

В качестве иллюстрации следующие примеры возвращают словарь, равный {"one": 1, "two": 2, "three": 3}:

>>> a = dict(one=1, two=2, three=3)
>>> b = {'one': 1, 'two': 2, 'three': 3}
>>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
>>> d = dict([('two', 2), ('one', 1), ('three', 3)])
>>> e = dict({'three': 3, 'one': 1, 'two': 2})
>>> a == b == c == d == e
True

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

Новое в версии 2.2.

Изменено в версии 2.3: Добавлена поддержка создания словаря из именованных аргументов.

Вот операции, которые поддерживают словари (и, следовательно, должны поддерживать пользовательские типы отображений):

len(d)

Возвращает количество элементов в словаре d.

d[key]

Возвращает элемент d с ключом key. Возбуждает KeyError, если key отсутствует в отображении.

Если подкласс dict определяет метод __missing__(), а key отсутствует, операция d[key] вызывает этот метод с ключом key в качестве аргумента. Затем операция d[key] возвращает или возбуждает результат вызова __missing__(key). Никакие другие операции или методы не вызывают __missing__(). Если __missing__() не определён, возбуждается KeyError. __missing__() должен быть методом; он не может быть переменной экземпляра:

>>> class Counter(dict):
...     def __missing__(self, key):
...         return 0
>>> c = Counter()
>>> c['red']
0
>>> c['red'] += 1
>>> c['red']
1

В примере выше показана часть реализации collections.Counter. Для collections.defaultdict используется другой метод __missing__.

Новое в версии 2.5: Распознавание методов __missing__ подклассов dict.

d[key] = value

Устанавливает d[key] в значение value.

del d[key]

Удаляет d[key] из d. Вызывает KeyError, если key отсутствует в отображении.

key in d

Возвращает True, если d содержит ключ key, иначе False.

Новое в версии 2.2.

key not in d

Эквивалентно not key in d.

Новое в версии 2.2.

iter(d)

Возвращает итератор по ключам словаря. Это краткая форма записи для iterkeys().

clear()

Удаляет все элементы из словаря.

copy()

Возвращает поверхностную копию словаря.

fromkeys(seq[, value])

Создаёт новый словарь, ключи которого берутся из seq, а значения устанавливаются равными value.

fromkeys() – это метод класса, возвращающий новый словарь. value по умолчанию равен None.

Новое в версии 2.3.

get(key[, default])

Возвращает значение для key, если key присутствует в словаре, иначе default. Если default не указан, по умолчанию принимается None, поэтому этот метод никогда не вызывает исключение KeyError.

has_key(key)

Проверяет наличие key в словаре. has_key() устарело в пользу key in d.

items()

Возвращает копию списка пар (key, value) словаря.

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

Если items(), keys(), values(), iteritems(), iterkeys() и itervalues() вызываются без промежуточных изменений словаря, списки будут напрямую соответствовать друг другу. Это позволяет создавать пары (value, key) с помощью zip(): pairs = zip(d.values(), d.keys()). То же отношение справедливо для методов iterkeys() и itervalues(): pairs = zip(d.itervalues(), d.iterkeys()) предоставляет то же значение для pairs. Другой способ создать тот же список – pairs = [(v, k) for (k, v) in d.iteritems()].

iteritems()

Возвращает итератор по парам (key, value) словаря. См. примечание к dict.items().

Использование iteritems() при добавлении или удалении записей в словаре может вызвать RuntimeError или не позволить перебрать все записи.

Новое в версии 2.2.

iterkeys()

Возвращает итератор по ключам словаря. См. примечание к dict.items().

Использование iterkeys() при добавлении или удалении записей в словаре может вызвать RuntimeError или не позволить перебрать все записи.

Новое в версии 2.2.

itervalues()

Возвращает итератор по значениям словаря. См. примечание к dict.items().

Использование itervalues() при добавлении или удалении записей в словаре может вызвать RuntimeError или не позволить перебрать все записи.

Новое в версии 2.2.

keys()

Возвращает копию списка ключей словаря. См. примечание к dict.items().

pop(key[, default])

Если key присутствует в словаре, удаляет его и возвращает значение, иначе возвращает default. Если default не указан и key отсутствует в словаре, возбуждается KeyError.

Новое в версии 2.3.

popitem()

Удаляет и возвращает произвольную пару (key, value) из словаря.

popitem() полезен для разрушающего обхода словаря, как часто используется в алгоритмах над множествами. Если словарь пуст, вызов popitem() вызывает исключение KeyError.

setdefault(key[, default])

Если key есть в словаре, возвращает его значение. Если нет, вставляет key со значением default и возвращает default. default по умолчанию равен None.

update([other])

Обновляет словарь парами ключ/значение из other, перезаписывая существующие ключи. Возвращает None.

update() принимает либо другой объект словаря, либо итерируемый объект пар ключ/значение (в виде кортежей или других итерируемых объектов длиной два). Если указаны именованные аргументы, словарь затем обновляется этими парами ключ/значение: d.update(red=1, blue=2).

Изменено в версии 2.4: Разрешено передавать итерируемый объект пар ключ/значение, а также именованные аргументы.

values()

Возвращает копию списка значений словаря. См. примечание к dict.items().

viewitems()

Возвращает новое представление элементов словаря (пары (key, value)). См. ниже документацию объектов представления.

Новое в версии 2.7.

viewkeys()

Возвращает новое представление ключей словаря. См. ниже документацию объектов представления.

Новое в версии 2.7.

viewvalues()

Возвращает новое представление значений словаря. См. ниже документацию объектов представления.

Новое в версии 2.7.

Словари считаются равными тогда и только тогда, когда они содержат одни и те же пары (key, value).

5.8.1. Объекты представления словаряDictionary view objects

Объекты, возвращаемые dict.viewkeys(), dict.viewvalues() и dict.viewitems(), являются объектами-представлениями. Они предоставляют динамическое представление записей словаря, то есть при изменении словаря представление отражает эти изменения.

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

len(dictview)

Возвращает количество записей в словаре.

iter(dictview)

Возвращает итератор по ключам, значениям или элементам (представленным в виде кортежей (key, value)) в словаре.

Ключи и значения перебираются в произвольном порядке, который не является случайным, отличается в разных реализациях Python и зависит от истории вставок и удалений словаря. Если представления ключей, значений и элементов перебираются без промежуточных изменений словаря, порядок элементов будет напрямую соответствовать друг другу. Это позволяет создавать пары (value, key) с помощью zip(): pairs = zip(d.values(), d.keys()). Другой способ создать тот же список – pairs = [(v, k) for (k, v) in d.items()].

Обход представлений во время добавления или удаления записей из словаря может вызвать RuntimeError или не позволить обойти все записи.

x in dictview

Возвращает True, если x находится в ключах, значениях или элементах (items) базового словаря (в последнем случае x должен быть кортежем (key, value)).

Представления ключей (keys views) подобны множествам, так как их записи уникальны и хешируемы. Если все значения хешируемы, так что пары (ключ, значение) уникальны и хешируемы, то представление элементов (items view) также подобно множеству. (Представления значений не считаются подобными множеству, так как записи обычно не уникальны.) Тогда доступны следующие операции над множествами (под «other» подразумевается другое представление или множество):

dictview & other

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

dictview | other

Возвращает объединение представления словаря и другого объекта в виде нового множества.

dictview - other

Возвращает разность между представлением словаря и другим объектом (все элементы в dictview, которых нет в other) в виде нового множества.

dictview ^ other

Возвращает симметрическую разность (все элементы, находящиеся либо в dictview, либо в other, но не в обоих) представления словаря и другого объекта в виде нового множества.

Пример использования представления словаря:

>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
>>> keys = dishes.viewkeys()
>>> values = dishes.viewvalues()

>>> # итерация
>>> n = 0
>>> for val in values:
...     n += val
>>> print(n)
504

>>> # ключи и значения перебираются в одном и том же порядке
>>> list(keys)
['eggs', 'bacon', 'sausage', 'spam']
>>> list(values)
[2, 1, 1, 500]

>>> # объекты представления динамичны и отражают изменения словаря
>>> del dishes['eggs']
>>> del dishes['sausage']
>>> list(keys)
['spam', 'bacon']

>>> # операции над множествами
>>> keys & {'eggs', 'bacon', 'salad'}
{'bacon'}

5.9. Файловые объектыFile Objects

Файловые объекты реализованы с помощью пакета stdio языка C и могут быть созданы с помощью встроенной функции open(). Файловые объекты также возвращаются некоторыми другими встроенными функциями и методами, такими как os.popen() и os.fdopen(), а также методом makefile() объектов сокетов. Временные файлы можно создавать с помощью модуля tempfile, а высокоуровневые файловые операции, такие как копирование, перемещение и удаление файлов и каталогов, можно выполнять с помощью модуля shutil.

Когда файловая операция завершается ошибкой по причине, связанной с вводом-выводом, возбуждается исключение IOError. Сюда входят ситуации, когда операция не определена по какой-либо причине, например, seek() на устройстве tty или запись в файл, открытый для чтения.

Файлы имеют следующие методы:

file.close()

Закрывает файл. Закрытый файл нельзя больше читать или записывать. Любая операция, требующая, чтобы файл был открыт, возбудит ValueError после закрытия файла. Допускается вызов close() более одного раза.

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

from __future__ import with_statement # Это не требуется в Python 2.6

with open("hello.txt") as f:
    for line in f:
        print line,

В более старых версиях Python для достижения того же эффекта приходилось делать так:

f = open("hello.txt")
try:
    for line in f:
        print line,
finally:
    f.close()

Примечание

Не все «файлоподобные» типы в Python поддерживают использование в качестве менеджера контекста для оператора with. Если ваш код предназначен для работы с любым файлоподобным объектом, можно использовать функцию contextlib.closing() вместо непосредственного использования объекта.

file.flush()

Сбрасывает внутренний буфер, как fflush() из stdio. На некоторых файлоподобных объектах это может быть пустой операцией.

Примечание

flush() не обязательно записывает данные файла на диск. Используйте flush() с последующим os.fsync(), чтобы гарантировать это поведение.

file.fileno()

Возвращает целочисленный «файловый дескриптор», используемый нижележащей реализацией для запроса операций ввода-вывода у операционной системы. Это может быть полезно для других низкоуровневых интерфейсов, использующих файловые дескрипторы, таких как модуль fcntl или os.read() и аналоги.

Примечание

Файлоподобные объекты, у которых нет реального файлового дескриптора, не должны предоставлять этот метод!

file.isatty()

Возвращает True, если файл подключён к tty-устройству (или подобному), иначе False.

Примечание

Если файлоподобный объект не связан с реальным файлом, этот метод не следует реализовывать.

file.next()

Файловый объект является собственным итератором; например, iter(f) возвращает f (если только f не закрыт). Когда файл используется как итератор, обычно в цикле for (например, for line in f: print line.strip()), многократно вызывается метод next(). Этот метод возвращает следующую строку ввода или возбуждает StopIteration при достижении EOF, если файл открыт для чтения (поведение не определено, если файл открыт для записи). Чтобы сделать цикл for наиболее эффективным способом перебора строк файла (очень распространённая операция), метод next() использует скрытый буфер упреждающего чтения. Из-за использования такого буфера комбинирование next() с другими методами файла (например, readline()) работает неправильно. Однако использование seek() для перемещения в абсолютную позицию сбрасывает буфер упреждающего чтения.

Новое в версии 2.3.

file.read([size])

Читает не более size байт из файла (меньше, если при чтении EOF встречен до получения size байт). Если аргумент size отрицателен или опущен, читаются все данные до EOF. Байты возвращаются в виде строкового объекта. Пустая строка возвращается, если EOF встречается сразу. (Для некоторых файлов, например tty, имеет смысл продолжать чтение после EOF.) Обратите внимание, что этот метод может вызывать нижележащую C-функцию fread() более одного раза, чтобы получить как можно ближе к size байт. Также заметьте, что в неблокирующем режиме может быть возвращено меньше данных, чем запрошено, даже если параметр size не был задан.

Примечание

Эта функция – просто обёртка для нижележащей C-функции fread() и будет вести себя так же в угловых случаях, например, кэшируется ли значение EOF.

file.readline([size])

Читает одну целую строку из файла. Завершающий символ новой строки сохраняется в строке (но может отсутствовать, если файл заканчивается неполной строкой). 6 Если аргумент size присутствует и неотрицателен, он указывает максимальное количество байт (включая завершающий перевод строки), и может быть возвращена неполная строка. Когда size не равен 0, пустая строка возвращается только, если EOF встречается сразу.

Примечание

В отличие от stdio метода fgets(), возвращаемая строка содержит нулевые символы ('\0'), если они встречались во входных данных.

file.readlines([sizehint])

Читает до EOF с помощью readline() и возвращает список, содержащий прочитанные таким образом строки. Если присутствует необязательный аргумент sizehint, то вместо чтения до EOF читаются целые строки общим объёмом приблизительно sizehint байт (возможно, с округлением до размера внутреннего буфера). Объекты, реализующие файлоподобный интерфейс, могут игнорировать sizehint, если его невозможно реализовать или невозможно реализовать эффективно.

file.xreadlines()

Этот метод возвращает то же самое, что и iter(f).

Новое в версии 2.1.

Устарело с версии 2.3: Используйте for line in file вместо.

file.seek(offset[, whence])

Устанавливает текущую позицию файла, как stdio метод fseek(). Аргумент whence необязателен и по умолчанию равен os.SEEK_SET или 0 (абсолютное позиционирование); другие значения: os.SEEK_CUR или 1 (позиционирование относительно текущей позиции) и os.SEEK_END или 2 (позиционирование относительно конца файла). Возвращаемого значения нет.

Например, f.seek(2, os.SEEK_CUR) продвигает позицию на два, а f.seek(-3, os.SEEK_END) устанавливает позицию на третью с конца.

Обратите внимание: если файл открыт для добавления (режим 'a' или 'a+'), любые операции seek() будут отменены при следующей записи. Если файл открыт только для записи в режиме добавления (режим 'a'), этот метод по сути ничего не делает, но он остаётся полезным для файлов, открытых в режиме добавления с возможностью чтения (режим 'a+'). Если файл открыт в текстовом режиме (без 'b'), допустимы только смещения, возвращаемые tell(). Использование других смещений приводит к неопределённому поведению.

Обратите внимание, что не все файловые объекты допускают перемещение (seekable).

Изменено в версии 2.6: Передача чисел с плавающей запятой в качестве смещения устарела.

file.tell()

Возвращает текущую позицию файла, как stdio метод ftell().

Примечание

В Windows tell() может возвращать недопустимые значения (после fgets()) при чтении файлов с переводами строк в стиле Unix. Используйте двоичный режим ('rb'), чтобы обойти эту проблему.

file.truncate([size])

Урезает размер файла. Если указан необязательный аргумент size, файл урезается (не более) до этого размера. По умолчанию размер равен текущей позиции. Текущая позиция файла не меняется. Обратите внимание: если указанный размер превышает текущий размер файла, результат зависит от платформы: возможны варианты, что файл останется без изменений, увеличится до указанного размера (как будто заполнен нулями) или увеличится до указанного размера с неопределённым новым содержимым. Доступность: Windows, многие варианты Unix.

file.write(str)

Записывает строку в файл. Возвращаемого значения нет. Из-за буферизации строка может фактически не появиться в файле до вызова метода flush() или close().

file.writelines(sequence)

Записывает последовательность строк в файл. Последовательность может быть любым итерируемым объектом, порождающим строки, обычно списком строк. Возвращаемого значения нет. (Название задумано так, чтобы соответствовать readlines(); writelines() не добавляет разделители строк.)

Файлы поддерживают протокол итератора. Каждая итерация возвращает тот же результат, что и readline(), и итерация завершается, когда метод readline() возвращает пустую строку.

Файловые объекты также предоставляют ряд других интересных атрибутов. Они не обязательны для файлоподобных объектов, но должны быть реализованы, если имеют смысл для конкретного объекта.

file.closed

bool, указывающий текущее состояние файлового объекта. Это атрибут только для чтения; метод close() изменяет значение. Он может быть недоступен на всех файлоподобных объектах.

file.encoding

Кодировка, которую использует этот файл. Когда строки Unicode записываются в файл, они преобразуются в байтовые строки с использованием этой кодировки. Кроме того, когда файл подключён к терминалу, этот атрибут содержит кодировку, которую терминал, вероятно, использует (эта информация может быть неверной, если пользователь неправильно настроил терминал). Атрибут только для чтения и может отсутствовать на всех файлоподобных объектах. Он также может быть None, в этом случае файл использует системную кодировку по умолчанию для преобразования строк Unicode.

Новое в версии 2.3.

file.errors

Обработчик ошибок Unicode, используемый совместно с кодировкой.

Новое в версии 2.6.

file.mode

Режим ввода-вывода для файла. Если файл был создан с помощью встроенной функции open(), это будет значение параметра mode. Это атрибут только для чтения и может отсутствовать на всех файлоподобных объектах.

file.name

Если файловый объект был создан с помощью open() – имя файла. В противном случае – некоторая строка, указывающая источник файлового объекта, вида <...>. Это атрибут только для чтения и может отсутствовать на всех файлоподобных объектах.

file.newlines

Если Python был собран с поддержкой универсальных символов новой строки (по умолчанию), то существует этот атрибут только для чтения, и для файлов, открытых в режиме чтения с универсальными переводами строк, он отслеживает типы встреченных при чтении символов новой строки. Возможные значения: '\r', '\n', '\r\n', None (неизвестно, ещё не прочитано ни одной новой строки) или кортеж, содержащий все встреченные типы, чтобы указать, что использовались разные соглашения о переводах строк. Для файлов, не открытых в режиме чтения с универсальными переводами строк, значение этого атрибута будет None.

file.softspace

Логическое значение, указывающее, нужно ли печатать пробел перед другим значением при использовании оператора print. Классы, пытающиеся имитировать файловый объект, также должны иметь записываемый атрибут softspace, который следует инициализировать нулём. Для большинства классов, реализованных на Python, это будет автоматическим (может потребоваться осторожность для объектов, переопределяющих доступ к атрибутам); типы, реализованные на C, должны предоставлять записываемый атрибут softspace.

Примечание

Этот атрибут используется не для управления оператором print, а для того, чтобы реализация print могла отслеживать своё внутреннее состояние.

5.10. тип memoryviewmemoryview type

Новое в версии 2.7.

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

class memoryview(obj)

Создаёт memoryview, ссылающийся на obj. obj должен поддерживать буферный протокол. Встроенные объекты, поддерживающие буферный протокол, включают str и bytearray (но не unicode).

memoryview имеет понятие элемента – атомарной единицы памяти, обрабатываемой исходным объектом obj. Для многих простых типов, таких как str и bytearray, элемент – это один байт, но другие сторонние типы могут предоставлять более крупные элементы.

len(view) возвращает общее количество элементов в memoryview, view. Атрибут itemsize выдаст количество байт в одном элементе.

memoryview поддерживает извлечение срезов для доступа к своим данным. Взятие одного индекса вернёт один элемент в виде объекта str. Полный срез приведёт к созданию подпредставления:

>>> v = memoryview('abcefg')
>>> v[1]
'b'
>>> v[-1]
'g'
>>> v[1:4]
<memory at 0x77ab28>
>>> v[1:4].tobytes()
'bce'

Если объект, над которым создано memoryview, допускает изменение своих данных, memoryview поддерживает присваивание срезу:

>>> data = bytearray('abcefg')
>>> v = memoryview(data)
>>> v.readonly
False
>>> v[0] = 'z'
>>> data
bytearray(b'zbcefg')
>>> v[1:4] = '123'
>>> data
bytearray(b'z123fg')
>>> v[2] = 'spam'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: cannot modify size of memoryview object

Обратите внимание, что размер объекта memoryview изменить нельзя.

memoryview имеет два метода:

tobytes()

Возвращает данные в буфере в виде байтовой строки (объект класса str).

>>> m = memoryview("abc")
>>> m.tobytes()
'abc'
tolist()

Возвращает данные из буфера в виде списка целых чисел.

>>> memoryview("abc").tolist()
[97, 98, 99]

Также доступно несколько атрибутов только для чтения:

format

Строка, содержащая формат (в стиле модуля struct) для каждого элемента представления. По умолчанию 'B' – простая байтовая строка.

itemsize

Размер каждого элемента memoryview в байтах.

shape

Кортеж целых чисел длиной ndim, задающий форму памяти как N-мерного массива.

ndim

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

strides

Кортеж целых чисел длиной ndim, задающий размер в байтах для доступа к каждому элементу по каждому измерению массива.

readonly

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

5.11. Типы менеджеров контекстаContext Manager Types

Новое в версии 2.5.

Оператор with языка Python поддерживает концепцию контекста выполнения, определяемого менеджером контекста. Это реализовано с помощью двух отдельных методов, которые позволяют пользовательским классам определять контекст выполнения, в который входят перед выполнением тела оператора и из которого выходят при завершении оператора.

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

contextmanager.__enter__()

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

Примером менеджера контекста, который возвращает сам себя, является файловый объект. Файловые объекты возвращают себя из __enter__(), чтобы open() можно было использовать как контекстное выражение в операторе with.

Примером контекстного менеджера, возвращающего связанный объект, является менеджер, возвращаемый decimal.localcontext(). Такие менеджеры устанавливают активный десятичный контекст в копию исходного десятичного контекста и затем возвращают эту копию. Это позволяет вносить изменения в текущий десятичный контекст в теле оператора with, не затрагивая код за пределами оператора with.

contextmanager.__exit__(exc_type, exc_val, exc_tb)

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

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

Переданное исключение никогда не должно вызываться повторно явно; вместо этого данный метод должен возвращать ложное значение, указывающее, что метод завершился успешно и не хочет подавлять вызванное исключение. Это позволяет коду управления контекстом (например, contextlib.nested) легко определить, действительно ли метод __exit__() завершился неудачей.

Python определяет несколько контекстных менеджеров для поддержки простой синхронизации потоков, своевременного закрытия файлов или других объектов, а также более простого управления активным контекстом десятичной арифметики. Конкретные типы не рассматриваются особым образом, помимо реализации протокола управления контекстом. См. модуль contextlib для примеров.

Генераторы generators Python и декоратор contextlib.contextmanager decorator предоставляют удобный способ реализации этих протоколов. Если функция-генератор декорирована декоратором contextlib.contextmanager, она вернёт менеджер контекста, реализующий необходимые методы __enter__() и __exit__(), вместо итератора, создаваемого недекорированной функцией-генератором.

Обратите внимание, что в структуре типа для объектов Python в Python/C API нет специального слота для любого из этих методов. Типы расширений, желающие определить эти методы, должны предоставлять их как обычный метод, доступный из Python. По сравнению с накладными расходами на установку контекста выполнения, накладные расходы на один поиск в словаре класса пренебрежимо малы.

5.12. Другие встроенные типыOther Built-in Types

Интерпретатор поддерживает несколько других видов объектов. Большинство из них поддерживают только одну или две операции.

5.12.1. МодулиModules

Единственная специальная операция над модулем – это доступ к атрибутам: m.name, где m – это модуль, а name обращается к имени, определённому в таблице символов модуля m. Атрибутам модуля можно присваивать значения. (Обратите внимание, что оператор import строго говоря, не является операцией над объектом модуля; import foo не требует существования объекта модуля с именем foo, а требует (внешнего) определения для модуля с именем foo где-то.)

Специальным атрибутом каждого модуля является __dict__. Это словарь, содержащий таблицу символов модуля. Изменение этого словаря действительно изменит таблицу символов модуля, но прямое присваивание атрибуту __dict__ невозможно (можно написать m.__dict__['a'] = 1, что определит m.a как 1, но нельзя написать m.__dict__ = {}). Изменять __dict__ напрямую не рекомендуется.

Модули, встроенные в интерпретатор, записываются так: <module 'sys' (built-in)>. Если загружены из файла, они записываются как <module 'os' from '/usr/local/lib/pythonX.Y/os.pyc'>.

5.12.2. Классы и экземпляры классовClasses and Class Instances

См. Объекты, значения и типы и Определения классов.

5.12.3. ФункцииFunctions

Объекты-функции создаются определениями функций. Единственная операция над объектом-функцией – это вызов: func(argument-list).

На самом деле существует два вида объектов-функций: встроенные функции и определяемые пользователем функции. Оба поддерживают одну и ту же операцию (вызов функции), но реализация различается, отсюда разные типы объектов.

Дополнительную информацию см. в разделе Определения функций.

5.12.4. МетодыMethods

Методы – это функции, вызываемые с использованием точечной нотации. Существуют два вида: встроенные методы (например, append() для списков) и методы экземпляров классов. Встроенные методы описываются с типами, которые их поддерживают.

Реализация добавляет два специальных атрибута только для чтения к методам экземпляров классов: m.im_self – это объект, с которым работает метод, а m.im_func – функция, реализующая метод. Вызов m(arg-1, arg-2, ..., arg-n) полностью эквивалентен вызову m.im_func(m.im_self, arg-1, arg-2, ..., arg-n).

Методы экземпляров классов бывают связанными или несвязанными, в зависимости от того, был ли метод получен через экземпляр или через класс соответственно. Когда метод несвязанный, его атрибут im_self будет None, и при вызове необходимо передать явный объект self в качестве первого аргумента. В этом случае self должен быть экземпляром класса несвязанного метода (или подкласса этого класса), иначе возбуждается TypeError.

Как и объекты функций, объекты методов поддерживают получение произвольных атрибутов. Однако, поскольку атрибуты методов на самом деле хранятся в базовом объекте функции (meth.im_func), установка атрибутов методов как для связанных, так и для несвязанных методов запрещена. Попытка установить атрибут метода приводит к возбуждению AttributeError. Чтобы установить атрибут метода, необходимо явно установить его в базовом объекте функции:

>>> class C:
...     def method(self):
...         pass
...
>>> c = C()
>>> c.method.whoami = 'my name is method'  # нельзя установить на методе
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'instancemethod' object has no attribute 'whoami'
>>> c.method.im_func.whoami = 'my name is method'
>>> c.method.whoami
'my name is method'

Дополнительную информацию см. в разделе Стандартная иерархия типов.

5.12.5. Объекты кодаCode Objects

Объекты кода используются реализацией для представления «псевдокомпилированного» исполняемого кода Python, такого как тело функции. Они отличаются от объектов функций тем, что не содержат ссылки на глобальное окружение выполнения. Объекты кода возвращаются встроенной функцией compile() и могут быть получены из объектов функций через их атрибут func_code. См. также модуль code.

Объект кода может быть выполнен или вычислен путём передачи его (вместо строки исходного кода) оператору exec или встроенной функции eval().

Дополнительную информацию см. в разделе Стандартная иерархия типов.

5.12.6. Объекты типовType Objects

Объекты типов представляют различные типы объектов. Тип объекта можно получить с помощью встроенной функции type(). Над типами не определено специальных операций. Стандартный модуль types определяет имена для всех стандартных встроенных типов.

Типы записываются так: <type 'int'>.

5.12.7. Объект NoneThe Null Object

Этот объект возвращается функциями, которые не возвращают значение явно. Он не поддерживает никаких специальных операций. Существует ровно один нулевой объект с именем None (встроенное имя).

Он записывается как None.

5.12.8. Объект EllipsisThe Ellipsis Object

Этот объект используется расширенной нотацией срезов (см. Срезы). Он не поддерживает никаких специальных операций. Существует ровно один объект-многоточие с именем Ellipsis (встроенное имя).

Оно записывается как Ellipsis. В индексе его также можно записать как ..., например seq[...].

5.12.9. Объект NotImplementedThe NotImplemented Object

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

Он записывается как NotImplemented.

5.12.10. Логические значенияBoolean Values

Логические значения – это два постоянных объекта False и True. Они используются для представления истинностных значений (хотя другие значения также могут считаться ложными или истинными). В числовых контекстах (например, при передаче в арифметическую операцию) они ведут себя как целые числа 0 и 1 соответственно. Встроенная функция bool() может быть использована для преобразования любого значения в логическое, если значение может быть интерпретировано как истинностное значение (см. раздел Проверка истинности выше).

Они записываются как False и True соответственно.

5.12.11. Внутренние объектыInternal Objects

См. Стандартная иерархия типов для получения этой информации. В нем описываются объекты стековых кадров, объекты трассировки и объекты срезов.

5.13. Специальные атрибутыSpecial Attributes

Реализация добавляет несколько специальных атрибутов только для чтения к некоторым типам объектов, где это уместно. Некоторые из них не сообщаются встроенной функцией dir().

object.__dict__

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

object.__methods__

Устарело с версии 2.2: Используйте встроенную функцию dir() для получения списка атрибутов объекта. Этот атрибут больше не доступен.

object.__members__

Устарело с версии 2.2: Используйте встроенную функцию dir() для получения списка атрибутов объекта. Этот атрибут больше не доступен.

instance.__class__

Класс, которому принадлежит экземпляр класса.

class.__bases__

Кортеж базовых классов объекта класса.

definition.__name__

Имя класса, типа, функции, метода, дескриптора или экземпляра генератора.

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

class.__mro__

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

class.mro()

Этот метод может быть переопределён метаклассом для настройки порядка разрешения методов для его экземпляров. Он вызывается при создании класса, и его результат сохраняется в __mro__.

class.__subclasses__()

Каждый класс нового стиля хранит список слабых ссылок на свои непосредственные подклассы. Этот метод возвращает список всех тех ссылок, которые ещё живы. Пример:

>>> int.__subclasses__()
[<type 'bool'>]

Сноски

1

Дополнительную информацию об этих специальных методах можно найти в Справочном руководстве Python (Базовая настройка).

2

Как следствие, список [1, 2] считается равным [1.0, 2.0], и аналогично для кортежей.

3

Они должны иметь, поскольку синтаксический анализатор не может определить тип операндов.

4(1,2,3,4)

Символы с учётом регистра – это те, у которых свойство общей категории является одним из «Lu» (буква, верхний регистр), «Ll» (буква, нижний регистр) или «Lt» (буква, заглавная).

5

Чтобы отформатировать только кортеж, следует предоставить одноэлементный кортеж, единственным элементом которого является форматируемый кортеж.

6

Преимущество сохранения символа новой строки в том, что возврат пустой строки является однозначным признаком конца файла (EOF). Также можно определить, заканчивается ли последняя строка файла символом новой строки или нет (да, такое бывает!), что может иметь значение, например, при создании точной копии файла во время построчного чтения.