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

  • Получение срезов строк

  • Рис. 2.1.

  • Рис. 2.3.

  • Рис. 2.4.

  • Синтаксис Описание

  • Программирование на Python 3. Руководство издательство СимволПлюс


    Скачать 3.74 Mb.
    НазваниеРуководство издательство СимволПлюс
    Дата10.11.2022
    Размер3.74 Mb.
    Формат файлаpdf
    Имя файлаПрограммирование на Python 3.pdf
    ТипРуководство
    #780382
    страница11 из 74
    1   ...   7   8   9   10   11   12   13   14   ...   74
    87
    Поскольку содержимое файлов .py по умолчанию представляет собой текст в кодировке UTF8 Юникод, мы можем использовать в строко
    вых литералах любые символы Юникода. Мы можем даже помещать в строковые литералы символы Юникода, используя шестнадцатерич
    ные экранированные последовательности или названия символов
    Юникода, например:
    >>> euros = "
    Ђ \N{euro sign} \u20AC \U000020AC"
    >>> print(euros)
    € € € €
    В данном случае мы не можем использовать обычную шестнадцатерич
    ную экранированную последовательность, так как она ограничена дву
    мя цифрами и не может представлять символы с кодом больше, чем
    0xFF
    . Обратите внимание, что названия символов Юникода не чувстви
    тельны к регистру и пробелы внутри них являются необязательными.
    Для определения кода символа Юникода (целое число,
    связанное с символом в кодировке Юникод) в строке,
    можно использовать встроенную функцию ord(). Напри
    мер:
    >>> ord(euros[0])
    8364
    >>> hex(ord(euros[0]))
    '0x20ac'
    Точно так же можно преобразовать любое целое число, представляю
    щее собой допустимый код некоторого символа Юникода, воспользо
    вавшись функцией chr():
    >>> s = "anarchists are " + chr(8734) + chr(0x23B7)
    >>> s
    'anarchists are
    ∞√'
    >>> ascii(s)
    "'anarchists are \u221e\u23b7'"
    Если ввести s в среде IDLE, содержимое объекта будет выведено в строковой форме; для строк это означает, что содержимое выводится в кавычках. Если нам потребует
    ся вывести только символы ASCII, мы можем воспользо
    ваться встроенной функцией ascii(), которая возвраща
    ет репрезентативную форму своего аргумента, используя
    7битовые символы ASCII, где это возможно; в против
    ном случае используется наиболее краткая экранирован
    ная последовательность из возможных: \xhh, \uhhhh или
    \Uhhhhhhhh
    . Ниже в этой главе будет показано, как полу
    чить полный контроль над выводом строк.
    Кодировки символов, стр. 112
    Метод
    str.
    format()
    ,
    стр. 100

    88
    Глава 2. Типы данных
    Сравнение строк
    Строки поддерживают обычные операторы сравнения <, <=, ==, !=, >
    и >=. Эти операторы выполняют побайтовое сравнение строк в памяти.
    К сожалению, возникают две проблемы при сравнении, например,
    строк в отсортированных списках. Обе проблемы проявляются во всех языках программирования и не являются характерной особенностью
    Python.
    Первая проблема связана с тем, что символы Юникода могут быть представлены двумя и более последователь
    ностями байтов. Например, °
    A
    (символ Юникода с кодом
    0x00C5
    ) в кодировке UTF8 может быть представлен тремя различными способами: [0xE2, 0x84, 0xAB], [0xC3, 0x85]
    и [0x41, 0xCC, 0x8A]. К счастью, мы можем решить эту проблему. Если импортировать модуль unicodedata и вы
    звать функцию unicodedata.normalize() со значением
    «NFKD» в первом аргументе (эта аббревиатура опреде
    ляет способ нормализации «Normalization Form Compa
    tibility Decomposition» – нормализация в форме совмес
    тимой декомпозиции), то, передав ей строку, содержа
    щую символ °
    A
    , представленный любой из допустимых последовательностей байтов, мы получим строку с симво
    лами в кодировке UTF8, где интересующий нас символ всегда будет представлен последовательностью [0x41,
    0xCC, 0x8A]
    Вторая проблема заключается в том, что порядок сортировки некото
    рых символов зависит от конкретного языка. Например, в шведском языке при сортировке символ
    ..
    а
    следует после символа z, тогда как в немецком языке символ
    ..
    а
    сортируется так, как если бы он был пред
    ставлен последовательностью символов ae. Еще один пример: в анг
    лийском языке символ
    /
    o
    сортируется как символ o, а в датском и нор
    вежском языках он следует после символа z. Со строками Юникода связана масса проблем, которые становятся трудноразрешимыми, ко
    гда одним и тем же приложением могут пользоваться люди разных на
    циональностей (привыкшие к различным порядкам расположения символов), когда строки содержат текст сразу на нескольких языках
    (например, часть строки на испанском, а часть на английском), и осо
    бенно, если учесть, что некоторые символы (такие как стрелки, деко
    ративные и математические символы) не имеют определенного поряд
    ка сортировки.
    Будучи настоящим политиком, во избежание трудноуловимых оши
    бок Python не делает никаких предположений. В смысле сравнения строк это означает, что выполняется побайтовое сравнение строк в па
    мяти. При таком подходе порядок сортировки определяется кодами
    Юникода, что для английского языка дает сортировку в соответствии с кодами ASCII. Перевод всех символов строк в нижний или в верхний
    Кодировки символов, стр. 112

    Строки
    89
    регистр обеспечит более естественный порядок сортировки для анг
    лийского языка. Нормализация может потребоваться, только когда текстовые строки поступают из внешних источников, таких как фай
    лы или сетевые сокеты, но даже в этих случаях едва ли стоит приме
    нять ее, если нет веских доказательств в ее необходимости. При этом мы, конечно, можем настроить методы сортировки, как будет показа
    но в главе 3. Проблема сортировки строк Юникода подробно рассмат
    ривается в документе «Unicode Collation Algorithm» (unicode.org/re
    ports/tr10
    ).
    Получение срезов строк
    Из описания составляющей №3 нам известно, что от
    дельные элементы последовательности, а, следователь
    но, и отдельные символы в строках, могут извлекаться с помощью оператора доступа к элементам ([]). В дейст
    вительности этот оператор намного более универсальный и может использоваться для извлечения не только одно
    го символа, но и целых комбинаций (подпоследователь
    ностей) элементов или символов, когда этот оператор ис
    пользуется в контексте оператора извлечения среза.
    Для начала мы рассмотрим возможность извлечения отдельных сим
    волов. Нумерация позиций символов в строках начинается с 0 и про
    должается до значений длины строки минус 1. Однако допускается ис
    пользовать и отрицательные индексы – в этом случае отсчет начинает
    ся с последнего символа и ведется в обратном направлении к первому символу. На рис. 2.1 показано, как нумеруются позиции символов в строке, если предположить, что было выполнено присваивание s =
    "Light ray"
    Отрицательные индексы удивительно удобны, особенно индекс

    1, ко
    торый всегда соответствует последнему символу строки. Попытка об
    ращения к индексу, находящемуся за пределами строки (или к любо
    му индексу в пустой строке), будет вызывать исключение IndexError.
    Оператор получения среза имеет три формы записи:
    Составляю
    щая №3,
    стр. 32
    s[9]
    s[8]
    s[7]
    s[6]
    s[5]
    s[4]
    s[3]
    s[2]
    s[1]
    s[0]
    s[1]
    s[2]
    s[3]
    s[4]
    s[5]
    s[6]
    s[7]
    s[8]
    L
    i g
    h t
    r a
    y
    Рис. 2.1. Номера позиций символов в строке

    90
    Глава 2. Типы данных seq[start]
    seq[start:end]
    seq[start:end:step]
    Ссылка seq может представлять любую последовательность, такую как список, строку или кортеж. Значения start, end и step должны быть целыми числами (или переменными, хранящими целые числа). Мы уже использовали первую форму записи оператора доступа к элемен
    там: с ее помощью извлекается элемент последовательности с индек
    сом start. Вторая форма записи извлекает подстроку, начиная с эле
    мента с индексом start и заканчивая элементом с индексом end, не
    включая
    его. Третью форму записи мы рассмотрим очень скоро.
    При использовании второй формы записи (с одним двоеточием) мы мо
    жем опустить любой из индексов. Если опустить начальный индекс,
    по умолчанию будет использоваться значение 0. Если опустить конеч
    ный индекс, по умолчанию будет использоваться значение len(seq).
    Это означает, что если опустить оба индекса, например, s[:], это будет равносильно выражению s[0:len(s)], и в результате будет извлечена,
    то есть скопирована, последовательность целиком.
    На рис. 2.2 приводятся некоторые примеры извлечения срезов из стро
    ки s, которая получена в результате присваивания s = "The waxwork man".
    Один из способов вставить подстроку в строку состоит в смешивании операторов извлечения среза и операторов конкатенации. Например:
    >>> s = s[:12] + "wo" + s[12:]
    >>> s
    'The waxwork woman'
    Кроме того, поскольку текст «wo» присутствует в оригинальной стро
    ке, тот же самый эффект можно было бы получить путем присваива
    ния значения выражения s[:12] + s[7:9] + s[12:].
    Оператор конкатенации + и добавления подстроки += не особенно эффективны, когда в операции участвует мно
    жество строк. Для объединения большого числа строк обычно лучше использовать метод str.join(), с которым мы познакомимся в следующем подразделе.
    T
    h e
    w a
    x w
    o r
    k m
    a n
    s[4:11]
    s[3:]
    s[:7]
    s[7:]
    Рис. 2.2. Извлечение срезов из последовательности
    Операторы и методы строк, стр. 92

    Строки
    91
    Третья форма записи (с двумя двоеточиями) напоминает вторую фор
    му, но в отличие от нее значение step определяет, с каким шагом следу
    ет извлекать символы. Как и при использовании второй формы запи
    си, мы можем опустить любой из индексов. Если опустить начальный индекс, по умолчанию будет использоваться значение 0, при условии,
    что задано неотрицательное значение step; в противном случае началь
    ный индекс по умолчанию получит значение –1. Если опустить конеч
    ный индекс, по умолчанию будет использоваться значение len(seq),
    при условии, что задано неотрицательное значение step; в противном случае конечный индекс по умолчанию получит значение индекса пе
    ред началом строки. Мы не можем опустить значение step, и оно не мо
    жет быть равно нулю – если задание шага не требуется, то следует ис
    пользовать вторую форму записи (с одним двоеточием), в которой шаг выбора элементов не указывается.
    На рис. 2.3 приводится пара примеров извлечения разреженных сре
    зов из строки s, которая получена в результате присваивания s = "he ate camel food"
    Здесь мы использовали значения по умолчанию для начального и ко
    нечного индексов, то есть извлечение среза s[::

    2]
    начинается с по
    следнего символа строки и извлекается каждый второй символ по на
    правлению к началу строки. Аналогично извлечение среза s[::3] на
    чинается с первого символа строки и извлекается каждый третий сим
    вол по направлению к концу строки.
    Существует возможность комбинировать индексы с размером шага,
    как показано на рис. 2.4.
    Операция извлечения элементов с определенным шагом часто приме
    няется к последовательностям, отличным от строк, но один из ее вари
    антов часто применяется к строкам:
    >>> s, s[::1]
    ('The waxwork woman', 'namow krowxaw ehT')
    Шаг –1 означает, что будет извлекаться каждый символ, от конца до начала, то есть будет получена строка, в которой символы следуют в об
    ратном порядке.
    s[::3] == 'ha m o'
    h e a
    t e
    c a m e l
    f o o d s[::2] == 'do ea t h'
    Рис. 2.3. Извлечение разреженных срезов

    92
    Глава 2. Типы данных
    Операторы и методы строк
    Поскольку строки относятся к категории неизменяемых последовательностей, все функциональные возможно
    сти, применимые к неизменяемым последовательностям,
    могут использоваться и со строками. Сюда входят опера
    тор проверки на вхождение in, оператор конкатенации +,
    оператор добавления в конец +=, оператор дублирования *
    и комбинированный оператор присваивания с дублиро
    ванием *=. Применение всех этих операторов в контексте строк мы обсудим в этом подразделе, а также обсудим большинство строковых методов. В табл. 2.7 приводится перечень всех строковых методов за исключением двух специализированных (str.maketrans() и str.translate()),
    которые будут обсуждаться немного позже.
    Так как строки являются последовательностями, они яв
    ляются объектами, имеющими «размер», и поэтому мы можем вызывать функцию len(), передавая ей строки в качестве аргумента. Возвращаемая функцией длина представляет собой количество символов в строке (ноль –
    для пустых строк).
    Мы уже знаем, что перегруженная версия оператора + для строк вы
    полняет операцию конкатенации. В случаях, когда требуется объеди
    нить множество строк, лучше использовать метод str.join(). Метод принимает в качестве аргумента последовательность (то есть список или кортеж строк) и объединяет их в единую строку, вставляя между ними строку, относительно которой был вызван метод. Например:
    >>> treatises = ["Arithmetica", "Conics", "Elements"]
    >>> " ".join(treatises)
    'Arithmetica Conics Elements'
    >>> "<>".join(treatises)
    'Arithmetica<>Conics<>Elements'
    >>> "".join(treatises)
    'ArithmeticaConicsElements'
    Операторы и функции,
    применимые к итерируе
    мым объек
    там, стр. 164
    h e a
    t e
    c a m e l
    f o o d s[1:2:2] == s[:2:2] == 'do ea t'
    s[0:5:3] == s[:5:3] == 'ha m'
    Рис. 2.4. Извлечение срезов из последовательности с определенным шагом
    Понятие
    «размер», стр. 443

    Строки
    93
    Первый пример является, пожалуй, наиболее типичным; он объединя
    ет строки из списка, вставляя между ними единственный символ,
    в данном случае – пробел. Третий пример представляет собой опера
    цию конкатенации в чистом виде – благодаря тому что метод вызыва
    ется относительно пустой строки, строки объединяются без добавле
    ния чего бы то ни было между ними.
    Таблица 2.7. Строковые методы
    Синтаксис
    Описание
    s.capitalize()
    Возвращает копию строки s с первым символом в верхнем регистре; смотрите также метод str.title s.center(width,
    char)
    Возвращает копию строки s, отцентрированную в строке с длиной width. Недостающие символы по умолчанию запол
    няются пробелами или символами в соответствии с необяза
    тельным аргументом char (строка с длиной, равной 1); смот
    рите также методы str.ljust(), str.rjust() и str.format()
    s.count(t,
    start, end)
    Возвращает число вхождений строки t в строку s (или в срез строки s[start:end])
    s.encode(
    encoding,
    err)
    Возвращает объект типа bytes, представ
    ляющий строку в кодировке по умолчанию или в кодировке, определяемой аргументом
    encoding
    , с обработкой ошибок, определяе
    мой необязательным аргументом err
    s.endswith(x,
    start, end)
    Возвращает True, если строка s (или срез строки s[start:end])
    оканчивается подстрокой x или любой из строк, если x – кор
    теж; в противном случае возвращает False. Смотрите также метод str.startswith()
    s.expandtabs(
    size)
    Возвращает копию строки s, в которой символы табуляции замещены пробелами с шагом 8 или в соответствии со значе
    нием необязательного аргумента size
    s.find(t,
    start, end)
    Возвращает позицию самого первого (крайнего слева) вхож
    дения подстроки t в строку s (или в срез строки s[start:end]),
    если подстрока t не найдена, возвращается –1. Для поиска самого последнего (крайнего справа) вхождения следует ис
    пользовать метод str.rfind(). Смотрите также метод str.in
    dex()
    s.format(...)
    Возвращает копию строки s, отформатиро
    ванную в соответствии с заданными аргу
    ментами. Этот метод и его аргументы рас
    сматриваются в следующем подразделе s.index(t,
    start, end)
    Возвращает позицию самого первого (крайнего слева) вхож
    дения подстроки t в строку s (или в срез строки s[start:end]);
    если подстрока t не найдена, возбуждается исключение Va
    lueError
    . Для поиска самого последнего (крайнего справа)
    вхождения следует использовать метод str.rfind()
    Тип данных
    bytes
    , стр. 344
    Кодировки сим
    волов, стр. 112
    Метод
    str.
    format()
    , стр. 100

    94
    Глава 2. Типы данных
    Таблица 2.7 (продолжение)
    Синтаксис
    Описание
    s.isalnum()
    Возвращает True, если строка s не пустая и содержит только алфавитноцифровые символы s.isalpha()
    Возвращает True, если строка s не пустая и содержит только алфавитные символы s.isdecimal()
    Возвращает True, если строка s не пустая и содержит только символы Юникода, обозначающие цифры десятичной систе
    мы счисления s.isdigit()
    Возвращает True, если строка s не пустая и содержит только символы ASCII, обозначающие цифры десятичной системы счисления s.isidentifier()
    Возвращает True, если строка s не пустая и является допустимым идентификатором s.islower()
    Возвращает True, если строка s имеет хотя бы один символ,
    который может быть представлен в нижнем регистре, и все такие символы находятся в нижнем регистре; смотрите так
    же метод str.isupper()
    s.isnumeric()
    Возвращает True, если строка s не пустая и содержит только символы Юникода, используемые для обозначения чисел s.isprintable()
    Возвращает True, если строка s пустая или содержит только печатаемые символы, включая пробел, но не символ перево
    да строки s.isspace()
    Возвращает True, если строка s не пустая и содержит только пробельные символы s.istitle()
    Возвращает True, если строка s не пустая и имеет формат за
    головка; смотрите также метод str.title()
    s.isupper()
    Возвращает True, если строка s имеет хотя бы один символ,
    который может быть представлен в верхнем регистре, и все такие символы находятся в верхнем регистре; смотрите так
    же метод str.islower()
    s.join(seq)
    Объединяет все элементы последовательности seq, вставляя между ними строку s (которая может быть пустой строкой)
    s.ljust(
    width,
    char)
    Возвращает копию строки s, выровненной по левому краю,
    в строке длиной width. Недостающие символы по умолчанию заполняются пробелами или символами в соответствии с не
    обязательным аргументом char (строка с длиной, равной 1).
    Для выравнивания по правому краю используйте метод str.rjust()
    , для выравнивания по центру – метод str.cen
    ter()
    ; смотрите также метод str.format()
    s.lower()
    Возвращает копию строки s, в которой все символы приведе
    ны к нижнему регистру; смотрите также метод str.upper()
    Идентификато
    ры и ключевые слова, стр. 68

    Строки
    1   ...   7   8   9   10   11   12   13   14   ...   74


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