Главная страница
Навигация по странице:

  • Операции над числами Ниже перечислены операции, которые могут применяться ко всем число- вым типам:Операция Описание

  • Операция Описание

  • Функция Описание

  • Символ формата Выходной формат

  • Дополнительные возможности форматирования

  • Операции над словарями Словари реализуют отображение между именами и объектами. К ним мо- гут применяться следующие операции:Операция Описание

  • Операции над множествами Типы set и frozenset поддерживают ряд общих операций: Операция Описание

  • Комбинированные операторы присваивания В языке Python поддерживаются следующие комбинированные операторы присваивания:Операция Описание

  • Оператор доступа к атрибутам (.)

  • Оператор вызова функции ()

  • Логические выражения и значения истинности

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

  • справочник по Python. мм isbn 9785932861578 9 785932 861578


    Скачать 4.21 Mb.
    Названиемм isbn 9785932861578 9 785932 861578
    Анкорсправочник по Python
    Дата08.05.2022
    Размер4.21 Mb.
    Формат файлаpdf
    Имя файлаBizli_Python-Podrobnyy-spravochnik.440222.pdf
    ТипСправочник
    #518195
    страница9 из 82
    1   ...   5   6   7   8   9   10   11   12   ...   82

    Глава
    4
    .
    Операторы и выражения
    В этой главе описываются встроенные операторы, выражения и порядок их вычисления в языке Python. Несмотря на то что в этой главе описыва-
    Python. Несмотря на то что в этой главе описыва-
    . Несмотря на то что в этой главе описыва- ются встроенные типы, тем не менее пользовательские объекты легко мо- гут переопределять любые из этих операторов для реализации собственно- го поведения.
    Операции над числами
    Ниже перечислены операции, которые могут применяться ко всем число- вым типам:
    Операция
    Описание
    x + y
    Сложение
    x y
    Вычитание
    x * y
    Умножение
    x / y
    Деление
    x // y
    Деление с усечением
    x ** y
    Возведение в степень (x y
    )
    x % y
    Деление по модулю (x mod y)
    -
    x
    Унарный минус
    +
    x
    Унарный плюс
    Оператор деления с усечением (//, также известный, как оператор деления
    с округлением вниз
    ) отсекает дробную часть и действует как с целыми чис- лами, так и с числами с плавающей точкой. В Python 2 оператор истинного деления (/) также усекает результат до целого, если операнды являются целыми числами. То есть выражение 7/4 даст в результате 1, а не 1.75. Од- нако в Python 3 такое поведение было изменено, и теперь оператор деления

    Операции над числами
    97
    возвращает результат с плавающей точкой. Оператор деления по модулю возвращает остаток от деления x // y. Например, выражение 7 % 4 вернет 3.
    Для чисел с плавающей точкой оператор деления по модулю возвращает остаток с плавающей точкой от деления x // y, то есть результат выраже- ния x – (x // y) * y. Для комплексных чисел операторы деления по модулю
    (%) и деления с усечением (//) считаются недопустимыми.
    Ниже перечислены операторы сдвига и битовые операторы, которые могут применяться только к целым числам:
    Операция
    Описание
    x << y
    Сдвиг влево
    x >> y
    Сдвиг вправо
    x & y
    Битовая операция «И»
    x | y
    Битовая операция «ИЛИ»
    x ^ y
    Битовая операция «исключающее ИЛИ»


    x
    Битовая операция «НЕ»
    Битовые операторы предполагают, что целые числа имеют дополнительное двоичное представление, а знаковый бит расширяется влево до бесконеч- ности. При работе с битовыми данными, которые должны отображаться в аппаратное представление целых чисел, следует проявлять некоторую осторожность. Это обусловлено тем, что интерпретатор Python не усекает биты и допускает возможность переполнения, то есть результат может ока- заться сколь угодно большой величиной.
    Кроме того, ко всем числовым типам допускается применять следующие встроенные функции:
    Функция
    Описание
    abs(
    x)
    Абсолютное значение divmod(
    x,y)
    Возвращает кортеж (x // y, x % y)
    pow(
    x,y [,modulo])
    Возвращает результат выражения (x ** y) % modulo
    round(
    x,[n])
    Округляет до ближайшего кратного 10
    -n
    (только для чисел с плавающей точкой)
    Функция abs() возвращает абсолютное значение числа. Функция divmod() возвращает частное и остаток от деления и может применяться к любым числам, кроме комплексных. Функция pow() может использоваться вместо оператора **, но при этом она дополнительно поддерживает возможность одновременного возведения в степень и деления по модулю (часто использу-
    (часто использу- часто использу- использу- использу- ется в криптографических алгоритмах). Функция round() округляет число с плавающей точкой x до ближайшего, кратного 10 в степени минус n. Если аргумент n опущен, он принимается равным 0. Если число x одинаково близко к двум кратным значениям, в Python 2 округление будет выполнено

    98
    Глава 4. Операторы и выражения до множителя, который дальше отстоит от нуля (например, значение 0.5 будет округлено до 1.0, а значение -0.5 – до -1.0). В Python 3, при одинаковой близости к двум кратным значениям, округление будет выполнено до бли- жайшего четного кратного (например, значение 0.5 будет округлено до 0.0, а значение 1.5 – до 2.0). Эта особенность представляет серьезную проблему переноса математических программ на Python 3.
    Следующие операторы сравнения имеют стандартную математическую ин- терпретацию и возвращают логическое значение True, если выражение ис- тинно, и False, если выражение ложно:
    Операция
    Описание
    x < y
    Меньше чем
    x > y
    Больше чем
    x == y
    Равно
    x != y
    Не равно
    x >= y
    Больше или равно
    x <= y
    Меньше или равно
    Операторы сравнения можно объединять в целые последовательности, на- пример: w < x < y < z. Такая последовательность эквивалентна выражению
    w < x and x < y and y < z
    . Такие выражения, как x < y > z, также счи- таются допустимыми, но они будут сбивать с толку тех, кто будет читать такой программный код (важно заметить, что в этом выражении значения
    x
    и z никак не сравниваются). Когда в операции сравнения участвуют ком- плексные числа, возникает неопределенность, поэтому в результате будет возбуждаться исключение TypeError.
    Операции над числами являются допустимыми, только если операн- ды принадлежат одному и тому же типу. При выполнении операций над встроенными числовыми типами производится принудительное приведе- ние типов в соответствии со следующими правилами:
    1. Если один из операндов является комплексным числом, другой операнд также преобразуется в комплексное число.
    2. Если один из операндов является числом с плавающей точкой, другой операнд также преобразуется в число с плавающей точкой.
    3. В противном случае оба числа должны быть целыми числами и приве- дение типов не выполняется.
    Поведение выражения, в котором наряду с числами участвуют пользова- тельские объекты, зависит от реализаций этих объектов. В подобных слу- чаях, как правило, интерпретатор не пытается выполнять неявное преоб- разование типов.

    Операции над последовательностями
    99
    Операции над последовательностями
    Н
    иже перечислены операторы, которые могут применяться к разным ти- пам последовательностей, включая строки, списки и кортежи:
    Операция
    Описание
    s + r
    Конкатенация
    s * n, n * s
    Создает n копий последовательности s, где n – целое число
    v1,v2…, vn = s
    Распаковывание последовательности в переменные
    s[i]
    Обращение к элементу по индексу
    s[i:j]
    Получение среза
    s[i:j:stride]
    Расширенная операция получения среза
    x in s, x not in s
    Проверка на вхождение for
    x in s:
    Итерации all(
    s)
    Возвращает True, если все элементы последовательности s
    оцениваются, как истинные any(
    s)
    Возвращает True, если хотя бы один элемент последова- тельности s оценивается, как истинный len(
    s)
    Длина последовательности min(
    s)
    Минимальный элемент в последовательности s
    max(
    s)
    Максимальный элемент в последовательности s
    sum(
    s [, initial])
    Сумма элементов последовательности с необязательным начальным значением
    Оператор + объединяет две последовательности одного и того же типа. Опе- ратор s * n создает n копий последовательности. Однако при этом выполня-
    Однако при этом выполня- ется лишь поверхностное копирование, когда копируются только ссылки на элементы. В качестве иллюстрации рассмотрим следующий пример:
    >>>
    a = [3,4,5]
    >>>
    b = [a]
    >>>
    c = 4*b
    >>>
    c
    [[3, 4, 5], [3, 4, 5], [3, 4, 5], [3, 4, 5]]
    >>>
    a[0] = -7
    >>>
    c
    [[-7, 4, 5], [-7, 4, 5], [-7, 4, 5], [-7, 4, 5]]
    >>>
    Обратите внимание, как изменения коснулись сразу нескольких элементов в списке c. В данном случае ссылки из списка a были скопированы в спи- сок b. В процессе копирования списка b были созданы четыре дополнитель- ные ссылки на каждый из его элементов. Наконец, при изменении элемен-

    100
    Глава 4. Операторы и выражения та в списке a это изменение коснулось всех остальных «копий» данного элемента. Такое поведение оператора умножения последовательностей за- частую становится неожиданностью и не соответствует намерениям про- граммиста. Один из способов ликвидировать эту проблему состоит в том, чтобы вручную создать копируемую последовательность, продублировав содержимое списка a. Например:
    a = [ 3, 4, 5 ]
    c = [list(a) for j in range(4)] # Функция list() создает копию списка
    Кроме того, для копирования объектов можно также использовать модуль copy из стандартной библиотеки.
    Все последовательности могут быть распакованы в последовательность пе- ременных. Например:
    items = [ 3, 4, 5 ]
    x,y,z = items # x = 3, y = 4, z = 5
    ёё
    letters = “abc”
    x,y,z = letters # x = ‘a’, y = ‘b’, z = ‘c’
    ёё
    datetime = ((5, 19, 2008), (10, 30, “am”))
    (month,day,year),(hour,minute,am_pm) = datetime
    При распаковывании последовательностей в переменные число этих пере- менных должно в точности соответствовать количеству элементов в по- следовательности. Кроме того, структура переменных должна точно со- ответствовать организации последовательности. Так, в последней строке предыдущего примера последовательность распаковывается в шесть пере- менных, организованных в виде двух кортежей по 3 элемента в каждом, что соответствует структуре последовательности справа. Операция распа- ковывания в переменные может применяться к любым типам последова- тельностей, включая последовательности, создаваемые итераторами и ге- нераторами.
    Оператор индексирования s[n] возвращает n-й объект в последовательно- сти, где s[0] соответствует первому объекту. Для извлечения элементов, на- чиная с конца последовательности, допускается использовать отрицатель- ные индексы. Например, выражение s[-1] вернет последний элемент. При попытке обратиться по индексу, выходящему за пределы последовательно- сти, будет возбуждено исключение IndexError.
    Оператор среза s[i:j] позволяет извлекать фрагменты последовательности, состоящие из элементов, чьи индексы k удовлетворяют условию i <= k < j.
    Оба значения, i и j, должны быть целыми или длинными целыми числа- ми. Если опустить начальный и/или конечный индекс, вместо них будут использованы значения начального и конечного индекса оригинальной по- следовательности соответственно. Допускается использовать отрицатель- ные индексы, в этом случае они будут откладываться относительно конца последовательности. При выходе индексов i и/или j за пределы последова- тельности в качестве их значений будут использованы значения начального и конечного индексов оригинальной последовательности соответственно.

    Операции над последовательностями
    101
    В операторе среза можно дополнительно указывать значение шага,
    s[i:j:stride]
    , что вынудит оператор пропускать элементы оригинальной последовательности. Однако поведение такого оператора требует допол- поведение такого оператора требует допол- поведение такого оператора требует допол- такого оператора требует допол- такого оператора требует допол- оператора требует допол- оператора требует допол- требует допол- требует допол- допол- допол- нительных пояснений. Если в операторе указаны величина шага stride, начальный индекс i и конечный индекс j, то он вернет подпоследователь- ность с элементами s[i], s[i+stride], s[i+2*stride] и так далее, пока не будет достигнут индекс j (значение которого не включается в диапазон индексов отбираемых элементов). Шаг stride также может быть отрицательным чис- также может быть отрицательным чис- может быть отрицательным чис- может быть отрицательным чис- быть отрицательным чис- быть отрицательным чис- отрицательным чис- отрицательным чис- чис- чис- лом. Если опустить индекс i, вместо него будет использован индекс перво- го элемента последовательности, если шаг задан положительным числом, и индекс последнего элемента – если шаг задан отрицательным числом.
    Если опустить индекс j, вместо него будет использован индекс последне- го элемента последовательности, если шаг stride задан положительным числом, и индекс первого элемента – если шаг stride задан отрицательным числом. Например:
    a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    ёё
    b = a[::2] # b = [0, 2, 4, 6, 8 ]
    c = a[::-2] # c = [9, 7, 5, 3, 1 ]
    d = a[0:5:2] # d = [0,2]
    e = a[5:0:-2] # e = [5,3,1]
    f = a[:5:1] # f = [0,1,2,3,4]
    g = a[:5:-1] # g = [9,8,7,6]
    h = a[5::1] # h = [5,6,7,8,9]
    i = a[5::-1] # i = [5,4,3,2,1,0]
    j = a[5:0:-1] # j = [5,4,3,2,1]
    Оператор x in s проверяет присутствие объекта x в последовательности s и возвращает значение True или False. Аналогично оператор x not in s про- веряет отсутствие объекта x в последовательности s. Для строк операторы in и not in принимают подстроки. Например, выражение’hello’ in ‘hello world’
    вернет значение True. Важно заметить, что оператор in не поддержи- вает шаблонные символы или регулярные выражения. Если потребуется задействовать регулярные выражения, следует использовать библиотеч- ный модуль, например re.
    Оператор for x in s выполняет итерации по всем элементам последователь- ности и подробно описывается в главе 5 «Структура программы и управ- ление потоком выполнения». Функция len(s) возвращает количество эле- ментов в последовательности. Функции min(s) и max(s) возвращают мини- мальное и максимальное значения в последовательности соответственно; единственное ограничение состоит в том, что элементы последовательности должны поддерживать возможность упорядочения с помощью оператора <
    (например, нет смысла искать максимальное значение в списке файловых объектов). Функция sum(s) возвращает сумму всех элементов в последова- тельности s, но обычно может применяться только к последовательностям числовых значений. Дополнительно эта функция может принимать необя- зательное начальное значение. Обычно тип этого значения определяет тип результата. Например, вызов sum(items, decimal.Decimal(0)) вернет в резуль- тате объект типа Decimal (подробнее о модуле decimal рассказывается в гла- ве 14 «Математика»).

    102
    Глава 4. Операторы и выражения
    Строки и кортежи являются неизменяемыми объектами и не могут изме- няться после их создания. Списки могут изменяться с помощью следую- щих операторов:
    Операция
    Описание
    s[i] = x
    Присваивание элементу с указанным индексом
    s[i:j] = r
    Присваивание срезу
    s[i:j:stride] = r
    Расширенная операция присваивания срезу del
    s[i]
    Удаление элемента del
    s[i:j]
    Удаление среза del
    s[i:j:stride]
    Расширенная операция удаления среза
    Оператор s[i] = x изменяет значение элемента списка с индексом i, записы- вая в него объект x и увеличивая счетчик ссылок на объект x. Отрицатель- ные индексы откладываются относительно конца списка, а при попытке присвоить значение элементу с индексом, выходящим за пределы последо- вательности, будет возбуждено исключение IndexError. Оператор присваива- ния срезу s[i:j] = r заменит все элементы с индексами k, где i <= k < j, на элементы из последовательности r. Значения индексов подчиняются тем же правилам, что и в операторе получения среза, и при выходе за допу- стимый диапазон принимаются равными индексам начала или конца спи- ска. При необходимости размер последовательности s увеличивается или уменьшается, в зависимости от количества элементов в последовательно- сти r. Например:
    a = [1,2,3,4,5]
    a[1] = 6 # a = [1,6,3,4,5]
    a[2:4] = [10,11] # a = [1,6,10,11,5]
    a[3:4] = [-1,-2,-3] # a = [1,6,10,-1,-2,-3,5]
    a[2:] = [0] # a = [1,6,0]
    Оператор присваивания срезу может принимать дополнительный пара- метр шага. Однако это накладывает дополнительные ограничения, в том смысле, что последовательность справа от оператора присваивания должна содержать количество элементов, в точности соответствующее количеству элементов в срезе. Например:
    a = [1,2,3,4,5]
    a[1::2] = [10,11] # a = [1,10,3,11,5]
    a[1::2] = [30,40,50] # ValueError. В срезе слева имеется всего два элемента
    Оператор del s[i] удалит из списка элемент с индексом i и уменьшит его счетчик ссылок. Оператор del s[i:j] удалит из списка все элементы, попав- шие в срез. Допускается указывать дополнительный параметр шага, на- пример: del s[i:j:stride].
    Последовательности могут сравниваться с помощью операторов <, >, <=,
    >=
    , == и !=. В этом случае сравниваются первые элементы двух последова- тельностей. Их отличие определяет результат операции. Если они равны,

    Форматирование строк
    103
    сравниванию подвергаются вторые элементы последовательностей. Этот процесс продолжается, пока не будут найдены различающиеся элементы или пока не будут исчерпаны все элементы любой из последовательностей.
    Если одновременно был достигнут конец обеих последовательностей, они признаются равными. Если a является частью последовательности b, то бу- дет признано, что a < b.
    Строки сравниваются по порядку следования символов в алфавите. Каж- дому символу присваивается уникальный числовой индекс, определяе- мый кодировкой символов (такой как ASCII или Юникод). Один символ считается меньше другого, если его индекс в алфавите меньше. Следует отметить, что предыдущие простые операторы сравнения не учитывают правила упорядочения символов, которые зависят от региональных или языковых настроек. То есть эти операторы не должны использоваться для упорядочения строк в соответствии со стандартными соглашениями, при- нятыми для разных языков (за дополнительной информацией обращай- тесь к описаниям модулей unicodedata и locale).
    Еще одно предупреждение, на сей раз связанное с типами строк. В языке
    Python имеется два типа строковых данных: байтовые строки и строки
    Юникода. Байтовые строки отличаются от строк Юникода тем, что как правило, они уже содержат символы в определенной кодировке, тогда как строки Юникода содержат некодированные значения символов. По этой причине никогда не следует смешивать байтовые строки и строки Юнико- да в выражениях или сравнивать их (например, использовать оператор + для конкатенации байтовой строки со строкой Юникода или использовать оператор == для сравнивания таких разнородных строк). При попытке вы- полнения операций над разнотипными строками в Python 3 возбуждается исключение TypeError, но в Python 2 в таких случаях выполняется неявное приведение байтовых строк к типу строк Юникода. Эта особенность Py-
    Py- thon 2 во многих случаях считается ошибкой и часто является источни-
    2 во многих случаях считается ошибкой и часто является источни- ком непредвиденных исключений и необъяснимого поведения программы.
    Поэтому, чтобы избавить себя от лишней головной боли, никогда не смеши- вайте разнотипные строки в операциях над последовательностями.
    Форматирование строк
    Оператор деления по модулю (s % d) используется для форматирования строк, где s – строка формата, а d – коллекция объектов в виде кортежа или отображения (словаря). Поведение этого оператора напоминает функцию sprintf()
    в языке C. Строка формата может содержать элементы двух типов: обычные символы (которые остаются в неизменном виде) и спецификаторы формата, каждый из которых замещается форматированным строковым представлением элементов в кортеже или в отображении. Если аргумент
    d
    является кортежем, количество спецификаторов формата должно в точ- ности соответствовать количеству объектов в кортеже d. Если аргумент d является отображением, каждый спецификатор формата должен быть ас- социирован с допустимым именем ключа в отображении (с использовани- ем круглых скобок, как будет описано чуть ниже). Каждый спецификатор

    104
    Глава 4. Операторы и выражения должен начинаться с символа % и заканчиваться одним из символов форма- тирования, перечисленных в табл. 4.1.
    Таблица 4.1. Спецификаторы формата
    Символ формата
    Выходной формат
    d, i
    Целое или длинное целое десятичное число.
    u
    Целое или длинное целое число без знака.
    o
    Целое или длинное целое восьмеричное число.
    x
    Целое или длинное целое шестнадцатеричное число.
    X
    Целое или длинное целое шестнадцатеричное число (с сим- волами в верхнем регистре).
    f
    Число с плавающей точкой в формате [-]m.dddddd.
    e
    Число с плавающей точкой в формате [-]m.dddddde
    ±
    xx
    E
    Число с плавающей точкой в формате [-]m.ddddddE
    ±
    xx
    g, G
    Использует спецификатор %e или %E, если экспонента меньше
    -4 или больше заданной точности; в противном случае исполь- зует спецификатор %f s
    Строка или любой объект. Для создания строкового пред- ставления объектов используется функция str().
    r
    Воспроизводит ту же строку, что и функция repr().
    c
    Единственный символ.
    %
    Символ %.
    Между символом % и символом формата могут добавляться следующие мо- дификаторы в указанном порядке:
    1. Имя ключа в круглых скобках, с помощью которого выбирается эле- мент из объекта отображения. Если такой элемент отсутствует, возбуж- дается исключение KeyError.
    2. Один или более следующих символов:
    • Знак -, определяет выравнивание по левому краю. По умолчанию значения выравниваются по правому краю.
    • Знак +, указывает на необходимость обязательного включения знака для числовых значений (даже для положительных).
    • 0, указывает на необходимость заполнения нулями.
    3. Число, определяющее минимальную ширину поля. Форматируемое значение будет выводиться в поле, ширина которого не может быть меньше указанной, и дополняться добавочными символами слева (или справа, если указан флаг –) до указанной ширины поля.
    4. Точка, отделяющая значение ширины поля от значения точности.
    5. Число, определяющее максимальное количество символов при выво- де строк; количество цифр после десятичной точки, при выводе чисел

    Дополнительные возможности форматирования
    105
    с плавающей точкой, или минимальное количество цифр, при выводе целых чисел.
    Кроме того, в модификаторах вместо числовых значений ширины поля и точности допускается использовать символ звездочки (*). В этом случае значения ширины и точности будут браться из элементов кортежа, пред- шествующих форматируемому значению.
    В следующем фрагменте приводится несколько примеров:
    a = 42
    b = 13.142783
    c = “hello”
    d = {‘x’:13, ‘y’:1.54321, ‘z’:’world’}
    e = 5628398123741234
    r = “a is %d” % a # r = “a is 42”
    r = “%10d %f” % (a,b) # r = “ 42 13.142783”
    r = “%+010d %E” % (a,b) # r = “+000000042 1.314278E+01”
    r = “%(x)-10d %(y)0.3g” % d # r = “13 1.54”
    r = “%0.4s %s” % (c, d[‘z’]) # r = “hell world”
    r = “%*.*f” % (5,3,b) # r = “13.143”
    r = “e = %d” % e # r = “e = 5628398123741234”
    При использовании со словарями оператор форматирования строк % часто используется для имитации такой особенности, как подстановка значений переменных в строки, которую нередко можно встретить в языках сцена- риев (такой как подстановка значения переменной $var в строку). Напри- мер, если имеется некоторый словарь, значения его элементов можно вста- вить в строку формата, как показано ниже:
    stock = {
    ‘name’ : ‘GOOG’,
    ‘shares’ : 100,
    ‘price’ : 490.10 }
    ёё
    r = “%(shares)d акций компании %(name)s по цене %(price)0.2f” % stock
    # r = “100 акций компании GOOG по цене 490.10”
    Следующий фрагмент демонстрирует, как можно вставить в строку теку- щие значения переменных. Функция vars() возвращает словарь, содержа- щий все переменные, определенные к моменту ее вызова.
    name = “Элвуд”
    age = 41
    r = “%(name)s, возраст %(age)s год” % vars()
    Дополнительные возможности форматирования
    Строковый метод s.format(*args, **kwargs) обеспечивает дополнительные возможности форматирования. Этот метод принимает произвольные кол- лекции позиционных и именованных аргументов и подставляет их зна- чения на место символов подстановки в строке s. Символы подстановки в формате ‘{n}’, где n – число, замещаются соответствующими позиционны- ми аргументами метода format(). Символы подстановки в формате ‘{name}’

    106
    Глава 4. Операторы и выражения замещаются соответствующими именованными аргументами. Чтобы вы- вести один символ ‘{‘, следует использовать ‘{{‘, и ‘}}’ – чтобы вывести один символ ‘}’. Например:
    r = “{0} {1} {2}”.format(‘GOOG’,100,490.10)
    r = “{name} {shares} {price}”.format(name=’GOOG’,shares=100,price=490.10)
    r = “Привет, {0}, ваш возраст {age} год”.format(“Элвуд”,age=47)
    r = “Комбинации {{ и }} используются для вывода фигурных скобок”.format()
    Каждый символ подстановки может сопровождаться дополнительным ин- дексом или именем атрибута. Например, в строке ‘{name[n]}’, где n – целое число, на место символа подстановки будет вставлен n-й элемент последо- вательности name, а в строке ‘{name[key]}’, где key – нечисловая строка, будет вставлен элемент словаря name[‘key’]. В строке ‘{name.attr}’ на место сим- вола подстановки будет вставлено значение атрибута name.attr. Например:
    stock = { ‘name’ : ‘GOOG’,
    ‘shares’ : 100,
    ‘price’ : 490.10 }
    ёё
    r = “{0[name]} {0[shares]} {0[price]}”.format(stock)
    x = 3 + 4j r = “{0.real} {0.imag}”.format(x)
    В этих символах подстановки допускается использовать только действи- тельные имена. Произвольные выражения, вызовы методов и другие опе- рации не поддерживаются.
    Для более точного управления результатами вместе с символами подста- новки можно использовать спецификаторы формата. Для этого к каждому символу подстановки можно добавить необязательный спецификатор фор- мата, через двоеточие (:), например: ‘{place:format_spec}’. При таком подхо- де можно указывать ширину поля, количество десятичных разрядов и вы- равнивание. Ниже приводятся несколько примеров:
    r = “{name:8} {shares:8d} {price:8.2f}”.format
    (name=”GOOG”,shares=100,price=490.10)
    В общем виде спецификатор формата имеет вид [[fill[align]][sign][0][width]
    [.
    precision][type]
    , где каждая часть, заключенная в [], является необяза- тельной. Значение width определяет минимальную ширину поля, а в каче- стве спецификатора align можно использовать символ ‘<’, ‘>’ или ‘^’, для выравнивания по левому краю, по правому краю или по центру. Необяза- тельное значение fill определяет символ, который будет использоваться для дополнения результата до требуемой ширины поля. Например:
    name = “Elwood”
    r = “{0:<10}”.format(name) # r = ‘Elwood ‘
    r = “{0:>10}”.format(name) # r = ‘ Elwood’
    r = “{0:^10}”.format(name) # r = ‘ Elwood ‘
    r = “{0:=^10}”.format(name) # r = ‘==Elwood==’
    Значение type определяет тип данных. В табл. 4.2 перечислены все поддер- живаемые типы форматируемых данных. Если значение type не указано,

    Дополнительные возможности форматирования
    107
    по умолчанию для строк используется код ‘s’, для целых чисел – ‘d’ и для чисел с плавающей точкой – ‘f’.
    Таблица 4.2. Дополнительные коды типов для спецификаторов формата
    Символ формата
    Выходной формат
    d, i
    Целое или длинное целое десятичное число.
    b
    Целое или длинное целое двоичное число.
    o
    Целое или длинное целое восьмеричное число.
    x
    Целое или длинное целое шестнадцатеричное число.
    X
    Целое или длинное целое шестнадцатеричное число (с сим- волами в верхнем регистре).
    f, F
    Число с плавающей точкой в формате [-]m.dddddd.
    e
    Число с плавающей точкой в формате [-]m.dddddde
    ±
    xx
    E
    Число с плавающей точкой в формате [-]m.ddddddE
    ±
    xx
    g, G
    Использует спецификатор e или E, если экспонента меньше
    -4 или больше заданной точности; в противном случае ис- пользует спецификатор f.
    n
    То же, что и g, только символ десятичной точки определя- ется в соответствии с региональными настройками.
    %
    Умножает число на 100 и отображает его с использованием формата f, завершая символом %.
    s
    Строка или любой другой объект. Для создания строкового представления объекта используется функция str().
    c
    Одиночный символ.
    В качестве значения sign в спецификаторе формата допускается использо- вать символ ‘+’, ‘-’ или ‘ ‘. Значение ‘+’ указывает, что перед всеми числа- ми должен добавляться их знак. Значение ‘-’ указывает, что знак должен добавляться только для отрицательных чисел. Если указано значение ‘ ‘, перед положительными числами добавляется ведущий пробел. Значение
    precision
    определяет количество цифр после запятой для десятичных чи- сел. Если перед значением width ширины поля указан ведущий символ ‘0’, числовые значения будут дополняться слева ведущими нулями до требуе- мой ширины поля. Ниже приводятся некоторые примеры форматирования различных числовых значений:
    x = 42
    r = ‘{0:10d}’.format(x) # r = ‘ 42’
    r = ‘{0:10x}’.format(x) # r = ‘ 2a’
    r = ‘{0:10b}’.format(x) # r = ‘ 101010’
    r = ‘{0:010b}’.format(x) # r = ‘0000101010’
    y = 3.1415926
    r = ‘{0:10.2f}’.format(y) # r = ‘ 3.14’
    r = ‘{0:10.2e}’.format(y) # r = ‘ 3.14e+00’

    108
    Глава 4. Операторы и выражения r = ‘{0:+10.2f}’.format(y) # r = ‘ +3.14’
    r = ‘{0:+010.2f}’.format(y) # r = ‘+000003.14’
    r = ‘{0:+10.2%}’.format(y) # r = ‘ +314.16%’
    При необходимости значения различных элементов спецификаторов фор- мата могут определяться в виде аргументов, передаваемых методу format().
    Доступ к ним осуществляется как и к другим элементам строки формата.
    Например:
    y = 3.1415926
    r = ‘{0:{width}.{precision}f}’.format(y,width=10,precision=3)
    r = ‘{0:{1}.{2}f}’.format(y,10,3)
    При таком подходе подставляемые значения могут определяться только на первом уровне вложенности и должны соответствовать элементам специ- фикаторов формата. Кроме того, у подставляемых значений не может быть собственных спецификаторов формата.
    Следует заметить, что объекты могут определять собственный набор спе- цификаторов формата. За кулисами метод format() вызывает специальный метод __format__(self, format_spec) для каждого форматируемого значения.
    Благодаря этому имеется возможность изменить поведение метода format() и реализовать обработку спецификаторов в объекте. Например, даты, вре- мя и объекты других типов могут определять свои собственные коды фор- матирования.
    В некоторых случаях может потребоваться просто отформатировать стро- ковое представление объекта, воспроизводимое функциями str() и repr(), в обход функциональности, реализованной в методе __format__(). Для этого перед спецификатором формата достаточно добавить модификатор ‘!s’ или
    ‘!r’
    . Например:
    name = “Гвидо”
    r = ‘{0!r:^20}’.format(name) # r = “ ‘Гвидо’ “
    Операции над словарями
    Словари
    реализуют отображение между именами и объектами. К ним мо- гут применяться следующие операции:
    Операция
    Описание
    x = d[k]
    Обращение к элементу с ключом key
    d[k]= x
    Присваивание элементу с ключом key
    del
    d[k]
    Удаление элемента с ключом key
    k in d
    Проверка наличия элемента с ключом key len(
    d)
    Количество элементов в словаре
    В качестве ключей допускается использовать любые неизменяемые объ- екты, такие как строки, числа и кортежи. Кроме того, в качестве ключей

    Операции над множествами
    109
    можно использовать списки значений, разделенные запятыми, как пока- зано ниже:
    d = { }
    d[1,2,3] = “foo”
    d[1,0,3] = “bar”
    В данном случае в качестве ключей используются кортежи. Учитывая эту особенность, предыдущие операции присваивания можно записать так:
    d[(1,2,3)] = “foo”
    d[(1,0,3)] = “bar”
    Операции над множествами
    Типы set и frozenset поддерживают ряд общих операций:
    Операция
    Описание
    s | t
    Объединение множеств s и t
    s & t
    Пересечение множеств s и t
    st
    Разность множеств s и t
    s ^ t
    Симметричная разность множеств s и t
    len(
    s)
    Количество элементов в множестве max(
    s)
    Максимальное значение min(
    s)
    Минимальное значение
    Тип результата операций объединения, пересечения и разности определя- ется типом левого операнда. Например, если операнд s имеет тип frozenset, результат также будет иметь тип frozenset, даже если операнд t имеет тип set
    Комбинированные операторы присваивания
    В языке Python поддерживаются следующие комбинированные операторы присваивания:
    Операция
    Описание
    x += y
    x = x + y
    x -= y
    x = x - y
    x *= y
    x = x * y
    x /= y
    x = x / y
    x //= y
    x = x // y
    x **= y
    x = x ** y
    x %= y
    x = x % y

    110
    Глава 4. Операторы и выражения
    Операция
    Описание
    x &= y
    x = x & y
    x |= y
    x = x | y
    x ^= y
    x = x ^ y
    x >>= y
    x = x >> y
    x <<= y
    x = x << y
    Э
    ти операторы можно использовать везде, где допускается использовать обычный оператор присваивания. Например:
    a = 3
    b = [1,2]
    c = “Hello %s %s”
    a += 1 # a = 4
    b[1] += 10 # b = [1, 12]
    c %= (“Monty”, “Python”) # c = “Hello Monty Python”
    Комбинированные операторы присваивания не нарушают принцип неиз- меняемости и не производят изменение самих объектов. То есть инструк- ция x += y создаст совершенно новый объект x со значением x + y. Пользова- тельские объекты могут переопределять комбинированные операторы при- сваивания с помощью специальных методов, описанных в главе 3 «Типы данных и объекты».
    Оператор доступа к атрибутам (.)
    Для доступа к атрибутам объектов используется оператор «точка» (.). На- пример:
    foo.x = 3
    print foo.y a = foo.bar(3,4,5)
    В одном выражении может использоваться сразу несколько операторов точки, например: foo.y.a.b. Оператор точки может также применяться к промежуточным результатам функций, например: a = foo.bar(3,4,5).spam.
    Пользовательские объекты могут переопределять или изменять поведе- ние оператора (.). Подробности приводятся в главе 3 и в главе 7 «Классы и объектно-ориентированное программирование».
    Оператор вызова функции ()
    Оператор f(args) используется для вызова функции f. Все аргументы функ- ций представлены выражениями. Перед вызовом функции сначала вычис- ляются все выражения аргументов, в направлении слева направо. Иногда такой порядок вычислений называют аппликативным.
    (продолжение)

    Функции преобразования
    111
    Имеется возможность вычислить ряд аргументов функции заранее, с по- мощью функции partial() из модуля functools. Например:
    def foo(x,y,z):
    return x + y + z
    ёё
    from functools import partial f = partial(foo,1,2) # Запоминает значения для аргументов x и y функции foo f(3) # Вызов foo(1,2,3), возвратит число 6
    Функция partial() вычисляет некоторые из аргументов указанной функ- ции и возвращает объект, который позднее можно вызвать, передав ему недостающие аргументы. В предыдущем примере переменная f представ- ляет функцию, для которой уже были вычислены значения двух первых аргументов. Для вызова этой функции достаточно просто передать ей недо- стающий последний аргумент. Прием предварительного вычисления зна- чений аргументов функции тесно связан с каррингом (currying) – механиз- мом, с помощью которого функция, принимающая несколько аргументов, такая как f(x,y), раскладывается в серию функций, каждая из которых принимает единственный аргумент. Например, зафиксировав значение ар- гумента x, для функции f можно создать новую, частично подготовленную функцию, которой достаточно будет передать значение y, чтобы получить результат.
    Функции преобразования
    Иногда бывает необходимо выполнить преобразование между встроенны- ми типами. Для этого достаточно просто обратиться к имени требуемого типа, как к функции. Кроме того, существует несколько встроенных функ- ций, выполняющих специальные виды преобразований. Все эти функции возвращают новый объект, представляющий преобразованное значение.
    Функция
    Описание
    int(
    x [,base])
    Преобразует объект x в целое число. Если x явля- ется строкой, аргумент base определяет основание системы счисления.
    float(
    x)
    Преобразует объект x в число с плавающей точкой.
    complex(
    real [,imag])
    Преобразует объект x в комплексное число.
    str(
    x)
    Преобразует объект x в строковое представление.
    repr(
    x)
    Преобразует объект x в строковое выражение.
    format(
    x [,format_spec])
    Преобразует объект x в форматированную строку.
    eval(
    str)
    Вычисляет выражение в строке str и возвращает объект.
    tuple(s)
    Преобразует объект s в кортеж.
    list(
    s)
    Преобразует объект s в список.
    set(
    s)
    Преобразует объект s в множество.

    112
    Глава 4. Операторы и выражения
    Функция
    Описание
    dict(
    d)
    Создает словарь. Объект d должен быть последова-
    тельностью кортежей (key, value)
    .
    frozenset(
    s)
    Преобразует объект s в множество типа frozenset.
    chr(
    x)
    Преобразует целое число x в символ.
    unichr(
    x)
    Преобразует целое число x в символ Юникода
    (только в Python 2).
    ord(
    x)
    Преобразует одиночный символ в целое число.
    hex(
    x)
    Преобразует целое число x в строку с шестнадцате- ричным представлением.
    bin(
    x)
    Преобразует целое число x в строку с двоичным представлением.
    oct(
    x)
    Преобразует целое число x в строку с восьмерич- ным представлением.
    Обратите внимание, что функции str() и repr() могут возвращать различ- могут возвращать различ- возвращать различ- возвращать различ- различ- различ- ные результаты. Функция repr() обычно создает строку с выражением, ко- торое можно передать функции eval(), чтобы воссоздать объект, тогда как функция str() возвращает более краткое или отформатированное строко- вое представление объекта (и используется инструкцией print). Функция format(
    x, [format_spec])
    возвращает такое же строковое представление объ- екта, что и оператор форматирования, но применяется к единственному объекту x. На входе она принимает необязательный аргумент format_spec, который является строкой, содержащей спецификаторы формата. Функ- ция ord() возвращает порядковый номер символа. Для символов Юнико- да это значение совпадает с целочисленным значением кодового пункта.
    Функции chr() и unichr() преобразуют целое число в символ.
    Преобразовать строку в число можно с помощью функций int(), float() и complex(). Функция eval() также может преобразовать строку, содержа- щую допустимое выражение, в объект. Например:
    a = int(“34”) # a = 34
    b = long(“0xfe76214”, 16) # b = 266822164L (0xfe76214L)
    b = float(“3.1415926”) # b = 3.1415926
    c = eval(“3, 5, 6”) # c = (3,5,6)
    В функции, создающие контейнеры (list(), tuple(), set() и другие), в каче- стве аргумента можно передавать любые объекты, поддерживающие ите- рации, которые будут выполнены для создания всех элементов создавае- мой последовательности.
    Логические выражения и значения истинности
    Логические выражения формируются с помощью ключевых слов and, or и not. Эти операторы отличаются следующим поведением:
    (продолжение)

    Равенство и идентичность объектов
    113
    Оператор
    Описание
    x or y
    Е
    сли x ложно, возвращается значение y, в противном случае – значение x.
    x and y
    Если x ложно, возвращается значение x, в противном случае – значение y.
    not
    x
    Если x ложно, возвращается 1, в противном случае – 0.
    Когда в логическом контексте определяется истинность или ложность, зна- чение True принимают любые числа, отличные от нуля, а также непустые строки, списки, кортежи и словари. Значение False принимают число 0,
    None
    , а также пустые строки, списки, кортежи и словари. Значение логи- ческого выражения вычисляется слева направо, при этом правый операнд рассматривается, только если его значение может повлиять на значение всего выражения. Например, в выражении a and b операнд b рассматрива- ется, только если операнд a имеет истинное значение. Иногда такой поря- док вычислений называют «сокращенной схемой вычисления».
    Равенство и идентичность объектов
    Оператор равенства (x == y) проверяет равенство значений x и y. В случае списков и кортежей сравниваются все элементы, и значение True возвраща- ется, только если все значения равны. При сравнивании словарей значе- ние True возвращается, только если словари x и y имеют одинаковый набор ключей и объекты с одним и тем же ключом имеют одинаковые значения.
    Два множества считаются равными, если они содержат один и тот же на- бор элементов, которые сравниваются между собой с помощью оператора равенства (==).
    Операторы идентичности (x is y и x is not y) проверяют, ссылаются ли сравниваемые переменные на один и тот же объект. Вообще нет ничего не- обычного, когда x == y, но x is not y.
    Сравнивание объектов несовместимых типов, таких как файлы и числа с плавающей точкой, может быть допустимо, но результат такого сравни- вания непредсказуем и может вообще не иметь никакого смысла. Кроме того, в зависимости от типов операндов, такое сравнивание может приве- сти к исключению.
    Порядок вычисления
    В табл. 4.3 приводится порядок вычисления операторов языка Python (пра-
    Python (пра-
    (пра- вила предшествования). Все операторы, за исключением (**), вычисляются слева направо и перечислены в таблице в порядке убывания приоритета.
    То есть операторы, находящиеся ближе к началу таблицы, вычисляются раньше операторов, находящихся ниже. (Обратите внимание, что операто- ры, объединенные в один подраздел, такие как x * y, x / y, x // y и x % y, имеют одинаковый приоритет.)

    114
    Глава 4. Операторы и выражения
    Таблица 4.3. Порядок вычисления операторов (по убыванию приоритета)
    Оператор
    Название
    (...), [...], {...}
    Создание кортежа, списка и словаря
    s[i], s[i:j]
    Операции доступа к элементам и срезам
    s.attr
    Операции доступа к атрибутам
    f(...)
    Вызовы функций
    +
    x
    , -
    x
    ,
    x
    Унарные операторы
    x ** y
    Возведение в степень (правоассоциативная опера- ция)
    x * y, x / y, x // y, x % y
    Умножение, деление, деление с усечением, деле- ние по модулю
    x + y, x - y
    Сложение, вычитание
    x << y, x >> y
    Битовый сдвиг
    x & y
    Битовая операция «И»
    x ^ y
    Битовая операция «исключающее ИЛИ»
    x | y
    Битовая операция «ИЛИ»
    x < y, x <= y,
    x > y, x >= y,
    x == y, x != y,
    x is y, x is not y
    x in s, x not in s
    Сравнивание, проверка на идентичность, провер- ка на вхождение в состав последовательности not
    x
    Логическое отрицание
    x and y
    Логическая операция «И»
    x or y
    Логическая операция «ИЛИ»
    lambda
    args: expr
    Анонимная функция
    Порядок вычисления операторов, перечисленных в табл. 4.3, не зависит от типов аргументов x и y. Поэтому, хотя пользовательский объект может переопределить отдельные операторы, тем не менее он не в состоянии из- менить порядок их вычисления, приоритеты и правила ассоциативности.
    Условные выражения
    В программировании широко распространен прием присваивания того или иного значения, в зависимости от некоторого условия. Например:
    if a <= b:
    minvalue = a else:
    minvalue = b

    Условные выражения
    115
    Э
    тот программный код можно записать короче, если воспользоваться
    условным выражением
    . Например:
    minvalue = a if a <=b else b
    Первой вычисляется условная часть, находящаяся в середине таких выра- жений. Если в результате получается значение True, вычисляется выраже- ние a, находящееся левее инструкции if. В противном случае вычисляется выражение b, находящееся правее инструкции else.
    Не следует злоупотреблять условными выражениями, потому что чрез- мерное их использование может приводить к путанице (особенно в слу- чае вложения их друг в друга или при включении их в другие сложные выражения). Однако их очень удобно использовать в генераторах списков и в выражениях-генераторах. Например:
    values = [1, 100, 45, 23, 73, 37, 69 ]
    clamped = [x if x < 50 else 50 for x in values]
    print(clamped) # [1, 50, 45, 23, 50, 37, 50]

    1   ...   5   6   7   8   9   10   11   12   ...   82


    написать администратору сайта